问题:W6800卡插在不同的IO模组,SubDid,SubVid会跟随改变,BMC无法正确显示设备
分析:由图可以看出,W6800是个Switch设备,该设备挂载在rootbridge 01 下面,该Switch下还挂了PCIE设备,提交给BMC的应该为设备Did,Vid,Subdid,subvid。
Switch设备的Header Type 为1,要找到PCIE设备,Header Type 为0,Type1的配置空间如下图所示:
找到插在Switch卡上的PCIE设备的配置空间
addr.Addr.Register = PCI_HEADER_TYPE_OFFSET;
RbIoProtocol->Pci.Read(RbIoProtocol, EfiPciWidthUint8, addr.ADDR, 1, (VOID*)&HeaderType );
if ((HeaderType & HEADER_LAYOUT_CODE) == 1 ) {
addr.Addr.Register = 0x19;
RbIoProtocol->Pci.Read (RbIoProtocol, EfiPciWidthUint8, addr.ADDR, 1, (VOID*)&SecBus);
addr.Addr.Register = 0x1A;
RbIoProtocol->Pci.Read (RbIoProtocol, EfiPciWidthUint8, addr.ADDR, 1, (VOID*)&SubBus);
for (int BridgeBus = SecBus; BridgeBus <= SubBus; BridgeBus++) {
addr.Addr.Bus = (UINT8)BridgeBus;
addr.Addr.Register = PCI_HEADER_TYPE_OFFSET;
RbIoProtocol->Pci.Read (RbIoProtocol, EfiPciWidthUint8, addr.ADDR, 1, (VOID*)&HeaderType );
if ((HeaderType & HEADER_LAYOUT_CODE) == 0 ) {
addr.Addr.Register = 0;
RbIoProtocol->Pci.Read(RbIoProtocol, EfiPciWidthUint32, addr.ADDR, 1, (VOID*)&PciVidDid);
addr.Addr.Register = 0x2C;
RbIoProtocol->Pci.Read (RbIoProtocol, EfiPciWidthUint32, addr.ADDR, 1, (VOID*)&SubPciVidDid );
}
}
}
最终可以正确识别PCIE的设备信息