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 裝置¶
PCI 端點功能裝置可以使用 configfs 建立。要建立 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 驅動程式將 vendorid 填充為 0xffff,將 interrupt_pin 填充為 0x0001。
# 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. 啟動連結¶
為了使端點裝置與主機建立連結,_start_ 欄位應填充為“1”。對於 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 網路裝置、NTB 乒乓測試客戶端和 NTB 工具測試客戶端,都可以與 NTB 功能裝置一起使用。
有關 NTB 的更多資訊,請參閱 非透明橋接