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