diff options
Diffstat (limited to 'arch/mips/include/asm/mach-paravirt/kernel-entry-init.h')
| -rw-r--r-- | arch/mips/include/asm/mach-paravirt/kernel-entry-init.h | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h b/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h new file mode 100644 index 00000000000..2f82bfa3a77 --- /dev/null +++ b/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h @@ -0,0 +1,50 @@ +/* + * 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) 2013 Cavium, Inc + */ +#ifndef __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H +#define __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H + +#define CP0_EBASE $15, 1 + +	.macro  kernel_entry_setup +	mfc0	t0, CP0_EBASE +	andi	t0, t0, 0x3ff		# CPUNum +	beqz	t0, 1f +	# CPUs other than zero goto smp_bootstrap +	j	smp_bootstrap + +1: +	.endm + +/* + * Do SMP slave processor setup necessary before we can safely execute + * C code. + */ +	.macro  smp_slave_setup +	mfc0	t0, CP0_EBASE +	andi	t0, t0, 0x3ff		# CPUNum +	slti	t1, t0, NR_CPUS +	bnez	t1, 1f +2: +	di +	wait +	b	2b			# Unknown CPU, loop forever. +1: +	PTR_LA	t1, paravirt_smp_sp +	PTR_SLL	t0, PTR_SCALESHIFT +	PTR_ADDU t1, t1, t0 +3: +	PTR_L	sp, 0(t1) +	beqz	sp, 3b			# Spin until told to proceed. + +	PTR_LA	t1, paravirt_smp_gp +	PTR_ADDU t1, t1, t0 +	sync +	PTR_L	gp, 0(t1) +	.endm + +#endif /* __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H */  | 
