uefi遍历pcie设备

  EFI_STATUS                Status;
  UINTN                     HandleCount;
  EFI_HANDLE                *HandleBuffer=NULL;
  UINTN                     Index;
  EFI_PCI_IO_PROTOCOL       *PciIo = NULL;
  UINTN                     Seg,Bus,Dev,Fun;
  UINT8                     MacAddr[6];
  PCI_TYPE00                PciData;      

  Status = gBS->LocateHandleBuffer (
                    ByProtocol,
                    &gEfiPciIoProtocolGuid,
                    NULL,
                    &HandleCount,
                    &HandleBuffer
    );
  if(HandleCount == 0){
    return Status;
  }
  for(Index = 0; Index < HandleCount;Index++){
    Status = gBS->HandleProtocol (
                    HandleBuffer[Index],
                    &gEfiPciIoProtocolGuid,
                    (VOID **) &PciIo
    );
    if(EFI_ERROR(Status)){
      continue;
    }

    PciIo->GetLocation(PciIo,&Seg,&Bus,&Dev,&Fun);
    Status = PciIo->Pci.Read (
                        PciIo,
                        EfiPciIoWidthUint16,
                        PCI_VENDOR_ID_OFFSET,
                        sizeof (PciData.Hdr.VendorId),
                        &PciData.Hdr.VendorId
                        );
    Status = PciIo->Pci.Read (
                        PciIo,
                        EfiPciIoWidthUint16,
                        PCI_DEVICE_ID_OFFSET,
                        sizeof (PciData.Hdr.DeviceId),
                        &PciData.Hdr.DeviceId
                        );
//    DEBUG((EFI_D_ERROR,"VendorID = 0x%x\n",PciData.Hdr.VendorId)); 
 
//    if((Dev==0)&&(Bus==2)&&(Fun == 0)){
    if(PciData.Hdr.VendorId == 0x10ec && PciData.Hdr.DeviceId == 0x8168){
      DEBUG((EFI_D_ERROR, "Find mac\n"));
      Status = PciIo->Attributes(PciIo, EfiPciIoAttributeOperationEnable, EFI_PCI_IO_ATTRIBUTE_IO, NULL);
      Status = PciIo->Io.Read(PciIo, EfiPciIoWidthUint8, 0, 0, 6, MacAddr);

      DEBUG((EFI_D_ERROR, "MAC = %02X-%02X-%02X-%02X-%02X-%02X\n",MacAddr[0],  MacAddr[1],  MacAddr[2],  MacAddr[3],  MacAddr[4],  MacAddr[5]));

      break;
    }
  }

uefi 在bds中对某些设备进行操作

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UEFI(Unified Extensible Firmware Interface)是一种新一代的固件接口标准,用于替代传统的BIOS(Basic Input/Output System)。UEFI的引入使得计算机启动速度更快、性能更好,并且提供更多的扩展功能。 在UEFI中,PCI(Peripheral Component Interconnect)是一种计算机总线技术,用于连接外部设备,例如网络适配器、显卡等。PCI总线上的每个设备都有一个唯一的标识符,称为设备ID,用于识别设备并管理其操作。 在UEFI中,PCI设备遍历是指系统固件或操作系统对机器上所有PCI设备进行枚举和初始化的过程。这个过程通常在计算机启动时进行,以确保所有PCI设备都能被正确地识别、配置和使用。 PCI设备遍历过程一般分为以下几个步骤: 1. 初始化PCI总线控制器:UEFI固件首先初始化PCI总线控制器,以便与PCI总线上的设备进行通信。 2. 遍历PCI设备UEFI固件通过PCI总线控制器逐个枚举PCI设备,根据设备ID识别每个设备,并获取设备的配置空间信息。 3. 配置PCI设备UEFI固件根据设备的配置空间信息,为每个设备分配资源,例如内存地址、中断等。 4. 初始化PCI设备UEFI固件对每个PCI设备进行初始化,例如加载设备的固件驱动程序、设置设备的状态等。 5. 注册PCI设备UEFI固件将已经初始化的PCI设备注册到系统固件表中,以便操作系统能够识别和使用这些设备。 通过UEFIPCI遍历过程,计算机系统能够正确地识别和配置PCI设备,使其能够正常工作。这对于操作系统、驱动程序和应用程序的运行都非常重要。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值