MMC 测试框架

概述

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

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

mmc_test 框架特别适用于

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

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

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

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

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

初始化

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

  1. 启用 MMC 测试框架:

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

    make menuconfig
    

    导航到

    Device Drivers --->
    <*> MMC/SD/SDIO card support --->

    [*] MMC host test driver

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

    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

基本写入

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

2

基本读取

读取相同

3

基本写入(带有数据验证)

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

4

基本读取(带有数据验证)

读取相同

5

多块写入

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

6

多块读取

读取相同

7

2 的幂块写入

执行块大小为 2 的幂(从 1 字节到 256 字节)的写入操作到 MMC 卡。

8

2 的幂块读取

读取相同

9

奇怪大小的块写入

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

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

Highmem 写入

使用高内存页面

20

Highmem 读取

读取相同

21

多块 highmem 写入

多块写入相同

22

多块 highmem 读取

mult-read 相同

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 elems

42

写入性能

非阻塞请求 1 到 512 sg elems

43

读取性能

阻塞请求 1 到 512 sg elems

44

读取性能

非阻塞请求 1 到 512 sg elems

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 子系统维护人员。