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