龙芯平台如何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辣手的问题。多看这里才是王道。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页