PCIE Switch设备的Did,Vid,SubDid,SubVid信息获取

问题: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的设备信息

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值