龍芯平臺如何BIOS下如何讀取pcie擴展配置空間

讀取peie擴展配置空間中的信息

硬件環境:

           G1控制器(00:11:00)
                |
           8632橋(03:00:00)
                |
   --------------------------------------------------------------------------------------------
   |  (04:00:00)       |(04:04:00)           |(04:05:00)                      |(04:06:00)
8632橋                   8632橋                    8632橋                                8632橋
                                                                   |
                                                               82580網卡(07:00:00)

如何讀擴展配置空間的信息呢?pcie規範中擴展空間的起始地址是從標準配置空間開始偏移0x100開始的,也就是從偏移256字節開始是擴展配置空間,前256自己是標準配置空間。
在我們7a橋片上,將0x100中的1映射到了64位地址的24-27位。也就是我們要訪問上面的(04:05:00)這個設備的擴展配置空間,那麼地址是如何組出來的呢?
首先確定設備的地址(Bus:4,Device:5,Func:0)
0x90000efe10000000+(Bus<<16|Device<<11|Func<<8)也就是0x90000efe10042800這個地址。那麼要訪問這個設備的擴展配置空間,就需要在這個基礎上再偏移0x100,也就是0x90000efe10042800+0x100,但是將1映射到了第24-27bit,也就變成了0x90000efe11042800這個地址。這纔是擴展配置空間的起始地址。讀出來後前4字節(32bit)中的低16bit表示的是這個結構的id,根據pcie spec規範,每一個擴展結構都有一個Id,這個id都包含了哪些寄存器,以及意義都有解釋,這裏不做詳細的介紹。詳細請看pci spec 下面是我讀出來的信息

cpu0 -d4 0x90000efe11042800 0x10
#d4 0x90000efe11042800 0x10
90000efe11042800: fb410003 b5df0e00 aa860010 00000000 ..A.............
90000efe11042810: 00000000 00000000 00000000 00000000 ................
90000efe11042820: 00000000 00000000 00000000 00000000 ................
90000efe11042830: 00000000 00000000 00000000 00000000 ................

根據上面的信息第一個結構的id是0003,低四字節中的高16bit中的前12bit,表示下一個結構的偏移。也就是下一個結構的地址應該是0x90000efe10042800+0xfb4,那麼我們要去讀就需要使用
0x90000efe1f0428b4這個地址去讀。下面是讀出來的信息

#d4 0x90000efe1f0428b4 0x10
90000efe1f0428b4: 14810001 00000000 00000000 00062030 ............0 ..
90000efe1f0428c4: 00002001 00002000 000000bf 00000000 . ... ..........
90000efe1f0428d4: 00000000 00000000 00000000 00000000 ................
90000efe1f0428e4: 00000000 00000000 00000000 00000000 ................

依次按照上面的規則去讀,直到下一個結構的偏移是0,表示擴展空間信息結束。每個設備的擴展配置空間都幾個結構不一定。
下面是我讀出來的信息。

#d4 0x90000efe11042848 0x10
90000efe11042848: 52010002 00000000 00000000 00000000 ...R............
90000efe11042858: 00000001 800000ff 00000000 00000000 ................
90000efe11042868: 00000000 00000000 00000000 00000000 ................
90000efe11042878: 00000000 00000000 00000000 00000000 ................
#d4 0x90000efe15042820 0x10
90000efe15042820: 9501000d 00000c7f 00000000 00000000 ................
90000efe15042830: 00000000 00000000 00000000 00000000 ................
90000efe15042840: 00000000 00000000 00000000 00000000 ................
90000efe15042850: 00000000 00000000 00000000 00000000 ................
cpu0 -d4 0x90000efe19042850 0x10
#d4 0x90000efe19042850 0x10
90000efe19042850: 0001000b 01000001 863210b5 000000aa ..........2.....
90000efe19042860: 00000000 00000000 00000000 00000000 ................
90000efe19042870: 00000000 00000000 00000000 00000000 ................
90000efe19042880: 00000000 00000000 00000000 00000000 ................

直到0x90000efe19042850 這個地址是最後一個結構爲止,因爲下一個結構的偏移這裏已經是0了,表示結束。
注意:在擴展配置空間中,包含很多pcie相關的硬件鏈路層的狀態信息,以及出錯的信息。看這裏能看出很多正常情況軟件看不到的信息,當遇到pcie辣手的問題。多看這裏纔是王道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章