mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
418 lines
19 KiB
C
418 lines
19 KiB
C
|
/** @file
|
||
|
The file provides services to manage the movement of
|
||
|
configuration data from drivers to configuration applications.
|
||
|
It then serves as the single point to receive configuration
|
||
|
information from configuration applications, routing the
|
||
|
results to the appropriate drivers.
|
||
|
|
||
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
@par Revision Reference:
|
||
|
This Protocol was introduced in UEFI Specification 2.1.
|
||
|
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef __HII_CONFIG_ROUTING_H__
|
||
|
#define __HII_CONFIG_ROUTING_H__
|
||
|
|
||
|
#define EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID \
|
||
|
{ 0x587e72d7, 0xcc50, 0x4f79, { 0x82, 0x09, 0xca, 0x29, 0x1f, 0xc1, 0xa1, 0x0f } }
|
||
|
|
||
|
|
||
|
typedef struct _EFI_HII_CONFIG_ROUTING_PROTOCOL EFI_HII_CONFIG_ROUTING_PROTOCOL;
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function allows the caller to request the current
|
||
|
configuration for one or more named elements from one or more
|
||
|
drivers. The resulting string is in the standard HII
|
||
|
configuration string format. If Successful, Results contains an
|
||
|
equivalent string with "=" and the values associated with all
|
||
|
names added in. The expected implementation is for each
|
||
|
<ConfigRequest> substring in the Request to call the HII
|
||
|
Configuration Routing Protocol ExtractProtocol function for the
|
||
|
driver corresponding to the <ConfigHdr> at the start of the
|
||
|
<ConfigRequest> substring. The request fails if no driver
|
||
|
matches the <ConfigRequest> substring. Note: Alternative
|
||
|
configuration strings may also be appended to the end of the
|
||
|
current configuration string. If they are, they must appear
|
||
|
after the current configuration. They must contain the same
|
||
|
routing (GUID, NAME, PATH) as the current configuration string.
|
||
|
They must have an additional description indicating the type of
|
||
|
alternative configuration the string represents,
|
||
|
"ALTCFG=<StringToken>". That <StringToken> (when converted from
|
||
|
hexadecimal (encoded as text) to binary) is a reference to a string in the
|
||
|
associated string pack. As an example, assume that the Request
|
||
|
string is:
|
||
|
GUID=...&NAME=00480050&PATH=...&Fred&George&Ron&Neville A result
|
||
|
might be:
|
||
|
GUID=...&NAME=00480050&PATH=...&Fred=16&George=16&Ron=12&Neville=11&
|
||
|
GUID=...&NAME=00480050&PATH=...&ALTCFG=0037&Fred=12&Neville=7
|
||
|
|
||
|
@param This Points to the EFI_HII_CONFIG_ROUTING_PROTOCOL
|
||
|
instance.
|
||
|
|
||
|
@param Request A null-terminated string in <MultiConfigRequest> format.
|
||
|
|
||
|
@param Progress On return, points to a character in the
|
||
|
Request string. Points to the string's null
|
||
|
terminator if the request was successful. Points
|
||
|
to the most recent '&' before the first
|
||
|
failing name / value pair (or the beginning
|
||
|
of the string if the failure is in the first
|
||
|
name / value pair) if the request was not
|
||
|
successful
|
||
|
|
||
|
@param Results A null-terminated string in <MultiConfigAltResp> format
|
||
|
which has all values filled in for the names in the
|
||
|
Request string.
|
||
|
|
||
|
@retval EFI_SUCCESS The Results string is filled with the
|
||
|
values corresponding to all requested
|
||
|
names.
|
||
|
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to store the
|
||
|
parts of the results that must be
|
||
|
stored awaiting possible future
|
||
|
protocols.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER For example, passing in a NULL
|
||
|
for the Request parameter
|
||
|
would result in this type of
|
||
|
error. The Progress parameter
|
||
|
is set to NULL.
|
||
|
|
||
|
@retval EFI_NOT_FOUND Routing data doesn't match any
|
||
|
known driver. Progress set to
|
||
|
the "G" in "GUID" of the
|
||
|
routing header that doesn't
|
||
|
match. Note: There is no
|
||
|
requirement that all routing
|
||
|
data be validated before any
|
||
|
configuration extraction.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
|
||
|
to the most recent & before the
|
||
|
error, or the beginning of the
|
||
|
string.
|
||
|
@retval EFI_INVALID_PARAMETER The ExtractConfig function of the
|
||
|
underlying HII Configuration
|
||
|
Access Protocol returned
|
||
|
EFI_INVALID_PARAMETER. Progress
|
||
|
set to most recent & before the
|
||
|
error or the beginning of the
|
||
|
string.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_EXTRACT_CONFIG)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
IN CONST EFI_STRING Request,
|
||
|
OUT EFI_STRING *Progress,
|
||
|
OUT EFI_STRING *Results
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function allows the caller to request the current configuration
|
||
|
for the entirety of the current HII database and returns the data in
|
||
|
a null-terminated string.
|
||
|
|
||
|
This function allows the caller to request the current
|
||
|
configuration for all of the current HII database. The results
|
||
|
include both the current and alternate configurations as
|
||
|
described in ExtractConfig() above.
|
||
|
|
||
|
@param This Points to the EFI_HII_CONFIG_ROUTING_PROTOCOL instance.
|
||
|
|
||
|
@param Results Null-terminated Unicode string in
|
||
|
<MultiConfigAltResp> format which has all values
|
||
|
filled in for the entirety of the current HII
|
||
|
database. String to be allocated by the called
|
||
|
function. De-allocation is up to the caller.
|
||
|
|
||
|
@retval EFI_SUCCESS The Results string is filled with the
|
||
|
values corresponding to all requested
|
||
|
names.
|
||
|
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to store the
|
||
|
parts of the results that must be
|
||
|
stored awaiting possible future
|
||
|
protocols.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETERS For example, passing in a NULL
|
||
|
for the Results parameter
|
||
|
would result in this type of
|
||
|
error.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_EXPORT_CONFIG)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
OUT EFI_STRING *Results
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function routes the results of processing forms to the
|
||
|
appropriate targets. It scans for <ConfigHdr> within the string
|
||
|
and passes the header and subsequent body to the driver whose
|
||
|
location is described in the <ConfigHdr>. Many <ConfigHdr>s may
|
||
|
appear as a single request. The expected implementation is to
|
||
|
hand off the various <ConfigResp> substrings to the
|
||
|
Configuration Access Protocol RouteConfig routine corresponding
|
||
|
to the driver whose routing information is defined by the
|
||
|
<ConfigHdr> in turn.
|
||
|
|
||
|
@param This Points to the EFI_HII_CONFIG_ROUTING_PROTOCOL instance.
|
||
|
|
||
|
@param Configuration A null-terminated string in <MulltiConfigResp> format.
|
||
|
|
||
|
@param Progress A pointer to a string filled in with the
|
||
|
offset of the most recent '&' before the
|
||
|
first failing name / value pair (or the
|
||
|
beginning of the string if the failure is in
|
||
|
the first name / value pair), or the
|
||
|
terminating NULL if all was successful.
|
||
|
|
||
|
@retval EFI_SUCCESS The results have been distributed or are
|
||
|
awaiting distribution.
|
||
|
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to store the
|
||
|
parts of the results that must be
|
||
|
stored awaiting possible future
|
||
|
protocols.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETERS Passing in a NULL for the
|
||
|
Results parameter would result
|
||
|
in this type of error.
|
||
|
|
||
|
@retval EFI_NOT_FOUND The target for the specified routing data
|
||
|
was not found.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_ROUTE_CONFIG)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
IN CONST EFI_STRING Configuration,
|
||
|
OUT EFI_STRING *Progress
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
|
||
|
This function extracts the current configuration from a block of
|
||
|
bytes. To do so, it requires that the ConfigRequest string
|
||
|
consists of a list of <BlockName> formatted names. It uses the
|
||
|
offset in the name to determine the index into the Block to
|
||
|
start the extraction and the width of each name to determine the
|
||
|
number of bytes to extract. These are mapped to a string
|
||
|
using the equivalent of the C "%x" format (with optional leading
|
||
|
spaces). The call fails if, for any (offset, width) pair in
|
||
|
ConfigRequest, offset+value >= BlockSize.
|
||
|
|
||
|
@param This Points to the EFI_HII_CONFIG_ROUTING_PROTOCOL instance.
|
||
|
|
||
|
@param ConfigRequest A null-terminated string in <ConfigRequest> format.
|
||
|
|
||
|
@param Block An array of bytes defining the block's
|
||
|
configuration.
|
||
|
|
||
|
@param BlockSize The length in bytes of Block.
|
||
|
|
||
|
@param Config The filled-in configuration string. String
|
||
|
allocated by the function. Returned only if
|
||
|
call is successful. The null-terminated string
|
||
|
will be <ConfigResp> format.
|
||
|
|
||
|
@param Progress A pointer to a string filled in with the
|
||
|
offset of the most recent '&' before the
|
||
|
first failing name / value pair (or the
|
||
|
beginning of the string if the failure is in
|
||
|
the first name / value pair), or the
|
||
|
terminating NULL if all was successful.
|
||
|
|
||
|
@retval EFI_SUCCESS The request succeeded. Progress points
|
||
|
to the null terminator at the end of the
|
||
|
ConfigRequest string.
|
||
|
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to allocate
|
||
|
Config. Progress points to the
|
||
|
first character of ConfigRequest.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETERS Passing in a NULL for the
|
||
|
ConfigRequest or Block
|
||
|
parameter would result in this
|
||
|
type of error. Progress points
|
||
|
to the first character of
|
||
|
ConfigRequest.
|
||
|
|
||
|
@retval EFI_NOT_FOUND The target for the specified routing data
|
||
|
was not found. Progress points to the
|
||
|
'G' in "GUID" of the errant routing
|
||
|
data.
|
||
|
@retval EFI_DEVICE_ERROR The block is not large enough. Progress undefined.
|
||
|
|
||
|
@retval EFI_INVALID_PARAMETER Encountered non <BlockName>
|
||
|
formatted string. Block is
|
||
|
left updated and Progress
|
||
|
points at the '&' preceding
|
||
|
the first non-<BlockName>.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_BLOCK_TO_CONFIG)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
IN CONST EFI_STRING ConfigRequest,
|
||
|
IN CONST UINT8 *Block,
|
||
|
IN CONST UINTN BlockSize,
|
||
|
OUT EFI_STRING *Config,
|
||
|
OUT EFI_STRING *Progress
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
This function maps a configuration containing a series of
|
||
|
<BlockConfig> formatted name value pairs in ConfigResp into a
|
||
|
Block so it may be stored in a linear mapped storage such as a
|
||
|
UEFI Variable. If present, the function skips GUID, NAME, and
|
||
|
PATH in <ConfigResp>. It stops when it finds a non-<BlockConfig>
|
||
|
name / value pair (after skipping the routing header) or when it
|
||
|
reaches the end of the string.
|
||
|
Example Assume an existing block containing: 00 01 02 03 04 05
|
||
|
And the ConfigResp string is:
|
||
|
OFFSET=4&WIDTH=1&VALUE=7&OFFSET=0&WIDTH=2&VALUE=AA55
|
||
|
The results are
|
||
|
55 AA 02 07 04 05
|
||
|
|
||
|
@param This Points to the EFI_HII_CONFIG_ROUTING_PROTOCOL instance.
|
||
|
|
||
|
@param ConfigResp A null-terminated string in <ConfigResp> format.
|
||
|
|
||
|
@param Block A possibly null array of bytes
|
||
|
representing the current block. Only
|
||
|
bytes referenced in the ConfigResp
|
||
|
string in the block are modified. If
|
||
|
this parameter is null or if the
|
||
|
BlockLength parameter is (on input)
|
||
|
shorter than required by the
|
||
|
Configuration string, only the BlockSize
|
||
|
parameter is updated, and an appropriate
|
||
|
status (see below) is returned.
|
||
|
|
||
|
@param BlockSize The length of the Block in units of UINT8.
|
||
|
On input, this is the size of the Block. On
|
||
|
output, if successful, contains the largest
|
||
|
index of the modified byte in the Block, or
|
||
|
the required buffer size if the Block is not
|
||
|
large enough.
|
||
|
|
||
|
@param Progress On return, points to an element of the
|
||
|
ConfigResp string filled in with the offset
|
||
|
of the most recent "&" before the first
|
||
|
failing name / value pair (or the beginning
|
||
|
of the string if the failure is in the first
|
||
|
name / value pair), or the terminating NULL
|
||
|
if all was successful.
|
||
|
|
||
|
@retval EFI_SUCCESS The request succeeded. Progress points to the null
|
||
|
terminator at the end of the ConfigResp string.
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to allocate Config. Progress
|
||
|
points to the first character of ConfigResp.
|
||
|
@retval EFI_INVALID_PARAMETER Passing in a NULL for the ConfigResp or
|
||
|
Block parameter would result in this type of
|
||
|
error. Progress points to the first character of
|
||
|
ConfigResp.
|
||
|
@retval EFI_INVALID_PARAMETER Encountered non <BlockName> formatted name /
|
||
|
value pair. Block is left updated and
|
||
|
Progress points at the '&' preceding the first
|
||
|
non-<BlockName>.
|
||
|
@retval EFI_DEVICE_ERROR Block not large enough. Progress undefined.
|
||
|
@retval EFI_NOT_FOUND Target for the specified routing data was not found.
|
||
|
Progress points to the "G" in "GUID" of the errant
|
||
|
routing data.
|
||
|
@retval EFI_BUFFER_TOO_SMALL Block not large enough. Progress undefined.
|
||
|
BlockSize is updated with the required buffer size.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_CONFIG_TO_BLOCK)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
IN CONST EFI_STRING ConfigResp,
|
||
|
IN OUT UINT8 *Block,
|
||
|
IN OUT UINTN *BlockSize,
|
||
|
OUT EFI_STRING *Progress
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This helper function is to be called by drivers to extract portions of
|
||
|
a larger configuration string.
|
||
|
|
||
|
@param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL instance.
|
||
|
@param ConfigResp A null-terminated string in <ConfigAltResp> format.
|
||
|
@param Guid A pointer to the GUID value to search for in the
|
||
|
routing portion of the ConfigResp string when retrieving
|
||
|
the requested data. If Guid is NULL, then all GUID
|
||
|
values will be searched for.
|
||
|
@param Name A pointer to the NAME value to search for in the
|
||
|
routing portion of the ConfigResp string when retrieving
|
||
|
the requested data. If Name is NULL, then all Name
|
||
|
values will be searched for.
|
||
|
@param DevicePath A pointer to the PATH value to search for in the
|
||
|
routing portion of the ConfigResp string when retrieving
|
||
|
the requested data. If DevicePath is NULL, then all
|
||
|
DevicePath values will be searched for.
|
||
|
@param AltCfgId A pointer to the ALTCFG value to search for in the
|
||
|
routing portion of the ConfigResp string when retrieving
|
||
|
the requested data. If this parameter is NULL,
|
||
|
then the current setting will be retrieved.
|
||
|
@param AltCfgResp A pointer to a buffer which will be allocated by the
|
||
|
function which contains the retrieved string as requested.
|
||
|
This buffer is only allocated if the call was successful.
|
||
|
The null-terminated string will be <ConfigResp> format.
|
||
|
|
||
|
@retval EFI_SUCCESS The request succeeded. The requested data was extracted
|
||
|
and placed in the newly allocated AltCfgResp buffer.
|
||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory to allocate AltCfgResp.
|
||
|
@retval EFI_INVALID_PARAMETER Any parameter is invalid.
|
||
|
@retval EFI_NOT_FOUND The target for the specified routing data was not found.
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI * EFI_HII_GET_ALT_CFG)(
|
||
|
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
|
||
|
IN CONST EFI_STRING ConfigResp,
|
||
|
IN CONST EFI_GUID *Guid,
|
||
|
IN CONST EFI_STRING Name,
|
||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||
|
IN CONST UINT16 *AltCfgId,
|
||
|
OUT EFI_STRING *AltCfgResp
|
||
|
);
|
||
|
|
||
|
///
|
||
|
/// This protocol defines the configuration routing interfaces
|
||
|
/// between external applications and the HII. There may only be one
|
||
|
/// instance of this protocol in the system.
|
||
|
///
|
||
|
struct _EFI_HII_CONFIG_ROUTING_PROTOCOL {
|
||
|
EFI_HII_EXTRACT_CONFIG ExtractConfig;
|
||
|
EFI_HII_EXPORT_CONFIG ExportConfig;
|
||
|
EFI_HII_ROUTE_CONFIG RouteConfig;
|
||
|
EFI_HII_BLOCK_TO_CONFIG BlockToConfig;
|
||
|
EFI_HII_CONFIG_TO_BLOCK ConfigToBlock;
|
||
|
EFI_HII_GET_ALT_CFG GetAltConfig;
|
||
|
};
|
||
|
|
||
|
extern EFI_GUID gEfiHiiConfigRoutingProtocolGuid;
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|