public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel] [PATCH v4 0/1] Add support for generating SRAT tables
@ 2024-03-28  6:19 Xiong Yining
  2024-03-28  6:19 ` [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime Xiong Yining
  0 siblings, 1 reply; 4+ messages in thread
From: Xiong Yining @ 2024-03-28  6:19 UTC (permalink / raw)
  To: devel
  Cc: quic_llindhol, ardb+tianocore, graeme, marcin.juszkiewicz,
	chenbaozi, Xiong Yining

SbsaQemu can configure with numa-related arguments, but OS cannot
identify the numa architecture without SRAT tables. We add supporting
for generating SRAT tables at runtime to solve this issue.

the numa-related information and memory information can be obtained via
SMC calls which is provided on the EDK2 patch "get rid of DeviceTree from 
SbsaQemu" https://openfw.io/edk2-devel/20240131132400.3022662-1-xiongyining1480@phytium.com.cn/

when this patch is applied, there is only the first memory node can be 
identified by OS, this is because UEFI only allocates the first memory node 
memory space for SbsaQemu platform. we can use patch "Support multi memory nodes"
to solve it.

Changes in v4:
- rename variable names.
- Link to v3 https://openfw.io/edk2-devel/20240327135934.3802327-1-xiongyining1480@phytium.com.cn/

changes in v3:
- Rename SbsaQemuHardwareInfoLib to HardwareInfoLib and use newer function names.
- modify the condition for creating SRAT tables from node greater than 0 to node greater than 1 because we think it's UMA architecture when node is equal to 1.
- Link to v2: https://openfw.io/edk2-devel/20240220074736.3249691-1-xiongyining1480@phytium.com.cn/

changes in v2:
- fix the compile error which is caused by redundant "+" in SbsaQemuAcpiDxe.h.

Xiong Yining (1):
  SbsaQemu: AcpiDxe: Create SRAT table at runtime

 .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h | 27 ++++++
 .../Include/Library/HardwareInfoLib.h         | 10 ++
 .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 92 +++++++++++++++++++
 .../SbsaQemuHardwareInfoLib.c                 | 36 ++++++++
 4 files changed, 165 insertions(+)

-- 
2.34.1



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



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime
  2024-03-28  6:19 [edk2-devel] [PATCH v4 0/1] Add support for generating SRAT tables Xiong Yining
@ 2024-03-28  6:19 ` Xiong Yining
  2024-03-28 13:24   ` Marcin Juszkiewicz
  2024-03-28 13:31   ` Leif Lindholm
  0 siblings, 2 replies; 4+ messages in thread
From: Xiong Yining @ 2024-03-28  6:19 UTC (permalink / raw)
  To: devel
  Cc: quic_llindhol, ardb+tianocore, graeme, marcin.juszkiewicz,
	chenbaozi, Xiong Yining

Add support to create SRAT(System resource affinity table) for
sbsa platform at runtime.

Signed-off-by: Xiong Yining <xiongyining1480@phytium.com.cn>
Reviewed-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
---
 .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h | 27 ++++++
 .../Include/Library/HardwareInfoLib.h         | 10 ++
 .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 92 +++++++++++++++++++
 .../SbsaQemuHardwareInfoLib.c                 | 36 ++++++++
 4 files changed, 165 insertions(+)

diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
index 7595df4c8a2d..83a085cd86f4 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
@@ -63,4 +63,31 @@ typedef struct {
 
 #define GTDT_WDTIMER_FLAGS          (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDTIMER_LEVEL_TRIGGERED)
 
+#define SBSAQEMU_ACPI_MEMORY_AFFINITY_STRUCTURE_INIT(                             \
+          ProximityDomain, Base, Length, Flags)                                   \
+  {                                                                               \
+    1,                                                  /* Type */                \
+    sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE),    /* Length */              \
+    ProximityDomain,                                    /* Proximity Domain */    \
+    0,                                                  /* Reserved */            \
+    (Base) & 0xffffffff,                                /* Base Address Low */    \
+    ((Base) >> 32) & 0xffffffff ,                       /* Base Address High */   \
+    (Length) & 0xffffffff,                              /* Length Low */          \
+    ((Length) >> 32) & 0xffffffff,                      /* Length High */         \
+    0,                                                  /* Reserved */            \
+    Flags,                                              /* Flags */               \
+    0                                                   /* Reserved */            \
+  }
+
+#define SBSAQEMU_ACPI_GICC_AFFINITY_STRUCTURE_INIT(                               \
+          ProximityDomain, ACPIProcessorUID, Flags, ClockDomain)                  \
+  {                                                                               \
+    3,                                                  /* Type */                \
+    sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE),      /* Length */              \
+    ProximityDomain,                                    /* Proximity Domain */    \
+    ACPIProcessorUID,                                   /* ACPI Processor UID */  \
+    Flags,                                              /* Flags */               \
+    ClockDomain                                         /* Clock Domain */        \
+  }
+
 #endif
diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
index 5db0eacc9d2d..46fdad45353c 100644
--- a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
+++ b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
@@ -73,4 +73,14 @@ GetMemInfo (
   OUT MemoryInfo  *MemInfo
   );
 
+/**
+  Get the number of numa node from device tree passed by Qemu.
+
+  @retval                the number of numa node.
+**/
+UINT64
+GetNumaNodeCount (
+  VOID
+  );
+
 #endif /* HARDWARE_INFO_LIB */
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
index 4ebe2a445344..30239e7dca0d 100644
--- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
@@ -682,6 +682,91 @@ AddGtdtTable (
   return Status;
 }
 
+/*
+ * A function that adds the SRAT ACPI table.
+ */
+EFI_STATUS
+AddSratTable (
+  IN EFI_ACPI_TABLE_PROTOCOL   *AcpiTable
+  )
+{
+  EFI_STATUS            Status;
+  UINT8                 *New;
+  EFI_PHYSICAL_ADDRESS  PageAddress;
+  UINTN                 TableHandle;
+  UINT32                TableSize;
+  UINT32                Index;
+  UINT32                NodeId;
+  UINT32                NumMemNodes;
+  MemoryInfo            MemInfo;
+  UINT32                NumCores = GetCpuCount ();
+
+  // Initialize SRAT ACPI Header
+  EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER Header = {
+     SBSAQEMU_ACPI_HEADER (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE,
+                           EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER,
+                           EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_REVISION),
+      1, 0 };
+
+  NumMemNodes  = GetMemNodeCount();
+
+  // Calculate the new table size based on the number of cores
+  TableSize = sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER) +
+               (sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE) * NumMemNodes ) +
+               (sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE) * NumCores);
+
+  Status = gBS->AllocatePages (
+                AllocateAnyPages,
+                EfiACPIReclaimMemory,
+                EFI_SIZE_TO_PAGES (TableSize),
+                &PageAddress
+                );
+
+  if (EFI_ERROR(Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to allocate pages for SRAT table\n"));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  New = (UINT8 *)(UINTN) PageAddress;
+  ZeroMem (New, TableSize);
+
+  // Add the ACPI Description table header
+  CopyMem (New, &Header, sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER));
+  ((EFI_ACPI_DESCRIPTION_HEADER*) New)->Length = TableSize;
+  New += sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER);
+
+  // Add memory structures
+  for (Index = 0; Index < NumMemNodes ; Index++) {
+    GetMemInfo (Index, &MemInfo);
+    EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE memory = SBSAQEMU_ACPI_MEMORY_AFFINITY_STRUCTURE_INIT (MemInfo.NodeId, MemInfo.AddressBase, MemInfo.AddressSize, 1);
+    CopyMem (New, &memory, sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE));
+    New += sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE);
+  }
+
+  // Add processor structures for the cores
+  for (Index = 0; Index < NumCores; Index++) {
+    NodeId = GetCpuNumaNode(Index);
+    EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE gicc = SBSAQEMU_ACPI_GICC_AFFINITY_STRUCTURE_INIT(NodeId, Index, 1, 0);
+    CopyMem (New, &gicc, sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE));
+    New += sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE);
+  }
+
+  // Perform Checksum
+  AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
+
+  Status = AcpiTable->InstallAcpiTable (
+                        AcpiTable,
+                        (EFI_ACPI_COMMON_HEADER *)PageAddress,
+                        TableSize,
+                        &TableHandle
+                        );
+  if (EFI_ERROR(Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to install SRAT table\n"));
+  }
+
+  return Status;
+}
+
 /*
  * A function to disable XHCI node on Platform Version lower than 0.3
  */
@@ -793,6 +878,13 @@ InitializeSbsaQemuAcpiDxe (
     DEBUG ((DEBUG_ERROR, "Failed to add PPTT table\n"));
   }
 
+  if (GetNumaNodeCount() > 1){
+    Status = AddSratTable (AcpiTable);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "Failed to add SRAT table\n"));
+    }
+  }
+
   Status = AddGtdtTable (AcpiTable);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "Failed to add GTDT table\n"));
diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
index b178cf6c6c43..79d0c79918d0 100644
--- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
+++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
@@ -143,3 +143,39 @@ GetMemInfo (
       MemInfo->AddressBase + MemInfo->AddressSize -1 ));
 
 }
+
+UINT64
+GetNumaNodeCount (
+  VOID
+)
+{
+  UINT64                Arg;
+  UINT32                Index;
+  UINT32                NumberNumaNodes;
+  UINT32                NumberMemNodes;
+  UINT32                NumCores = GetCpuCount();
+  MemoryInfo            MemInfo;
+
+  NumberNumaNodes = 0;
+  NumberMemNodes = GetMemNodeCount();
+
+  if (NumCores > 0){
+    for (Index = 0; Index < NumCores; Index ++){
+      Arg = GetCpuNumaNode(Index);
+      if (NumberNumaNodes == 0 || NumberNumaNodes < (Arg + 1)){
+        NumberNumaNodes = Arg + 1;
+      }
+    }
+  }
+
+  if (NumberMemNodes > 0){
+    for (Index = 0; Index < NumberMemNodes; Index ++){
+      GetMemInfo(Index, &MemInfo);
+      if (NumberNumaNodes == 0 || NumberNumaNodes < (MemInfo.NodeId + 1)){
+        NumberNumaNodes = MemInfo.NodeId + 1;
+      }
+    }
+  }
+
+  return NumberNumaNodes;
+}
-- 
2.34.1



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



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime
  2024-03-28  6:19 ` [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime Xiong Yining
@ 2024-03-28 13:24   ` Marcin Juszkiewicz
  2024-03-28 13:31   ` Leif Lindholm
  1 sibling, 0 replies; 4+ messages in thread
From: Marcin Juszkiewicz @ 2024-03-28 13:24 UTC (permalink / raw)
  To: Xiong Yining, devel; +Cc: quic_llindhol, ardb+tianocore, graeme, chenbaozi

W dniu 28.03.2024 o 07:19, Xiong Yining pisze:
> Add support to create SRAT(System resource affinity table) for
> sbsa platform at runtime.
> 
> Signed-off-by: Xiong Yining<xiongyining1480@phytium.com.cn>

> Reviewed-by: Marcin Juszkiewicz<marcin.juszkiewicz@linaro.org>
> Reviewed-by: Leif Lindholm<quic_llindhol@quicinc.com>

When you send a new version of patch, with changes done compared to 
previous one you drop "Reviewed-by" tags because it is not code anyone 
saw before.

You add/copy "Reviewed-by" only if patch is in the same version as the 
one reviewed. And only if someone really added that tag in review, not 
when they looked and commented (I never gave "Reviewed-by" tag to any 
version of this patch).


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



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime
  2024-03-28  6:19 ` [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime Xiong Yining
  2024-03-28 13:24   ` Marcin Juszkiewicz
@ 2024-03-28 13:31   ` Leif Lindholm
  1 sibling, 0 replies; 4+ messages in thread
From: Leif Lindholm @ 2024-03-28 13:31 UTC (permalink / raw)
  To: devel, xiongyining1480
  Cc: ardb+tianocore, graeme, marcin.juszkiewicz, chenbaozi

On Thu, Mar 28, 2024 at 06:19:35 +0000, Xiong Yining wrote:
> Add support to create SRAT(System resource affinity table) for
> sbsa platform at runtime.
> 
> Signed-off-by: Xiong Yining <xiongyining1480@phytium.com.cn>
> Reviewed-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
> Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>

You are not supposed to add Reviewed-by: or Acked-by: tags unless
whoever is commenting on your code indicates so by posting (for me)
Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>

It is not an indicator of work in progress, it is a flag that the
patch has been Reviewed and is ready to merge.

This also means that if Reviewed-by: is given early in the process,
but then you need to do substantial rework, you should *drop* any
previously given Reviewed-by: tags.

Marcin has never given his Reviewed-by for this patch, so I have
dropped this before pushing. Pushed as 7c26299112f3.

Thanks!

/
    Leif

> ---
>  .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h | 27 ++++++
>  .../Include/Library/HardwareInfoLib.h         | 10 ++
>  .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 92 +++++++++++++++++++
>  .../SbsaQemuHardwareInfoLib.c                 | 36 ++++++++
>  4 files changed, 165 insertions(+)
> 
> diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
> index 7595df4c8a2d..83a085cd86f4 100644
> --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
> +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h
> @@ -63,4 +63,31 @@ typedef struct {
>  
>  #define GTDT_WDTIMER_FLAGS          (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDTIMER_LEVEL_TRIGGERED)
>  
> +#define SBSAQEMU_ACPI_MEMORY_AFFINITY_STRUCTURE_INIT(                             \
> +          ProximityDomain, Base, Length, Flags)                                   \
> +  {                                                                               \
> +    1,                                                  /* Type */                \
> +    sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE),    /* Length */              \
> +    ProximityDomain,                                    /* Proximity Domain */    \
> +    0,                                                  /* Reserved */            \
> +    (Base) & 0xffffffff,                                /* Base Address Low */    \
> +    ((Base) >> 32) & 0xffffffff ,                       /* Base Address High */   \
> +    (Length) & 0xffffffff,                              /* Length Low */          \
> +    ((Length) >> 32) & 0xffffffff,                      /* Length High */         \
> +    0,                                                  /* Reserved */            \
> +    Flags,                                              /* Flags */               \
> +    0                                                   /* Reserved */            \
> +  }
> +
> +#define SBSAQEMU_ACPI_GICC_AFFINITY_STRUCTURE_INIT(                               \
> +          ProximityDomain, ACPIProcessorUID, Flags, ClockDomain)                  \
> +  {                                                                               \
> +    3,                                                  /* Type */                \
> +    sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE),      /* Length */              \
> +    ProximityDomain,                                    /* Proximity Domain */    \
> +    ACPIProcessorUID,                                   /* ACPI Processor UID */  \
> +    Flags,                                              /* Flags */               \
> +    ClockDomain                                         /* Clock Domain */        \
> +  }
> +
>  #endif
> diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> index 5db0eacc9d2d..46fdad45353c 100644
> --- a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> +++ b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> @@ -73,4 +73,14 @@ GetMemInfo (
>    OUT MemoryInfo  *MemInfo
>    );
>  
> +/**
> +  Get the number of numa node from device tree passed by Qemu.
> +
> +  @retval                the number of numa node.
> +**/
> +UINT64
> +GetNumaNodeCount (
> +  VOID
> +  );
> +
>  #endif /* HARDWARE_INFO_LIB */
> diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> index 4ebe2a445344..30239e7dca0d 100644
> --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> @@ -682,6 +682,91 @@ AddGtdtTable (
>    return Status;
>  }
>  
> +/*
> + * A function that adds the SRAT ACPI table.
> + */
> +EFI_STATUS
> +AddSratTable (
> +  IN EFI_ACPI_TABLE_PROTOCOL   *AcpiTable
> +  )
> +{
> +  EFI_STATUS            Status;
> +  UINT8                 *New;
> +  EFI_PHYSICAL_ADDRESS  PageAddress;
> +  UINTN                 TableHandle;
> +  UINT32                TableSize;
> +  UINT32                Index;
> +  UINT32                NodeId;
> +  UINT32                NumMemNodes;
> +  MemoryInfo            MemInfo;
> +  UINT32                NumCores = GetCpuCount ();
> +
> +  // Initialize SRAT ACPI Header
> +  EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER Header = {
> +     SBSAQEMU_ACPI_HEADER (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE,
> +                           EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER,
> +                           EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_REVISION),
> +      1, 0 };
> +
> +  NumMemNodes  = GetMemNodeCount();
> +
> +  // Calculate the new table size based on the number of cores
> +  TableSize = sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER) +
> +               (sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE) * NumMemNodes ) +
> +               (sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE) * NumCores);
> +
> +  Status = gBS->AllocatePages (
> +                AllocateAnyPages,
> +                EfiACPIReclaimMemory,
> +                EFI_SIZE_TO_PAGES (TableSize),
> +                &PageAddress
> +                );
> +
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, "Failed to allocate pages for SRAT table\n"));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  New = (UINT8 *)(UINTN) PageAddress;
> +  ZeroMem (New, TableSize);
> +
> +  // Add the ACPI Description table header
> +  CopyMem (New, &Header, sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER));
> +  ((EFI_ACPI_DESCRIPTION_HEADER*) New)->Length = TableSize;
> +  New += sizeof (EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER);
> +
> +  // Add memory structures
> +  for (Index = 0; Index < NumMemNodes ; Index++) {
> +    GetMemInfo (Index, &MemInfo);
> +    EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE memory = SBSAQEMU_ACPI_MEMORY_AFFINITY_STRUCTURE_INIT (MemInfo.NodeId, MemInfo.AddressBase, MemInfo.AddressSize, 1);
> +    CopyMem (New, &memory, sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE));
> +    New += sizeof (EFI_ACPI_6_4_MEMORY_AFFINITY_STRUCTURE);
> +  }
> +
> +  // Add processor structures for the cores
> +  for (Index = 0; Index < NumCores; Index++) {
> +    NodeId = GetCpuNumaNode(Index);
> +    EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE gicc = SBSAQEMU_ACPI_GICC_AFFINITY_STRUCTURE_INIT(NodeId, Index, 1, 0);
> +    CopyMem (New, &gicc, sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE));
> +    New += sizeof (EFI_ACPI_6_4_GICC_AFFINITY_STRUCTURE);
> +  }
> +
> +  // Perform Checksum
> +  AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize);
> +
> +  Status = AcpiTable->InstallAcpiTable (
> +                        AcpiTable,
> +                        (EFI_ACPI_COMMON_HEADER *)PageAddress,
> +                        TableSize,
> +                        &TableHandle
> +                        );
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, "Failed to install SRAT table\n"));
> +  }
> +
> +  return Status;
> +}
> +
>  /*
>   * A function to disable XHCI node on Platform Version lower than 0.3
>   */
> @@ -793,6 +878,13 @@ InitializeSbsaQemuAcpiDxe (
>      DEBUG ((DEBUG_ERROR, "Failed to add PPTT table\n"));
>    }
>  
> +  if (GetNumaNodeCount() > 1){
> +    Status = AddSratTable (AcpiTable);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failed to add SRAT table\n"));
> +    }
> +  }
> +
>    Status = AddGtdtTable (AcpiTable);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "Failed to add GTDT table\n"));
> diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> index b178cf6c6c43..79d0c79918d0 100644
> --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> @@ -143,3 +143,39 @@ GetMemInfo (
>        MemInfo->AddressBase + MemInfo->AddressSize -1 ));
>  
>  }
> +
> +UINT64
> +GetNumaNodeCount (
> +  VOID
> +)
> +{
> +  UINT64                Arg;
> +  UINT32                Index;
> +  UINT32                NumberNumaNodes;
> +  UINT32                NumberMemNodes;
> +  UINT32                NumCores = GetCpuCount();
> +  MemoryInfo            MemInfo;
> +
> +  NumberNumaNodes = 0;
> +  NumberMemNodes = GetMemNodeCount();
> +
> +  if (NumCores > 0){
> +    for (Index = 0; Index < NumCores; Index ++){
> +      Arg = GetCpuNumaNode(Index);
> +      if (NumberNumaNodes == 0 || NumberNumaNodes < (Arg + 1)){
> +        NumberNumaNodes = Arg + 1;
> +      }
> +    }
> +  }
> +
> +  if (NumberMemNodes > 0){
> +    for (Index = 0; Index < NumberMemNodes; Index ++){
> +      GetMemInfo(Index, &MemInfo);
> +      if (NumberNumaNodes == 0 || NumberNumaNodes < (MemInfo.NodeId + 1)){
> +        NumberNumaNodes = MemInfo.NodeId + 1;
> +      }
> +    }
> +  }
> +
> +  return NumberNumaNodes;
> +}
> -- 
> 2.34.1
> 
> 
> 
> 
> 
> 


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



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-03-28 13:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-28  6:19 [edk2-devel] [PATCH v4 0/1] Add support for generating SRAT tables Xiong Yining
2024-03-28  6:19 ` [edk2-devel] [PATCH v4 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime Xiong Yining
2024-03-28 13:24   ` Marcin Juszkiewicz
2024-03-28 13:31   ` Leif Lindholm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox