9.5. PCI 測試使用者指南¶
- 作者:
Kishon Vijay Abraham I <kishon@ti.com>
本文件旨在幫助使用者使用 pci-epf-test 功能驅動和 pci_endpoint_test 主機驅動進行 PCI 測試。主機端和 EP 端要遵循的步驟列表如下。
9.5.1. 端點裝置¶
9.5.1.1. 端點控制器裝置¶
查詢系統中的端點控制器裝置列表
# ls /sys/class/pci_epc/
51000000.pcie_ep
如果 PCI_ENDPOINT_CONFIGFS 已啟用
# ls /sys/kernel/config/pci_ep/controllers
51000000.pcie_ep
9.5.1.2. 端點功能驅動¶
查詢系統中的端點功能驅動列表
# ls /sys/bus/pci-epf/drivers
pci_epf_test
如果 PCI_ENDPOINT_CONFIGFS 已啟用
# ls /sys/kernel/config/pci_ep/functions
pci_epf_test
9.5.1.3. 建立 pci-epf-test 裝置¶
PCI 端點功能裝置可以使用 configfs 建立。要建立 pci-epf-test 裝置,可以使用以下命令
# mount -t configfs none /sys/kernel/config
# cd /sys/kernel/config/pci_ep/
# mkdir functions/pci_epf_test/func1
上面的“mkdir func1”建立了 pci-epf-test 功能裝置,該裝置將由 pci_epf_test 驅動探測。
PCI 端點框架使用以下可配置欄位填充目錄
# ls functions/pci_epf_test/func1
baseclass_code interrupt_pin progif_code subsys_id
cache_line_size msi_interrupts revid subsys_vendorid
deviceid msix_interrupts subclass_code vendorid
當裝置繫結到驅動時,PCI 端點功能驅動會用預設值填充這些條目。pci-epf-test 驅動將 vendorid 填充為 0xffff,將 interrupt_pin 填充為 0x0001
# cat functions/pci_epf_test/func1/vendorid
0xffff
# cat functions/pci_epf_test/func1/interrupt_pin
0x0001
9.5.1.4. 配置 pci-epf-test 裝置¶
使用者可以使用 configfs 條目配置 pci-epf-test 裝置。要更改功能裝置使用的 vendorid 和 MSI 中斷數量,可以使用以下命令
# echo 0x104c > functions/pci_epf_test/func1/vendorid
# echo 0xb500 > functions/pci_epf_test/func1/deviceid
# echo 32 > functions/pci_epf_test/func1/msi_interrupts
# echo 2048 > functions/pci_epf_test/func1/msix_interrupts
9.5.1.5. 將 pci-epf-test 裝置繫結到 EP 控制器¶
為了使端點功能裝置有用,它必須繫結到 PCI 端點控制器驅動。使用 configfs 將功能裝置繫結到系統中存在的控制器驅動之一
# ln -s functions/pci_epf_test/func1 controllers/51000000.pcie_ep/
完成上述步驟後,PCI 端點即可與主機建立連結。
9.5.1.6. 啟動連結¶
為了使端點裝置與主機建立連結,_start_ 欄位應填充為‘1’
# echo 1 > controllers/51000000.pcie_ep/start
9.5.2. 根複合裝置¶
9.5.2.1. lspci 輸出¶
請注意,此處列出的裝置與上面 1.4 中填充的值相對應
00:00.0 PCI bridge: Texas Instruments Device 8888 (rev 01)
01:00.0 Unassigned class [ff00]: Texas Instruments Device b500
9.5.2.2. 使用端點測試功能裝置¶
tools/testing/selftests/pci_endpoint 中新增的 Kselftest 可用於執行所有預設的 PCI 端點測試。要為 PCI 端點子系統構建 Kselftest,應使用以下命令
# cd <kernel-dir>
# make -C tools/testing/selftests/pci_endpoint
或者如果您希望在您的系統中編譯並安裝
# cd <kernel-dir>
# make -C tools/testing/selftests/pci_endpoint INSTALL_PATH=/usr/bin install
測試將位於 <rootfs>/usr/bin/ 中
9.5.2.2.1. Kselftest 輸出¶
# pci_endpoint_test
TAP version 13
1..16
# Starting 16 tests from 9 test cases.
# RUN pci_ep_bar.BAR0.BAR_TEST ...
# OK pci_ep_bar.BAR0.BAR_TEST
ok 1 pci_ep_bar.BAR0.BAR_TEST
# RUN pci_ep_bar.BAR1.BAR_TEST ...
# OK pci_ep_bar.BAR1.BAR_TEST
ok 2 pci_ep_bar.BAR1.BAR_TEST
# RUN pci_ep_bar.BAR2.BAR_TEST ...
# OK pci_ep_bar.BAR2.BAR_TEST
ok 3 pci_ep_bar.BAR2.BAR_TEST
# RUN pci_ep_bar.BAR3.BAR_TEST ...
# OK pci_ep_bar.BAR3.BAR_TEST
ok 4 pci_ep_bar.BAR3.BAR_TEST
# RUN pci_ep_bar.BAR4.BAR_TEST ...
# OK pci_ep_bar.BAR4.BAR_TEST
ok 5 pci_ep_bar.BAR4.BAR_TEST
# RUN pci_ep_bar.BAR5.BAR_TEST ...
# OK pci_ep_bar.BAR5.BAR_TEST
ok 6 pci_ep_bar.BAR5.BAR_TEST
# RUN pci_ep_basic.CONSECUTIVE_BAR_TEST ...
# OK pci_ep_basic.CONSECUTIVE_BAR_TEST
ok 7 pci_ep_basic.CONSECUTIVE_BAR_TEST
# RUN pci_ep_basic.LEGACY_IRQ_TEST ...
# OK pci_ep_basic.LEGACY_IRQ_TEST
ok 8 pci_ep_basic.LEGACY_IRQ_TEST
# RUN pci_ep_basic.MSI_TEST ...
# OK pci_ep_basic.MSI_TEST
ok 9 pci_ep_basic.MSI_TEST
# RUN pci_ep_basic.MSIX_TEST ...
# OK pci_ep_basic.MSIX_TEST
ok 10 pci_ep_basic.MSIX_TEST
# RUN pci_ep_data_transfer.memcpy.READ_TEST ...
# OK pci_ep_data_transfer.memcpy.READ_TEST
ok 11 pci_ep_data_transfer.memcpy.READ_TEST
# RUN pci_ep_data_transfer.memcpy.WRITE_TEST ...
# OK pci_ep_data_transfer.memcpy.WRITE_TEST
ok 12 pci_ep_data_transfer.memcpy.WRITE_TEST
# RUN pci_ep_data_transfer.memcpy.COPY_TEST ...
# OK pci_ep_data_transfer.memcpy.COPY_TEST
ok 13 pci_ep_data_transfer.memcpy.COPY_TEST
# RUN pci_ep_data_transfer.dma.READ_TEST ...
# OK pci_ep_data_transfer.dma.READ_TEST
ok 14 pci_ep_data_transfer.dma.READ_TEST
# RUN pci_ep_data_transfer.dma.WRITE_TEST ...
# OK pci_ep_data_transfer.dma.WRITE_TEST
ok 15 pci_ep_data_transfer.dma.WRITE_TEST
# RUN pci_ep_data_transfer.dma.COPY_TEST ...
# OK pci_ep_data_transfer.dma.COPY_TEST
ok 16 pci_ep_data_transfer.dma.COPY_TEST
# PASSED: 16 / 16 tests passed.
# Totals: pass:16 fail:0 xfail:0 xpass:0 skip:0 error:0
測試用例 16 (pci_ep_data_transfer.dma.COPY_TEST) 將因缺少 DMA 上的 MEMCPY 而導致大多數支援 DMA 的端點控制器失敗。對於此類控制器,建議使用此命令跳過此測試用例
# pci_endpoint_test -f pci_ep_bar -f pci_ep_basic -v memcpy -T COPY_TEST -v dma