]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/PciBusNoEnumerationDxe/PciBus.c
Patch to remove STATIC modifier. This is on longer recommended by EFI Framework codin...
[mirror_edk2.git] / DuetPkg / PciBusNoEnumerationDxe / PciBus.c
CommitLineData
10590588 1/*++\r
2\r
3Copyright (c) 2005 - 2006, 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 PciBus.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
26//\r
27// PCI Bus Support Function Prototypes\r
28//\r
29\r
30EFI_STATUS\r
31EFIAPI\r
32PciBusEntryPoint (\r
33 IN EFI_HANDLE ImageHandle,\r
34 IN EFI_SYSTEM_TABLE *SystemTable\r
35 );\r
36\r
37EFI_STATUS\r
38EFIAPI\r
39PciBusDriverBindingSupported (\r
40 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
41 IN EFI_HANDLE Controller,\r
42 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
43 );\r
44\r
45EFI_STATUS\r
46EFIAPI\r
47PciBusDriverBindingStart (\r
48 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
49 IN EFI_HANDLE Controller,\r
50 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
51 );\r
52\r
53EFI_STATUS\r
54EFIAPI\r
55PciBusDriverBindingStop (\r
56 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
57 IN EFI_HANDLE Controller,\r
58 IN UINTN NumberOfChildren,\r
59 IN EFI_HANDLE *ChildHandleBuffer\r
60 );\r
61\r
62\r
63//\r
64// PCI Bus Driver Global Variables\r
65//\r
66\r
67EFI_DRIVER_BINDING_PROTOCOL gPciBusDriverBinding = {\r
68 PciBusDriverBindingSupported,\r
69 PciBusDriverBindingStart,\r
70 PciBusDriverBindingStop,\r
71 0xa,\r
72 NULL,\r
73 NULL\r
74};\r
75\r
76BOOLEAN gFullEnumeration;\r
77 \r
78//\r
79// PCI Bus Driver Support Functions\r
80//\r
81EFI_STATUS\r
82EFIAPI\r
83PciBusEntryPoint (\r
84 IN EFI_HANDLE ImageHandle,\r
85 IN EFI_SYSTEM_TABLE *SystemTable\r
86 )\r
87/*++\r
88\r
89Routine Description:\r
90\r
91 Initialize the global variables\r
92 publish the driver binding protocol\r
93\r
94Arguments:\r
95\r
96 IN EFI_HANDLE ImageHandle,\r
97 IN EFI_SYSTEM_TABLE *SystemTable\r
98\r
99Returns:\r
100\r
101 EFI_SUCCESS \r
102 EFI_DEVICE_ERROR \r
103\r
104--*/\r
105{\r
106 EFI_STATUS Status;\r
107\r
108 //\r
109 // Initialize the EFI Driver Library\r
110 //\r
111 Status = EfiLibInstallDriverBindingComponentName2 (\r
112 ImageHandle,\r
113 SystemTable,\r
114 &gPciBusDriverBinding,\r
115 ImageHandle,\r
116 &gPciBusComponentName,\r
117 &gPciBusComponentName2\r
118 );\r
119 ASSERT_EFI_ERROR (Status);\r
120 \r
121 InitializePciDevicePool ();\r
122\r
123 gFullEnumeration = TRUE;\r
124 \r
125 return Status;\r
126}\r
127\r
128EFI_STATUS\r
129EFIAPI\r
130PciBusDriverBindingSupported (\r
131 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
132 IN EFI_HANDLE Controller,\r
133 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
134 )\r
135/*++\r
136\r
137Routine Description:\r
138\r
139 Check to see if pci bus driver supports the given controller\r
140\r
141Arguments:\r
142 \r
143 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
144 IN EFI_HANDLE Controller,\r
145 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
146\r
147Returns:\r
148\r
149 EFI_SUCCESS\r
150\r
151--*/\r
152{\r
153 EFI_STATUS Status;\r
154 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
155 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
156 EFI_DEV_PATH_PTR Node;\r
157\r
158 if (RemainingDevicePath != NULL) {\r
159 Node.DevPath = RemainingDevicePath;\r
160 if (Node.DevPath->Type != HARDWARE_DEVICE_PATH ||\r
161 Node.DevPath->SubType != HW_PCI_DP ||\r
162 DevicePathNodeLength(Node.DevPath) != sizeof(PCI_DEVICE_PATH)) {\r
163 return EFI_UNSUPPORTED;\r
164 }\r
165 }\r
166 //\r
167 // Open the IO Abstraction(s) needed to perform the supported test\r
168 //\r
169 Status = gBS->OpenProtocol (\r
170 Controller,\r
171 &gEfiDevicePathProtocolGuid,\r
172 (VOID **) &ParentDevicePath,\r
173 This->DriverBindingHandle,\r
174 Controller,\r
175 EFI_OPEN_PROTOCOL_BY_DRIVER\r
176 );\r
177 if (Status == EFI_ALREADY_STARTED) {\r
178 return EFI_SUCCESS;\r
179 }\r
180\r
181 if (EFI_ERROR (Status)) {\r
182 return Status;\r
183 }\r
184\r
185 gBS->CloseProtocol (\r
186 Controller,\r
187 &gEfiDevicePathProtocolGuid,\r
188 This->DriverBindingHandle,\r
189 Controller\r
190 );\r
191\r
192 Status = gBS->OpenProtocol (\r
193 Controller,\r
194 &gEfiPciRootBridgeIoProtocolGuid,\r
195 (VOID **) &PciRootBridgeIo,\r
196 This->DriverBindingHandle,\r
197 Controller,\r
198 EFI_OPEN_PROTOCOL_BY_DRIVER\r
199 );\r
200 if (Status == EFI_ALREADY_STARTED) {\r
201 return EFI_SUCCESS;\r
202 }\r
203\r
204 if (EFI_ERROR (Status)) {\r
205 return Status;\r
206 }\r
207\r
208 gBS->CloseProtocol (\r
209 Controller,\r
210 &gEfiPciRootBridgeIoProtocolGuid,\r
211 This->DriverBindingHandle,\r
212 Controller\r
213 );\r
214\r
215 return EFI_SUCCESS;\r
216}\r
217\r
218EFI_STATUS\r
219EFIAPI\r
220PciBusDriverBindingStart (\r
221 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
222 IN EFI_HANDLE Controller,\r
223 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
224 )\r
225/*++\r
226\r
227Routine Description:\r
228\r
229 Start to management the controller passed in\r
230\r
231Arguments:\r
232 \r
233 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
234 IN EFI_HANDLE Controller,\r
235 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
236\r
237Returns:\r
238 \r
239\r
240--*/\r
241{\r
242 EFI_STATUS Status;\r
243\r
244 //\r
245 // Enumerate the entire host bridge\r
246 // After enumeration, a database that records all the device information will be created\r
247 //\r
248 //\r
249 Status = PciEnumerator (Controller);\r
250\r
251 if (EFI_ERROR (Status)) {\r
252 return Status;\r
253 }\r
254 \r
255 //\r
256 // Enable PCI device specified by remaining device path. BDS or other driver can call the\r
257 // start more than once.\r
258 //\r
259 \r
260 StartPciDevices (Controller, RemainingDevicePath);\r
261\r
262 return EFI_SUCCESS;\r
263}\r
264\r
265EFI_STATUS\r
266EFIAPI\r
267PciBusDriverBindingStop (\r
268 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
269 IN EFI_HANDLE Controller,\r
270 IN UINTN NumberOfChildren,\r
271 IN EFI_HANDLE *ChildHandleBuffer\r
272 )\r
273/*++\r
274\r
275Routine Description:\r
276\r
277 Stop one or more children created at start of pci bus driver\r
278 if all the the children get closed, close the protocol\r
279\r
280Arguments:\r
281 \r
282 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
283 IN EFI_HANDLE Controller,\r
284 IN UINTN NumberOfChildren,\r
285 IN EFI_HANDLE *ChildHandleBuffer\r
286\r
287Returns:\r
288\r
289 \r
290--*/\r
291{\r
292 EFI_STATUS Status;\r
293 UINTN Index;\r
294 BOOLEAN AllChildrenStopped;\r
295\r
296 if (NumberOfChildren == 0) {\r
297 //\r
298 // Close the bus driver\r
299 //\r
300 gBS->CloseProtocol (\r
301 Controller,\r
302 &gEfiDevicePathProtocolGuid,\r
303 This->DriverBindingHandle,\r
304 Controller\r
305 );\r
306 gBS->CloseProtocol (\r
307 Controller,\r
308 &gEfiPciRootBridgeIoProtocolGuid,\r
309 This->DriverBindingHandle,\r
310 Controller\r
311 );\r
312\r
313 DestroyRootBridgeByHandle (\r
314 Controller\r
315 );\r
316\r
317 return EFI_SUCCESS;\r
318 }\r
319\r
320 //\r
321 // Stop all the children\r
322 //\r
323\r
324 AllChildrenStopped = TRUE;\r
325\r
326 for (Index = 0; Index < NumberOfChildren; Index++) {\r
327\r
328 //\r
329 // De register all the pci device\r
330 //\r
331 Status = DeRegisterPciDevice (Controller, ChildHandleBuffer[Index]);\r
332\r
333 if (EFI_ERROR (Status)) {\r
334 AllChildrenStopped = FALSE;\r
335 }\r
336 }\r
337\r
338 if (!AllChildrenStopped) {\r
339 return EFI_DEVICE_ERROR;\r
340 }\r
341\r
342 return EFI_SUCCESS;\r
343}\r