* [PATCH v2 00/10] Various DynamicTablesPkg modifications @ 2021-09-30 7:48 PierreGondois 2021-09-30 7:48 ` [PATCH v2 01/10] DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib PierreGondois ` (10 more replies) 0 siblings, 11 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> This patch-set aggregates various modifications in the DynamicTablesPkg: - Extract an AcpiTableHelperLib from TableHelperLib to remove the dependency of some utility functions over configuration manager definitions - Add a HexFromAscii() function - Add a AmlGetEisaIdFromString() function - Add a configuration manager object parser - Use %a instead of %s in when printing AmlLib - Update the .ci.yaml once to prepare for other incoming patches - Modify the generic prototype of the AmlResourceDataCodeGen functions. This also means deprecating some functions. The modifications can be seen at: https://github.com/PierreARM/edk2/tree/1718_Various_DynamicTablesPkg_modifications_v2 v2: - Corrections in commit messages. [Sami] - Document returned error code for some functions. [Sami] - Correct wrong field name in Configuration Manager Object parser. [Joey] Pierre Gondois (9): DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib DynamicTablesPkg: Update TableHelperLib.inf DynamicTablesPkg: Rename single char input parameter DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib DynamicTablesPkg: Add AmlGetEisaIdFromString() to AcpiHelperLib DynamicTablesPkg: Use %a formatter in AmlDbgPrint DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml DynamicTablesPkg: Deprecate Crs specific methods in AmlLib DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h Sami Mujawar (1): DynamicTablesPkg: Add Configuration Manager Object parser DynamicTablesPkg/DynamicTables.dsc.inc | 3 +- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 29 + DynamicTablesPkg/DynamicTablesPkg.dec | 4 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/AcpiHelperLib.h | 93 +++ .../Include/Library/AmlLib/AmlLib.h | 225 ++++-- .../Include/Library/TableHelperLib.h | 49 +- .../SsdtCmn600Generator.c | 14 +- .../AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf | 3 +- .../SsdtSerialPortGenerator.c | 3 +- .../SsdtSerialPortLibArm.inf | 4 +- .../Library/Common/AcpiHelperLib/AcpiHelper.c | 210 ++++++ .../Common/AcpiHelperLib/AcpiHelperLib.inf | 25 + .../Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c | 16 +- .../Library/Common/AmlLib/AmlLib.inf | 3 +- .../Library/Common/AmlLib/Api/AmlApi.c | 147 +++- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 194 ++--- .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 67 +- .../SsdtSerialPortFixupLib.c | 6 +- .../SsdtSerialPortFixupLib.inf | 1 + .../ConfigurationManagerObjectParser.c | 678 ++++++++++++++++++ .../ConfigurationManagerObjectParser.h | 73 ++ .../Common/TableHelperLib/TableHelper.c | 96 --- .../Common/TableHelperLib/TableHelperLib.inf | 13 +- 24 files changed, 1579 insertions(+), 378 deletions(-) create mode 100644 DynamicTablesPkg/Include/Library/AcpiHelperLib.h create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h -- 2.17.1 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 01/10] DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 02/10] DynamicTablesPkg: Update TableHelperLib.inf PierreGondois ` (9 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> The TableHelperLib contains helper functions. Some rely on DynamicTablesPkg definitions (they use Configuration Manager objects). Some others are more generic. To allow using these generic functions without including DynamicTablesPkg definitions, move them to a new AcpiHelperLib library. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- Notes: v2: - Change AcpiTableHelperLib to AcpiHelperLib in commit message. [Sami] DynamicTablesPkg/DynamicTables.dsc.inc | 3 +- DynamicTablesPkg/DynamicTablesPkg.dec | 4 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/AcpiHelperLib.h | 60 ++++++++++ .../Include/Library/TableHelperLib.h | 49 -------- .../SsdtCmn600Generator.c | 2 +- .../AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf | 3 +- .../SsdtSerialPortGenerator.c | 3 +- .../SsdtSerialPortLibArm.inf | 4 +- .../Library/Common/AcpiHelperLib/AcpiHelper.c | 109 ++++++++++++++++++ .../Common/AcpiHelperLib/AcpiHelperLib.inf | 25 ++++ .../Library/Common/AmlLib/AmlLib.inf | 3 +- .../SsdtSerialPortFixupLib.c | 2 +- .../SsdtSerialPortFixupLib.inf | 1 + .../Common/TableHelperLib/TableHelper.c | 96 --------------- 15 files changed, 212 insertions(+), 153 deletions(-) create mode 100644 DynamicTablesPkg/Include/Library/AcpiHelperLib.h create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index fa33b7ee67e6..ed221d1681eb 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -1,7 +1,7 @@ ## @file # Dsc include file for Dynamic Tables Framework. # -# Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.<BR> +# Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -13,6 +13,7 @@ [BuildOptions] RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG [LibraryClasses.common] + AcpiHelperLib|DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf AmlLib|DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf SsdtSerialPortFixupLib|DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index b242df010587..9996bdf6f520 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -17,6 +17,10 @@ [Includes] Include [LibraryClasses] + ## @libraryclass Defines a set of Acpi helper methods + # independent from the Dynamic Tables Framework. + AcpiHelperLib|Include/Library/AcpiHelperLib.h + ## @libraryclass Defines a set of APIs for Dynamic AML generation. AmlLib|Include/Library/AmlLib/AmlLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index 33b2a84c9dd9..46b2e667fd25 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -38,6 +38,7 @@ [LibraryClasses.ARM, LibraryClasses.AARCH64] PL011UartLib|ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf [Components.common] + DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf diff --git a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h new file mode 100644 index 000000000000..2731a2e4fb27 --- /dev/null +++ b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h @@ -0,0 +1,60 @@ +/** @file + + Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef ACPI_HELPER_LIB_H_ +#define ACPI_HELPER_LIB_H_ + +/** Is a character upper case +*/ +#define IS_UPPER_CHAR(x) ((x >= 'A') && (x <= 'Z')) + +/** Is a character a decimal digit +*/ +#define IS_DIGIT(x) ((x >= '0') && (x <= '9')) + +/** Is a character an upper case hexadecimal digit +*/ +#define IS_UPPER_HEX(x) (((x >= 'A') && (x <= 'F')) || IS_DIGIT (x)) + +/** Convert a hex number to its ASCII code. + + @param [in] x Hex number to convert. + Must be 0 <= x < 16. + + @return The ASCII code corresponding to x. +**/ +UINT8 +EFIAPI +AsciiFromHex ( + IN UINT8 x + ); + +/** Check if a HID is a valid PNP ID. + + @param [in] Hid The Hid to validate. + + @retval TRUE The Hid is a valid PNP ID. + @retval FALSE The Hid is not a valid PNP ID. +**/ +BOOLEAN +IsValidPnpId ( + IN CONST CHAR8 * Hid + ); + +/** Check if a HID is a valid ACPI ID. + + @param [in] Hid The Hid to validate. + + @retval TRUE The Hid is a valid ACPI ID. + @retval FALSE The Hid is not a valid ACPI ID. +**/ +BOOLEAN +IsValidAcpiId ( + IN CONST CHAR8 * Hid + ); + +#endif // ACPI_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Include/Library/TableHelperLib.h b/DynamicTablesPkg/Include/Library/TableHelperLib.h index 0f93cdbf0895..57af51134546 100644 --- a/DynamicTablesPkg/Include/Library/TableHelperLib.h +++ b/DynamicTablesPkg/Include/Library/TableHelperLib.h @@ -12,18 +12,6 @@ #ifndef TABLE_HELPER_LIB_H_ #define TABLE_HELPER_LIB_H_ -/** Is a character upper case -*/ -#define IS_UPPER_CHAR(x) ((x >= 'A') && (x <= 'Z')) - -/** Is a character a decimal digit -*/ -#define IS_DIGIT(x) ((x >= '0') && (x <= '9')) - -/** Is a character an upper case hexadecimal digit -*/ -#define IS_UPPER_HEX(x) (((x >= 'A') && (x <= 'F')) || IS_DIGIT (x)) - /** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO object from the Configuration Manager. @@ -119,41 +107,4 @@ FindDuplicateValue ( IN PFN_IS_EQUAL EqualTestFunction ); -/** Convert a hex number to its ASCII code. - - @param [in] x Hex number to convert. - Must be 0 <= x < 16. - - @return The ASCII code corresponding to x. -**/ -UINT8 -EFIAPI -AsciiFromHex ( - IN UINT8 x - ); - -/** Check if a HID is a valid PNP ID. - - @param [in] Hid The Hid to validate. - - @retval TRUE The Hid is a valid PNP ID. - @retval FALSE The Hid is not a valid PNP ID. -**/ -BOOLEAN -IsValidPnpId ( - IN CONST CHAR8 * Hid - ); - -/** Check if a HID is a valid ACPI ID. - - @param [in] Hid The Hid to validate. - - @retval TRUE The Hid is a valid ACPI ID. - @retval FALSE The Hid is not a valid ACPI ID. -**/ -BOOLEAN -IsValidAcpiId ( - IN CONST CHAR8 * Hid - ); - #endif // TABLE_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c index 1e8c2bfca5de..cc730cd90fea 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c @@ -23,8 +23,8 @@ #include <AcpiTableGenerator.h> #include <ConfigurationManagerObject.h> #include <ConfigurationManagerHelper.h> +#include <Library/AcpiHelperLib.h> #include <Library/AmlLib/AmlLib.h> -#include <Library/TableHelperLib.h> #include <Protocol/ConfigurationManagerProtocol.h> #include "SsdtCmn600Generator.h" diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf index 821c0d531b98..12b028fcde22 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf @@ -1,7 +1,7 @@ ## @file # Ssdt CMN-600 Table Generator # -# Copyright (c) 2020, Arm Limited. All rights reserved.<BR> +# Copyright (c) 2021, Arm Limited. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -29,6 +29,7 @@ [Packages] DynamicTablesPkg/DynamicTablesPkg.dec [LibraryClasses] + AcpiHelperLib AmlLib BaseLib diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortGenerator.c index 570f53aacf16..1b70fe1db1d7 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortGenerator.c @@ -19,8 +19,9 @@ #include <AcpiTableGenerator.h> #include <ConfigurationManagerObject.h> #include <ConfigurationManagerHelper.h> +#include <Library/AcpiHelperLib.h> +#include <Library/AmlLib/AmlLib.h> #include <Library/SsdtSerialPortFixupLib.h> -#include <Library/TableHelperLib.h> #include <Protocol/ConfigurationManagerProtocol.h> /** ARM standard SSDT Serial Port Table Generator diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf index fb7663e280ad..36e61ea9b132 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf @@ -1,7 +1,7 @@ ## @file # Ssdt Serial Port Table Generator # -# Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> +# Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -27,7 +27,7 @@ [Packages] DynamicTablesPkg/DynamicTablesPkg.dec [LibraryClasses] + AcpiHelperLib AmlLib BaseLib - TableHelperLib SsdtSerialPortFixupLib diff --git a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c new file mode 100644 index 000000000000..85a32269aae5 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c @@ -0,0 +1,109 @@ +/** @file + Acpi Helper + + Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> + +// Module specific include files. +#include <Library/AcpiHelperLib.h> + +/** Convert a hex number to its ASCII code. + + @param [in] x Hex number to convert. + Must be 0 <= x < 16. + + @return The ASCII code corresponding to x. +**/ +UINT8 +EFIAPI +AsciiFromHex ( + IN UINT8 x + ) +{ + if (x < 10) { + return (UINT8)(x + '0'); + } + + if (x < 16) { + return (UINT8)(x - 10 + 'A'); + } + + ASSERT (FALSE); + return (UINT8)-1; +} + +/** Check if a HID is a valid PNP ID. + + @param [in] Hid The Hid to validate. + + @retval TRUE The Hid is a valid PNP ID. + @retval FALSE The Hid is not a valid PNP ID. +**/ +BOOLEAN +IsValidPnpId ( + IN CONST CHAR8 * Hid + ) +{ + UINTN Index; + + if (AsciiStrLen (Hid) != 7) { + return FALSE; + } + + // A valid PNP ID must be of the form "AAA####" + // where A is an uppercase letter and # is a hex digit. + for (Index = 0; Index < 3; Index++) { + if (!IS_UPPER_CHAR (Hid[Index])) { + return FALSE; + } + } + + for (Index = 3; Index < 7; Index++) { + if (!IS_UPPER_HEX (Hid[Index])) { + return FALSE; + } + } + + return TRUE; +} + +/** Check if a HID is a valid ACPI ID. + + @param [in] Hid The Hid to validate. + + @retval TRUE The Hid is a valid ACPI ID. + @retval FALSE The Hid is not a valid ACPI ID. +**/ +BOOLEAN +IsValidAcpiId ( + IN CONST CHAR8 * Hid + ) +{ + UINTN Index; + + if (AsciiStrLen (Hid) != 8) { + return FALSE; + } + + // A valid ACPI ID must be of the form "NNNN####" + // where N is an uppercase letter or a digit ('0'-'9') + // and # is a hex digit. + for (Index = 0; Index < 4; Index++) { + if (!(IS_UPPER_CHAR (Hid[Index]) || IS_DIGIT (Hid[Index]))) { + return FALSE; + } + } + + for (Index = 4; Index < 8; Index++) { + if (!IS_UPPER_HEX (Hid[Index])) { + return FALSE; + } + } + + return TRUE; +} diff --git a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf new file mode 100644 index 000000000000..ba7a04eb5a77 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf @@ -0,0 +1,25 @@ +## @file +# Acpi Helper +# +# Copyright (c) 2021, ARM Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = AcpiHelperLib + FILE_GUID = 45968FB4-A724-46FC-822D-F9E557601F9B + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = AcpiHelperLib + +[Sources] + AcpiHelper.c + +[Packages] + MdePkg/MdePkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + BaseLib diff --git a/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf b/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf index e2babef445d5..723de3ad4482 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf +++ b/DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf @@ -1,7 +1,7 @@ ## @file # AML Generation Library # -# Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> +# Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -66,6 +66,7 @@ [Packages] DynamicTablesPkg/DynamicTablesPkg.dec [LibraryClasses] + AcpiHelperLib BaseLib [BuildOptions] diff --git a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c index f2b4831ad596..8c77f172b795 100644 --- a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c +++ b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c @@ -23,8 +23,8 @@ #include <AcpiTableGenerator.h> #include <ConfigurationManagerObject.h> #include <ConfigurationManagerHelper.h> +#include <Library/AcpiHelperLib.h> #include <Library/AmlLib/AmlLib.h> -#include <Library/TableHelperLib.h> #include <Protocol/ConfigurationManagerProtocol.h> /** C array containing the compiled AML template. diff --git a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf index 54bf71a3b739..965167bdc4e1 100644 --- a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf +++ b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf @@ -25,6 +25,7 @@ [Packages] DynamicTablesPkg/DynamicTablesPkg.dec [LibraryClasses] + AcpiHelperLib AmlLib BaseLib diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c index 9830ce62b3cb..9249e6b87f70 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c @@ -245,99 +245,3 @@ FindDuplicateValue ( } return FALSE; } - -/** Convert a hex number to its ASCII code. - - @param [in] x Hex number to convert. - Must be 0 <= x < 16. - - @return The ASCII code corresponding to x. -**/ -UINT8 -EFIAPI -AsciiFromHex ( - IN UINT8 x - ) -{ - if (x < 10) { - return (UINT8)(x + '0'); - } - - if (x < 16) { - return (UINT8)(x - 10 + 'A'); - } - - ASSERT (FALSE); - return (UINT8)0; -} - -/** Check if a HID is a valid PNP ID. - - @param [in] Hid The Hid to validate. - - @retval TRUE The Hid is a valid PNP ID. - @retval FALSE The Hid is not a valid PNP ID. -**/ -BOOLEAN -IsValidPnpId ( - IN CONST CHAR8 * Hid - ) -{ - UINTN Index; - - if (AsciiStrLen (Hid) != 7) { - return FALSE; - } - - // A valid PNP ID must be of the form "AAA####" - // where A is an uppercase letter and # is a hex digit. - for (Index = 0; Index < 3; Index++) { - if (!IS_UPPER_CHAR (Hid[Index])) { - return FALSE; - } - } - - for (Index = 3; Index < 7; Index++) { - if (!IS_UPPER_HEX (Hid[Index])) { - return FALSE; - } - } - - return TRUE; -} - -/** Check if a HID is a valid ACPI ID. - - @param [in] Hid The Hid to validate. - - @retval TRUE The Hid is a valid ACPI ID. - @retval FALSE The Hid is not a valid ACPI ID. -**/ -BOOLEAN -IsValidAcpiId ( - IN CONST CHAR8 * Hid - ) -{ - UINTN Index; - - if (AsciiStrLen (Hid) != 8) { - return FALSE; - } - - // A valid ACPI ID must be of the form "NNNN####" - // where N is an uppercase letter or a digit ('0'-'9') - // and # is a hex digit. - for (Index = 0; Index < 4; Index++) { - if (!(IS_UPPER_CHAR (Hid[Index]) || IS_DIGIT (Hid[Index]))) { - return FALSE; - } - } - - for (Index = 4; Index < 8; Index++) { - if (!IS_UPPER_HEX (Hid[Index])) { - return FALSE; - } - } - - return TRUE; -} -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 02/10] DynamicTablesPkg: Update TableHelperLib.inf 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois 2021-09-30 7:48 ` [PATCH v2 01/10] DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 03/10] DynamicTablesPkg: Rename single char input parameter PierreGondois ` (8 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> Update the inf file version and BASE_NAME of the library. Remove unused sections. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- .../Library/Common/TableHelperLib/TableHelperLib.inf | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf index 26d82e68501b..5435f74aa0b8 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf @@ -1,14 +1,14 @@ ## @file # Table Helper # -# Copyright (c) 2017 - 2018, ARM Limited. All rights reserved. +# Copyright (c) 2017 - 2021, ARM Limited. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## [Defines] - INF_VERSION = 0x00010019 - BASE_NAME = DynamicTableHelperLib + INF_VERSION = 0x0001001B + BASE_NAME = TableHelperLib FILE_GUID = E315C738-3A39-4D0D-A0AF-8EDFA770AB39 VERSION_STRING = 1.0 MODULE_TYPE = DXE_DRIVER @@ -23,8 +23,3 @@ [Packages] [LibraryClasses] BaseLib - -[Protocols] - -[Guids] - -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 03/10] DynamicTablesPkg: Rename single char input parameter 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois 2021-09-30 7:48 ` [PATCH v2 01/10] DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib PierreGondois 2021-09-30 7:48 ` [PATCH v2 02/10] DynamicTablesPkg: Update TableHelperLib.inf PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 04/10] DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib PierreGondois ` (7 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> The Ecc tool forbids the usage of one char variable: Ecc error 8007: "There should be no use of short (single character) variable names" To follow this policy, rename this one letter parameter. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- Notes: v2: -Document returned error code. [Sami] DynamicTablesPkg/Include/Library/AcpiHelperLib.h | 7 ++++--- .../Library/Common/AcpiHelperLib/AcpiHelper.c | 15 ++++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h index 2731a2e4fb27..53ab19b1d139 100644 --- a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h +++ b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h @@ -22,15 +22,16 @@ /** Convert a hex number to its ASCII code. - @param [in] x Hex number to convert. - Must be 0 <= x < 16. + @param [in] Hex Hex number to convert. + Must be 0 <= x < 16. @return The ASCII code corresponding to x. + -1 if error. **/ UINT8 EFIAPI AsciiFromHex ( - IN UINT8 x + IN UINT8 Hex ); /** Check if a HID is a valid PNP ID. diff --git a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c index 85a32269aae5..434b472cbb14 100644 --- a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c +++ b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c @@ -14,23 +14,24 @@ /** Convert a hex number to its ASCII code. - @param [in] x Hex number to convert. - Must be 0 <= x < 16. + @param [in] Hex Hex number to convert. + Must be 0 <= x < 16. @return The ASCII code corresponding to x. + -1 if error. **/ UINT8 EFIAPI AsciiFromHex ( - IN UINT8 x + IN UINT8 Hex ) { - if (x < 10) { - return (UINT8)(x + '0'); + if (Hex < 10) { + return (UINT8)(Hex + '0'); } - if (x < 16) { - return (UINT8)(x - 10 + 'A'); + if (Hex < 16) { + return (UINT8)(Hex - 10 + 'A'); } ASSERT (FALSE); -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 04/10] DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (2 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 03/10] DynamicTablesPkg: Rename single char input parameter PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 05/10] DynamicTablesPkg: Add AmlGetEisaIdFromString() " PierreGondois ` (6 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> Add HexFromAscii(), converting an hexadecimal ascii char to an integer. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- Notes: v2: -Document returned error code. [Sami] .../Include/Library/AcpiHelperLib.h | 15 +++++++++ .../Library/Common/AcpiHelperLib/AcpiHelper.c | 31 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h index 53ab19b1d139..094392a1a6d0 100644 --- a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h +++ b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h @@ -34,6 +34,21 @@ AsciiFromHex ( IN UINT8 Hex ); +/** Convert an ASCII char representing an hexadecimal number + to its integer value. + + @param [in] Char Char to convert. + Must be between '0'-'9' or 'A'-'F' or 'a'-'f'. + + @return The corresponding integer (between 0-16). + -1 if error. +**/ +UINT8 +EFIAPI +HexFromAscii ( + IN CHAR8 Char + ); + /** Check if a HID is a valid PNP ID. @param [in] Hid The Hid to validate. diff --git a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c index 434b472cbb14..0b566f0502ac 100644 --- a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c +++ b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c @@ -38,6 +38,37 @@ AsciiFromHex ( return (UINT8)-1; } +/** Convert an ASCII char representing an hexadecimal number + to its integer value. + + @param [in] Char Char to convert. + Must be between '0'-'9' or 'A'-'F' or 'a'-'f'. + + @return The corresponding integer (between 0-16). + -1 if error. +**/ +UINT8 +EFIAPI +HexFromAscii ( + IN CHAR8 Char + ) +{ + if ((Char >= '0') && (Char <= '9')) { + return (UINT8)(Char - '0'); + } + + if ((Char >= 'A') && (Char <= 'F')) { + return (UINT8)(Char - 'A' + 10); + } + + if ((Char >= 'a') && (Char <= 'f')) { + return (UINT8)(Char - 'a' + 10); + } + + ASSERT (FALSE); + return (UINT8)-1; +} + /** Check if a HID is a valid PNP ID. @param [in] Hid The Hid to validate. -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 05/10] DynamicTablesPkg: Add AmlGetEisaIdFromString() to AcpiHelperLib 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (3 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 04/10] DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 06/10] DynamicTablesPkg: Add Configuration Manager Object parser PierreGondois ` (5 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> Add a function converting a 7 characters string to its UINT32 EISAID. The algorithm used to create the EISAID is described in the ACPI 6.4 specification, s19.3.4 "ASL Macros". Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- .../Include/Library/AcpiHelperLib.h | 17 +++++ .../Library/Common/AcpiHelperLib/AcpiHelper.c | 69 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h index 094392a1a6d0..a93e95e91987 100644 --- a/DynamicTablesPkg/Include/Library/AcpiHelperLib.h +++ b/DynamicTablesPkg/Include/Library/AcpiHelperLib.h @@ -73,4 +73,21 @@ IsValidAcpiId ( IN CONST CHAR8 * Hid ); +/** Convert a EisaId string to its compressed UINT32 equivalent. + + Cf. ACPI 6.4 specification, s19.3.4 "ASL Macros": "Eisaid" + + @param [in] EisaIdStr Input EisaId string. + @param [out] EisaIdInt Output EisaId UINT32 (compressed). + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlGetEisaIdFromString ( + IN CONST CHAR8 * EisaIdStr, + OUT UINT32 * EisaIdInt + ); + #endif // ACPI_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c index 0b566f0502ac..5afd257e4980 100644 --- a/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c +++ b/DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c @@ -139,3 +139,72 @@ IsValidAcpiId ( return TRUE; } + +/** Convert a EisaId string to its compressed UINT32 equivalent. + + Cf. ACPI 6.4 specification, s19.3.4 "ASL Macros": "Eisaid" + + @param [in] EisaIdStr Input EisaId string. + @param [out] EisaIdInt Output EisaId UINT32 (compressed). + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlGetEisaIdFromString ( + IN CONST CHAR8 * EisaIdStr, + OUT UINT32 * EisaIdInt + ) +{ + if ((EisaIdStr == NULL) || + (!IsValidPnpId (EisaIdStr)) || + (EisaIdInt == NULL)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + /* Cf. ACPI 6.4 specification, s19.3.4 "ASL Macros": "Eisaid" + + Converts and compresses the 7-character text argument into its corresponding + 4-byte numeric EISA ID encoding (Integer). This can be used when declaring + IDs for devices that are EISA IDs. + + The algorithm used to convert the TextID is as shown in the following + example: + Starting with a seven character input string "PNP0303", we want to create + a DWordConst. This string contains a three character manufacturer code + "PNP", a three character hex product identifier "030", and a one character + revision identifier "3". + The compressed manufacturer code is created as follows: + 1) Find hex ASCII value for each letter + 2) Subtract 40h from each ASCII value + 3) Retain 5 least significant bits for each letter and discard remaining + 0's: + + Byte 0: + Bit 7: reserved (0) + Bit 6-2: 1st character of compressed mfg code "P" + Bit 1-0: Upper 2 bits of 2nd character of mfg code "N" + Byte 1: + Bit 7-5: Lower 3 bits of 2nd character of mfg code "N" + Bit 4-0: 3rd character of mfg code "P" + Byte 2: + Bit 7-4: 1st hex digit of product number "0" + Bit 3-0: 2nd hex digit of product number "3" + Byte 3: + Bit 7-4: 3rd hex digit of product number "0" + Bit 3-0: 4th hex digit of product number "3" + */ + *EisaIdInt = SwapBytes32 ( + ((EisaIdStr[0] - 0x40) << 26) | + ((EisaIdStr[1] - 0x40) << 21) | + ((EisaIdStr[2] - 0x40) << 16) | + (HexFromAscii (EisaIdStr[3]) << 12) | + (HexFromAscii (EisaIdStr[4]) << 8) | + (HexFromAscii (EisaIdStr[5]) << 4) | + (HexFromAscii (EisaIdStr[6])) + ); + + return EFI_SUCCESS; +} -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 06/10] DynamicTablesPkg: Add Configuration Manager Object parser 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (4 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 05/10] DynamicTablesPkg: Add AmlGetEisaIdFromString() " PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 07/10] DynamicTablesPkg: Use %a formatter in AmlDbgPrint PierreGondois ` (4 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Sami Mujawar <sami.mujawar@arm.com> The Platform information repository in the Configuration Manager may be dynamically populated, for e.g. by a Hardware Information Parser like FdtHwInfoParser. In such cases it is useful to trace the CM objects that were populated by the parser. Therefore, introduce helper functions that can parse and trace the Configuration Manager Objects. Reviewed-by: Joey Gouly <joey.gouly@arm.com> Signed-off-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- Notes: v2: - Changed wrong field name: GTBlockTimerFrameToken to Token. [Joey] .../Include/Library/TableHelperLib.h | 10 + .../ConfigurationManagerObjectParser.c | 678 ++++++++++++++++++ .../ConfigurationManagerObjectParser.h | 73 ++ .../Common/TableHelperLib/TableHelperLib.inf | 2 + 4 files changed, 763 insertions(+) create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h diff --git a/DynamicTablesPkg/Include/Library/TableHelperLib.h b/DynamicTablesPkg/Include/Library/TableHelperLib.h index 57af51134546..6d362ff99a27 100644 --- a/DynamicTablesPkg/Include/Library/TableHelperLib.h +++ b/DynamicTablesPkg/Include/Library/TableHelperLib.h @@ -107,4 +107,14 @@ FindDuplicateValue ( IN PFN_IS_EQUAL EqualTestFunction ); +/** Parse and print a CmObjDesc. + + @param [in] CmObjDesc The CmObjDesc to parse and print. +**/ +VOID +EFIAPI +ParseCmObjDesc ( + IN CONST CM_OBJ_DESCRIPTOR * CmObjDesc + ); + #endif // TABLE_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c new file mode 100644 index 000000000000..ee2918ab5cc6 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -0,0 +1,678 @@ +/** @file + Configuration Manager Object parser. + + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <ConfigurationManagerObject.h> +#include "ConfigurationManagerObjectParser.h" + +STATIC +VOID +EFIAPI +PrintOemId ( + CONST CHAR8* Format, + UINT8* Ptr + ); + +/** A parser for EArmObjBootArchInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmBootArchInfoParser[] = { + {"BootArchFlags", 2, "0x%x", NULL} +}; + +/** A parser for EArmObjPowerManagementProfileInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmPowerManagementProfileInfoParser[] = { + {"PowerManagementProfile", 1, "0x%x", NULL} +}; + +/** A parser for EArmObjGicCInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicCInfoParser[] = { + {"CPUInterfaceNumber", 4, "0x%x", NULL}, + {"AcpiProcessorUid", 4, "0x%x", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"ParkingProtocolVersion", 4, "0x%x", NULL}, + {"PerformanceInterruptGsiv", 4, "0x%x", NULL}, + {"ParkedAddress", 8, "0x%llx", NULL}, + {"PhysicalBaseAddress", 8, "0x%llx", NULL}, + {"GICV", 8, "0x%llx", NULL}, + {"GICH", 8, "0x%llx", NULL}, + {"VGICMaintenanceInterrupt", 4, "0x%x", NULL}, + {"GICRBaseAddress", 8, "0x%llx", NULL}, + {"MPIDR", 8, "0x%llx", NULL}, + {"ProcessorPowerEfficiencyClass", 1, "0x%x", NULL}, + {"SpeOverflowInterrupt", 2, "0x%x", NULL}, + {"ProximityDomain", 4, "0x%x", NULL}, + {"ClockDomain", 4, "0x%x", NULL}, + {"AffinityFlags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjGicDInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicDInfoParser[] = { + {"PhysicalBaseAddress", 8, "0x%llx", NULL}, + {"SystemVectorBase", 4, "0x%x", NULL}, + {"GicVersion", 1, "0x%x", NULL}, +}; + +/** A parser for EArmObjGicMsiFrameInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicMsiFrameInfoParser[] = { + {"GicMsiFrameId", 4, "0x%x", NULL}, + {"PhysicalBaseAddress", 8, "0x%llx", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"SPICount", 2, "0x%x", NULL}, + {"SPIBase", 2, "0x%x", NULL} +}; + +/** A parser for EArmObjGicRedistributorInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicRedistInfoParser[] = { + {"DiscoveryRangeBaseAddress", 8, "0x%llx", NULL}, + {"DiscoveryRangeLength", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjGicItsInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicItsInfoParser[] = { + {"GicItsId", 4, "0x%x", NULL}, + {"PhysicalBaseAddress", 8, "0x%llx", NULL}, + {"ProximityDomain", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjSerialConsolePortInfo, + EArmObjSerialDebugPortInfo and EArmObjSerialPortInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmSerialPortInfoParser[] = { + {"BaseAddress", 8, "0x%llx", NULL}, + {"Interrupt", 4, "0x%x", NULL}, + {"BaudRate", 8, "0x%llx", NULL}, + {"Clock", 4, "0x%x", NULL}, + {"PortSubtype", 2, "0x%x", NULL}, + {"BaseAddressLength", 8, "0x%llx", NULL}, + {"AccessSize", 1, "0x%d", NULL} +}; + +/** A parser for EArmObjGenericTimerInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGenericTimerInfoParser[] = { + {"CounterControlBaseAddress", 8, "0x%llx", NULL}, + {"CounterReadBaseAddress", 8, "0x%llx", NULL}, + {"SecurePL1TimerGSIV", 4, "0x%x", NULL}, + {"SecurePL1TimerFlags", 4, "0x%x", NULL}, + {"NonSecurePL1TimerGSIV", 4, "0x%x", NULL}, + {"NonSecurePL1TimerFlags", 4, "0x%x", NULL}, + {"VirtualTimerGSIV", 4, "0x%x", NULL}, + {"VirtualTimerFlags", 4, "0x%x", NULL}, + {"NonSecurePL2TimerGSIV", 4, "0x%x", NULL}, + {"NonSecurePL2TimerFlags", 4, "0x%x", NULL}, + {"VirtualPL2TimerGSIV", 4, "0x%x", NULL}, + {"VirtualPL2TimerFlags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjPlatformGTBlockInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGTBlockTimerFrameInfoParser[] = { + {"FrameNumber", 1, "0x%x", NULL}, + {"PhysicalAddressCntBase", 8, "0x%llx", NULL}, + {"PhysicalAddressCntEL0Base", 8, "0x%llx", NULL}, + {"PhysicalTimerGSIV", 4, "0x%x", NULL}, + {"PhysicalTimerFlags", 4, "0x%x", NULL}, + {"VirtualTimerGSIV", 4, "0x%x", NULL}, + {"VirtualTimerFlags", 4, "0x%x", NULL}, + {"CommonFlags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjGTBlockTimerFrameInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGTBlockInfoParser[] = { + {"GTBlockPhysicalAddress", 8, "0x%llx", NULL}, + {"GTBlockTimerFrameCount", 4, "0x%x", NULL}, + {"GTBlockTimerFrameToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjPlatformGenericWatchdogInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGenericWatchdogInfoParser[] = { + {"ControlFrameAddress", 8, "0x%llx", NULL}, + {"RefreshFrameAddress", 8, "0x%llx", NULL}, + {"TimerGSIV", 4, "0x%x", NULL}, + {"Flags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjPciConfigSpaceInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmPciConfigSpaceInfoParser[] = { + {"BaseAddress", 8, "0x%llx", NULL}, + {"PciSegmentGroupNumber", 2, "0x%x", NULL}, + {"StartBusNumber", 1, "0x%x", NULL}, + {"EndBusNumber", 1, "0x%x", NULL} +}; + +/** A parser for EArmObjHypervisorVendorIdentity. +*/ +STATIC CONST CM_OBJ_PARSER CmArmHypervisorVendorIdParser[] = { + {"HypervisorVendorId", 8, "0x%llx", NULL} +}; + +/** A parser for EArmObjFixedFeatureFlags. +*/ +STATIC CONST CM_OBJ_PARSER CmArmFixedFeatureFlagsParser[] = { + {"Flags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjItsGroup. +*/ +STATIC CONST CM_OBJ_PARSER CmArmItsGroupNodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"ItsIdCount", 4, "0x%x", NULL}, + {"ItsIdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjNamedComponent. +*/ +STATIC CONST CM_OBJ_PARSER CmArmNamedComponentNodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"IdMappingCount", 4, "0x%x", NULL}, + {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"CacheCoherent", 4, "0x%x", NULL}, + {"AllocationHints", 1, "0x%x", NULL}, + {"MemoryAccessFlags", 1, "0x%x", NULL}, + {"AddressSizeLimit", 1, "0x%x", NULL}, + {"ObjectName", sizeof (CHAR8*), "%a", NULL} +}; + +/** A parser for EArmObjRootComplex. +*/ +STATIC CONST CM_OBJ_PARSER CmArmRootComplexNodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"IdMappingCount", 4, "0x%x", NULL}, + {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"CacheCoherent", 4, "0x%x", NULL}, + {"AllocationHints", 1, "0x%x", NULL}, + {"MemoryAccessFlags", 1, "0x%x", NULL}, + {"AtsAttribute", 4, "0x%x", NULL}, + {"PciSegmentNumber", 4, "0x%x", NULL}, + {"MemoryAddressSize", 1, "0x%x", NULL} +}; + +/** A parser for EArmObjSmmuV1SmmuV2. +*/ +STATIC CONST CM_OBJ_PARSER CmArmSmmuV1SmmuV2NodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"IdMappingCount", 4, "0x%x", NULL}, + {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"BaseAddress", 8, "0x%llx", NULL}, + {"Span", 8, "0x%llx", NULL}, + {"Model", 4, "0x%x", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"ContextInterruptCount", 4, "0x%x", NULL}, + {"ContextInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"PmuInterruptCount", 4, "0x%x", NULL}, + {"PmuInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"SMMU_NSgIrpt", 4, "0x%x", NULL}, + {"SMMU_NSgIrptFlags", 4, "0x%x", NULL}, + {"SMMU_NSgCfgIrpt", 4, "0x%x", NULL}, + {"SMMU_NSgCfgIrptFlags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjSmmuV3. +*/ +STATIC CONST CM_OBJ_PARSER CmArmSmmuV3NodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"IdMappingCount", 4, "0x%x", NULL}, + {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"BaseAddress", 8, "0x%llx", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"VatosAddress", 8, "0x%llx", NULL}, + {"Model", 4, "0x%x", NULL}, + {"EventInterrupt", 4, "0x%x", NULL}, + {"PriInterrupt", 4, "0x%x", NULL}, + {"GerrInterrupt", 4, "0x%x", NULL}, + {"SyncInterrupt", 4, "0x%x", NULL}, + {"ProximityDomain", 4, "0x%x", NULL}, + {"DeviceIdMappingIndex", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjPmcg. +*/ +STATIC CONST CM_OBJ_PARSER CmArmPmcgNodeParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"IdMappingCount", 4, "0x%x", NULL}, + {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"BaseAddress", 8, "0x%llx", NULL}, + {"OverflowInterrupt", 4, "0x%x", NULL}, + {"Page1BaseAddress", 8, "0x%llx", NULL}, + {"ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjGicItsIdentifierArray. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGicItsIdentifierParser[] = { + {"ItsId", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjIdMappingArray. +*/ +STATIC CONST CM_OBJ_PARSER CmArmIdMappingParser[] = { + {"InputBase", 4, "0x%x", NULL}, + {"NumIds", 4, "0x%x", NULL}, + {"OutputBase", 4, "0x%x", NULL}, + {"OutputReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"Flags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjSmmuInterruptArray. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGenericInterruptParser[] = { + {"Interrupt", 4, "0x%x", NULL}, + {"Flags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjProcHierarchyInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmProcHierarchyInfoParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"ParentToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"GicCToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"NoOfPrivateResources", 4, "0x%x", NULL}, + {"PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjCacheInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmCacheInfoParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"NextLevelOfCacheToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"Size", 4, "0x%x", NULL}, + {"NumberOfSets", 4, "0x%x", NULL}, + {"Associativity", 4, "0x%x", NULL}, + {"Attributes", 1, "0x%x", NULL}, + {"LineSize", 2, "0x%x", NULL} +}; + +/** A parser for EArmObjProcNodeIdInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmProcNodeIdInfoParser[] = { + {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}, + {"VendorId", 4, "0x%p", NULL}, + {"Level1Id", 8, "0x%x", NULL}, + {"Level2Id", 8, "0x%x", NULL}, + {"MajorRev", 2, "0x%x", NULL}, + {"MinorRev", 2, "0x%x", NULL}, + {"SpinRev", 2, "0x%x", NULL} +}; + +/** A parser for EArmObjCmRef. +*/ +STATIC CONST CM_OBJ_PARSER CmArmObjRefParser[] = { + {"ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjMemoryAffinityInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmMemoryAffinityInfoParser[] = { + {"ProximityDomain", 4, "0x%x", NULL}, + {"BaseAddress", 8, "0x%llx", NULL}, + {"Length", 8, "0x%llx", NULL}, + {"Flags", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjDeviceHandleAcpi. +*/ +STATIC CONST CM_OBJ_PARSER CmArmDeviceHandleAcpiParser[] = { + {"Hid", 8, "0x%llx", NULL}, + {"Uid", 4, "0x%x", NULL} +}; + +/** A parser for EArmObjDeviceHandlePci. +*/ +STATIC CONST CM_OBJ_PARSER CmArmDeviceHandlePciParser[] = { + {"SegmentNumber", 2, "0x%x", NULL}, + {"BusNumber", 1, "0x%x", NULL}, + {"DeviceNumber", 1, "0x%x", NULL}, + {"FunctionNumber", 1, "0x%x", NULL} +}; + +/** A parser for EArmObjGenericInitiatorAffinityInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmGenericInitiatorAffinityInfoParser[] = { + {"ProximityDomain", 4, "0x%x", NULL}, + {"Flags", 4, "0x%x", NULL}, + {"DeviceHandleType", 1, "0x%x", NULL}, + {"DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL} +}; + +/** A parser for EArmObjCmn600Info. +*/ +STATIC CONST CM_OBJ_PARSER CmArmCmn600InfoParser[] = { + {"PeriphBaseAddress", 8, "0x%llx", NULL}, + {"PeriphBaseAddressLength", 8, "0x%llx", NULL}, + {"RootNodeBaseAddress", 8, "0x%llx", NULL}, + {"DtcCount", 1, "0x%x", NULL}, + {"DtcInterrupt[0]", 4, "0x%x", NULL}, + {"DtcFlags[0]", 4, "0x%x", NULL}, + {"DtcInterrupt[1]", 4, "0x%x", NULL}, + {"DtcFlags[1]", 4, "0x%x", NULL}, + {"DtcInterrupt[2]", 4, "0x%x", NULL}, + {"DtcFlags[2]", 4, "0x%x", NULL}, + {"DtcInterrupt[3]", 4, "0x%x", NULL}, + {"DtcFlags[3]", 4, "0x%x", NULL} +}; + +/** A parser for Arm namespace objects. +*/ +STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = { + {"EArmObjReserved", NULL, 0}, + {"EArmObjBootArchInfo", CmArmBootArchInfoParser, + ARRAY_SIZE (CmArmBootArchInfoParser)}, + {"EArmObjCpuInfo", NULL, 0}, + {"EArmObjPowerManagementProfileInfo", CmArmPowerManagementProfileInfoParser, + ARRAY_SIZE (CmArmPowerManagementProfileInfoParser)}, + {"EArmObjGicCInfo", CmArmGicCInfoParser, ARRAY_SIZE (CmArmGicCInfoParser)}, + {"EArmObjGicDInfo", CmArmGicDInfoParser, ARRAY_SIZE (CmArmGicDInfoParser)}, + {"EArmObjGicMsiFrameInfo", CmArmGicMsiFrameInfoParser, + ARRAY_SIZE (CmArmGicMsiFrameInfoParser)}, + {"EArmObjGicRedistributorInfo", CmArmGicRedistInfoParser, + ARRAY_SIZE (CmArmGicRedistInfoParser)}, + {"EArmObjGicItsInfo", CmArmGicItsInfoParser, + ARRAY_SIZE (CmArmGicItsInfoParser)}, + {"EArmObjSerialConsolePortInfo", CmArmSerialPortInfoParser, + ARRAY_SIZE (CmArmSerialPortInfoParser)}, + {"EArmObjSerialDebugPortInfo", CmArmSerialPortInfoParser, + ARRAY_SIZE (CmArmSerialPortInfoParser)}, + {"EArmObjGenericTimerInfo", CmArmGenericTimerInfoParser, + ARRAY_SIZE (CmArmGenericTimerInfoParser)}, + {"EArmObjPlatformGTBlockInfo", CmArmGTBlockTimerFrameInfoParser, + ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser)}, + {"EArmObjGTBlockTimerFrameInfo", CmArmGTBlockInfoParser, + ARRAY_SIZE (CmArmGTBlockInfoParser)}, + {"EArmObjPlatformGenericWatchdogInfo", CmArmGenericWatchdogInfoParser, + ARRAY_SIZE (CmArmGenericWatchdogInfoParser)}, + {"EArmObjPciConfigSpaceInfo", CmArmPciConfigSpaceInfoParser, + ARRAY_SIZE (CmArmPciConfigSpaceInfoParser)}, + {"EArmObjHypervisorVendorIdentity", CmArmHypervisorVendorIdParser, + ARRAY_SIZE (CmArmHypervisorVendorIdParser)}, + {"EArmObjFixedFeatureFlags", CmArmFixedFeatureFlagsParser, + ARRAY_SIZE (CmArmFixedFeatureFlagsParser)}, + {"EArmObjItsGroup", CmArmItsGroupNodeParser, + ARRAY_SIZE (CmArmItsGroupNodeParser)}, + {"EArmObjNamedComponent", CmArmNamedComponentNodeParser, + ARRAY_SIZE (CmArmNamedComponentNodeParser)}, + {"EArmObjRootComplex", CmArmRootComplexNodeParser, + ARRAY_SIZE (CmArmRootComplexNodeParser)}, + {"EArmObjSmmuV1SmmuV2", CmArmSmmuV1SmmuV2NodeParser, + ARRAY_SIZE (CmArmSmmuV1SmmuV2NodeParser)}, + {"EArmObjSmmuV3", CmArmSmmuV3NodeParser, + ARRAY_SIZE (CmArmSmmuV3NodeParser)}, + {"EArmObjPmcg", CmArmPmcgNodeParser, ARRAY_SIZE (CmArmPmcgNodeParser)}, + {"EArmObjGicItsIdentifierArray", CmArmGicItsIdentifierParser, + ARRAY_SIZE (CmArmGicItsIdentifierParser)}, + {"EArmObjIdMappingArray", CmArmIdMappingParser, + ARRAY_SIZE (CmArmIdMappingParser)}, + {"EArmObjSmmuInterruptArray", CmArmGenericInterruptParser, + ARRAY_SIZE (CmArmGenericInterruptParser)}, + {"EArmObjProcHierarchyInfo", CmArmProcHierarchyInfoParser, + ARRAY_SIZE (CmArmProcHierarchyInfoParser)}, + {"EArmObjCacheInfo", CmArmCacheInfoParser, + ARRAY_SIZE (CmArmCacheInfoParser)}, + {"EArmObjProcNodeIdInfo", CmArmProcNodeIdInfoParser, + ARRAY_SIZE (CmArmProcNodeIdInfoParser)}, + {"EArmObjCmRef", CmArmObjRefParser, ARRAY_SIZE (CmArmObjRefParser)}, + {"EArmObjMemoryAffinityInfo", CmArmMemoryAffinityInfoParser, + ARRAY_SIZE (CmArmMemoryAffinityInfoParser)}, + {"EArmObjDeviceHandleAcpi", CmArmDeviceHandleAcpiParser, + ARRAY_SIZE (CmArmDeviceHandleAcpiParser)}, + {"EArmObjDeviceHandlePci", CmArmDeviceHandlePciParser, + ARRAY_SIZE (CmArmDeviceHandlePciParser)}, + {"EArmObjGenericInitiatorAffinityInfo", + CmArmGenericInitiatorAffinityInfoParser, + ARRAY_SIZE (CmArmGenericInitiatorAffinityInfoParser)}, + {"EArmObjSerialPortInfo", CmArmSerialPortInfoParser, + ARRAY_SIZE (CmArmSerialPortInfoParser)}, + {"EArmObjCmn600Info", CmArmCmn600InfoParser, + ARRAY_SIZE (CmArmCmn600InfoParser)}, + {"EArmObjMax", NULL, 0}, +}; + +/** A parser for EStdObjCfgMgrInfo. +*/ +STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = { + {"Revision", 4, "0x%x", NULL}, + {"OemId[6]", 6, "%C%C%C%C%C%C", PrintOemId} +}; + +/** A parser for EStdObjAcpiTableList. +*/ +STATIC CONST CM_OBJ_PARSER StdObjAcpiTableInfoParser[] = { + {"AcpiTableSignature", 4, "0x%x", NULL}, + {"AcpiTableRevision", 1, "%d", NULL}, + {"TableGeneratorId", sizeof (ACPI_TABLE_GENERATOR_ID), "0x%x", NULL}, + {"AcpiTableData", sizeof (EFI_ACPI_DESCRIPTION_HEADER*), "0x%p", NULL}, + {"OemTableId", 8, "0x%LLX", NULL}, + {"OemRevision", 4, "0x%x", NULL} +}; + +/** A parser for EStdObjSmbiosTableList. +*/ +STATIC CONST CM_OBJ_PARSER StdObjSmbiosTableInfoParser[] = { + {"TableGeneratorId", sizeof (SMBIOS_TABLE_GENERATOR_ID), "0x%x", NULL}, + {"SmbiosTableData", sizeof (SMBIOS_STRUCTURE*), "0x%p", NULL} +}; + +/** A parser for Standard namespace objects. +*/ +STATIC CONST CM_OBJ_PARSER_ARRAY StdNamespaceObjectParser[] = { + {"EStdObjCfgMgrInfo", StdObjCfgMgrInfoParser, + ARRAY_SIZE (StdObjCfgMgrInfoParser)}, + {"EStdObjAcpiTableList", StdObjAcpiTableInfoParser, + ARRAY_SIZE (StdObjAcpiTableInfoParser)}, + {"EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser, + ARRAY_SIZE (StdObjSmbiosTableInfoParser)}, +}; + +/** Print OEM Id. + + @param [in] Format Format to print the Ptr. + @param [in] Ptr Pointer to the OEM Id. +**/ +STATIC +VOID +EFIAPI +PrintOemId ( + IN CONST CHAR8 * Format, + IN UINT8 * Ptr + ) +{ + DEBUG (( + DEBUG_ERROR, + (Format != NULL) ? Format : "%C%C%C%C%C%C", + Ptr[0], + Ptr[1], + Ptr[2], + Ptr[3], + Ptr[4], + Ptr[5] + )); +} + +/** Print fields of the objects. + + @param [in] Data Pointer to the object to print. + @param [in] Parser Parser containing the object fields. + @param [in] ItemCount Number of entries/fields in the Parser. + @param [in] RemainingSize Parse at most *RemainingSize bytes. + This function decrements the value + from the number bytes consumed. + @param [in] IndentLevel Indentation to use when printing. +**/ +STATIC +VOID +PrintCmObjDesc ( + IN VOID *Data, + IN CONST CM_OBJ_PARSER *Parser, + IN UINTN ItemCount, + IN INTN *RemainingSize, + IN UINT32 IndentLevel + ) +{ + UINT32 Index; + UINT32 IndentIndex; + INTN SubStructSize; + + if ((Data == NULL) || + (Parser == NULL) || + (ItemCount == 0) || + (RemainingSize == NULL)) { + ASSERT (0); + return; + } + + // Print each field. + for (Index = 0; Index < ItemCount; Index++) { + // Check there is enough space in left. + *RemainingSize -= Parser[Index].Length; + if (*RemainingSize < 0) { + DEBUG (( + DEBUG_ERROR, + "\nERROR: %a: Buffer overrun\n", + Parser[Index].NameStr + )); + ASSERT (0); + return; + } + + // Indentation + for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) { + DEBUG ((DEBUG_ERROR, " ")); + } + + DEBUG (( + DEBUG_ERROR, + "%-*a :", + OUTPUT_FIELD_COLUMN_WIDTH - 2 * IndentLevel, + Parser[Index].NameStr + )); + if (Parser[Index].PrintFormatter != NULL) { + Parser[Index].PrintFormatter (Parser[Index].Format, Data); + } else if (Parser[Index].Format != NULL) { + switch (Parser[Index].Length) { + case 1: + DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT8*)Data)); + break; + case 2: + DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT16*)Data)); + break; + case 4: + DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT32*)Data)); + break; + case 8: + DEBUG ((DEBUG_ERROR, Parser[Index].Format, ReadUnaligned64(Data))); + break; + default: + DEBUG (( + DEBUG_ERROR, + "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n", + Parser[Index].NameStr, + Parser[Index].Length + )); + } // switch + } else if (Parser[Index].SubObjParser != NULL) { + SubStructSize = Parser[Index].Length; + + DEBUG ((DEBUG_ERROR, "\n")); + PrintCmObjDesc ( + Data, + Parser[Index].SubObjParser, + Parser[Index].SubObjItemCount, + &SubStructSize, + IndentLevel + 1 + ); + } else { + ASSERT (0); + DEBUG (( + DEBUG_ERROR, + "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n", + Parser[Index].NameStr, + Parser[Index].Length + )); + } + DEBUG ((DEBUG_ERROR, "\n")); + Data += Parser[Index].Length; + } // for +} + +/** Parse and print a CmObjDesc. + + @param [in] CmObjDesc The CmObjDesc to parse and print. +**/ +VOID +EFIAPI +ParseCmObjDesc ( + IN CONST CM_OBJ_DESCRIPTOR * CmObjDesc + ) +{ + UINTN ObjId; + UINTN NameSpaceId; + UINT32 ObjIndex; + UINT32 ObjectCount; + INTN RemainingSize; + CONST CM_OBJ_PARSER_ARRAY * ParserArray; + + if ((CmObjDesc == NULL) || (CmObjDesc->Data == NULL)) { + return; + } + + NameSpaceId = GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId); + ObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); + + switch (NameSpaceId) { + case EObjNameSpaceStandard: + if (ObjId >= EStdObjMax) { + ASSERT (0); + return; + } + ParserArray = &StdNamespaceObjectParser[ObjId]; + break; + case EObjNameSpaceArm: + if (ObjId >= EArmObjMax) { + ASSERT (0); + return; + } + ParserArray = &ArmNamespaceObjectParser[ObjId]; + break; + default: + // Not supported + ASSERT (0); + return; + } // switch + + ObjectCount = CmObjDesc->Count; + RemainingSize = CmObjDesc->Size; + + for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) { + DEBUG (( + DEBUG_ERROR, + "\n%-*a [%d/%d]:\n", + OUTPUT_FIELD_COLUMN_WIDTH, + ParserArray->ObjectName, + ObjIndex + 1, + ObjectCount + )); + PrintCmObjDesc ( + CmObjDesc->Data, + ParserArray->Parser, + ParserArray->ItemCount, + &RemainingSize, + 1 + ); + } // for +} diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h new file mode 100644 index 000000000000..e229df7095d9 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h @@ -0,0 +1,73 @@ +/** @file + Configuration Manager Object parser. + + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CONFIGURATION_MANAGER_OBJECT_PARSER_H_ +#define CONFIGURATION_MANAGER_OBJECT_PARSER_H_ + +#define OUTPUT_FIELD_COLUMN_WIDTH 32 + +/** Function prototype to format a field print. + + @param [in] Format Format string for tracing the data as specified by + the 'Format' member of ACPI_PARSER. + @param [in] Ptr Pointer to the start of the buffer. +**/ +typedef VOID (EFIAPI *FNPTR_PRINT_FORMATTER)(CONST CHAR8* Format, UINT8* Ptr); + +/** + The CM_OBJ_PARSER structure describes the fields of an CmObject and + provides means for the parser to interpret and trace appropriately. + + ParseAcpi() uses the format string specified by 'Format' for tracing + the field data. +*/ +typedef struct CmObjParser CM_OBJ_PARSER; +struct CmObjParser { + + /// String describing the Cm Object + CONST CHAR8* NameStr; + + /// The length of the field. + UINT32 Length; + + /// Optional Print() style format string for tracing the data. If not + /// used this must be set to NULL. + CONST CHAR8* Format; + + /// Optional pointer to a print formatter function which + /// is typically used to trace complex field information. + /// If not used this must be set to NULL. + /// The Format string is passed to the PrintFormatter function + /// but may be ignored by the implementation code. + FNPTR_PRINT_FORMATTER PrintFormatter; + + /// Optional pointer to print the fields of another CM_OBJ_PARSER + /// structure. This is useful to print sub-structures. + CONST CM_OBJ_PARSER *SubObjParser; + + /// Count of items in the SubObj. + UINTN SubObjItemCount; +}; + +/** + A structure mapping an array of Configuration Manager Object parsers + with their object names. +*/ +typedef struct CmObjParserArray { + + /// Object name + CONST CHAR8 * ObjectName; + + /// Function pointer to the parser + CONST CM_OBJ_PARSER * Parser; + + /// Count of items + UINTN ItemCount; +} CM_OBJ_PARSER_ARRAY; + +#endif // CONFIGURATION_MANAGER_OBJECT_PARSER_H_ diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf index 5435f74aa0b8..abbf4bc38cab 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf @@ -15,6 +15,8 @@ [Defines] LIBRARY_CLASS = TableHelperLib [Sources] + ConfigurationManagerObjectParser.c + ConfigurationManagerObjectParser.h TableHelper.c [Packages] -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 07/10] DynamicTablesPkg: Use %a formatter in AmlDbgPrint 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (5 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 06/10] DynamicTablesPkg: Add Configuration Manager Object parser PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 08/10] DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml PierreGondois ` (3 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> The correct formatter to print a CHAR8 char in edk2 is '%a'. Replace the '%s' formatters by '%a'. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- .../Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c b/DynamicTablesPkg/Library/Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c index 00a61a2fe63a..7f4cd3404dbb 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c @@ -2,7 +2,7 @@ AML Print Function. Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR> - Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> + Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -199,7 +199,7 @@ AmlDbgPrintNodeHeader ( DEBUG (( DEBUG_INFO, - "%3d | %-15s | ", + "%3d | %-15a | ", Level, NodeTypeStrTbl[Node->NodeType] )); @@ -227,7 +227,7 @@ AmlDbgPrintDataNode ( AmlDbgPrintNodeHeader ((AML_NODE_HEADER*)DataNode, Level); - DEBUG ((DEBUG_INFO, "%-36s | ", NodeDataTypeStrTbl[DataNode->DataType])); + DEBUG ((DEBUG_INFO, "%-36a | ", NodeDataTypeStrTbl[DataNode->DataType])); DEBUG ((DEBUG_INFO, "0x%04x | ", DataNode->Size)); if ((DataNode->DataType == EAmlNodeDataTypeNameString) || @@ -300,13 +300,13 @@ AmlDbgPrintObjectNode ( // Print a string corresponding to the field object OpCode/SubOpCode. if (AmlNodeHasAttribute (ObjectNode, AML_IS_FIELD_ELEMENT)) { - DEBUG ((DEBUG_INFO, "%-15s ", AmlGetFieldOpCodeStr ( + DEBUG ((DEBUG_INFO, "%-15a ", AmlGetFieldOpCodeStr ( ObjectNode->AmlByteEncoding->OpCode, 0 ))); } else { // Print a string corresponding to the object OpCode/SubOpCode. - DEBUG ((DEBUG_INFO, "%-15s | ", AmlGetOpCodeStr ( + DEBUG ((DEBUG_INFO, "%-15a | ", AmlGetOpCodeStr ( ObjectNode->AmlByteEncoding->OpCode, ObjectNode->AmlByteEncoding->SubOpCode) )); @@ -378,19 +378,19 @@ AmlDbgPrintTableHeader ( DEBUG ((DEBUG_INFO, "Lvl | Node Type |\n")); DEBUG (( DEBUG_INFO, - " | %-15s | Signature| Length | Rev | CSum | OemId | " + " | %-15a | Signature| Length | Rev | CSum | OemId | " "OemTableId | OemRev | CreatorId| CreatorRev\n", NodeTypeStrTbl[EAmlNodeRoot] )); DEBUG (( DEBUG_INFO, - " | %-15s | Op | SubOp| OpName | MaxI| Attribute | " + " | %-15a | Op | SubOp| OpName | MaxI| Attribute | " "PkgLen | NodeName (opt)\n", NodeTypeStrTbl[EAmlNodeObject] )); DEBUG (( DEBUG_INFO, - " | %-15s | Data Type | Size | " + " | %-15a | Data Type | Size | " "Buffer\n", NodeTypeStrTbl[EAmlNodeData] )); -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 08/10] DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (6 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 07/10] DynamicTablesPkg: Use %a formatter in AmlDbgPrint PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 09/10] DynamicTablesPkg: Deprecate Crs specific methods in AmlLib PierreGondois ` (2 subsequent siblings) 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> To prepare edk2 upstream CI for incoming modifications: 1- Disable the Ecc check 9005: "Only Doxygen commands '@bug', '@todo', [...], '@{', '@}' are allowed to mark the code Unknown doxygen command [...]" 2- Disable the Ecc check 8003 for the following keyword: "DISABLE_NEW_DEPRECATED_INTERFACES" Indeed, this error has been corrected on the latest version of BaseTools, but is still triggered when using the older python packages containing the BaseTools. 3- Add word exceptions for the cspell tool. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index 211615bc80e2..bfa282926e48 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -5,6 +5,28 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent ## { + "EccCheck": { + ## Exception sample looks like below: + ## "ExceptionList": [ + ## "<ErrorID>", "<KeyWord>" + ## ] + "ExceptionList": [ + # "The #ifndef at the start of an include file should use + # both prefix and postfix underscore characters, '_'" + # This error is not triggered for the latest BaseTools code. + # @TODO The error should be re-enabled when the python packages + # containing the BaseTools are updated to the latest version. + "8003", "DISABLE_NEW_DEPRECATED_INTERFACES", + "9005", "@defgroup", # Use extra Doxygen commands + "9005", "@ingroup", # Use extra Doxygen commands + "9005", "@mainpage", # Use extra Doxygen commands + "9005", "@ref", # Use extra Doxygen commands + ], + ## Both file path and directory path are accepted. + "IgnoreFiles": [ + ] + }, + ## options defined .pytool/Plugin/CompilerPlugin "CompilerPlugin": { "DscPath": "DynamicTablesPkg.dsc" @@ -23,6 +45,7 @@ ## options defined .pytool/Plugin/DependencyCheck "DependencyCheck": { "AcceptableDependencies": [ + "ArmPkg/ArmPkg.dec", "ArmPlatformPkg/ArmPlatformPkg.dec", "EmbeddedPkg/EmbeddedPkg.dec", "DynamicTablesPkg/DynamicTablesPkg.dec", @@ -77,19 +100,25 @@ "CCIDX", "CCSIDR", "countof", + "edynamic", "EOBJECT", "invoc", + "ITARGETSR", "GTBLOCK", "lgreater", "lless", "MPIDR", "PERIPHBASE", + "phandle", "pytool", + "Rdword", "Roadmap", "ROOTNODEBASE", "ssdtcmn", "ssdtserialporttemplate", "SMMUV", + "ssdtpcieosctemplate", + "SSDTPC", "standardised", "TABLEEX", "TNSID", -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 09/10] DynamicTablesPkg: Deprecate Crs specific methods in AmlLib 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (7 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 08/10] DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-09-30 7:48 ` [PATCH v2 10/10] DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h PierreGondois 2021-10-01 12:04 ` [PATCH v2 00/10] Various DynamicTablesPkg modifications Sami Mujawar 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> Some functions in the AmlLib have 'Crs' in their name and can only be applied to '_CRS' AML objects. To re-use them on AML objects that have different names: - Rename them and remove the '_CRS' name check. - Create aliases having of the 'Crs' function prototypes. These aliases are available when DISABLE_NEW_DEPRECATED_INTERFACES is not defined. They will be deprecated in a near future. The deprecated functions are: - AmlNameOpCrsGetFirstRdNode() - AmlNameOpCrsGetNextRdNode() - AmlCodeGenCrsAddRdInterrupt() Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- Notes: v2: - List deprecated APIs in commit message. [Sami] .../Include/Library/AmlLib/AmlLib.h | 189 +++++++++++++++--- .../SsdtCmn600Generator.c | 6 +- .../Library/Common/AmlLib/Api/AmlApi.c | 147 +++++++++++--- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 105 ++++++++-- .../SsdtSerialPortFixupLib.c | 4 +- 5 files changed, 371 insertions(+), 80 deletions(-) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index 1dcb93861436..c40808343fce 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -1,7 +1,7 @@ /** @file AML Lib. - Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> + Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -301,7 +301,7 @@ AmlNameOpUpdateString ( IN CONST CHAR8 * NewName ); -/** Get the first Resource Data element contained in a "_CRS" object. +/** Get the first Resource Data element contained in a named object. In the following ASL code, the function will return the Resource Data node corresponding to the "QWordMemory ()" ASL macro. @@ -312,27 +312,26 @@ AmlNameOpUpdateString ( ) Note: - - The "_CRS" object must be declared using ASL "Name (Declare Named Object)". - - "_CRS" declared using ASL "Method (Declare Control Method)" is not - supported. + "_CRS" names defined as methods are not handled by this function. + They must be defined as names, using the "Name ()" statement. @ingroup UserApis - @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. - Must have an OpCode=AML_NAME_OP, SubOpCode=0. - NameOp object nodes are defined in ASL - using the "Name ()" function. - @param [out] OutRdNode Pointer to the first Resource Data element of - the "_CRS" object. A Resource Data element - is stored in a data node. + @param [in] NameOpNode NameOp object node defining a named object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [out] OutRdNode Pointer to the first Resource Data element of + the named object. A Resource Data element + is stored in a data node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI -AmlNameOpCrsGetFirstRdNode ( - IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, +AmlNameOpGetFirstRdNode ( + IN AML_OBJECT_NODE_HANDLE NameOpNode, OUT AML_DATA_NODE_HANDLE * OutRdNode ); @@ -347,13 +346,14 @@ AmlNameOpCrsGetFirstRdNode ( } ) - The CurrRdNode Resource Data node must be defined in an object named "_CRS" - and defined by a "Name ()" ASL function. + Note: + "_CRS" names defined as methods are not handled by this function. + They must be defined as names, using the "Name ()" statement. @ingroup UserApis @param [in] CurrRdNode Pointer to the current Resource Data element of - the "_CRS" variable. + the named object. @param [out] OutRdNode Pointer to the Resource Data element following the CurrRdNode. Contain a NULL pointer if CurrRdNode is the @@ -366,7 +366,7 @@ AmlNameOpCrsGetFirstRdNode ( **/ EFI_STATUS EFIAPI -AmlNameOpCrsGetNextRdNode ( +AmlNameOpGetNextRdNode ( IN AML_DATA_NODE_HANDLE CurrRdNode, OUT AML_DATA_NODE_HANDLE * OutRdNode ); @@ -423,7 +423,7 @@ AmlUpdateRdQWord ( This function creates a Resource Data element corresponding to the "Interrupt ()" ASL function, stores it in an AML Data Node. - It then adds it after the input CurrRdNode in the list of resource data + It then adds it after the input NameOpNode in the list of resource data element. The Resource Data effectively created is an Extended Interrupt Resource @@ -437,14 +437,9 @@ AmlUpdateRdQWord ( - attach this node to an AML tree; - delete this node. - Note: The _CRS node must be defined using the ASL Name () function. - e.g. Name (_CRS, ResourceTemplate () { - ... - } + @ingroup CodeGenApis - @ingroup UserApis - - @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + @param [in] NameOpNode NameOp object node defining a named object. Must have an OpCode=AML_NAME_OP, SubOpCode=0. NameOp object nodes are defined in ASL using the "Name ()" function. @@ -465,8 +460,8 @@ AmlUpdateRdQWord ( **/ EFI_STATUS EFIAPI -AmlCodeGenCrsAddRdInterrupt ( - IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, +AmlCodeGenAddRdInterrupt ( + IN AML_OBJECT_NODE_HANDLE NameOpNode, IN BOOLEAN ResourceConsumer, IN BOOLEAN EdgeTriggered, IN BOOLEAN ActiveLow, @@ -628,4 +623,142 @@ AmlCodeGenScope ( OUT AML_OBJECT_NODE_HANDLE * NewObjectNode OPTIONAL ); +// DEPRECATED APIS +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + +/** DEPRECATED API + + Get the first Resource Data element contained in a "_CRS" object. + + In the following ASL code, the function will return the Resource Data + node corresponding to the "QWordMemory ()" ASL macro. + Name (_CRS, ResourceTemplate() { + QWordMemory (...) {...}, + Interrupt (...) {...} + } + ) + + Note: + - The "_CRS" object must be declared using ASL "Name (Declare Named Object)". + - "_CRS" declared using ASL "Method (Declare Control Method)" is not + supported. + + @ingroup UserApis + + @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [out] OutRdNode Pointer to the first Resource Data element of + the "_CRS" object. A Resource Data element + is stored in a data node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlNameOpCrsGetFirstRdNode ( + IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, + OUT AML_DATA_NODE_HANDLE * OutRdNode + ); + +/** DEPRECATED API + + Get the Resource Data element following the CurrRdNode Resource Data. + + In the following ASL code, if CurrRdNode corresponds to the first + "QWordMemory ()" ASL macro, the function will return the Resource Data + node corresponding to the "Interrupt ()" ASL macro. + Name (_CRS, ResourceTemplate() { + QwordMemory (...) {...}, + Interrupt (...) {...} + } + ) + + The CurrRdNode Resource Data node must be defined in an object named "_CRS" + and defined by a "Name ()" ASL function. + + @ingroup UserApis + + @param [in] CurrRdNode Pointer to the current Resource Data element of + the "_CRS" variable. + @param [out] OutRdNode Pointer to the Resource Data element following + the CurrRdNode. + Contain a NULL pointer if CurrRdNode is the + last Resource Data element in the list. + The "End Tag" is not considered as a resource + data element and is not returned. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlNameOpCrsGetNextRdNode ( + IN AML_DATA_NODE_HANDLE CurrRdNode, + OUT AML_DATA_NODE_HANDLE * OutRdNode + ); + +/** DEPRECATED API + + Add an Interrupt Resource Data node. + + This function creates a Resource Data element corresponding to the + "Interrupt ()" ASL function, stores it in an AML Data Node. + + It then adds it after the input CurrRdNode in the list of resource data + element. + + The Resource Data effectively created is an Extended Interrupt Resource + Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" + for more information about Extended Interrupt Resource Data. + + The Extended Interrupt contains one single interrupt. + + This function allocates memory to create a data node. It is the caller's + responsibility to either: + - attach this node to an AML tree; + - delete this node. + + Note: The _CRS node must be defined using the ASL Name () function. + e.g. Name (_CRS, ResourceTemplate () { + ... + } + + @ingroup CodeGenApis + + @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [in] ResourceConsumer The device consumes the specified interrupt + or produces it for use by a child device. + @param [in] EdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] ActiveLow The interrupt is active-high or active-low. + @param [in] Shared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList Interrupt list. Must be non-NULL. + @param [in] IrqCount Interrupt count. Must be non-zero. + + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenCrsAddRdInterrupt ( + IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, + IN BOOLEAN ResourceConsumer, + IN BOOLEAN EdgeTriggered, + IN BOOLEAN ActiveLow, + IN BOOLEAN Shared, + IN UINT32 * IrqList, + IN UINT8 IrqCount + ); + +#endif // DISABLE_NEW_DEPRECATED_INTERFACES + #endif // AML_LIB_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c index cc730cd90fea..fb93a5d2e70c 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c @@ -286,7 +286,7 @@ FixupCmn600Info ( // Get the first Rd node in the "_CRS" object. // This is the PERIPHBASE node. - Status = AmlNameOpCrsGetFirstRdNode (NameOpCrsNode, &CmnPeriphBaseRdNode); + Status = AmlNameOpGetFirstRdNode (NameOpCrsNode, &CmnPeriphBaseRdNode); if (EFI_ERROR (Status)) { goto error_handler; } @@ -309,7 +309,7 @@ FixupCmn600Info ( // Get the QWord node corresponding to the ROOTNODEBASE. // It is the second Resource Data element in the BufferNode's // variable list of arguments. - Status = AmlNameOpCrsGetNextRdNode ( + Status = AmlNameOpGetNextRdNode ( CmnPeriphBaseRdNode, &CmnRootNodeBaseRdNode ); @@ -338,7 +338,7 @@ FixupCmn600Info ( // Resource Data nodes. for (Index = 0; Index < Cmn600Info->DtcCount; Index++) { DtcInt = &Cmn600Info->DtcInterrupt[Index]; - Status = AmlCodeGenCrsAddRdInterrupt ( + Status = AmlCodeGenAddRdInterrupt ( NameOpCrsNode, ((DtcInt->Flags & EFI_ACPI_EXTENDED_INTERRUPT_FLAG_PRODUCER_CONSUMER_MASK) != 0), diff --git a/DynamicTablesPkg/Library/Common/AmlLib/Api/AmlApi.c b/DynamicTablesPkg/Library/Common/AmlLib/Api/AmlApi.c index fdf04acc6212..6f9e3f6f2805 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/Api/AmlApi.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/Api/AmlApi.c @@ -1,7 +1,7 @@ /** @file AML Api. - Copyright (c) 2020, Arm Limited. All rights reserved.<BR> + Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -222,7 +222,7 @@ AmlNameOpUpdateString ( return Status; } -/** Get the first Resource Data element contained in a "_CRS" object. +/** Get the first Resource Data element contained in a named object. In the following ASL code, the function will return the Resource Data node corresponding to the "QWordMemory ()" ASL macro. @@ -233,35 +233,33 @@ AmlNameOpUpdateString ( ) Note: - - The "_CRS" object must be declared using ASL "Name (Declare Named Object)". - - "_CRS" declared using ASL "Method (Declare Control Method)" is not - supported. + "_CRS" names defined as methods are not handled by this function. + They must be defined as names, using the "Name ()" statement. - @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. - Must have an OpCode=AML_NAME_OP, SubOpCode=0. - NameOp object nodes are defined in ASL - using the "Name ()" function. - @param [out] OutRdNode Pointer to the first Resource Data element of - the "_CRS" object. A Resource Data element - is stored in a data node. + @param [in] NameOpNode NameOp object node defining a named object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [out] OutRdNode Pointer to the first Resource Data element of + the named object. A Resource Data element + is stored in a data node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI -AmlNameOpCrsGetFirstRdNode ( - IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, +AmlNameOpGetFirstRdNode ( + IN AML_OBJECT_NODE_HANDLE NameOpNode, OUT AML_DATA_NODE_HANDLE * OutRdNode ) { AML_OBJECT_NODE_HANDLE BufferOpNode; AML_DATA_NODE_HANDLE FirstRdNode; - if ((NameOpCrsNode == NULL) || - (AmlGetNodeType ((AML_NODE_HANDLE)NameOpCrsNode) != EAmlNodeObject) || - (!AmlNodeHasOpCode (NameOpCrsNode, AML_NAME_OP, 0)) || - (!AmlNameOpCompareName (NameOpCrsNode, "_CRS")) || + if ((NameOpNode == NULL) || + (AmlGetNodeType ((AML_NODE_HANDLE)NameOpNode) != EAmlNodeObject) || + (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0)) || (OutRdNode == NULL)) { ASSERT (0); return EFI_INVALID_PARAMETER; @@ -269,10 +267,10 @@ AmlNameOpCrsGetFirstRdNode ( *OutRdNode = NULL; - // Get the _CRS value which is represented as a BufferOp object node - // which is the 2nd fixed argument (i.e. index 1). + // Get the value of the variable which is represented as a BufferOp object + // node which is the 2nd fixed argument (i.e. index 1). BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( - NameOpCrsNode, + NameOpNode, EAmlParseIndexTerm1 ); if ((BufferOpNode == NULL) || @@ -310,11 +308,12 @@ AmlNameOpCrsGetFirstRdNode ( } ) - The CurrRdNode Resource Data node must be defined in an object named "_CRS" - and defined by a "Name ()" ASL function. + Note: + "_CRS" names defined as methods are not handled by this function. + They must be defined as names, using the "Name ()" statement. @param [in] CurrRdNode Pointer to the current Resource Data element of - the "_CRS" object. + the named object. @param [out] OutRdNode Pointer to the Resource Data element following the CurrRdNode. Contain a NULL pointer if CurrRdNode is the @@ -327,12 +326,12 @@ AmlNameOpCrsGetFirstRdNode ( **/ EFI_STATUS EFIAPI -AmlNameOpCrsGetNextRdNode ( +AmlNameOpGetNextRdNode ( IN AML_DATA_NODE_HANDLE CurrRdNode, OUT AML_DATA_NODE_HANDLE * OutRdNode ) { - AML_OBJECT_NODE_HANDLE NameOpCrsNode; + AML_OBJECT_NODE_HANDLE NameOpNode; AML_OBJECT_NODE_HANDLE BufferOpNode; if ((CurrRdNode == NULL) || @@ -356,12 +355,11 @@ AmlNameOpCrsGetNextRdNode ( } // The parent of the BufferOpNode must be a NameOp node. - NameOpCrsNode = (AML_OBJECT_NODE_HANDLE)AmlGetParent ( - (AML_NODE_HANDLE)BufferOpNode - ); - if ((NameOpCrsNode == NULL) || - (!AmlNodeHasOpCode (NameOpCrsNode, AML_NAME_OP, 0)) || - (!AmlNameOpCompareName (NameOpCrsNode, "_CRS"))) { + NameOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetParent ( + (AML_NODE_HANDLE)BufferOpNode + ); + if ((NameOpNode == NULL) || + (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0))) { ASSERT (0); return EFI_INVALID_PARAMETER; } @@ -380,3 +378,88 @@ AmlNameOpCrsGetNextRdNode ( return EFI_SUCCESS; } + +// DEPRECATED APIS +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + +/** DEPRECATED API + + Get the first Resource Data element contained in a "_CRS" object. + + In the following ASL code, the function will return the Resource Data + node corresponding to the "QWordMemory ()" ASL macro. + Name (_CRS, ResourceTemplate() { + QWordMemory (...) {...}, + Interrupt (...) {...} + } + ) + + Note: + - The "_CRS" object must be declared using ASL "Name (Declare Named Object)". + - "_CRS" declared using ASL "Method (Declare Control Method)" is not + supported. + + @ingroup UserApis + + @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [out] OutRdNode Pointer to the first Resource Data element of + the "_CRS" object. A Resource Data element + is stored in a data node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlNameOpCrsGetFirstRdNode ( + IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, + OUT AML_DATA_NODE_HANDLE * OutRdNode + ) +{ + return AmlNameOpGetFirstRdNode (NameOpCrsNode, OutRdNode); +} + +/** DEPRECATED API + + Get the Resource Data element following the CurrRdNode Resource Data. + + In the following ASL code, if CurrRdNode corresponds to the first + "QWordMemory ()" ASL macro, the function will return the Resource Data + node corresponding to the "Interrupt ()" ASL macro. + Name (_CRS, ResourceTemplate() { + QwordMemory (...) {...}, + Interrupt (...) {...} + } + ) + + The CurrRdNode Resource Data node must be defined in an object named "_CRS" + and defined by a "Name ()" ASL function. + + @ingroup UserApis + + @param [in] CurrRdNode Pointer to the current Resource Data element of + the "_CRS" variable. + @param [out] OutRdNode Pointer to the Resource Data element following + the CurrRdNode. + Contain a NULL pointer if CurrRdNode is the + last Resource Data element in the list. + The "End Tag" is not considered as a resource + data element and is not returned. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AmlNameOpCrsGetNextRdNode ( + IN AML_DATA_NODE_HANDLE CurrRdNode, + OUT AML_DATA_NODE_HANDLE * OutRdNode + ) +{ + return AmlNameOpGetNextRdNode (CurrRdNode, OutRdNode); +} + +#endif // DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index d40a27410dd6..c7348aa5daf7 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -1,7 +1,7 @@ /** @file AML Resource Data Code Generation. - Copyright (c) 2020, Arm Limited. All rights reserved.<BR> + Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -161,7 +161,7 @@ AmlCodeGenInterrupt ( This function creates a Resource Data element corresponding to the "Interrupt ()" ASL function, stores it in an AML Data Node. - It then adds it after the input CurrRdNode in the list of resource data + It then adds it after the input NameOpNode in the list of resource data element. The Resource Data effectively created is an Extended Interrupt Resource @@ -175,12 +175,12 @@ AmlCodeGenInterrupt ( - attach this node to an AML tree; - delete this node. - Note: The _CRS node must be defined using the ASL Name () function. - e.g. Name (_CRS, ResourceTemplate () { - ... - } + Note: + The named node must be defined using the ASL "Name ()" statement. + E.g. Name (_CRS, ResourceTemplate () { ... }) + Methods cannot be modified with this function. - @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + @param [in] NameOpNode NameOp object node defining a named object. Must have an OpCode=AML_NAME_OP, SubOpCode=0. NameOp object nodes are defined in ASL using the "Name ()" function. @@ -201,8 +201,8 @@ AmlCodeGenInterrupt ( **/ EFI_STATUS EFIAPI -AmlCodeGenCrsAddRdInterrupt ( - IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, +AmlCodeGenAddRdInterrupt ( + IN AML_OBJECT_NODE_HANDLE NameOpNode, IN BOOLEAN ResourceConsumer, IN BOOLEAN EdgeTriggered, IN BOOLEAN ActiveLow, @@ -215,18 +215,17 @@ AmlCodeGenCrsAddRdInterrupt ( AML_OBJECT_NODE_HANDLE BufferOpNode; - if ((IrqList == NULL) || - (IrqCount == 0) || - (!AmlNodeHasOpCode (NameOpCrsNode, AML_NAME_OP, 0)) || - (!AmlNameOpCompareName (NameOpCrsNode, "_CRS"))) { + if ((IrqList == NULL) || + (IrqCount == 0) || + (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0))) { ASSERT (0); return EFI_INVALID_PARAMETER; } - // Get the _CRS value which is represented as a BufferOp object node + // Get the value which is represented as a BufferOp object node // which is the 2nd fixed argument (i.e. index 1). BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( - NameOpCrsNode, + NameOpNode, EAmlParseIndexTerm1 ); if ((BufferOpNode == NULL) || @@ -254,3 +253,79 @@ AmlCodeGenCrsAddRdInterrupt ( return Status; } + +// DEPRECATED APIS +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES + +/** DEPRECATED API + + Add an Interrupt Resource Data node. + + This function creates a Resource Data element corresponding to the + "Interrupt ()" ASL function, stores it in an AML Data Node. + + It then adds it after the input CurrRdNode in the list of resource data + element. + + The Resource Data effectively created is an Extended Interrupt Resource + Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" + for more information about Extended Interrupt Resource Data. + + The Extended Interrupt contains one single interrupt. + + This function allocates memory to create a data node. It is the caller's + responsibility to either: + - attach this node to an AML tree; + - delete this node. + + Note: The _CRS node must be defined using the ASL Name () function. + e.g. Name (_CRS, ResourceTemplate () { + ... + } + + @ingroup UserApis + + @param [in] NameOpCrsNode NameOp object node defining a "_CRS" object. + Must have an OpCode=AML_NAME_OP, SubOpCode=0. + NameOp object nodes are defined in ASL + using the "Name ()" function. + @param [in] ResourceConsumer The device consumes the specified interrupt + or produces it for use by a child device. + @param [in] EdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] ActiveLow The interrupt is active-high or active-low. + @param [in] Shared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList Interrupt list. Must be non-NULL. + @param [in] IrqCount Interrupt count. Must be non-zero. + + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenCrsAddRdInterrupt ( + IN AML_OBJECT_NODE_HANDLE NameOpCrsNode, + IN BOOLEAN ResourceConsumer, + IN BOOLEAN EdgeTriggered, + IN BOOLEAN ActiveLow, + IN BOOLEAN Shared, + IN UINT32 * IrqList, + IN UINT8 IrqCount + ) +{ + return AmlCodeGenAddRdInterrupt ( + NameOpCrsNode, + NameOpNode, + ResourceConsumer, + EdgeTriggered, + ActiveLow, + Shared, + IrqList, + IrqCount + ); +} + +#endif // DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c index 8c77f172b795..6966410b2c34 100644 --- a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c +++ b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c @@ -275,7 +275,7 @@ FixupCrs ( } // Get the first Rd node in the "_CRS" object. - Status = AmlNameOpCrsGetFirstRdNode (NameOpCrsNode, &QWordRdNode); + Status = AmlNameOpGetFirstRdNode (NameOpCrsNode, &QWordRdNode); if (EFI_ERROR (Status)) { return Status; } @@ -298,7 +298,7 @@ FixupCrs ( // Get the Interrupt node. // It is the second Resource Data element in the NameOpCrsNode's // variable list of arguments. - Status = AmlNameOpCrsGetNextRdNode (QWordRdNode, &InterruptRdNode); + Status = AmlNameOpGetNextRdNode (QWordRdNode, &InterruptRdNode); if (EFI_ERROR (Status)) { return Status; } -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 10/10] DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (8 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 09/10] DynamicTablesPkg: Deprecate Crs specific methods in AmlLib PierreGondois @ 2021-09-30 7:48 ` PierreGondois 2021-10-01 12:04 ` [PATCH v2 00/10] Various DynamicTablesPkg modifications Sami Mujawar 10 siblings, 0 replies; 12+ messages in thread From: PierreGondois @ 2021-09-30 7:48 UTC (permalink / raw) To: devel, Sami Mujawar, Alexei.Fedorov, Joey Gouly From: Pierre Gondois <Pierre.Gondois@arm.com> Rework all the functions to to have a generic prototype: - First take take the resource data specific arguments. E.g.: for a Register(): the AddressSpace, BitWidth, ... - The penultimate parameter is a NameOpNode. The resource data created is appended to the ResourceTemplate() contained in the NameOpNode. - The last parameter is a pointer holding the created resource data. A least one of the two last parameter must be provided. One of them can be omitted. This generic interface allows to either: - Add the resource data to a NameOpNode. This is a common case for the Ssdt tables generator. - Get the created resource data and let the caller place it in an AML tree. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> --- .../Include/Library/AmlLib/AmlLib.h | 60 +++-- .../SsdtCmn600Generator.c | 8 +- .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 235 +++++++----------- .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 67 +++-- 4 files changed, 150 insertions(+), 220 deletions(-) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index c40808343fce..6824cf3a6c82 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -418,41 +418,36 @@ AmlUpdateRdQWord ( IN UINT64 BaseAddressLength ); -/** Add an Interrupt Resource Data node. - - This function creates a Resource Data element corresponding to the - "Interrupt ()" ASL function, stores it in an AML Data Node. - - It then adds it after the input NameOpNode in the list of resource data - element. +/** Code generation for the "Interrupt ()" ASL function. The Resource Data effectively created is an Extended Interrupt Resource - Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" - for more information about Extended Interrupt Resource Data. + Data. Cf ACPI 6.4: + - s6.4.3.6 "Extended Interrupt Descriptor" + - s19.6.64 "Interrupt (Interrupt Resource Descriptor Macro)" - The Extended Interrupt contains one single interrupt. - - This function allocates memory to create a data node. It is the caller's - responsibility to either: - - attach this node to an AML tree; - - delete this node. + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. @ingroup CodeGenApis + @param [in] ResourceConsumer The device consumes the specified interrupt + or produces it for use by a child device. + @param [in] EdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] ActiveLow The interrupt is active-high or active-low. + @param [in] Shared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList Interrupt list. Must be non-NULL. + @param [in] IrqCount Interrupt count. Must be non-zero. @param [in] NameOpNode NameOp object node defining a named object. - Must have an OpCode=AML_NAME_OP, SubOpCode=0. - NameOp object nodes are defined in ASL - using the "Name ()" function. - @param [in] ResourceConsumer The device consumes the specified interrupt - or produces it for use by a child device. - @param [in] EdgeTriggered The interrupt is edge triggered or - level triggered. - @param [in] ActiveLow The interrupt is active-high or active-low. - @param [in] Shared The interrupt can be shared with other - devices or not (Exclusive). - @param [in] IrqList Interrupt list. Must be non-NULL. - @param [in] IrqCount Interrupt count. Must be non-zero. - + If provided, append the new resource data node + to the list of resource data elements of this + node. + @param [out] NewRdNode If provided and success, + contain the created node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. @@ -460,14 +455,15 @@ AmlUpdateRdQWord ( **/ EFI_STATUS EFIAPI -AmlCodeGenAddRdInterrupt ( - IN AML_OBJECT_NODE_HANDLE NameOpNode, +AmlCodeGenRdInterrupt ( IN BOOLEAN ResourceConsumer, IN BOOLEAN EdgeTriggered, IN BOOLEAN ActiveLow, IN BOOLEAN Shared, - IN UINT32 * IrqList, - IN UINT8 IrqCount + IN UINT32 *IrqList, + IN UINT8 IrqCount, + IN AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); /** AML code generation for DefinitionBlock. diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c index fb93a5d2e70c..19b7b128a08d 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600Generator.c @@ -338,8 +338,8 @@ FixupCmn600Info ( // Resource Data nodes. for (Index = 0; Index < Cmn600Info->DtcCount; Index++) { DtcInt = &Cmn600Info->DtcInterrupt[Index]; - Status = AmlCodeGenAddRdInterrupt ( - NameOpCrsNode, + + Status = AmlCodeGenRdInterrupt ( ((DtcInt->Flags & EFI_ACPI_EXTENDED_INTERRUPT_FLAG_PRODUCER_CONSUMER_MASK) != 0), ((DtcInt->Flags & @@ -349,7 +349,9 @@ FixupCmn600Info ( ((DtcInt->Flags & EFI_ACPI_EXTENDED_INTERRUPT_FLAG_SHARABLE_MASK) != 0), (UINT32*)&DtcInt->Interrupt, - 1 + 1, + NameOpCrsNode, + NULL ); if (EFI_ERROR (Status)) { goto error_handler; diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index c7348aa5daf7..089597a6c906 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -24,11 +24,15 @@ If NewRdNode is not NULL, update its value to RdNode. @param [in] RdNode Newly created Resource Data node. - @param [in] ParentNode If not NULL, add the generated node - to the end of the variable list of - argument of the ParentNode, but - before the "End Tag" Resource Data. - Must be a BufferOpNode. + RdNode is deleted if an error occurs. + @param [in] ParentNode If not NULL, ParentNode must: + - be a NameOp node, i.e. have the AML_NAME_OP + opcode (cf "Name ()" ASL statement) + - contain a list of resource data elements + (cf "ResourceTemplate ()" ASL statement) + RdNode is then added at the end of the variable + list of resource data elements, but before the + "End Tag" Resource Data. @param [out] NewRdNode If not NULL, update the its value to RdNode. @retval EFI_SUCCESS The function completed successfully. @@ -43,57 +47,81 @@ LinkRdNode ( OUT AML_DATA_NODE ** NewRdNode ) { - EFI_STATUS Status; - EFI_STATUS Status1; + EFI_STATUS Status; + EFI_STATUS Status1; + AML_OBJECT_NODE *BufferOpNode; if (NewRdNode != NULL) { *NewRdNode = RdNode; } - // Add RdNode as the last element, but before the EndTag. if (ParentNode != NULL) { - Status = AmlAppendRdNode (ParentNode, RdNode); + // Check this is a NameOp node. + if ((!AmlNodeHasOpCode (ParentNode, AML_NAME_OP, 0))) { + ASSERT (0); + Status = EFI_INVALID_PARAMETER; + goto error_handler; + } + + // Get the value which is represented as a BufferOp object node + // which is the 2nd fixed argument (i.e. index 1). + BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( + ParentNode, + EAmlParseIndexTerm1 + ); + if ((BufferOpNode == NULL) || + (AmlGetNodeType ((AML_NODE_HANDLE)BufferOpNode) != EAmlNodeObject) || + (!AmlNodeHasOpCode (BufferOpNode, AML_BUFFER_OP, 0))) { + ASSERT (0); + Status = EFI_INVALID_PARAMETER; + goto error_handler; + } + + // Add RdNode as the last element, but before the EndTag. + Status = AmlAppendRdNode (BufferOpNode, RdNode); if (EFI_ERROR (Status)) { ASSERT (0); - Status1 = AmlDeleteTree ((AML_NODE_HEADER*)RdNode); - ASSERT_EFI_ERROR (Status1); - // Return original error. - return Status; + goto error_handler; } } - return EFI_SUCCESS; + return Status; + +error_handler: + Status1 = AmlDeleteTree ((AML_NODE_HEADER*)RdNode); + ASSERT_EFI_ERROR (Status1); + // Return original error. + return Status; } /** Code generation for the "Interrupt ()" ASL function. - This function creates a Resource Data element corresponding to the - "Interrupt ()" ASL function and stores it in an AML Data Node. - The Resource Data effectively created is an Extended Interrupt Resource - Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" - for more information about Extended Interrupt Resource Data. + Data. Cf ACPI 6.4: + - s6.4.3.6 "Extended Interrupt Descriptor" + - s19.6.64 "Interrupt (Interrupt Resource Descriptor Macro)" - This function allocates memory to create a data node. It is the caller's - responsibility to either: - - attach this node to an AML tree; - - delete this node. + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. - @param [in] ResourceConsumer The device consumes the specified interrupt - or produces it for use by a child device. - @param [in] EdgeTriggered The interrupt is edge triggered or - level triggered. - @param [in] ActiveLow The interrupt is active-high or active-low. - @param [in] Shared The interrupt can be shared with other - devices or not (Exclusive). - @param [in] IrqList Interrupt list. Must be non-NULL. - @param [in] IrqCount Interrupt count. Must be non-zero. - @param [in] ParentNode If not NULL, add the generated node - to the end of the variable list of - argument of the ParentNode, but - before the "End Tag" Resource Data. - Must be a BufferOpNode. - @param [out] NewRdNode If success, contains the generated node. + @param [in] ResourceConsumer The device consumes the specified interrupt + or produces it for use by a child device. + @param [in] EdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] ActiveLow The interrupt is active-high or active-low. + @param [in] Shared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList Interrupt list. Must be non-NULL. + @param [in] IrqCount Interrupt count. Must be non-zero. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this + node. + @param [out] NewRdNode If provided and success, + contain the created node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. @@ -101,15 +129,15 @@ LinkRdNode ( **/ EFI_STATUS EFIAPI -AmlCodeGenInterrupt ( - IN BOOLEAN ResourceConsumer, - IN BOOLEAN EdgeTriggered, - IN BOOLEAN ActiveLow, - IN BOOLEAN Shared, - IN UINT32 * IrqList, - IN UINT8 IrqCount, - IN AML_OBJECT_NODE * ParentNode, OPTIONAL - OUT AML_DATA_NODE ** NewRdNode OPTIONAL +AmlCodeGenRdInterrupt ( + IN BOOLEAN ResourceConsumer, + IN BOOLEAN EdgeTriggered, + IN BOOLEAN ActiveLow, + IN BOOLEAN Shared, + IN UINT32 *IrqList, + IN UINT8 IrqCount, + IN AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ) { EFI_STATUS Status; @@ -120,16 +148,19 @@ AmlCodeGenInterrupt ( if ((IrqList == NULL) || (IrqCount == 0) || - ((ParentNode == NULL) && (NewRdNode == NULL))) { + ((NameOpNode == NULL) && (NewRdNode == NULL))) { ASSERT (0); return EFI_INVALID_PARAMETER; } + // Header RdInterrupt.Header.Header.Bits.Name = ACPI_LARGE_EXTENDED_IRQ_DESCRIPTOR_NAME; RdInterrupt.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG; RdInterrupt.Header.Length = sizeof (EFI_ACPI_EXTENDED_INTERRUPT_DESCRIPTOR) - sizeof (ACPI_LARGE_RESOURCE_HEADER); + + // Body RdInterrupt.InterruptVectorFlags = (ResourceConsumer ? BIT0 : 0) | (EdgeTriggered ? BIT1 : 0) | (ActiveLow ? BIT2 : 0) | @@ -153,105 +184,7 @@ AmlCodeGenInterrupt ( return Status; } - return LinkRdNode (RdNode, ParentNode, NewRdNode); -} - -/** Add an Interrupt Resource Data node. - - This function creates a Resource Data element corresponding to the - "Interrupt ()" ASL function, stores it in an AML Data Node. - - It then adds it after the input NameOpNode in the list of resource data - element. - - The Resource Data effectively created is an Extended Interrupt Resource - Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" - for more information about Extended Interrupt Resource Data. - - The Extended Interrupt contains one single interrupt. - - This function allocates memory to create a data node. It is the caller's - responsibility to either: - - attach this node to an AML tree; - - delete this node. - - Note: - The named node must be defined using the ASL "Name ()" statement. - E.g. Name (_CRS, ResourceTemplate () { ... }) - Methods cannot be modified with this function. - - @param [in] NameOpNode NameOp object node defining a named object. - Must have an OpCode=AML_NAME_OP, SubOpCode=0. - NameOp object nodes are defined in ASL - using the "Name ()" function. - @param [in] ResourceConsumer The device consumes the specified interrupt - or produces it for use by a child device. - @param [in] EdgeTriggered The interrupt is edge triggered or - level triggered. - @param [in] ActiveLow The interrupt is active-high or active-low. - @param [in] Shared The interrupt can be shared with other - devices or not (Exclusive). - @param [in] IrqList Interrupt list. Must be non-NULL. - @param [in] IrqCount Interrupt count. Must be non-zero. - - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_INVALID_PARAMETER Invalid parameter. - @retval EFI_OUT_OF_RESOURCES Could not allocate memory. -**/ -EFI_STATUS -EFIAPI -AmlCodeGenAddRdInterrupt ( - IN AML_OBJECT_NODE_HANDLE NameOpNode, - IN BOOLEAN ResourceConsumer, - IN BOOLEAN EdgeTriggered, - IN BOOLEAN ActiveLow, - IN BOOLEAN Shared, - IN UINT32 * IrqList, - IN UINT8 IrqCount - ) -{ - EFI_STATUS Status; - - AML_OBJECT_NODE_HANDLE BufferOpNode; - - if ((IrqList == NULL) || - (IrqCount == 0) || - (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0))) { - ASSERT (0); - return EFI_INVALID_PARAMETER; - } - - // Get the value which is represented as a BufferOp object node - // which is the 2nd fixed argument (i.e. index 1). - BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument ( - NameOpNode, - EAmlParseIndexTerm1 - ); - if ((BufferOpNode == NULL) || - (AmlGetNodeType ((AML_NODE_HANDLE)BufferOpNode) != EAmlNodeObject) || - (!AmlNodeHasOpCode (BufferOpNode, AML_BUFFER_OP, 0))) { - ASSERT (0); - return EFI_INVALID_PARAMETER; - } - - // Generate the Extended Interrupt Resource Data node, - // and attach it as the last variable argument of the BufferOpNode. - Status = AmlCodeGenInterrupt ( - ResourceConsumer, - EdgeTriggered, - ActiveLow, - Shared, - IrqList, - IrqCount, - BufferOpNode, - NULL - ); - if (EFI_ERROR (Status)) { - ASSERT (0); - } - - return Status; + return LinkRdNode (RdNode, NameOpNode, NewRdNode); } // DEPRECATED APIS @@ -316,15 +249,15 @@ AmlCodeGenCrsAddRdInterrupt ( IN UINT8 IrqCount ) { - return AmlCodeGenAddRdInterrupt ( - NameOpCrsNode, - NameOpNode, + return AmlCodeGenRdInterrupt ( ResourceConsumer, EdgeTriggered, ActiveLow, Shared, IrqList, - IrqCount + IrqCount, + NameOpCrsNode, + NULL ); } diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h index 08364db4431f..764051e3d7c9 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.h @@ -1,7 +1,7 @@ /** @file AML Resource Data Code Generation. - Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> + Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -11,33 +11,32 @@ /** Code generation for the "Interrupt ()" ASL function. - This function creates a Resource Data element corresponding to the - "Interrupt ()" ASL function and stores it in an AML Data Node. - The Resource Data effectively created is an Extended Interrupt Resource - Data. See ACPI 6.3 specification, s6.4.3.6 "Extended Interrupt Descriptor" - for more information about Extended Interrupt Resource Data. + Data. Cf ACPI 6.4: + - s6.4.3.6 "Extended Interrupt Descriptor" + - s19.6.64 "Interrupt (Interrupt Resource Descriptor Macro)" - This function allocates memory to create a data node. It is the caller's - responsibility to either: - - attach this node to an AML tree; - - delete this node. + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. - @param [in] ResourceConsumer The device consumes the specified interrupt - or produces it for use by a child device. - @param [in] EdgeTriggered The interrupt is edge triggered or - level triggered. - @param [in] ActiveLow The interrupt is active-high or active-low. - @param [in] Shared The interrupt can be shared with other - devices or not (Exclusive). - @param [in] IrqList Interrupt list. Must be non-NULL. - @param [in] IrqCount Interrupt count. Must be non-zero. - @param [in] ParentNode If not NULL, add the generated node - to the end of the variable list of - argument of the ParentNode, but - before the "End Tag" Resource Data. - Must be a BufferOpNode. - @param [out] NewRdNode If success, contains the generated node. + @param [in] ResourceConsumer The device consumes the specified interrupt + or produces it for use by a child device. + @param [in] EdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] ActiveLow The interrupt is active-high or active-low. + @param [in] Shared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList Interrupt list. Must be non-NULL. + @param [in] IrqCount Interrupt count. Must be non-zero. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this + node. + @param [out] NewRdNode If provided and success, + contain the created node. @retval EFI_SUCCESS The function completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. @@ -45,15 +44,15 @@ **/ EFI_STATUS EFIAPI -AmlCodeGenInterrupt ( - IN BOOLEAN ResourceConsumer, - IN BOOLEAN EdgeTriggered, - IN BOOLEAN ActiveLow, - IN BOOLEAN Shared, - IN UINT32 * IrqList, - IN UINT8 IrqCount, - IN AML_OBJECT_NODE * ParentNode, OPTIONAL - OUT AML_DATA_NODE ** NewRdNode OPTIONAL +AmlCodeGenRdInterrupt ( + IN BOOLEAN ResourceConsumer, + IN BOOLEAN EdgeTriggered, + IN BOOLEAN ActiveLow, + IN BOOLEAN Shared, + IN UINT32 *IrqList, + IN UINT8 IrqCount, + IN AML_OBJECT_NODE_HANDLE NameOpNode, OPTIONAL + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); #endif // AML_RESOURCE_DATA_CODE_GEN_H_ -- 2.17.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 00/10] Various DynamicTablesPkg modifications 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois ` (9 preceding siblings ...) 2021-09-30 7:48 ` [PATCH v2 10/10] DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h PierreGondois @ 2021-10-01 12:04 ` Sami Mujawar 10 siblings, 0 replies; 12+ messages in thread From: Sami Mujawar @ 2021-10-01 12:04 UTC (permalink / raw) To: Pierre.Gondois, devel, Alexei.Fedorov, Joey Gouly, nd Merged as 422e5d2f7f1a..22873f58c40c Regards, Sami Mujawar On 30/09/2021 08:48 AM, Pierre.Gondois@arm.com wrote: > From: Pierre Gondois <Pierre.Gondois@arm.com> > > This patch-set aggregates various modifications in the > DynamicTablesPkg: > - Extract an AcpiTableHelperLib from TableHelperLib to remove > the dependency of some utility functions over configuration > manager definitions > - Add a HexFromAscii() function > - Add a AmlGetEisaIdFromString() function > - Add a configuration manager object parser > - Use %a instead of %s in when printing AmlLib > - Update the .ci.yaml once to prepare for other incoming patches > - Modify the generic prototype of the AmlResourceDataCodeGen > functions. This also means deprecating some functions. > > The modifications can be seen at: https://github.com/PierreARM/edk2/tree/1718_Various_DynamicTablesPkg_modifications_v2 > > v2: > - Corrections in commit messages. [Sami] > - Document returned error code for some functions. [Sami] > - Correct wrong field name in Configuration Manager Object parser. > [Joey] > > Pierre Gondois (9): > DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib > DynamicTablesPkg: Update TableHelperLib.inf > DynamicTablesPkg: Rename single char input parameter > DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib > DynamicTablesPkg: Add AmlGetEisaIdFromString() to AcpiHelperLib > DynamicTablesPkg: Use %a formatter in AmlDbgPrint > DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml > DynamicTablesPkg: Deprecate Crs specific methods in AmlLib > DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h > > Sami Mujawar (1): > DynamicTablesPkg: Add Configuration Manager Object parser > > DynamicTablesPkg/DynamicTables.dsc.inc | 3 +- > DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 29 + > DynamicTablesPkg/DynamicTablesPkg.dec | 4 + > DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + > .../Include/Library/AcpiHelperLib.h | 93 +++ > .../Include/Library/AmlLib/AmlLib.h | 225 ++++-- > .../Include/Library/TableHelperLib.h | 49 +- > .../SsdtCmn600Generator.c | 14 +- > .../AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf | 3 +- > .../SsdtSerialPortGenerator.c | 3 +- > .../SsdtSerialPortLibArm.inf | 4 +- > .../Library/Common/AcpiHelperLib/AcpiHelper.c | 210 ++++++ > .../Common/AcpiHelperLib/AcpiHelperLib.inf | 25 + > .../Common/AmlLib/AmlDbgPrint/AmlDbgPrint.c | 16 +- > .../Library/Common/AmlLib/AmlLib.inf | 3 +- > .../Library/Common/AmlLib/Api/AmlApi.c | 147 +++- > .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 194 ++--- > .../AmlLib/CodeGen/AmlResourceDataCodeGen.h | 67 +- > .../SsdtSerialPortFixupLib.c | 6 +- > .../SsdtSerialPortFixupLib.inf | 1 + > .../ConfigurationManagerObjectParser.c | 678 ++++++++++++++++++ > .../ConfigurationManagerObjectParser.h | 73 ++ > .../Common/TableHelperLib/TableHelper.c | 96 --- > .../Common/TableHelperLib/TableHelperLib.inf | 13 +- > 24 files changed, 1579 insertions(+), 378 deletions(-) > create mode 100644 DynamicTablesPkg/Include/Library/AcpiHelperLib.h > create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelper.c > create mode 100644 DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf > create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c > create mode 100644 DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.h > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-10-01 12:04 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-09-30 7:48 [PATCH v2 00/10] Various DynamicTablesPkg modifications PierreGondois 2021-09-30 7:48 ` [PATCH v2 01/10] DynamicTablesPkg: Extract AcpiHelperLib from TableHelperLib PierreGondois 2021-09-30 7:48 ` [PATCH v2 02/10] DynamicTablesPkg: Update TableHelperLib.inf PierreGondois 2021-09-30 7:48 ` [PATCH v2 03/10] DynamicTablesPkg: Rename single char input parameter PierreGondois 2021-09-30 7:48 ` [PATCH v2 04/10] DynamicTablesPkg: Add HexFromAscii() to AcpiHelperLib PierreGondois 2021-09-30 7:48 ` [PATCH v2 05/10] DynamicTablesPkg: Add AmlGetEisaIdFromString() " PierreGondois 2021-09-30 7:48 ` [PATCH v2 06/10] DynamicTablesPkg: Add Configuration Manager Object parser PierreGondois 2021-09-30 7:48 ` [PATCH v2 07/10] DynamicTablesPkg: Use %a formatter in AmlDbgPrint PierreGondois 2021-09-30 7:48 ` [PATCH v2 08/10] DynamicTablesPkg: Update DynamicTablesPkg.ci.yaml PierreGondois 2021-09-30 7:48 ` [PATCH v2 09/10] DynamicTablesPkg: Deprecate Crs specific methods in AmlLib PierreGondois 2021-09-30 7:48 ` [PATCH v2 10/10] DynamicTablesPkg: Rework AmlResourceDataCodegen.c/h PierreGondois 2021-10-01 12:04 ` [PATCH v2 00/10] Various DynamicTablesPkg modifications Sami Mujawar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox