diff mbox series

[1/1] target/arm: calculate cache sizes properly

Message ID 20240710173512.424547-1-marcin.juszkiewicz@linaro.org
State New
Headers show
Series [1/1] target/arm: calculate cache sizes properly | expand

Commit Message

Marcin Juszkiewicz July 10, 2024, 5:35 p.m. UTC
Neoverse-V1 TRM says that NumSets are [27:13] not :32 like in code.

With this fix all cores which use make_ccsidr64() function have proper
size of cpu caches.

Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
---
 target/arm/tcg/cpu64.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Peter Maydell July 11, 2024, 10:19 a.m. UTC | #1
On Wed, 10 Jul 2024 at 18:35, Marcin Juszkiewicz
<marcin.juszkiewicz@linaro.org> wrote:
>
> Neoverse-V1 TRM says that NumSets are [27:13] not :32 like in code.

NumSets in fields [27:13] is the 32-bit CCSIDR_EL1 format
(i.e. what you have when FEAT_CCIDX is not implemented).
The make_ccsidr64() function provides the 64-bit CCSIDR_EL1
format (i.e. the one when FEAT_CCIDX is implemented).

I would suspect this is an accidental error in the Neoverse-V1
TRM -- if you have access to the real hardware and can dump
the CCSIDR_EL1 value I would expect you'll see it matches
what QEMU is implementing here (and that ID_AA64MMFR2_EL1.CCIDX
also says that FEAT_CCIDX is implemented). See also the comment
"The Neoverse-V1 r1p2 TRM lists 32-bit format CCSIDR_EL1 values"
in aarch64_neoverse_v1_initfn() where we document that we
don't trust what the TRM is saying here.

How did you run into this? Is there some guest software
which is assuming the old 32-bit format and not checking
ID_AA64MMFR2_EL1.CCIDX to see if it needs to use the new one?

thanks
-- PMM
Marcin Juszkiewicz July 11, 2024, 10:45 a.m. UTC | #2
On 11.07.2024 12:19, Peter Maydell wrote:
> On Wed, 10 Jul 2024 at 18:35, Marcin Juszkiewicz
> <marcin.juszkiewicz@linaro.org> wrote:
>>
>> Neoverse-V1 TRM says that NumSets are [27:13] not :32 like in code.
> 
> NumSets in fields [27:13] is the 32-bit CCSIDR_EL1 format
> (i.e. what you have when FEAT_CCIDX is not implemented).
> The make_ccsidr64() function provides the 64-bit CCSIDR_EL1
> format (i.e. the one when FEAT_CCIDX is implemented).
> 
> I would suspect this is an accidental error in the Neoverse-V1
> TRM -- if you have access to the real hardware and can dump
> the CCSIDR_EL1 value I would expect you'll see it matches
> what QEMU is implementing here (and that ID_AA64MMFR2_EL1.CCIDX
> also says that FEAT_CCIDX is implemented). See also the comment
> "The Neoverse-V1 r1p2 TRM lists 32-bit format CCSIDR_EL1 values"
> in aarch64_neoverse_v1_initfn() where we document that we
> don't trust what the TRM is saying here.
> 
> How did you run into this? Is there some guest software
> which is assuming the old 32-bit format and not checking
> ID_AA64MMFR2_EL1.CCIDX to see if it needs to use the new one?

I started adding cpu cache info into PPTT and so far the only code I 
used was old 32-bit format one:

https://openfw.io/edk2-devel/20240710-acpi65-v4-6-bc32224e4be4@linaro.org/


Will check for CCIDX and adapt proper way. But that has to wait for 
August due to vacation plans.
diff mbox series

Patch

diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
index fe232eb306..98144e1d20 100644
--- a/target/arm/tcg/cpu64.c
+++ b/target/arm/tcg/cpu64.c
@@ -50,7 +50,7 @@  static uint64_t make_ccsidr64(unsigned assoc, unsigned linesize,
     sets = cachesize / (assoc * linesize);
     assert(cachesize % (assoc * linesize) == 0);
 
-    return ((uint64_t)(sets - 1) << 32)
+    return ((uint64_t)(sets - 1) << 13)
          | ((assoc - 1) << 3)
          | (lg_linesize - 4);
 }