]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
0eef41739c7def96d62a3c1652485f26828f4c07
[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 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "PciBus.h"
16
17 //
18 // PCI ROM image information
19 //
20 typedef struct {
21 EFI_HANDLE ImageHandle;
22 UINTN Seg;
23 UINT8 Bus;
24 UINT8 Dev;
25 UINT8 Func;
26 VOID *RomImage;
27 UINT64 RomSize;
28 } PCI_ROM_IMAGE;
29
30 UINTN mNumberOfPciRomImages = 0;
31 UINTN mMaxNumberOfPciRomImages = 0;
32 PCI_ROM_IMAGE *mRomImageTable = NULL;
33
34 /**
35 Add the Rom Image to internal database for later PCI light enumeration.
36
37 @param ImageHandle Option Rom image handle.
38 @param Seg Segment of PCI space.
39 @param Bus Bus NO of PCI space.
40 @param Dev Dev NO of PCI space.
41 @param Func Func NO of PCI space.
42 @param RomImage Option Rom buffer.
43 @param RomSize Size of Option Rom buffer.
44 **/
45 VOID
46 PciRomAddImageMapping (
47 IN EFI_HANDLE ImageHandle,
48 IN UINTN Seg,
49 IN UINT8 Bus,
50 IN UINT8 Dev,
51 IN UINT8 Func,
52 IN VOID *RomImage,
53 IN UINT64 RomSize
54 )
55 {
56 PCI_ROM_IMAGE *NewTable;
57
58 if (mNumberOfPciRomImages == mMaxNumberOfPciRomImages) {
59
60 NewTable = ReallocatePool (
61 mMaxNumberOfPciRomImages * sizeof (PCI_ROM_IMAGE),
62 (mMaxNumberOfPciRomImages + 0x20) * sizeof (PCI_ROM_IMAGE),
63 mRomImageTable
64 );
65 if (NewTable == NULL) {
66 return ;
67 }
68
69 mRomImageTable = NewTable;
70 mMaxNumberOfPciRomImages += 0x20;
71 }
72
73 mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle;
74 mRomImageTable[mNumberOfPciRomImages].Seg = Seg;
75 mRomImageTable[mNumberOfPciRomImages].Bus = Bus;
76 mRomImageTable[mNumberOfPciRomImages].Dev = Dev;
77 mRomImageTable[mNumberOfPciRomImages].Func = Func;
78 mRomImageTable[mNumberOfPciRomImages].RomImage = RomImage;
79 mRomImageTable[mNumberOfPciRomImages].RomSize = RomSize;
80 mNumberOfPciRomImages++;
81 }
82
83 /**
84 Get Option rom driver's mapping for PCI device.
85
86 @param PciIoDevice Device instance.
87
88 @retval TRUE Found Image mapping.
89 @retval FALSE Cannot found image mapping.
90
91 **/
92 BOOLEAN
93 PciRomGetImageMapping (
94 IN PCI_IO_DEVICE *PciIoDevice
95 )
96 {
97 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
98 UINTN Index;
99 BOOLEAN Found;
100
101 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;
102 Found = FALSE;
103
104 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {
105 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&
106 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&
107 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&
108 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {
109 Found = TRUE;
110
111 if (mRomImageTable[Index].ImageHandle != NULL) {
112 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);
113 } else {
114 PciIoDevice->PciIo.RomImage = mRomImageTable[Index].RomImage;
115 PciIoDevice->PciIo.RomSize = mRomImageTable[Index].RomSize;
116 }
117 }
118 }
119
120 return Found;
121 }