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