]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/PciBusNoEnumerationDxe/PciDriverOverride.c
Fix build issue in linux environment.
[mirror_edk2.git] / DuetPkg / PciBusNoEnumerationDxe / PciDriverOverride.c
CommitLineData
10590588 1/*++\r
2\r
3Copyright (c) 2005 - 2007, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 PciDriverOverride.c\r
15 \r
16Abstract:\r
17\r
18 PCI Bus Driver\r
19\r
20Revision History\r
21\r
22--*/\r
23\r
d8bee43c 24#include "PciBus.h"\r
10590588 25\r
26EFI_STATUS\r
27EFIAPI\r
28GetDriver(\r
29 IN struct _EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
30 IN OUT EFI_HANDLE *DriverImageHandle\r
31 );\r
32\r
33\r
34\r
35EFI_STATUS\r
36InitializePciDriverOverrideInstance (\r
37 PCI_IO_DEVICE *PciIoDevice\r
38 )\r
39/*++\r
40\r
41Routine Description:\r
42\r
43 Initializes a PCI Driver Override Instance\r
44\r
45Arguments:\r
46 \r
47Returns:\r
48\r
49 None\r
50\r
51--*/\r
52\r
53{\r
54 PciIoDevice->PciDriverOverride.GetDriver = GetDriver;\r
55 return EFI_SUCCESS;\r
56}\r
57\r
58EFI_STATUS\r
59EFIAPI\r
60GetDriver (\r
61 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
62 IN OUT EFI_HANDLE *DriverImageHandle\r
63 )\r
64/*++\r
65\r
66Routine Description:\r
67\r
68 Get a overriding driver image\r
69\r
70Arguments:\r
71 \r
72Returns:\r
73\r
74 None\r
75\r
76--*/\r
77{\r
78 PCI_IO_DEVICE *PciIoDevice;\r
79 LIST_ENTRY *CurrentLink;\r
80 PCI_DRIVER_OVERRIDE_LIST *Node;\r
81\r
82 PciIoDevice = PCI_IO_DEVICE_FROM_PCI_DRIVER_OVERRIDE_THIS (This);\r
83\r
84 CurrentLink = PciIoDevice->OptionRomDriverList.ForwardLink;\r
85\r
86 while (CurrentLink && CurrentLink != &PciIoDevice->OptionRomDriverList) {\r
87\r
88 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink);\r
89\r
90 if (*DriverImageHandle == NULL) {\r
91\r
92 *DriverImageHandle = Node->DriverImageHandle;\r
93 return EFI_SUCCESS;\r
94 }\r
95\r
96 if (*DriverImageHandle == Node->DriverImageHandle) {\r
97\r
98 if (CurrentLink->ForwardLink == &PciIoDevice->OptionRomDriverList ||\r
99 CurrentLink->ForwardLink == NULL) {\r
100 return EFI_NOT_FOUND;\r
101 }\r
102\r
103 //\r
104 // Get next node\r
105 //\r
106 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink->ForwardLink);\r
107 *DriverImageHandle = Node->DriverImageHandle;\r
108 return EFI_SUCCESS;\r
109 }\r
110\r
111 CurrentLink = CurrentLink->ForwardLink;\r
112 }\r
113\r
114 return EFI_INVALID_PARAMETER;\r
115}\r
116\r
117EFI_STATUS\r
118AddDriver (\r
119 IN PCI_IO_DEVICE *PciIoDevice,\r
120 IN EFI_HANDLE DriverImageHandle\r
121 )\r
122/*++\r
123\r
124Routine Description:\r
125\r
126 Add a overriding driver image\r
127\r
128Arguments:\r
129 \r
130Returns:\r
131\r
132 None\r
133\r
134--*/\r
135\r
136{\r
137 EFI_STATUS Status;\r
138 EFI_IMAGE_DOS_HEADER *DosHdr;\r
139 EFI_IMAGE_NT_HEADERS *PeHdr;\r
140 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
141 PCI_DRIVER_OVERRIDE_LIST *Node;\r
142#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
143 EFI_DRIVER_OS_HANDOFF_HEADER *DriverOsHandoffHeader;\r
144 EFI_DRIVER_OS_HANDOFF_HEADER *NewDriverOsHandoffHeader;\r
145 EFI_DRIVER_OS_HANDOFF *DriverOsHandoff;\r
146 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
147 EFI_HANDLE DeviceHandle;\r
148 UINTN NumberOfEntries;\r
149 UINTN Size;\r
150 UINTN Index;\r
151#endif\r
152\r
153 Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
154 if (EFI_ERROR (Status)) {\r
155 return Status;\r
156 }\r
157\r
158 Node = AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST));\r
159 if (Node == NULL) {\r
160 return EFI_OUT_OF_RESOURCES;\r
161 }\r
162\r
163 Node->Signature = DRIVER_OVERRIDE_SIGNATURE;\r
164 Node->DriverImageHandle = DriverImageHandle;\r
165\r
166 InsertTailList (&PciIoDevice->OptionRomDriverList, &(Node->Link));\r
167\r
168 PciIoDevice->BusOverride = TRUE;\r
169\r
170 DosHdr = (EFI_IMAGE_DOS_HEADER *) LoadedImage->ImageBase;\r
171 if (DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
172 return EFI_SUCCESS;\r
173 }\r
174\r
175 PeHdr = (EFI_IMAGE_NT_HEADERS *) ((UINTN) LoadedImage->ImageBase + DosHdr->e_lfanew);\r
176\r
177 if (PeHdr->FileHeader.Machine != EFI_IMAGE_MACHINE_EBC) {\r
178 return EFI_SUCCESS;\r
179 }\r
180\r
181#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
182 DriverOsHandoffHeader = NULL;\r
183 Status = EfiLibGetSystemConfigurationTable (&gEfiUgaIoProtocolGuid, (VOID **) &DriverOsHandoffHeader);\r
184 if (!EFI_ERROR (Status) && DriverOsHandoffHeader != NULL) {\r
185 for (Index = 0; Index < DriverOsHandoffHeader->NumberOfEntries; Index++) {\r
186 DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)(DriverOsHandoffHeader) + \r
187 DriverOsHandoffHeader->HeaderSize + \r
188 Index * DriverOsHandoffHeader->SizeOfEntries);\r
189 DevicePath = DriverOsHandoff->DevicePath;\r
190 Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);\r
191 if (!EFI_ERROR (Status) && DeviceHandle != NULL && IsDevicePathEnd (DevicePath)) {\r
192 if (DeviceHandle == PciIoDevice->Handle) {\r
193 return EFI_SUCCESS;\r
194 }\r
195 }\r
196 }\r
197\r
198 NumberOfEntries = DriverOsHandoffHeader->NumberOfEntries + 1;\r
199 } else {\r
200 NumberOfEntries = 1;\r
201 }\r
202\r
203 Status = gBS->AllocatePool (\r
204 EfiRuntimeServicesData,\r
205 sizeof (EFI_DRIVER_OS_HANDOFF_HEADER) + NumberOfEntries * sizeof (EFI_DRIVER_OS_HANDOFF),\r
206 (VOID **) &NewDriverOsHandoffHeader\r
207 );\r
208 if (EFI_ERROR (Status)) {\r
209 return Status;\r
210 }\r
211\r
212 if (DriverOsHandoffHeader == NULL) {\r
213 NewDriverOsHandoffHeader->Version = 0;\r
214 NewDriverOsHandoffHeader->HeaderSize = sizeof (EFI_DRIVER_OS_HANDOFF_HEADER);\r
215 NewDriverOsHandoffHeader->SizeOfEntries = sizeof (EFI_DRIVER_OS_HANDOFF);\r
216 NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
217 } else {\r
218 gBS->CopyMem (\r
219 NewDriverOsHandoffHeader,\r
220 DriverOsHandoffHeader,\r
221 DriverOsHandoffHeader->HeaderSize + (NumberOfEntries - 1) * DriverOsHandoffHeader->SizeOfEntries\r
222 );\r
223 NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
224 }\r
225\r
226 DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)NewDriverOsHandoffHeader + \r
227 NewDriverOsHandoffHeader->HeaderSize + \r
228 (NumberOfEntries - 1) * NewDriverOsHandoffHeader->SizeOfEntries);\r
229\r
230 //\r
231 // Fill in the EFI_DRIVER_OS_HANDOFF structure\r
232 //\r
233 DriverOsHandoff->Type = EfiUgaDriverFromPciRom;\r
234\r
235 //\r
236 // Compute the size of the device path\r
237 //\r
238 Size = EfiDevicePathSize (PciIoDevice->DevicePath);\r
239 if (Size == 0) {\r
240 DriverOsHandoff->DevicePath = NULL;\r
241 } else {\r
242\r
243 //\r
244 // Allocate space for duplicate device path\r
245 //\r
246 Status = gBS->AllocatePool (\r
247 EfiRuntimeServicesData,\r
248 Size,\r
249 (VOID **) &DriverOsHandoff->DevicePath\r
250 );\r
251 if (EFI_ERROR (Status)) {\r
252 gBS->FreePool (NewDriverOsHandoffHeader);\r
253 return Status;\r
254 }\r
255\r
256 //\r
257 // Make copy of device path\r
258 //\r
259 CopyMem (DriverOsHandoff->DevicePath, PciIoDevice->DevicePath, Size);\r
260 }\r
261\r
262 DriverOsHandoff->PciRomSize = (UINT64) PciIoDevice->PciIo.RomSize;\r
263 Status = gBS->AllocatePool (\r
264 EfiRuntimeServicesData,\r
265 (UINTN) DriverOsHandoff->PciRomSize,\r
266 (VOID **) &DriverOsHandoff->PciRomImage\r
267 );\r
268 if (EFI_ERROR (Status)) {\r
269 gBS->FreePool (NewDriverOsHandoffHeader);\r
270 return Status;\r
271 }\r
272\r
273 gBS->CopyMem (\r
274 DriverOsHandoff->PciRomImage,\r
275 PciIoDevice->PciIo.RomImage,\r
276 (UINTN) DriverOsHandoff->PciRomSize\r
277 );\r
278\r
279 Status = gBS->InstallConfigurationTable (&gEfiUgaIoProtocolGuid, NewDriverOsHandoffHeader);\r
280 if (EFI_ERROR (Status)) {\r
281 return Status;\r
282 }\r
283\r
284 if (DriverOsHandoffHeader != NULL) {\r
285 gBS->FreePool (DriverOsHandoffHeader);\r
286 }\r
287#endif\r
288\r
289 return EFI_SUCCESS;\r
290}\r