1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2013 Cavium, Inc
7 */
8#ifndef __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H
9#define __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H
10
11#define CP0_EBASE $15, 1
12
13	.macro  kernel_entry_setup
14	mfc0	t0, CP0_EBASE
15	andi	t0, t0, 0x3ff		# CPUNum
16	beqz	t0, 1f
17	# CPUs other than zero goto smp_bootstrap
18	j	smp_bootstrap
19
201:
21	.endm
22
23/*
24 * Do SMP slave processor setup necessary before we can safely execute
25 * C code.
26 */
27	.macro  smp_slave_setup
28	mfc0	t0, CP0_EBASE
29	andi	t0, t0, 0x3ff		# CPUNum
30	slti	t1, t0, NR_CPUS
31	bnez	t1, 1f
322:
33	di
34	wait
35	b	2b			# Unknown CPU, loop forever.
361:
37	PTR_LA	t1, paravirt_smp_sp
38	PTR_SLL	t0, PTR_SCALESHIFT
39	PTR_ADDU t1, t1, t0
403:
41	PTR_L	sp, 0(t1)
42	beqz	sp, 3b			# Spin until told to proceed.
43
44	PTR_LA	t1, paravirt_smp_gp
45	PTR_ADDU t1, t1, t0
46	sync
47	PTR_L	gp, 0(t1)
48	.endm
49
50#endif /* __ASM_MACH_PARAVIRT_KERNEL_ENTRY_H */
51