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.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