# 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:

* DSDT - Differentiated system description table. This is essentially
         a RAW table generator.
* SSDT - Secondary System Description Table. This is essentially
         a RAW table generator.
* MADT - Multiple APIC Description Table
* GTDT - Generic Timer Description Table
* DBG2 - Debug Port Table 2
* SPCR - Serial Port Console Redirection Table
* MCFG - PCI Express memory mapped configuration space base address
         Description Table
* IORT - IO Remapping Table
* PPTT - Processor Properties Topology Table
* SRAT - System Resource Affinity Table
* SSDT Serial Port
* SSDT CMN
* SSDT Cpu
* SSDT Pcie
* SSDT Plic/Aplic
* PCCT - Platform Communications Channel Table
* FADT - Fixed ACPI Description Table
* TPM2 - Trusted Platform Module 2 Table
* WSMT - Windows Security Mitigation Table
* HPET - IA-PC High Precision Event Timer Table
* SSDT HPET
* SPMI - Server Platform Management Interface Table
* FACS - Firmware ACPI Control Structure
* CEDT - CXL Early Discovery Table
* SLIT - System Locality Information Table
* RHCT - RISC-V Hart Capabilities Table
* SSDT DMC
* HEST - Hardware Error Source Table
* EINJ - APEI Error Injection 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.

```text
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.

```text
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:

    ```asl
    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

    ```ini
    [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:

    ```c
    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,

    ```c
        // 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

    ```c
        // Example creating the HMAT in raw format
        EFI_ACPI_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE Hmat = {
        ...
        };
    ```

2. Reference the table source file in ConfigurationMangerDxe.inf

    ```ini
    [Sources]
    RawTable.c
    ```

3. Increment the macro PLAT_ACPI_TABLE_COUNT

4. 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,

    ```c
        {
        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

    ```shell
        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

    ```shell
        <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

    ```shell
        pip install --upgrade -r pip-requirements.txt
    ```

4. Initialize & Update Submodules - only when submodules updated

    ```shell
        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

    ```shell
        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

    ```shell
        python BaseTools/Edk2ToolsBuild.py -t <ToolChainTag>
    ```

7. Compile DynamicTablesPkg

    ```shell
        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.            |          |
