130ad29bbSHuacai Chen /* 230ad29bbSHuacai Chen * This file is subject to the terms and conditions of the GNU General Public 330ad29bbSHuacai Chen * License. See the file "COPYING" in the main directory of this archive 430ad29bbSHuacai Chen * for more details. 530ad29bbSHuacai Chen * 630ad29bbSHuacai Chen * Copyright (C) 2005 Embedded Alley Solutions, Inc 730ad29bbSHuacai Chen * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) 830ad29bbSHuacai Chen * Copyright (C) 2009 Jiajie Chen (chenjiajie@cse.buaa.edu.cn) 930ad29bbSHuacai Chen * Copyright (C) 2012 Huacai Chen (chenhc@lemote.com) 1030ad29bbSHuacai Chen */ 1130ad29bbSHuacai Chen #ifndef __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H 1230ad29bbSHuacai Chen #define __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H 1330ad29bbSHuacai Chen 14c824ad16SHuacai Chen #include <asm/cpu.h> 15c824ad16SHuacai Chen 1630ad29bbSHuacai Chen /* 1730ad29bbSHuacai Chen * Override macros used in arch/mips/kernel/head.S. 1830ad29bbSHuacai Chen */ 1930ad29bbSHuacai Chen .macro kernel_entry_setup 2030ad29bbSHuacai Chen .set push 2130ad29bbSHuacai Chen .set mips64 2230ad29bbSHuacai Chen /* Set ELPA on LOONGSON3 pagegrain */ 2397ab1bb4SHuacai Chen mfc0 t0, CP0_PAGEGRAIN 24b2edcfc8SHuacai Chen or t0, (0x1 << 29) 2597ab1bb4SHuacai Chen mtc0 t0, CP0_PAGEGRAIN 261e820da3SHuacai Chen /* Enable STFill Buffer */ 27c824ad16SHuacai Chen mfc0 t0, CP0_PRID 287507445bSHuacai Chen /* Loongson-3A R4+ */ 297507445bSHuacai Chen andi t1, t0, PRID_IMP_MASK 307507445bSHuacai Chen li t2, PRID_IMP_LOONGSON_64G 317507445bSHuacai Chen beq t1, t2, 1f 327507445bSHuacai Chen nop 337507445bSHuacai Chen /* Loongson-3A R2/R3 */ 34c824ad16SHuacai Chen andi t0, (PRID_IMP_MASK | PRID_REV_MASK) 35*7e6c8ff5SNathan Chancellor slti t0, t0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) 367507445bSHuacai Chen bnez t0, 2f 377507445bSHuacai Chen nop 387507445bSHuacai Chen 1: 3997ab1bb4SHuacai Chen mfc0 t0, CP0_CONFIG6 401e820da3SHuacai Chen or t0, 0x100 4197ab1bb4SHuacai Chen mtc0 t0, CP0_CONFIG6 427507445bSHuacai Chen 2: 4330ad29bbSHuacai Chen _ehb 4430ad29bbSHuacai Chen .set pop 4530ad29bbSHuacai Chen .endm 4630ad29bbSHuacai Chen 4730ad29bbSHuacai Chen /* 4830ad29bbSHuacai Chen * Do SMP slave processor setup. 4930ad29bbSHuacai Chen */ 5030ad29bbSHuacai Chen .macro smp_slave_setup 5130ad29bbSHuacai Chen .set push 5230ad29bbSHuacai Chen .set mips64 5330ad29bbSHuacai Chen /* Set ELPA on LOONGSON3 pagegrain */ 5497ab1bb4SHuacai Chen mfc0 t0, CP0_PAGEGRAIN 55b2edcfc8SHuacai Chen or t0, (0x1 << 29) 5697ab1bb4SHuacai Chen mtc0 t0, CP0_PAGEGRAIN 571e820da3SHuacai Chen /* Enable STFill Buffer */ 58c824ad16SHuacai Chen mfc0 t0, CP0_PRID 597507445bSHuacai Chen /* Loongson-3A R4+ */ 607507445bSHuacai Chen andi t1, t0, PRID_IMP_MASK 617507445bSHuacai Chen li t2, PRID_IMP_LOONGSON_64G 627507445bSHuacai Chen beq t1, t2, 1f 637507445bSHuacai Chen nop 647507445bSHuacai Chen /* Loongson-3A R2/R3 */ 65c824ad16SHuacai Chen andi t0, (PRID_IMP_MASK | PRID_REV_MASK) 66*7e6c8ff5SNathan Chancellor slti t0, t0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) 677507445bSHuacai Chen bnez t0, 2f 687507445bSHuacai Chen nop 697507445bSHuacai Chen 1: 7097ab1bb4SHuacai Chen mfc0 t0, CP0_CONFIG6 711e820da3SHuacai Chen or t0, 0x100 7297ab1bb4SHuacai Chen mtc0 t0, CP0_CONFIG6 737507445bSHuacai Chen 2: 7430ad29bbSHuacai Chen _ehb 7530ad29bbSHuacai Chen .set pop 7630ad29bbSHuacai Chen .endm 7730ad29bbSHuacai Chen 786ce48897SHuacai Chen #define USE_KEXEC_SMP_WAIT_FINAL 796ce48897SHuacai Chen .macro kexec_smp_wait_final 806ce48897SHuacai Chen /* s0:prid s1:initfn */ 816ce48897SHuacai Chen /* a0:base t1:cpuid t2:node t9:count */ 826ce48897SHuacai Chen mfc0 t1, CP0_EBASE 836ce48897SHuacai Chen andi t1, MIPS_EBASE_CPUNUM 846ce48897SHuacai Chen dins a0, t1, 8, 2 /* insert core id*/ 856ce48897SHuacai Chen dext t2, t1, 2, 2 866ce48897SHuacai Chen dins a0, t2, 44, 2 /* insert node id */ 876ce48897SHuacai Chen mfc0 s0, CP0_PRID 886ce48897SHuacai Chen andi s0, s0, (PRID_IMP_MASK | PRID_REV_MASK) 896ce48897SHuacai Chen beq s0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3B_R1), 1f 906ce48897SHuacai Chen beq s0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3B_R2), 1f 916ce48897SHuacai Chen b 2f /* Loongson-3A1000/3A2000/3A3000/3A4000 */ 926ce48897SHuacai Chen 1: dins a0, t2, 14, 2 /* Loongson-3B1000/3B1500 need bit 15~14 */ 936ce48897SHuacai Chen 2: li t9, 0x100 /* wait for init loop */ 946ce48897SHuacai Chen 3: addiu t9, -1 /* limit mailbox access */ 956ce48897SHuacai Chen bnez t9, 3b 966ce48897SHuacai Chen lw s1, 0x20(a0) /* check PC as an indicator */ 976ce48897SHuacai Chen beqz s1, 2b 986ce48897SHuacai Chen ld s1, 0x20(a0) /* get PC via mailbox reg0 */ 996ce48897SHuacai Chen ld sp, 0x28(a0) /* get SP via mailbox reg1 */ 1006ce48897SHuacai Chen ld gp, 0x30(a0) /* get GP via mailbox reg2 */ 1016ce48897SHuacai Chen ld a1, 0x38(a0) 1026ce48897SHuacai Chen jr s1 /* jump to initial PC */ 1036ce48897SHuacai Chen .endm 1046ce48897SHuacai Chen 10530ad29bbSHuacai Chen #endif /* __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H */ 106