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