public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "PierreGondois" <pierre.gondois@arm.com>
To: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>, devel@edk2.groups.io
Cc: Sami Mujawar <Sami.Mujawar@arm.com>
Subject: Re: [edk2-devel] [RESEND PATCH v4 2/5] DynamicTablesPkg: Adds ACPI HPET Table generator
Date: Thu, 2 May 2024 18:36:24 +0200	[thread overview]
Message-ID: <a8eeb04b-8c2d-4532-9b1f-562f35de08cd@arm.com> (raw)
In-Reply-To: <788e6fea909b4422c9df46652eac03f3dcf6e4f7.1714369949.git.AbdulLateef.Attar@amd.com>

Hello Abdul,
some comments on the patch:

On 4/29/24 08:03, Abdul Lateef Attar wrote:
> Adds generic ACPI HPET table generator library.
> Register/Deregister HPET table.
> Update the HPET table during boot as per specification.
> 
> Cc: Sami Mujawar <Sami.Mujawar@arm.com>
> Cc: Pierre Gondois <pierre.gondois@arm.com>
> Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
> ---
>   DynamicTablesPkg/DynamicTables.dsc.inc        |   2 +
>   DynamicTablesPkg/Include/AcpiTableGenerator.h |   1 +
>   .../Include/ArchNameSpaceObjects.h            |   9 +
>   .../Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf  |  31 +++
>   .../Library/Acpi/AcpiHpetLib/HpetGenerator.c  | 246 ++++++++++++++++++
>   5 files changed, 289 insertions(+)
>   create mode 100644 DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf
>   create mode 100644 DynamicTablesPkg/Library/Acpi/AcpiHpetLib/HpetGenerator.c
> 
> diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
> index 92f3a138e4..b2ef36eb8a 100644
> --- a/DynamicTablesPkg/DynamicTables.dsc.inc
> +++ b/DynamicTablesPkg/DynamicTables.dsc.inc
> @@ -34,6 +34,7 @@
>     # Generators
>     #
>     DynamicTablesPkg/Library/Acpi/AcpiFadtLib/AcpiFadtLib.inf
> +  DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf

I think this should be moved to the following section if the table if for Intel arch.
Like this it would allow avoiding to build the generator for other archs.

[Components.IA32, Components.X64]
      #
      # Generators
      #
...

also if the table is Intel specific, maybe the generator should be placed under:
    DynamicTablesPkg/Library/Acpi/X64/
    (or a better folder name)
also I think the CmObject should be moved to:
    X64NameSpaceObjects.h

>   
>   [Components.IA32, Components.X64]
>     #
> @@ -42,6 +43,7 @@
>     DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf {
>       <LibraryClasses>
>         NULL|DynamicTablesPkg/Library/Acpi/AcpiFadtLib/AcpiFadtLib.inf
> +      NULL|DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf
>     }
>   
>   [Components.ARM, Components.AARCH64]
> diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h
> index d0eda011c3..18b5f99f47 100644
> --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h
> +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h
> @@ -99,6 +99,7 @@ typedef enum StdAcpiTableId {
>     EStdAcpiTableIdSsdtCpuTopology,               ///< SSDT Cpu Topology
>     EStdAcpiTableIdSsdtPciExpress,                ///< SSDT Pci Express Generator
>     EStdAcpiTableIdPcct,                          ///< PCCT Generator
> +  EStdAcpiTableIdHpet,                          ///< HPET Generator
>     EStdAcpiTableIdMax
>   } ESTD_ACPI_TABLE_ID;
>   
> diff --git a/DynamicTablesPkg/Include/ArchNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchNameSpaceObjects.h
> index b421c4cd29..b90e573a88 100644
> --- a/DynamicTablesPkg/Include/ArchNameSpaceObjects.h
> +++ b/DynamicTablesPkg/Include/ArchNameSpaceObjects.h
> @@ -39,6 +39,7 @@ typedef enum ArchObjectID {
>     EArchObjFadtArmBootArch,        ///< 11 - ARM boot arch information
>     EArchObjFadtHypervisorVendorId, ///< 12 - Hypervisor vendor identity information
>     EArchObjFadtMiscInfo,           ///< 13 - Legacy fields; RTC, latency, flush stride, etc
> +  EArchObjHpetBaseAddress,        ///< 14 - HPET Base Address
>     EArchObjMax
>   } E_ARCH_OBJECT_ID;
>   
> @@ -214,4 +215,12 @@ typedef struct CmArchFadtMiscInfo {
>     UINT8     Century;
>   } CM_ARCH_FADT_MISC_INFO;
>   
> +/** A structure that describes the
> +    HPET Base Address.
> +
> +    ID: EArchObjHpetBaseAddress
> +*/
> +typedef struct CmArchHpetBaseAddress {
> +  UINT64    BaseAddress;
> +} CM_ARCH_HPET_BASE_ADDRESS;

Would it make sense to have these fields for the CmObj ?
typedef struct CmArchHpetBaseAddress {
      UINT32    EventTimerBlockId;
      UINT32    BaseAddressLower32Bit;
      UINT8     HpetNumber;
      UINT16    MainCounterMinimumClockTickInPeriodicMode;
      UINT8     PageProtectionAndOemAttribute;
} CM_ARCH_HPET_BASE_ADDRESS;

The reason being that:
- Ideally the DynamicTables generators should just generate ACPI tables
      from the CmObject they are given. The ConfigurationManager being a
      database providing information.
      Doing Mmio accesses to populate the ACPI tables breaks a bit the design:
      the generators would also become a source of information.
- If the Mmio accesses are possible from the generator, they should also
      be possible from the ConfigurationManager.
- Imagining a platform with an invalid value for the MainCounterMinimumClockTickInPeriodicMode,
      as the generator is generic to all platforms, it becomes hard to patch this.
      The ConfigurationManager is supposed to be platform specific, so if
      the MainCounterMinimumClockTickInPeriodicMode register is invalid,
      it is easy to patch this specific ConfigurationManager and keep a generic
      HPET generator.

(I am refering to MmioRead32 accesses from [1])

>   #endif
> diff --git a/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf b/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf
> new file mode 100644
> index 0000000000..f0441107fc
> --- /dev/null
> +++ b/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/AcpiHpetLib.inf
> @@ -0,0 +1,31 @@
> +## @file
> +#  HPET Table Generator
> +#
> +#  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +
> +[Defines]
> +  INF_VERSION    = 1.27
> +  BASE_NAME      = AcpiHpetLib
> +  FILE_GUID      = 4E75F653-C356-48B3-B32C-D1B901ECF90A
> +  VERSION_STRING = 1.0
> +  MODULE_TYPE    = DXE_DRIVER
> +  LIBRARY_CLASS  = NULL|DXE_DRIVER
> +  CONSTRUCTOR    = AcpiHpetLibConstructor
> +  DESTRUCTOR     = AcpiHpetLibDestructor
> +
> +[Sources]
> +  HpetGenerator.c
> +
> +[Packages]
> +  DynamicTablesPkg/DynamicTablesPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  DebugLib
> +  IoLib
> +
> diff --git a/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/HpetGenerator.c b/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/HpetGenerator.c
> new file mode 100644
> index 0000000000..937879b7b3
> --- /dev/null
> +++ b/DynamicTablesPkg/Library/Acpi/AcpiHpetLib/HpetGenerator.c
> @@ -0,0 +1,246 @@
> +/** @file
> +  HPET Table Generator
> +
> +  Copyright (c) 2017 - 2023, Arm Limited. All rights reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +  @par Reference(s):
> +  - ACPI 6.5 Specification, Aug 29, 2022
> +  - HPET spec, version 1.0a
> +    http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf
> +
> +**/
> +
> +#include <AcpiTableGenerator.h>
> +#include <ConfigurationManagerHelper.h>
> +#include <ConfigurationManagerObject.h>
> +#include <IndustryStandard/HighPrecisionEventTimerTable.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/TableHelperLib.h>
> +#include <Protocol/AcpiTable.h>
> +#include <Protocol/ConfigurationManagerProtocol.h>
> +
> +///
> +/// HPET General Register Offsets
> +///
> +#define HPET_GENERAL_CAPABILITIES_ID_OFFSET  0x000
> +
> +/** The Creator ID for the ACPI tables generated using
> +  the standard ACPI table generators.
> +*/
> +#define TABLE_GENERATOR_CREATOR_ID_GENERIC  SIGNATURE_32('D', 'Y', 'N', 'T')
> +
> +/** The AcpiHpet is a template EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER
> +    structure used for generating the HPET Table.
> +*/
> +STATIC
> +EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER  mAcpiHpet = {
> +  ACPI_HEADER (
> +    EFI_ACPI_6_5_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE,
> +    EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER,
> +    EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_REVISION
> +    ),
> +  // EventTimerBlockId
> +  0,
> +  // BaseAddressLower32Bit
> +  { EFI_ACPI_6_5_SYSTEM_MEMORY,                             0,0, EFI_ACPI_RESERVED_BYTE, 0 },
> +  // HpetNumber
> +  0,
> +  // MainCounterMinimumClockTickInPeriodicMode
> +  0,
> +  // PageProtectionAndOemAttribute
> +  EFI_ACPI_NO_PAGE_PROTECTION
> +};
> +
> +/** This macro expands to a function that retrieves the
> +    HPET base address from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArch,
> +  EArchObjHpetBaseAddress,
> +  CM_ARCH_HPET_BASE_ADDRESS
> +  );
> +
> +/** Construct the HPET table.
> +
> +  This function invokes the Configuration Manager protocol interface
> +  to get the required hardware information for generating the ACPI
> +  table.
> +
> +  If this function allocates any resources then they must be freed
> +  in the FreeXXXXTableResources function.
> +
> +  @param [in]  This           Pointer to the table generator.
> +  @param [in]  AcpiTableInfo  Pointer to the ACPI Table Info.
> +  @param [in]  CfgMgrProtocol Pointer to the Configuration Manager
> +                              Protocol Interface.
> +  @param [out] Table          Pointer to the constructed ACPI Table.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_NOT_FOUND         The required object was not found.
> +  @retval EFI_BAD_BUFFER_SIZE   The size returned by the Configuration
> +                                Manager is less than the Object size for the
> +                                requested object.
> +**/
> +STATIC
> +EFI_STATUS
> +BuildHpetTable (
> +  IN  CONST ACPI_TABLE_GENERATOR                  *CONST  This,
> +  IN  CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
> +  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
> +  OUT       EFI_ACPI_DESCRIPTION_HEADER          **CONST  Table
> +  )
> +{
> +  EFI_STATUS                 Status;
> +  CM_ARCH_HPET_BASE_ADDRESS  *HpetBaseAddress;
> +
> +  ASSERT (This != NULL);
> +  ASSERT (AcpiTableInfo != NULL);
> +  ASSERT (CfgMgrProtocol != NULL);
> +  ASSERT (Table != NULL);
> +  ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
> +  ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
> +
> +  if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) ||
> +      (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision))
> +  {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: HPET: Requested table revision = %d, is not supported."
> +      "Supported table revision: Minimum = %d, Maximum = %d\n",
> +      AcpiTableInfo->AcpiTableRevision,
> +      This->MinAcpiTableRevision,
> +      This->AcpiTableRevision
> +      ));
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *Table = NULL;
> +
> +  Status = AddAcpiHeader (
> +             CfgMgrProtocol,
> +             This,
> +             (EFI_ACPI_DESCRIPTION_HEADER *)&mAcpiHpet,
> +             AcpiTableInfo,
> +             sizeof (EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER)
> +             );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: HPET: Failed to add ACPI header. Status = %r\n",
> +      Status
> +      ));
> +    return Status;
> +  }
> +
> +  // Get the HPET Base Address from the Platform Configuration Manager
> +  Status = GetEArchObjHpetBaseAddress (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &HpetBaseAddress,
> +             NULL
> +             );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: HPET: Failed to get HPET Base Address. Status = %r\n",
> +      Status
> +      ));
> +    return Status;
> +  }
> +
> +  mAcpiHpet.BaseAddressLower32Bit.Address             = HpetBaseAddress->BaseAddress;
> +  mAcpiHpet.EventTimerBlockId                         = MmioRead32 ((UINTN)(HpetBaseAddress->BaseAddress + HPET_GENERAL_CAPABILITIES_ID_OFFSET));
> +  mAcpiHpet.MainCounterMinimumClockTickInPeriodicMode = (UINT16)MmioRead32 ((UINTN)(HpetBaseAddress->BaseAddress + HPET_GENERAL_CAPABILITIES_ID_OFFSET + 4));

[1]

> +  *Table                                              = (EFI_ACPI_DESCRIPTION_HEADER *)&mAcpiHpet;
> +
> +  return Status;
> +}
> +
> +/** This macro defines the HPET Table Generator revision.
> +*/
> +#define HPET_GENERATOR_REVISION  CREATE_REVISION (1, 0)
> +
> +/** The interface for the HPET Table Generator.
> +*/
> +STATIC
> +CONST
> +ACPI_TABLE_GENERATOR  mHpetGenerator = {
> +  // Generator ID
> +  CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdHpet),
> +  // Generator Description
> +  L"ACPI.STD.HPET.GENERATOR",
> +  // ACPI Table Signature
> +  EFI_ACPI_6_5_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE,
> +  // ACPI Table Revision supported by this Generator
> +  EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_REVISION,
> +  // Minimum supported ACPI Table Revision
> +  EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_REVISION,
> +  // Creator ID
> +  TABLE_GENERATOR_CREATOR_ID_GENERIC,
> +  // Creator Revision
> +  HPET_GENERATOR_REVISION,
> +  // Build Table function
> +  BuildHpetTable,
> +  // No additional resources are allocated by the generator.
> +  // Hence the Free Resource function is not required.
> +  NULL,
> +  // Extended build function not needed
> +  NULL,
> +  // Extended build function not implemented by the generator.
> +  // Hence extended free resource function is not required.
> +  NULL
> +};
> +
> +/** Register the Generator with the ACPI Table Factory.
> +
> +  @param [in]  ImageHandle  The handle to the image.
> +  @param [in]  SystemTable  Pointer to the System Table.
> +
> +  @retval EFI_SUCCESS           The Generator is registered.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_ALREADY_STARTED   The Generator for the Table ID
> +                                is already registered.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AcpiHpetLibConstructor (
> +  IN  EFI_HANDLE        ImageHandle,
> +  IN  EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = RegisterAcpiTableGenerator (&mHpetGenerator);
> +  DEBUG ((DEBUG_INFO, "HPET: Register Generator. Status = %r\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> +
> +/** Deregister the Generator from the ACPI Table Factory.
> +
> +  @param [in]  ImageHandle  The handle to the image.
> +  @param [in]  SystemTable  Pointer to the System Table.
> +
> +  @retval EFI_SUCCESS           The Generator is deregistered.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_NOT_FOUND         The Generator is not registered.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AcpiHpetLibDestructor (
> +  IN  EFI_HANDLE        ImageHandle,
> +  IN  EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = DeregisterAcpiTableGenerator (&mHpetGenerator);
> +  DEBUG ((DEBUG_INFO, "HPET: Deregister Generator. Status = %r\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118529): https://edk2.groups.io/g/devel/message/118529
Mute This Topic: https://groups.io/mt/105796051/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  reply	other threads:[~2024-05-02 16:36 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-29  6:03 [edk2-devel] [RESEND PATCH v4 0/5] DynamicTablesPkg: Adds FADT, HPET, WSMT and MADT Table generators Abdul Lateef Attar via groups.io
2024-04-29  6:03 ` [edk2-devel] [RESEND PATCH v4 1/5] DynamicTablesPkg: Adds ACPI FADT Table generator Abdul Lateef Attar via groups.io
2024-04-29  6:03 ` [edk2-devel] [RESEND PATCH v4 2/5] DynamicTablesPkg: Adds ACPI HPET " Abdul Lateef Attar via groups.io
2024-05-02 16:36   ` PierreGondois [this message]
2024-04-29  6:03 ` [edk2-devel] [RESEND PATCH v4 3/5] DynamicTablesPkg: Adds ACPI WSMT " Abdul Lateef Attar via groups.io
2024-05-02 16:36   ` PierreGondois
2024-04-29  6:03 ` [edk2-devel] [RESEND PATCH v4 4/5] DynamicTablesPkg: Adds ACPI SSDT HPET " Abdul Lateef Attar via groups.io
2024-05-02 16:37   ` PierreGondois
2024-04-29  6:03 ` [edk2-devel] [RESEND PATCH v4 5/5] DynamicTablesPkg: Adds X64 arch MADT " Abdul Lateef Attar via groups.io
2024-05-02 16:37   ` PierreGondois
2024-05-02  7:21 ` [edk2-devel] [RESEND PATCH v4 0/5] DynamicTablesPkg: Adds FADT, HPET, WSMT and MADT Table generators Abdul Lateef Attar via groups.io
2024-05-02 16:35 ` PierreGondois
2024-05-03  7:41   ` Sami Mujawar
2024-05-13  4:08     ` Abdul Lateef Attar via groups.io

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a8eeb04b-8c2d-4532-9b1f-562f35de08cd@arm.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox