| /** @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 | |
| **/ | |
| #ifndef __PLATFORM_TO_DRIVER_CONFIGUARTION_H__ | |
| #define __PLATFORM_TO_DRIVER_CONFIGUARTION_H__ | |
| #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; | |
| #endif |