diff mbox series

arm64: errata: Enable the AC03_CPU_38 workaround for ampere1a

Message ID 20240826215933.1263453-1-scott@os.amperecomputing.com (mailing list archive)
State New, archived
Headers show
Series arm64: errata: Enable the AC03_CPU_38 workaround for ampere1a | expand

Commit Message

D Scott Phillips Aug. 26, 2024, 9:59 p.m. UTC
The ampere1a cpu is affected by erratum AC04_CPU_10 which is the same
bug as AC03_CPU38. Add ampere1a to the AC03_CPU_38 workaround midr list.

Signed-off-by: D Scott Phillips <scott@os.amperecomputing.com>
---
 Documentation/arch/arm64/silicon-errata.rst | 2 ++
 arch/arm64/Kconfig                          | 2 +-
 arch/arm64/include/asm/cputype.h            | 2 ++
 arch/arm64/kernel/cpu_errata.c              | 1 +
 4 files changed, 6 insertions(+), 1 deletion(-)

Comments

Oliver Upton Aug. 26, 2024, 11:23 p.m. UTC | #1
Hi D Scott,

On Mon, Aug 26, 2024 at 02:59:33PM -0700, D Scott Phillips wrote:
> The ampere1a cpu is affected by erratum AC04_CPU_10 which is the same
> bug as AC03_CPU38. Add ampere1a to the AC03_CPU_38 workaround midr list.
> 
> Signed-off-by: D Scott Phillips <scott@os.amperecomputing.com>
> ---
>  Documentation/arch/arm64/silicon-errata.rst | 2 ++
>  arch/arm64/Kconfig                          | 2 +-
>  arch/arm64/include/asm/cputype.h            | 2 ++
>  arch/arm64/kernel/cpu_errata.c              | 1 +
>  4 files changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
> index 50327c05be8d1..39c52385f11fb 100644
> --- a/Documentation/arch/arm64/silicon-errata.rst
> +++ b/Documentation/arch/arm64/silicon-errata.rst
> @@ -55,6 +55,8 @@ stable kernels.
>  +----------------+-----------------+-----------------+-----------------------------+
>  | Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
>  +----------------+-----------------+-----------------+-----------------------------+
> +| Ampere         | AmpereOne AC04  | AC04_CPU_10     | AMPERE_ERRATUM_AC03_CPU_38  |
> ++----------------+-----------------+-----------------+-----------------------------+

We tend to stick the marketing term for a part in the second column so
it is more recognizable for the user. Is this a placeholder for something
different from "ampere1a"?

> diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
> index f6b6b45073571..748aa536446ae 100644
> --- a/arch/arm64/kernel/cpu_errata.c
> +++ b/arch/arm64/kernel/cpu_errata.c
> @@ -773,6 +773,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
>  		.desc = "AmpereOne erratum AC03_CPU_38",
>  		.capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
>  		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1),
> +		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1A),

This will break the workaround on AC03, since the second macro reassigns
::midr_range.

You'll want to use ERRATA_MIDR_RANGE_LIST() instead w/ an array of
affected MIDRs.
Oliver Upton Aug. 26, 2024, 11:28 p.m. UTC | #2
Also, +cc Marc + the rest of the KVM folks.

checkpatch doesn't help in this situation, but it'd be good to keep
everyone in the loop since this is an erratum that affects KVM.

On Mon, Aug 26, 2024 at 04:24:00PM -0700, Oliver Upton wrote:
> Hi D Scott,
> 
> On Mon, Aug 26, 2024 at 02:59:33PM -0700, D Scott Phillips wrote:
> > The ampere1a cpu is affected by erratum AC04_CPU_10 which is the same
> > bug as AC03_CPU38. Add ampere1a to the AC03_CPU_38 workaround midr list.
> > 
> > Signed-off-by: D Scott Phillips <scott@os.amperecomputing.com>
> > ---
> >  Documentation/arch/arm64/silicon-errata.rst | 2 ++
> >  arch/arm64/Kconfig                          | 2 +-
> >  arch/arm64/include/asm/cputype.h            | 2 ++
> >  arch/arm64/kernel/cpu_errata.c              | 1 +
> >  4 files changed, 6 insertions(+), 1 deletion(-)
> > 
> > diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
> > index 50327c05be8d1..39c52385f11fb 100644
> > --- a/Documentation/arch/arm64/silicon-errata.rst
> > +++ b/Documentation/arch/arm64/silicon-errata.rst
> > @@ -55,6 +55,8 @@ stable kernels.
> >  +----------------+-----------------+-----------------+-----------------------------+
> >  | Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
> >  +----------------+-----------------+-----------------+-----------------------------+
> > +| Ampere         | AmpereOne AC04  | AC04_CPU_10     | AMPERE_ERRATUM_AC03_CPU_38  |
> > ++----------------+-----------------+-----------------+-----------------------------+
> 
> We tend to stick the marketing term for a part in the second column so
> it is more recognizable for the user. Is this a placeholder for something
> different from "ampere1a"?
> 
> > diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
> > index f6b6b45073571..748aa536446ae 100644
> > --- a/arch/arm64/kernel/cpu_errata.c
> > +++ b/arch/arm64/kernel/cpu_errata.c
> > @@ -773,6 +773,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
> >  		.desc = "AmpereOne erratum AC03_CPU_38",
> >  		.capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
> >  		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1),
> > +		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
> 
> This will break the workaround on AC03, since the second macro reassigns
> ::midr_range.
> 
> You'll want to use ERRATA_MIDR_RANGE_LIST() instead w/ an array of
> affected MIDRs.
> 
> -- 
> Thanks,
> Oliver
Anshuman Khandual Aug. 27, 2024, 1:52 a.m. UTC | #3
On 8/27/24 04:53, Oliver Upton wrote:
> Hi D Scott,
> 
> On Mon, Aug 26, 2024 at 02:59:33PM -0700, D Scott Phillips wrote:
>> The ampere1a cpu is affected by erratum AC04_CPU_10 which is the same
>> bug as AC03_CPU38. Add ampere1a to the AC03_CPU_38 workaround midr list.
>>
>> Signed-off-by: D Scott Phillips <scott@os.amperecomputing.com>
>> ---
>>  Documentation/arch/arm64/silicon-errata.rst | 2 ++
>>  arch/arm64/Kconfig                          | 2 +-
>>  arch/arm64/include/asm/cputype.h            | 2 ++
>>  arch/arm64/kernel/cpu_errata.c              | 1 +
>>  4 files changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
>> index 50327c05be8d1..39c52385f11fb 100644
>> --- a/Documentation/arch/arm64/silicon-errata.rst
>> +++ b/Documentation/arch/arm64/silicon-errata.rst
>> @@ -55,6 +55,8 @@ stable kernels.
>>  +----------------+-----------------+-----------------+-----------------------------+
>>  | Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
>>  +----------------+-----------------+-----------------+-----------------------------+
>> +| Ampere         | AmpereOne AC04  | AC04_CPU_10     | AMPERE_ERRATUM_AC03_CPU_38  |
>> ++----------------+-----------------+-----------------+-----------------------------+
> 
> We tend to stick the marketing term for a part in the second column so
> it is more recognizable for the user. Is this a placeholder for something
> different from "ampere1a"?

Agreed, even the MIDR being added here is for AMPERE1A. Probably something
like 'AmpereOneA' might be more suitable.

> 
>> diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
>> index f6b6b45073571..748aa536446ae 100644
>> --- a/arch/arm64/kernel/cpu_errata.c
>> +++ b/arch/arm64/kernel/cpu_errata.c
>> @@ -773,6 +773,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
>>  		.desc = "AmpereOne erratum AC03_CPU_38",
>>  		.capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
>>  		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1),
>> +		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
> 
> This will break the workaround on AC03, since the second macro reassigns
> ::midr_range.
> 
> You'll want to use ERRATA_MIDR_RANGE_LIST() instead w/ an array of
> affected MIDRs.
> 

+1

Although ERRATA_MIDR_RANGE_LIST() in turn creates such a list.
D Scott Phillips Aug. 27, 2024, 4:02 p.m. UTC | #4
Anshuman Khandual <anshuman.khandual@arm.com> writes:

> On 8/27/24 04:53, Oliver Upton wrote:
>> Hi D Scott,
>> 
>> On Mon, Aug 26, 2024 at 02:59:33PM -0700, D Scott Phillips wrote:
>>> The ampere1a cpu is affected by erratum AC04_CPU_10 which is the same
>>> bug as AC03_CPU38. Add ampere1a to the AC03_CPU_38 workaround midr list.
>>>
>>> Signed-off-by: D Scott Phillips <scott@os.amperecomputing.com>
>>> ---
>>>  Documentation/arch/arm64/silicon-errata.rst | 2 ++
>>>  arch/arm64/Kconfig                          | 2 +-
>>>  arch/arm64/include/asm/cputype.h            | 2 ++
>>>  arch/arm64/kernel/cpu_errata.c              | 1 +
>>>  4 files changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
>>> index 50327c05be8d1..39c52385f11fb 100644
>>> --- a/Documentation/arch/arm64/silicon-errata.rst
>>> +++ b/Documentation/arch/arm64/silicon-errata.rst
>>> @@ -55,6 +55,8 @@ stable kernels.
>>>  +----------------+-----------------+-----------------+-----------------------------+
>>>  | Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
>>>  +----------------+-----------------+-----------------+-----------------------------+
>>> +| Ampere         | AmpereOne AC04  | AC04_CPU_10     | AMPERE_ERRATUM_AC03_CPU_38  |
>>> ++----------------+-----------------+-----------------+-----------------------------+
>> 
>> We tend to stick the marketing term for a part in the second column so
>> it is more recognizable for the user. Is this a placeholder for something
>> different from "ampere1a"?
>
> Agreed, even the MIDR being added here is for AMPERE1A. Probably something
> like 'AmpereOneA' might be more suitable.

"AmpereOne AC04" was given to me by our marketing department, so that
should be the user visible name of the part when they buy/use
it. ampere1a is the name of the core in the SoC and the thing you can
use in gcc's --mtune=, similar to "neoverse-n1" within "Ampere Altra".

>> 
>>> diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
>>> index f6b6b45073571..748aa536446ae 100644
>>> --- a/arch/arm64/kernel/cpu_errata.c
>>> +++ b/arch/arm64/kernel/cpu_errata.c
>>> @@ -773,6 +773,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
>>>  		.desc = "AmpereOne erratum AC03_CPU_38",
>>>  		.capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
>>>  		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1),
>>> +		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
>> 
>> This will break the workaround on AC03, since the second macro reassigns
>> ::midr_range.
>> 
>> You'll want to use ERRATA_MIDR_RANGE_LIST() instead w/ an array of
>> affected MIDRs.
>> 
>
> +1
>
> Although ERRATA_MIDR_RANGE_LIST() in turn creates such a list.

Oops, my mistake. I'll fix this.
diff mbox series

Patch

diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
index 50327c05be8d1..39c52385f11fb 100644
--- a/Documentation/arch/arm64/silicon-errata.rst
+++ b/Documentation/arch/arm64/silicon-errata.rst
@@ -55,6 +55,8 @@  stable kernels.
 +----------------+-----------------+-----------------+-----------------------------+
 | Ampere         | AmpereOne       | AC03_CPU_38     | AMPERE_ERRATUM_AC03_CPU_38  |
 +----------------+-----------------+-----------------+-----------------------------+
+| Ampere         | AmpereOne AC04  | AC04_CPU_10     | AMPERE_ERRATUM_AC03_CPU_38  |
++----------------+-----------------+-----------------+-----------------------------+
 +----------------+-----------------+-----------------+-----------------------------+
 | ARM            | Cortex-A510     | #2457168        | ARM64_ERRATUM_2457168       |
 +----------------+-----------------+-----------------+-----------------------------+
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index a2f8ff354ca67..c8cba20a4d11b 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -423,7 +423,7 @@  config AMPERE_ERRATUM_AC03_CPU_38
 	default y
 	help
 	  This option adds an alternative code sequence to work around Ampere
-	  erratum AC03_CPU_38 on AmpereOne.
+	  errata AC03_CPU_38 and AC04_CPU_10 on AmpereOne.
 
 	  The affected design reports FEAT_HAFDBS as not implemented in
 	  ID_AA64MMFR1_EL1.HAFDBS, but (V)TCR_ELx.{HA,HD} are not RES0
diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
index 5fd7caea44193..5a7dfeb8e8eb5 100644
--- a/arch/arm64/include/asm/cputype.h
+++ b/arch/arm64/include/asm/cputype.h
@@ -143,6 +143,7 @@ 
 #define APPLE_CPU_PART_M2_AVALANCHE_MAX	0x039
 
 #define AMPERE_CPU_PART_AMPERE1		0xAC3
+#define AMPERE_CPU_PART_AMPERE1A	0xAC4
 
 #define MICROSOFT_CPU_PART_AZURE_COBALT_100	0xD49 /* Based on r0p0 of ARM Neoverse N2 */
 
@@ -212,6 +213,7 @@ 
 #define MIDR_APPLE_M2_BLIZZARD_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_BLIZZARD_MAX)
 #define MIDR_APPLE_M2_AVALANCHE_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_AVALANCHE_MAX)
 #define MIDR_AMPERE1 MIDR_CPU_MODEL(ARM_CPU_IMP_AMPERE, AMPERE_CPU_PART_AMPERE1)
+#define MIDR_AMPERE1A MIDR_CPU_MODEL(ARM_CPU_IMP_AMPERE, AMPERE_CPU_PART_AMPERE1A)
 #define MIDR_MICROSOFT_AZURE_COBALT_100 MIDR_CPU_MODEL(ARM_CPU_IMP_MICROSOFT, MICROSOFT_CPU_PART_AZURE_COBALT_100)
 
 /* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
index f6b6b45073571..748aa536446ae 100644
--- a/arch/arm64/kernel/cpu_errata.c
+++ b/arch/arm64/kernel/cpu_errata.c
@@ -773,6 +773,7 @@  const struct arm64_cpu_capabilities arm64_errata[] = {
 		.desc = "AmpereOne erratum AC03_CPU_38",
 		.capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38,
 		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1),
+		ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
 	},
 #endif
 	{