]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/EdkIIGlueLib/Library/UefiDriverModelLib/UefiDriverModelLib.c
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EdkIIGlueLib / Library / UefiDriverModelLib / UefiDriverModelLib.c
CommitLineData
3eb9473e 1/*++\r
2\r
2c7e5c2f
HT
3Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
3eb9473e 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
c7f33ca4 25#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
26 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID gEfiComponentName2ProtocolGuid\r
27 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME2_PROTOCOL\r
28#else\r
29 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID gEfiComponentNameProtocolGuid\r
30 #define EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME_PROTOCOL\r
31#endif\r
32\r
3eb9473e 33/**\r
34 The constructor function installs the standard EFI Driver Model Protocols.\r
35\r
36 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
37 @param[in] SystemTable A pointer to the EFI System Table.\r
38\r
39 @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.\r
40\r
41**/\r
42EFI_STATUS\r
43EFIAPI\r
44UefiDriverModelLibConstructor (\r
45 IN EFI_HANDLE ImageHandle,\r
46 IN EFI_SYSTEM_TABLE *SystemTable\r
47 )\r
48{\r
49 EFI_STATUS Status;\r
50 EFI_HANDLE DriverBindingHandle;\r
51 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
52\r
53 //\r
54 // Install the first Driver Bindng Protocol onto ImageHandle\r
55 //\r
56 DriverBindingHandle = ImageHandle;\r
57\r
58 //\r
59 // See if onle one Driver Binding Protocol is advertised by the driver\r
60 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1\r
61 //\r
62\r
63 //\r
64 // The Driver Binding Protocol must never be NULL\r
65 //\r
66 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);\r
67\r
68 //\r
69 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol\r
70 // These are all checks against const pointers, so the optimizing compiler will only select one of the\r
71 // calls to InstallMultipleProtocolInterfaces()\r
72 //\r
73 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {\r
74 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
75 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
76 Status = gBS->InstallMultipleProtocolInterfaces (\r
77 &DriverBindingHandle,\r
78 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
79 NULL\r
80 );\r
81 } else {\r
3eb9473e 82 Status = gBS->InstallMultipleProtocolInterfaces (\r
83 &DriverBindingHandle,\r
84 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 85 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 86 NULL\r
87 );\r
3eb9473e 88 }\r
89 } else {\r
90 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
91 Status = gBS->InstallMultipleProtocolInterfaces (\r
92 &DriverBindingHandle,\r
93 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
94 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
95 NULL\r
96 );\r
97 } else {\r
3eb9473e 98 Status = gBS->InstallMultipleProtocolInterfaces (\r
99 &DriverBindingHandle,\r
100 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 101 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 102 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
103 NULL\r
104 );\r
3eb9473e 105 }\r
106 }\r
107 } else {\r
108 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
109 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
110 Status = gBS->InstallMultipleProtocolInterfaces (\r
111 &DriverBindingHandle,\r
112 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
113 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
114 NULL\r
115 );\r
116 } else {\r
3eb9473e 117 Status = gBS->InstallMultipleProtocolInterfaces (\r
118 &DriverBindingHandle,\r
119 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 120 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 121 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
122 NULL\r
123 );\r
3eb9473e 124 }\r
125 } else {\r
126 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
127 Status = gBS->InstallMultipleProtocolInterfaces (\r
128 &DriverBindingHandle,\r
129 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
130 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
131 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
132 NULL\r
133 );\r
134 } else {\r
3eb9473e 135 Status = gBS->InstallMultipleProtocolInterfaces (\r
136 &DriverBindingHandle,\r
137 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 138 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 139 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
140 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
141 NULL\r
142 );\r
3eb9473e 143 }\r
144 }\r
145 }\r
146\r
147 //\r
148 // ASSERT if the call to InstallMultipleProtocolInterfaces() failed\r
149 //\r
150 ASSERT_EFI_ERROR (Status);\r
151\r
152 //\r
153 // Update the ImageHandle and DriverBindingHandle fields of the Driver Binding Protocol\r
154 //\r
155 DriverBinding = (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding;\r
156 DriverBinding->ImageHandle = ImageHandle;\r
157 DriverBinding->DriverBindingHandle = DriverBindingHandle;\r
158\r
159 \r
160 return EFI_SUCCESS;\r
161}\r
162\r
163/**\r
164 The destructor function uninstalls the standard EFI Driver Model Protocols.\r
165\r
166 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
167 @param[in] SystemTable A pointer to the EFI System Table.\r
168\r
169 @retval EFI_SUCCESS The destructor always return EFI_SUCCESS.\r
170\r
171**/\r
172EFI_STATUS\r
173EFIAPI\r
174UefiDriverModelLibDestructor (\r
175 IN EFI_HANDLE ImageHandle,\r
176 IN EFI_SYSTEM_TABLE *SystemTable\r
177 )\r
178{\r
179 EFI_STATUS Status;\r
180 EFI_HANDLE DriverBindingHandle;\r
181\r
182 //\r
183 // See if onle one Driver Binding Protocol is advertised by the driver\r
184 // EdkIIGlueLib: _gDriverModelProtocolListEntries is always 1\r
185 //\r
186\r
187 //\r
188 // The Driver Binding Protocol must never be NULL\r
189 //\r
190 ASSERT(_gDriverModelProtocolList[0].DriverBinding != NULL);\r
191\r
192 //\r
193 // Retrieve the DriverBindingHandle from the Driver Binding Protocol\r
194 //\r
195 DriverBindingHandle = _gDriverModelProtocolList[0].DriverBinding->DriverBindingHandle;\r
196\r
197 //\r
198 // Check for all 8 possible combinations of the ComponentName, DriverConfiguration, and DriverDiagnostics Protocol\r
199 // These are all checks against const pointers, so the optimizing compiler will only select one of the\r
200 // calls to InstallMultipleProtocolInterfaces()\r
201 //\r
202 if (_gDriverModelProtocolList[0].DriverDiagnostics == NULL) {\r
203 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
204 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
205 Status = gBS->UninstallMultipleProtocolInterfaces (\r
206 DriverBindingHandle,\r
207 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
208 NULL\r
209 );\r
210 } else {\r
3eb9473e 211 Status = gBS->UninstallMultipleProtocolInterfaces (\r
212 &DriverBindingHandle,\r
213 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 214 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 215 NULL\r
216 );\r
3eb9473e 217 }\r
218 } else {\r
219 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
220 Status = gBS->UninstallMultipleProtocolInterfaces (\r
221 &DriverBindingHandle,\r
222 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
223 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
224 NULL\r
225 );\r
226 } else {\r
3eb9473e 227 Status = gBS->UninstallMultipleProtocolInterfaces (\r
228 &DriverBindingHandle,\r
229 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 230 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 231 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
232 NULL\r
233 );\r
3eb9473e 234 }\r
235 }\r
236 } else {\r
237 if (_gDriverModelProtocolList[0].DriverConfiguration == NULL) {\r
238 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
239 Status = gBS->UninstallMultipleProtocolInterfaces (\r
240 &DriverBindingHandle,\r
241 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
242 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
243 NULL\r
244 );\r
245 } else {\r
3eb9473e 246 Status = gBS->UninstallMultipleProtocolInterfaces (\r
247 &DriverBindingHandle,\r
248 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 249 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 250 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
251 NULL\r
252 );\r
3eb9473e 253 }\r
254 } else {\r
255 if (_gDriverModelProtocolList[0].ComponentName == NULL) {\r
256 Status = gBS->UninstallMultipleProtocolInterfaces (\r
257 &DriverBindingHandle,\r
258 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
259 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
260 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
261 NULL\r
262 );\r
263 } else {\r
3eb9473e 264 Status = gBS->UninstallMultipleProtocolInterfaces (\r
265 &DriverBindingHandle,\r
266 &gEfiDriverBindingProtocolGuid, (EFI_DRIVER_BINDING_PROTOCOL *)_gDriverModelProtocolList[0].DriverBinding,\r
c7f33ca4 267 &EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL_GUID, (EDKII_GLUE_SELECTED_COMPONENT_NAME_PROTOCOL *)_gDriverModelProtocolList[0].ComponentName,\r
3eb9473e 268 &gEfiDriverConfigurationProtocolGuid, (EFI_DRIVER_CONFIGURATION_PROTOCOL *)_gDriverModelProtocolList[0].DriverConfiguration,\r
269 &gEfiDriverDiagnosticsProtocolGuid, (EFI_DRIVER_DIAGNOSTICS_PROTOCOL *)_gDriverModelProtocolList[0].DriverDiagnostics,\r
270 NULL\r
271 );\r
3eb9473e 272 }\r
273 }\r
274 }\r
275\r
276 //\r
277 // ASSERT if the call to UninstallMultipleProtocolInterfaces() failed\r
278 //\r
279 ASSERT_EFI_ERROR (Status);\r
280 \r
281 return EFI_SUCCESS;\r
282}\r