2 EFI Driver Model Library.
4 Copyright (c) 2006, Intel Corporation<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 Module Name: UefiDriverModelLib.c
20 The constructor function installs the standard EFI Driver Model Protocols.
22 @param[in] ImageHandle The firmware allocated handle for the EFI image.
23 @param[in] SystemTable A pointer to the EFI System Table.
25 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
30 UefiDriverModelLibConstructor (
31 IN EFI_HANDLE ImageHandle
,
32 IN EFI_SYSTEM_TABLE
*SystemTable
37 EFI_HANDLE DriverBindingHandle
;
38 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
41 // If no Driver Binding Protocols are advertised by the driver then simply return
43 if (_gDriverModelProtocolListEntries
== 0) {
48 // Install the first Driver Bindng Protocol onto ImageHandle
50 DriverBindingHandle
= ImageHandle
;
53 // See if onle one Driver Binding Protocol is advertised by the driver
55 if (_gDriverModelProtocolListEntries
== 1) {
57 // The Driver Binding Protocol must never be NULL
59 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
62 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
63 // These are all checks against const pointers, so the optimizing compiler will only select one of the
64 // calls to InstallMultipleProtocolInterfaces()
66 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
67 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
68 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
69 Status
= gBS
->InstallMultipleProtocolInterfaces (
71 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
75 Status
= gBS
->InstallMultipleProtocolInterfaces (
77 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
78 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
83 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
84 Status
= gBS
->InstallMultipleProtocolInterfaces (
86 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
87 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
91 Status
= gBS
->InstallMultipleProtocolInterfaces (
93 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
94 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
95 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
101 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
102 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
103 Status
= gBS
->InstallMultipleProtocolInterfaces (
104 &DriverBindingHandle
,
105 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
106 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
110 Status
= gBS
->InstallMultipleProtocolInterfaces (
111 &DriverBindingHandle
,
112 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
113 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
114 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
119 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
120 Status
= gBS
->InstallMultipleProtocolInterfaces (
121 &DriverBindingHandle
,
122 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
123 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
124 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
128 Status
= gBS
->InstallMultipleProtocolInterfaces (
129 &DriverBindingHandle
,
130 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
131 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
132 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
133 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
141 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
143 ASSERT_EFI_ERROR (Status
);
146 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
148 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
;
149 DriverBinding
->ImageHandle
= ImageHandle
;
150 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
153 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
155 // The Driver Binding Protocol must never be NULL
157 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
160 // Install the Driver Binding Protocol and ASSERT() if the installation fails
162 Status
= gBS
->InstallProtocolInterface (
163 &DriverBindingHandle
,
164 &gEfiDriverBindingProtocolGuid
,
165 EFI_NATIVE_INTERFACE
,
166 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
168 ASSERT_EFI_ERROR (Status
);
171 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
173 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
;
174 DriverBinding
->ImageHandle
= ImageHandle
;
175 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
178 // If Component Name Protocol is specified then install it and ASSERT() if the installation fails
180 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
181 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
182 Status
= gBS
->InstallProtocolInterface (
183 &DriverBindingHandle
,
184 &gEfiComponentNameProtocolGuid
,
185 EFI_NATIVE_INTERFACE
,
186 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
188 ASSERT_EFI_ERROR (Status
);
193 // If Driver Configuration Protocol is specified then install it and ASSERT() if the installation fails
195 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
196 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
197 Status
= gBS
->InstallProtocolInterface (
198 &DriverBindingHandle
,
199 &gEfiDriverConfigurationProtocolGuid
,
200 EFI_NATIVE_INTERFACE
,
201 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
203 ASSERT_EFI_ERROR (Status
);
208 // If Driver Diagnostics Protocol is specified then install it and ASSERT() if the installation fails
210 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
211 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
212 Status
= gBS
->InstallProtocolInterface (
213 &DriverBindingHandle
,
214 &gEfiDriverDiagnosticsProtocolGuid
,
215 EFI_NATIVE_INTERFACE
,
216 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
218 ASSERT_EFI_ERROR (Status
);
223 // Install subsequent Driver Bindng Protocols onto new handles
225 DriverBindingHandle
= NULL
;
232 The destructor function uninstalls the standard EFI Driver Model Protocols.
234 @param[in] ImageHandle The firmware allocated handle for the EFI image.
235 @param[in] SystemTable A pointer to the EFI System Table.
237 @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.
242 UefiDriverModelLibDestructor (
243 IN EFI_HANDLE ImageHandle
,
244 IN EFI_SYSTEM_TABLE
*SystemTable
249 EFI_HANDLE DriverBindingHandle
;
252 // If no Driver Binding Protocols are advertised by the driver then simply return
254 if (_gDriverModelProtocolListEntries
== 0) {
259 // See if onle one Driver Binding Protocol is advertised by the driver
261 if (_gDriverModelProtocolListEntries
== 1) {
263 // The Driver Binding Protocol must never be NULL
265 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
268 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
270 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
273 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
274 // These are all checks against const pointers, so the optimizing compiler will only select one of the
275 // calls to InstallMultipleProtocolInterfaces()
277 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
278 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
279 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
280 Status
= gBS
->UninstallMultipleProtocolInterfaces (
282 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
286 Status
= gBS
->UninstallMultipleProtocolInterfaces (
287 &DriverBindingHandle
,
288 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
289 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
294 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
295 Status
= gBS
->UninstallMultipleProtocolInterfaces (
296 &DriverBindingHandle
,
297 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
298 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
302 Status
= gBS
->UninstallMultipleProtocolInterfaces (
303 &DriverBindingHandle
,
304 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
305 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
306 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
312 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
313 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
314 Status
= gBS
->UninstallMultipleProtocolInterfaces (
315 &DriverBindingHandle
,
316 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
317 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
321 Status
= gBS
->UninstallMultipleProtocolInterfaces (
322 &DriverBindingHandle
,
323 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
324 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
325 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
330 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
331 Status
= gBS
->UninstallMultipleProtocolInterfaces (
332 &DriverBindingHandle
,
333 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
334 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
335 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
339 Status
= gBS
->UninstallMultipleProtocolInterfaces (
340 &DriverBindingHandle
,
341 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
342 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
343 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
344 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
352 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
354 ASSERT_EFI_ERROR (Status
);
356 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
358 // The Driver Binding Protocol must never be NULL
360 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
363 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
365 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
368 // Uninstall the Driver Binding Protocol and ASSERT() if the installation fails
370 Status
= gBS
->UninstallProtocolInterface (
372 &gEfiDriverBindingProtocolGuid
,
373 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
375 ASSERT_EFI_ERROR (Status
);
378 // If Component Name Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
380 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
381 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
382 Status
= gBS
->UninstallProtocolInterface (
384 &gEfiComponentNameProtocolGuid
,
385 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
387 ASSERT_EFI_ERROR (Status
);
392 // If Driver Configuration Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
394 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
395 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
396 Status
= gBS
->UninstallProtocolInterface (
398 &gEfiDriverConfigurationProtocolGuid
,
399 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
401 ASSERT_EFI_ERROR (Status
);
406 // If Driver Diagnostics Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
408 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
409 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
410 Status
= gBS
->UninstallProtocolInterface (
412 &gEfiDriverDiagnosticsProtocolGuid
,
413 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
415 ASSERT_EFI_ERROR (Status
);