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