9.7. PCI 非透明桥 (NTB) 端点功能 (EPF) 用户指南

作者:

Kishon Vijay Abraham I <kishon@ti.com>

本文档旨在帮助用户使用 pci-epf-ntb 功能驱动程序和 ntb_hw_epf 主机驱动程序实现 NTB 功能。下面列出了主机端和 EP 端应遵循的步骤。有关使用可配置端点的 NTB 的硬件配置和内部结构,请参阅PCI NTB 功能

9.7.1. 端点设备

9.7.1.1. 端点控制器设备

要实现 NTB 功能,至少需要两个端点控制器设备。

查找系统中端点控制器设备的列表

# ls /sys/class/pci_epc/
2900000.pcie-ep  2910000.pcie-ep

如果启用了 PCI_ENDPOINT_CONFIGFS

# ls /sys/kernel/config/pci_ep/controllers
2900000.pcie-ep  2910000.pcie-ep

9.7.1.2. 端点功能驱动程序

查找系统中端点功能驱动程序的列表

# ls /sys/bus/pci-epf/drivers
pci_epf_ntb   pci_epf_ntb

如果启用了 PCI_ENDPOINT_CONFIGFS

# ls /sys/kernel/config/pci_ep/functions
pci_epf_ntb   pci_epf_ntb

9.7.1.3. 创建 pci-epf-ntb 设备

可以使用 configfs 创建 PCI 端点功能设备。要创建 pci-epf-ntb 设备,可以使用以下命令

# mount -t configfs none /sys/kernel/config
# cd /sys/kernel/config/pci_ep/
# mkdir functions/pci_epf_ntb/func1

上面的 “mkdir func1” 创建了 pci-epf-ntb 功能设备,该设备将由 pci_epf_ntb 驱动程序探测。

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-ntb 驱动程序使用 0xffff 填充 vendorid,并使用 0x0001 填充 interrupt_pin。

# cat functions/pci_epf_ntb/func1/vendorid
0xffff
# cat functions/pci_epf_ntb/func1/interrupt_pin
0x0001

9.7.1.4. 配置 pci-epf-ntb 设备

用户可以使用其 configfs 条目配置 pci-epf-ntb 设备。要更改 vendorid 和 deviceid,可以使用以下命令

# echo 0x104c > functions/pci_epf_ntb/func1/vendorid
# echo 0xb00d > functions/pci_epf_ntb/func1/deviceid

PCI 端点框架还在功能属性目录中自动创建一个子目录。此子目录与功能设备的名称相同,并填充了以下可由用户配置的 NTB 特定属性

# ls functions/pci_epf_ntb/func1/pci_epf_ntb.0/
db_count    mw1         mw2         mw3         mw4         num_mws
spad_count

下面给出了 NTB 功能的示例配置

# echo 4 > functions/pci_epf_ntb/func1/pci_epf_ntb.0/db_count
# echo 128 > functions/pci_epf_ntb/func1/pci_epf_ntb.0/spad_count
# echo 2 > functions/pci_epf_ntb/func1/pci_epf_ntb.0/num_mws
# echo 0x100000 > functions/pci_epf_ntb/func1/pci_epf_ntb.0/mw1
# echo 0x100000 > functions/pci_epf_ntb/func1/pci_epf_ntb.0/mw2

9.7.1.5. 将 pci-epf-ntb 设备绑定到 EP 控制器

NTB 功能设备应连接到连接到两个主机的两个 PCI 端点控制器。使用 NTB 功能设备内的“primary”和“secondary”条目将一个 PCI 端点控制器连接到主接口,并将另一个 PCI 端点控制器连接到辅助接口

# ln -s controllers/2900000.pcie-ep/ functions/pci-epf-ntb/func1/primary
# ln -s controllers/2910000.pcie-ep/ functions/pci-epf-ntb/func1/secondary

完成上述步骤后,两个 PCI 端点控制器都已准备好与主机建立链接。

9.7.2. 根复合体设备

9.7.2.1. lspci 输出

请注意,此处列出的设备对应于上面“创建 pci-epf-ntb 设备”部分中填充的值

# lspci
0000:00:00.0 PCI bridge: Texas Instruments Device b00d
0000:01:00.0 RAM memory: Texas Instruments Device b00d

9.7.2.2. 使用 ntb_hw_epf 设备

主机端软件遵循 Linux 中的标准 NTB 软件架构。所有现有的客户端 NTB 实用程序,如 NTB 传输客户端和 NTB Netdev、NTB Ping Pong 测试客户端和 NTB 工具测试客户端,都可以与 NTB 功能设备一起使用。

有关 NTB 的更多信息,请参阅非透明桥