1 PCIE配置空間
1.1 軟件如何知道PCIE設備是Swith,RC還是EP?
–軟件通過讀取寄存器信息。
PCIE配置空間? PCIE寄存器;--PCIE配置協議規定必須實現的空間。--PCIE存在兩種配置空間Type0/Type1;--Type0配置空間EP設備必須實現;--Type1配置空間RC/Switch設備必須實現;? PCIE配置空間具體大小 --1DW = 4Byte
圖–:
? PCIE每個設備都有4KB的配置空間? 4KB配置空間前64DW(即256Byte)與PCI兼容保持一致;? 960DW為PCIE擴展寄存器空間;
PCIE兼容配置空間:
1.PCIE兼容配置空間包含PCI Header--64Byte空間和Capability--192Byte空間;2.Header空間分為Type0和Type1兩種:Type0配置空間EP設備必須實現;Type1配置空間RC/Switch設備必須實現;3.Capalitiy空間--以鏈表形式組織的擴展功能寄存器:能力寄存器空間,實現可選擇實現的寄存器;但如下寄存器必須實現:PCIE Capality; Power Management; MSI/MSIX;4.能力寄存器采用鏈表結構;```c//==這是從0到大進行排列;Offset 0x40: | Cap ID (8b) | Next Ptr (8b) | Cap Data (16b) | → 4字節對齊Offset 0x80: | Cap ID (8b) | Next Ptr (8b) | Cap Data (16b) | → 下一個對齊項```ID:表示能力A寄存器的類型<什么寄存器>;Pointer表示下一個能力寄存器地址B_addr;其圖如下所示:
例如:PCIE能力寄存器中的PM/MSI寄存器,軟件如何進行獲取呢?
Steps:1.系統軟件發起addr:0x34的讀請求,訪問PCI header Capalibity point寄存器(起始是固定的);2.系統軟件讀取addr:0x34 pointer:0x40,返回結果表示PCIE下一組寄存器的地址為0x40;3.系統軟件發起addr:0x40的讀請求;4.系統軟件讀取:addr:0x40, data:{0x50,0x1};ID:0x1表示類型為PM寄存器;Next Pointer: 0x50表示訪問下一個能力寄存器的地址位0x50;5.系統軟件再進一步讀取0x50地址,讀取數據{0x70,0x05};ID:0x5表示位MS寄存器;NextPointer: 0x70表示訪問下一個能力寄存器的地址為0x70;6.通過查手冊可知:取addr:0x54,0x55,0x56分別配置MSI中斷地址和數據;0x54:表示Message lower address; 0x58: Message upper address;0xC0:表示Message data;
步驟圖如下:
小結:鏈表是單鏈表結構,就是軟件的數據結構,只能進行便來訪問,不能通過index索引來訪問;