]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciRomTable.c
1 /** @file
2 Set up ROM Table for PCI Bus module.
3
4 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include "PciBus.h"
10
11 //
12 // PCI ROM image information
13 //
14 typedef struct {
15 EFI_HANDLE ImageHandle;
16 UINTN Seg;
17 UINT8 Bus;
18 UINT8 Dev;
19 UINT8 Func;
20 VOID *RomImage;
21 UINT64 RomSize;
22 } PCI_ROM_IMAGE;
23
24 UINTN mNumberOfPciRomImages = 0;
25 UINTN mMaxNumberOfPciRomImages = 0;
26 PCI_ROM_IMAGE *mRomImageTable = NULL;
27
28 /**
29 Add the Rom Image to internal database for later PCI light enumeration.
30
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.
38 **/
39 VOID
40 PciRomAddImageMapping (
41 IN EFI_HANDLE ImageHandle,
42 IN UINTN Seg,
43 IN UINT8 Bus,
44 IN UINT8 Dev,
45 IN UINT8 Func,
46 IN VOID *RomImage,
47 IN UINT64 RomSize
48 )
49 {
50 UINTN Index;
51 PCI_ROM_IMAGE *NewTable;
52
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))
58 {
59 //
60 // Expect once RomImage and RomSize are recorded, they will be passed in
61 // later when updating ImageHandle. They may also be updated with new
62 // values if the platform provides an override of RomImage and RomSize.
63 //
64 break;
65 }
66 }
67
68 if (Index == mNumberOfPciRomImages) {
69 //
70 // Rom Image Table buffer needs to grow.
71 //
72 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {
73 NewTable = ReallocatePool (
74 mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),
75 (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),
76 mRomImageTable
77 );
78 if (NewTable == NULL) {
79 return;
80 }
81
82 mRomImageTable = NewTable;
83 mMaxNumberOfPciRomImages += 0x20;
84 }
85
86 //
87 // Record the new PCI device
88 //
89 mRomImageTable[Index].Seg = Seg;
90 mRomImageTable[Index].Bus = Bus;
91 mRomImageTable[Index].Dev = Dev;
92 mRomImageTable[Index].Func = Func;
93 mNumberOfPciRomImages++;
94 }
95
96 mRomImageTable[Index].ImageHandle = ImageHandle;
97 mRomImageTable[Index].RomImage = RomImage;
98 mRomImageTable[Index].RomSize = RomSize;
99 }
100
101 /**
102 Get Option rom driver's mapping for PCI device.
103
104 @param PciIoDevice Device instance.
105
106 @retval TRUE Found Image mapping.
107 @retval FALSE Cannot found image mapping.
108
109 **/
110 BOOLEAN
111 PciRomGetImageMapping (
112 IN PCI_IO_DEVICE *PciIoDevice
113 )
114 {
115 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
116 UINTN Index;
117
118 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;
119
120 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
121 if ((mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber) &&
122 (mRomImageTable[Index].Bus == PciIoDevice->BusNumber) &&
123 (mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber) &&
124 (mRomImageTable[Index].Func == PciIoDevice->FunctionNumber))
125 {
126 if (mRomImageTable[Index].ImageHandle != NULL) {
127 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);
128 }
129
130 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;
131 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;
132 return TRUE;
133 }
134 }
135
136 return FALSE;
137 }