mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.7 KiB
105 lines
2.7 KiB
/* |
|
* This file is subject to the terms and conditions of the GNU General Public |
|
* License. See the file "COPYING" in the main directory of this archive |
|
* for more details. |
|
* |
|
* Copyright (C) 2005 Embedded Alley Solutions, Inc |
|
* Copyright (C) 2005 Ralf Baechle ([email protected]) |
|
* Copyright (C) 2009 Jiajie Chen ([email protected]) |
|
* Copyright (C) 2012 Huacai Chen ([email protected]) |
|
*/ |
|
#ifndef __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H |
|
#define __ASM_MACH_LOONGSON64_KERNEL_ENTRY_H |
|
|
|
#include <asm/cpu.h> |
|
|
|
/* |
|
* Override macros used in arch/mips/kernel/head.S. |
|
*/ |
|
.macro kernel_entry_setup |
|
.set push |
|
.set mips64 |
|
/* Set ELPA on LOONGSON3 pagegrain */ |
|
mfc0 t0, CP0_PAGEGRAIN |
|
or t0, (0x1 << 29) |
|
mtc0 t0, CP0_PAGEGRAIN |
|
/* Enable STFill Buffer */ |
|
mfc0 t0, CP0_PRID |
|
/* Loongson-3A R4+ */ |
|
andi t1, t0, PRID_IMP_MASK |
|
li t2, PRID_IMP_LOONGSON_64G |
|
beq t1, t2, 1f |
|
nop |
|
/* Loongson-3A R2/R3 */ |
|
andi t0, (PRID_IMP_MASK | PRID_REV_MASK) |
|
slti t0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) |
|
bnez t0, 2f |
|
nop |
|
1: |
|
mfc0 t0, CP0_CONFIG6 |
|
or t0, 0x100 |
|
mtc0 t0, CP0_CONFIG6 |
|
2: |
|
_ehb |
|
.set pop |
|
.endm |
|
|
|
/* |
|
* Do SMP slave processor setup. |
|
*/ |
|
.macro smp_slave_setup |
|
.set push |
|
.set mips64 |
|
/* Set ELPA on LOONGSON3 pagegrain */ |
|
mfc0 t0, CP0_PAGEGRAIN |
|
or t0, (0x1 << 29) |
|
mtc0 t0, CP0_PAGEGRAIN |
|
/* Enable STFill Buffer */ |
|
mfc0 t0, CP0_PRID |
|
/* Loongson-3A R4+ */ |
|
andi t1, t0, PRID_IMP_MASK |
|
li t2, PRID_IMP_LOONGSON_64G |
|
beq t1, t2, 1f |
|
nop |
|
/* Loongson-3A R2/R3 */ |
|
andi t0, (PRID_IMP_MASK | PRID_REV_MASK) |
|
slti t0, (PRID_IMP_LOONGSON_64C | PRID_REV_LOONGSON3A_R2_0) |
|
bnez t0, 2f |
|
nop |
|
1: |
|
mfc0 t0, CP0_CONFIG6 |
|
or t0, 0x100 |
|
mtc0 t0, CP0_CONFIG6 |
|
2: |
|
_ehb |
|
.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 */
|
|
|