#define PRID_REV_LOONGSON1C            0x0020  /* Same as Loongson-1B */
 #define PRID_REV_LOONGSON2E            0x0002
 #define PRID_REV_LOONGSON2F            0x0003
+#define PRID_REV_LOONGSON2K_R1_0       0x0000
+#define PRID_REV_LOONGSON2K_R1_1       0x0001
+#define PRID_REV_LOONGSON2K_R1_2       0x0002
+#define PRID_REV_LOONGSON2K_R1_3       0x0003
 #define PRID_REV_LOONGSON3A_R1         0x0005
 #define PRID_REV_LOONGSON3B_R1         0x0006
 #define PRID_REV_LOONGSON3B_R2         0x0007
 
 static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
 {
        switch (c->processor_id & PRID_IMP_MASK) {
-       case PRID_IMP_LOONGSON_64C:  /* Loongson-2/3 */
+       case PRID_IMP_LOONGSON_64R: /* Loongson-64 Reduced */
+               switch (c->processor_id & PRID_REV_MASK) {
+               case PRID_REV_LOONGSON2K_R1_0:
+               case PRID_REV_LOONGSON2K_R1_1:
+               case PRID_REV_LOONGSON2K_R1_2:
+               case PRID_REV_LOONGSON2K_R1_3:
+                       c->cputype = CPU_LOONGSON64;
+                       __cpu_name[cpu] = "Loongson-2K";
+                       set_elf_platform(cpu, "gs264e");
+                       set_isa(c, MIPS_CPU_ISA_M64R2);
+                       break;
+               }
+               decode_configs(c);
+               c->writecombine = _CACHE_UNCACHED_ACCELERATED;
+               c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_EXT |
+                               MIPS_ASE_LOONGSON_EXT2);
+               break;
+       case PRID_IMP_LOONGSON_64C:  /* Loongson-3 Classic */
                switch (c->processor_id & PRID_REV_MASK) {
                case PRID_REV_LOONGSON3A_R2_0:
                case PRID_REV_LOONGSON3A_R2_1:
 
                break;
        case CPU_LOONGSON64:
                if ((c->processor_id & (PRID_IMP_MASK | PRID_REV_MASK)) >=
-                               (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0))
+                               (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) ||
+                               (c->processor_id & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R)
                        cpu_wait = r4k_wait;
                break;
 
 
                                          c->dcache.linesz;
                c->dcache.waybit = 0;
                if ((c->processor_id & (PRID_IMP_MASK | PRID_REV_MASK)) >=
-                               (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0))
+                               (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) ||
+                               (c->processor_id & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R)
                        c->options |= MIPS_CPU_PREFETCH;
                break;
 
        scache_size = c->scache.sets *
                                  c->scache.ways *
                                  c->scache.linesz;
-       /* Loongson-3 has 4 cores, 1MB scache for each. scaches are shared */
-       scache_size *= 4;
+
+       /* Loongson-3 has 4-Scache banks, while Loongson-2K have only 2 banks */
+       if ((c->processor_id & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R)
+               scache_size *= 2;
+       else
+               scache_size *= 4;
+
        c->scache.waybit = 0;
        c->scache.waysize = scache_size / c->scache.ways;
        pr_info("Unified secondary cache %ldkB %s, linesize %d bytes.\n",