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
return FALSE;\r
}\r
\r
-STATIC\r
-CHAR16\r
-NibbleToHexChar (\r
- IN UINT8 Nibble\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Converts the low nibble of a byte to hex unicode character.\r
-\r
- Arguments:\r
- Nibble - lower nibble of a byte.\r
-\r
- Returns:\r
- Hex unicode character.\r
-\r
---*/\r
-{\r
- Nibble &= 0x0F;\r
- if (Nibble <= 0x9) {\r
- return (CHAR16)(Nibble + L'0');\r
- }\r
-\r
- return (CHAR16)(Nibble - 0xA + L'A');\r
-}\r
-\r
STATIC\r
EFI_STATUS\r
HexStringToBuf (\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
-EFI_STATUS\r
-BufToHexString (\r
- IN OUT CHAR16 *Str,\r
- IN OUT UINTN *HexStringBufferLength,\r
- IN UINT8 *Buf,\r
- IN UINTN Len\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Converts binary buffer to Unicode string.\r
- At a minimum, any blob of data could be represented as a hex string.\r
-\r
- Arguments:\r
- Str - Pointer to the string.\r
- HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.\r
- If routine return with EFI_SUCCESS, containing length of hex string buffer.\r
- If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.\r
- Buf - Buffer to be converted from.\r
- Len - Length in bytes of the buffer to be converted.\r
-\r
- Returns:\r
- EFI_SUCCESS: Routine success.\r
- EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.\r
-\r
---*/\r
-{\r
- UINTN Idx;\r
- UINT8 Byte;\r
- UINTN StrLen;\r
-\r
- //\r
- // Make sure string is either passed or allocate enough.\r
- // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
- // Plus the Unicode termination character.\r
- //\r
- StrLen = Len * 2;\r
- if (StrLen > ((*HexStringBufferLength) - 1)) {\r
- *HexStringBufferLength = StrLen + 1;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *HexStringBufferLength = StrLen + 1;\r
- //\r
- // Ends the string.\r
- //\r
- Str[StrLen] = L'\0'; \r
-\r
- for (Idx = 0; Idx < Len; Idx++) {\r
-\r
- Byte = Buf[Idx];\r
- Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);\r
- Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
STATIC\r
CHAR16 *\r
TrimHexStr (\r