/** @file

  Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Glossary:
    - ACPI   - Advanced Configuration and Power Interface
    - SMBIOS - System Management BIOS
    - DT     - Device Tree
**/

#ifndef TABLE_GENERATOR_H_
#define TABLE_GENERATOR_H_

/** The TABLE_GENERATOR_ID type describes the Table Generator ID

  Table Generator ID

_______________________________________________________________________________
|  31 | 30 |29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17| 16|
-------------------------------------------------------------------------------
|TNSID|  0 |   TT   |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0 |  0|  0|
_______________________________________________________________________________
_______________________________________________________________________________
|15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0|
-------------------------------------------------------------------------------
|                                 Table ID                                    |
_______________________________________________________________________________

  Bit [31] - Table NameSpace ID (TNSID)
      0 - Standard
      1 - Custom/OEM

  Bit [30] - Reserved, Must be Zero

  Bit [29:28] - Table Type (TT)
       0 - ACPI Table
       1 - SMBIOS Table
       2 - DT (Device Tree) Table
       3 - Reserved (INVALID)

  Bit [27:16] - Reserved, Must Be Zero

  Bit [15:0] - Table ID

    Standard ACPI Table IDs:
       0 - Reserved
       1 - RAW
       2 - FADT
       3 - DSDT
       4 - SSDT
       5 - MADT
       6 - GTDT
       7 - DBG2
       8 - SPCR
       9 - MCFG
      10 - PPTT

    Standard SMBIOS Table IDs:
       0 - Reserved
       1 - RAW
       2 - Table Type00
       3 - Table Type01
       4 - Table Type02
       5 - Table Type03
       6 - Table Type04
       7 - Table Type05
       8 - Table Type06
       9 - Table Type07
      10 - Table Type08
      11 - Table Type09
      12 - Table Type10
      13 - Table Type11
      14 - Table Type12
      15 - Table Type13
      16 - Table Type14
      17 - Table Type15
      18 - Table Type16
      19 - Table Type17
      20 - Table Type18
      21 - Table Type19
      22 - Table Type20
      23 - Table Type21
      24 - Table Type22
      25 - Table Type23
      26 - Table Type24
      27 - Table Type25
      28 - Table Type26
      29 - Table Type27
      30 - Table Type28
      31 - Table Type29
      32 - Table Type30
      33 - Table Type31
      34 - Table Type32
      35 - Table Type33
      36 - Table Type34
      37 - Table Type35
      38 - Table Type36
      39 - Table Type37
      40 - Table Type38
      41 - Table Type39
      42 - Table Type40
      43 - Table Type41
      44 - Table Type42
  45-127 - Reserved
     128 - Table Type126
     129 - Table Type127
**/
typedef UINT32  TABLE_GENERATOR_ID;

/** This enum lists the Table Generator Types.
*/
typedef enum TableGeneratorType {
  ETableGeneratorTypeAcpi = 0,  ///< ACPI Table Generator Type.
  ETableGeneratorTypeSmbios,    ///< SMBIOS Table Generator Type.
  ETableGeneratorTypeDt,        ///< Device Tree Table Generator Type.
  ETableGeneratorTypeReserved
} ETABLE_GENERATOR_TYPE;

/** This enum lists the namespaces for the Table Generators.
*/
typedef enum TableGeneratorNameSpace {
  ETableGeneratorNameSpaceStd = 0,  ///< Standard Namespace.
  ETableGeneratorNameSpaceOem       ///< OEM Namespace.
} ETABLE_GENERATOR_NAMESPACE;

/** A mask for the Table ID bits of TABLE_GENERATOR_ID.
*/
#define TABLE_ID_MASK                 0xFF

/** A mask for the Namespace ID bits of TABLE_GENERATOR_ID.
*/
#define TABLE_NAMESPACEID_MASK        (BIT31)

/** A mask for the Table Type bits of TABLE_GENERATOR_ID.
*/
#define TABLE_TYPE_MASK               (BIT29 | BIT28)

/** Starting bit position for the Table Type bits
*/
#define TABLE_TYPE_BIT_SHIFT          28

/** Starting bit position for the Table Namespace ID bit
*/
#define TABLE_NAMESPACE_ID_BIT_SHIFT  31

/** This macro returns the Table ID from the TableGeneratorId.

  @param [in]  TableGeneratorId  The table generator ID.

  @return the Table ID described by the TableGeneratorId.
**/
#define GET_TABLE_ID(TableGeneratorId)         \
          ((TableGeneratorId) & TABLE_ID_MASK)

/** This macro returns the Table type from the TableGeneratorId.

  @param [in]  TableGeneratorId  The table generator ID.

  @return the Table type described by the TableGeneratorId.
**/
#define GET_TABLE_TYPE(TableGeneratorId)                                   \
          (((TableGeneratorId) & TABLE_TYPE_MASK) >> TABLE_TYPE_BIT_SHIFT)

/** This macro returns the Namespace ID from the TableGeneratorId.

  @param [in]  TableGeneratorId  The table generator ID.

  @return the Namespace described by the TableGeneratorId.
**/
#define GET_TABLE_NAMESPACEID(TableGeneratorId)             \
          (((TableGeneratorId) & TABLE_NAMESPACEID_MASK) >> \
            TABLE_NAMESPACE_ID_BIT_SHIFT)

/** This macro checks if the TableGeneratorId is in the Standard Namespace.

  @param [in]  TableGeneratorId  The table generator ID.

  @return TRUE if the TableGeneratorId is in the Standard Namespace.
**/
#define IS_GENERATOR_NAMESPACE_STD(TableGeneratorId) \
          (                                          \
          GET_TABLE_NAMESPACEID(TableGeneratorId) == \
          ETableGeneratorNameSpaceStd                \
          )

/** This macro creates a TableGeneratorId

  @param [in]  TableType        The table type.
  @param [in]  TableNameSpaceId The namespace ID for the table.
  @param [in]  TableId          The table ID.

  @return a TableGeneratorId calculated from the inputs.
**/
#define CREATE_TABLE_GEN_ID(TableType, TableNameSpaceId, TableId)      \
          ((((TableType) << TABLE_TYPE_BIT_SHIFT) & TABLE_TYPE_MASK) | \
           (((TableNameSpaceId) << TABLE_NAMESPACE_ID_BIT_SHIFT) &     \
             TABLE_NAMESPACEID_MASK) | ((TableId) & TABLE_ID_MASK))

/** Starting bit position for MAJOR revision
*/
#define MAJOR_REVISION_BIT_SHIFT  16

/** A mask for Major revision.
*/
#define MAJOR_REVISION_MASK       0xFFFF

/** A mask for Minor revision.
*/
#define MINOR_REVISION_MASK       0xFFFF

/** This macro generates a Major.Minor version
    where the Major and Minor fields are 16 bit.

  @param [in]  Major  The Major revision.
  @param [in]  Minor  The Minor revision.

  @return a 32 bit representation of the type Major.Minor.
**/
#define CREATE_REVISION(Major, Minor)                                      \
          ((((Major) & MAJOR_REVISION_MASK) << MAJOR_REVISION_BIT_SHIFT) | \
            ((Minor) & MINOR_REVISION_MASK))

/** This macro returns the Major revision

  Extracts Major from the 32 bit representation of the type Major.Minor

  @param [in]  Revision  The Revision value which is 32 bit.

  @return the Major part of the revision.
**/
#define GET_MAJOR_REVISION(Revision)                                       \
          (((Revision) >> MAJOR_REVISION_BIT_SHIFT) & MAJOR_REVISION_MASK)

/** This macro returns the Minor revision

  Extracts Minor from the 32 bit representation of the type Major.Minor

  @param [in]  Revision  The Revision value which is 32 bit.

  @return the Minor part of the revision.
**/
#define GET_MINOR_REVISION(Revision)  ((Revision) & MINOR_REVISION_MASK)

#endif // TABLE_GENERATOR_H_

