REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3811 Remove ASSERT() statements that are triggered if a platform provides an override of PCI ROM attached to a PCI Controller. The PCI Platform Protocol allows the platform to provide a PCI ROM image for a PCI Controller. This works for PCI Controllers that do not have an attached PCI ROM, but the platform is not allowed to replace the PCI ROM for a PCI Controller that has its own PCI ROM. Removing these ASSERT() statements enables this additional use case. Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Acked-by: Ard Biesheuvel <ardb@kernel.org>
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Set up ROM Table for PCI Bus module.
 | |
| 
 | |
| Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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. They may also be updated with new
 | |
|       // values if the platform provides an override of RomImage and 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;
 | |
| }
 |