MMC 测试框架

概述

mmc_test 框架旨在测试主机控制器驱动程序以及 MMC 子系统处理的所有设备的性能和可靠性。这不仅包括 MMC 设备,还包括 SD 卡和子系统支持的其他设备。

该框架提供各种测试,以评估主机控制器和设备交互的不同方面,例如读写性能、数据完整性和错误处理。这些测试有助于确保主机控制器驱动程序和设备在各种条件下都能正常运行。

mmc_test 框架对于以下方面特别有用:

  • 验证 MMC 和 SD 主机控制器驱动程序的功能和性能。

  • 确保 MMC 和 SD 设备的兼容性和可靠性。

  • 识别和诊断 MMC 子系统中的问题。

测试结果记录在内核日志中,提供有关测试结果和遇到的任何问题的详细信息。

注意:您卡上的任何内容都将被这些测试覆盖。

初始化

要使用 mmc_test 框架,请按照以下步骤操作:

  1. 启用 MMC 测试框架:

    确保启用了 CONFIG_MMC_TEST 内核配置选项。这可以通过配置内核来完成:

    make menuconfig
    

    导航到:

    设备驱动 --->
    <*> MMC/SD/SDIO 卡支持 --->

    [*] MMC 主机测试驱动程序

    或者,您可以直接在内核配置文件中启用它:

    echo "CONFIG_MMC_TEST=y" >> .config
    

    如有必要,重新构建并安装内核。

  2. 加载 MMC 测试模块:

    如果 mmc_test 框架是作为模块构建的,您需要使用 modprobe 加载它:

    modprobe mmc_test
    

绑定用于测试的 MMC 卡

要启用 MMC 测试,您需要从 mmcblk 驱动程序中取消绑定 MMC 卡,并将其绑定到 mmc_test 驱动程序。这允许 mmc_test 框架控制 MMC 卡进行测试。

  1. 识别 MMC 卡:

    ls /sys/bus/mmc/devices/
    

    这将列出 MMC 设备,例如 mmc0:0001

  2. mmcblk 驱动程序中取消绑定 MMC 卡:

    echo 'mmc0:0001' > /sys/bus/mmc/drivers/mmcblk/unbind
    
  3. 将 MMC 卡绑定到 mmc_test 驱动程序:

    echo 'mmc0:0001' > /sys/bus/mmc/drivers/mmc_test/bind
    

绑定后,您应该在内核日志中看到一行,指示该卡已声明用于测试:

mmc_test mmc0:0001: Card claimed for testing.

用法 - Debugfs 条目

启用 mmc_test 框架后,您可以与位于 /sys/kernel/debug/mmc0/mmc0:0001 中的以下 debugfs 条目进行交互:

  1. test:

    此文件用于运行特定测试。将测试编号写入此文件以执行测试。

    echo <test_number> > /sys/kernel/debug/mmc0/mmc0:0001/test
    

    测试结果在内核日志信息中指示。您可以使用 dmesg 命令或通过检查 /var/log/ 中的日志文件来查看内核日志。

    dmesg | grep mmc0
    

    示例

    要运行测试编号 4(具有数据验证的基本读取):

    echo 4 > /sys/kernel/debug/mmc0/mmc0:0001/test
    

    检查内核日志以获取结果:

    dmesg | grep mmc0
    
  2. testlist:

    此文件列出所有可用的测试。您可以读取此文件以查看测试列表及其对应的编号。

    cat /sys/kernel/debug/mmc0/mmc0:0001/testlist
    

    可用测试在下表中列出:

测试

测试名称

测试描述

0

运行所有测试

运行所有可用的测试

1

基本写入

对 MMC 卡执行单个 512 字节块的基本写入操作,无需数据验证。

2

基本读取

读取相同

3

基本写入(带数据验证)

对 MMC 卡执行单个 512 字节块的基本写入操作,通过读回写入的数据并进行比较来验证数据。

4

基本读取(带数据验证)

读取相同

5

多块写入

对 MMC 卡执行 8 个块(每个 512 字节)的多块写入操作。

6

多块读取

读取相同

7

2 的幂块写入

对 MMC 卡执行块大小为 2 的幂的写入操作,从 1 字节开始到 256 字节。

8

2 的幂块读取

读取相同

9

奇怪大小的块写入

对 MMC 卡执行块大小不同的写入操作,从 3 字节开始,每次迭代增加 7 字节,最大到 511 字节。

10

奇怪大小的块读取

读取相同

11

未对齐的写入

使用从不同对齐方式(0 到 7 字节偏移)开始的缓冲区执行写入操作,以测试 MMC 卡如何处理未对齐的数据传输。

12

未对齐的读取

读取相同

13

未对齐的多块写入

多块写入相同

14

未对齐的多块读取

多块读取相同

15

写入时正确的 xfer_size(启动失败)

通过修改 MMC 请求,使其不会按预期执行,从而故意创建一个损坏的传输,例如,对多块传输使用 MMC_WRITE_BLOCK。

16

读取时正确的 xfer_size(启动失败)

读取相同

17

写入时正确的 xfer_size(中途失败)

2 个块相同

18

读取时正确的 xfer_size(中途失败)

读取相同

19

高内存写入

使用高内存页

20

高内存读取

读取相同

21

多块高内存写入

多块写入相同

22

多块高内存读取

多块读取相同

23

最佳情况读取性能

执行 512K 顺序读取(非 sg)

24

最佳情况写入性能

写入相同

25

最佳情况读取性能(进入分散的页面)

使用 sg 相同

26

最佳情况写入性能(来自分散的页面)

写入相同

27

单次读取性能

按传输大小

28

单次写入性能

按传输大小

29

单次 trim 性能

按传输大小

30

连续读取性能

按传输大小

31

连续写入性能

按传输大小

32

连续 trim 性能

按传输大小

33

随机读取性能

按传输大小

34

随机写入性能

按传输大小

35

大型顺序读取

进入分散的页面

36

大型顺序写入

来自分散的页面

37

写入性能

阻塞请求,4k 到 4MB

38

写入性能

非阻塞请求,4k 到 4MB

39

读取性能

阻塞请求,4k 到 4MB

40

读取性能

非阻塞请求,4k 到 4MB

41

写入性能

阻塞请求,1 到 512 个 sg 元素

42

写入性能

非阻塞请求,1 到 512 个 sg 元素

43

读取性能

阻塞请求,1 到 512 个 sg 元素

44

读取性能

非阻塞请求,1 到 512 个 sg 元素

45

重置测试

46

读取期间的命令

无设置块计数 (CMD23)

47

写入期间的命令

无设置块计数 (CMD23)

48

读取期间的命令

使用设置块计数 (CMD23)

49

写入期间的命令

使用设置块计数 (CMD23)

50

非阻塞期间的命令

读取 - 使用设置块计数 (CMD23)

51

非阻塞期间的命令

写入 - 使用设置块计数 (CMD23)

测试结果

测试结果记录在内核日志中。每次测试都会记录测试的开始、结束和结果。可能的结果有:

  • OK:测试成功完成。

  • FAILED:测试失败。

  • UNSUPPORTED (by host):主机不支持此测试。

  • UNSUPPORTED (by card):卡不支持此测试。

  • ERROR:测试过程中发生错误。

内核日志输出示例

在运行测试时,您将在内核日志中看到类似于以下内容的日志条目:

[ 1234.567890] mmc0: Starting tests of card mmc0:0001...
[ 1234.567891] mmc0: Test case 4. Basic read (with data verification)...
[ 1234.567892] mmc0: Result: OK
[ 1234.567893] mmc0: Tests completed.

在这个例子中,测试用例 4(带数据验证的基本读取)被执行,结果为 OK。

贡献

欢迎为 mmc_test 框架做出贡献。请遵循标准的 Linux 内核贡献指南,并将补丁提交给相应的维护人员。

联系方式

如需更多信息或报告问题,请联系 MMC 子系统维护人员。