]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
5SPDX-License-Identifier: BSD-2-Clause-Patent\r
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
20 VOID *RomImage;\r
21 UINT64 RomSize;\r
22} PCI_ROM_IMAGE;\r
23\r
24UINTN mNumberOfPciRomImages = 0;\r
25UINTN mMaxNumberOfPciRomImages = 0;\r
26PCI_ROM_IMAGE *mRomImageTable = NULL;\r
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
36 @param RomImage Option Rom buffer.\r
37 @param RomSize Size of Option Rom buffer.\r
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
46 IN VOID *RomImage,\r
47 IN UINT64 RomSize\r
48 )\r
49{\r
50 UINTN Index;\r
51 PCI_ROM_IMAGE *NewTable;\r
52\r
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 //\r
60 // Expect once RomImage and RomSize are recorded, they will be passed in\r
61 // later when updating ImageHandle. They may also be updated with new\r
62 // values if the platform provides an override of RomImage and RomSize.\r
63 //\r
64 break;\r
65 }\r
66 }\r
67\r
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 //\r
87 // Record the new PCI device\r
88 //\r
89 mRomImageTable[Index].Seg = Seg;\r
90 mRomImageTable[Index].Bus = Bus;\r
91 mRomImageTable[Index].Dev = Dev;\r
92 mRomImageTable[Index].Func = Func;\r
93 mNumberOfPciRomImages++;\r
94 }\r
95\r
96 mRomImageTable[Index].ImageHandle = ImageHandle;\r
97 mRomImageTable[Index].RomImage = RomImage;\r
98 mRomImageTable[Index].RomSize = RomSize;\r
99}\r
100\r
101/**\r
102 Get Option rom driver's mapping for PCI device.\r
103\r
104 @param PciIoDevice Device instance.\r
105\r
106 @retval TRUE Found Image mapping.\r
107 @retval FALSE Cannot found image mapping.\r
108\r
109**/\r
110BOOLEAN\r
111PciRomGetImageMapping (\r
112 IN PCI_IO_DEVICE *PciIoDevice\r
113 )\r
114{\r
115 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
116 UINTN Index;\r
117\r
118 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;\r
119\r
120 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
121 if ((mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber) &&\r
122 (mRomImageTable[Index].Bus == PciIoDevice->BusNumber) &&\r
123 (mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber) &&\r
124 (mRomImageTable[Index].Func == PciIoDevice->FunctionNumber))\r
125 {\r
126 if (mRomImageTable[Index].ImageHandle != NULL) {\r
127 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);\r
128 }\r
129\r
130 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;\r
131 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;\r
132 return TRUE;\r
133 }\r
134 }\r
135\r
136 return FALSE;\r
137}\r