2 Set up ROM Table for PCI Bus module.
4 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
12 // PCI ROM image information
15 EFI_HANDLE ImageHandle
;
24 UINTN mNumberOfPciRomImages
= 0;
25 UINTN mMaxNumberOfPciRomImages
= 0;
26 PCI_ROM_IMAGE
*mRomImageTable
= NULL
;
29 Add the Rom Image to internal database for later PCI light enumeration.
31 @param ImageHandle Option Rom image handle.
32 @param Seg Segment of PCI space.
33 @param Bus Bus NO of PCI space.
34 @param Dev Dev NO of PCI space.
35 @param Func Func NO of PCI space.
36 @param RomImage Option Rom buffer.
37 @param RomSize Size of Option Rom buffer.
40 PciRomAddImageMapping (
41 IN EFI_HANDLE ImageHandle
,
51 PCI_ROM_IMAGE
*NewTable
;
53 for (Index
= 0; Index
< mNumberOfPciRomImages
; Index
++) {
54 if (mRomImageTable
[Index
].Seg
== Seg
&&
55 mRomImageTable
[Index
].Bus
== Bus
&&
56 mRomImageTable
[Index
].Dev
== Dev
&&
57 mRomImageTable
[Index
].Func
== Func
) {
59 // Expect once RomImage and RomSize are recorded, they will be passed in
60 // later when updating ImageHandle
62 ASSERT ((mRomImageTable
[Index
].RomImage
== NULL
) || (RomImage
== mRomImageTable
[Index
].RomImage
));
63 ASSERT ((mRomImageTable
[Index
].RomSize
== 0 ) || (RomSize
== mRomImageTable
[Index
].RomSize
));
68 if (Index
== mNumberOfPciRomImages
) {
70 // Rom Image Table buffer needs to grow.
72 if (mNumberOfPciRomImages
== mMaxNumberOfPciRomImages
) {
73 NewTable
= ReallocatePool (
74 mMaxNumberOfPciRomImages
* sizeof (PCI_ROM_IMAGE
),
75 (mMaxNumberOfPciRomImages
+ 0x20) * sizeof (PCI_ROM_IMAGE
),
78 if (NewTable
== NULL
) {
82 mRomImageTable
= NewTable
;
83 mMaxNumberOfPciRomImages
+= 0x20;
86 // Record the new PCI device
88 mRomImageTable
[Index
].Seg
= Seg
;
89 mRomImageTable
[Index
].Bus
= Bus
;
90 mRomImageTable
[Index
].Dev
= Dev
;
91 mRomImageTable
[Index
].Func
= Func
;
92 mNumberOfPciRomImages
++;
95 mRomImageTable
[Index
].ImageHandle
= ImageHandle
;
96 mRomImageTable
[Index
].RomImage
= RomImage
;
97 mRomImageTable
[Index
].RomSize
= RomSize
;
101 Get Option rom driver's mapping for PCI device.
103 @param PciIoDevice Device instance.
105 @retval TRUE Found Image mapping.
106 @retval FALSE Cannot found image mapping.
110 PciRomGetImageMapping (
111 IN PCI_IO_DEVICE
*PciIoDevice
114 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*PciRootBridgeIo
;
117 PciRootBridgeIo
= PciIoDevice
->PciRootBridgeIo
;
119 for (Index
= 0; Index
< mNumberOfPciRomImages
; Index
++) {
120 if (mRomImageTable
[Index
].Seg
== PciRootBridgeIo
->SegmentNumber
&&
121 mRomImageTable
[Index
].Bus
== PciIoDevice
->BusNumber
&&
122 mRomImageTable
[Index
].Dev
== PciIoDevice
->DeviceNumber
&&
123 mRomImageTable
[Index
].Func
== PciIoDevice
->FunctionNumber
) {
125 if (mRomImageTable
[Index
].ImageHandle
!= NULL
) {
126 AddDriver (PciIoDevice
, mRomImageTable
[Index
].ImageHandle
, NULL
);
128 PciIoDevice
->PciIo
.RomImage
= mRomImageTable
[Index
].RomImage
;
129 PciIoDevice
->PciIo
.RomSize
= mRomImageTable
[Index
].RomSize
;