]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
MdeModulePkg/PciBus: Refine EFI_PCI_ROM_IMAGE_MAPPING
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciRomTable.c
... / ...
CommitLineData
1/** @file\r
2 Set up ROM Table for PCI Bus module.\r
3\r
4Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
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
26 VOID *RomImage;\r
27 UINT64 RomSize;\r
28} PCI_ROM_IMAGE;\r
29\r
30UINTN mNumberOfPciRomImages = 0;\r
31UINTN mMaxNumberOfPciRomImages = 0;\r
32PCI_ROM_IMAGE *mRomImageTable = NULL;\r
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
42 @param RomImage Option Rom buffer.\r
43 @param RomSize Size of Option Rom buffer.\r
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
52 IN VOID *RomImage,\r
53 IN UINT64 RomSize\r
54 )\r
55{\r
56 PCI_ROM_IMAGE *NewTable;\r
57\r
58 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {\r
59\r
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
66 return ;\r
67 }\r
68\r
69 mRomImageTable = NewTable;\r
70 mMaxNumberOfPciRomImages += 0x20;\r
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
78 mRomImageTable[mNumberOfPciRomImages].RomImage = RomImage;\r
79 mRomImageTable[mNumberOfPciRomImages].RomSize = RomSize;\r
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
114 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;\r
115 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\r
116 }\r
117 }\r
118 }\r
119\r
120 return Found;\r
121}\r