We were exporting fake cpu cache values instead of reading them from CCSIDR registers.
This change gets rid of fake values in favour of existing ones. Based on Ampere platform core. Added support for cpus with FEAT_CCIDX (Neoverse-V1 and above). Reported-by: Jonathan Cameron <jonathan.came...@huawei.com> Signed-off-by: Marcin Juszkiewicz <marcin.juszkiew...@linaro.org> --- .../SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h | 32 +++++--------- .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 45 ++++++++++++++++++++ 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h index fa2e2b30bb7d..9a7c96fc6970 100644 --- a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h +++ b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuAcpi.h @@ -74,18 +74,6 @@ typedef struct { UINT8 uid[8]; } SBSAQEMU_ACPI_CPU_DEVICE; -#define SBSAQEMU_L1_D_CACHE_SIZE SIZE_32KB -#define SBSAQEMU_L1_D_CACHE_SETS 256 -#define SBSAQEMU_L1_D_CACHE_ASSC 2 - -#define SBSAQEMU_L1_I_CACHE_SIZE SIZE_32KB -#define SBSAQEMU_L1_I_CACHE_SETS 256 -#define SBSAQEMU_L1_I_CACHE_ASSC 2 - -#define SBSAQEMU_L2_CACHE_SIZE SIZE_512KB -#define SBSAQEMU_L2_CACHE_SETS 1024 -#define SBSAQEMU_L2_CACHE_ASSC 8 - #define CLUSTER_INDEX (sizeof (EFI_ACPI_DESCRIPTION_HEADER)) #define L1_D_CACHE_INDEX (CLUSTER_INDEX + sizeof (EFI_ACPI_6_5_PPTT_STRUCTURE_PROCESSOR)) #define L1_I_CACHE_INDEX (L1_D_CACHE_INDEX + sizeof (EFI_ACPI_6_5_PPTT_STRUCTURE_CACHE)) @@ -106,9 +94,9 @@ typedef struct { 1, /* CacheIdValid */ \ }, \ 0, /* NextLevelOfCache */ \ - SBSAQEMU_L1_D_CACHE_SIZE, /* Size */ \ - SBSAQEMU_L1_D_CACHE_SETS, /* NumberOfSets */ \ - SBSAQEMU_L1_D_CACHE_ASSC, /* Associativity */ \ + 0, /* Size */ \ + 0, /* NumberOfSets */ \ + 0, /* Associativity */ \ { \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, \ @@ -133,9 +121,9 @@ typedef struct { 1, /* CacheIdValid */ \ }, \ 0, /* NextLevelOfCache */ \ - SBSAQEMU_L1_I_CACHE_SIZE, /* Size */ \ - SBSAQEMU_L1_I_CACHE_SETS, /* NumberOfSets */ \ - SBSAQEMU_L1_I_CACHE_ASSC, /* Associativity */ \ + 0, /* Size */ \ + 0, /* NumberOfSets */ \ + 0, /* Associativity */ \ { \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_ALLOCATION_READ, \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, \ @@ -159,10 +147,10 @@ typedef struct { 1, /* LineSizeValid */ \ 1, /* CacheIdValid */ \ }, \ - 0, /* NextLevelOfCache */ \ - SBSAQEMU_L2_CACHE_SIZE, /* Size */ \ - SBSAQEMU_L2_CACHE_SETS, /* NumberOfSets */ \ - SBSAQEMU_L2_CACHE_ASSC, /* Associativity */ \ + 0, /* NextLevelOfCache */ \ + 0, /* Size */ \ + 0, /* NumberOfSets */ \ + 0, /* Associativity */ \ { \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, \ EFI_ACPI_6_5_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, \ diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c index 61f9de45d082..9554956432c3 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c @@ -2,15 +2,18 @@ * This file is an ACPI driver for the Qemu SBSA platform. * * Copyright (c) 2020-2024, Linaro Ltd. All rights reserved. +* Copyright (c) 2020-2021, Ampere Computing LLC. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include <IndustryStandard/Acpi.h> #include <IndustryStandard/AcpiAml.h> +#include <IndustryStandard/ArmCache.h> #include <IndustryStandard/IoRemappingTable.h> #include <IndustryStandard/SbsaQemuAcpi.h> #include <IndustryStandard/SbsaQemuPlatformVersion.h> +#include <Library/ArmLib/AArch64/AArch64Lib.h> #include <Library/AcpiLib.h> #include <Library/ArmLib.h> #include <Library/BaseMemoryLib.h> @@ -494,6 +497,44 @@ AddSsdtTable ( return Status; } +STATIC VOID +AcpiPpttFillCacheSizeInfo ( + EFI_ACPI_6_5_PPTT_STRUCTURE_CACHE *Node, + UINT32 Level, + BOOLEAN DataCache, + BOOLEAN UnifiedCache + ) +{ + CSSELR_DATA CsselrData; + CCSIDR_DATA CcsidrData; + + CsselrData.Data = 0; + CsselrData.Bits.Level = Level - 1; + CsselrData.Bits.InD = (!DataCache && !UnifiedCache); + + CcsidrData.Data = ReadCCSIDR (CsselrData.Data); + + Node->Flags.LineSizeValid = 1; + Node->Flags.NumberOfSetsValid = 1; + Node->Flags.AssociativityValid = 1; + Node->Flags.SizePropertyValid = 1; + Node->Flags.CacheTypeValid = 1; + + if (ArmHasCcidx ()) { + Node->NumberOfSets = CcsidrData.BitsCcidxAA64.NumSets + 1; + Node->Associativity = CcsidrData.BitsCcidxAA64.Associativity + 1; + Node->LineSize = (1 << (CcsidrData.BitsCcidxAA64.LineSize + 4)); + } else { + Node->NumberOfSets = (UINT16)CcsidrData.BitsNonCcidx.NumSets + 1; + Node->Associativity = (UINT16)CcsidrData.BitsNonCcidx.Associativity + 1; + Node->LineSize = (UINT16)(1 << (CcsidrData.BitsNonCcidx.LineSize + 4)); + } + + Node->Size = Node->NumberOfSets * + Node->Associativity * + Node->LineSize; +} + STATIC UINT32 AddCoresToPpttTable ( @@ -538,6 +579,10 @@ AddCoresToPpttTable ( EFI_ACPI_6_5_PPTT_STRUCTURE_CACHE L1ICache = SBSAQEMU_ACPI_PPTT_L1_I_CACHE_STRUCT; EFI_ACPI_6_5_PPTT_STRUCTURE_CACHE L2Cache = SBSAQEMU_ACPI_PPTT_L2_CACHE_STRUCT; + AcpiPpttFillCacheSizeInfo (&L1DCache, 1, TRUE, FALSE); + AcpiPpttFillCacheSizeInfo (&L1ICache, 1, FALSE, FALSE); + AcpiPpttFillCacheSizeInfo (&L2Cache, 2, FALSE, TRUE); + CoreOffset = ClusterOffset + sizeof (EFI_ACPI_6_5_PPTT_STRUCTURE_PROCESSOR); Offset = CoreOffset; -- 2.45.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#120281): https://edk2.groups.io/g/devel/message/120281 Mute This Topic: https://groups.io/mt/107767189/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-