Set up ROM Table for PCI Bus module.\r
\r
Copyright (c) 2006 - 2017, 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
-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
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
IN UINT64 RomSize\r
)\r
{\r
+ UINTN Index;\r
PCI_ROM_IMAGE *NewTable;\r
\r
- if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {\r
-\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
+ 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
- mRomImageTable = NewTable;\r
- mMaxNumberOfPciRomImages += 0x20;\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
+ mRomImageTable = NewTable;\r
+ mMaxNumberOfPciRomImages += 0x20;\r
+ }\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].RomImage = RomImage;\r
- mRomImageTable[mNumberOfPciRomImages].RomSize = RomSize;\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 = mRomImageTable[Index].RomImage;\r
- PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\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