]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c
Dispatch the UEFI option rom returned from PciPlatform/PciOverride protocol.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciOptionRomSupport.c
index 33dbfa4af72db94cf9c9e750afb43769f68aa690..2bc4f8c5e8573a144e05ea21605d17a7479a994a 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   PCI Rom supporting funtions implementation for PCI Bus module.\r
 \r
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -309,6 +309,63 @@ GetOpRomInfo (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Check if the RomImage contains EFI Images.\r
+\r
+  @param  RomImage  The ROM address of Image for check.\r
+  @param  RomSize   Size of ROM for check.\r
+\r
+  @retval TRUE     ROM contain EFI Image.\r
+  @retval FALSE    ROM not contain EFI Image.\r
+\r
+**/\r
+BOOLEAN\r
+ContainEfiImage (\r
+  IN VOID            *RomImage,\r
+  IN UINT64          RomSize\r
+  )\r
+{\r
+  PCI_EXPANSION_ROM_HEADER  *RomHeader;\r
+  PCI_DATA_STRUCTURE        *RomPcir;\r
+  UINT8                     Indicator;\r
+\r
+  Indicator = 0;\r
+  RomHeader = RomImage;\r
+  if (RomHeader == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  do {\r
+    if (RomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {\r
+      RomHeader = (PCI_EXPANSION_ROM_HEADER *) ((UINT8 *) RomHeader + 512);\r
+      continue;\r
+    }\r
+\r
+    //\r
+    // The PCI Data Structure must be DWORD aligned. \r
+    //\r
+    if (RomHeader->PcirOffset == 0 ||\r
+        (RomHeader->PcirOffset & 3) != 0 ||\r
+        (UINT8 *) RomHeader + RomHeader->PcirOffset + sizeof (PCI_DATA_STRUCTURE) > (UINT8 *) RomImage + RomSize) {\r
+      break;\r
+    }\r
+\r
+    RomPcir = (PCI_DATA_STRUCTURE *) ((UINT8 *) RomHeader + RomHeader->PcirOffset);\r
+    if (RomPcir->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {\r
+      break;\r
+    }\r
+\r
+    if (RomPcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE) {\r
+      return TRUE;\r
+    }\r
+\r
+    Indicator = RomPcir->Indicator;\r
+    RomHeader = (PCI_EXPANSION_ROM_HEADER *) ((UINT8 *) RomHeader + RomPcir->ImageLength * 512);\r
+  } while (((UINT8 *) RomHeader < (UINT8 *) RomImage + RomSize) && ((Indicator & 0x80) == 0x00));\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Load Option Rom image for specified PCI device.\r
 \r
@@ -340,7 +397,6 @@ LoadOpRomImage (
   UINT32                    LegacyImageLength;\r
   UINT8                     *RomInMemory;\r
   UINT8                     CodeType;\r
-  BOOLEAN                   HasEfiOpRom;\r
 \r
   RomSize       = PciDevice->RomSize;\r
 \r
@@ -392,7 +448,6 @@ LoadOpRomImage (
   RetStatus     = EFI_NOT_FOUND;\r
   FirstCheck    = TRUE;\r
   LegacyImageLength = 0;\r
-  HasEfiOpRom   = FALSE;\r
 \r
   do {\r
     PciDevice->PciRootBridgeIo->Mem.Read (\r
@@ -443,8 +498,6 @@ LoadOpRomImage (
     if (RomPcir->CodeType == PCI_CODE_TYPE_PCAT_IMAGE) {\r
       CodeType = PCI_CODE_TYPE_PCAT_IMAGE;\r
       LegacyImageLength = ((UINT32)((EFI_LEGACY_EXPANSION_ROM_HEADER *)RomHeader)->Size512) * 512;\r
-    } else if (RomPcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE) {\r
-      HasEfiOpRom = TRUE;\r
     }\r
     Indicator     = RomPcir->Indicator;\r
     RomImageSize  = RomImageSize + RomPcir->ImageLength * 512;\r
@@ -484,7 +537,6 @@ LoadOpRomImage (
 \r
   RomDecode (PciDevice, RomBarIndex, RomBar, FALSE);\r
 \r
-  PciDevice->HasEfiOpRom    = HasEfiOpRom;\r
   PciDevice->EmbeddedRom    = TRUE;\r
   PciDevice->PciIo.RomSize  = RomImageSize;\r
   PciDevice->PciIo.RomImage = RomInMemory;\r