2021-11-10 11:36:23 +00:00
|
|
|
/** @file
|
|
|
|
|
Config data library instance for data access.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>
|
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __CONFIGURATION_DATA_LIB_H__
|
|
|
|
|
#define __CONFIGURATION_DATA_LIB_H__
|
|
|
|
|
|
|
|
|
|
#define CFG_DATA_SIGNATURE SIGNATURE_32 ('C', 'F', 'G', 'D')
|
|
|
|
|
|
|
|
|
|
#define CDATA_BLOB_ATTR_SIGNED (1 << 0)
|
|
|
|
|
#define CDATA_BLOB_ATTR_MERGED (1 << 7)
|
|
|
|
|
|
|
|
|
|
#define CDATA_FLAG_TYPE_MASK (3 << 0)
|
|
|
|
|
#define CDATA_FLAG_TYPE_NORMAL (0 << 0)
|
|
|
|
|
#define CDATA_FLAG_TYPE_ARRAY (1 << 0)
|
|
|
|
|
#define CDATA_FLAG_TYPE_REFER (2 << 0)
|
|
|
|
|
|
|
|
|
|
#define CFG_LOAD_SRC_PDR (1 << 0)
|
|
|
|
|
#define CFG_LOAD_SRC_BIOS (1 << 1)
|
|
|
|
|
|
|
|
|
|
#define PID_TO_MASK(x) (1 << ((x) & 0x1F))
|
|
|
|
|
|
|
|
|
|
#define CDATA_NO_TAG 0x000
|
|
|
|
|
#define CDATA_PLATFORMID_TAG 0x0F0
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
UINT16 PlatformId;
|
|
|
|
|
UINT16 Reserved;
|
|
|
|
|
} PLATFORMID_CFG_DATA;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
UINT16 PlatformId;
|
|
|
|
|
UINT16 Tag : 12;
|
|
|
|
|
UINT16 IsInternal : 1;
|
|
|
|
|
UINT16 Reserved : 3;
|
|
|
|
|
} REFERENCE_CFG_DATA;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
UINT32 Value; // Bit masks on supported platforms
|
|
|
|
|
} CDATA_COND;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
UINT32 ConditionNum : 2; // [1:0] #of condition words present
|
|
|
|
|
UINT32 Length : 10; // [11:2] total size of item (in dwords)
|
|
|
|
|
UINT32 Flags : 4; // [15:12] unused/reserved so far
|
|
|
|
|
UINT32 Version : 4; // [19:16] item (payload) format version
|
|
|
|
|
UINT32 Tag : 12; // [31:20] identifies item (in payload)
|
|
|
|
|
CDATA_COND Condition[0];
|
|
|
|
|
} CDATA_HEADER;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
UINT32 Signature;
|
|
|
|
|
//
|
|
|
|
|
// This header Length
|
|
|
|
|
//
|
|
|
|
|
UINT8 HeaderLength;
|
|
|
|
|
UINT8 Attribute;
|
|
|
|
|
union {
|
|
|
|
|
//
|
|
|
|
|
// Internal configuration data offset in DWORD from the start of data blob.
|
|
|
|
|
// This value is only valid in runtime.
|
|
|
|
|
//
|
|
|
|
|
UINT16 InternalDataOffset;
|
|
|
|
|
//
|
|
|
|
|
// Security version number
|
|
|
|
|
// This is available only in flash. It would be overwritten by CDATA_BLOB.InternalDataOffset in runtime
|
|
|
|
|
//
|
|
|
|
|
UINT8 Svn;
|
|
|
|
|
} ExtraInfo;
|
|
|
|
|
//
|
|
|
|
|
// The total valid configuration data length including this header.
|
|
|
|
|
//
|
|
|
|
|
UINT32 UsedLength;
|
|
|
|
|
//
|
|
|
|
|
// The total space for configration data
|
|
|
|
|
//
|
|
|
|
|
UINT32 TotalLength;
|
|
|
|
|
} CDATA_BLOB;
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
|
|
|
|
|
/* header size */
|
|
|
|
|
UINT8 HeaderSize;
|
|
|
|
|
|
|
|
|
|
/* base table ID */
|
|
|
|
|
UINT8 BaseTableId;
|
|
|
|
|
|
|
|
|
|
/* size in byte for every array entry */
|
|
|
|
|
UINT16 ItemSize;
|
|
|
|
|
|
|
|
|
|
/* array entry count */
|
|
|
|
|
UINT16 ItemCount;
|
|
|
|
|
|
|
|
|
|
/* array entry ID bit offset */
|
|
|
|
|
UINT8 ItemIdBitOff;
|
|
|
|
|
|
|
|
|
|
/* array entry ID bit length */
|
|
|
|
|
UINT8 ItemIdBitLen;
|
|
|
|
|
|
|
|
|
|
/* array entry valid bit offset */
|
|
|
|
|
UINT8 ItemValidBitOff;
|
|
|
|
|
|
|
|
|
|
/* unused */
|
|
|
|
|
UINT8 ItemUnused;
|
|
|
|
|
|
|
|
|
|
/* array entry bit mask, 1 bit per entry to indicate the entry exists or not */
|
|
|
|
|
UINT8 BaseTableBitMask[0];
|
|
|
|
|
|
|
|
|
|
} ARRAY_CFG_HDR;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Load the configuration data blob from media into destination buffer.
|
|
|
|
|
|
|
|
|
|
@param[in] Dst Destination address to load configuration data blob.
|
|
|
|
|
@param[in] Src Source address to load configuration data blob.
|
|
|
|
|
@param[in] Len The destination address buffer size.
|
|
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS Configuration data blob was loaded successfully.
|
|
|
|
|
@retval EFI_NOT_FOUND Configuration data blob cannot be found.
|
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Destination buffer is too small to hold the
|
|
|
|
|
configuration data blob.
|
|
|
|
|
@retval Others Failed to load configuration data blob.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
EFI_STATUS
|
|
|
|
|
EFIAPI
|
|
|
|
|
LoadExternalConfigData (
|
|
|
|
|
IN UINT32 Dst,
|
|
|
|
|
IN UINT32 Src,
|
|
|
|
|
IN UINT32 Len
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Find configuration data header by its tag and platform ID.
|
|
|
|
|
|
|
|
|
|
@param[in] PlatformId Platform ID.
|
|
|
|
|
@param[in] Tag Configuration TAG ID to find.
|
|
|
|
|
|
|
|
|
|
@retval Configuration data header pointer.
|
|
|
|
|
NULL if the tag cannot be found.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
CDATA_HEADER *
|
|
|
|
|
EFIAPI
|
|
|
|
|
FindConfigHdrByPidTag (
|
|
|
|
|
UINT16 PlatformId,
|
|
|
|
|
UINT32 Tag
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Find configuration data header by its tag.
|
|
|
|
|
|
|
|
|
|
@param[in] Tag Configuration TAG ID to find.
|
|
|
|
|
|
|
|
|
|
@retval Configuration data header pointer.
|
|
|
|
|
NULL if the tag cannot be found.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
CDATA_HEADER *
|
|
|
|
|
EFIAPI
|
|
|
|
|
FindConfigHdrByTag (
|
|
|
|
|
UINT32 Tag
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Find configuration data by its tag.
|
|
|
|
|
|
|
|
|
|
@param[in] PlatformId Platform ID.
|
|
|
|
|
@param[in] Tag Configuration TAG ID to find.
|
|
|
|
|
|
|
|
|
|
@retval Configuration data pointer.
|
|
|
|
|
NULL if the tag cannot be found.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
FindConfigDataByPidTag (
|
|
|
|
|
UINT16 PlatformId,
|
|
|
|
|
UINT32 Tag
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Find configuration data by its tag.
|
|
|
|
|
|
|
|
|
|
@param[in] Tag Configuration TAG ID to find.
|
|
|
|
|
|
|
|
|
|
@retval Configuration data pointer.
|
|
|
|
|
NULL if the tag cannot be found.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
FindConfigDataByTag (
|
|
|
|
|
UINT32 Tag
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Add new Config Data
|
|
|
|
|
|
|
|
|
|
Ext/Built-In Config Data for a specific board
|
|
|
|
|
is added to the Config Data Blob present at the
|
|
|
|
|
CfgDataPtr in the LDR_GLOBAL_DATA. Exclude the
|
|
|
|
|
CFG_BLOB header here as it is already there with CfgDataPtr.
|
|
|
|
|
|
|
|
|
|
@param[in] CfgAddPtr Address of the CfgBlob that is to be added
|
|
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS if the CfgBlob is added successfully
|
|
|
|
|
@retval EFI_UNSUPPORTED if not a valid CfgBlob
|
|
|
|
|
@retval EFI_OUT_OF_RESOURCES if not enough memory available to add Config Data
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
EFI_STATUS
|
|
|
|
|
EFIAPI
|
|
|
|
|
AddConfigData (
|
|
|
|
|
IN UINT8 *CfgAddPtr
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Build a full set of CFGDATA for current platform.
|
|
|
|
|
|
|
|
|
|
@param[in] Buffer Buffer pointer to store the full CFGDATA set.
|
|
|
|
|
@param[in] Length Buffer length.
|
|
|
|
|
|
|
|
|
|
@retval EFI_BUFFER_TOO_SMALL The buffer size is too small to store the CFGDATA.
|
|
|
|
|
@retval EFI_INVALID_PARAMETER The buffer pointer is NULL.
|
|
|
|
|
@retval EFI_NOT_FOUND Could not find some CFGDATA tag.
|
|
|
|
|
@retval EFI_SUCCESS The full set of CFGDATA was built successfully.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
EFI_STATUS
|
|
|
|
|
EFIAPI
|
|
|
|
|
BuildConfigData (
|
|
|
|
|
IN UINT8 *Buffer,
|
|
|
|
|
IN UINT32 Length
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Get a full CFGDATA set length.
|
|
|
|
|
|
|
|
|
|
@retval Length of a full CFGDATA set.
|
|
|
|
|
0 indicates no CFGDATA exists.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
UINT32
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetConfigDataSize (
|
|
|
|
|
VOID
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
#endif
|