/** @file
Guid & data structure for tables defined for reporting firmware configuration data to EFI
Configuration Tables and also for processing JSON payload capsule.


Copyright (c) 2020, American Megatrends International LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __JSON_CAPSULE_GUID_H__
#define __JSON_CAPSULE_GUID_H__

//
// The address reported in the table entry identified by EFI_JSON_CAPSULE_DATA_TABLE_GUID will be
// referenced as physical and will not be fixed up when transition from preboot to runtime phase. The
// addresses reported in these table entries identified by EFI_JSON_CONFIG_DATA_TABLE_GUID and
// EFI_JSON_CAPSULE_RESULT_TABLE_GUID will be referenced as virtual and will be fixed up when
// transition from preboot to runtime phase.
//
#define EFI_JSON_CONFIG_DATA_TABLE_GUID \
    {0x87367f87, 0x1119, 0x41ce, \
    {0xaa, 0xec, 0x8b, 0xe0, 0x11, 0x1f, 0x55, 0x8a }}
#define EFI_JSON_CAPSULE_DATA_TABLE_GUID \
    {0x35e7a725, 0x8dd2, 0x4cac, \
    {0x80, 0x11, 0x33, 0xcd, 0xa8, 0x10, 0x90, 0x56 }}
#define EFI_JSON_CAPSULE_RESULT_TABLE_GUID \
    {0xdbc461c3, 0xb3de, 0x422a,\
    {0xb9, 0xb4, 0x98, 0x86, 0xfd, 0x49, 0xa1, 0xe5 }}
#define EFI_JSON_CAPSULE_ID_GUID \
    {0x67d6f4cd, 0xd6b8,  0x4573, \
    {0xbf, 0x4a, 0xde, 0x5e, 0x25, 0x2d, 0x61, 0xae }}

#pragma pack(1)

typedef struct {
  ///
  /// Version of the structure, initially 0x00000001.
  ///
  UINT32    Version;

  ///
  /// The unique identifier of this capsule.
  ///
  UINT32    CapsuleId;

  ///
  /// The length of the JSON payload immediately following this header, in bytes.
  ///
  UINT32    PayloadLength;

  ///
  /// Variable length buffer containing the JSON payload that should be parsed and applied to the system. The
  /// definition of the JSON schema used in the payload is beyond the scope of this specification.
  ///
  UINT8     Payload[];
} EFI_JSON_CAPSULE_HEADER;

typedef struct {
  ///
  /// The length of the following ConfigData, in bytes.
  ///
  UINT32    ConfigDataLength;

  ///
  /// Variable length buffer containing the JSON payload that describes one group of configuration data within
  /// current system. The definition of the JSON schema used in this payload is beyond the scope of this specification.
  ///
  UINT8     ConfigData[];
} EFI_JSON_CONFIG_DATA_ITEM;

typedef struct {
  ///
  /// Version of the structure, initially 0x00000001.
  ///
  UINT32                       Version;

  ///
  ////The total length of EFI_JSON_CAPSULE_CONFIG_DATA, in bytes.
  ///
  UINT32                       TotalLength;

  ///
  /// Array of configuration data groups.
  ///
  EFI_JSON_CONFIG_DATA_ITEM    ConfigDataList[];
} EFI_JSON_CAPSULE_CONFIG_DATA;

#pragma pack()

extern EFI_GUID  gEfiJsonConfigDataTableGuid;
extern EFI_GUID  gEfiJsonCapsuleDataTableGuid;
extern EFI_GUID  gEfiJsonCapsuleResultTableGuid;
extern EFI_GUID  gEfiJsonCapsuleIdGuid;

#endif
