]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
MdeModulePkg/PciBus: Refine EFI_PCI_ROM_IMAGE_MAPPING
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciRomTable.c
CommitLineData
9060e3ec 1/** @file\r
2 Set up ROM Table for PCI Bus module.\r
3\r
221c8fd5 4Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
cd5ebaa0 5This program and the accompanying materials\r
9060e3ec 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "PciBus.h"\r
16\r
17//\r
18// PCI ROM image information\r
19//\r
20typedef struct {\r
21 EFI_HANDLE ImageHandle;\r
22 UINTN Seg;\r
23 UINT8 Bus;\r
24 UINT8 Dev;\r
25 UINT8 Func;\r
221c8fd5
RN
26 VOID *RomImage;\r
27 UINT64 RomSize;\r
28} PCI_ROM_IMAGE;\r
9060e3ec 29\r
221c8fd5
RN
30UINTN mNumberOfPciRomImages = 0;\r
31UINTN mMaxNumberOfPciRomImages = 0;\r
32PCI_ROM_IMAGE *mRomImageTable = NULL;\r
9060e3ec 33\r
34/**\r
35 Add the Rom Image to internal database for later PCI light enumeration.\r
36\r
37 @param ImageHandle Option Rom image handle.\r
38 @param Seg Segment of PCI space.\r
39 @param Bus Bus NO of PCI space.\r
40 @param Dev Dev NO of PCI space.\r
41 @param Func Func NO of PCI space.\r
221c8fd5
RN
42 @param RomImage Option Rom buffer.\r
43 @param RomSize Size of Option Rom buffer.\r
9060e3ec 44**/\r
45VOID\r
46PciRomAddImageMapping (\r
47 IN EFI_HANDLE ImageHandle,\r
48 IN UINTN Seg,\r
49 IN UINT8 Bus,\r
50 IN UINT8 Dev,\r
51 IN UINT8 Func,\r
221c8fd5
RN
52 IN VOID *RomImage,\r
53 IN UINT64 RomSize\r
9060e3ec 54 )\r
55{\r
221c8fd5 56 PCI_ROM_IMAGE *NewTable;\r
9060e3ec 57\r
221c8fd5 58 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {\r
9060e3ec 59\r
221c8fd5
RN
60 NewTable = ReallocatePool (\r
61 mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),\r
62 (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),\r
63 mRomImageTable\r
64 );\r
65 if (NewTable == NULL) {\r
9060e3ec 66 return ;\r
67 }\r
68\r
221c8fd5
RN
69 mRomImageTable = NewTable;\r
70 mMaxNumberOfPciRomImages += 0x20;\r
9060e3ec 71 }\r
72\r
73 mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle;\r
74 mRomImageTable[mNumberOfPciRomImages].Seg = Seg;\r
75 mRomImageTable[mNumberOfPciRomImages].Bus = Bus;\r
76 mRomImageTable[mNumberOfPciRomImages].Dev = Dev;\r
77 mRomImageTable[mNumberOfPciRomImages].Func = Func;\r
221c8fd5
RN
78 mRomImageTable[mNumberOfPciRomImages].RomImage = RomImage;\r
79 mRomImageTable[mNumberOfPciRomImages].RomSize = RomSize;\r
9060e3ec 80 mNumberOfPciRomImages++;\r
81}\r
82\r
83/**\r
84 Get Option rom driver's mapping for PCI device.\r
85\r
86 @param PciIoDevice Device instance.\r
87\r
88 @retval TRUE Found Image mapping.\r
89 @retval FALSE Cannot found image mapping.\r
90\r
91**/\r
92BOOLEAN\r
93PciRomGetImageMapping (\r
94 IN PCI_IO_DEVICE *PciIoDevice\r
95 )\r
96{\r
97 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
98 UINTN Index;\r
99 BOOLEAN Found;\r
100\r
101 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;\r
102 Found = FALSE;\r
103\r
104 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
105 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&\r
106 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&\r
107 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&\r
108 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {\r
109 Found = TRUE;\r
110\r
111 if (mRomImageTable[Index].ImageHandle != NULL) {\r
112 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);\r
113 } else {\r
221c8fd5
RN
114 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;\r
115 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\r
9060e3ec 116 }\r
117 }\r
118 }\r
119\r
120 return Found;\r
121}\r