12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
2e2186023SMichael Ellerman/*
3e2186023SMichael Ellerman * Copyright 2013, Michael (Ellerman|Neuling), IBM Corporation.
4e2186023SMichael Ellerman */
5e2186023SMichael Ellerman
6e2186023SMichael Ellerman#include <asm/asm-offsets.h>
7e2186023SMichael Ellerman#include <asm/ppc_asm.h>
8e2186023SMichael Ellerman#include <asm/reg.h>
9e2186023SMichael Ellerman
10e2186023SMichael Ellerman#include "subcore.h"
11e2186023SMichael Ellerman
12e2186023SMichael Ellerman
13e2186023SMichael Ellerman_GLOBAL(split_core_secondary_loop)
14e2186023SMichael Ellerman	/*
15e2186023SMichael Ellerman	 * r3 = u8 *state, used throughout the routine
16e2186023SMichael Ellerman	 * r4 = temp
17e2186023SMichael Ellerman	 * r5 = temp
18e2186023SMichael Ellerman	 * ..
19e2186023SMichael Ellerman	 * r12 = MSR
20e2186023SMichael Ellerman	 */
21e2186023SMichael Ellerman	mfmsr	r12
22e2186023SMichael Ellerman
23e2186023SMichael Ellerman	/* Disable interrupts so SRR0/1 don't get trashed */
24e2186023SMichael Ellerman	li	r4,0
25e2186023SMichael Ellerman	ori	r4,r4,MSR_EE|MSR_SE|MSR_BE|MSR_RI
26e2186023SMichael Ellerman	andc	r4,r12,r4
27e2186023SMichael Ellerman	sync
28e2186023SMichael Ellerman	mtmsrd	r4
29e2186023SMichael Ellerman
30e2186023SMichael Ellerman	/* Switch to real mode and leave interrupts off */
31e2186023SMichael Ellerman	li	r5, MSR_IR|MSR_DR
32e2186023SMichael Ellerman	andc	r5, r4, r5
33e2186023SMichael Ellerman
34e2186023SMichael Ellerman	LOAD_REG_ADDR(r4, real_mode)
35e2186023SMichael Ellerman
36e2186023SMichael Ellerman	mtspr	SPRN_SRR0,r4
37e2186023SMichael Ellerman	mtspr	SPRN_SRR1,r5
38e2186023SMichael Ellerman	rfid
39e2186023SMichael Ellerman	b	.	/* prevent speculative execution */
40e2186023SMichael Ellerman
41e2186023SMichael Ellermanreal_mode:
42e2186023SMichael Ellerman	/* Grab values from unsplit SPRs */
43e2186023SMichael Ellerman	mfspr	r6,  SPRN_LDBAR
44e2186023SMichael Ellerman	mfspr	r7,  SPRN_PMMAR
45e2186023SMichael Ellerman	mfspr	r8,  SPRN_PMCR
46e2186023SMichael Ellerman	mfspr	r9,  SPRN_RPR
47e2186023SMichael Ellerman	mfspr	r10, SPRN_SDR1
48e2186023SMichael Ellerman
49e2186023SMichael Ellerman	/* Order reading the SPRs vs telling the primary we are ready to split */
50e2186023SMichael Ellerman	sync
51e2186023SMichael Ellerman
52e2186023SMichael Ellerman	/* Tell thread 0 we are in real mode */
53e2186023SMichael Ellerman	li	r4, SYNC_STEP_REAL_MODE
54e2186023SMichael Ellerman	stb	r4, 0(r3)
55e2186023SMichael Ellerman
56e2186023SMichael Ellerman	li	r5, (HID0_POWER8_4LPARMODE | HID0_POWER8_2LPARMODE)@highest
57e2186023SMichael Ellerman	sldi	r5, r5, 48
58e2186023SMichael Ellerman
59e2186023SMichael Ellerman	/* Loop until we see the split happen in HID0 */
60e2186023SMichael Ellerman1:	mfspr	r4, SPRN_HID0
61e2186023SMichael Ellerman	and.	r4, r4, r5
62e2186023SMichael Ellerman	beq	1b
63e2186023SMichael Ellerman
64e2186023SMichael Ellerman	/*
65e2186023SMichael Ellerman	 * We only need to initialise the below regs once for each subcore,
66e2186023SMichael Ellerman	 * but it's simpler and harmless to do it on each thread.
67e2186023SMichael Ellerman	 */
68e2186023SMichael Ellerman
69e2186023SMichael Ellerman	/* Make sure various SPRS have sane values */
70e2186023SMichael Ellerman	li	r4, 0
71e2186023SMichael Ellerman	mtspr	SPRN_LPID, r4
72e2186023SMichael Ellerman	mtspr	SPRN_PCR, r4
73e2186023SMichael Ellerman	mtspr	SPRN_HDEC, r4
74e2186023SMichael Ellerman
75e2186023SMichael Ellerman	/* Restore SPR values now we are split */
76e2186023SMichael Ellerman	mtspr	SPRN_LDBAR, r6
77e2186023SMichael Ellerman	mtspr	SPRN_PMMAR, r7
78e2186023SMichael Ellerman	mtspr	SPRN_PMCR, r8
79e2186023SMichael Ellerman	mtspr	SPRN_RPR, r9
80e2186023SMichael Ellerman	mtspr	SPRN_SDR1, r10
81e2186023SMichael Ellerman
82e2186023SMichael Ellerman	LOAD_REG_ADDR(r5, virtual_mode)
83e2186023SMichael Ellerman
84e2186023SMichael Ellerman	/* Get out of real mode */
85e2186023SMichael Ellerman	mtspr	SPRN_SRR0,r5
86e2186023SMichael Ellerman	mtspr	SPRN_SRR1,r12
87e2186023SMichael Ellerman	rfid
88e2186023SMichael Ellerman	b	.	/* prevent speculative execution */
89e2186023SMichael Ellerman
90e2186023SMichael Ellermanvirtual_mode:
91e2186023SMichael Ellerman	blr
92