]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiDriverModelLib/UefiDriverModelLib.c
Initial import.
[mirror_edk2.git] / MdePkg / Library / UefiDriverModelLib / UefiDriverModelLib.c
CommitLineData
878ddf1f 1/** @file\r
2 EFI Driver Model Library.\r
3\r
4 Copyright (c) 2006, Intel Corporation<BR>\r
5 All rights reserved. This program and the accompanying materials \r
6 are licensed and made available under the terms and conditions of the BSD License \r
7 which accompanies this distribution. The full text of the license may be found at \r
8 http://opensource.org/licenses/bsd-license.php \r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12\r
13 Module Name: EfiDriverModelLib.c\r
14\r
15**/\r
16\r
17\r
18\r
19/**\r
20**/\r
21EFI_STATUS\r
22UefiDriverModelLibConstructor (\r
23 IN EFI_HANDLE ImageHandle,\r
24 IN EFI_SYSTEM_TABLE *SystemTable\r
25 )\r
26{\r
27 EFI_STATUS Status;\r
28 UINTN Index;\r
29 EFI_HANDLE DriverBindingHandle;\r
30 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
31\r
32 //\r
33 // If no Driver Binding Protocols are advertised by the driver then simply return\r
34 //\r
35 if (_gDriverModelProtocolListEntries == 0) {\r
36 return EFI_SUCCESS;\r
37 }\r
38\r
39 //\r
40 // Install the first Driver Bindng Protocol onto ImageHandle\r
41 //\r
42 DriverBindingHandle = ImageHandle;\r
43\r
44 //\r
45 // See if onle one Driver Binding Protocol is advertised by the driver\r
46 //\r
47 if (_gDriverModelProtocolListEntries == 1) {\r
48 //\r
49 // The Driver Binding Protocol must never be NULL\r
50 //\r
51 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);\r
52\r
53 //\r
54 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol\r
55 // These are all checks against const pointers, so the optimizing compiler will only select one of the \r
56 // calls to InstallMultipleProtocolInterfaces()\r
57 //\r
58 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {\r
59 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
60 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
61 Status = gBS->InstallMultipleProtocolInterfaces (\r
62 &DriverBindingHandle,\r
63 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
64 NULL\r
65 );\r
66 } else {\r
67 Status = gBS->InstallMultipleProtocolInterfaces (\r
68 &DriverBindingHandle,\r
69 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
70 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
71 NULL\r
72 );\r
73 }\r
74 } else {\r
75 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
76 Status = gBS->InstallMultipleProtocolInterfaces (\r
77 &DriverBindingHandle,\r
78 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
79 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
80 NULL\r
81 );\r
82 } else {\r
83 Status = gBS->InstallMultipleProtocolInterfaces (\r
84 &DriverBindingHandle,\r
85 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
86 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
87 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
88 NULL\r
89 );\r
90 }\r
91 }\r
92 } else {\r
93 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
94 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
95 Status = gBS->InstallMultipleProtocolInterfaces (\r
96 &DriverBindingHandle,\r
97 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
98 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
99 NULL\r
100 );\r
101 } else {\r
102 Status = gBS->InstallMultipleProtocolInterfaces (\r
103 &DriverBindingHandle,\r
104 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
105 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
106 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
107 NULL\r
108 );\r
109 }\r
110 } else {\r
111 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
112 Status = gBS->InstallMultipleProtocolInterfaces (\r
113 &DriverBindingHandle,\r
114 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
115 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
116 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
117 NULL\r
118 );\r
119 } else {\r
120 Status = gBS->InstallMultipleProtocolInterfaces (\r
121 &DriverBindingHandle,\r
122 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
123 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
124 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
125 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
126 NULL\r
127 );\r
128 }\r
129 }\r
130 }\r
131\r
132 //\r
133 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed\r
134 //\r
135 ASSERT_EFI_ERROR (Status);\r
136\r
137 //\r
138 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
139 //\r
140 DriverBinding = (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding;\r
141 DriverBinding->ImageHandle = ImageHandle;\r
142 DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
143\r
144 } else {\r
145 for (Index = 0; Index < _gDriverModelProtocolListEntries; Index++) {\r
146 //\r
147 // The Driver Binding Protocol must never be NULL\r
148 //\r
149 ASSERT(_gDriverModelProtocolList[Index].DriverBinding != NULL);\r
150\r
151 //\r
152 // Install the Driver Binding Protocol and ASSERT() if the installation fails\r
153 //\r
154 Status = gBS->InstallProtocolInterface (\r
155 &DriverBindingHandle,\r
156 &gEfiDriverBindingProtocolGuid,\r
157 EFI_NATIVE_INTERFACE,\r
158 (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[Index].DriverBinding\r
159 );\r
160 ASSERT_EFI_ERROR (Status);\r
161\r
162 //\r
163 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
164 //\r
165 DriverBinding = (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[Index].DriverBinding;\r
166 DriverBinding->ImageHandle = ImageHandle;\r
167 DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
168\r
169 //\r
170 // If Component Name Protocol is specified then install it and ASSERT() if the installation fails\r
171 //\r
172 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED) != 0) {\r
173 if (_gDriverModelProtocolList[Index].ComponentName != NULL) {\r
174 Status = gBS->InstallProtocolInterface (\r
175 &DriverBindingHandle,\r
176 &gEfiComponentNameProtocolGuid,\r
177 EFI_NATIVE_INTERFACE,\r
178 (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[Index].ComponentName\r
179 );\r
180 ASSERT_EFI_ERROR (Status);\r
181 }\r
182 }\r
183\r
184 //\r
185 // If Driver Configuration Protocol is specified then install it and ASSERT() if the installation fails\r
186 //\r
187 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED) != 0) {\r
188 if (_gDriverModelProtocolList[Index].DriverConfiguration != NULL) {\r
189 Status = gBS->InstallProtocolInterface (\r
190 &DriverBindingHandle,\r
191 &gEfiDriverConfigurationProtocolGuid,\r
192 EFI_NATIVE_INTERFACE,\r
193 (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[Index].DriverConfiguration\r
194 );\r
195 ASSERT_EFI_ERROR (Status);\r
196 }\r
197 }\r
198\r
199 //\r
200 // If Driver Diagnostics Protocol is specified then install it and ASSERT() if the installation fails\r
201 //\r
202 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED) != 0) {\r
203 if (_gDriverModelProtocolList[Index].DriverDiagnostics != NULL) {\r
204 Status = gBS->InstallProtocolInterface (\r
205 &DriverBindingHandle,\r
206 &gEfiDriverDiagnosticsProtocolGuid,\r
207 EFI_NATIVE_INTERFACE,\r
208 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[Index].DriverDiagnostics\r
209 );\r
210 ASSERT_EFI_ERROR (Status);\r
211 }\r
212 }\r
213\r
214 //\r
215 // Install subsequent Driver Bindng Protocols onto new handles\r
216 //\r
217 DriverBindingHandle = NULL;\r
218 }\r
219 }\r
220 return EFI_SUCCESS;\r
221}\r
222\r
223/**\r
224**/\r
225EFI_STATUS\r
226UefiDriverModelLibDestructor (\r
227 IN EFI_HANDLE ImageHandle,\r
228 IN EFI_SYSTEM_TABLE *SystemTable\r
229 )\r
230{\r
231 EFI_STATUS Status;\r
232 UINTN Index;\r
233 EFI_HANDLE DriverBindingHandle;\r
234\r
235 //\r
236 // If no Driver Binding Protocols are advertised by the driver then simply return\r
237 //\r
238 if (_gDriverModelProtocolListEntries == 0) {\r
239 return EFI_SUCCESS;\r
240 }\r
241\r
242 //\r
243 // See if onle one Driver Binding Protocol is advertised by the driver\r
244 //\r
245 if (_gDriverModelProtocolListEntries == 1) {\r
246 //\r
247 // The Driver Binding Protocol must never be NULL\r
248 //\r
249 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);\r
250\r
251 //\r
252 // Retrieve the DriverBindingHandle from the Driver Binding Protocol\r
253 //\r
254 DriverBindingHandle = _gDriverModelProtocolList[0].DriverBinding->DriverBindingHandle;\r
255\r
256 //\r
257 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol\r
258 // These are all checks against const pointers, so the optimizing compiler will only select one of the \r
259 // calls to InstallMultipleProtocolInterfaces()\r
260 //\r
261 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {\r
262 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
263 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
264 Status = gBS->UninstallMultipleProtocolInterfaces (\r
265 DriverBindingHandle,\r
266 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
267 NULL\r
268 );\r
269 } else {\r
270 Status = gBS->UninstallMultipleProtocolInterfaces (\r
271 &DriverBindingHandle,\r
272 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
273 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
274 NULL\r
275 );\r
276 }\r
277 } else {\r
278 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
279 Status = gBS->UninstallMultipleProtocolInterfaces (\r
280 &DriverBindingHandle,\r
281 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
282 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
283 NULL\r
284 );\r
285 } else {\r
286 Status = gBS->UninstallMultipleProtocolInterfaces (\r
287 &DriverBindingHandle,\r
288 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
289 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
290 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
291 NULL\r
292 );\r
293 }\r
294 }\r
295 } else {\r
296 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
297 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
298 Status = gBS->UninstallMultipleProtocolInterfaces (\r
299 &DriverBindingHandle,\r
300 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
301 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
302 NULL\r
303 );\r
304 } else {\r
305 Status = gBS->UninstallMultipleProtocolInterfaces (\r
306 &DriverBindingHandle,\r
307 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
308 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
309 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
310 NULL\r
311 );\r
312 }\r
313 } else {\r
314 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
315 Status = gBS->UninstallMultipleProtocolInterfaces (\r
316 &DriverBindingHandle,\r
317 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
318 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
319 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
320 NULL\r
321 );\r
322 } else {\r
323 Status = gBS->UninstallMultipleProtocolInterfaces (\r
324 &DriverBindingHandle,\r
325 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
326 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
327 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
328 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
329 NULL\r
330 );\r
331 }\r
332 }\r
333 }\r
334\r
335 //\r
336 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
337 //\r
338 ASSERT_EFI_ERROR (Status);\r
339 } else {\r
340 for (Index = 0; Index < _gDriverModelProtocolListEntries; Index++) {\r
341 //\r
342 // The Driver Binding Protocol must never be NULL\r
343 //\r
344 ASSERT(_gDriverModelProtocolList[Index].DriverBinding != NULL);\r
345\r
346 //\r
347 // Retrieve the DriverBindingHandle from the Driver Binding Protocol\r
348 //\r
349 DriverBindingHandle = _gDriverModelProtocolList[0].DriverBinding->DriverBindingHandle;\r
350\r
351 //\r
352 // Uninstall the Driver Binding Protocol and ASSERT() if the installation fails\r
353 //\r
354 Status = gBS->UninstallProtocolInterface (\r
355 DriverBindingHandle,\r
356 &gEfiDriverBindingProtocolGuid,\r
357 (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[Index].DriverBinding\r
358 );\r
359 ASSERT_EFI_ERROR (Status);\r
360\r
361 //\r
362 // If Component Name Protocol is specified then uninstall it and ASSERT() if the uninstallation fails\r
363 //\r
364 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED) != 0) {\r
365 if (_gDriverModelProtocolList[Index].ComponentName != NULL) {\r
366 Status = gBS->UninstallProtocolInterface (\r
367 DriverBindingHandle,\r
368 &gEfiComponentNameProtocolGuid,\r
369 (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[Index].ComponentName\r
370 );\r
371 ASSERT_EFI_ERROR (Status);\r
372 }\r
373 }\r
374\r
375 //\r
376 // If Driver Configuration Protocol is specified then uninstall it and ASSERT() if the uninstallation fails\r
377 //\r
378 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED) != 0) {\r
379 if (_gDriverModelProtocolList[Index].DriverConfiguration != NULL) {\r
380 Status = gBS->UninstallProtocolInterface (\r
381 DriverBindingHandle,\r
382 &gEfiDriverConfigurationProtocolGuid,\r
383 (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[Index].DriverConfiguration\r
384 );\r
385 ASSERT_EFI_ERROR (Status);\r
386 }\r
387 }\r
388\r
389 //\r
390 // If Driver Diagnostics Protocol is specified then uninstall it and ASSERT() if the uninstallation fails\r
391 //\r
392 if ((_gDriverModelProtocolBitmask & UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED) != 0) {\r
393 if (_gDriverModelProtocolList[Index].DriverDiagnostics != NULL) {\r
394 Status = gBS->UninstallProtocolInterface (\r
395 DriverBindingHandle,\r
396 &gEfiDriverDiagnosticsProtocolGuid,\r
397 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[Index].DriverDiagnostics\r
398 );\r
399 ASSERT_EFI_ERROR (Status);\r
400 }\r
401 }\r
402 }\r
403 }\r
404 return EFI_SUCCESS;\r
405}\r