Files
slimbootloader/BootloaderCommonPkg/Include/Library/ConfigDataLib.h
T
Maurice Ma 8aeed6fd9a Add functions to build CFGDATA from database
This patch added new function to build a full set of the CFGDATA set
from the memory for current platform. It is useful for exporting
current platform CFGDATA for further processing.

Signed-off-by: Maurice Ma <maurice.ma@intel.com>
2020-08-12 12:33:45 -07:00

257 lines
6.4 KiB
C

/** @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_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