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中对某些设备进行操作