MIPS: Treat Loongson Extensions as ASEs
authorJiaxun Yang <jiaxun.yang@flygoat.com>
Wed, 29 May 2019 08:42:59 +0000 (16:42 +0800)
committerPaul Burton <paul.burton@mips.com>
Mon, 26 Aug 2019 10:42:40 +0000 (11:42 +0100)
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
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 6998a9796499b0d1c190d72ae33a444272942ded..4e2bea8875f5f4acc427f5df307e9dd86edd5bb6 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 6826f0a657fb7f622d1f87e8976558f4c2cc6750..7fddcb8350c645821a1cf49911309aa9f07b8301 100644 (file)
@@ -428,5 +428,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 93b46be14688fe71fcdf04d8f11e09396eb5b4d5..c2eb392597bf65a4320877f41839712e8a90b6aa 100644 (file)
@@ -1547,6 +1547,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:
@@ -1554,6 +1556,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;
                }
 
@@ -1920,6 +1924,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 b2de408a259e493b65a4b28abe0a746081f0aa78..f8d36710cd581f8b628056d09c406f8195c43619 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) {