mNumberOfPciRomImages++;\r
}\r
\r
-STATIC\r
-VOID\r
-HexToString (\r
- CHAR16 *String,\r
- UINTN Value,\r
- UINTN Digits\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- TODO: Add function description\r
-\r
-Arguments:\r
-\r
- String - TODO: add argument description\r
- Value - TODO: add argument description\r
- Digits - TODO: add argument description\r
-\r
-Returns:\r
-\r
- TODO: add return values\r
-\r
---*/\r
-{\r
- for (; Digits > 0; Digits--, String++) {\r
- *String = (CHAR16) ((Value >> (4 * (Digits - 1))) & 0x0f);\r
- if (*String > 9) {\r
- (*String) += ('A' - 10);\r
- } else {\r
- (*String) += '0';\r
- }\r
- }\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-PciRomLoadEfiDriversFromRomImage (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_PCI_OPTION_ROM_DESCRIPTOR *PciOptionRomDescriptor\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: PciOptionRomDescriptor - add argument and description to function comment\r
-{\r
- VOID *RomBar;\r
- UINTN RomSize;\r
- CHAR16 *FileName;\r
- EFI_PCI_EXPANSION_ROM_HEADER *EfiRomHeader;\r
- PCI_DATA_STRUCTURE *Pcir;\r
- UINTN ImageIndex;\r
- UINTN RomBarOffset;\r
- UINT32 ImageSize;\r
- UINT16 ImageOffset;\r
- EFI_HANDLE ImageHandle;\r
- EFI_STATUS Status;\r
- EFI_STATUS retStatus;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
- BOOLEAN SkipImage;\r
- UINT32 DestinationSize;\r
- UINT32 ScratchSize;\r
- UINT8 *Scratch;\r
- VOID *ImageBuffer;\r
- VOID *DecompressedImageBuffer;\r
- UINT32 ImageLength;\r
- EFI_DECOMPRESS_PROTOCOL *Decompress;\r
-\r
- RomBar = (VOID *) (UINTN) PciOptionRomDescriptor->RomAddress;\r
- RomSize = (UINTN) PciOptionRomDescriptor->RomLength;\r
- FileName = L"PciRom Seg=00000000 Bus=00 Dev=00 Func=00 Image=0000";\r
-\r
- HexToString (&FileName[11], PciOptionRomDescriptor->Seg, 8);\r
- HexToString (&FileName[24], PciOptionRomDescriptor->Bus, 2);\r
- HexToString (&FileName[31], PciOptionRomDescriptor->Dev, 2);\r
- HexToString (&FileName[39], PciOptionRomDescriptor->Func, 2);\r
-\r
- ImageIndex = 0;\r
- retStatus = EFI_NOT_FOUND;\r
- RomBarOffset = (UINTN) RomBar;\r
-\r
- do {\r
-\r
- EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) (UINTN) RomBarOffset;\r
-\r
- if (EfiRomHeader->Signature != 0xaa55) {\r
- return retStatus;\r
- }\r
-\r
- Pcir = (PCI_DATA_STRUCTURE *) (UINTN) (RomBarOffset + EfiRomHeader->PcirOffset);\r
- ImageSize = Pcir->ImageLength * 512;\r
-\r
- if ((Pcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE) &&\r
- (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE) ) {\r
-\r
- if ((EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||\r
- (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) ) {\r
-\r
- ImageOffset = EfiRomHeader->EfiImageHeaderOffset;\r
- ImageSize = EfiRomHeader->InitializationSize * 512;\r
-\r
- ImageBuffer = (VOID *) (UINTN) (RomBarOffset + ImageOffset);\r
- ImageLength = ImageSize - ImageOffset;\r
- DecompressedImageBuffer = NULL;\r
-\r
- //\r
- // decompress here if needed\r
- //\r
- SkipImage = FALSE;\r
- if (EfiRomHeader->CompressionType > EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED) {\r
- SkipImage = TRUE;\r
- }\r
-\r
- if (EfiRomHeader->CompressionType == EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED) {\r
- Status = gBS->LocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **) &Decompress);\r
- if (EFI_ERROR (Status)) {\r
- SkipImage = TRUE;\r
- } else {\r
- SkipImage = TRUE;\r
- Status = Decompress->GetInfo (\r
- Decompress,\r
- ImageBuffer,\r
- ImageLength,\r
- &DestinationSize,\r
- &ScratchSize\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- DecompressedImageBuffer = NULL;\r
- DecompressedImageBuffer = AllocatePool (DestinationSize);\r
- if (DecompressedImageBuffer != NULL) {\r
- Scratch = AllocatePool (ScratchSize);\r
- if (Scratch != NULL) {\r
- Status = Decompress->Decompress (\r
- Decompress,\r
- ImageBuffer,\r
- ImageLength,\r
- DecompressedImageBuffer,\r
- DestinationSize,\r
- Scratch,\r
- ScratchSize\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- ImageBuffer = DecompressedImageBuffer;\r
- ImageLength = DestinationSize;\r
- SkipImage = FALSE;\r
- }\r
-\r
- gBS->FreePool (Scratch);\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (!SkipImage) {\r
-\r
- //\r
- // load image and start image\r
- //\r
-\r
- HexToString (&FileName[48], ImageIndex, 4);\r
- FilePath = FileDevicePath (NULL, FileName);\r
-\r
- Status = gBS->LoadImage (\r
- FALSE,\r
- This->ImageHandle,\r
- FilePath,\r
- ImageBuffer,\r
- ImageLength,\r
- &ImageHandle\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->StartImage (ImageHandle, NULL, NULL);\r
- if (!EFI_ERROR (Status)) {\r
- PciRomAddImageMapping (\r
- ImageHandle,\r
- PciOptionRomDescriptor->Seg,\r
- PciOptionRomDescriptor->Bus,\r
- PciOptionRomDescriptor->Dev,\r
- PciOptionRomDescriptor->Func,\r
- PciOptionRomDescriptor->RomAddress,\r
- PciOptionRomDescriptor->RomLength\r
- );\r
- retStatus = Status;\r
- }\r
- }\r
- }\r
-\r
- if (DecompressedImageBuffer != NULL) {\r
- gBS->FreePool (DecompressedImageBuffer);\r
- }\r
-\r
- }\r
- }\r
-\r
- RomBarOffset = RomBarOffset + ImageSize;\r
- ImageIndex++;\r
- } while (((Pcir->Indicator & 0x80) == 0x00) && ((RomBarOffset - (UINTN) RomBar) < RomSize));\r
-\r
- return retStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-PciRomLoadEfiDriversFromOptionRomTable (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-// TODO: This - add argument and description to function comment\r
-// TODO: PciRootBridgeIo - add argument and description to function comment\r
-// TODO: EFI_NOT_FOUND - add return value to function comment\r
-{\r
- EFI_STATUS Status;\r
- EFI_PCI_OPTION_ROM_TABLE *PciOptionRomTable;\r
- EFI_PCI_OPTION_ROM_DESCRIPTOR *PciOptionRomDescriptor;\r
- UINTN Index;\r
- EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors;\r
- UINT16 MinBus;\r
- UINT16 MaxBus;\r
-\r
- Status = EfiGetSystemConfigurationTable (&gEfiPciOptionRomTableGuid, (VOID **) &PciOptionRomTable);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Status = EFI_NOT_FOUND;\r
-\r
- for (Index = 0; Index < PciOptionRomTable->PciOptionRomCount; Index++) {\r
- PciOptionRomDescriptor = &PciOptionRomTable->PciOptionRomDescriptors[Index];\r
- if (!PciOptionRomDescriptor->DontLoadEfiRom) {\r
- if (PciOptionRomDescriptor->Seg == PciRootBridgeIo->SegmentNumber) {\r
- Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Descriptors);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- PciGetBusRange (&Descriptors, &MinBus, &MaxBus, NULL);\r
- if ((MinBus <= PciOptionRomDescriptor->Bus) && (PciOptionRomDescriptor->Bus <= MaxBus)) {\r
- Status = PciRomLoadEfiDriversFromRomImage (This, PciOptionRomDescriptor);\r
- PciOptionRomDescriptor->DontLoadEfiRom |= 2;\r
- }\r
- }\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
EFI_STATUS\r
PciRomGetRomResourceFromPciOptionRomTable (\r
IN EFI_DRIVER_BINDING_PROTOCOL *This,\r