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 裝置

PCI 端點功能裝置可以使用 configfs 建立。要建立 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 驅動程式將 vendorid 填充為 0xffff,interrupt_pin 填充為 0x0001。

# 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 Transport Client) 和 NTB 網路裝置 (NTB Netdev)、NTB 乒乓測試客戶端 (NTB Ping Pong Test Client) 和 NTB 工具測試客戶端 (NTB Tool Test Client),都可以與 NTB 功能裝置一起使用。

有關 NTB 的更多資訊,請參閱 非透明橋