| /** @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; | |
| } |