MIPS: Loongson: Add Loongson-3A R3 basic support
authorHuacai Chen <chenhc@lemote.com>
Thu, 22 Jun 2017 15:06:48 +0000 (23:06 +0800)
committerAurelien Jarno <aurel32@debian.org>
Fri, 2 Mar 2018 07:52:22 +0000 (07:52 +0000)
Loongson-3A R3 is very similar to Loongson-3A R2.

All Loongson-3 CPU family:

Code-name       Brand-name       PRId
Loongson-3A R1  Loongson-3A1000  0x6305
Loongson-3A R2  Loongson-3A2000  0x6308
Loongson-3A R3  Loongson-3A3000  0x6309
Loongson-3B R1  Loongson-3B1000  0x6306
Loongson-3B R2  Loongson-3B1500  0x6307

Signed-off-by: Huacai Chen <chenhc@lemote.com>
Cc: John Crispin <john@phrozen.org>
Cc: Steven J . Hill <Steven.Hill@cavium.com>
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/16585/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Gbp-Pq: Topic features/mips
Gbp-Pq: Name mips-loongson-add-loongson-3a-r3-basic-support.patch

arch/mips/include/asm/cpu.h
arch/mips/kernel/cpu-probe.c
arch/mips/loongson64/common/env.c
arch/mips/loongson64/loongson-3/smp.c
drivers/platform/mips/cpu_hwmon.c

index 9a8372484edc0f3dd48daf5e06a532473ff911db..255ead7dc29e0d9e005f1fb3746f248375b2af2d 100644 (file)
 #define PRID_REV_LOONGSON3B_R1 0x0006
 #define PRID_REV_LOONGSON3B_R2 0x0007
 #define PRID_REV_LOONGSON3A_R2 0x0008
+#define PRID_REV_LOONGSON3A_R3 0x0009
 
 /*
  * Older processors used to encode processor version and revision in two
index 921211bcd2badd221e461181de14de67be1cc10b..a3e2dd7f4e6523bf0d2b7c8e568670cbbfc1e20c 100644 (file)
@@ -1821,6 +1821,12 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
                        set_elf_platform(cpu, "loongson3a");
                        set_isa(c, MIPS_CPU_ISA_M64R2);
                        break;
+               case PRID_REV_LOONGSON3A_R3:
+                       c->cputype = CPU_LOONGSON3;
+                       __cpu_name[cpu] = "ICT Loongson-3";
+                       set_elf_platform(cpu, "loongson3a");
+                       set_isa(c, MIPS_CPU_ISA_M64R2);
+                       break;
                }
 
                decode_configs(c);
index 57d590ac80045b9bf9848a6e216d22d72cff33d9..98307c26eace196c15837e3c215ca280527f3ee2 100644 (file)
@@ -193,6 +193,7 @@ void __init prom_init_env(void)
                        break;
                case PRID_REV_LOONGSON3A_R1:
                case PRID_REV_LOONGSON3A_R2:
+               case PRID_REV_LOONGSON3A_R3:
                        cpu_clock_freq = 900000000;
                        break;
                case PRID_REV_LOONGSON3B_R1:
index 99aab9f859044e01111c2cfba9b97bc186edc38e..4db1798f04f614556722128672ea47219422ea9b 100644 (file)
@@ -502,7 +502,7 @@ static void loongson3a_r1_play_dead(int *state_addr)
                : "a1");
 }
 
-static void loongson3a_r2_play_dead(int *state_addr)
+static void loongson3a_r2r3_play_dead(int *state_addr)
 {
        register int val;
        register long cpuid, core, node, count;
@@ -663,8 +663,9 @@ void play_dead(void)
                        (void *)CKSEG1ADDR((unsigned long)loongson3a_r1_play_dead);
                break;
        case PRID_REV_LOONGSON3A_R2:
+       case PRID_REV_LOONGSON3A_R3:
                play_dead_at_ckseg1 =
-                       (void *)CKSEG1ADDR((unsigned long)loongson3a_r2_play_dead);
+                       (void *)CKSEG1ADDR((unsigned long)loongson3a_r2r3_play_dead);
                break;
        case PRID_REV_LOONGSON3B_R1:
        case PRID_REV_LOONGSON3B_R2:
index 4300a558d0f39a4d15e7743368bc2a3a68e98b8e..46ab7d86ae1c8c0234b7f890cd06843dc98c6010 100644 (file)
  */
 int loongson3_cpu_temp(int cpu)
 {
-       u32 reg;
+       u32 reg, prid_rev;
 
        reg = LOONGSON_CHIPTEMP(cpu);
-       if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1)
+       prid_rev = read_c0_prid() & PRID_REV_MASK;
+       switch (prid_rev) {
+       case PRID_REV_LOONGSON3A_R1:
                reg = (reg >> 8) & 0xff;
-       else
+               break;
+       case PRID_REV_LOONGSON3A_R2:
+       case PRID_REV_LOONGSON3B_R1:
+       case PRID_REV_LOONGSON3B_R2:
                reg = ((reg >> 8) & 0xff) - 100;
-
+               break;
+       case PRID_REV_LOONGSON3A_R3:
+               reg = (reg & 0xffff)*731/0x4000 - 273;
+               break;
+       }
        return (int)reg * 1000;
 }