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.
29 UefiDriverModelLibConstructor (
30 IN EFI_HANDLE ImageHandle
,
31 IN EFI_SYSTEM_TABLE
*SystemTable
36 EFI_HANDLE DriverBindingHandle
;
37 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
40 // If no Driver Binding Protocols are advertised by the driver then simply return
42 if (_gDriverModelProtocolListEntries
== 0) {
47 // Install the first Driver Bindng Protocol onto ImageHandle
49 DriverBindingHandle
= ImageHandle
;
52 // See if onle one Driver Binding Protocol is advertised by the driver
54 if (_gDriverModelProtocolListEntries
== 1) {
56 // The Driver Binding Protocol must never be NULL
58 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
61 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
62 // These are all checks against const pointers, so the optimizing compiler will only select one of the
63 // calls to InstallMultipleProtocolInterfaces()
65 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
66 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
67 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
68 Status
= gBS
->InstallMultipleProtocolInterfaces (
70 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
74 Status
= gBS
->InstallMultipleProtocolInterfaces (
76 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
77 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
82 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
83 Status
= gBS
->InstallMultipleProtocolInterfaces (
85 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
86 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
90 Status
= gBS
->InstallMultipleProtocolInterfaces (
92 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
93 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
94 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
100 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
101 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
102 Status
= gBS
->InstallMultipleProtocolInterfaces (
103 &DriverBindingHandle
,
104 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
105 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
109 Status
= gBS
->InstallMultipleProtocolInterfaces (
110 &DriverBindingHandle
,
111 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
112 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
113 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
118 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
119 Status
= gBS
->InstallMultipleProtocolInterfaces (
120 &DriverBindingHandle
,
121 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
122 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
123 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
127 Status
= gBS
->InstallMultipleProtocolInterfaces (
128 &DriverBindingHandle
,
129 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
130 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
131 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
132 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
140 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
142 ASSERT_EFI_ERROR (Status
);
145 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
147 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
;
148 DriverBinding
->ImageHandle
= ImageHandle
;
149 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
152 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
154 // The Driver Binding Protocol must never be NULL
156 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
159 // Install the Driver Binding Protocol and ASSERT() if the installation fails
161 Status
= gBS
->InstallProtocolInterface (
162 &DriverBindingHandle
,
163 &gEfiDriverBindingProtocolGuid
,
164 EFI_NATIVE_INTERFACE
,
165 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
167 ASSERT_EFI_ERROR (Status
);
170 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
172 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
;
173 DriverBinding
->ImageHandle
= ImageHandle
;
174 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
177 // If Component Name Protocol is specified then install it and ASSERT() if the installation fails
179 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
180 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
181 Status
= gBS
->InstallProtocolInterface (
182 &DriverBindingHandle
,
183 &gEfiComponentNameProtocolGuid
,
184 EFI_NATIVE_INTERFACE
,
185 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
187 ASSERT_EFI_ERROR (Status
);
192 // If Driver Configuration Protocol is specified then install it and ASSERT() if the installation fails
194 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
195 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
196 Status
= gBS
->InstallProtocolInterface (
197 &DriverBindingHandle
,
198 &gEfiDriverConfigurationProtocolGuid
,
199 EFI_NATIVE_INTERFACE
,
200 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
202 ASSERT_EFI_ERROR (Status
);
207 // If Driver Diagnostics Protocol is specified then install it and ASSERT() if the installation fails
209 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
210 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
211 Status
= gBS
->InstallProtocolInterface (
212 &DriverBindingHandle
,
213 &gEfiDriverDiagnosticsProtocolGuid
,
214 EFI_NATIVE_INTERFACE
,
215 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
217 ASSERT_EFI_ERROR (Status
);
222 // Install subsequent Driver Bindng Protocols onto new handles
224 DriverBindingHandle
= NULL
;
231 The destructor function uninstalls the standard EFI Driver Model Protocols.
233 @param[in] ImageHandle The firmware allocated handle for the EFI image.
234 @param[in] SystemTable A pointer to the EFI System Table.
236 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
240 UefiDriverModelLibDestructor (
241 IN EFI_HANDLE ImageHandle
,
242 IN EFI_SYSTEM_TABLE
*SystemTable
247 EFI_HANDLE DriverBindingHandle
;
250 // If no Driver Binding Protocols are advertised by the driver then simply return
252 if (_gDriverModelProtocolListEntries
== 0) {
257 // See if onle one Driver Binding Protocol is advertised by the driver
259 if (_gDriverModelProtocolListEntries
== 1) {
261 // The Driver Binding Protocol must never be NULL
263 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
266 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
268 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
271 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
272 // These are all checks against const pointers, so the optimizing compiler will only select one of the
273 // calls to InstallMultipleProtocolInterfaces()
275 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
276 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
277 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
278 Status
= gBS
->UninstallMultipleProtocolInterfaces (
280 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
284 Status
= gBS
->UninstallMultipleProtocolInterfaces (
285 &DriverBindingHandle
,
286 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
287 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
292 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
293 Status
= gBS
->UninstallMultipleProtocolInterfaces (
294 &DriverBindingHandle
,
295 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
296 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
300 Status
= gBS
->UninstallMultipleProtocolInterfaces (
301 &DriverBindingHandle
,
302 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
303 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
304 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
310 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
311 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
312 Status
= gBS
->UninstallMultipleProtocolInterfaces (
313 &DriverBindingHandle
,
314 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
315 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
319 Status
= gBS
->UninstallMultipleProtocolInterfaces (
320 &DriverBindingHandle
,
321 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
322 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
323 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
328 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
329 Status
= gBS
->UninstallMultipleProtocolInterfaces (
330 &DriverBindingHandle
,
331 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
332 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
333 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
337 Status
= gBS
->UninstallMultipleProtocolInterfaces (
338 &DriverBindingHandle
,
339 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
340 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
341 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
342 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
350 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
352 ASSERT_EFI_ERROR (Status
);
354 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
356 // The Driver Binding Protocol must never be NULL
358 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
361 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
363 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
366 // Uninstall the Driver Binding Protocol and ASSERT() if the installation fails
368 Status
= gBS
->UninstallProtocolInterface (
370 &gEfiDriverBindingProtocolGuid
,
371 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
373 ASSERT_EFI_ERROR (Status
);
376 // If Component Name Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
378 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
379 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
380 Status
= gBS
->UninstallProtocolInterface (
382 &gEfiComponentNameProtocolGuid
,
383 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
385 ASSERT_EFI_ERROR (Status
);
390 // If Driver Configuration Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
392 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
393 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
394 Status
= gBS
->UninstallProtocolInterface (
396 &gEfiDriverConfigurationProtocolGuid
,
397 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
399 ASSERT_EFI_ERROR (Status
);
404 // If Driver Diagnostics Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
406 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
407 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
408 Status
= gBS
->UninstallProtocolInterface (
410 &gEfiDriverDiagnosticsProtocolGuid
,
411 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
413 ASSERT_EFI_ERROR (Status
);