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

1 前言

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

Linux内核中,为PCI和PCI-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 显示设备所有可解析的信息。

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

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

-xxxx 以16进制显示整个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命令结果很多值为unknown。lspci显示的设备名称如”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配置空间访问方式访问。

Linux PCI/PCI-E设备配置空间读取与修改的更多相关文章

  1. linux驱动---用I/O命令访问PCI总线设备配置空间

    PCI总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流.目前,国内的许多技术人员已经具备开发PCI总线接口设备的能 力.但是PCI总线的编程技术,也就是对PCI总线设备的操 ...

  2. 2.3 PCI桥与PCI设备的配置空间

    PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间.PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,PCI桥使用的配置空间和Cardbus ...

  3. Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

    三.PCI驱动程序实现 1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给 ...

  4. Linux的PCI驱动分析

    1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置 ...

  5. 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  6. Linux mips64r2 PCI中断路由机制分析

    Linux mips64r2 PCI中断路由机制分析 本文主要分析mips64r2 PCI设备中断路由原理和irq号分配实现方法,并尝试回答如下问题: PCI设备驱动中断注册(request_irq) ...

  7. [转载]PCI/PCIe基础——配置空间

    转载地址:http://blog.csdn.net/jiangwei0512/article/details/51603525 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地 ...

  8. Linux显示PCI设备

    Linux显示PCI设备 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ lspci -tv -[0000:00]-+-00.0 Advanced Micro ...

  9. LINUX内核PCI扫描过程

    LINUX内核PCI扫描过程 内核版本 3.10.103 1. ACPI热插拔扫描subsys_initcall(acpi_init)@drivers/acpi/bus.c |-acpi_scan_i ...

随机推荐

  1. 【转】GPS误差来源

    一.与GPS卫星有关的误差 1.卫星时钟误差 即使卫星是非常的精密复杂,它可以计算出一些极微小的讯息信息,如原子钟(Cesium) 即是如此一个精准的装置,但是精准并不代表完美,因此仍会有一些微小的误 ...

  2. iOS简单动画效果:闪烁、移动、旋转、路径、组合

    #define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...

  3. SpringMVC源码之Controller查找原理

    摘要 本文从源码层面简单讲解SpringMVC的处理器映射环节,也就是查找Controller详细过程. SpringMVC请求流程 Controller查找在上图中对应的步骤1至2的过程 Sprin ...

  4. redis 简易监控的几种方法

    简介 针对Redis 实现性能监控的几种方法 一.使用info命令 命令说明 127.0.0.1:6380> info # Server redis_version:3.2.11 redis_g ...

  5. Apache自带的rotatelogs实现日志轮转

    用Apache自带的rotatelogs程序处理apache生成的日志自动截断重新生成,rotatelogs是一个配合Apache管道日志功能使用的简单程序.设置方法如下: 编辑Apache的主配置文 ...

  6. 从细菌GFF文件提取CDS序列并转换为氨基酸序列

    最近在上生物信息学原理,打算记录一些课上的作业.第一次作业:如题. 基本思路: 1.从GFF中读取CDS的起始终止位置以及正负链信息.GFF格式见http://blog.sina.com.cn/s/b ...

  7. [Android] Toast问题深度剖析(二)

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...

  8. C#中内嵌资源的读取

    起因 作为一个从Cpper转到C#并且直接从事WPF开发的萌新来说,正式编码过程中碰到了不少问题,一路上磕磕碰碰的.因为软件设计需求上的要求,需要将一些配置文件(XML.INI等)内嵌到程序中,等需要 ...

  9. CentOS时间的查看与修改

    [http://www.centoscn.com/CentOS/help/2014/0805/3430.html] 1.查看.修改Linux时区与时间 一.linux时区的查看与修改 1,查看当前时区 ...

  10. Hive入门教程

    Hive 安装 相比起很多教程先介绍概念,我喜欢先动手装上,然后用例子来介绍概念.我们先来安装一下Hive 先确认是否已经安装了对应的yum源,如果没有照这个教程里面写的安装cdh的yum源http: ...