]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
5535bd3013b89796327eccbe72ea1893f4e0f3bf
[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
62 //
63 ASSERT ((mRomImageTable[Index].RomImage == NULL) || (RomImage == mRomImageTable[Index].RomImage));
64 ASSERT ((mRomImageTable[Index].RomSize == 0) || (RomSize == mRomImageTable[Index].RomSize));
65 break;
66 }
67 }
68
69 if (Index == mNumberOfPciRomImages) {
70 //
71 // Rom Image Table buffer needs to grow.
72 //
73 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {
74 NewTable = ReallocatePool (
75 mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),
76 (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),
77 mRomImageTable
78 );
79 if (NewTable == NULL) {
80 return;
81 }
82
83 mRomImageTable = NewTable;
84 mMaxNumberOfPciRomImages += 0x20;
85 }
86
87 //
88 // Record the new PCI device
89 //
90 mRomImageTable[Index].Seg = Seg;
91 mRomImageTable[Index].Bus = Bus;
92 mRomImageTable[Index].Dev = Dev;
93 mRomImageTable[Index].Func = Func;
94 mNumberOfPciRomImages++;
95 }
96
97 mRomImageTable[Index].ImageHandle = ImageHandle;
98 mRomImageTable[Index].RomImage = RomImage;
99 mRomImageTable[Index].RomSize = RomSize;
100 }
101
102 /**
103 Get Option rom driver's mapping for PCI device.
104
105 @param PciIoDevice Device instance.
106
107 @retval TRUE Found Image mapping.
108 @retval FALSE Cannot found image mapping.
109
110 **/
111 BOOLEAN
112 PciRomGetImageMapping (
113 IN PCI_IO_DEVICE *PciIoDevice
114 )
115 {
116 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
117 UINTN Index;
118
119 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;
120
121 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
122 if ((mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber) &&
123 (mRomImageTable[Index].Bus == PciIoDevice->BusNumber) &&
124 (mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber) &&
125 (mRomImageTable[Index].Func == PciIoDevice->FunctionNumber))
126 {
127 if (mRomImageTable[Index].ImageHandle != NULL) {
128 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle, NULL);
129 }
130
131 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;
132 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;
133 return TRUE;
134 }
135 }
136
137 return FALSE;
138 }