lspci 命令和 setpci 命令均為 Linux 發(fā)行版中原生可用的命令。
這 2 條命令均可提供多級(jí)輸出,適合在不同時(shí)間點(diǎn)用于查看 PCI 總線上訓(xùn)練的不同組件的功能和狀態(tài)。其中大部分功能均可反映《PCI Express 基本規(guī)范》中所需的配置空間寄存器。與大部分命令一樣,在 Linux 中可通過(guò)運(yùn)行“l(fā)spci --help”或“man lspci”來(lái)獲取實(shí)用的指示信息。
// lspci
默認(rèn)情況下 lspci 命令可顯示所有器件信息,如下圖所示。
// lspci-tv
此命令可按樹(shù)狀格式顯示 PCI 器件,并提供根端口總線、器件和功能 (BDF) 編號(hào)。
在以上日志中,賽靈思器件連接到總線編號(hào) (Bus Number)“00”、器件編號(hào) (Device Number )“01”和功能編號(hào) (Function Number)“1”。
// lspci-vvv
此命令可用于顯示最詳細(xì)的信息。需要 root 用戶權(quán)限才能運(yùn)行此命令。
以下日志僅顯示與賽靈思 PCIe 器件相關(guān)的部分。
要點(diǎn):
?“鏈路功能寄存器 (Link Capability Register)”和“鏈路狀態(tài)寄存器 (Link Status Register)”均顯示 Gen3x8。有時(shí)由于鏈路問(wèn)題,可能發(fā)生鏈路向下訓(xùn)練。向下訓(xùn)練的鏈路狀態(tài)會(huì)反映在鏈路狀態(tài)寄存器中:
?“可糾正錯(cuò)誤狀態(tài)寄存器 (Correctable Error Status register)”顯示“非致命錯(cuò)誤 (Non-Fatal Error)”。啟動(dòng)期間,主機(jī)還會(huì)探測(cè)未配置的功能。由于設(shè)計(jì)是針對(duì)單一功能配置的,因此探測(cè)其它功能的操作將報(bào)告為請(qǐng)求不受支持。此不受支持的請(qǐng)求將報(bào)告為“非致命錯(cuò)誤:建議 (Advisory Non-Fatal error)”。如果在啟動(dòng)期間出現(xiàn)“非致命錯(cuò)誤 (Non-Fatal Error)”、“請(qǐng)求不受支持 (Unsupported Request)”和“可糾正錯(cuò)誤 (Correctable Error)”,此錯(cuò)誤可忽略。通過(guò)在對(duì)應(yīng)寄存器中對(duì)相應(yīng)的位執(zhí)行配置寫(xiě)入即可清除此類(lèi)錯(cuò)誤。
?用戶必須監(jiān)控不可糾正錯(cuò)誤狀態(tài)寄存器中是否存在錯(cuò)誤。如果在此寄存器中報(bào)告了錯(cuò)誤,則必須對(duì)其進(jìn)行調(diào)查并解決。
? PCI Express 功能起始位置為“80”。
// lspci-vs
此命令可提供有關(guān)選定器件的詳細(xì)輸出,如下所示:
// lspci-vvvs
此命令作用相同,但可提供更詳細(xì)的輸出,如下所示:
// lspci-nvmms
此命令可用于以數(shù)字形式顯示 PCI 器件供應(yīng)商 ID 和器件 ID。
// lspci-xxx
此命令可用于提供整個(gè) PCI 配置空間的十六進(jìn)制轉(zhuǎn)儲(chǔ)。
0x00 的前 2 個(gè)字節(jié)實(shí)際為 0x10EE。在 PCIe 規(guī)范中,所有數(shù)據(jù)均按偏移來(lái)定義,例如,包含 0x80 的黃色框位于偏移 0x34 處 - 表示該指針指向擴(kuò)展功能寄存器的第一個(gè)地址。
PCI-ID:在位于 0x00 的紅色框內(nèi)顯示的是供應(yīng)商 ID (0x10EE),后接藍(lán)色框內(nèi)顯示的器件 ID (0x7038)。其下方位于偏移 0x2C 和 0x2E 的紅色框和藍(lán)色框內(nèi)分別是子供應(yīng)商 ID (0x10EE) 和子器件 ID (0x0700)。
總線主控制器啟用:回到上方位于 0x04 處的黃色框內(nèi),其中顯示的是 16 位字“0000 0000 0000 0111”。它表示命令寄存器。位 2 是“總線主控制器啟用”位。
位于 0x06 處的綠色框內(nèi)顯示的是 16 位字“0000 0000 0000 0001”。它表示狀態(tài)寄存器,可能隨時(shí)間而改變,它可用于向根聯(lián)合體 (Root complex) 發(fā)送信號(hào),以表示發(fā)生了某些狀況。
BAR 和存儲(chǔ)器:位于 0x10 處,其中顯示的是 32 位字“0000 0000 0000 0000 1111 01111010 0000”
位 0 = 0 - 針對(duì)存儲(chǔ)器空間的請(qǐng)求
位 2:1 =“00”- 基址,位寬為 32 位
位 3 =“0”- 不可預(yù)取
位 31:4 = 0xF7C0(最低的 4 個(gè)位假定為 0,因?yàn)楸仨氃谧止?jié)和 Dword 邊界上賦值)
注:如果該請(qǐng)求位寬為 64 位,那么下一個(gè) D-Word 將包含上位內(nèi)存地址,下一個(gè) BAR 將為 BAR2。
0x14 - 此處是 BAR1 地址,但由于全部為 0,因此該器件僅含 1 個(gè) BAR 選項(xiàng)
檢查 PCIe 鏈路寬度
PCIe 寬度用于判定 PCIe 通道數(shù)。以下命令可便于查找“鏈路功能寄存器”中的“PCIe 鏈路寬度”信息,以及“鏈路狀態(tài)寄存器”中協(xié)商的鏈路寬度。
檢查 PCIe 速度
與用于檢查 PCIe 鏈路寬度信息的命令類(lèi)似,以下命令可提供有關(guān) PCIe 速度的信息。
檢查 PCIe 最大有效載荷大小 (MPS)
以下命令可提供“器件控制寄存器 (Device Control Register)”下的“最大有效載荷大小 (Max Payload Size)”值。
檢查 PCIe 最大讀取請(qǐng)求大小
列出所有 PCIe 器件
//setpci
setpci 命令可用于讀取和寫(xiě)入配置寄存器。請(qǐng)參閱“setpci –help”以獲取有關(guān) setpci 功能的詳細(xì)信息。
setpci 包含標(biāo)準(zhǔn)配置報(bào)頭中的所有寄存器的名稱(chēng)。“setpci –dumpregs”命令可顯示包含所有 PCI 寄存器和功能的列表,如下所示:
[root@localhost xilinx]# setpci --dumpregs
cap pos w name
00 W VENDOR_ID
02 W DEVICE_ID
04 W COMMAND
06 W STATUS
08 B REVISION
09 B CLASS_PROG
0a W CLASS_DEVICE
0c B CACHE_LINE_SIZE
0d B LATENCY_TIMER
0e B HEADER_TYPE
0f B BIST
10 L BASE_ADDRESS_0
14 L BASE_ADDRESS_1
18 L BASE_ADDRESS_2
1c L BASE_ADDRESS_3
20 L BASE_ADDRESS_4
24 L BASE_ADDRESS_5
28 L CARDBUS_CIS
2c L SUBSYSTEM_VENDOR_ID
2e W SUBSYSTEM_ID
30 L ROM_ADDRESS
3c B INTERRUPT_LINE
3d B INTERRUPT_PIN
3e B MIN_GNT
3f B MAX_LAT
18 B PRIMARY_BUS
19 B SECONDARY_BUS
1a B SUBORDINATE_BUS
1b B SEC_LATENCY_TIMER
1c B IO_BASE
1d B IO_LIMIT
1e W SEC_STATUS
20 W MEMORY_BASE
22 W MEMORY_LIMIT
24 W PREF_MEMORY_BASE
26 W PREF_MEMORY_LIMIT
28 L PREF_BASE_UPPER32
2c L PREF_LIMIT_UPPER32
30 W IO_BASE_UPPER16
32 W IO_LIMIT_UPPER16
38 L BRIDGE_ROM_ADDRESS
3e W BRIDGE_CONTROL
10 L CB_CARDBUS_BASE
14 W CB_CAPABILITIES
16 W CB_SEC_STATUS
18 B CB_BUS_NUMBER
19 B CB_CARDBUS_NUMBER
1a B CB_SUBORDINATE_BUS
1b B CB_CARDBUS_LATENCY
1c L CB_MEMORY_BASE_0
20 L CB_MEMORY_LIMIT_0
24 L CB_MEMORY_BASE_1
28 L CB_MEMORY_LIMIT_1
2c W CB_IO_BASE_0
2e W CB_IO_BASE_0_HI
30 W CB_IO_LIMIT_0
32 W CB_IO_LIMIT_0_HI
34 W CB_IO_BASE_1
36 W CB_IO_BASE_1_HI
38 W CB_IO_LIMIT_1
3a W CB_IO_LIMIT_1_HI
40 W CB_SUBSYSTEM_VENDOR_ID
42 W CB_SUBSYSTEM_ID
44 L CB_LEGACY_MODE_BASE
01 00 - CAP_PM
02 00 - CAP_AGP
03 00 - CAP_VPD
04 00 - CAP_SLOTID
05 00 - CAP_MSI
06 00 - CAP_CHSWP
07 00 - CAP_PCIX
08 00 - CAP_HT
09 00 - CAP_VNDR
0a 00 - CAP_DBG
0b 00 - CAP_CCRC
0c 00 - CAP_HOTPLUG
0d 00 - CAP_SSVID
0e 00 - CAP_AGP3
0f 00 - CAP_SECURE
10 00 - CAP_EXP
11 00 - CAP_MSIX
12 00 - CAP_SATA
13 00 - CAP_AF
0001 00 - ECAP_AER
0002 00 - ECAP_VC
0003 00 - ECAP_DSN
0004 00 - ECAP_PB
0005 00 - ECAP_RCLINK
0006 00 - ECAP_RCILINK
0007 00 - ECAP_RCECOLL
0008 00 - ECAP_MFVC
000a 00 - ECAP_RBCB
000b 00 - ECAP_VNDR
000d 00 - ECAP_ACS
000e 00 - ECAP_ARI
000f 00 - ECAP_ATS
0010 00 - ECAP_SRIOV
//識(shí)別 setpci 中的寄存器
以下是識(shí)別 setpci 命令中所使用的寄存器的各種方法。
使用十六進(jìn)制地址
提供寄存器名稱(chēng)
對(duì)于屬于 PCI 功能的一部分的寄存器,可通過(guò)功能名稱(chēng)來(lái)找到第一個(gè)寄存器。在 --dumpregs 輸出中。查找以 `CAP_' 或 `ECAP_' 開(kāi)頭的名稱(chēng)。在此名稱(chēng)后可接 +offset 以向該地址添加偏移(十六進(jìn)制值)。這樣即可便于找到包含在已設(shè)置的相應(yīng)功能寄存器內(nèi)的寄存器。
寬度說(shuō)明符(b、.w 或 .l)用于選擇要讀取或?qū)懭氲淖止?jié)數(shù)(1、2 或 4)。如果按名稱(chēng)來(lái)引用寄存器且該寄存器寬度已知,則可刪除該說(shuō)明符。
寄存器的所有名稱(chēng)和寬度說(shuō)明符都區(qū)分大小寫(xiě)。
示例:
COMMAND
指向命令寄存器中的值。如果將其替換為 4.w,則將指向相同位置。
COMMAND.l
指向命令寄存器和狀態(tài)寄存器的值。
VENDOR_ID+1.b
指向供應(yīng)商 ID 寄存器的上位字節(jié)。
CAP_PM+2.w
對(duì)應(yīng)于功耗管理功能的第二個(gè)字。
ECAP108.l
指向 ID 為 0x108 的擴(kuò)展功能的第一個(gè) 32 位字。
setpci –s 24:00.0 04.w=6
要使 MSI 中斷生效,必須在“PCIe 配置”中設(shè)置“總線主控制器啟用 (Bus Master Enable)”位。以上命令可用于在命令寄存器中設(shè)置“總線主控制器啟用”位。此示例中的“24:00.0”表示 BDF 編號(hào)。不同器件采用不同編號(hào),且因系統(tǒng)而異。要找到正確的器件 BDF,請(qǐng)參閱對(duì)應(yīng) lspci 日志。
值為 6 表示當(dāng)前設(shè)置的是“存儲(chǔ)器啟用 (Memory Enable)”位和“總線主控制器啟用”位。
//setpci –s 24:00.0 4a.w=1
在 PCIe 配置空間內(nèi)還必須啟用 MSI 寄存器才能使 MSI 中斷正常工作。在 UltraScale+ 器件中,它位于偏移 0x48 處(在 lspci 日志中也顯示為 Capabilities: [48])。為此,請(qǐng)發(fā)出“PCIe 配置寫(xiě)入 (PCIe Configuration Write)”以將位 16(MSI 控制寄存器位 0)設(shè)為 1;以上命令可用于執(zhí)行此操作。
執(zhí)行以上命令后,可運(yùn)行 lspci 命令。這樣應(yīng)可改為顯示“MSI: Enable +”。
//setpci -s 01:00.0 82.b
以上命令用于從 UltraScale+ PCIe 端點(diǎn)器件的“鏈路狀態(tài)寄存器”中執(zhí)行讀取
地址“82”表示 UltraScale+ 器件。請(qǐng)參閱 (PG213) 以查看詳細(xì)表格。
//setpci -s 00:01.0 d0.b
以上命令用于從根端口 (Root Port) 的鏈路控制 2 寄存器中執(zhí)行讀取
在對(duì)應(yīng) lspci 日志中,鏈路功能基址為 a0,如下所示:
鏈路控制 2 寄存器偏移為“30”。將“a0”添加至“30”即可生成“d0”。“a0”地址表示根端口器件,如以上截屏中所示。此地址因使用的器件而異。對(duì)于使用 UltraScale+ 器件的根端口,功能地址起始位置為“70”,如下所示,而鏈路控制 2 寄存器偏移仍為“30”,即表示十進(jìn)制值 48。
從 lspci 日志中還可讀取基址值“70”,如下所示:
//setpci -s 00:01.0 d0.b=42
以上命令用于寫(xiě)入鏈路控制 2 寄存器,以將速度設(shè)置為 Gen2。
此處值“2”表示 Gen2,另一個(gè)位為“插槽時(shí)鐘”,該位已啟用,因此不發(fā)生更改。發(fā)出以上命令后,如果運(yùn)行 lspci,那么寄存器中顯示的速度值將更改為 Gen2。但這只是它再次執(zhí)行鏈路訓(xùn)練時(shí)的訓(xùn)練目標(biāo)速度。
要將鏈路速度更改為 Gen2,必須對(duì)鏈路進(jìn)行重新訓(xùn)練。可通過(guò)執(zhí)行以下所示命令來(lái)進(jìn)行重新訓(xùn)練:
setpci -s 00:01.0 b0.b=62
更改 PCIe 最大讀取請(qǐng)求大小
查詢(xún)寄存器以避免覆蓋其它屬性。
setpci -s 04:00.0 78.w
將期望值寫(xiě)入寄存器。
setpci -s 04:00.0 78.w=2936
“最大讀取請(qǐng)求”所在的“器件控制寄存器”的字節(jié)偏移針對(duì) UltraScale+ 器件為 78h。該值對(duì)于其它器件可能發(fā)生改變。用戶應(yīng)查詢(xún)相應(yīng)的產(chǎn)品指南。下表來(lái)自 (PG213)。
責(zé)任編輯:xj
原文標(biāo)題:開(kāi)發(fā)者分享 | 使用 lspci 和 setpci 調(diào)試 PCIe 問(wèn)題
文章出處:【微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
PCI
+關(guān)注
關(guān)注
4文章
669瀏覽量
130314 -
PCIe
+關(guān)注
關(guān)注
15文章
1241瀏覽量
82734
原文標(biāo)題:開(kāi)發(fā)者分享 | 使用 lspci 和 setpci 調(diào)試 PCIe 問(wèn)題
文章出處:【微信號(hào):FPGA-EETrend,微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論