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 子系統維護人員。