Build a valid device path to an EFI driver loaded from a PCI Option ROM

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3852 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
mdkinney
2007-09-14 21:29:45 +00:00
parent b98c2ab738
commit 2d9d2abf04

View File

@ -16,6 +16,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <IndustryStandard/Pci23.h> #include <IndustryStandard/Pci23.h>
//
// Module global for a template of the PCI option ROM Image Device Path Node
//
MEMMAP_DEVICE_PATH mPciOptionRomImageDevicePathNodeTemplate = {
{
HARDWARE_DEVICE_PATH,
HW_MEMMAP_DP,
sizeof (MEMMAP_DEVICE_PATH)
},
EfiMemoryMappedIO,
0,
0
};
EFI_STATUS EFI_STATUS
GetOpRomInfo ( GetOpRomInfo (
IN PCI_IO_DEVICE *PciIoDevice IN PCI_IO_DEVICE *PciIoDevice
@ -415,6 +429,7 @@ Returns:
EFI_DECOMPRESS_PROTOCOL *Decompress; EFI_DECOMPRESS_PROTOCOL *Decompress;
EFI_PCI_EXPANSION_ROM_HEADER *EfiRomHeader; EFI_PCI_EXPANSION_ROM_HEADER *EfiRomHeader;
PCI_DATA_STRUCTURE *Pcir; PCI_DATA_STRUCTURE *Pcir;
EFI_DEVICE_PATH_PROTOCOL *PciOptionRomImageDevicePath;
Indicator = 0; Indicator = 0;
@ -505,17 +520,31 @@ Returns:
} }
if (!SkipImage) { if (!SkipImage) {
//
// Build full device path to the PCI Option ROM Image being loaded
//
mPciOptionRomImageDevicePathNodeTemplate.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)RomBarOffset;
mPciOptionRomImageDevicePathNodeTemplate.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)(RomBarOffset + ImageSize - 1);
PciOptionRomImageDevicePath = AppendDevicePathNode (PciDevice->DevicePath, (const EFI_DEVICE_PATH_PROTOCOL *)&mPciOptionRomImageDevicePathNodeTemplate);
ASSERT (PciOptionRomImageDevicePath != NULL);
// //
// load image and start image // load image and start image
// //
Status = gBS->LoadImage ( Status = gBS->LoadImage (
FALSE, FALSE,
gPciBusDriverBinding.DriverBindingHandle, gPciBusDriverBinding.DriverBindingHandle,
PciDevice->Handle, PciOptionRomImageDevicePath,
ImageBuffer, ImageBuffer,
ImageLength, ImageLength,
&ImageHandle &ImageHandle
); );
//
// Free the device path after it has been used by LoadImage
//
gBS->FreePool (PciOptionRomImageDevicePath);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = gBS->StartImage (ImageHandle, NULL, NULL); Status = gBS->StartImage (ImageHandle, NULL, NULL);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {