xref: /openbmc/linux/arch/sparc/kernel/trampoline_32.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2d670bd4fSSam Ravnborg/*
3d670bd4fSSam Ravnborg * trampoline.S: SMP cpu boot-up trampoline code.
4d670bd4fSSam Ravnborg *
5d670bd4fSSam Ravnborg * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
6d670bd4fSSam Ravnborg * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7d670bd4fSSam Ravnborg */
8d670bd4fSSam Ravnborg
9d670bd4fSSam Ravnborg#include <asm/head.h>
10d670bd4fSSam Ravnborg#include <asm/psr.h>
11d670bd4fSSam Ravnborg#include <asm/page.h>
12d670bd4fSSam Ravnborg#include <asm/asi.h>
13d670bd4fSSam Ravnborg#include <asm/ptrace.h>
14d670bd4fSSam Ravnborg#include <asm/vaddrs.h>
15d670bd4fSSam Ravnborg#include <asm/contregs.h>
16d670bd4fSSam Ravnborg#include <asm/thread_info.h>
17d670bd4fSSam Ravnborg
18c68e5d39SDavid S. Miller	.globl sun4m_cpu_startup
19c68e5d39SDavid S. Miller	.globl sun4d_cpu_startup
20d670bd4fSSam Ravnborg
21d670bd4fSSam Ravnborg	.align 4
22d670bd4fSSam Ravnborg
23d670bd4fSSam Ravnborg/* When we start up a cpu for the first time it enters this routine.
24d670bd4fSSam Ravnborg * This initializes the chip from whatever state the prom left it
25d670bd4fSSam Ravnborg * in and sets PIL in %psr to 15, no irqs.
26d670bd4fSSam Ravnborg */
27d670bd4fSSam Ravnborg
28d670bd4fSSam Ravnborgsun4m_cpu_startup:
29d670bd4fSSam Ravnborgcpu1_startup:
30d670bd4fSSam Ravnborg	sethi	%hi(trapbase_cpu1), %g3
31d670bd4fSSam Ravnborg	b	1f
32d670bd4fSSam Ravnborg	 or	%g3, %lo(trapbase_cpu1), %g3
33d670bd4fSSam Ravnborg
34d670bd4fSSam Ravnborgcpu2_startup:
35d670bd4fSSam Ravnborg	sethi	%hi(trapbase_cpu2), %g3
36d670bd4fSSam Ravnborg	b	1f
37d670bd4fSSam Ravnborg	 or	%g3, %lo(trapbase_cpu2), %g3
38d670bd4fSSam Ravnborg
39d670bd4fSSam Ravnborgcpu3_startup:
40d670bd4fSSam Ravnborg	sethi	%hi(trapbase_cpu3), %g3
41d670bd4fSSam Ravnborg	b	1f
42d670bd4fSSam Ravnborg	 or	%g3, %lo(trapbase_cpu3), %g3
43d670bd4fSSam Ravnborg
44d670bd4fSSam Ravnborg1:
45d670bd4fSSam Ravnborg	/* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
46d670bd4fSSam Ravnborg	set	(PSR_PIL | PSR_S | PSR_PS), %g1
47d670bd4fSSam Ravnborg	wr	%g1, 0x0, %psr		! traps off though
48d670bd4fSSam Ravnborg	WRITE_PAUSE
49d670bd4fSSam Ravnborg
50d670bd4fSSam Ravnborg	/* Our %wim is one behind CWP */
51d670bd4fSSam Ravnborg	mov	2, %g1
52d670bd4fSSam Ravnborg	wr	%g1, 0x0, %wim
53d670bd4fSSam Ravnborg	WRITE_PAUSE
54d670bd4fSSam Ravnborg
55d670bd4fSSam Ravnborg	/* This identifies "this cpu". */
56d670bd4fSSam Ravnborg	wr	%g3, 0x0, %tbr
57d670bd4fSSam Ravnborg	WRITE_PAUSE
58d670bd4fSSam Ravnborg
59d670bd4fSSam Ravnborg	/* Give ourselves a stack and curptr. */
60d670bd4fSSam Ravnborg	set	current_set, %g5
61d670bd4fSSam Ravnborg	srl	%g3, 10, %g4
62d670bd4fSSam Ravnborg	and	%g4, 0xc, %g4
63d670bd4fSSam Ravnborg	ld	[%g5 + %g4], %g6
64d670bd4fSSam Ravnborg
65d670bd4fSSam Ravnborg	sethi	%hi(THREAD_SIZE - STACKFRAME_SZ), %sp
66d670bd4fSSam Ravnborg	or	%sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
67d670bd4fSSam Ravnborg	add	%g6, %sp, %sp
68d670bd4fSSam Ravnborg
69d670bd4fSSam Ravnborg	/* Turn on traps (PSR_ET). */
70d670bd4fSSam Ravnborg	rd	%psr, %g1
71d670bd4fSSam Ravnborg	wr	%g1, PSR_ET, %psr	! traps on
72d670bd4fSSam Ravnborg	WRITE_PAUSE
73d670bd4fSSam Ravnborg
74d670bd4fSSam Ravnborg	/* Init our caches, etc. */
75d670bd4fSSam Ravnborg	set	poke_srmmu, %g5
76d670bd4fSSam Ravnborg	ld	[%g5], %g5
77d670bd4fSSam Ravnborg	call	%g5
78d670bd4fSSam Ravnborg	 nop
79d670bd4fSSam Ravnborg
80d670bd4fSSam Ravnborg	/* Start this processor. */
81f9fd3488SSam Ravnborg	call	smp_callin
82d670bd4fSSam Ravnborg	 nop
83d670bd4fSSam Ravnborg
84f9fd3488SSam Ravnborg	b,a	smp_panic
85d670bd4fSSam Ravnborg
86d670bd4fSSam Ravnborg	.text
87d670bd4fSSam Ravnborg	.align	4
88d670bd4fSSam Ravnborg
89f9fd3488SSam Ravnborgsmp_panic:
90d670bd4fSSam Ravnborg	call	cpu_panic
91d670bd4fSSam Ravnborg	 nop
92d670bd4fSSam Ravnborg
93d670bd4fSSam Ravnborg/* CPUID in bootbus can be found at PA 0xff0140000 */
94d670bd4fSSam Ravnborg#define SUN4D_BOOTBUS_CPUID	0xf0140000
95d670bd4fSSam Ravnborg
96d670bd4fSSam Ravnborg	.align	4
97d670bd4fSSam Ravnborg
98d670bd4fSSam Ravnborgsun4d_cpu_startup:
99d670bd4fSSam Ravnborg	/* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
100d670bd4fSSam Ravnborg	set	(PSR_PIL | PSR_S | PSR_PS), %g1
101d670bd4fSSam Ravnborg	wr	%g1, 0x0, %psr		! traps off though
102d670bd4fSSam Ravnborg	WRITE_PAUSE
103d670bd4fSSam Ravnborg
104d670bd4fSSam Ravnborg	/* Our %wim is one behind CWP */
105d670bd4fSSam Ravnborg	mov	2, %g1
106d670bd4fSSam Ravnborg	wr	%g1, 0x0, %wim
107d670bd4fSSam Ravnborg	WRITE_PAUSE
108d670bd4fSSam Ravnborg
109d670bd4fSSam Ravnborg	/* Set tbr - we use just one trap table. */
110d670bd4fSSam Ravnborg	set	trapbase, %g1
111d670bd4fSSam Ravnborg	wr	%g1, 0x0, %tbr
112d670bd4fSSam Ravnborg	WRITE_PAUSE
113d670bd4fSSam Ravnborg
114d670bd4fSSam Ravnborg	/* Get our CPU id out of bootbus */
115d670bd4fSSam Ravnborg	set	SUN4D_BOOTBUS_CPUID, %g3
116d670bd4fSSam Ravnborg	lduba	[%g3] ASI_M_CTL, %g3
117d670bd4fSSam Ravnborg	and	%g3, 0xf8, %g3
118d670bd4fSSam Ravnborg	srl	%g3, 3, %g1
119d670bd4fSSam Ravnborg	sta	%g1, [%g0] ASI_M_VIKING_TMP1
120d670bd4fSSam Ravnborg
121d670bd4fSSam Ravnborg	/* Give ourselves a stack and curptr. */
122d670bd4fSSam Ravnborg	set	current_set, %g5
123d670bd4fSSam Ravnborg	srl	%g3, 1, %g4
124d670bd4fSSam Ravnborg	ld	[%g5 + %g4], %g6
125d670bd4fSSam Ravnborg
126d670bd4fSSam Ravnborg	sethi	%hi(THREAD_SIZE - STACKFRAME_SZ), %sp
127d670bd4fSSam Ravnborg	or	%sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
128d670bd4fSSam Ravnborg	add	%g6, %sp, %sp
129d670bd4fSSam Ravnborg
130d670bd4fSSam Ravnborg	/* Turn on traps (PSR_ET). */
131d670bd4fSSam Ravnborg	rd	%psr, %g1
132d670bd4fSSam Ravnborg	wr	%g1, PSR_ET, %psr	! traps on
133d670bd4fSSam Ravnborg	WRITE_PAUSE
134d670bd4fSSam Ravnborg
135d670bd4fSSam Ravnborg	/* Init our caches, etc. */
136d670bd4fSSam Ravnborg	set	poke_srmmu, %g5
137d670bd4fSSam Ravnborg	ld	[%g5], %g5
138d670bd4fSSam Ravnborg	call	%g5
139d670bd4fSSam Ravnborg	 nop
140d670bd4fSSam Ravnborg
141d670bd4fSSam Ravnborg	/* Start this processor. */
142f9fd3488SSam Ravnborg	call	smp_callin
143d670bd4fSSam Ravnborg	 nop
144d670bd4fSSam Ravnborg
145f9fd3488SSam Ravnborg	b,a	smp_panic
1468401707fSKonrad Eisele
1478401707fSKonrad Eisele	.align	4
1488401707fSKonrad Eisele        .global leon_smp_cpu_startup, smp_penguin_ctable
1498401707fSKonrad Eisele
1508401707fSKonrad Eiseleleon_smp_cpu_startup:
1518401707fSKonrad Eisele
1528401707fSKonrad Eisele        set smp_penguin_ctable,%g1
1538401707fSKonrad Eisele        ld [%g1+4],%g1
1548401707fSKonrad Eisele        srl %g1,4,%g1
1558401707fSKonrad Eisele        set 0x00000100,%g5 /* SRMMU_CTXTBL_PTR */
15631079488SSam Ravnborg	sta %g1, [%g5] ASI_LEON_MMUREGS
1578401707fSKonrad Eisele
1588401707fSKonrad Eisele	/* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
1598401707fSKonrad Eisele	set	(PSR_PIL | PSR_S | PSR_PS), %g1
1608401707fSKonrad Eisele	wr	%g1, 0x0, %psr		! traps off though
1618401707fSKonrad Eisele	WRITE_PAUSE
1628401707fSKonrad Eisele
1638401707fSKonrad Eisele	/* Our %wim is one behind CWP */
1648401707fSKonrad Eisele	mov	2, %g1
1658401707fSKonrad Eisele	wr	%g1, 0x0, %wim
1668401707fSKonrad Eisele	WRITE_PAUSE
1678401707fSKonrad Eisele
1688401707fSKonrad Eisele	/* Set tbr - we use just one trap table. */
1698401707fSKonrad Eisele	set	trapbase, %g1
1708401707fSKonrad Eisele	wr	%g1, 0x0, %tbr
1718401707fSKonrad Eisele	WRITE_PAUSE
1728401707fSKonrad Eisele
1738401707fSKonrad Eisele	/* Get our CPU id */
1748401707fSKonrad Eisele        rd     %asr17,%g3
1758401707fSKonrad Eisele
1768401707fSKonrad Eisele	/* Give ourselves a stack and curptr. */
1778401707fSKonrad Eisele	set	current_set, %g5
1788401707fSKonrad Eisele	srl	%g3, 28, %g4
1798401707fSKonrad Eisele	sll	%g4, 2, %g4
1808401707fSKonrad Eisele	ld	[%g5 + %g4], %g6
1818401707fSKonrad Eisele
1828401707fSKonrad Eisele	sethi	%hi(THREAD_SIZE - STACKFRAME_SZ), %sp
1838401707fSKonrad Eisele	or	%sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
1848401707fSKonrad Eisele	add	%g6, %sp, %sp
1858401707fSKonrad Eisele
1868401707fSKonrad Eisele	/* Turn on traps (PSR_ET). */
1878401707fSKonrad Eisele	rd	%psr, %g1
1888401707fSKonrad Eisele	wr	%g1, PSR_ET, %psr	! traps on
1898401707fSKonrad Eisele	WRITE_PAUSE
1908401707fSKonrad Eisele
1918401707fSKonrad Eisele	/* Init our caches, etc. */
1928401707fSKonrad Eisele	set	poke_srmmu, %g5
1938401707fSKonrad Eisele	ld	[%g5], %g5
1948401707fSKonrad Eisele	call	%g5
1958401707fSKonrad Eisele	 nop
1968401707fSKonrad Eisele
1978401707fSKonrad Eisele	/* Start this processor. */
198f9fd3488SSam Ravnborg	call	smp_callin
1998401707fSKonrad Eisele	 nop
2008401707fSKonrad Eisele
201f9fd3488SSam Ravnborg	b,a	smp_panic
202