]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - DuetPkg/PciBusNoEnumerationDxe/PciDriverOverride.c
BaseTools/BinToPcd: Fix Python 2.7.x compatibility issue
[mirror_edk2.git] / DuetPkg / PciBusNoEnumerationDxe / PciDriverOverride.c
... / ...
CommitLineData
1/*++\r
2\r
3Copyright (c) 2005 - 2007, Intel Corporation. All rights reserved.<BR>\r
4This 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
24#include "PciBus.h"\r
25\r
26EFI_STATUS\r
27EFIAPI\r
28GetDriver(\r
29 IN 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_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
139 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
140 PCI_DRIVER_OVERRIDE_LIST *Node;\r
141\r
142 Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
143 if (EFI_ERROR (Status)) {\r
144 return Status;\r
145 }\r
146\r
147 Node = AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST));\r
148 if (Node == NULL) {\r
149 return EFI_OUT_OF_RESOURCES;\r
150 }\r
151\r
152 Node->Signature = DRIVER_OVERRIDE_SIGNATURE;\r
153 Node->DriverImageHandle = DriverImageHandle;\r
154\r
155 InsertTailList (&PciIoDevice->OptionRomDriverList, &(Node->Link));\r
156\r
157 PciIoDevice->BusOverride = TRUE;\r
158\r
159\r
160 ImageContext.Handle = LoadedImage->ImageBase;\r
161 ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
162\r
163 //\r
164 // Get information about the image \r
165 //\r
166 Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
167 if (EFI_ERROR (Status)) {\r
168 return EFI_SUCCESS;\r
169 }\r
170\r
171 if (ImageContext.Machine != EFI_IMAGE_MACHINE_EBC) {\r
172 return EFI_SUCCESS;\r
173 }\r
174\r
175 return EFI_SUCCESS;\r
176}\r