/** @file Guid for Pcd DataBase Signature. Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _PCD_DATABASE_SIGNATURE_GUID_H_ #define _PCD_DATABASE_SIGNATURE_GUID_H_ #define PCD_DATA_BASE_SIGNATURE_GUID \ { 0x3c7d193c, 0x682c, 0x4c14, { 0xa6, 0x8f, 0x55, 0x2d, 0xea, 0x4f, 0x43, 0x7e } } extern EFI_GUID gPcdDataBaseSignatureGuid; // // Common definitions // typedef UINT64 SKU_ID; #define PCD_TYPE_SHIFT 28 #define PCD_TYPE_DATA (0x0U << PCD_TYPE_SHIFT) #define PCD_TYPE_HII (0x8U << PCD_TYPE_SHIFT) #define PCD_TYPE_VPD (0x4U << PCD_TYPE_SHIFT) #define PCD_TYPE_STRING (0x1U << PCD_TYPE_SHIFT) #define PCD_TYPE_ALL_SET (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_STRING) #define PCD_DATUM_TYPE_SHIFT 24 #define PCD_DATUM_TYPE_POINTER (0x0U << PCD_DATUM_TYPE_SHIFT) #define PCD_DATUM_TYPE_UINT8 (0x1U << PCD_DATUM_TYPE_SHIFT) #define PCD_DATUM_TYPE_UINT16 (0x2U << PCD_DATUM_TYPE_SHIFT) #define PCD_DATUM_TYPE_UINT32 (0x4U << PCD_DATUM_TYPE_SHIFT) #define PCD_DATUM_TYPE_UINT64 (0x8U << PCD_DATUM_TYPE_SHIFT) #define PCD_DATUM_TYPE_ALL_SET (PCD_DATUM_TYPE_POINTER | \ PCD_DATUM_TYPE_UINT8 | \ PCD_DATUM_TYPE_UINT16 | \ PCD_DATUM_TYPE_UINT32 | \ PCD_DATUM_TYPE_UINT64) #define PCD_DATUM_TYPE_SHIFT2 20 #define PCD_DATUM_TYPE_UINT8_BOOLEAN (0x1U << PCD_DATUM_TYPE_SHIFT2) #define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET | PCD_DATUM_TYPE_UINT8_BOOLEAN)) typedef struct { UINT32 ExTokenNumber; UINT16 TokenNumber; // Token Number for Dynamic-Ex PCD. UINT16 ExGuidIndex; // Index of GuidTable in units of GUID. } DYNAMICEX_MAPPING; typedef struct { UINT32 StringIndex; // Offset in String Table in units of UINT8. UINT32 DefaultValueOffset; // Offset of the Default Value. UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID. UINT16 Offset; // Offset in Variable. UINT32 Attributes; // Variable attributes. UINT16 Property; // Variable property. UINT16 Reserved; } VARIABLE_HEAD; typedef struct { UINT32 Offset; } VPD_HEAD; typedef UINT32 STRING_HEAD; typedef UINT16 SIZE_INFO; typedef struct { UINT32 TokenSpaceCNameIndex; // Offset in String Table in units of UINT8. UINT32 PcdCNameIndex; // Offset in String Table in units of UINT8. } PCD_NAME_INDEX; typedef UINT32 TABLE_OFFSET; typedef struct { GUID Signature; // PcdDataBaseGuid. UINT32 BuildVersion; UINT32 Length; // Length of DEFAULT SKU PCD DB SKU_ID SystemSkuId; // Current SkuId value. UINT32 LengthForAllSkus; // Length of all SKU PCD DB UINT32 UninitDataBaseSize; // Total size for PCD those default value with 0. TABLE_OFFSET LocalTokenNumberTableOffset; TABLE_OFFSET ExMapTableOffset; TABLE_OFFSET GuidTableOffset; TABLE_OFFSET StringTableOffset; TABLE_OFFSET SizeTableOffset; TABLE_OFFSET SkuIdTableOffset; TABLE_OFFSET PcdNameTableOffset; UINT16 LocalTokenCount; // LOCAL_TOKEN_NUMBER for all. UINT16 ExTokenCount; // EX_TOKEN_NUMBER for DynamicEx. UINT16 GuidTableCount; // The Number of Guid in GuidTable. UINT8 Pad[6]; // Pad bytes to satisfy the alignment. // // Default initialized external PCD database binary structure // // Padding is needed to keep necessary alignment // // SKU_ID SkuIdTable[]; // SkuIds system supports. // UINT64 ValueUint64[]; // UINT32 ValueUint32[]; // VPD_HEAD VpdHead[]; // VPD Offset // DYNAMICEX_MAPPING ExMapTable[]; // DynamicEx PCD mapped to LocalIndex in LocalTokenNumberTable. It can be accessed by the ExMapTableOffset. // UINT32 LocalTokenNumberTable[]; // Offset | DataType | PCD Type. It can be accessed by LocalTokenNumberTableOffset. // GUID GuidTable[]; // GUID for DynamicEx and HII PCD variable Guid. It can be accessed by the GuidTableOffset. // STRING_HEAD StringHead[]; // String PCD // PCD_NAME_INDEX PcdNameTable[]; // PCD name index info. It can be accessed by the PcdNameTableOffset. // VARIABLE_HEAD VariableHead[]; // HII PCD // UINT8 StringTable[]; // String for String PCD value and HII PCD Variable Name. It can be accessed by StringTableOffset. // SIZE_INFO SizeTable[]; // MaxSize and CurSize for String PCD. It can be accessed by SizeTableOffset. // UINT16 ValueUint16[]; // UINT8 ValueUint8[]; // BOOLEAN ValueBoolean[]; } PCD_DATABASE_INIT; // // PEI and DXE Pcd driver use the same PCD database // typedef PCD_DATABASE_INIT PEI_PCD_DATABASE; typedef PCD_DATABASE_INIT DXE_PCD_DATABASE; typedef struct { PEI_PCD_DATABASE *PeiDb; DXE_PCD_DATABASE *DxeDb; } PCD_DATABASE; typedef struct { UINT32 Offset : 24; UINT32 Value : 8; } PCD_DATA_DELTA; typedef struct { SKU_ID SkuId; UINT16 DefaultId; UINT8 Reserved[6]; } PCD_DEFAULT_INFO; typedef struct { // // Full size, it must be at 8 byte alignment. // UINT32 DataSize; // // HeaderSize includes HeaderSize fields and DefaultInfo arrays // UINT32 HeaderSize; // // DefaultInfo arrays those have the same default setting. // PCD_DEFAULT_INFO DefaultInfo[1]; // // Default data is stored as variable storage or the array of DATA_DELTA. // } PCD_DEFAULT_DATA; #define PCD_NV_STORE_DEFAULT_BUFFER_SIGNATURE SIGNATURE_32('N', 'S', 'D', 'B') typedef struct { // // PCD_NV_STORE_DEFAULT_BUFFER_SIGNATURE // UINT32 Signature; // // Length of the taken default buffer // UINT32 Length; // // Length of the total reserved buffer // UINT32 MaxLength; // // Reserved for 8 byte alignment // UINT32 Reserved; // one or more PCD_DEFAULT_DATA } PCD_NV_STORE_DEFAULT_BUFFER_HEADER; // // NvStoreDefaultValueBuffer layout: // +-------------------------------------+ // | PCD_NV_STORE_DEFAULT_BUFFER_HEADER | // +-------------------------------------+ // | PCD_DEFAULT_DATA (DEFAULT, Standard)| // +-------------------------------------+ // | PCD_DATA_DELTA (DEFAULT, Standard)| // +-------------------------------------+ // | ...... | // +-------------------------------------+ // | PCD_DEFAULT_DATA (SKU A, Standard) | // +-------------------------------------+ // | PCD_DATA_DELTA (SKU A, Standard) | // +-------------------------------------+ // | ...... | // +-------------------------------------+ // #pragma pack(1) typedef struct { SKU_ID SkuId; SKU_ID SkuIdCompared; UINT32 Length; // PCD_DATA_DELTA DeltaData[] } PCD_DATABASE_SKU_DELTA; // // PCD database layout: // +---------------------------------+ // | PCD_DATABASE_INIT (DEFAULT SKU) | // +---------------------------------+ // | PCD_DATABASE_SKU_DELTA (SKU A) | // +---------------------------------+ // | PCD_DATABASE_SKU_DELTA (SKU B) | // +---------------------------------+ // | ...... | // +---------------------------------+ // #pragma pack() #endif