| From 4178838a75a664cdc1ab106ace0195050eeffa16 Mon Sep 17 00:00:00 2001 |
| From: Jiaxun Yang <jiaxun.yang@flygoat.com> |
| Date: Wed, 29 May 2019 16:42:59 +0800 |
| Subject: [PATCH] MIPS: Treat Loongson Extensions as ASEs |
| |
| commit d2f965549006acb865c4638f1f030ebcefdc71f6 upstream. |
| |
| Recently, binutils had split Loongson-3 Extensions into four ASEs: |
| MMI, CAM, EXT, EXT2. This patch do the samething in kernel and expose |
| them in cpuinfo so applications can probe supported ASEs at runtime. |
| |
| Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> |
| Cc: Huacai Chen <chenhc@lemote.com> |
| Cc: Yunqiang Su <ysu@wavecomp.com> |
| Cc: stable@vger.kernel.org # v4.14+ |
| Signed-off-by: Paul Burton <paul.burton@mips.com> |
| Cc: linux-mips@vger.kernel.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h |
| index 6998a9796499..4e2bea8875f5 100644 |
| --- a/arch/mips/include/asm/cpu-features.h |
| +++ b/arch/mips/include/asm/cpu-features.h |
| @@ -397,6 +397,22 @@ |
| #define cpu_has_dsp3 __ase(MIPS_ASE_DSP3) |
| #endif |
| |
| +#ifndef cpu_has_loongson_mmi |
| +#define cpu_has_loongson_mmi __ase(MIPS_ASE_LOONGSON_MMI) |
| +#endif |
| + |
| +#ifndef cpu_has_loongson_cam |
| +#define cpu_has_loongson_cam __ase(MIPS_ASE_LOONGSON_CAM) |
| +#endif |
| + |
| +#ifndef cpu_has_loongson_ext |
| +#define cpu_has_loongson_ext __ase(MIPS_ASE_LOONGSON_EXT) |
| +#endif |
| + |
| +#ifndef cpu_has_loongson_ext2 |
| +#define cpu_has_loongson_ext2 __ase(MIPS_ASE_LOONGSON_EXT2) |
| +#endif |
| + |
| #ifndef cpu_has_mipsmt |
| #define cpu_has_mipsmt __isa_lt_and_ase(6, MIPS_ASE_MIPSMT) |
| #endif |
| diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h |
| index 6ad7d3cabd91..cc15670ef43a 100644 |
| --- a/arch/mips/include/asm/cpu.h |
| +++ b/arch/mips/include/asm/cpu.h |
| @@ -438,5 +438,9 @@ enum cpu_type_enum { |
| #define MIPS_ASE_MSA 0x00000100 /* MIPS SIMD Architecture */ |
| #define MIPS_ASE_DSP3 0x00000200 /* Signal Processing ASE Rev 3*/ |
| #define MIPS_ASE_MIPS16E2 0x00000400 /* MIPS16e2 */ |
| +#define MIPS_ASE_LOONGSON_MMI 0x00000800 /* Loongson MultiMedia extensions Instructions */ |
| +#define MIPS_ASE_LOONGSON_CAM 0x00001000 /* Loongson CAM */ |
| +#define MIPS_ASE_LOONGSON_EXT 0x00002000 /* Loongson EXTensions */ |
| +#define MIPS_ASE_LOONGSON_EXT2 0x00004000 /* Loongson EXTensions R2 */ |
| |
| #endif /* _ASM_CPU_H */ |
| diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c |
| index e654ffc1c8a0..e698a20017c1 100644 |
| --- a/arch/mips/kernel/cpu-probe.c |
| +++ b/arch/mips/kernel/cpu-probe.c |
| @@ -1573,6 +1573,8 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) |
| __cpu_name[cpu] = "ICT Loongson-3"; |
| set_elf_platform(cpu, "loongson3a"); |
| set_isa(c, MIPS_CPU_ISA_M64R1); |
| + c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM | |
| + MIPS_ASE_LOONGSON_EXT); |
| break; |
| case PRID_REV_LOONGSON3B_R1: |
| case PRID_REV_LOONGSON3B_R2: |
| @@ -1580,6 +1582,8 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) |
| __cpu_name[cpu] = "ICT Loongson-3"; |
| set_elf_platform(cpu, "loongson3b"); |
| set_isa(c, MIPS_CPU_ISA_M64R1); |
| + c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM | |
| + MIPS_ASE_LOONGSON_EXT); |
| break; |
| } |
| |
| @@ -1946,6 +1950,8 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu) |
| decode_configs(c); |
| c->options |= MIPS_CPU_FTLB | MIPS_CPU_TLBINV | MIPS_CPU_LDPTE; |
| c->writecombine = _CACHE_UNCACHED_ACCELERATED; |
| + c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM | |
| + MIPS_ASE_LOONGSON_EXT | MIPS_ASE_LOONGSON_EXT2); |
| break; |
| default: |
| panic("Unknown Loongson Processor ID!"); |
| diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c |
| index b2de408a259e..f8d36710cd58 100644 |
| --- a/arch/mips/kernel/proc.c |
| +++ b/arch/mips/kernel/proc.c |
| @@ -124,6 +124,10 @@ static int show_cpuinfo(struct seq_file *m, void *v) |
| if (cpu_has_eva) seq_printf(m, "%s", " eva"); |
| if (cpu_has_htw) seq_printf(m, "%s", " htw"); |
| if (cpu_has_xpa) seq_printf(m, "%s", " xpa"); |
| + if (cpu_has_loongson_mmi) seq_printf(m, "%s", " loongson-mmi"); |
| + if (cpu_has_loongson_cam) seq_printf(m, "%s", " loongson-cam"); |
| + if (cpu_has_loongson_ext) seq_printf(m, "%s", " loongson-ext"); |
| + if (cpu_has_loongson_ext2) seq_printf(m, "%s", " loongson-ext2"); |
| seq_printf(m, "\n"); |
| |
| if (cpu_has_mmips) { |
| -- |
| 2.7.4 |
| |