/** @file
  Copyright (c) 2006, 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

**/
STATIC
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;
}
