Skip to content

Commit 3f3f64c

Browse files
committed
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Will Deacon: "It's a little busier than normal, but it's still not a lot of code and things seem fairly quiet in general: - Fix allocation failure during SVE coredumps - Fix handling of SVE context on signal delivery - Enable Neoverse N2 CPU errata workarounds for Microsoft's "Azure Cobalt 100" clone - Work around CMN PMU erratum in AmpereOneX implementation - Fix typo in CXL PMU event definition - Fix jump label asm constraints" * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64/sve: Lower the maximum allocation for the SVE ptrace regset arm64: Subscribe Microsoft Azure Cobalt 100 to ARM Neoverse N2 errata perf/arm-cmn: Workaround AmpereOneX errata AC04_MESH_1 (incorrect child count) arm64: jump_label: use constraints "Si" instead of "i" arm64: fix typo in comments perf: CXL: fix mismatched cpmu event opcode arm64/signal: Don't assume that TIF_SVE means we saved SVE state
2 parents efb0b63 + 2813926 commit 3f3f64c

File tree

11 files changed

+46
-16
lines changed

11 files changed

+46
-16
lines changed

Documentation/arch/arm64/silicon-errata.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,10 @@ stable kernels.
243243
+----------------+-----------------+-----------------+-----------------------------+
244244
| ASR | ASR8601 | #8601001 | N/A |
245245
+----------------+-----------------+-----------------+-----------------------------+
246+
+----------------+-----------------+-----------------+-----------------------------+
247+
| Microsoft | Azure Cobalt 100| #2139208 | ARM64_ERRATUM_2139208 |
248+
+----------------+-----------------+-----------------+-----------------------------+
249+
| Microsoft | Azure Cobalt 100| #2067961 | ARM64_ERRATUM_2067961 |
250+
+----------------+-----------------+-----------------+-----------------------------+
251+
| Microsoft | Azure Cobalt 100| #2253138 | ARM64_ERRATUM_2253138 |
252+
+----------------+-----------------+-----------------+-----------------------------+

arch/arm64/include/asm/cpufeature.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ struct arm64_ftr_bits {
8383
* to full-0 denotes that this field has no override
8484
*
8585
* A @mask field set to full-0 with the corresponding @val field set
86-
* to full-1 denotes thath this field has an invalid override.
86+
* to full-1 denotes that this field has an invalid override.
8787
*/
8888
struct arm64_ftr_override {
8989
u64 val;

arch/arm64/include/asm/cputype.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
#define ARM_CPU_IMP_HISI 0x48
6262
#define ARM_CPU_IMP_APPLE 0x61
6363
#define ARM_CPU_IMP_AMPERE 0xC0
64+
#define ARM_CPU_IMP_MICROSOFT 0x6D
6465

6566
#define ARM_CPU_PART_AEM_V8 0xD0F
6667
#define ARM_CPU_PART_FOUNDATION 0xD00
@@ -135,6 +136,8 @@
135136

136137
#define AMPERE_CPU_PART_AMPERE1 0xAC3
137138

139+
#define MICROSOFT_CPU_PART_AZURE_COBALT_100 0xD49 /* Based on r0p0 of ARM Neoverse N2 */
140+
138141
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
139142
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
140143
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
@@ -193,6 +196,7 @@
193196
#define MIDR_APPLE_M2_BLIZZARD_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_BLIZZARD_MAX)
194197
#define MIDR_APPLE_M2_AVALANCHE_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_AVALANCHE_MAX)
195198
#define MIDR_AMPERE1 MIDR_CPU_MODEL(ARM_CPU_IMP_AMPERE, AMPERE_CPU_PART_AMPERE1)
199+
#define MIDR_MICROSOFT_AZURE_COBALT_100 MIDR_CPU_MODEL(ARM_CPU_IMP_MICROSOFT, MICROSOFT_CPU_PART_AZURE_COBALT_100)
196200

197201
/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
198202
#define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX

arch/arm64/include/asm/fpsimd.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ static inline void cpacr_restore(unsigned long cpacr)
6262
* When we defined the maximum SVE vector length we defined the ABI so
6363
* that the maximum vector length included all the reserved for future
6464
* expansion bits in ZCR rather than those just currently defined by
65-
* the architecture. While SME follows a similar pattern the fact that
66-
* it includes a square matrix means that any allocations that attempt
67-
* to cover the maximum potential vector length (such as happen with
68-
* the regset used for ptrace) end up being extremely large. Define
69-
* the much lower actual limit for use in such situations.
65+
* the architecture. Using this length to allocate worst size buffers
66+
* results in excessively large allocations, and this effect is even
67+
* more pronounced for SME due to ZA. Define more suitable VLs for
68+
* these situations.
7069
*/
71-
#define SME_VQ_MAX 16
70+
#define ARCH_SVE_VQ_MAX ((ZCR_ELx_LEN_MASK >> ZCR_ELx_LEN_SHIFT) + 1)
71+
#define SME_VQ_MAX ((SMCR_ELx_LEN_MASK >> SMCR_ELx_LEN_SHIFT) + 1)
7272

7373
struct task_struct;
7474

arch/arm64/include/asm/jump_label.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515

1616
#define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE
1717

18+
/*
19+
* Prefer the constraint "S" to support PIC with GCC. Clang before 19 does not
20+
* support "S" on a symbol with a constant offset, so we use "i" as a fallback.
21+
*/
1822
static __always_inline bool arch_static_branch(struct static_key * const key,
1923
const bool branch)
2024
{
@@ -23,9 +27,9 @@ static __always_inline bool arch_static_branch(struct static_key * const key,
2327
" .pushsection __jump_table, \"aw\" \n\t"
2428
" .align 3 \n\t"
2529
" .long 1b - ., %l[l_yes] - . \n\t"
26-
" .quad %c0 - . \n\t"
30+
" .quad (%[key] - .) + %[bit0] \n\t"
2731
" .popsection \n\t"
28-
: : "i"(&((char *)key)[branch]) : : l_yes);
32+
: : [key]"Si"(key), [bit0]"i"(branch) : : l_yes);
2933

3034
return false;
3135
l_yes:
@@ -40,9 +44,9 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke
4044
" .pushsection __jump_table, \"aw\" \n\t"
4145
" .align 3 \n\t"
4246
" .long 1b - ., %l[l_yes] - . \n\t"
43-
" .quad %c0 - . \n\t"
47+
" .quad (%[key] - .) + %[bit0] \n\t"
4448
" .popsection \n\t"
45-
: : "i"(&((char *)key)[branch]) : : l_yes);
49+
: : [key]"Si"(key), [bit0]"i"(branch) : : l_yes);
4650

4751
return false;
4852
l_yes:

arch/arm64/kernel/cpu_errata.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ static const struct midr_range erratum_1463225[] = {
374374
static const struct midr_range trbe_overwrite_fill_mode_cpus[] = {
375375
#ifdef CONFIG_ARM64_ERRATUM_2139208
376376
MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
377+
MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
377378
#endif
378379
#ifdef CONFIG_ARM64_ERRATUM_2119858
379380
MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
@@ -387,6 +388,7 @@ static const struct midr_range trbe_overwrite_fill_mode_cpus[] = {
387388
static const struct midr_range tsb_flush_fail_cpus[] = {
388389
#ifdef CONFIG_ARM64_ERRATUM_2067961
389390
MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
391+
MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
390392
#endif
391393
#ifdef CONFIG_ARM64_ERRATUM_2054223
392394
MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
@@ -399,6 +401,7 @@ static const struct midr_range tsb_flush_fail_cpus[] = {
399401
static struct midr_range trbe_write_out_of_range_cpus[] = {
400402
#ifdef CONFIG_ARM64_ERRATUM_2253138
401403
MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
404+
MIDR_ALL_VERSIONS(MIDR_MICROSOFT_AZURE_COBALT_100),
402405
#endif
403406
#ifdef CONFIG_ARM64_ERRATUM_2224489
404407
MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),

arch/arm64/kernel/fpsimd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,7 @@ void fpsimd_preserve_current_state(void)
16351635
void fpsimd_signal_preserve_current_state(void)
16361636
{
16371637
fpsimd_preserve_current_state();
1638-
if (test_thread_flag(TIF_SVE))
1638+
if (current->thread.fp_type == FP_STATE_SVE)
16391639
sve_to_fpsimd(current);
16401640
}
16411641

arch/arm64/kernel/ptrace.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,8 @@ static const struct user_regset aarch64_regsets[] = {
15001500
#ifdef CONFIG_ARM64_SVE
15011501
[REGSET_SVE] = { /* Scalable Vector Extension */
15021502
.core_note_type = NT_ARM_SVE,
1503-
.n = DIV_ROUND_UP(SVE_PT_SIZE(SVE_VQ_MAX, SVE_PT_REGS_SVE),
1503+
.n = DIV_ROUND_UP(SVE_PT_SIZE(ARCH_SVE_VQ_MAX,
1504+
SVE_PT_REGS_SVE),
15041505
SVE_VQ_BYTES),
15051506
.size = SVE_VQ_BYTES,
15061507
.align = SVE_VQ_BYTES,

arch/arm64/kernel/signal.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ static int preserve_sve_context(struct sve_context __user *ctx)
242242
vl = task_get_sme_vl(current);
243243
vq = sve_vq_from_vl(vl);
244244
flags |= SVE_SIG_FLAG_SM;
245-
} else if (test_thread_flag(TIF_SVE)) {
245+
} else if (current->thread.fp_type == FP_STATE_SVE) {
246246
vq = sve_vq_from_vl(vl);
247247
}
248248

@@ -878,7 +878,7 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
878878
if (system_supports_sve() || system_supports_sme()) {
879879
unsigned int vq = 0;
880880

881-
if (add_all || test_thread_flag(TIF_SVE) ||
881+
if (add_all || current->thread.fp_type == FP_STATE_SVE ||
882882
thread_sm_enabled(&current->thread)) {
883883
int vl = max(sve_max_vl(), sme_max_vl());
884884

drivers/perf/arm-cmn.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2305,6 +2305,17 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
23052305
dev_dbg(cmn->dev, "ignoring external node %llx\n", reg);
23062306
continue;
23072307
}
2308+
/*
2309+
* AmpereOneX erratum AC04_MESH_1 makes some XPs report a bogus
2310+
* child count larger than the number of valid child pointers.
2311+
* A child offset of 0 can only occur on CMN-600; otherwise it
2312+
* would imply the root node being its own grandchild, which
2313+
* we can safely dismiss in general.
2314+
*/
2315+
if (reg == 0 && cmn->part != PART_CMN600) {
2316+
dev_dbg(cmn->dev, "bogus child pointer?\n");
2317+
continue;
2318+
}
23082319

23092320
arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn);
23102321

0 commit comments

Comments
 (0)