]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EdkIIGlueLib/Library/UefiDriverModelLib/UefiDriverModelLib.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EdkIIGlueLib / Library / UefiDriverModelLib / UefiDriverModelLib.c
1 /*++
2
3 Copyright (c) 2004 - 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12
13 Module Name:
14
15 UefiDriverModelLib.c
16
17 Abstract:
18
19 UEFI Driver Model Library.
20
21 --*/
22
23 #include "EdkIIGlueUefi.h"
24
25 /**
26 The constructor function installs the standard EFI Driver Model Protocols.
27
28 @param[in] ImageHandle The firmware allocated handle for the EFI image.
29 @param[in] SystemTable A pointer to the EFI System Table.
30
31 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.
32
33 **/
34 EFI_STATUS
35 EFIAPI
36 UefiDriverModelLibConstructor (
37 IN EFI_HANDLE ImageHandle,
38 IN EFI_SYSTEM_TABLE *SystemTable
39 )
40 {
41 EFI_STATUS Status;
42 EFI_HANDLE DriverBindingHandle;
43 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
44
45 //
46 // Install the first Driver Bindng Protocol onto ImageHandle
47 //
48 DriverBindingHandle = ImageHandle;
49
50 //
51 // See if onle one Driver Binding Protocol is advertised by the driver
52 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
53 //
54
55 //
56 // The Driver Binding Protocol must never be NULL
57 //
58 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);
59
60 //
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()
64 //
65 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {
66 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
67 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
68 Status = gBS->InstallMultipleProtocolInterfaces (
69 &DriverBindingHandle,
70 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
71 NULL
72 );
73 } else {
74 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
75 Status = gBS->InstallMultipleProtocolInterfaces (
76 &DriverBindingHandle,
77 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
78 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
79 NULL
80 );
81 #else
82 Status = gBS->InstallMultipleProtocolInterfaces (
83 &DriverBindingHandle,
84 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
85 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
86 NULL
87 );
88 #endif
89 }
90 } else {
91 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
92 Status = gBS->InstallMultipleProtocolInterfaces (
93 &DriverBindingHandle,
94 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
95 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
96 NULL
97 );
98 } else {
99 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
100 Status = gBS->InstallMultipleProtocolInterfaces (
101 &DriverBindingHandle,
102 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
103 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
104 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
105 NULL
106 );
107 #else
108 Status = gBS->InstallMultipleProtocolInterfaces (
109 &DriverBindingHandle,
110 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
111 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
112 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
113 NULL
114 );
115 #endif
116 }
117 }
118 } else {
119 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
120 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
121 Status = gBS->InstallMultipleProtocolInterfaces (
122 &DriverBindingHandle,
123 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
124 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
125 NULL
126 );
127 } else {
128 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
129 Status = gBS->InstallMultipleProtocolInterfaces (
130 &DriverBindingHandle,
131 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
132 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
133 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
134 NULL
135 );
136 #else
137 Status = gBS->InstallMultipleProtocolInterfaces (
138 &DriverBindingHandle,
139 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
140 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
141 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
142 NULL
143 );
144 #endif
145 }
146 } else {
147 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
148 Status = gBS->InstallMultipleProtocolInterfaces (
149 &DriverBindingHandle,
150 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
151 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
152 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
153 NULL
154 );
155 } else {
156 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
157 Status = gBS->InstallMultipleProtocolInterfaces (
158 &DriverBindingHandle,
159 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
160 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
161 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
162 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
163 NULL
164 );
165 #else
166 Status = gBS->InstallMultipleProtocolInterfaces (
167 &DriverBindingHandle,
168 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
169 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
170 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
171 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
172 NULL
173 );
174 #endif
175 }
176 }
177 }
178
179 //
180 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed
181 //
182 ASSERT_EFI_ERROR (Status);
183
184 //
185 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol
186 //
187 DriverBinding = (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding;
188 DriverBinding->ImageHandle = ImageHandle;
189 DriverBinding->DriverBindingHandle = DriverBindingHandle;
190
191
192 return EFI_SUCCESS;
193 }
194
195 /**
196 The destructor function uninstalls the standard EFI Driver Model Protocols.
197
198 @param[in] ImageHandle The firmware allocated handle for the EFI image.
199 @param[in] SystemTable A pointer to the EFI System Table.
200
201 @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.
202
203 **/
204 EFI_STATUS
205 EFIAPI
206 UefiDriverModelLibDestructor (
207 IN EFI_HANDLE ImageHandle,
208 IN EFI_SYSTEM_TABLE *SystemTable
209 )
210 {
211 EFI_STATUS Status;
212 EFI_HANDLE DriverBindingHandle;
213
214 //
215 // See if onle one Driver Binding Protocol is advertised by the driver
216 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1
217 //
218
219 //
220 // The Driver Binding Protocol must never be NULL
221 //
222 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);
223
224 //
225 // Retrieve the DriverBindingHandle from the Driver Binding Protocol
226 //
227 DriverBindingHandle = _gDriverModelProtocolList[0].DriverBinding->DriverBindingHandle;
228
229 //
230 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol
231 // These are all checks against const pointers, so the optimizing compiler will only select one of the
232 // calls to InstallMultipleProtocolInterfaces()
233 //
234 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {
235 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
236 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
237 Status = gBS->UninstallMultipleProtocolInterfaces (
238 DriverBindingHandle,
239 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
240 NULL
241 );
242 } else {
243 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
244 Status = gBS->UninstallMultipleProtocolInterfaces (
245 &DriverBindingHandle,
246 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
247 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
248 NULL
249 );
250 #else
251 Status = gBS->UninstallMultipleProtocolInterfaces (
252 &DriverBindingHandle,
253 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
254 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
255 NULL
256 );
257
258 #endif
259 }
260 } else {
261 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
262 Status = gBS->UninstallMultipleProtocolInterfaces (
263 &DriverBindingHandle,
264 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
265 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
266 NULL
267 );
268 } else {
269 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
270 Status = gBS->UninstallMultipleProtocolInterfaces (
271 &DriverBindingHandle,
272 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
273 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
274 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
275 NULL
276 );
277 #else
278 Status = gBS->UninstallMultipleProtocolInterfaces (
279 &DriverBindingHandle,
280 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
281 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
282 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
283 NULL
284 );
285 #endif
286 }
287 }
288 } else {
289 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {
290 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
291 Status = gBS->UninstallMultipleProtocolInterfaces (
292 &DriverBindingHandle,
293 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
294 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
295 NULL
296 );
297 } else {
298 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
299 Status = gBS->UninstallMultipleProtocolInterfaces (
300 &DriverBindingHandle,
301 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
302 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
303 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
304 NULL
305 );
306 #else
307 Status = gBS->UninstallMultipleProtocolInterfaces (
308 &DriverBindingHandle,
309 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
310 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
311 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
312 NULL
313 );
314 #endif
315 }
316 } else {
317 if (_gDriverModelProtocolList[0].ComponentName == NULL) {
318 Status = gBS->UninstallMultipleProtocolInterfaces (
319 &DriverBindingHandle,
320 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
321 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
322 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
323 NULL
324 );
325 } else {
326 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
327 Status = gBS->UninstallMultipleProtocolInterfaces (
328 &DriverBindingHandle,
329 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
330 &gEfiComponentName2ProtocolGuid, (EFI_COMPONENT_NAME2_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
331 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
332 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
333 NULL
334 );
335 #else
336 Status = gBS->UninstallMultipleProtocolInterfaces (
337 &DriverBindingHandle,
338 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,
339 &gEfiComponentNameProtocolGuid, (EFI_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,
340 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,
341 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,
342 NULL
343 );
344 #endif
345 }
346 }
347 }
348
349 //
350 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed
351 //
352 ASSERT_EFI_ERROR (Status);
353
354 return EFI_SUCCESS;
355 }