]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciRomTable.c
sync filename exactly.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciRomTable.c
CommitLineData
3db51098 1/**@file\r
2 Option Rom Support for PCI Bus Driver\r
ead42efc 3\r
4Copyright (c) 2006, Intel Corporation \r
5All rights reserved. This 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
3db51098 13**/\r
ead42efc 14\r
03417d8d 15#include "PciBus.h"\r
ead42efc 16#include "PciRomTable.h"\r
17\r
18typedef struct {\r
19 EFI_HANDLE ImageHandle;\r
20 UINTN Seg;\r
21 UINT8 Bus;\r
22 UINT8 Dev;\r
23 UINT8 Func;\r
24 UINT64 RomAddress;\r
25 UINT64 RomLength;\r
26} EFI_PCI_ROM_IMAGE_MAPPING;\r
27\r
28static UINTN mNumberOfPciRomImages = 0;\r
29static UINTN mMaxNumberOfPciRomImages = 0;\r
30static EFI_PCI_ROM_IMAGE_MAPPING *mRomImageTable = NULL;\r
31\r
57076f45 32/**\r
33 Add the Rom Image to internal database for later PCI light enumeration\r
34 \r
35 @param ImageHandle Option Rom image handle\r
36 @param Seg Segment of PCI space\r
37 @param Bus Bus NO of PCI space\r
38 @param Dev Dev NO of PCI space\r
39 @param Func Func NO of PCI space\r
40 @param RomAddress Base address of OptionRom\r
41 @param RomLength Length of rom image.\r
42**/\r
ead42efc 43VOID\r
44PciRomAddImageMapping (\r
45 IN EFI_HANDLE ImageHandle,\r
46 IN UINTN Seg,\r
47 IN UINT8 Bus,\r
48 IN UINT8 Dev,\r
49 IN UINT8 Func,\r
50 IN UINT64 RomAddress,\r
51 IN UINT64 RomLength\r
52 )\r
ead42efc 53{\r
54 EFI_PCI_ROM_IMAGE_MAPPING *TempMapping;\r
55\r
56 if (mNumberOfPciRomImages >= mMaxNumberOfPciRomImages) {\r
57\r
58 mMaxNumberOfPciRomImages += 0x20;\r
59\r
60 TempMapping = NULL;\r
61 TempMapping = AllocatePool (mMaxNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));\r
62 if (TempMapping == NULL) {\r
63 return ;\r
64 }\r
65\r
66 CopyMem (TempMapping, mRomImageTable, mNumberOfPciRomImages * sizeof (EFI_PCI_ROM_IMAGE_MAPPING));\r
67\r
68 if (mRomImageTable != NULL) {\r
69 gBS->FreePool (mRomImageTable);\r
70 }\r
71\r
72 mRomImageTable = TempMapping;\r
73 }\r
74\r
75 mRomImageTable[mNumberOfPciRomImages].ImageHandle = ImageHandle;\r
76 mRomImageTable[mNumberOfPciRomImages].Seg = Seg;\r
77 mRomImageTable[mNumberOfPciRomImages].Bus = Bus;\r
78 mRomImageTable[mNumberOfPciRomImages].Dev = Dev;\r
79 mRomImageTable[mNumberOfPciRomImages].Func = Func;\r
80 mRomImageTable[mNumberOfPciRomImages].RomAddress = RomAddress;\r
81 mRomImageTable[mNumberOfPciRomImages].RomLength = RomLength;\r
82 mNumberOfPciRomImages++;\r
83}\r
84\r
57076f45 85/**\r
86 Load all option rom image to PCI driver list.\r
87 \r
88 @param This Pointer to protocol instance EFI_DRIVER_BINDING_PROTOCOL\r
89 @param PciRootBridgeIo Root bridge Io instance\r
90 @param PciIoDevice device instance\r
91**/\r
ead42efc 92EFI_STATUS\r
93PciRomGetRomResourceFromPciOptionRomTable (\r
94 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
95 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo,\r
96 PCI_IO_DEVICE *PciIoDevice\r
97 )\r
ead42efc 98{\r
99 EFI_STATUS Status;\r
100 EFI_PCI_OPTION_ROM_TABLE *PciOptionRomTable;\r
101 EFI_PCI_OPTION_ROM_DESCRIPTOR *PciOptionRomDescriptor;\r
102 UINTN Index;\r
103\r
104 Status = EfiGetSystemConfigurationTable (&gEfiPciOptionRomTableGuid, (VOID **) &PciOptionRomTable);\r
105 if (EFI_ERROR (Status)) {\r
106 return EFI_NOT_FOUND;\r
107 }\r
108\r
109 for (Index = 0; Index < PciOptionRomTable->PciOptionRomCount; Index++) {\r
110 PciOptionRomDescriptor = &PciOptionRomTable->PciOptionRomDescriptors[Index];\r
111 if (PciOptionRomDescriptor->Seg == PciRootBridgeIo->SegmentNumber &&\r
112 PciOptionRomDescriptor->Bus == PciIoDevice->BusNumber &&\r
113 PciOptionRomDescriptor->Dev == PciIoDevice->DeviceNumber &&\r
114 PciOptionRomDescriptor->Func == PciIoDevice->FunctionNumber ) {\r
115\r
116 PciIoDevice->PciIo.RomImage = (VOID *) (UINTN) PciOptionRomDescriptor->RomAddress;\r
117 PciIoDevice->PciIo.RomSize = (UINTN) PciOptionRomDescriptor->RomLength;\r
118 }\r
119 }\r
120\r
121 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
122 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&\r
123 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&\r
124 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&\r
125 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {\r
126\r
127 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);\r
128 }\r
129 }\r
130\r
131 return EFI_SUCCESS;\r
132}\r
133\r
57076f45 134/**\r
135 Get Option rom driver's mapping for PCI device.\r
136 \r
137 @param PciIoDevice Device instance.\r
138\r
139**/\r
ead42efc 140EFI_STATUS\r
141PciRomGetImageMapping (\r
142 PCI_IO_DEVICE *PciIoDevice\r
143 )\r
ead42efc 144{\r
145 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
146 UINTN Index;\r
147\r
148 PciRootBridgeIo = PciIoDevice->PciRootBridgeIo;\r
149\r
150 for (Index = 0; Index < mNumberOfPciRomImages; Index++) {\r
151 if (mRomImageTable[Index].Seg == PciRootBridgeIo->SegmentNumber &&\r
152 mRomImageTable[Index].Bus == PciIoDevice->BusNumber &&\r
153 mRomImageTable[Index].Dev == PciIoDevice->DeviceNumber &&\r
154 mRomImageTable[Index].Func == PciIoDevice->FunctionNumber ) {\r
155\r
156 if (mRomImageTable[Index].ImageHandle != NULL) {\r
157 AddDriver (PciIoDevice, mRomImageTable[Index].ImageHandle);\r
158 } else {\r
159 PciIoDevice->PciIo.RomImage = (VOID *) (UINTN) mRomImageTable[Index].RomAddress;\r
160 PciIoDevice->PciIo.RomSize = (UINTN) mRomImageTable[Index].RomLength;\r
161 }\r
162 }\r
163 }\r
164\r
165 return EFI_SUCCESS;\r
166}\r