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: EfiDriverModelLib.c
22 UefiDriverModelLibConstructor (
23 IN EFI_HANDLE ImageHandle
,
24 IN EFI_SYSTEM_TABLE
*SystemTable
29 EFI_HANDLE DriverBindingHandle
;
30 EFI_DRIVER_BINDING_PROTOCOL
*DriverBinding
;
33 // If no Driver Binding Protocols are advertised by the driver then simply return
35 if (_gDriverModelProtocolListEntries
== 0) {
40 // Install the first Driver Bindng Protocol onto ImageHandle
42 DriverBindingHandle
= ImageHandle
;
45 // See if onle one Driver Binding Protocol is advertised by the driver
47 if (_gDriverModelProtocolListEntries
== 1) {
49 // The Driver Binding Protocol must never be NULL
51 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
54 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
55 // These are all checks against const pointers, so the optimizing compiler will only select one of the
56 // calls to InstallMultipleProtocolInterfaces()
58 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
59 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
60 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
61 Status
= gBS
->InstallMultipleProtocolInterfaces (
63 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
67 Status
= gBS
->InstallMultipleProtocolInterfaces (
69 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
70 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
75 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
76 Status
= gBS
->InstallMultipleProtocolInterfaces (
78 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
79 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
83 Status
= gBS
->InstallMultipleProtocolInterfaces (
85 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
86 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
87 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
93 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
94 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
95 Status
= gBS
->InstallMultipleProtocolInterfaces (
97 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
98 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
102 Status
= gBS
->InstallMultipleProtocolInterfaces (
103 &DriverBindingHandle
,
104 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
105 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
106 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
111 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
112 Status
= gBS
->InstallMultipleProtocolInterfaces (
113 &DriverBindingHandle
,
114 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
115 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
116 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
120 Status
= gBS
->InstallMultipleProtocolInterfaces (
121 &DriverBindingHandle
,
122 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
123 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
124 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
125 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
133 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
135 ASSERT_EFI_ERROR (Status
);
138 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
140 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
;
141 DriverBinding
->ImageHandle
= ImageHandle
;
142 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
145 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
147 // The Driver Binding Protocol must never be NULL
149 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
152 // Install the Driver Binding Protocol and ASSERT() if the installation fails
154 Status
= gBS
->InstallProtocolInterface (
155 &DriverBindingHandle
,
156 &gEfiDriverBindingProtocolGuid
,
157 EFI_NATIVE_INTERFACE
,
158 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
160 ASSERT_EFI_ERROR (Status
);
163 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
165 DriverBinding
= (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
;
166 DriverBinding
->ImageHandle
= ImageHandle
;
167 DriverBinding
->DriverBindingHandle
= DriverBindingHandle
;
170 // If Component Name Protocol is specified then install it and ASSERT() if the installation fails
172 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
173 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
174 Status
= gBS
->InstallProtocolInterface (
175 &DriverBindingHandle
,
176 &gEfiComponentNameProtocolGuid
,
177 EFI_NATIVE_INTERFACE
,
178 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
180 ASSERT_EFI_ERROR (Status
);
185 // If Driver Configuration Protocol is specified then install it and ASSERT() if the installation fails
187 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
188 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
189 Status
= gBS
->InstallProtocolInterface (
190 &DriverBindingHandle
,
191 &gEfiDriverConfigurationProtocolGuid
,
192 EFI_NATIVE_INTERFACE
,
193 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
195 ASSERT_EFI_ERROR (Status
);
200 // If Driver Diagnostics Protocol is specified then install it and ASSERT() if the installation fails
202 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
203 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
204 Status
= gBS
->InstallProtocolInterface (
205 &DriverBindingHandle
,
206 &gEfiDriverDiagnosticsProtocolGuid
,
207 EFI_NATIVE_INTERFACE
,
208 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
210 ASSERT_EFI_ERROR (Status
);
215 // Install subsequent Driver Bindng Protocols onto new handles
217 DriverBindingHandle
= NULL
;
226 UefiDriverModelLibDestructor (
227 IN EFI_HANDLE ImageHandle
,
228 IN EFI_SYSTEM_TABLE
*SystemTable
233 EFI_HANDLE DriverBindingHandle
;
236 // If no Driver Binding Protocols are advertised by the driver then simply return
238 if (_gDriverModelProtocolListEntries
== 0) {
243 // See if onle one Driver Binding Protocol is advertised by the driver
245 if (_gDriverModelProtocolListEntries
== 1) {
247 // The Driver Binding Protocol must never be NULL
249 ASSERT(_gDriverModelProtocolList
[0].DriverBinding
!= NULL
);
252 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
254 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
257 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
258 // These are all checks against const pointers, so the optimizing compiler will only select one of the
259 // calls to InstallMultipleProtocolInterfaces()
261 if (_gDriverModelProtocolList
[0].DriverDiagnostics
== NULL
) {
262 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
263 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
264 Status
= gBS
->UninstallMultipleProtocolInterfaces (
266 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
270 Status
= gBS
->UninstallMultipleProtocolInterfaces (
271 &DriverBindingHandle
,
272 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
273 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
278 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
279 Status
= gBS
->UninstallMultipleProtocolInterfaces (
280 &DriverBindingHandle
,
281 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
282 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
286 Status
= gBS
->UninstallMultipleProtocolInterfaces (
287 &DriverBindingHandle
,
288 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
289 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
290 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
296 if (_gDriverModelProtocolList
[0].DriverConfiguration
== NULL
) {
297 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
298 Status
= gBS
->UninstallMultipleProtocolInterfaces (
299 &DriverBindingHandle
,
300 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
301 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
305 Status
= gBS
->UninstallMultipleProtocolInterfaces (
306 &DriverBindingHandle
,
307 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
308 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
309 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
314 if (_gDriverModelProtocolList
[0].ComponentName
== NULL
) {
315 Status
= gBS
->UninstallMultipleProtocolInterfaces (
316 &DriverBindingHandle
,
317 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
318 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
319 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
323 Status
= gBS
->UninstallMultipleProtocolInterfaces (
324 &DriverBindingHandle
,
325 &gEfiDriverBindingProtocolGuid
, (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverBinding
,
326 &gEfiComponentNameProtocolGuid
, (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[0].ComponentName
,
327 &gEfiDriverConfigurationProtocolGuid
, (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverConfiguration
,
328 &gEfiDriverDiagnosticsProtocolGuid
, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[0].DriverDiagnostics
,
336 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
338 ASSERT_EFI_ERROR (Status
);
340 for (Index
= 0; Index
< _gDriverModelProtocolListEntries
; Index
++) {
342 // The Driver Binding Protocol must never be NULL
344 ASSERT(_gDriverModelProtocolList
[Index
].DriverBinding
!= NULL
);
347 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
349 DriverBindingHandle
= _gDriverModelProtocolList
[0].DriverBinding
->DriverBindingHandle
;
352 // Uninstall the Driver Binding Protocol and ASSERT() if the installation fails
354 Status
= gBS
->UninstallProtocolInterface (
356 &gEfiDriverBindingProtocolGuid
,
357 (EFI_DRIVER_BINDING_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverBinding
359 ASSERT_EFI_ERROR (Status
);
362 // If Component Name Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
364 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_COMPONENT_NAME_PROTOCOL_ENABLED
) != 0) {
365 if (_gDriverModelProtocolList
[Index
].ComponentName
!= NULL
) {
366 Status
= gBS
->UninstallProtocolInterface (
368 &gEfiComponentNameProtocolGuid
,
369 (EFI_COMPONENT_NAME_PROTOCOL
*)_gDriverModelProtocolList
[Index
].ComponentName
371 ASSERT_EFI_ERROR (Status
);
376 // If Driver Configuration Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
378 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_CONFIGURATION_PROTOCOL_ENABLED
) != 0) {
379 if (_gDriverModelProtocolList
[Index
].DriverConfiguration
!= NULL
) {
380 Status
= gBS
->UninstallProtocolInterface (
382 &gEfiDriverConfigurationProtocolGuid
,
383 (EFI_DRIVER_CONFIGURATION_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverConfiguration
385 ASSERT_EFI_ERROR (Status
);
390 // If Driver Diagnostics Protocol is specified then uninstall it and ASSERT() if the uninstallation fails
392 if ((_gDriverModelProtocolBitmask
& UEFI_DRIVER_MODEL_LIBRARY_DRIVER_DIAGNOSTICS_PROTOCOL_ENABLED
) != 0) {
393 if (_gDriverModelProtocolList
[Index
].DriverDiagnostics
!= NULL
) {
394 Status
= gBS
->UninstallProtocolInterface (
396 &gEfiDriverDiagnosticsProtocolGuid
,
397 (EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*)_gDriverModelProtocolList
[Index
].DriverDiagnostics
399 ASSERT_EFI_ERROR (Status
);