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