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