Linux PCI/PCI-E设备配置空间读取与修改

1 前言

PCIPCI Express,是计算机常使用的一种高速总线。操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCIPCI-E配置空间。PCI/PCI-E设备的正常运行,离不开PCI/PCI-E配置空间。
通过读写PCI/PCI-E配置空间,可以更改设备运行参数,优化设备运行。本文介绍用户空间可以读取、修改、扫描PCI/PCIE设备的用户命令及使用。

Linux内核中,为PCIPCI-E只适用了一种总线PCI(内核提供的总线系统),故访问PCI-E配置空间,也包括了PCI设备配置空间。


2 P C I E设备配置空间读取

读取PCI-E设备配置空间的命令是lspci

NAME

lspci – list all PCI devices


SYNOPSIS

lspci [options]


详细命令参数,可以使用man lspci来查看,这里我们只介绍常用参数。

命令默认输出结果是,当前系统的所有PCI/PCI-E设备。

[root@localhost ~]# lspci

00:00.0 Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)

00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 13)

00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 13)

00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 13)

00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 13)

00:10.0 PIC: Intel Corporation 5520/5500/X58 Physical and Link Layer Registers Port 0 (rev 13)

00:10.1 PIC: Intel Corporation 5520/5500/X58 Routing and Protocol Layer Registers Port 0 (rev 13)

00:11.0 PIC: Intel Corporation 5520/5500 Physical and Link Layer Registers Port 1 (rev 13)

00:11.1 PIC: Intel Corporation 5520/5500 Routing & Protocol Layer Register Port 1 (rev 13)

00:13.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller (rev 13)

00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 13)

… …

01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

04:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1068E PCI-Express Fusion-MPT SAS (rev 08)

05:00.0 VGA compatible controller: XGI Technology Inc. (eXtreme Graphics Innovation) Z9s/Z9m (XG21 core)

[root@localhost ~]#


常用参数:

-v显示设备的详细信息。

-vv显示设备更详细的信息。

-vvv显示设备所有可解析的信息。

-x16进制显示配置空间的前64字节,或者CardBus桥的前128字节。

-xxx16进制显示整个PCI配置空间(256字节)。

-xxxx16进制显示整个PCI-E配置空间(4096字节)。

-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]

显示指定设备。

示例:

[root@localhost ~]# lspci -vvvxxxx -s 00:14.0

00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 13) (prog-if 00 [8259])

Subsystem: Unknown device 00e5:0008

Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-

Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR-

Capabilities: [40] Express Unknown type IRQ 0

Device: Supported: MaxPayload 128 bytes, PhantFunc 0, ExtTag-

Device: Latency L0s <64ns, L1 <1us

Device: Errors: Correctable- Non-Fatal- Fatal- Unsupported-

Device: RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-

Device: MaxPayload 128 bytes, MaxReadReq 128 bytes

Link: Supported Speed unknown, Width x0, ASPM L0s, Port 0

Link: Latency L0s unlimited, L1 unlimited

Link: ASPM Disabled CommClk- ExtSynch-

Link: Speed unknown, Width x0

00: 86 80 2e 34 00 00 10 00 13 00 00 08 10 00 80 00

10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

20: 00 00 00 00 00 00 00 00 00 00 00 00 e5 00 08 00

… …

fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


当我们用老版本的Linux系统在新平台上运行时,会发现lspci命令结果很多值为unknownlspci显示的设备名称如”Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)“,实际上从文件/usr/share/hwdata/pci.ids进行匹配的,PCI-E配置空间并没有类似Intel这样的字符串。出现Unknown设备时,我们可以更新pci.ids文件。

pci.ids文件下载地址为:

http://pciids.sourceforge.net/

下载后,直接覆盖/usr/share/hwdata/pci.ids文件即可。


3 P C I -E设备配置空间修改

修改PCIE配置空间的命令为:setpci

NAME

setpci – configure PCI devices


SYNOPSIS

setpci [options] devices


对于setpci命令来说,主要的参数如下:

-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]


就是我们要指定设备,然后修改其配置空间。常用命令格式和参数如下:

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.B=NEWVALUE

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.W=NEWVALUE

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.L=NEWVALUE


如:

setpci -s 0:14.0 60.B=6

是将设备0:14.0设备,PCI配置空间便宜量为0x60,写入新的字节值为6。查看PCI配置空间修改是否生效,可以通过lspci命令来查看,如设置0:14.0后,读取命令为lspci –s 0:14.0 –xxx


4 扫描PCI设备

扫描或探测PCI/PCI-E设备的命令为:scanpci

NAME

scanpci – scan/probe PCI buses


SYNOPSIS

scanpci [-v12OfV]


参数:

-v打印所有设备的配置空间信息。

-1使用PCI配置Type 1

-2使用PCI配置Type 2

-f-1-2参数结合,强制使用某种类型。

-O:使用OS的PCI配置空间访问方式访问。


更多相关文章

  1. windows linux 创建oracle用户及表空间
  2. Oracle的临时表空间
  3. sql server查看表空间
  4. 临时表空间、drop、truncate、delete的区别
  5. GridView中实现元素填充剩余空间(自适应)
  6. Android 通过读取本地Arp表获取当前局域网内其他设备信息
  7. 关于利用android-serialport-api实现在安卓设备上进行串口通信,附
  8. 如何在Android设备中创建Web服务器(用于远程访问)
  9. 让Android 设备通过USB 转RJ45有线网卡上网

随机推荐

  1. Android动画效果
  2. Android中关联源码
  3. SOAP in Android
  4. android屏幕自适应4方法案例整合
  5. Android studio中的一些小技巧
  6. android怎样将textview置于imageview之上
  7. RatingBar 显示正常版本----断点记录
  8. Android MediaPlayer错误码整理
  9. 手工打包APK
  10. Android(安卓)管理多个fragment(处理Acti