9.9. PCI 非透明桥 (NTB) 端点功能 (EPF) 用户指南¶
- 作者:
Frank Li <Frank.Li@nxp.com>
本文档旨在帮助用户使用 pci-epf-vntb 功能驱动程序和 ntb_hw_epf 主机驱动程序来实现 NTB 功能。下面给出了主机端和 EP 端要遵循的步骤列表。有关使用可配置端点的 NTB 的硬件配置和内部结构,请参阅 PCI vNTB 功能
9.9.1. 端点设备¶
9.9.1.1. 端点控制器设备¶
查找系统中端点控制器设备的列表
# ls /sys/class/pci_epc/
5f010000.pcie_ep
如果启用了 PCI_ENDPOINT_CONFIGFS
# ls /sys/kernel/config/pci_ep/controllers
5f010000.pcie_ep
9.9.1.2. 端点功能驱动程序¶
查找系统中端点功能驱动程序的列表
# ls /sys/bus/pci-epf/drivers
pci_epf_ntb pci_epf_test pci_epf_vntb
如果启用了 PCI_ENDPOINT_CONFIGFS
# ls /sys/kernel/config/pci_ep/functions
pci_epf_ntb pci_epf_test pci_epf_vntb
9.9.1.3. 创建 pci-epf-vntb 设备¶
可以使用 configfs 创建 PCI 端点功能设备。 要创建 pci-epf-vntb 设备,可以使用以下命令
# mount -t configfs none /sys/kernel/config
# cd /sys/kernel/config/pci_ep/
# mkdir functions/pci_epf_vntb/func1
上面的“mkdir func1”创建了 pci-epf-ntb 功能设备,该设备将由 pci_epf_vntb 驱动程序探测。
PCI 端点框架使用以下可配置字段填充目录
# ls functions/pci_epf_ntb/func1
baseclass_code deviceid msi_interrupts pci-epf-ntb.0
progif_code secondary subsys_id vendorid
cache_line_size interrupt_pin msix_interrupts primary
revid subclass_code subsys_vendor_id
当设备绑定到驱动程序时,PCI 端点功能驱动程序会使用默认值填充这些条目。 pci-epf-vntb 驱动程序使用 0xffff 填充 vendorid,使用 0x0001 填充 interrupt_pin
# cat functions/pci_epf_vntb/func1/vendorid
0xffff
# cat functions/pci_epf_vntb/func1/interrupt_pin
0x0001
9.9.1.4. 配置 pci-epf-vntb 设备¶
用户可以使用其 configfs 条目配置 pci-epf-vntb 设备。 要更改 vendorid 和 deviceid,可以使用以下命令
# echo 0x1957 > functions/pci_epf_vntb/func1/vendorid
# echo 0x0809 > functions/pci_epf_vntb/func1/deviceid
PCI 端点框架还在功能属性目录中自动创建一个子目录。 此子目录的名称与功能设备的名称相同,并填充了以下可由用户配置的特定于 NTB 的属性
# ls functions/pci_epf_vntb/func1/pci_epf_vntb.0/
db_count mw1 mw2 mw3 mw4 num_mws
spad_count
下面给出了 NTB 功能的示例配置
# echo 4 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/db_count
# echo 128 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/spad_count
# echo 1 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/num_mws
# echo 0x100000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw1
用于虚拟 PCI 总线的虚拟 NTB 驱动程序的示例配置
# echo 0x1957 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/vntb_vid
# echo 0x080A > functions/pci_epf_vntb/func1/pci_epf_vntb.0/vntb_pid
# echo 0x10 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/vbus_number
9.9.1.5. 将 pci-epf-ntb 设备绑定到 EP 控制器¶
NTB 功能设备应附加到连接到主机的 PCI 端点控制器。
# ln -s controllers/5f010000.pcie_ep functions/pci-epf-ntb/func1/primary
完成上述步骤后,PCI 端点控制器即可准备好与主机建立链接。
9.9.1.6. 启动链接¶
为了使端点设备与主机建立链接,应使用“1”填充 _start_ 字段。 对于 NTB,两个 PCI 端点控制器都应与主机建立链接(imx8 不需要这些步骤)
# echo 1 > controllers/5f010000.pcie_ep/start
9.9.2. 根复合体设备¶
9.9.2.1. 主机端的 lspci 输出¶
请注意,此处列出的设备与上面“创建 pci-epf-ntb 设备”部分中填充的值相对应
# lspci
00:00.0 PCI bridge: Freescale Semiconductor Inc Device 0000 (rev 01)
01:00.0 RAM memory: Freescale Semiconductor Inc Device 0809
9.9.3. 端点设备 / 虚拟 PCI 总线¶
9.9.3.1. EP 端 / 虚拟 PCI 总线的 lspci 输出¶
请注意,此处列出的设备与上面“创建 pci-epf-ntb 设备”部分中填充的值相对应
# lspci
10:00.0 Unassigned class [ffff]: Dawicontrol Computersysteme GmbH Device 1234 (rev ff)
9.9.3.2. 使用 ntb_hw_epf 设备¶
主机端软件遵循 Linux 中的标准 NTB 软件架构。 所有现有的客户端 NTB 实用程序,如 NTB 传输客户端和 NTB Netdev、NTB Ping Pong 测试客户端和 NTB 工具测试客户端,都可以与 NTB 功能设备一起使用。
有关 NTB 的更多信息,请参阅 非透明桥