Merge tag 'mips_5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
[linux-2.6-microblaze.git] / arch / mips / include / asm / mach-loongson64 / kernel-entry-init.h
index e4d77f4..13373c5 100644 (file)
        .set    pop
        .endm
 
+#define USE_KEXEC_SMP_WAIT_FINAL
+       .macro  kexec_smp_wait_final
+       /* s0:prid s1:initfn */
+       /* a0:base t1:cpuid t2:node t9:count */
+       mfc0            t1, CP0_EBASE
+       andi            t1, MIPS_EBASE_CPUNUM
+       dins            a0, t1, 8, 2       /* insert core id*/
+       dext            t2, t1, 2, 2
+       dins            a0, t2, 44, 2      /* insert node id */
+       mfc0            s0, CP0_PRID
+       andi            s0, s0, (PRID_IMP_MASK | PRID_REV_MASK)
+       beq             s0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3B_R1), 1f
+       beq             s0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3B_R2), 1f
+       b               2f                 /* Loongson-3A1000/3A2000/3A3000/3A4000 */
+1:     dins            a0, t2, 14, 2      /* Loongson-3B1000/3B1500 need bit 15~14 */
+2:     li              t9, 0x100          /* wait for init loop */
+3:     addiu           t9, -1             /* limit mailbox access */
+       bnez            t9, 3b
+       lw              s1, 0x20(a0)       /* check PC as an indicator */
+       beqz            s1, 2b
+       ld              s1, 0x20(a0)       /* get PC via mailbox reg0 */
+       ld              sp, 0x28(a0)       /* get SP via mailbox reg1 */
+       ld              gp, 0x30(a0)       /* get GP via mailbox reg2 */
+       ld              a1, 0x38(a0)
+       jr              s1                 /* jump to initial PC */
+       .endm
+
 #endif /* __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H */