//\r
// EFI Driver Configuration Protocol\r
//\r
-EFI_DRIVER_CONFIGURATION_PROTOCOL gIDEBusDriverConfiguration = {\r
- IDEBusDriverConfigurationSetOptions,\r
- IDEBusDriverConfigurationOptionsValid,\r
- IDEBusDriverConfigurationForceDefaults,\r
- "eng"\r
-};\r
-\r
-/**\r
- Interprete keyboard input.\r
-\r
- @retval EFI_ABORTED Get an 'ESC' key inputed.\r
- @retval EFI_SUCCESS Get an 'Y' or 'y' inputed.\r
- @retval EFI_NOT_FOUND Get an 'N' or 'n' inputed..\r
-\r
-**/\r
-EFI_STATUS\r
-GetResponse (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY Key;\r
-\r
- while (TRUE) {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- if (!EFI_ERROR (Status)) {\r
- if (Key.ScanCode == SCAN_ESC) {\r
- return EFI_ABORTED;\r
- }\r
-\r
- switch (Key.UnicodeChar) {\r
-\r
- //\r
- // fall through\r
- //\r
- case L'y':\r
- case L'Y':\r
- gST->ConOut->OutputString (gST->ConOut, L"Y\n");\r
- return EFI_SUCCESS;\r
-\r
- //\r
- // fall through\r
- //\r
- case L'n':\r
- case L'N':\r
- gST->ConOut->OutputString (gST->ConOut, L"N\n");\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Allows the user to set controller specific options for a controller that a\r
- driver is currently managing.\r
-\r
- @param This A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL instance.\r
- @param ControllerHandle The handle of the controller to set options on.\r
- @param ChildHandle The handle of the child controller to set options on.\r
- This is an optional parameter that may be NULL.\r
- It will be NULL for device drivers, and for a bus drivers\r
- that wish to set options for the bus controller.\r
- It will not be NULL for a bus driver that wishes to set\r
- options for one of its child controllers.\r
- @param Language A pointer to a three character ISO 639-2 language identifier.\r
- This is the language of the user interface that should be presented\r
- to the user, and it must match one of the languages specified in\r
- SupportedLanguages. The number of languages supported by a driver is up to\r
- the driver writer.\r
- @param ActionRequired A pointer to the action that the calling agent is required\r
- to perform when this function returns.\r
-\r
-\r
- @retval EFI_SUCCESS The driver specified by This successfully set the configuration\r
- options for the controller specified by ControllerHandle..\r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ActionRequired is NULL.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support setting configuration options for\r
- the controller specified by ControllerHandle and ChildHandle.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support the language specified by Language.\r
- @retval EFI_DEVICE_ERROR A device error occurred while attempt to set the configuration options for the\r
- controller specified by ControllerHandle and ChildHandle.\r
- @retval EFI_OUT_RESOURCES There are not enough resources available to set the configuration options for the\r
- controller specified by ControllerHandle and ChildHandle\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IDEBusDriverConfigurationSetOptions (\r
- IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN CHAR8 *Language,\r
- OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Value;\r
- UINT8 NewValue;\r
- UINTN DataSize;\r
- UINTN Index;\r
-\r
- if (ChildHandle != NULL) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- *ActionRequired = EfiDriverConfigurationActionNone;\r
\r
- DataSize = sizeof (Value);\r
- Status = gRT->GetVariable (\r
- L"Configuration",\r
- &gEfiCallerIdGuid,\r
- NULL,\r
- &DataSize,\r
- &Value\r
- );\r
-\r
- gST->ConOut->OutputString (gST->ConOut, L"IDE Bus Driver Configuration\n");\r
- gST->ConOut->OutputString (gST->ConOut, L"===============================\n");\r
-\r
- NewValue = 0;\r
- for (Index = 0; Index < 4; Index++) {\r
- gST->ConOut->OutputString (gST->ConOut, OptionString[Index]);\r
-\r
- Status = GetResponse ();\r
- if (Status == EFI_ABORTED) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
- NewValue = (UINT8) (NewValue | (1 << Index));\r
- }\r
- }\r
-\r
- if (EFI_ERROR (Status) || (NewValue != Value)) {\r
- gRT->SetVariable (\r
- L"Configuration",\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (NewValue),\r
- &NewValue\r
- );\r
-\r
- *ActionRequired = EfiDriverConfigurationActionRestartController;\r
- } else {\r
- *ActionRequired = EfiDriverConfigurationActionNone;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Tests to see if a controller's current configuration options are valid.\r
-\r
- @param This A pointer to the EFI_DRIVER_CONFIGURATION_PROTOCOL instance.\r
- @param ControllerHandle The handle of the controller to test if it's current configuration options\r
- are valid.\r
- @param ChildHandle The handle of the child controller to test if it's current configuration\r
- options are valid. This is an optional parameter that may be NULL. It will\r
- be NULL for device drivers. It will also be NULL for a bus drivers that\r
- wish to test the configuration options for the bus controller. It will\r
- not be NULL for a bus driver that wishes to test configuration options for\r
- one of its child controllers.\r
- @retval EFI_SUCCESS The controller specified by ControllerHandle and ChildHandle that is being\r
- managed by the driver specified by This has a valid set of configuration\r
- options.\r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.\r
- @retval EFI_UNSUPPORTED The driver specified by This is not currently managing the controller\r
- specified by ControllerHandle and ChildHandle.\r
- @retval EFI_DEVICE_ERROR The controller specified by ControllerHandle and ChildHandle that is being\r
- managed by the driver specified by This has an invalid set of configuration\r
- options.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IDEBusDriverConfigurationOptionsValid (\r
- IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Value;\r
- UINTN DataSize;\r
-\r
- if (ChildHandle != NULL) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- DataSize = sizeof (Value);\r
- Status = gRT->GetVariable (\r
- L"Configuration",\r
- &gEfiCallerIdGuid,\r
- NULL,\r
- &DataSize,\r
- &Value\r
- );\r
- if (EFI_ERROR (Status) || Value > 0x0f) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-/**\r
- Forces a driver to set the default configuration options for a controller.\r
-\r
- @param This A pointer to the EFI_DRIVER_CONFIGURATION_ PROTOCOL instance.\r
- @param ControllerHandle The handle of the controller to force default configuration options on.\r
- @param ChildHandle The handle of the child controller to force default configuration\r
- options on This is an optional parameter that may be NULL. It\r
- will be NULL for device drivers. It will also be NULL for a bus\r
- drivers that wish to force default configuration options for the bus\r
- controller. It will not be NULL for a bus driver that wishes to force\r
- default configuration options for one of its child controllers.\r
- @param DefaultType The type of default configuration options to force on the controller\r
- specified by ControllerHandle and ChildHandle.\r
- @param ActionRequired A pointer to the action that the calling agent is required to perform\r
- when this function returns.\r
-\r
- @retval EFI_SUCCESS The driver specified by This successfully forced the\r
- default configuration options on the controller specified by\r
- ControllerHandle and ChildHandle.\r
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.\r
- @retval EFI_INVALID_PARAMETER ActionRequired is NULL.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support forcing the default\r
- configuration options on the controller specified by ControllerHandle\r
- and ChildHandle.\r
- @retval EFI_UNSUPPORTED The driver specified by This does not support the configuration type\r
- specified by DefaultType.\r
- @retval EFI_DEVICE_ERROR A device error occurred while attempt to force the default configuration\r
- options on the controller specified by ControllerHandle and ChildHandle.\r
- @retval EFI_OUT_RESOURCES There are not enough resources available to force the default configuration\r
- options on the controller specified by ControllerHandle and ChildHandle.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IDEBusDriverConfigurationForceDefaults (\r
- IN EFI_DRIVER_CONFIGURATION_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN UINT32 DefaultType,\r
- OUT EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED *ActionRequired\r
- )\r
-{\r
- UINT8 Value;\r
\r
- if (ChildHandle != NULL) {\r
- return EFI_UNSUPPORTED;\r
- }\r
\r
- Value = 0x0f;\r
- gRT->SetVariable (\r
- L"Configuration",\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (Value),\r
- &Value\r
- );\r
- *ActionRequired = EfiDriverConfigurationActionRestartController;\r
- return EFI_SUCCESS;\r
-}\r