1. 程式人生 > >Linux PCI/PCI-E裝置配置空間讀取與修改

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裝置。

[[email protected] ~]# 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)

[[email protected] ~]#

常用引數:

-v 顯示裝置的詳細資訊。

-vv 顯示裝置更詳細的資訊。

-vvv 顯示裝置所有可解析的資訊。

-x 16進位制顯示配置空間的前64位元組,或者CardBus橋的前128位元組。

-xxx 16進位制顯示整個PCI配置空間(256位元組)。

-xxxx 16進位制顯示整個PCI-E配置空間(4096位元組)。

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

顯示指定裝置。

示例:

[[email protected] ~]# 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檔案下載地址為:

下載後,直接覆蓋/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 前言 PCI和PCI Express,是計算機常使用的一種高速匯流排。作業系統中的PCI/PCI-E裝置驅動以及作業系統核心,都需要訪問PCI及PCI-E配置空間。PCI/PCI-E裝置的正常執行,離不開PCI/PCI-E配置空間。通過讀寫PCI/PCI-E配置空間,可以更改裝置執行引數,優化裝置執行。本

linux驅動---用I/O命令訪問PCI匯流排裝置配置空間

PCI匯流排推出以來,以其獨有的特性受到眾多廠商的青睞,已經成為計算機擴充套件匯流排的主流。目前,國內的許多技術人員已經具備開發PCI匯流排介面裝置的能 力。但是PCI匯流排的程式設計技術,也就是對PCI匯流排裝置的操作技術,一直是一件讓技術人員感到頭疼的事情。PCI匯流排程

鳥哥的Linux私房菜讀書筆記--配置檔案解析設定

X server的配置檔案預設放置在/etc/X11下,相關的顯示模組或總模組主要放置在/usr/lib64/xorg/modules,提供螢幕大的字型/usr/share/X11/fonts/,顯示介面卡的晶片組/usr/lib64/xorg/modules/drivers

C#實現appSettings節點讀取修改的方法

ffffff share 讀取 stat med modified 2-0 class exceptio 本文實例講述了C#實現appSettings節點讀取與修改的方法,分享給大家供大家參考。具體方法如下: 關鍵代碼如下: 代碼如下: public static s

caffemodel的讀取修改

chrome abs for amp font erl cursor padding nta 直接擼代碼~ 1 import caffe 2 import numpy as np 3 4 caffe.set_mode_cpu() 5 net = caffe.N

C# 讀取修改xml一個節點的值

XML檔案如下: <?xml version="1.0" encoding="utf-8"?> <root> <transDate>2014-12-18</transDate> </root> C#讀取與修

PCIe配置空間PCI裝置中的暫存器

1、訪問PCI配置空間,PCI基本配置空間的讀寫使用下列函式: 原型定義在<linux/pci.h> int pci_read_config_byte(struct pci_dev *pdev, intwhere, u8 *val); int pci_read

讀取PCI配置空間資料並操作其對映的實體記憶體

PC機在啟動的時候,都會看到一個PCI裝置清單,可以看到機器中的所有PCI裝置,其實搜尋PCI裝置的程式並不難編,本文通過一個例項說明如何遍歷PCI裝置。 1、瞭解PCI裝置        PCI的含義是外設部件互連(Peripheral Component Interconnect),PCI區域性匯流排(L

wdmWin10下遍歷PCI配置空間

圖右邊是引用驅動開發技術詳解書中的程式碼:3環只增加了個死迴圈 驅動沒變 #include <windows.h> #include <stdio.h> //使用CTL_CODE必須加入winioctl.h #include <winioctl.h> #include "

PCI/PCIe 的那些事(2)- 配置空間(Configuration Space)

PCI/PCIe配置空間(Configuration Space) PCI/PCIe的配置空間Configuration Space是一個與Memory空間和IO空間並列的獨立的空間。 對Legacy PCI來講,Configuration Space有2

LinuxPCI裝置驅動程式開發基本框架

PCI是一種廣泛採用的匯流排標準,它提供了許多優於其它匯流排標準(如EISA)的新特性,目前已經成為計算機系統中應用最為廣泛,並且最為通用的匯流排標準。Linux的核心能較好地支援PCI匯流排,本文以Intel 386體系結構為主,探討了在Linux下開發PCI裝置驅動程式的基本框架。    一、PCI匯流排

PCI匯流排配置空間詳解

其實之前是簡單學習過PCI裝置的相關知識,但是總感覺 自己的理解很函式,很多東西說不清楚,正好今天接著寫這篇文章自己重新梳理一下,文章想要分為三部分,首先介紹PCI裝置硬體相關的知識,然後介紹LINux核心中對PCI裝置的支援。本節講第一部分。 PCI匯流排在目前計算機匯流

PCI/PCIe基礎——配置空間

簡介 PCI/PCIe裝置有自己的獨立地址空間,這部分空間會對映到整個系統的地址空間。 對映地址在BIOS/UEFI下指定(如果有的話,對於使用非BIOS啟動的OS,不清楚),它有兩種型別,一種是MMIO,一種是IO。對於MMIO的訪問,跟訪問記憶體的方式一樣,它從稱為P

PCI、PCIE配置空間的訪問(MCFG,Bus,Device,Funtion)

一般來說,在x86平臺上,有兩大類方式可以訪問這一區間的暫存器, 1,配置機制1#或者配置機制2# 訪問時藉助in/out指令。請注意,這種方式有別於一般的in/out指令訪問PCI的IO空間,它引入了地址埠和資料埠。 配置機制2#只在某些特定的主機板上被使用

LinuxPCI設備驅動程序開發 --- PCI驅動程序實現(三)

傳輸 char rep roc register case 負責 ava b- 三、PCI驅動程序實現 1. 關鍵數據結構 PCI設備上有三種地址空間:PCI的I/O空間、PCI的存儲空間和PCI的配置空間。CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間

PCI PCI-X PCI-E區別

PCI、PCI-X、PCI-E區別一、PCI匯流排PCI匯流排標準是由PCISIG於1992年開發的,已經有超過8年的歷史。 PCI的總頻寬=33MHz×32BIT/8=133MB/S。二、PCI-X匯流排PCI-X是在增加了電源管理功能和熱插拔技術的PCI V2.2版本的基礎上,將PCI的總頻寬由13

關於PCI,PCI-X,PCI-E等匯流排的實際傳輸速率

匯流排是一組進行互連和傳輸資訊(指令、資料和地址)的訊號線。主要引數有匯流排位寬、匯流排時鐘頻率和匯流排傳輸速率。 ※匯流排位寬決定輸入/輸出裝置之間一次資料傳輸的資訊量,用位(bit)表示,如匯流排寬度為8位、16位、32位和64位。 ※匯流排時鐘頻率是匯流排的工作

Linux下的硬體驅動——USB裝置配置以及開發

前言USB是英文"Universal Serial Bus"的縮寫,意為"通用序列匯流排"。是由Compaq(康柏)、DEC、IBM、Intel、NEC、微軟以及Northern Telecom(北方電訊)等公司於1994年11月共同提出的,主要目的就是為了解決介面標準太多的弊端。USB使用一個4針插頭作為標

PCI,PCI-X,PCI-E

PCI-X是PCI匯流排的擴充套件架構,PCI-X頻率不像PCI那樣固定,而是可以隨著裝置的變化而變化的。PCI-X採用64位PCI匯流排(PCI為32bit),可以支援66,100,133MHz這些頻率。而在未來,可能將提供更多的頻率支援。PCI-X標準的提出主要面向伺服器

例說linux核心應用資料通訊(四):對映裝置核心空間到使用者態

#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #incl