# Dynamic Tables Framework

Dynamic Tables Framework provides mechanisms to reduce the amount
of effort required in porting firmware to new platforms. The aim is
to provide an implementation capable of generating the firmware
tables from an external source.  This is potentially a management
node, either local or remote, or, where suitable, a file that might
be generated from the system construction.  This initial release
does not fully implement that - the configuration is held in local
UEFI modules.

# Feature Summary

The dynamic tables framework is designed to generate standardised
firmware tables that describe the hardware information at
run-time. A goal of standardised firmware is to have a common
firmware for a platform capable of booting both Windows and Linux
operating systems.

Traditionally the firmware tables are handcrafted using ACPI
Source Language (ASL), Table Definition Language (TDL) and
C-code. This approach can be error prone and involves time
consuming debugging. In addition, it may be desirable to configure
platform hardware at runtime such as: configuring the number of
cores available for use by the OS, or turning SoC features ON or
OFF.

The dynamic tables framework simplifies this by providing a set
of standard table generators, that are implemented as libraries.
These generators query a platform specific component, the
'Configuration Manager', to collate the information required
for generating the tables at run-time.

The framework also provides the ability to implement custom/OEM
generators; thereby facilitating support for custom tables. The
custom generators can also utilize the existing standard generators
and override any functionality if needed.

The framework currently implements a set of standard ACPI table
generators for ARM architecture, that can generate Server Base Boot
Requirement (SBBR) compliant tables. Although, the set of standard
generators implement the functionality required for ARM architecture;
the framework is extensible, and support for other architectures can
be added easily.

The framework currently supports the following table generators for ARM:
* DBG2 - Debug Port Table 2
* DSDT - Differentiated system description table. This is essentially
         a RAW table generator.
* FADT - Fixed ACPI Description Table
* GTDT - Generic Timer Description Table
* IORT - IO Remapping Table
* MADT - Multiple APIC Description Table
* MCFG - PCI Express memory mapped configuration space base address
         Description Table
* PCCT - Platform Communications Channel Table
* PPTT - Processor Properties Topology Table
* SPCR - Serial Port Console Redirection Table
* SRAT - System Resource Affinity Table
* SSDT - Secondary System Description Table. This is essentially
         a RAW table generator.
* HEST - Hardware Error Source Table

## Dynamic AML

ACPI Definition block (e.g. DSDT or SSDT) tables are used to describe system
devices along with other control and power management information. These tables
are written using ACPI Source Language (ASL). The ASL code is compiled using an
ASL compiler (e.g. Intel iASL compiler) to generate ACPI Machine Language (AML)
bytecode.

Since, definition blocks are represented using AML grammar, run-time generation
of definition blocks is complex. Dynamic AML is a feature of Dynamic Tables
framework that provides a solution for dynamic generation of ACPI Definition
block tables.

Dynamic AML introduces the following techniques:
* AML Fixup
* AML Codegen
* AML Fixup + Codegen

### AML Fixup
AML fixup is a technique that involves compiling an ASL template file to
generate AML bytecode. This template AML bytecode can be parsed at run-time
and a fixup code can update the required fields in the AML template.

To simplify AML Fixup, the Dynamic Tables Framework provides an *AmlLib*
library with a rich set of APIs that can be used to fixup the AML code.

### AML Codegen
AML Codegen employs generating small segments of AML code. The *AmlLib*
library provides AML Codegen APIs that generate the AML code segments.

    Example: The following table depicts the AML Codegen APIs and the
             corresponding ASL code that would be generated.

    | AML Codegen API                | ASL Code                       |
    |--------------------------------|--------------------------------|
    |  AmlCodeGenDefinitionBlock (   |  DefinitionBlock (             |
    |    ..,                         |    ...                         |
    |    &RootNode);                 |  ) {                           |
    |  AmlCodeGenScope (             |    Scope (_SB) {               |
    |    "\_SB",                     |                                |
    |    RootNode,                   |                                |
    |    &ScopeNode);                |                                |
    |  AmlCodeGenDevice (            |    Device (CPU0) {             |
    |    "CPU0",                     |                                |
    |    ScopeNode,                  |                                |
    |    &CpuNode);                  |                                |
    |  AmlCodeGenNameString (        |      Name (_HID, "ACPI0007")   |
    |    "_HID",                     |                                |
    |    "ACPI0007",                 |                                |
    |    CpuNode,                    |                                |
    |    &HidNode);                  |                                |
    |  AmlCodeGenNameInteger (       |      Name (_UID, Zero)         |
    |    "_UID",                     |                                |
    |    0,                          |                                |
    |    CpuNode,                    |                                |
    |    &UidNode);                  |                                |
    |                                |      } // Device               |
    |                                |    } // Scope                  |
    |                                |  } // DefinitionBlock          |

### AML Fixup + Codegen
A combination of AML Fixup and AML Codegen could be used for generating
Definition Blocks. For example the AML Fixup could be used to fixup certain
parts of the AML template while the AML Codegen APIs could be used to inserted
small fragments of AML code in the AML template.

### AmlLib Library
Since, AML bytecode represents complex AML grammar, an **AmlLib** library is
introduced to assist parsing and traversing of the AML bytecode at run-time.

The AmlLib library parses a definition block and represents it as an AML
tree. This tree representation is based on the AML grammar defined by the
ACPI 6.3 specification, section - 20 'ACPI Machine Language (AML)
Specification'.

AML objects, methods and data are represented as tree nodes. Since the AML
data is represented as tree nodes, it is possible to traverse the tree, locate
a node and modify the node data. The tree can then be serialized to a buffer
(that represents the definition block). This definition block containing
the fixed up AML code can then be installed as an ACPI table (DSDT/SSDT).

AmlLib provides a rich API to operate on AML data. For example it provides
APIs to update a device's name, the value of a "_UID" object, and the memory
and interrupt number stored in a "_CRS" node.

Although the AmlLib performs checks to a reasonable extent while modifying a
definition block, these checks may not cover all aspects due to the complexity
of the ASL/AML language. It is therefore recommended to review any operation
performed, and validate the generated output.

    Example: The serialized AML code could be validated by
     - Saving the generated AML to a file and comparing with
       a reference output.
     or
     - Disassemble the generated AML using the iASL compiler
       and verifying the output.

### Bespoke ACPI tables

The Dynamic Tables framework supports the creation of several tables using
standard generators, see Feature Summary Section for a list of such tables.

The supported platforms already contain several tables.
If a table is not present for the platform, two alternative processes can be followed:

- define the table in using ASL,
- define the table in packed C structures (also known as RAW).

The two approaches are detailed below.

#### Adding an ASL table for which the Dynamic Tables Framework does not provide a standard generator

This method creates the SSDT table from the ASL source, using a standard generator.
Perform the following steps:

1. Create the table source file, placing it within the ConfigurationManager source tree, e.g.:

Create a file Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/AslTables/NewTableSource.asl
with the following contents:

```
DefinitionBlock ("", "SSDT", 2, "XXXXXX", "XXXXXXXX", 1) {
  Scope(_SB) {
    Device(FLA0) {
      Name(_HID, "XXXX0000")
      Name(_UID, 0)

      // _DSM - Device Specific Method
      Function(_DSM,{IntObj,BuffObj},{BuffObj, IntObj, IntObj, PkgObj})
      {
          W0 = 0x1
          return (W0)
      }
    }
  }
}
```

2. Reference the table source file in ConfigurationMangerDxe.inf

```
 [Sources]
  AslTables/NewTableSource.asl
```

3. Update the ConfigurationManager.h file
Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h

Add an array to hold the AML code:
```
   extern CHAR8 newtablesource_aml_code[];
```

Note: the array name is composed of the ASL source file name all in lower case, followed by the _aml_code postfix.

4. Increment the macro PLAT_ACPI_TABLE_COUNT

5. Add a new CM_STD_OBJ_ACPI_TABLE_INFO structure entry and initialise.

 - the entry contains:
    - the table signature,
    - the table revision (unused in this case),
    - the ID of the standard generator to be used (the SSDT generator in this case).
    - a pointer to the AML code,

```
     // Table defined in the NewTableSource.asl file
     {
       EFI_ACPI_6_4_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
       0, // Unused
       CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt),
       (EFI_ACPI_DESCRIPTION_HEADER*)newtablesource_aml_code
     },
```

#### Add a RAW table for which there is no standard generator

An ACPI table can be defined as a packed C struct in the C source code. This is referred to as the "raw" table format.
The steps to create a table in raw format are detailed below:

1. Define the table in a C source file and populate the ACPI table structure field with the required values.

   For example, create the file Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/RawTable.c

```
    // Example creating the HMAT in raw format
    EFI_ACPI_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE Hmat = {
     ...
    };
```

2. Reference the table source file in ConfigurationMangerDxe.inf

```
 [Sources]
  RawTable.c
```

2. Increment the macro PLAT_ACPI_TABLE_COUNT

3. Add a new CM_STD_OBJ_ACPI_TABLE_INFO structure entry and initialise.

 - the entry contains:
    - the table signature,
    - the table revision,
    - the RAW generator ID.
    - a pointer to the C packed struct that defines the table,

```
    {
      EFI_ACPI_6_3_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE,
      EFI_ACPI_6_3_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_REVISION,
      CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdRaw),
      (EFI_ACPI_DESCRIPTION_HEADER*)&Hmat
    },
```

# Roadmap

The current implementation of the Configuration Manager populates the
platform information statically as a C structure. Further enhancements
to introduce runtime loading of platform information from a platform
information file is planned.

Also support for generating SMBIOS tables is planned and will be added
subsequently.

# Supported Platforms

1. Juno
2. FVP Models

# Build Instructions

1. Set path for the iASL compiler with support for generating a C header
   file as output.

2. Set PACKAGES_PATH to point to the locations of the following repositories:

Example:

> set PACKAGES_PATH=%CD%\edk2;%CD%\edk2-platforms;

  or

> export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-platforms

3. To enable Dynamic tables framework the *'DYNAMIC_TABLES_FRAMEWORK'*
option must be defined. This can be passed as a command line
parameter to the edk2 build system.

Example:

>build -a AARCH64 -p Platform\ARM\JunoPkg\ArmJuno.dsc
   -t GCC **-D DYNAMIC_TABLES_FRAMEWORK**

or

>build -a AARCH64 -p Platform\ARM\VExpressPkg\ArmVExpress-FVP-AArch64.dsc
   -t GCC **-D DYNAMIC_TABLES_FRAMEWORK**

# Prerequisites

Ensure that the latest ACPICA iASL compiler is used for building *Dynamic Tables Framework*.
*Dynamic Tables Framework* has been tested using the following iASL compiler version:
[Version 20200717](https://www.intel.com/content/www/us/en/download/774849/774863/acpi-component-architecture-downloads-previous-releases-2020.html),
dated 17 July, 2020.


#Running CI builds locally

The TianoCore EDKII project has introduced Core CI infrastructure using TianoCore EDKII Tools PIP modules:

   -  *[edk2-pytool-library](https://pypi.org/project/edk2-pytool-library)*

   - *[edk2-pytool-extensions](https://pypi.org/project/edk2-pytool-extensions)*


The instructions to setup the CI environment are in *'edk2\\.pytool\\Readme.md'*

## Building DynamicTablesPkg with Pytools

1. [Optional] Create a Python Virtual Environment - generally once per workspace

    ```
        python -m venv <name of virtual environment>

        e.g. python -m venv edk2-ci
    ```

2. [Optional] Activate Virtual Environment - each time new shell/command window is opened

    ```
        <name of virtual environment>/Scripts/activate

        e.g. On a windows host PC run:
             edk2-ci\Scripts\activate.bat
    ```
3. Install Pytools - generally once per virtual env or whenever pip-requirements.txt changes

    ```
        pip install --upgrade -r pip-requirements.txt
    ```

4. Initialize & Update Submodules - only when submodules updated

    ```
        stuart_setup -c .pytool/CISettings.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH>

        e.g. stuart_setup -c .pytool/CISettings.py TOOL_CHAIN_TAG=GCC
    ```

5. Initialize & Update Dependencies - only as needed when ext_deps change

    ```
        stuart_update -c .pytool/CISettings.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH>

        e.g. stuart_update -c .pytool/CISettings.py TOOL_CHAIN_TAG=GCC
    ```

6. Compile the basetools if necessary - only when basetools C source files change

    ```
        python BaseTools/Edk2ToolsBuild.py -t <ToolChainTag>
    ```

7. Compile DynamicTablesPkg

    ```
        stuart_build-c .pytool/CISettings.py TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH>

        e.g. stuart_ci_build -c .pytool/CISettings.py TOOL_CHAIN_TAG=GCC -p DynamicTablesPkg -a AARCH64 --verbose
    ```

    - use `stuart_build -c .pytool/CISettings.py -h` option to see help on additional options.


# Documentation

Refer to the following presentation from *UEFI Plugfest Seattle 2018*:

[Dynamic Tables Framework: A Step Towards Automatic Generation of Advanced Configuration and Power Interface (ACPI) & System Management BIOS (SMBIOS) Tables](http://www.uefi.org/sites/default/files/resources/Arm_Dynamic%20Tables%20Framework%20A%20Step%20Towards%20Automatic%20Generation%20of%20Advanced%20Configuration%20and%20Power%20Interface%20%28ACPI%29%20%26%20System%20Management%20BIOS%20%28SMBIOS%29%20Tables%20_0.pdf)

## Configuration Manager Objects

The CM_OBJECT_ID type is used to identify the Configuration Manager
    objects.

## Description of Configuration Manager Object ID

| 31     -     28 | 27 - 8 | 7    -    0 |
| :-------------: | :----: | :---------: |
| `Name Space ID` |    0   | `Object ID` |
------------------------------------------

### Name Space ID: Bits [31:28]

|  ID   |  Description                      | Comments |
| ---:  | :--------------------------       | :---     |
| 0000b | Standard                          | |
| 0001b | Arch Common                       | |
| 0010b | ARM                               | |
| 0011b | X64                               | |
| 1111b | Custom/OEM                        | |
| `*`   | All other values are reserved.    | |

### Bits: [27:8] - Reserved, must be zero.

### Bits: [7:0] - Object ID

#### Object ID's in the Standard Namespace:

|  ID   |  Description                      | Comments |
| ---:  | :--------------------------       | :---     |
|   0   | Configuration Manager Revision    | |
|   1   | ACPI Table List                   | |
|   2   | SMBIOS Table List                 | |

#### Object ID's in the ARM Namespace:

|  ID   |  Description                              | Comments |
| ---:  | :--------------------------               | :---     |
|   0   | Reserved                                  | |
|   1   | Boot Architecture Info                    | |
|   2   | GICC Info                                 | |
|   3   | GICD Info                                 | |
|   4   | GIC MSI Frame Info                        | |
|   5   | GIC Redistributor Info                    | |
|   6   | GIC ITS Info                              | |
|   7   | Generic Timer Info                        | |
|   8   | Platform GT Block Info                    | |
|   9   | Generic Timer Block Frame Info            | |
|  10   | Platform Generic Watchdog                 | |
|  11   | ITS Group                                 | |
|  12   | Named Component                           | |
|  13   | Root Complex                              | |
|  14   | SMMUv1 or SMMUv2                          | |
|  15   | SMMUv3                                    | |
|  16   | PMCG                                      | |
|  17   | GIC ITS Identifier Array                  | |
|  18   | ID Mapping Array                          | |
|  19   | SMMU Interrupt Array                      | |
|  20   | CMN 600 Info                              | |
|  21   | Reserved Memory Range Node                | |
|  22   | Memory Range Descriptor                   | |
|  23   | Embedded Trace Extension/Module Info      | |
|  `*`  | All other values are reserved.            | |

#### Object ID's in the Arch Common Namespace:

|  ID   |  Description                              | Comments |
| ---:  | :--------------------------               | :---     |
|   0   |  Reserved                                 | |
|   1   | Power Management Profile Info             | |
|   2   | Serial Port Info                          | |
|   3   | Serial Console Port Info                  | |
|   4   | Serial Debug Port Info                    | |
|   5   | Hypervisor Vendor Id                      | |
|   6   | Fixed feature flags for FADT              | |
|   7   | CM Object Reference                       | |
|   8   | PCI Configuration Space Info              | |
|   9   | PCI Address Map Info                      | |
|  10   | PCI Interrupt Map Info                    | |
|  11   | Memory Affinity Info                      | |
|  12   | Device Handle Acpi                        | |
|  13   | Device Handle PCI                         | |
|  14   | Generic Initiator Affinity Info           | |
|  15   | Low Power Idle State Info                 | |
|  16   | Processor Hierarchy Info                  | |
|  17   | Cache Info                                | |
|  18   | Continuous Performance Control Info       | |
|  19   | Pcc Subspace Type 0 Info                  | |
|  20   | Pcc Subspace Type 1 Info                  | |
|  21   | Pcc Subspace Type 2 Info                  | |
|  22   | Pcc Subspace Type 3 Info                  | |
|  23   | Pcc Subspace Type 4 Info                  | |
|  24   | Pcc Subspace Type 5 Info                  | |
|  25   | P-State Dependency (PSD) Info             | |
|  26   | TPM Interface Info                        | |
|  27   | SPMI Interface Info                       | |
|  28   | SPMI Interrupt and Device/Uid Info        | |
|  29   | Processor C-State Control Info            | |
|  30   | Processor C-State Dependency Info         | |
|  31   | Processor P-State Control Info            | |
|  32   | Processor P-State Status Info             | |
|  33   | Processor P-State Capability Info         | |
|  34   | _STA Device Status Info                   | |
|  `*`  | All other values are reserved.            | |

#### Object ID's in the X64 Namespace:

|  ID   |  Description                              | Comments |
| ---:  | :--------------------------               | :---     |
|   0   | Reserved                                  | |
|   1   | SCI Interrupt Info                        | |
|   2   | SCI Command Info                          | |
|   3   | Legacy Power Management Block Info        | |
|   4   | Legacy GPE Block Info                     | |
|   5   | Power Management Block Info               | |
|   6   | GPE Block Info                            | |
|   7   | Sleep Block Info                          | |
|   8   | Reset Block Info                          | |
|   9   | Miscellaneous Block Info                  | |
|  10   | Windows protection flag Info              | |
|  11   | HPET device Info                          | |
|  12   | MADT Table Info                           | |
|  13   | Local APIC and X2APIC info                | |
|  14   | IO APIC info                              | |
|  15   | Interrupt Source Override info            | |
|  16   | Local APIC and X2APIC NMI info            | |
|  17   | FACS Information                          | |
|  18   | Local APIC and X2APIC Affinity info       | |
|  `*`  | All other values are reserved.            | |
