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