1 /**@file
2 
3 Copyright (c) 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 Module Name:
13 
14   DriverConfiguration.c
15 
16 Abstract:
17 
18 **/
19 #include <Uefi.h>
20 #include <WinNtDxe.h>
21 #include <Protocol/BlockIo.h>
22 #include <Protocol/ComponentName.h>
23 #include <Protocol/DriverBinding.h>
24 
25 #include "WinNtBlockIo.h"
26 
27 //
28 // EFI Driver Configuration Functions
29 //
30 EFI_STATUS
31 EFIAPI
32 WinNtBlockIoDriverConfigurationSetOptions (
33   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL                      *This,
34   IN  EFI_HANDLE                                             ControllerHandle,
35   IN  EFI_HANDLE                                             ChildHandle  OPTIONAL,
36   IN  CHAR8                                                  *Language,
37   OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED               *ActionRequired
38   );
39 
40 EFI_STATUS
41 EFIAPI
42 WinNtBlockIoDriverConfigurationOptionsValid (
43   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL               *This,
44   IN  EFI_HANDLE                                      ControllerHandle,
45   IN  EFI_HANDLE                                      ChildHandle  OPTIONAL
46   );
47 
48 EFI_STATUS
49 EFIAPI
50 WinNtBlockIoDriverConfigurationForceDefaults (
51   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL                      *This,
52   IN  EFI_HANDLE                                             ControllerHandle,
53   IN  EFI_HANDLE                                             ChildHandle  OPTIONAL,
54   IN  UINT32                                                 DefaultType,
55   OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED               *ActionRequired
56   );
57 
58 //
59 // EFI Driver Configuration Protocol
60 //
61 EFI_DRIVER_CONFIGURATION_PROTOCOL gWinNtBlockIoDriverConfiguration = {
62   WinNtBlockIoDriverConfigurationSetOptions,
63   WinNtBlockIoDriverConfigurationOptionsValid,
64   WinNtBlockIoDriverConfigurationForceDefaults,
65   LANGUAGESUPPORTED
66 };
67 
68 EFI_STATUS
69 EFIAPI
WinNtBlockIoDriverConfigurationSetOptions(IN EFI_DRIVER_CONFIGURATION_PROTOCOL * This,IN EFI_HANDLE ControllerHandle,IN EFI_HANDLE ChildHandle OPTIONAL,IN CHAR8 * Language,OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED * ActionRequired)70 WinNtBlockIoDriverConfigurationSetOptions (
71   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL                      *This,
72   IN  EFI_HANDLE                                             ControllerHandle,
73   IN  EFI_HANDLE                                             ChildHandle  OPTIONAL,
74   IN  CHAR8                                                  *Language,
75   OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED               *ActionRequired
76   )
77 /*++
78 
79   Routine Description:
80     Allows the user to set controller specific options for a controller that a
81     driver is currently managing.
82 
83   Arguments:
84     This             - A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL instance.
85     ControllerHandle - The handle of the controller to set options on.
86     ChildHandle      - The handle of the child controller to set options on.  This
87                        is an optional parameter that may be NULL.  It will be NULL
88                        for device drivers, and for a bus drivers that wish to set
89                        options for the bus controller.  It will not be NULL for a
90                        bus driver that wishes to set options for one of its child
91                        controllers.
92     Language         - A pointer to a three character ISO 639-2 language identifier.
93                        This is the language of the user interface that should be
94                        presented to the user, and it must match one of the languages
95                        specified in SupportedLanguages.  The number of languages
96                        supported by a driver is up to the driver writer.
97     ActionRequired   - A pointer to the action that the calling agent is required
98                        to perform when this function returns.  See "Related
99                        Definitions" for a list of the actions that the calling
100                        agent is required to perform prior to accessing
101                        ControllerHandle again.
102 
103   Returns:
104     EFI_SUCCESS           - The driver specified by This successfully set the
105                             configuration options for the controller specified
106                             by ControllerHandle..
107     EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
108     EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.
109     EFI_INVALID_PARAMETER - ActionRequired is NULL.
110     EFI_UNSUPPORTED       - The driver specified by This does not support setting
111                             configuration options for the controller specified by
112                             ControllerHandle and ChildHandle.
113     EFI_UNSUPPORTED       - The driver specified by This does not support the
114                             language specified by Language.
115     EFI_DEVICE_ERROR      - A device error occurred while attempt to set the
116                             configuration options for the controller specified
117                             by ControllerHandle and ChildHandle.
118     EFI_OUT_RESOURCES     - There are not enough resources available to set the
119                             configuration options for the controller specified
120                             by ControllerHandle and ChildHandle.
121 
122 --*/
123 {
124   EFI_STATUS            Status;
125   EFI_BLOCK_IO_PROTOCOL *BlockIo;
126   CHAR8                 *SupportedLanguage;
127 
128   SupportedLanguage = This->SupportedLanguages;
129 
130   Status            = EFI_UNSUPPORTED;
131   while (*SupportedLanguage != 0) {
132     if (AsciiStrnCmp (Language, SupportedLanguage, 3) == 0) {
133       Status = EFI_SUCCESS;
134     }
135 
136     SupportedLanguage += 3;
137   }
138 
139   if (EFI_ERROR (Status)) {
140     return Status;
141   }
142 
143   if (ActionRequired == NULL || ControllerHandle == NULL) {
144     return EFI_INVALID_PARAMETER;
145   }
146 
147   if (ChildHandle != NULL) {
148     return EFI_UNSUPPORTED;
149   }
150 
151   //
152   // Validate controller handle
153   //
154   Status = gBS->OpenProtocol (
155                   ControllerHandle,
156                   &gEfiWinNtIoProtocolGuid,
157                   (VOID **) &BlockIo,
158                   gWinNtBlockIoDriverBinding.DriverBindingHandle,
159                   ControllerHandle,
160                   EFI_OPEN_PROTOCOL_BY_DRIVER
161                   );
162 
163   if (!EFI_ERROR (Status)) {
164     gBS->CloseProtocol (
165           ControllerHandle,
166           &gEfiWinNtIoProtocolGuid,
167           gWinNtBlockIoDriverBinding.DriverBindingHandle,
168           ControllerHandle
169           );
170 
171     return EFI_UNSUPPORTED;
172   }
173 
174   if (Status == EFI_UNSUPPORTED) {
175     return Status;
176   } else if (Status != EFI_ALREADY_STARTED) {
177     return EFI_INVALID_PARAMETER;
178   }
179 
180   *ActionRequired = EfiDriverConfigurationActionNone;
181   return EFI_SUCCESS;
182 }
183 
184 EFI_STATUS
185 EFIAPI
WinNtBlockIoDriverConfigurationOptionsValid(IN EFI_DRIVER_CONFIGURATION_PROTOCOL * This,IN EFI_HANDLE ControllerHandle,IN EFI_HANDLE ChildHandle OPTIONAL)186 WinNtBlockIoDriverConfigurationOptionsValid (
187   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL               *This,
188   IN  EFI_HANDLE                                      ControllerHandle,
189   IN  EFI_HANDLE                                      ChildHandle  OPTIONAL
190   )
191 /*++
192 
193   Routine Description:
194     Tests to see if a controller's current configuration options are valid.
195 
196   Arguments:
197     This             - A pointer to the EFI_DRIVER_CONFIGURATION_PROTOCOL instance.
198     ControllerHandle - The handle of the controller to test if it's current
199                        configuration options are valid.
200     ChildHandle      - The handle of the child controller to test if it's current
201                        configuration options are valid.  This is an optional
202                        parameter that may be NULL.  It will be NULL for device
203                        drivers.  It will also be NULL for a bus drivers that wish
204                        to test the configuration options for the bus controller.
205                        It will not be NULL for a bus driver that wishes to test
206                        configuration options for one of its child controllers.
207 
208   Returns:
209     EFI_SUCCESS           - The controller specified by ControllerHandle and
210                             ChildHandle that is being managed by the driver
211                             specified by This has a valid set of  configuration
212                             options.
213     EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
214     EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.
215     EFI_UNSUPPORTED       - The driver specified by This is not currently
216                             managing the controller specified by ControllerHandle
217                             and ChildHandle.
218     EFI_DEVICE_ERROR      - The controller specified by ControllerHandle and
219                             ChildHandle that is being managed by the driver
220                             specified by This has an invalid set of configuration
221                             options.
222 
223 --*/
224 {
225   EFI_STATUS            Status;
226   EFI_BLOCK_IO_PROTOCOL *BlockIo;
227 
228   if (ChildHandle != NULL) {
229     return EFI_UNSUPPORTED;
230   }
231 
232   if (ControllerHandle == NULL) {
233     return EFI_INVALID_PARAMETER;
234   }
235 
236   //
237   // Validate controller handle
238   //
239   Status = gBS->OpenProtocol (
240                   ControllerHandle,
241                   &gEfiWinNtIoProtocolGuid,
242                   (VOID **) &BlockIo,
243                   gWinNtBlockIoDriverBinding.DriverBindingHandle,
244                   ControllerHandle,
245                   EFI_OPEN_PROTOCOL_BY_DRIVER
246                   );
247 
248   if (!EFI_ERROR (Status)) {
249     gBS->CloseProtocol (
250           ControllerHandle,
251           &gEfiWinNtIoProtocolGuid,
252           gWinNtBlockIoDriverBinding.DriverBindingHandle,
253           ControllerHandle
254           );
255 
256     return EFI_UNSUPPORTED;
257   }
258 
259   if (Status == EFI_UNSUPPORTED) {
260     return Status;
261   } else if (Status != EFI_ALREADY_STARTED) {
262     return EFI_INVALID_PARAMETER;
263   }
264 
265   return EFI_SUCCESS;
266 }
267 
268 EFI_STATUS
269 EFIAPI
WinNtBlockIoDriverConfigurationForceDefaults(IN EFI_DRIVER_CONFIGURATION_PROTOCOL * This,IN EFI_HANDLE ControllerHandle,IN EFI_HANDLE ChildHandle OPTIONAL,IN UINT32 DefaultType,OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED * ActionRequired)270 WinNtBlockIoDriverConfigurationForceDefaults (
271   IN  EFI_DRIVER_CONFIGURATION_PROTOCOL                      *This,
272   IN  EFI_HANDLE                                             ControllerHandle,
273   IN  EFI_HANDLE                                             ChildHandle  OPTIONAL,
274   IN  UINT32                                                 DefaultType,
275   OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED               *ActionRequired
276   )
277 /*++
278 
279   Routine Description:
280     Forces a driver to set the default configuration options for a controller.
281 
282   Arguments:
283     This             - A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL instance.
284     ControllerHandle - The handle of the controller to force default configuration options on.
285     ChildHandle      - The handle of the child controller to force default configuration options on  This is an optional parameter that may be NULL.  It will be NULL for device drivers.  It will also be NULL for a bus drivers that wish to force default configuration options for the bus controller.  It will not be NULL for a bus driver that wishes to force default configuration options for one of its child controllers.
286     DefaultType      - The type of default configuration options to force on the controller specified by ControllerHandle and ChildHandle.  See Table 9-1 for legal values.  A DefaultType of 0x00000000 must be supported by this protocol.
287     ActionRequired   - A pointer to the action that the calling agent is required to perform when this function returns.  See "Related Definitions" in Section 9.1for a list of the actions that the calling agent is required to perform prior to accessing ControllerHandle again.
288 
289   Returns:
290     EFI_SUCCESS           - The driver specified by This successfully forced the default configuration options on the controller specified by ControllerHandle and ChildHandle.
291     EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.
292     EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.
293     EFI_INVALID_PARAMETER - ActionRequired is NULL.
294     EFI_UNSUPPORTED       - The driver specified by This does not support forcing the default configuration options on the controller specified by ControllerHandle and ChildHandle.
295     EFI_UNSUPPORTED       - The driver specified by This does not support the configuration type specified by DefaultType.
296     EFI_DEVICE_ERROR      - A device error occurred while attempt to force the default configuration options on the controller specified by  ControllerHandle and ChildHandle.
297     EFI_OUT_RESOURCES     - There are not enough resources available to force the default configuration options on the controller specified by ControllerHandle and ChildHandle.
298 
299 --*/
300 {
301   EFI_STATUS            Status;
302   EFI_BLOCK_IO_PROTOCOL *BlockIo;
303 
304   if (ChildHandle != NULL) {
305     return EFI_UNSUPPORTED;
306   }
307 
308   if (ActionRequired == NULL || ControllerHandle == NULL) {
309     return EFI_INVALID_PARAMETER;
310   }
311 
312   //
313   // Validate controller handle
314   //
315   Status = gBS->OpenProtocol (
316                   ControllerHandle,
317                   &gEfiWinNtIoProtocolGuid,
318                   (VOID **) &BlockIo,
319                   gWinNtBlockIoDriverBinding.DriverBindingHandle,
320                   ControllerHandle,
321                   EFI_OPEN_PROTOCOL_BY_DRIVER
322                   );
323 
324   if (!EFI_ERROR (Status)) {
325     gBS->CloseProtocol (
326           ControllerHandle,
327           &gEfiWinNtIoProtocolGuid,
328           gWinNtBlockIoDriverBinding.DriverBindingHandle,
329           ControllerHandle
330           );
331 
332     return EFI_UNSUPPORTED;
333   }
334 
335   if (Status == EFI_UNSUPPORTED) {
336     return Status;
337   } else if (Status != EFI_ALREADY_STARTED) {
338     return EFI_INVALID_PARAMETER;
339   }
340 
341   *ActionRequired = EfiDriverConfigurationActionNone;
342   return EFI_SUCCESS;
343 }
344