下面快速记录一下使用 setpci
命令配置 PCI
设备的步骤。
首先,简单看一下 setpci
的使用方法:
$ setpci --help
Usage: setpci [<options>] (<device>+ <reg>[=<values>]*)*
General options:
-f Don't complain if there's nothing to do
-v Be verbose
-D List changes, don't commit them
-r Use raw access without bus scan if possible
--dumpregs Dump all known register names and exit
PCI access options:
-A <method> Use the specified PCI access method (see '-A help' for a list)
-O <par>=<val> Set PCI access parameter (see '-O help' for a list)
-G Enable PCI access debugging
-H <mode> Use direct hardware access (<mode> = 1 or 2)
Setting commands:
<device>: -s [[[<domain>]:][<bus>]:][<slot>][.[<func>]]
-d [<vendor>]:[<device>]
<reg>: <base>[+<offset>][.(B|W|L)][@<number>]
<base>: <address>
<named-register>
[E]CAP_<capability-name>
[E]CAP<capability-number>
<values>: <value>[,<value>...]
<value>: <hex>
<hex>:<mask>
稍微有点复杂,但其实用法很简单。
需要明确的一点是,PCI
设备的配置空间共由 64
个字节组成,其地址范围为 0x00 ~ 0x3F
,这 64
个字节是所有 PCI
设备必须支持的。
此外,PCIe
设备还扩展了 0x40 ~ 0xFF
这段配置空间,在这段空间主要存放一些与 MSI
或者 MSI-X
中断机制和电源管理相关的 Capability
结构。其中所有能够提交中断请求的 PCIe
设备,必须支持 MSI
或者 MSI-X Capability
。
例如,可以使用 lspci
查看 82599
网卡的 0x00 ~ 0xFF
配置空间中的内容:
$ lspci -s 0b:00.0 -xxx
0b:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
00: 86 80 fb 10 43 01 10 00 01 00 00 02 10 00 80 00
10: 0c 00 d8 ff 9f 03 00 00 21 20 00 00 00 00 00 00
20: 0c 40 e0 ff 9f 03 00 00 00 00 00 00 86 80 03 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 0b 01 00 00
40: 01 50 23 48 00 20 00 2b 00 00 00 00 00 00 00 00
50: 05 70 80 01 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 11 a0 3f 00 04 00 00 00 04 20 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 10 00 02 00 c2 8c 00 10 36 58 09 00 82 c4 01 02
b0: 40 00 82 10 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 1f 00 00 00 00 00 00 00 00 00 00 00
d0: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我们在使用 setpci
修改 PCI
设备的配置空间内容时,
1)需要指定设备信息,也就是设备号,与 lspci
类似,使用 -s xx:xx.x
2)还需要指定待修改的寄存器的地址,范围是 0x00 ~ 0xFF
,并且通过 ‘w’
, ‘b’
后缀指定数据宽度,其中,'w'
表示 2
字节,'b'
表示 1
字节
3)还需要为寄存器指定修改后的值,例如:A0.b=0x01
例如:
查看 0a:00.0
设备配置空间 A0
地址处 2
字节的内容
$ setpci -s 0a:00.0 A0.w
修改 0a:00.0
设备配置空间 A0
地址处 1
字节的内容
$ setpci -s 0a:00.0 A0.b=0x01
例如,我们要打开 XL710
网卡的 PCIe IDO
功能,
1)首先通过 XL710
手册找到 IDO
功能所在的配置寄存器,为 Device Control 2
寄存器,它的地址是 0XC8
2)通过 setpci
查看 device control2
的原值
$ setpci -s 0a:00.0 c8.w
0000
3)在原值的基础上使能 IDO
功能,并写入新值
$ setpci -s 0a:00.0 c8.w=0x0300
4)确认已经写入成功
$ setpci -s 0a:00.0 c8.w
0300