Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * License.  See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2011 by Kevin Cernekee (cernekee@gmail.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Reset/NMI/re-entry vectors for BMIPS processors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <asm/asm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <asm/asmmacro.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <asm/cacheops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <asm/cpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/regdef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/mipsregs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <asm/stackframe.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <asm/addrspace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <asm/hazards.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <asm/bmips.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	.macro	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	.set	mips32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	_ssnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	_ssnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	_ssnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	.set	mips0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	.endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) /***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * Alternate CPU1 startup vector for BMIPS4350
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  * On some systems the bootloader has already started CPU1 and configured
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * it to resume execution at 0x8000_0200 (!BEV IV vector) when it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * triggered by the SW1 interrupt.  If that is the case we try to move
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * it to a more convenient place: BMIPS_WARM_RESTART_VEC @ 0x8000_0380.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  ***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) LEAF(bmips_smp_movevec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	la	k0, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	li	k1, CKSEG1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	or	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	jr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	/* clear IV, pending IPIs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	mtc0	zero, CP0_CAUSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	/* re-enable IRQs to wait for SW1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	li	k0, ST0_IE | ST0_BEV | STATUSF_IP1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	mtc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	/* set up CPU1 CBR; move BASE to 0xa000_0000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	li	k0, 0xff400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	mtc0	k0, $22, 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	/* set up relocation vector address based on thread ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	mfc0	k1, $22, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	srl	k1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	andi	k1, 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	or	k1, CKSEG1 | BMIPS_RELO_VECTOR_CONTROL_0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	or	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	li	k1, 0xa0080000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	sw	k1, 0(k0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	/* wait here for SW1 interrupt from bmips_boot_secondary() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	wait
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	la	k0, bmips_reset_nmi_vec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	li	k1, CKSEG1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	or	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	jr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) END(bmips_smp_movevec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) /***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  * Reset/NMI vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  * For BMIPS processors that can relocate their exception vectors, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  * entire function gets copied to 0x8000_0000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  ***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) NESTED(bmips_reset_nmi_vec, PT_SIZE, sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	.set	push
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	.set	noat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	/* if the NMI bit is clear, assume this is a CPU1 reset instead */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	li	k1, (1 << 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	mfc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	and	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	beqz	k0, soft_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #if defined(CONFIG_CPU_BMIPS5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	mfc0	k0, CP0_PRID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	li	k1, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	/* mask with PRID_IMP_BMIPS5000 to cover both variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	andi	k0, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	bne	k0, k1, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	/* if we're not on core 0, this must be the SMP boot signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	li	k1, (3 << 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	mfc0	k0, $22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	and	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	bnez	k0, bmips_smp_entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #endif /* CONFIG_CPU_BMIPS5000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	/* nope, it's just a regular NMI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	move	a0, sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	/* clear EXL, ERL, BEV so that TLB refills still work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	mfc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	li	k1, ST0_ERL | ST0_EXL | ST0_BEV | ST0_IE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	or	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	xor	k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	mtc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	/* jump to the NMI handler function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	la	k0, nmi_handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	jr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	RESTORE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.set	arch=r4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	eret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) soft_reset:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #if defined(CONFIG_CPU_BMIPS5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	mfc0	k0, CP0_PRID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	andi	k0, 0xff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	li	k1, PRID_IMP_BMIPS5200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	bne	k0, k1, bmips_smp_entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)         /* if running on TP 1, jump  to  bmips_smp_entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)         mfc0    k0, $22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)         li      k1, (1 << 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)         and     k1, k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)         bnez    k1, bmips_smp_entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)         nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)         /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)          * running on TP0, can not be core 0 (the boot core).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)          * Check for soft reset.  Indicates a warm boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)         mfc0    k0, $12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)         li      k1, (1 << 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)         and     k0, k1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)         beqz    k0, bmips_smp_entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)         /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)          * Warm boot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)          * Cache init is only done on TP0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)          */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)         la      k0, bmips_5xxx_init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)         jalr    k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)         nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)         b       bmips_smp_entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)         nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)  * CPU1 reset vector (used for the initial boot only)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)  * This is still part of bmips_reset_nmi_vec().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)  ***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) bmips_smp_entry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	/* set up CP0 STATUS; enable FPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	li	k0, 0x30000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	mtc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	/* set local CP0 CONFIG to make kseg0 cacheable, write-back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	mfc0	k0, CP0_CONFIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	ori	k0, 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	xori	k0, 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	mtc0	k0, CP0_CONFIG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	mfc0	k0, CP0_PRID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	andi	k0, 0xff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #if defined(CONFIG_CPU_BMIPS4350) || defined(CONFIG_CPU_BMIPS4380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	li	k1, PRID_IMP_BMIPS43XX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	bne	k0, k1, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	/* initialize CPU1's local I-cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	li	k0, 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	li	k1, 0x80010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	mtc0	zero, $28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	mtc0	zero, $28, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 1:	cache	Index_Store_Tag_I, 0(k0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	addiu	k0, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	bne	k0, k1, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	b	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #endif /* CONFIG_CPU_BMIPS4350 || CONFIG_CPU_BMIPS4380 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #if defined(CONFIG_CPU_BMIPS5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	/* mask with PRID_IMP_BMIPS5000 to cover both variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	li	k1, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	andi	k0, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	bne	k0, k1, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	/* set exception vector base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	la	k0, ebase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	lw	k0, 0(k0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	mtc0	k0, $15, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #endif /* CONFIG_CPU_BMIPS5000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	/* jump back to kseg0 in case we need to remap the kseg1 area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	la	k0, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	jr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	la	k0, bmips_enable_xks01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	jalr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	/* use temporary stack to set up upper memory TLB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	li	sp, BMIPS_WARM_RESTART_VEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	la	k0, plat_wired_tlb_setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	jalr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	/* switch to permanent stack and continue booting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	.global bmips_secondary_reentry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) bmips_secondary_reentry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	la	k0, bmips_smp_boot_sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	lw	sp, 0(k0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	la	k0, bmips_smp_boot_gp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	lw	gp, 0(k0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	la	k0, start_secondary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	jr	k0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #endif /* CONFIG_SMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	.global bmips_reset_nmi_vec_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) bmips_reset_nmi_vec_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) END(bmips_reset_nmi_vec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	.set	pop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)  * CPU1 warm restart vector (used for second and subsequent boots).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)  * Also used for S2 standby recovery (PM).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)  * This entire function gets copied to (BMIPS_WARM_RESTART_VEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)  ***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) LEAF(bmips_smp_int_vec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	mfc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	ori	k0, 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	xori	k0, 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	mtc0	k0, CP0_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	eret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	.global bmips_smp_int_vec_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) bmips_smp_int_vec_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) END(bmips_smp_int_vec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)  * XKS01 support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)  * Certain CPUs support extending kseg0 to 1024MB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)  ***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) LEAF(bmips_enable_xks01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #if defined(CONFIG_XKS01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	mfc0	t0, CP0_PRID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	andi	t2, t0, 0xff00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #if defined(CONFIG_CPU_BMIPS4380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	li	t1, PRID_IMP_BMIPS43XX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	bne	t2, t1, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	andi	t0, 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	addiu	t1, t0, -PRID_REV_BMIPS4380_HI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	bgtz	t1, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	addiu	t0, -PRID_REV_BMIPS4380_LO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	bltz	t0, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	mfc0	t0, $22, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	li	t1, 0x1ff0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	li	t2, (1 << 12) | (1 << 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	or	t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	xor	t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	or	t0, t2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	mtc0	t0, $22, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	b	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #endif /* CONFIG_CPU_BMIPS4380 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #if defined(CONFIG_CPU_BMIPS5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	li	t1, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	/* mask with PRID_IMP_BMIPS5000 to cover both variants */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	andi	t2, PRID_IMP_BMIPS5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	bne	t2, t1, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	mfc0	t0, $22, 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	li	t1, 0x01ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	li	t2, (1 << 8) | (1 << 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	or	t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	xor	t0, t1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	or	t0, t2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	mtc0	t0, $22, 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	BARRIER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #endif /* CONFIG_CPU_BMIPS5000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #endif /* defined(CONFIG_XKS01) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	jr	ra
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) END(bmips_enable_xks01)