Re: [edk2-devel] [PATCH v3 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime
On Wed, Mar 27, 2024 at 13:59:34 +, Xiong Yining wrote: > Add support to create SRAT(System resource affinity table) for > sbsa platform at runtime. > > Signed-off-by: Xiong Yining > Signed-off-by: Chen Baozi No one can sign off patches on behalf of someone else. Please only include your own signed-off-by. > Reviewed-by: Marcin Juszkiewicz > Change-Id: I4a65084e6ade66d87ea935adfa4be15a7030d3eb We don't use gerrit. Please drop Change-Id:s before upstreaming. > --- > .../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) & 0x,/* Base Address Low > */\ > +((Base) >> 32) & 0x , /* Base Address High > */ \ > +(Length) & 0x, /* Length Low */ > \ > +((Length) >> 32) & 0x, /* 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. > + > + @retvalthe 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_STATUSStatus; > + UINT8 *New; > + EFI_PHYSICAL_ADDRESS PageAddress; > + UINTN TableHandle; > + UINT32TableSize; > + UINT32Index; > + UINT32NodeId; > + UINT32NumMemNodes; > + MemoryInfoMemInfo; > + UINT32NumCores = GetCpuCount (); > + > + // Initialize SRAT ACPI Header > + EFI_ACPI_6_4_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER Header
[edk2-devel] [PATCH v3 1/1] SbsaQemu: AcpiDxe: Create SRAT table at runtime
Add support to create SRAT(System resource affinity table) for sbsa platform at runtime. Signed-off-by: Xiong Yining Signed-off-by: Chen Baozi Reviewed-by: Marcin Juszkiewicz Change-Id: I4a65084e6ade66d87ea935adfa4be15a7030d3eb --- .../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) & 0x,/* Base Address Low */ \ +((Base) >> 32) & 0x , /* Base Address High */ \ +(Length) & 0x, /* Length Low */ \ +((Length) >> 32) & 0x, /* 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. + + @retvalthe 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_STATUSStatus; + UINT8 *New; + EFI_PHYSICAL_ADDRESS PageAddress; + UINTN TableHandle; + UINT32TableSize; + UINT32Index; + UINT32NodeId; + UINT32NumMemNodes; + MemoryInfoMemInfo; + UINT32NumCores = 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