/** @file
  Guid for Pcd DataBase Signature.

Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
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
