mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 19:23:54 +01:00 
			
		
		
		
	It's a regression of below commit: SHA-1: 8be37a5cee700777ca8e8e8a34cc2225b21931a7 * MdeModulePkg/SecurityStubDxe: Defer 3rd party image before EndOfDxe When PciBus driver fails to load the Option ROM, it doesn't produce BusOverride protocol. It was a correct behavior before the above commit. But due to the above commit, BusOverride protocol never is produced by PciBus driver. The patch fixes this issue using the following solution: 1. PciBus records the image device path when LoadImage fails. 2. Override.GetDriver() tries to look for the image handle using the stored image device path. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Set up ROM Table for PCI Bus module.
 | |
| 
 | |
| Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "PciBus.h"
 | |
| 
 | |
| //
 | |
| // PCI ROM image information
 | |
| //
 | |
| typedef struct {
 | |
|   EFI_HANDLE  ImageHandle;
 | |
|   UINTN       Seg;
 | |
|   UINT8       Bus;
 | |
|   UINT8       Dev;
 | |
|   UINT8       Func;
 | |
|   VOID        *RomImage;
 | |
|   UINT64      RomSize;
 | |
| } PCI_ROM_IMAGE;
 | |
| 
 | |
| UINTN          mNumberOfPciRomImages     = 0;
 | |
| UINTN          mMaxNumberOfPciRomImages  = 0;
 | |
| PCI_ROM_IMAGE  *mRomImageTable           = NULL;
 | |
| 
 | |
| /**
 | |
|   Add the Rom Image to internal database for later PCI light enumeration.
 | |
| 
 | |
|   @param ImageHandle    Option Rom image handle.
 | |
|   @param Seg            Segment of PCI space.
 | |
|   @param Bus            Bus NO of PCI space.
 | |
|   @param Dev            Dev NO of PCI space.
 | |
|   @param Func           Func NO of PCI space.
 | |
|   @param RomImage       Option Rom buffer.
 | |
|   @param RomSize        Size of Option Rom buffer.
 | |
| **/
 | |
| VOID
 | |
| PciRomAddImageMapping (
 | |
|   IN  EFI_HANDLE  ImageHandle,
 | |
|   IN  UINTN       Seg,
 | |
|   IN  UINT8       Bus,
 | |
|   IN  UINT8       Dev,
 | |
|   IN  UINT8       Func,
 | |
|   IN  VOID        *RomImage,
 | |
|   IN  UINT64      RomSize
 | |
|   )
 | |
| {
 | |
|   UINTN           Index;
 | |
|   PCI_ROM_IMAGE   *NewTable;
 | |
| 
 | |
|   for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
 | |
|     if (mRomImageTable[Index].Seg  == Seg &&
 | |
|         mRomImageTable[Index].Bus  == Bus &&
 | |
|         mRomImageTable[Index].Dev  == Dev &&
 | |
|         mRomImageTable[Index].Func == Func) {
 | |
|       //
 | |
|       // Expect once RomImage and RomSize are recorded, they will be passed in
 | |
|       // later when updating ImageHandle
 | |
|       //
 | |
|       ASSERT ((mRomImageTable[Index].RomImage == NULL) || (RomImage == mRomImageTable[Index].RomImage));
 | |
|       ASSERT ((mRomImageTable[Index].RomSize  == 0   ) || (RomSize  == mRomImageTable[Index].RomSize ));
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (Index == mNumberOfPciRomImages) {
 | |
|     //
 | |
|     // Rom Image Table buffer needs to grow.
 | |
|     //
 | |
|     if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {
 | |
|       NewTable = ReallocatePool (
 | |
|                    mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),
 | |
|                    (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),
 | |
|                    mRomImageTable
 | |
|                    );
 | |
|       if (NewTable == NULL) {
 | |
|         return ;
 | |
|       }
 | |
| 
 | |
|       mRomImageTable            = NewTable;
 | |
|       mMaxNumberOfPciRomImages += 0x20;
 | |
|     }
 | |
|     //
 | |
|     // Record the new PCI device
 | |
|     //
 | |
|     mRomImageTable[Index].Seg  = Seg;
 | |
|     mRomImageTable[Index].Bus  = Bus;
 | |
|     mRomImageTable[Index].Dev  = Dev;
 | |
|     mRomImageTable[Index].Func = Func;
 | |
|     mNumberOfPciRomImages++;
 | |
|   }
 | |
| 
 | |
|   mRomImageTable[Index].ImageHandle = ImageHandle;
 | |
|   mRomImageTable[Index].RomImage    = RomImage;
 | |
|   mRomImageTable[Index].RomSize     = RomSize;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get Option rom driver's mapping for PCI device.
 | |
| 
 | |
|   @param PciIoDevice Device instance.
 | |
| 
 | |
|   @retval TRUE   Found Image mapping.
 | |
|   @retval FALSE  Cannot found image mapping.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| PciRomGetImageMapping (
 | |
|   IN  PCI_IO_DEVICE                       *PciIoDevice
 | |
|   )
 | |
| {
 | |
|   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
 | |
|   UINTN                           Index;
 | |
| 
 | |
|   PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;
 | |
| 
 | |
|   for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
 | |
|     if (mRomImageTable[Index].Seg  == PciRootBridgeIo->SegmentNumber &&
 | |
|         mRomImageTable[Index].Bus  == PciIoDevice->BusNumber         &&
 | |
|         mRomImageTable[Index].Dev  == PciIoDevice->DeviceNumber      &&
 | |
|         mRomImageTable[Index].Func == PciIoDevice->FunctionNumber    ) {
 | |
| 
 | |
|       if (mRomImageTable[Index].ImageHandle != NULL) {
 | |
|         AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);
 | |
|       }
 | |
|       PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;
 | |
|       PciIoDevice->PciIo.RomSize  = mRomImageTable[Index].RomSize;
 | |
|       return TRUE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 |