| /** @file | |
| Copyright (c) 2006 - 2008, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "IdeBus.h" | |
| CHAR16 *OptionString[4] = { | |
| L"Enable Primary Master (Y/N)? -->", | |
| L"Enable Primary Slave (Y/N)? -->", | |
| L"Enable Secondary Master (Y/N)? -->", | |
| L"Enable Secondary Slave (Y/N)? -->" | |
| }; | |
| // | |
| // EFI Driver Configuration Protocol | |
| // | |
| EFI_DRIVER_CONFIGURATION_PROTOCOL gIDEBusDriverConfiguration = { | |
| IDEBusDriverConfigurationSetOptions, | |
| IDEBusDriverConfigurationOptionsValid, | |
| IDEBusDriverConfigurationForceDefaults, | |
| "eng" | |
| }; | |
| /** | |
| TODO: Add function description | |
| @retval EFI_ABORTED TODO: Add description for return value. | |
| @retval EFI_SUCCESS TODO: Add description for return value. | |
| @retval EFI_NOT_FOUND TODO: Add description for return value. | |
| **/ | |
| EFI_STATUS | |
| GetResponse ( | |
| VOID | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| EFI_INPUT_KEY Key; | |
| while (TRUE) { | |
| Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); | |
| if (!EFI_ERROR (Status)) { | |
| if (Key.ScanCode == SCAN_ESC) { | |
| return EFI_ABORTED; | |
| } | |
| switch (Key.UnicodeChar) { | |
| // | |
| // fall through | |
| // | |
| case L'y': | |
| case L'Y': | |
| gST->ConOut->OutputString (gST->ConOut, L"Y\n"); | |
| return EFI_SUCCESS; | |
| // | |
| // fall through | |
| // | |
| case L'n': | |
| case L'N': | |
| gST->ConOut->OutputString (gST->ConOut, L"N\n"); | |
| return EFI_NOT_FOUND; | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| Allows the user to set controller specific options for a controller that a | |
| driver is currently managing. | |
| @param This A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL | |
| instance. | |
| @param ControllerHandle The handle of the controller to set options on. | |
| @param ChildHandle The handle of the child controller to set options on. | |
| This is an optional parameter that may be NULL. | |
| It will be NULL for device drivers, and for a bus drivers | |
| that wish to set options for the bus controller. | |
| It will not be NULL for a bus driver that wishes to set | |
| options for one of its child controllers. | |
| @param Language A pointer to a three character ISO 639-2 language | |
| identifier. This is the language of the user interface | |
| that should be presented to the user, and it must match | |
| one of the languages specified in SupportedLanguages. | |
| The number of languages supported by a driver is up to | |
| the driver writer. | |
| @param ActionRequired A pointer to the action that the calling agent is | |
| required to perform when this function returns. | |
| See "Related Definitions" for a list of the actions that | |
| the calling agent is required to perform prior to | |
| accessing ControllerHandle again. | |
| @retval EFI_SUCCESS The driver specified by This successfully set the | |
| configuration options for the controller specified | |
| by ControllerHandle.. | |
| @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. | |
| @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a | |
| valid EFI_HANDLE. | |
| @retval EFI_INVALID_PARAMETER ActionRequired is NULL. | |
| @retval EFI_UNSUPPORTED The driver specified by This does not support | |
| setting configuration options for the controller | |
| specified by ControllerHandle and ChildHandle. | |
| @retval EFI_UNSUPPORTED The driver specified by This does not support the | |
| language specified by Language. | |
| @retval EFI_DEVICE_ERROR A device error occurred while attempt to set the | |
| configuration options for the controller specified | |
| by ControllerHandle and ChildHandle. | |
| @retval EFI_OUT_RESOURCES There are not enough resources available to set the | |
| configuration options for the controller specified | |
| by ControllerHandle and ChildHandle. | |
| **/ | |
| EFI_STATUS | |
| IDEBusDriverConfigurationSetOptions ( | |
| 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 | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Value; | |
| UINT8 NewValue; | |
| UINTN DataSize; | |
| UINTN Index; | |
| if (ChildHandle != NULL) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| *ActionRequired = EfiDriverConfigurationActionNone; | |
| DataSize = sizeof (Value); | |
| Status = gRT->GetVariable ( | |
| L"Configuration", | |
| &gEfiCallerIdGuid, | |
| NULL, | |
| &DataSize, | |
| &Value | |
| ); | |
| gST->ConOut->OutputString (gST->ConOut, L"IDE Bus Driver Configuration\n"); | |
| gST->ConOut->OutputString (gST->ConOut, L"===============================\n"); | |
| NewValue = 0; | |
| for (Index = 0; Index < 4; Index++) { | |
| gST->ConOut->OutputString (gST->ConOut, OptionString[Index]); | |
| Status = GetResponse (); | |
| if (Status == EFI_ABORTED) { | |
| return EFI_SUCCESS; | |
| } | |
| if (!EFI_ERROR (Status)) { | |
| NewValue = (UINT8) (NewValue | (1 << Index)); | |
| } | |
| } | |
| if (EFI_ERROR (Status) || (NewValue != Value)) { | |
| gRT->SetVariable ( | |
| L"Configuration", | |
| &gEfiCallerIdGuid, | |
| EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, | |
| sizeof (NewValue), | |
| &NewValue | |
| ); | |
| *ActionRequired = EfiDriverConfigurationActionRestartController; | |
| } else { | |
| *ActionRequired = EfiDriverConfigurationActionNone; | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /** | |
| Tests to see if a controller's current configuration options are valid. | |
| @param This A pointer to the EFI_DRIVER_CONFIGURATION_PROTOCOL | |
| instance. | |
| @param ControllerHandle The handle of the controller to test if it's current | |
| configuration options are valid. | |
| @param ChildHandle The handle of the child controller to test if it's | |
| current | |
| configuration options are valid. 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 test the configuration options for the bus | |
| controller. It will not be NULL for a bus driver that | |
| wishes to test configuration options for one of | |
| its child controllers. | |
| @retval EFI_SUCCESS The controller specified by ControllerHandle and | |
| ChildHandle that is being managed by the driver | |
| specified by This has a valid set of configuration | |
| options. | |
| @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. | |
| @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid | |
| EFI_HANDLE. | |
| @retval EFI_UNSUPPORTED The driver specified by This is not currently | |
| managing the controller specified by | |
| ControllerHandle and ChildHandle. | |
| @retval EFI_DEVICE_ERROR The controller specified by ControllerHandle and | |
| ChildHandle that is being managed by the driver | |
| specified by This has an invalid set of | |
| configuration options. | |
| **/ | |
| EFI_STATUS | |
| IDEBusDriverConfigurationOptionsValid ( | |
| IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This, | |
| IN EFI_HANDLE ControllerHandle, | |
| IN EFI_HANDLE ChildHandle OPTIONAL | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT8 Value; | |
| UINTN DataSize; | |
| if (ChildHandle != NULL) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| DataSize = sizeof (Value); | |
| Status = gRT->GetVariable ( | |
| L"Configuration", | |
| &gEfiCallerIdGuid, | |
| NULL, | |
| &DataSize, | |
| &Value | |
| ); | |
| if (EFI_ERROR (Status) || Value > 0x0f) { | |
| return EFI_DEVICE_ERROR; | |
| } | |
| return EFI_SUCCESS; | |
| } | |
| /** | |
| Forces a driver to set the default configuration options for a controller. | |
| @param This A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL | |
| instance. | |
| @param ControllerHandle The handle of the controller to force default | |
| configuration options on. | |
| @param 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. | |
| @param 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. | |
| @param ActionRequired A pointer to the action that the calling agent | |
| is required to perform when this function returns. | |
| @retval EFI_SUCCESS The driver specified by This successfully forced | |
| the default configuration options on the | |
| controller specified by ControllerHandle and | |
| ChildHandle. | |
| @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. | |
| @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a | |
| valid EFI_HANDLE. | |
| @retval EFI_INVALID_PARAMETER ActionRequired is NULL. | |
| @retval EFI_UNSUPPORTED The driver specified by This does not support | |
| forcing the default configuration options on | |
| the controller specified by ControllerHandle | |
| and ChildHandle. | |
| @retval EFI_UNSUPPORTED The driver specified by This does not support | |
| the configuration type specified by DefaultType. | |
| @retval EFI_DEVICE_ERROR A device error occurred while attempt to force | |
| the default configuration options on the controller | |
| specified by ControllerHandle and ChildHandle. | |
| @retval EFI_OUT_RESOURCES There are not enough resources available to force | |
| the default configuration options on the controller | |
| specified by ControllerHandle and ChildHandle. | |
| **/ | |
| EFI_STATUS | |
| IDEBusDriverConfigurationForceDefaults ( | |
| 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 | |
| ) | |
| { | |
| UINT8 Value; | |
| if (ChildHandle != NULL) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| Value = 0x0f; | |
| gRT->SetVariable ( | |
| L"Configuration", | |
| &gEfiCallerIdGuid, | |
| EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, | |
| sizeof (Value), | |
| &Value | |
| ); | |
| *ActionRequired = EfiDriverConfigurationActionRestartController; | |
| return EFI_SUCCESS; | |
| } |