/** @file\r
Set up ROM Table for PCI Bus module.\r
\r
-Copyright (c) 2006 - 2009, Intel Corporation\r
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
UINT8 Bus;\r
UINT8 Dev;\r
UINT8 Func;\r
- UINT64 RomAddress;\r
- UINT64 RomLength;\r
-} EFI_PCI_ROM_IMAGE_MAPPING;\r
+ VOID *RomImage;\r
+ UINT64 RomSize;\r
+} PCI_ROM_IMAGE;\r
\r
-UINTN mNumberOfPciRomImages = 0;\r
-UINTN mMaxNumberOfPciRomImages = 0;\r
-EFI_PCI_ROM_IMAGE_MAPPING *mRomImageTable = NULL;\r
+UINTN mNumberOfPciRomImages = 0;\r
+UINTN mMaxNumberOfPciRomImages = 0;\r
+PCI_ROM_IMAGE *mRomImageTable = NULL;\r
\r
/**\r
Add the Rom Image to internal database for later PCI light enumeration.\r
@param Bus Bus NO of PCI space.\r
@param Dev Dev NO of PCI space.\r
@param Func Func NO of PCI space.\r
- @param RomAddress Base address of OptionRom.\r
- @param RomLength Length of rom image.\r
-\r
+ @param RomImage Option Rom buffer.\r
+ @param RomSize Size of Option Rom buffer.\r
**/\r
VOID\r
PciRomAddImageMapping (\r
IN UINT8 Bus,\r
IN UINT8 Dev,\r
IN UINT8 Func,\r
- IN UINT64 RomAddress,\r
- IN UINT64 RomLength\r
+ IN VOID *RomImage,\r
+ IN UINT64 RomSize\r
)\r
{\r
- EFI_PCI_ROM_IMAGE_MAPPING *TempMapping;\r
-\r
- if (mNumberOfPciRomImages >= mMaxNumberOfPciRomImages) {\r
-\r
- mMaxNumberOfPciRomImages += 0x20;\r
+ UINTN Index;\r
+ PCI_ROM_IMAGE *NewTable;\r
\r
- TempMapping = NULL;\r
- TempMapping = AllocatePool (mMaxNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));\r
- if (TempMapping == NULL) {\r
- return ;\r
+ for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
+ if (mRomImageTable[Index].Seg == Seg &&\r
+ mRomImageTable[Index].Bus == Bus &&\r
+ mRomImageTable[Index].Dev == Dev &&\r
+ mRomImageTable[Index].Func == Func) {\r
+ //\r
+ // Expect once RomImage and RomSize are recorded, they will be passed in\r
+ // later when updating ImageHandle\r
+ //\r
+ ASSERT ((mRomImageTable[Index].RomImage == NULL) || (RomImage == mRomImageTable[Index].RomImage));\r
+ ASSERT ((mRomImageTable[Index].RomSize == 0 ) || (RomSize == mRomImageTable[Index].RomSize ));\r
+ break;\r
}\r
+ }\r
\r
- CopyMem (TempMapping, mRomImageTable, mNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));\r
+ if (Index == mNumberOfPciRomImages) {\r
+ //\r
+ // Rom Image Table buffer needs to grow.\r
+ //\r
+ if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {\r
+ NewTable = ReallocatePool (\r
+ mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),\r
+ (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),\r
+ mRomImageTable\r
+ );\r
+ if (NewTable == NULL) {\r
+ return ;\r
+ }\r
\r
- if (mRomImageTable != NULL) {\r
- FreePool (mRomImageTable);\r
+ mRomImageTable = NewTable;\r
+ mMaxNumberOfPciRomImages += 0x20;\r
}\r
-\r
- mRomImageTable = TempMapping;\r
+ //\r
+ // Record the new PCI device\r
+ //\r
+ mRomImageTable[Index].Seg = Seg;\r
+ mRomImageTable[Index].Bus = Bus;\r
+ mRomImageTable[Index].Dev = Dev;\r
+ mRomImageTable[Index].Func = Func;\r
+ mNumberOfPciRomImages++;\r
}\r
\r
- mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle;\r
- mRomImageTable[mNumberOfPciRomImages].Seg = Seg;\r
- mRomImageTable[mNumberOfPciRomImages].Bus = Bus;\r
- mRomImageTable[mNumberOfPciRomImages].Dev = Dev;\r
- mRomImageTable[mNumberOfPciRomImages].Func = Func;\r
- mRomImageTable[mNumberOfPciRomImages].RomAddress = RomAddress;\r
- mRomImageTable[mNumberOfPciRomImages].RomLength = RomLength;\r
- mNumberOfPciRomImages++;\r
+ mRomImageTable[Index].ImageHandle = ImageHandle;\r
+ mRomImageTable[Index].RomImage = RomImage;\r
+ mRomImageTable[Index].RomSize = RomSize;\r
}\r
\r
/**\r
{\r
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
UINTN Index;\r
- BOOLEAN Found;\r
\r
PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;\r
- Found = FALSE;\r
\r
for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&\r
mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&\r
mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&\r
mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {\r
- Found = TRUE;\r
\r
if (mRomImageTable[Index].ImageHandle != NULL) {\r
- AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);\r
- } else {\r
- PciIoDevice->PciIo.RomImage = (VOID *) (UINTN) mRomImageTable[Index].RomAddress;\r
- PciIoDevice->PciIo.RomSize = (UINTN) mRomImageTable[Index].RomLength;\r
+ AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);\r
}\r
+ PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;\r
+ PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\r
+ return TRUE;\r
}\r
}\r
\r
- return Found;\r
+ return FALSE;\r
}\r