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