[Remark]check PCI-E device and speed under Linux

This article also can be used for other cards with little or without change
Check if the host has HBA card installed and which type of card
installed,
# lspci | grep -i fibre
15:00.0 Fibre Channel: QLogic Corp. ISP2532-based 8Gb Fibre Channel to PCI Express
HBA (rev 02)
15:00.1 Fibre Channel: QLogic Corp. ISP2532-based 8Gb Fibre Channel to PCI Express
HBA (rev 02)
physical slot, driver, module information
# lspci  -v -s 15:00.0
15:00.0 Fibre Channel: QLogic Corp. ISP2532-based 8Gb Fibre Channel to PCI Express
HBA (rev 02)
Subsystem: QLogic Corp. Device 015d
Physical Slot: 2
Flags: bus master, fast devsel, latency 0, IRQ 24
I/O ports at 2200 [size=256]
Memory at 97b00000 (64-bit, non-prefetchable) [size=16K]
Expansion ROM at 90000000 [disabled] [size=256K]
Capabilities: [44] Power Management version 3
Capabilities: [4c] Express Endpoint, MSI 00
Capabilities: [88] MSI: Enable- Count=1/32 Maskable- 64bit+
Capabilities: [98] Vital Product Data
Capabilities: [a0] MSI-X: Enable+ Count=2 Masked-
Capabilities: [100] Advanced Error Reporting
Capabilities: [138] Power Budgeting <?>
Kernel driver in use: qla2xxx
Kernel modules: qla2xxx

Here is another example Emulex Card
# lspci  -v -s 10:00.0
10:00.0 Fibre Channel: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Ad
apter (rev 02)
Subsystem: Emulex Corporation Zephyr-X LightPulse Fibre Channel Host Adapter
Physical Slot: 2
Flags: bus master, fast devsel, latency 0, IRQ 26
Memory at c7eff000 (64-bit, non-prefetchable) [size=4K]
Memory at c7efec00 (64-bit, non-prefetchable) [size=256]
I/O ports at 6000 [size=256]
[virtual] Expansion ROM at c0000000 [disabled] [size=256K]
Capabilities: [58] Power Management version 2
Capabilities: [60] MSI: Enable+ Count=1/16 Maskable- 64bit+
Capabilities: [44] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [12c] Power Budgeting <?>
Kernel driver in use: lpfc
Kernel modules: lpfc

Check if the driver/module loaded in kernel.
# lsmod | grep qla2xxx
qla2xxx 425817 288
scsi_transport_fc 55299 1 qla2xxx
Check HBA author info
# modinfo -a qla2xxx
QLogic Corporation
Check HBA description
# modinfo -d qla2xxx
QLogic Fibre Channel HBA Driver
Check module file name
# modinfo -n qla2xxx
/lib/modules/2.6.32-358.14.1.el6.x86_64/kernel/drivers/scsi/qla2xxx/qla2xxx.ko
Check HBA driver license,
# modinfo -l qla2xxx
GPL
Check HBA driver and its version
# modinfo -d qla2xxx
QLogic Fibre Channel HBA Driver
# modinfo qla2xxx | grep version
version: 8.04.00.08.06.4-k
Check if the running driver is same with kernel one
# modinfo -k `uname -r` -n qla2xxx
/lib/modules/2.6.32-358.14.1.el6.x86_64/kernel/drivers/scsi/qla2xxx/qla2xxx.k

在 Linux 下要如何得知 PCI-E Bus 使用的是 Gen (Generation) 1 還是 Gen2 還是新一代的 Gen 3 雖然使用 #lspci 只要可以看到目前系統所有的裝置.但是好像看不到 PCI-E Bus 所採用的是哪一代的 PCI-E.

[root@benjr ~]# lspci
00:00.0 Host bridge: Intel Corporation 3200/3210 Chipset DRAM Controller (rev 01)
00:01.0 PCI bridge: Intel Corporation 3200/3210 Chipset Host-Primary PCI Express Bridge (rev 01)
00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02)
00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 02)
00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 02)
00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 02)
00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 6 (rev 02)
00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92)
00:1f.0 ISA bridge: Intel Corporation 82801IR (ICH9R) LPC Interface Controller (rev 02)
00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 02)
03:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
04:03.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)
09:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)
09:00.1 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)
0c:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1064ET PCI-Express Fusion-MPT SAS (rev 02)

如果有裝置是 unknown 的,需要更新 /usr/share/hwdata/pci.ids 請參考更新方式 http://benjr.tw/265

首先我們先來複習一下 PCI-E bus 的速度上限.

  • PCI Express 1.1
    使用兩對低電壓的差位訊號排線(low-voltage differential signaling pairs),分別各跑 2.5GBit/s 速度,x1 有兩對(傳送與接收) 2.5 G x 2 = 5Gbps 的頻寬.不過在討論頻寬時還是以單方向來計算.下面的速度是以單對的速度而言.
    x1 2.5Gbps (20% overhead – PCI-e 在每八個位元的資料串上用十位元來加以編碼) 2Gbps (250 MB/sec)
    x4 10Gbps 8Gbps (1 GB/sec)
    x8 20Gbps 16Gbps (2GB/sec)
    x16 40Gbps 32Gbps (4GB/sec)
  • PCI Express 2.0
    PCI-SIG 的 PCI Express 2.0 規格,新版每條 Lane 的單向頻寬從 2.5Gbps 倍增到 5Gbps.
    x1 5Gbps (20% overhead – PCI-e 並且在每八個位元的資料串上用十位元來加以編碼) 4Gbps (500 MB/sec)
    (5G*0.8)Mb/8=500MB
    x4 20Gbps 16Gbps (2 GB/sec)
    x8 40Gbps 32Gbps (4 GB/sec)
    x16 80Gbps 64Gbps (8 GB/sec)
  • PCI Express 3.0
    PCI-SIG 的 PCI Express 3.0 規格,新版每條 Lane 的單向頻寬增到 8Gbps.
    但因為編碼方式改變了,相較於 2.0 之前採用 8b/10b (每10個bit只有8個是有效資料)而 3.0 編碼方式為 128/130,所以資料傳輸頻寬以及原始傳輸率基本當都可以算成 8Gbps.
    x1 8Gbps (1GB/sec)
    x4 32Gbps (4 GB/sec)
    x8 64Gbps (8 GB/sec)
    x16 128Gbps (16 GB/sec)

 

我的系統上有一張 Qlogic Chipset 為 2432 的 4G Fiber Channel HBA,要如何得知目前系統的 PCI-E Bus 的速度呢!!

  1. Bus + Device + Function (Number)

    09:00.0 Fibre Channel: QLogic Corp. ISP2432-based 4Gb Fibre Channel to PCI Express HBA (rev 03)

    可以看到目前 Qlogic 2432 的 PCI 名稱以及裝置名稱為 09:00.0 先來看看這些數字所代表的意義.

    在 PCI 的裝置使用三個編號用來當作識別值,個別為 1.匯流排(bus number), 2. 裝置(device number) 以及 3. 功能(function number).

    所以剛剛的 09:00.0 就是 bus number = 09 ,device number = 00 function = 0 .

    這3個編號會組合成一個 16-bits 的識別碼.

    1. 匯流排(bus number) 8bits 2^8 至多可連接 256 個匯流排(0 to ff).
    2. 裝置(device number) 5bits 2^5 至多可接 32 種裝置(0 to 1f).
    3. 功能(function number) 3bits 2^3 至多每種裝置可有 8 項功能(0 to 7).

    關於更多 #lspci 的資訊請參考 http://benjr.tw/10851

    接下來透過指令 #lspci -s 09:00.0 -vvv |grep -i width 就可以得知 PCI-Express 的速度了.

    [root@benjr ~]# lspci -s 09:00.0 -vvv |grep -i width
    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    • LnkCap :
      系統能提供的最高頻寬 PCI-Express 1.0 ( 2.5G ) Width x4=10G .如果系統是提供 PCI-Express 2.0 那 x1 速度是 5G.
    • LnkSta :
      目前該PCI-E 裝置跑的速度 PCI-Express 1.0 ( 2.5G ) Width x1=2.5G,

    LnkSta 和 LnkCap 這兩個速度有可能不一樣 ,系統所提供的是 PCI Express 是 2.0 但裝置還是使用 1.0 的.

  2. Class + Vendor + Device (ID)

    不過在 Linux 使用 Class ID + Vendor ID + Device ID 來代表裝置,首先要查出這張 HBA 的裝置名稱.

    [root@benjr ~]# lspci -n
    …..
    09:00.0 0c04: 1077:2432 (rev 03)
    09:00.1 0c04: 1077:2432 (rev 03)
    ….

    參數 -n 使用 PCI vendor 以及 device codes 使用數字來顯示,後面我們會用到這些數字.

    如剛剛的 0c04: 1077:2432 所代表裝置名稱為 (Class ID = 0c04 ,Vendor ID = 1077,Device ID =2432) .

    • 0c04 : class 0c04 表示是 Fiber Channel controller
    • 1077 : vendor ID 1077 製造廠商 Qlogic Corp
    • 2432 : device ID 2432 產品名稱 ISP2432-based 4Gb Fiber Channel to PCI Express HBA

    你問我怎麼知道 ID 與名稱是怎麼對應的很簡單直接參考 /usr/share/hwdata/pci.ids 檔案即可.

    針對單一裝置來檢視可以使用 -d [vendor]:[device] 剛剛使用 -n 時所查到的 PCI vendor 以及 device codes 這邊就派得上用場了.

    接下來透過指令 #lspci -n -d 1077:2432 -vvv |grep -i width 就可以得知 PCI-Express 的速度了.

    [root@benjr ~]# lspci -n -d 1077:2432 -vvv |grep -i width
    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    LnkCap: Port #0, Speed 2.5GT/s, Width x4, ASPM L0s, Latency L0 <4us, L1 unlimited
    LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
    • LnkCap :
      系統能提供的最高頻寬 PCI-Express 1.0 ( 2.5G ) Width x4=10G .如果系統是提供 PCI-Express 2.0 那 x1 速度是 5G.
    • LnkSta :
      目前該PCI-E 裝置跑的速度 PCI-Express 1.0 ( 2.5G ) Width x1=2.5G.

    LnkSta 和 LnkCap 這兩個速度有可能不一樣 ,系統所提供的是 PCI Express 是 2.0 但裝置還是使用 1.0 的.