]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[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
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
9060e3ec 6\r
7**/\r
8\r
9#include "PciBus.h"\r
10\r
11//\r
12// PCI ROM image information\r
13//\r
14typedef struct {\r
15 EFI_HANDLE ImageHandle;\r
16 UINTN Seg;\r
17 UINT8 Bus;\r
18 UINT8 Dev;\r
19 UINT8 Func;\r
221c8fd5
RN
20 VOID *RomImage;\r
21 UINT64 RomSize;\r
22} PCI_ROM_IMAGE;\r
9060e3ec 23\r
221c8fd5
RN
24UINTN mNumberOfPciRomImages = 0;\r
25UINTN mMaxNumberOfPciRomImages = 0;\r
26PCI_ROM_IMAGE *mRomImageTable = NULL;\r
9060e3ec 27\r
28/**\r
29 Add the Rom Image to internal database for later PCI light enumeration.\r
30\r
31 @param ImageHandle Option Rom image handle.\r
32 @param Seg Segment of PCI space.\r
33 @param Bus Bus NO of PCI space.\r
34 @param Dev Dev NO of PCI space.\r
35 @param Func Func NO of PCI space.\r
221c8fd5
RN
36 @param RomImage Option Rom buffer.\r
37 @param RomSize Size of Option Rom buffer.\r
9060e3ec 38**/\r
39VOID\r
40PciRomAddImageMapping (\r
41 IN EFI_HANDLE ImageHandle,\r
42 IN UINTN Seg,\r
43 IN UINT8 Bus,\r
44 IN UINT8 Dev,\r
45 IN UINT8 Func,\r
221c8fd5
RN
46 IN VOID *RomImage,\r
47 IN UINT64 RomSize\r
9060e3ec 48 )\r
49{\r
84ed8edf 50 UINTN Index;\r
221c8fd5 51 PCI_ROM_IMAGE *NewTable;\r
9060e3ec 52\r
84ed8edf
RN
53 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
54 if (mRomImageTable[Index].Seg == Seg &&\r
55 mRomImageTable[Index].Bus == Bus &&\r
56 mRomImageTable[Index].Dev == Dev &&\r
57 mRomImageTable[Index].Func == Func) {\r
58 //\r
59 // Expect once RomImage and RomSize are recorded, they will be passed in\r
60 // later when updating ImageHandle\r
61 //\r
62 ASSERT ((mRomImageTable[Index].RomImage == NULL) || (RomImage == mRomImageTable[Index].RomImage));\r
63 ASSERT ((mRomImageTable[Index].RomSize == 0 ) || (RomSize == mRomImageTable[Index].RomSize ));\r
64 break;\r
9060e3ec 65 }\r
84ed8edf 66 }\r
9060e3ec 67\r
84ed8edf
RN
68 if (Index == mNumberOfPciRomImages) {\r
69 //\r
70 // Rom Image Table buffer needs to grow.\r
71 //\r
72 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {\r
73 NewTable = ReallocatePool (\r
74 mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),\r
75 (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),\r
76 mRomImageTable\r
77 );\r
78 if (NewTable == NULL) {\r
79 return ;\r
80 }\r
81\r
82 mRomImageTable = NewTable;\r
83 mMaxNumberOfPciRomImages += 0x20;\r
84 }\r
85 //\r
86 // Record the new PCI device\r
87 //\r
88 mRomImageTable[Index].Seg = Seg;\r
89 mRomImageTable[Index].Bus = Bus;\r
90 mRomImageTable[Index].Dev = Dev;\r
91 mRomImageTable[Index].Func = Func;\r
92 mNumberOfPciRomImages++;\r
9060e3ec 93 }\r
94\r
84ed8edf
RN
95 mRomImageTable[Index].ImageHandle = ImageHandle;\r
96 mRomImageTable[Index].RomImage = RomImage;\r
97 mRomImageTable[Index].RomSize = RomSize;\r
9060e3ec 98}\r
99\r
100/**\r
101 Get Option rom driver's mapping for PCI device.\r
102\r
103 @param PciIoDevice Device instance.\r
104\r
105 @retval TRUE Found Image mapping.\r
106 @retval FALSE Cannot found image mapping.\r
107\r
108**/\r
109BOOLEAN\r
110PciRomGetImageMapping (\r
111 IN PCI_IO_DEVICE *PciIoDevice\r
112 )\r
113{\r
114 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
115 UINTN Index;\r
9060e3ec 116\r
117 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;\r
9060e3ec 118\r
119 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
120 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&\r
121 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&\r
122 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&\r
123 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {\r
9060e3ec 124\r
125 if (mRomImageTable[Index].ImageHandle != NULL) {\r
b5cbef4e 126 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);\r
9060e3ec 127 }\r
84ed8edf
RN
128 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;\r
129 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\r
130 return TRUE;\r
9060e3ec 131 }\r
132 }\r
133\r
84ed8edf 134 return FALSE;\r
9060e3ec 135}\r