簡介
一個PCI/PCIe設(shè)備的配置空間是給其他設(shè)備/RC暴露的接口,可以通過配置空間查看設(shè)備的一些能力集咖杂、狀態(tài)等庆寺,也可以下發(fā)寫配置命令來控制設(shè)備打開某些功能(設(shè)備必須支持才可以)
對于傳統(tǒng)PCI設(shè)備的配置空間使用256個字節(jié)的大小,而PCIe在PCI的基礎(chǔ)上擴展到了4K的大小诉字,如下圖所示
也即PCIe完成兼容PCI的配置空間懦尝,都包含前256字節(jié)知纷,只有0xFF之后的空間是PCIe設(shè)備獨有的
PCI/PCIe公共配置空間頭
公共配置空間頭共占用64個字節(jié),如下圖:
PCI/PCIe設(shè)備能力集
PCI/PCIe兼容能力集
PCI/PCIe設(shè)備能力集存放在配置空間頭之后的空間中(0x40開始的空間)陵霉,但是每類設(shè)備琅轧、或者不同廠家的設(shè)備支持的能力集、存放的順序不一樣踊挠,怎么找到設(shè)備具體包含哪些能力以及都存放在什么位置呢乍桂?
規(guī)范中是通過一個鏈表來實現(xiàn)的,表頭就存放在配置空間頭信息的0x34位置(Capabilities Pointer)效床,這個表頭就指向第一個能力所在的位置睹酌,每一個能力集都的Capability Header包含兩個內(nèi)容:
- 當(dāng)前能力ID,bit[7:0]表示
- 指向下一個能力的位置剩檀,bit[15:8]表示
注意:
- 此鏈表只能表示前256字節(jié)內(nèi)部存放的能力集憋沿;256~4K的空間內(nèi)存放PCIe擴展的能力集,具體的查找方式見下一節(jié)
2.最后一個能力的“批向下一個能力的位置”為0表示此能力為鏈表中最后一個
以PM Cap為例沪猴,能力定義如下
一個實際的SSD磁盤的公共配置空間如下圖所示:
先讀取0x34的值為0x40辐啄,表示第一個能力的位置,讀取0x40的值表示當(dāng)前能力的ID字币;讀取0x41的值表示下一個能力的位置则披。共缕。洗出。
從圖中看此SSD的基本能力集如下:
PCIe擴展能力集
如果是PCIe設(shè)備的話,還會有PCIe規(guī)范定義的擴展能力集图谷,開始位置固定在0x100為第一個擴展能力翩活,也是通過一個鏈表來表示(與基本能力集不在同一個鏈表),Capability Header中包含三個內(nèi)容:
- Capability ID便贵,bit[15:0]表示
- version菠镇,bit[19:16]表示
- next Capability,bit[31:20]表示
以AER為例承璃,Capability Header如下圖
一個實際的SSD磁盤的配置空間如下圖所示(4K太大利耍,只截取到0x200):
讀取0x100地址的前4字節(jié)為0x16820001,拆分之后為id=0x1盔粹,vs=0x2隘梨,next=0x168
從圖中看此SSD的擴展能力集如下圖所示:
Capability Struct
每個能力在配置空間中存放的位置找到之后就要以根據(jù)此Capability定義的結(jié)構(gòu)訪問對應(yīng)每個字段值即可,主要參考PCIe規(guī)范的第7章內(nèi)容
在系統(tǒng)啟動舷嗡,或者可熱插入設(shè)備插入時轴猎,對此設(shè)備進行枚舉的過程中就可以按此方法訪問設(shè)備的配置空間所提供的能力集