MIPS: Treat Loongson Extensions as ASEs
authorJiaxun Yang <jiaxun.yang@flygoat.com>
Wed, 29 May 2019 08:42:59 +0000 (16:42 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Oct 2019 16:20:55 +0000 (18:20 +0200)
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/mips/include/asm/cpu-features.h
arch/mips/include/asm/cpu.h
arch/mips/kernel/cpu-probe.c
arch/mips/kernel/proc.c

index 0edba3e..4e2ee74 100644 (file)
 #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
index dacbdb8..2b4b14a 100644 (file)
@@ -436,5 +436,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 */
index 25cd873..958b627 100644 (file)
@@ -1489,6 +1489,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:
@@ -1496,6 +1498,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;
                }
 
@@ -1861,6 +1865,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!");
index b2de408..f8d3671 100644 (file)
@@ -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) {