/** @file
  UEFI Platform to Driver Configuration Protocol is defined in UEFI specification.

  This is a protocol that is optionally produced by the platform and optionally consumed
  by a UEFI Driver in its Start() function. This protocol allows the driver to receive
  configuration information as part of being started.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL_GUID  \
  { 0x642cd590, 0x8059, 0x4c0a, { 0xa9, 0x58, 0xc5, 0xec, 0x7, 0xd2, 0x3c, 0x4b } }

typedef struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL;

/**
  The UEFI driver must call Query early in the Start() function
  before any time consuming operations are performed. If
  ChildHandle is NULL the driver is requesting information from
  the platform about the ControllerHandle that is being started.
  Information returned from Query may lead to the drivers Start()
  function failing.
  If the UEFI driver is a bus driver and producing a ChildHandle,
  the driver must call Query after the child handle has been created
  and an EFI_DEVICE_PATH_PROTOCOL has been placed on that handle,
  but before any time consuming operation is performed. If information
  return by Query may lead the driver to decide to not create the
  ChildHandle. The driver must then cleanup and remove the ChildHandle
  from the system.
  The UEFI driver repeatedly calls Query, processes the information
  returned by the platform, and calls Response passing in the
  arguments returned from Query. The Instance value passed into
  Response must be the same value passed into the corresponding
  call to Query. The UEFI driver must continuously call Query and
  Response until EFI_NOT_FOUND is returned by Query.
  If the UEFI driver does not recognize the ParameterTypeGuid, it
  calls Response with a ConfigurationAction of
  EfiPlatformConfigurationActionUnsupportedGuid. The UEFI driver
  must then continue calling Query and Response until EFI_NOT_FOUND
  is returned by Query. This gives the platform an opportunity to
  pass additional configuration settings using a different
  ParameterTypeGuid that may be supported by the driver.
  An Instance value of zero means return the first ParameterBlock
  in the set of unprocessed parameter blocks. The driver should
  increment the Instance value by one for each successive call to Query.

  @param This                 A pointer to the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL instance.

  @param ControllerHandle     The handle the platform will return
                              configuration information about.

  @param ChildHandle          The handle of the child controller to
                              return information on. This is an optional
                              parameter that may be NULL. It will be
                              NULL for device drivers and for bus
                              drivers that attempt to get options for
                              the bus controller. It will not be NULL
                              for a bus driver that attempts to get
                              options for one of its child controllers.


  @param Instance             Pointer to the Instance value. Zero means
                              return the first query data. The caller should
                              increment this value by one each time to retrieve
                              successive data.

  @param ParameterTypeGuid    An EFI_GUID that defines the contents
                              of ParameterBlock. UEFI drivers must
                              use the ParameterTypeGuid to determine
                              how to parse the ParameterBlock. The caller
                              should not attempt to free ParameterTypeGuid.

  @param ParameterBlock       The platform returns a pointer to the
                              ParameterBlock structure which
                              contains details about the
                              configuration parameters specific to
                              the ParameterTypeGuid. This structure
                              is defined based on the protocol and
                              may be different for different
                              protocols. UEFI driver decodes this
                              structure and its contents based on
                              ParameterTypeGuid. ParameterBlock is
                              allocated by the platform and the
                              platform is responsible for freeing
                              the ParameterBlock after Result is
                              called.

  @param ParameterBlockSize   The platform returns the size of
                              the ParameterBlock in bytes.


  @retval EFI_SUCCESS           The platform return parameter
                                information for ControllerHandle.

  @retval EFI_NOT_FOUND         No more unread Instance exists.

  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.

  @retval EFI_INVALID_PARAMETER Instance is NULL.

  @retval EFI_DEVICE_ERROR      A device error occurred while
                                attempting to return parameter block
                                information 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.


**/
typedef
EFI_STATUS
(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY)(
  IN CONST  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This,
  IN CONST  EFI_HANDLE  ControllerHandle,
  IN CONST  EFI_HANDLE  ChildHandle OPTIONAL,
  IN CONST  UINTN       *Instance,
  OUT       EFI_GUID    **ParameterTypeGuid,
  OUT       VOID        **ParameterBlock,
  OUT       UINTN       *ParameterBlockSize
  );

typedef enum {
  ///
  ///  The controller specified by ControllerHandle is still
  ///  in a usable state, and its configuration has been updated
  ///  via parsing the ParameterBlock. If required by the
  ///  parameter block, and the module supports an NVRAM store,
  ///  the configuration information from PB was successfully
  ///  saved to the NVRAM. No actions are required before
  ///  this controller can be used again with the updated
  ///  configuration settings.
  ///
  EfiPlatformConfigurationActionNone = 0,

  ///
  ///  The driver has detected that the controller specified
  ///  by ControllerHandle is not in a usable state and
  ///  needs to be stopped. The calling agent can use the
  ///  DisconnectControservice to perform this operation, and
  ///  it should be performed as soon as possible.
  ///
  EfiPlatformConfigurationActionStopController = 1,

  ///
  ///  This controller specified by ControllerHandle needs to
  ///  be stopped and restarted before it can be used again.
  ///  The calling agent can use the DisconnectController()
  ///  and ConnectController() services to perform this
  ///  operation. The restart operation can be delayed until
  ///  all of the configuration options have been set.
  ///
  EfiPlatformConfigurationActionRestartController = 2,

  ///
  ///  A configuration change has been made that requires the
  ///  platform to be restarted before the controller
  ///  specified by ControllerHandle can be used again. The
  ///  calling agent can use the ResetSystem() services to
  ///  perform this operation. The restart operation can be
  ///  delayed until all of the configuration options have
  ///  been set.
  ///
  EfiPlatformConfigurationActionRestartPlatform = 3,

  ///
  ///  The controller specified by ControllerHandle is still
  ///  in a usable state; its configuration has been updated
  ///  via parsing the ParameterBlock. The driver tried to
  ///  update the driver's private NVRAM store with
  ///  information from ParameterBlock and failed. No actions
  ///  are required before this controller can be used again
  ///  with the updated configuration settings, but these
  ///  configuration settings are not guaranteed to persist
  ///  after ControllerHandle is stopped.
  ///
  EfiPlatformConfigurationActionNvramFailed = 4,

  ///
  /// The controller specified by ControllerHandle is still
  /// in a usable state; its configuration has not been updated
  /// via parsing the ParameterBlock. The driver did not support
  /// the ParameterBlock format identified by ParameterTypeGuid.
  /// No actions are required before this controller can be used
  /// again. On additional Query calls from this ControllerHandle,
  /// the platform should stop returning a ParameterBlock
  /// qualified by this same ParameterTypeGuid. If no other
  /// ParameterTypeGuid is supported by the platform, Query
  /// should return EFI_NOT_FOUND.
  ///
  EfiPlatformConfigurationActionUnsupportedGuid = 5,
  EfiPlatformConfigurationActionMaximum
} EFI_PLATFORM_CONFIGURATION_ACTION;

/**
  The UEFI driver repeatedly calls Query, processes the
  information returned by the platform, and calls Response passing
  in the arguments returned from Query. The UEFI driver must
  continuously call Query until EFI_NOT_FOUND is returned. For
  every call to Query that returns EFI_SUCCESS a corrisponding
  call to Response is required passing in the same
  ContollerHandle, ChildHandle, Instance, ParameterTypeGuid,
  ParameterBlock, and ParameterBlockSize. The UEFI driver may
  update values in ParameterBlock based on rules defined by
  ParameterTypeGuid. The platform is responsible for freeing
  ParameterBlock and the UEFI driver must not try to free it.

  @param This                A pointer to the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL instance.

  @param ControllerHandle    The handle the driver is returning
                             configuration information about.

  @param ChildHandle         The handle of the child controller to
                             return information on. This is an optional
                             parameter that may be NULL. It will be
                             NULL for device drivers, and for bus
                             drivers that attempt to get options for
                             the bus controller. It will not be NULL
                             for a bus driver that attempts to get
                             options for one of its child controllers.
                             Instance Instance data returned from
                             Query().

  @param Instance            Instance data passed to Query().

  @param ParameterTypeGuid   ParameterTypeGuid returned from Query.

  @param ParameterBlock      ParameterBlock returned from Query.

  @param ParameterBlockSize  The ParameterBlock size returned from Query.

  @param ConfigurationAction The driver tells the platform what
                             action is required for ParameterBlock to
                             take effect.


  @retval EFI_SUCCESS           The platform return parameter information
                                for ControllerHandle.

  @retval EFI_NOT_FOUND         Instance was not found.

  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.

  @retval EFI_INVALID_PARAMETER Instance is zero.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE)(
  IN CONST  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This,
  IN CONST  EFI_HANDLE  ControllerHandle,
  IN CONST  EFI_HANDLE  ChildHandle OPTIONAL,
  IN CONST  UINTN       *Instance,
  IN CONST  EFI_GUID    *ParameterTypeGuid,
  IN CONST  VOID        *ParameterBlock,
  IN CONST  UINTN       ParameterBlockSize,
  IN CONST  EFI_PLATFORM_CONFIGURATION_ACTION ConfigurationAction
  );

///
/// The EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL is used by the
/// UEFI driver to query the platform for configuration information.
/// The UEFI driver calls Query() multiple times to get
/// configuration information from the platform. For every call to
/// Query() there must be a matching call to Response() so the
/// UEFI driver can inform the platform how it used the
/// information passed in from Query(). It's legal for a UEFI
/// driver to use Response() to inform the platform it does not
/// understand the data returned via Query() and thus no action was
/// taken.
///
struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL {
  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY       Query;
  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE    Response;
};

#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_CLP_GUID   \
  {0x345ecc0e, 0xcb6, 0x4b75, { 0xbb, 0x57, 0x1b, 0x12, 0x9c, 0x47, 0x33,0x3e } }

/**

  ParameterTypeGuid provides the support for parameters
  communicated through the DMTF SM CLP Specification 1.0 Final
  Standard to be used to configure the UEFI driver. In this
  section the producer of the
  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL is platform
  firmware and the consumer is the UEFI driver. Note: if future
  versions of the DMTF SM CLP Specification require changes to the
  parameter block definition, a newer ParameterTypeGuid will be
  used.
**/
typedef struct {
  CHAR8     *CLPCommand;           ///<  A pointer to the null-terminated UTF-8 string that specifies the DMTF SM CLP command
                                   ///<  line that the driver is required to parse and process when this function is called.
                                   ///<  See the DMTF SM CLP Specification 1.0 Final Standard for details on the
                                   ///<  format and syntax of the CLP command line string. CLPCommand buffer
                                   ///<  is allocated by the producer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOOL.
  UINT32    CLPCommandLength;      ///< The length of the CLP Command in bytes.
  CHAR8     *CLPReturnString;      ///<  A pointer to the null-terminated UTF-8 string that indicates the CLP return status
                                   ///<  that the driver is required to provide to the calling agent.
                                   ///<  The calling agent may parse and/ or pass
                                   ///<  this for processing and user feedback. The SM CLP Command Response string
                                   ///<  buffer is filled in by the UEFI driver in the "keyword=value" format
                                   ///<  described in the SM CLP Specification, unless otherwise requested via the SM
                                   ///<  CLP Coutput option in the Command Line string buffer. UEFI driver's support
                                   ///<  for this default "keyword=value" output format is required if the UEFI
                                   ///<  driver supports this protocol, while support for other SM CLP output
                                   ///<  formats is optional (the UEFI Driver should return an EFI_UNSUPPORTED if
                                   ///<  the SM CLP Coutput option requested by the caller is not supported by the
                                   ///<  UEFI Driver). CLPReturnString buffer is allocated by the consumer of the
                                   ///<  EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC OL and undefined prior to the call to
                                   ///<  Response().
  UINT32    CLPReturnStringLength; ///< The length of the CLP return status string in bytes.
  UINT8     CLPCmdStatus;          ///<  SM CLP Command Status (see DMTF SM CLP Specification 1.0 Final Standard -
                                   ///<  Table 4) CLPErrorValue SM CLP Processing Error Value (see DMTF SM
                                   ///<  CLP Specification 1.0 Final Standard - Table 6). This field is filled in by
                                   ///<  the consumer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC
                                   ///<  OL and undefined prior to the call to Response().
  UINT8     CLPErrorValue;         ///<  SM CLP Processing Error Value (see DMTF SM CLP Specification 1.0 Final Standard - Table 6).
                                   ///<  This field is filled in by the consumer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL and undefined prior to the call to Response().
  UINT16    CLPMsgCode;            ///<  Bit 15: OEM Message Code Flag 0 = Message Code is an SM CLP Probable
                                   ///<  Cause Value. (see SM CLP Specification Table 11) 1 = Message Code is OEM
                                   ///<  Specific Bits 14-0: Message Code This field is filled in by the consumer of
                                   ///<  the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC OL and undefined prior to the call to
                                   ///<  Response().
} EFI_CONFIGURE_CLP_PARAMETER_BLK;

extern EFI_GUID  gEfiPlatformToDriverConfigurationClpGuid;

extern EFI_GUID  gEfiPlatformToDriverConfigurationProtocolGuid;
