18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * This file contains low level CPU setup functions. 48c2ecf20Sopenharmony_ci * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org) 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <asm/processor.h> 88c2ecf20Sopenharmony_ci#include <asm/page.h> 98c2ecf20Sopenharmony_ci#include <asm/cputable.h> 108c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h> 118c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h> 128c2ecf20Sopenharmony_ci#include <asm/cache.h> 138c2ecf20Sopenharmony_ci#include <asm/mmu.h> 148c2ecf20Sopenharmony_ci#include <asm/feature-fixups.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_603) 178c2ecf20Sopenharmony_ci mflr r5 188c2ecf20Sopenharmony_ciBEGIN_MMU_FTR_SECTION 198c2ecf20Sopenharmony_ci li r10,0 208c2ecf20Sopenharmony_ci mtspr SPRN_SPRG_603_LRU,r10 /* init SW LRU tracking */ 218c2ecf20Sopenharmony_ciEND_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU) 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 248c2ecf20Sopenharmony_ci bl __init_fpu_registers 258c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFCLR(CPU_FTR_FPU_UNAVAILABLE) 268c2ecf20Sopenharmony_ci bl setup_common_caches 278c2ecf20Sopenharmony_ci mtlr r5 288c2ecf20Sopenharmony_ci blr 298c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_604) 308c2ecf20Sopenharmony_ci mflr r5 318c2ecf20Sopenharmony_ci bl setup_common_caches 328c2ecf20Sopenharmony_ci bl setup_604_hid0 338c2ecf20Sopenharmony_ci mtlr r5 348c2ecf20Sopenharmony_ci blr 358c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_750) 368c2ecf20Sopenharmony_ci mflr r5 378c2ecf20Sopenharmony_ci bl __init_fpu_registers 388c2ecf20Sopenharmony_ci bl setup_common_caches 398c2ecf20Sopenharmony_ci bl setup_750_7400_hid0 408c2ecf20Sopenharmony_ci mtlr r5 418c2ecf20Sopenharmony_ci blr 428c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_750cx) 438c2ecf20Sopenharmony_ci mflr r5 448c2ecf20Sopenharmony_ci bl __init_fpu_registers 458c2ecf20Sopenharmony_ci bl setup_common_caches 468c2ecf20Sopenharmony_ci bl setup_750_7400_hid0 478c2ecf20Sopenharmony_ci bl setup_750cx 488c2ecf20Sopenharmony_ci mtlr r5 498c2ecf20Sopenharmony_ci blr 508c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_750fx) 518c2ecf20Sopenharmony_ci mflr r5 528c2ecf20Sopenharmony_ci bl __init_fpu_registers 538c2ecf20Sopenharmony_ci bl setup_common_caches 548c2ecf20Sopenharmony_ci bl setup_750_7400_hid0 558c2ecf20Sopenharmony_ci bl setup_750fx 568c2ecf20Sopenharmony_ci mtlr r5 578c2ecf20Sopenharmony_ci blr 588c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_7400) 598c2ecf20Sopenharmony_ci mflr r5 608c2ecf20Sopenharmony_ci bl __init_fpu_registers 618c2ecf20Sopenharmony_ci bl setup_7400_workarounds 628c2ecf20Sopenharmony_ci bl setup_common_caches 638c2ecf20Sopenharmony_ci bl setup_750_7400_hid0 648c2ecf20Sopenharmony_ci mtlr r5 658c2ecf20Sopenharmony_ci blr 668c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_7410) 678c2ecf20Sopenharmony_ci mflr r5 688c2ecf20Sopenharmony_ci bl __init_fpu_registers 698c2ecf20Sopenharmony_ci bl setup_7410_workarounds 708c2ecf20Sopenharmony_ci bl setup_common_caches 718c2ecf20Sopenharmony_ci bl setup_750_7400_hid0 728c2ecf20Sopenharmony_ci li r3,0 738c2ecf20Sopenharmony_ci mtspr SPRN_L2CR2,r3 748c2ecf20Sopenharmony_ci mtlr r5 758c2ecf20Sopenharmony_ci blr 768c2ecf20Sopenharmony_ci_GLOBAL(__setup_cpu_745x) 778c2ecf20Sopenharmony_ci mflr r5 788c2ecf20Sopenharmony_ci bl setup_common_caches 798c2ecf20Sopenharmony_ci bl setup_745x_specifics 808c2ecf20Sopenharmony_ci mtlr r5 818c2ecf20Sopenharmony_ci blr 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/* Enable caches for 603's, 604, 750 & 7400 */ 848c2ecf20Sopenharmony_cisetup_common_caches: 858c2ecf20Sopenharmony_ci mfspr r11,SPRN_HID0 868c2ecf20Sopenharmony_ci andi. r0,r11,HID0_DCE 878c2ecf20Sopenharmony_ci ori r11,r11,HID0_ICE|HID0_DCE 888c2ecf20Sopenharmony_ci ori r8,r11,HID0_ICFI 898c2ecf20Sopenharmony_ci bne 1f /* don't invalidate the D-cache */ 908c2ecf20Sopenharmony_ci ori r8,r8,HID0_DCI /* unless it wasn't enabled */ 918c2ecf20Sopenharmony_ci1: sync 928c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r8 /* enable and invalidate caches */ 938c2ecf20Sopenharmony_ci sync 948c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r11 /* enable caches */ 958c2ecf20Sopenharmony_ci sync 968c2ecf20Sopenharmony_ci isync 978c2ecf20Sopenharmony_ci blr 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* 604, 604e, 604ev, ... 1008c2ecf20Sopenharmony_ci * Enable superscalar execution & branch history table 1018c2ecf20Sopenharmony_ci */ 1028c2ecf20Sopenharmony_cisetup_604_hid0: 1038c2ecf20Sopenharmony_ci mfspr r11,SPRN_HID0 1048c2ecf20Sopenharmony_ci ori r11,r11,HID0_SIED|HID0_BHTE 1058c2ecf20Sopenharmony_ci ori r8,r11,HID0_BTCD 1068c2ecf20Sopenharmony_ci sync 1078c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r8 /* flush branch target address cache */ 1088c2ecf20Sopenharmony_ci sync /* on 604e/604r */ 1098c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r11 1108c2ecf20Sopenharmony_ci sync 1118c2ecf20Sopenharmony_ci isync 1128c2ecf20Sopenharmony_ci blr 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci/* 7400 <= rev 2.7 and 7410 rev = 1.0 suffer from some 1158c2ecf20Sopenharmony_ci * erratas we work around here. 1168c2ecf20Sopenharmony_ci * Moto MPC710CE.pdf describes them, those are errata 1178c2ecf20Sopenharmony_ci * #3, #4 and #5 1188c2ecf20Sopenharmony_ci * Note that we assume the firmware didn't choose to 1198c2ecf20Sopenharmony_ci * apply other workarounds (there are other ones documented 1208c2ecf20Sopenharmony_ci * in the .pdf). It appear that Apple firmware only works 1218c2ecf20Sopenharmony_ci * around #3 and with the same fix we use. We may want to 1228c2ecf20Sopenharmony_ci * check if the CPU is using 60x bus mode in which case 1238c2ecf20Sopenharmony_ci * the workaround for errata #4 is useless. Also, we may 1248c2ecf20Sopenharmony_ci * want to explicitly clear HID0_NOPDST as this is not 1258c2ecf20Sopenharmony_ci * needed once we have applied workaround #5 (though it's 1268c2ecf20Sopenharmony_ci * not set by Apple's firmware at least). 1278c2ecf20Sopenharmony_ci */ 1288c2ecf20Sopenharmony_cisetup_7400_workarounds: 1298c2ecf20Sopenharmony_ci mfpvr r3 1308c2ecf20Sopenharmony_ci rlwinm r3,r3,0,20,31 1318c2ecf20Sopenharmony_ci cmpwi 0,r3,0x0207 1328c2ecf20Sopenharmony_ci ble 1f 1338c2ecf20Sopenharmony_ci blr 1348c2ecf20Sopenharmony_cisetup_7410_workarounds: 1358c2ecf20Sopenharmony_ci mfpvr r3 1368c2ecf20Sopenharmony_ci rlwinm r3,r3,0,20,31 1378c2ecf20Sopenharmony_ci cmpwi 0,r3,0x0100 1388c2ecf20Sopenharmony_ci bnelr 1398c2ecf20Sopenharmony_ci1: 1408c2ecf20Sopenharmony_ci mfspr r11,SPRN_MSSSR0 1418c2ecf20Sopenharmony_ci /* Errata #3: Set L1OPQ_SIZE to 0x10 */ 1428c2ecf20Sopenharmony_ci rlwinm r11,r11,0,9,6 1438c2ecf20Sopenharmony_ci oris r11,r11,0x0100 1448c2ecf20Sopenharmony_ci /* Errata #4: Set L2MQ_SIZE to 1 (check for MPX mode first ?) */ 1458c2ecf20Sopenharmony_ci oris r11,r11,0x0002 1468c2ecf20Sopenharmony_ci /* Errata #5: Set DRLT_SIZE to 0x01 */ 1478c2ecf20Sopenharmony_ci rlwinm r11,r11,0,5,2 1488c2ecf20Sopenharmony_ci oris r11,r11,0x0800 1498c2ecf20Sopenharmony_ci sync 1508c2ecf20Sopenharmony_ci mtspr SPRN_MSSSR0,r11 1518c2ecf20Sopenharmony_ci sync 1528c2ecf20Sopenharmony_ci isync 1538c2ecf20Sopenharmony_ci blr 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci/* 740/750/7400/7410 1568c2ecf20Sopenharmony_ci * Enable Store Gathering (SGE), Address Broadcast (ABE), 1578c2ecf20Sopenharmony_ci * Branch History Table (BHTE), Branch Target ICache (BTIC) 1588c2ecf20Sopenharmony_ci * Dynamic Power Management (DPM), Speculative (SPD) 1598c2ecf20Sopenharmony_ci * Clear Instruction cache throttling (ICTC) 1608c2ecf20Sopenharmony_ci */ 1618c2ecf20Sopenharmony_cisetup_750_7400_hid0: 1628c2ecf20Sopenharmony_ci mfspr r11,SPRN_HID0 1638c2ecf20Sopenharmony_ci ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC 1648c2ecf20Sopenharmony_ci oris r11,r11,HID0_DPM@h 1658c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 1668c2ecf20Sopenharmony_ci xori r11,r11,HID0_BTIC 1678c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC) 1688c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 1698c2ecf20Sopenharmony_ci xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */ 1708c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_NO_DPM) 1718c2ecf20Sopenharmony_ci li r3,HID0_SPD 1728c2ecf20Sopenharmony_ci andc r11,r11,r3 /* clear SPD: enable speculative */ 1738c2ecf20Sopenharmony_ci li r3,0 1748c2ecf20Sopenharmony_ci mtspr SPRN_ICTC,r3 /* Instruction Cache Throttling off */ 1758c2ecf20Sopenharmony_ci isync 1768c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r11 1778c2ecf20Sopenharmony_ci sync 1788c2ecf20Sopenharmony_ci isync 1798c2ecf20Sopenharmony_ci blr 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci/* 750cx specific 1828c2ecf20Sopenharmony_ci * Looks like we have to disable NAP feature for some PLL settings... 1838c2ecf20Sopenharmony_ci * (waiting for confirmation) 1848c2ecf20Sopenharmony_ci */ 1858c2ecf20Sopenharmony_cisetup_750cx: 1868c2ecf20Sopenharmony_ci mfspr r10, SPRN_HID1 1878c2ecf20Sopenharmony_ci rlwinm r10,r10,4,28,31 1888c2ecf20Sopenharmony_ci cmpwi cr0,r10,7 1898c2ecf20Sopenharmony_ci cmpwi cr1,r10,9 1908c2ecf20Sopenharmony_ci cmpwi cr2,r10,11 1918c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr1+eq 1928c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr2+eq 1938c2ecf20Sopenharmony_ci bnelr 1948c2ecf20Sopenharmony_ci lwz r6,CPU_SPEC_FEATURES(r4) 1958c2ecf20Sopenharmony_ci li r7,CPU_FTR_CAN_NAP 1968c2ecf20Sopenharmony_ci andc r6,r6,r7 1978c2ecf20Sopenharmony_ci stw r6,CPU_SPEC_FEATURES(r4) 1988c2ecf20Sopenharmony_ci blr 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci/* 750fx specific 2018c2ecf20Sopenharmony_ci */ 2028c2ecf20Sopenharmony_cisetup_750fx: 2038c2ecf20Sopenharmony_ci blr 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci/* MPC 745x 2068c2ecf20Sopenharmony_ci * Enable Store Gathering (SGE), Branch Folding (FOLD) 2078c2ecf20Sopenharmony_ci * Branch History Table (BHTE), Branch Target ICache (BTIC) 2088c2ecf20Sopenharmony_ci * Dynamic Power Management (DPM), Speculative (SPD) 2098c2ecf20Sopenharmony_ci * Ensure our data cache instructions really operate. 2108c2ecf20Sopenharmony_ci * Timebase has to be running or we wouldn't have made it here, 2118c2ecf20Sopenharmony_ci * just ensure we don't disable it. 2128c2ecf20Sopenharmony_ci * Clear Instruction cache throttling (ICTC) 2138c2ecf20Sopenharmony_ci * Enable L2 HW prefetch 2148c2ecf20Sopenharmony_ci */ 2158c2ecf20Sopenharmony_cisetup_745x_specifics: 2168c2ecf20Sopenharmony_ci /* We check for the presence of an L3 cache setup by 2178c2ecf20Sopenharmony_ci * the firmware. If any, we disable NAP capability as 2188c2ecf20Sopenharmony_ci * it's known to be bogus on rev 2.1 and earlier 2198c2ecf20Sopenharmony_ci */ 2208c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 2218c2ecf20Sopenharmony_ci mfspr r11,SPRN_L3CR 2228c2ecf20Sopenharmony_ci andis. r11,r11,L3CR_L3E@h 2238c2ecf20Sopenharmony_ci beq 1f 2248c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_L3CR) 2258c2ecf20Sopenharmony_ci lwz r6,CPU_SPEC_FEATURES(r4) 2268c2ecf20Sopenharmony_ci andis. r0,r6,CPU_FTR_L3_DISABLE_NAP@h 2278c2ecf20Sopenharmony_ci beq 1f 2288c2ecf20Sopenharmony_ci li r7,CPU_FTR_CAN_NAP 2298c2ecf20Sopenharmony_ci andc r6,r6,r7 2308c2ecf20Sopenharmony_ci stw r6,CPU_SPEC_FEATURES(r4) 2318c2ecf20Sopenharmony_ci1: 2328c2ecf20Sopenharmony_ci mfspr r11,SPRN_HID0 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci /* All of the bits we have to set..... 2358c2ecf20Sopenharmony_ci */ 2368c2ecf20Sopenharmony_ci ori r11,r11,HID0_SGE | HID0_FOLD | HID0_BHTE 2378c2ecf20Sopenharmony_ci ori r11,r11,HID0_LRSTK | HID0_BTIC 2388c2ecf20Sopenharmony_ci oris r11,r11,HID0_DPM@h 2398c2ecf20Sopenharmony_ciBEGIN_MMU_FTR_SECTION 2408c2ecf20Sopenharmony_ci oris r11,r11,HID0_HIGH_BAT@h 2418c2ecf20Sopenharmony_ciEND_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) 2428c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 2438c2ecf20Sopenharmony_ci xori r11,r11,HID0_BTIC 2448c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC) 2458c2ecf20Sopenharmony_ciBEGIN_FTR_SECTION 2468c2ecf20Sopenharmony_ci xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */ 2478c2ecf20Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_NO_DPM) 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci /* All of the bits we have to clear.... 2508c2ecf20Sopenharmony_ci */ 2518c2ecf20Sopenharmony_ci li r3,HID0_SPD | HID0_NOPDST | HID0_NOPTI 2528c2ecf20Sopenharmony_ci andc r11,r11,r3 /* clear SPD: enable speculative */ 2538c2ecf20Sopenharmony_ci li r3,0 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci mtspr SPRN_ICTC,r3 /* Instruction Cache Throttling off */ 2568c2ecf20Sopenharmony_ci isync 2578c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r11 2588c2ecf20Sopenharmony_ci sync 2598c2ecf20Sopenharmony_ci isync 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci /* Enable L2 HW prefetch, if L2 is enabled 2628c2ecf20Sopenharmony_ci */ 2638c2ecf20Sopenharmony_ci mfspr r3,SPRN_L2CR 2648c2ecf20Sopenharmony_ci andis. r3,r3,L2CR_L2E@h 2658c2ecf20Sopenharmony_ci beqlr 2668c2ecf20Sopenharmony_ci mfspr r3,SPRN_MSSCR0 2678c2ecf20Sopenharmony_ci ori r3,r3,3 2688c2ecf20Sopenharmony_ci sync 2698c2ecf20Sopenharmony_ci mtspr SPRN_MSSCR0,r3 2708c2ecf20Sopenharmony_ci sync 2718c2ecf20Sopenharmony_ci isync 2728c2ecf20Sopenharmony_ci blr 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/* 2758c2ecf20Sopenharmony_ci * Initialize the FPU registers. This is needed to work around an errata 2768c2ecf20Sopenharmony_ci * in some 750 cpus where using a not yet initialized FPU register after 2778c2ecf20Sopenharmony_ci * power on reset may hang the CPU 2788c2ecf20Sopenharmony_ci */ 2798c2ecf20Sopenharmony_ci_GLOBAL(__init_fpu_registers) 2808c2ecf20Sopenharmony_ci mfmsr r10 2818c2ecf20Sopenharmony_ci ori r11,r10,MSR_FP 2828c2ecf20Sopenharmony_ci mtmsr r11 2838c2ecf20Sopenharmony_ci isync 2848c2ecf20Sopenharmony_ci addis r9,r3,empty_zero_page@ha 2858c2ecf20Sopenharmony_ci addi r9,r9,empty_zero_page@l 2868c2ecf20Sopenharmony_ci REST_32FPRS(0,r9) 2878c2ecf20Sopenharmony_ci sync 2888c2ecf20Sopenharmony_ci mtmsr r10 2898c2ecf20Sopenharmony_ci isync 2908c2ecf20Sopenharmony_ci blr 2918c2ecf20Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(__init_fpu_registers) 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci/* Definitions for the table use to save CPU states */ 2958c2ecf20Sopenharmony_ci#define CS_HID0 0 2968c2ecf20Sopenharmony_ci#define CS_HID1 4 2978c2ecf20Sopenharmony_ci#define CS_HID2 8 2988c2ecf20Sopenharmony_ci#define CS_MSSCR0 12 2998c2ecf20Sopenharmony_ci#define CS_MSSSR0 16 3008c2ecf20Sopenharmony_ci#define CS_ICTRL 20 3018c2ecf20Sopenharmony_ci#define CS_LDSTCR 24 3028c2ecf20Sopenharmony_ci#define CS_LDSTDB 28 3038c2ecf20Sopenharmony_ci#define CS_SIZE 32 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci .data 3068c2ecf20Sopenharmony_ci .balign L1_CACHE_BYTES 3078c2ecf20Sopenharmony_cicpu_state_storage: 3088c2ecf20Sopenharmony_ci .space CS_SIZE 3098c2ecf20Sopenharmony_ci .balign L1_CACHE_BYTES,0 3108c2ecf20Sopenharmony_ci .text 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci/* Called in normal context to backup CPU 0 state. This 3138c2ecf20Sopenharmony_ci * does not include cache settings. This function is also 3148c2ecf20Sopenharmony_ci * called for machine sleep. This does not include the MMU 3158c2ecf20Sopenharmony_ci * setup, BATs, etc... but rather the "special" registers 3168c2ecf20Sopenharmony_ci * like HID0, HID1, MSSCR0, etc... 3178c2ecf20Sopenharmony_ci */ 3188c2ecf20Sopenharmony_ci_GLOBAL(__save_cpu_setup) 3198c2ecf20Sopenharmony_ci /* Some CR fields are volatile, we back it up all */ 3208c2ecf20Sopenharmony_ci mfcr r7 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci /* Get storage ptr */ 3238c2ecf20Sopenharmony_ci lis r5,cpu_state_storage@h 3248c2ecf20Sopenharmony_ci ori r5,r5,cpu_state_storage@l 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci /* Save HID0 (common to all CONFIG_PPC_BOOK3S_32 cpus) */ 3278c2ecf20Sopenharmony_ci mfspr r3,SPRN_HID0 3288c2ecf20Sopenharmony_ci stw r3,CS_HID0(r5) 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci /* Now deal with CPU type dependent registers */ 3318c2ecf20Sopenharmony_ci mfspr r3,SPRN_PVR 3328c2ecf20Sopenharmony_ci srwi r3,r3,16 3338c2ecf20Sopenharmony_ci cmplwi cr0,r3,0x8000 /* 7450 */ 3348c2ecf20Sopenharmony_ci cmplwi cr1,r3,0x000c /* 7400 */ 3358c2ecf20Sopenharmony_ci cmplwi cr2,r3,0x800c /* 7410 */ 3368c2ecf20Sopenharmony_ci cmplwi cr3,r3,0x8001 /* 7455 */ 3378c2ecf20Sopenharmony_ci cmplwi cr4,r3,0x8002 /* 7457 */ 3388c2ecf20Sopenharmony_ci cmplwi cr5,r3,0x8003 /* 7447A */ 3398c2ecf20Sopenharmony_ci cmplwi cr6,r3,0x7000 /* 750FX */ 3408c2ecf20Sopenharmony_ci cmplwi cr7,r3,0x8004 /* 7448 */ 3418c2ecf20Sopenharmony_ci /* cr1 is 7400 || 7410 */ 3428c2ecf20Sopenharmony_ci cror 4*cr1+eq,4*cr1+eq,4*cr2+eq 3438c2ecf20Sopenharmony_ci /* cr0 is 74xx */ 3448c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr3+eq 3458c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr4+eq 3468c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr1+eq 3478c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr5+eq 3488c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr7+eq 3498c2ecf20Sopenharmony_ci bne 1f 3508c2ecf20Sopenharmony_ci /* Backup 74xx specific regs */ 3518c2ecf20Sopenharmony_ci mfspr r4,SPRN_MSSCR0 3528c2ecf20Sopenharmony_ci stw r4,CS_MSSCR0(r5) 3538c2ecf20Sopenharmony_ci mfspr r4,SPRN_MSSSR0 3548c2ecf20Sopenharmony_ci stw r4,CS_MSSSR0(r5) 3558c2ecf20Sopenharmony_ci beq cr1,1f 3568c2ecf20Sopenharmony_ci /* Backup 745x specific registers */ 3578c2ecf20Sopenharmony_ci mfspr r4,SPRN_HID1 3588c2ecf20Sopenharmony_ci stw r4,CS_HID1(r5) 3598c2ecf20Sopenharmony_ci mfspr r4,SPRN_ICTRL 3608c2ecf20Sopenharmony_ci stw r4,CS_ICTRL(r5) 3618c2ecf20Sopenharmony_ci mfspr r4,SPRN_LDSTCR 3628c2ecf20Sopenharmony_ci stw r4,CS_LDSTCR(r5) 3638c2ecf20Sopenharmony_ci mfspr r4,SPRN_LDSTDB 3648c2ecf20Sopenharmony_ci stw r4,CS_LDSTDB(r5) 3658c2ecf20Sopenharmony_ci1: 3668c2ecf20Sopenharmony_ci bne cr6,1f 3678c2ecf20Sopenharmony_ci /* Backup 750FX specific registers */ 3688c2ecf20Sopenharmony_ci mfspr r4,SPRN_HID1 3698c2ecf20Sopenharmony_ci stw r4,CS_HID1(r5) 3708c2ecf20Sopenharmony_ci /* If rev 2.x, backup HID2 */ 3718c2ecf20Sopenharmony_ci mfspr r3,SPRN_PVR 3728c2ecf20Sopenharmony_ci andi. r3,r3,0xff00 3738c2ecf20Sopenharmony_ci cmpwi cr0,r3,0x0200 3748c2ecf20Sopenharmony_ci bne 1f 3758c2ecf20Sopenharmony_ci mfspr r4,SPRN_HID2 3768c2ecf20Sopenharmony_ci stw r4,CS_HID2(r5) 3778c2ecf20Sopenharmony_ci1: 3788c2ecf20Sopenharmony_ci mtcr r7 3798c2ecf20Sopenharmony_ci blr 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci/* Called with no MMU context (typically MSR:IR/DR off) to 3828c2ecf20Sopenharmony_ci * restore CPU state as backed up by the previous 3838c2ecf20Sopenharmony_ci * function. This does not include cache setting 3848c2ecf20Sopenharmony_ci */ 3858c2ecf20Sopenharmony_ci_GLOBAL(__restore_cpu_setup) 3868c2ecf20Sopenharmony_ci /* Some CR fields are volatile, we back it up all */ 3878c2ecf20Sopenharmony_ci mfcr r7 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci /* Get storage ptr */ 3908c2ecf20Sopenharmony_ci lis r5,(cpu_state_storage-KERNELBASE)@h 3918c2ecf20Sopenharmony_ci ori r5,r5,cpu_state_storage@l 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci /* Restore HID0 */ 3948c2ecf20Sopenharmony_ci lwz r3,CS_HID0(r5) 3958c2ecf20Sopenharmony_ci sync 3968c2ecf20Sopenharmony_ci isync 3978c2ecf20Sopenharmony_ci mtspr SPRN_HID0,r3 3988c2ecf20Sopenharmony_ci sync 3998c2ecf20Sopenharmony_ci isync 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci /* Now deal with CPU type dependent registers */ 4028c2ecf20Sopenharmony_ci mfspr r3,SPRN_PVR 4038c2ecf20Sopenharmony_ci srwi r3,r3,16 4048c2ecf20Sopenharmony_ci cmplwi cr0,r3,0x8000 /* 7450 */ 4058c2ecf20Sopenharmony_ci cmplwi cr1,r3,0x000c /* 7400 */ 4068c2ecf20Sopenharmony_ci cmplwi cr2,r3,0x800c /* 7410 */ 4078c2ecf20Sopenharmony_ci cmplwi cr3,r3,0x8001 /* 7455 */ 4088c2ecf20Sopenharmony_ci cmplwi cr4,r3,0x8002 /* 7457 */ 4098c2ecf20Sopenharmony_ci cmplwi cr5,r3,0x8003 /* 7447A */ 4108c2ecf20Sopenharmony_ci cmplwi cr6,r3,0x7000 /* 750FX */ 4118c2ecf20Sopenharmony_ci cmplwi cr7,r3,0x8004 /* 7448 */ 4128c2ecf20Sopenharmony_ci /* cr1 is 7400 || 7410 */ 4138c2ecf20Sopenharmony_ci cror 4*cr1+eq,4*cr1+eq,4*cr2+eq 4148c2ecf20Sopenharmony_ci /* cr0 is 74xx */ 4158c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr3+eq 4168c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr4+eq 4178c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr1+eq 4188c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr5+eq 4198c2ecf20Sopenharmony_ci cror 4*cr0+eq,4*cr0+eq,4*cr7+eq 4208c2ecf20Sopenharmony_ci bne 2f 4218c2ecf20Sopenharmony_ci /* Restore 74xx specific regs */ 4228c2ecf20Sopenharmony_ci lwz r4,CS_MSSCR0(r5) 4238c2ecf20Sopenharmony_ci sync 4248c2ecf20Sopenharmony_ci mtspr SPRN_MSSCR0,r4 4258c2ecf20Sopenharmony_ci sync 4268c2ecf20Sopenharmony_ci isync 4278c2ecf20Sopenharmony_ci lwz r4,CS_MSSSR0(r5) 4288c2ecf20Sopenharmony_ci sync 4298c2ecf20Sopenharmony_ci mtspr SPRN_MSSSR0,r4 4308c2ecf20Sopenharmony_ci sync 4318c2ecf20Sopenharmony_ci isync 4328c2ecf20Sopenharmony_ci bne cr2,1f 4338c2ecf20Sopenharmony_ci /* Clear 7410 L2CR2 */ 4348c2ecf20Sopenharmony_ci li r4,0 4358c2ecf20Sopenharmony_ci mtspr SPRN_L2CR2,r4 4368c2ecf20Sopenharmony_ci1: beq cr1,2f 4378c2ecf20Sopenharmony_ci /* Restore 745x specific registers */ 4388c2ecf20Sopenharmony_ci lwz r4,CS_HID1(r5) 4398c2ecf20Sopenharmony_ci sync 4408c2ecf20Sopenharmony_ci mtspr SPRN_HID1,r4 4418c2ecf20Sopenharmony_ci isync 4428c2ecf20Sopenharmony_ci sync 4438c2ecf20Sopenharmony_ci lwz r4,CS_ICTRL(r5) 4448c2ecf20Sopenharmony_ci sync 4458c2ecf20Sopenharmony_ci mtspr SPRN_ICTRL,r4 4468c2ecf20Sopenharmony_ci isync 4478c2ecf20Sopenharmony_ci sync 4488c2ecf20Sopenharmony_ci lwz r4,CS_LDSTCR(r5) 4498c2ecf20Sopenharmony_ci sync 4508c2ecf20Sopenharmony_ci mtspr SPRN_LDSTCR,r4 4518c2ecf20Sopenharmony_ci isync 4528c2ecf20Sopenharmony_ci sync 4538c2ecf20Sopenharmony_ci lwz r4,CS_LDSTDB(r5) 4548c2ecf20Sopenharmony_ci sync 4558c2ecf20Sopenharmony_ci mtspr SPRN_LDSTDB,r4 4568c2ecf20Sopenharmony_ci isync 4578c2ecf20Sopenharmony_ci sync 4588c2ecf20Sopenharmony_ci2: bne cr6,1f 4598c2ecf20Sopenharmony_ci /* Restore 750FX specific registers 4608c2ecf20Sopenharmony_ci * that is restore HID2 on rev 2.x and PLL config & switch 4618c2ecf20Sopenharmony_ci * to PLL 0 on all 4628c2ecf20Sopenharmony_ci */ 4638c2ecf20Sopenharmony_ci /* If rev 2.x, restore HID2 with low voltage bit cleared */ 4648c2ecf20Sopenharmony_ci mfspr r3,SPRN_PVR 4658c2ecf20Sopenharmony_ci andi. r3,r3,0xff00 4668c2ecf20Sopenharmony_ci cmpwi cr0,r3,0x0200 4678c2ecf20Sopenharmony_ci bne 4f 4688c2ecf20Sopenharmony_ci lwz r4,CS_HID2(r5) 4698c2ecf20Sopenharmony_ci rlwinm r4,r4,0,19,17 4708c2ecf20Sopenharmony_ci mtspr SPRN_HID2,r4 4718c2ecf20Sopenharmony_ci sync 4728c2ecf20Sopenharmony_ci4: 4738c2ecf20Sopenharmony_ci lwz r4,CS_HID1(r5) 4748c2ecf20Sopenharmony_ci rlwinm r5,r4,0,16,14 4758c2ecf20Sopenharmony_ci mtspr SPRN_HID1,r5 4768c2ecf20Sopenharmony_ci /* Wait for PLL to stabilize */ 4778c2ecf20Sopenharmony_ci mftbl r5 4788c2ecf20Sopenharmony_ci3: mftbl r6 4798c2ecf20Sopenharmony_ci sub r6,r6,r5 4808c2ecf20Sopenharmony_ci cmplwi cr0,r6,10000 4818c2ecf20Sopenharmony_ci ble 3b 4828c2ecf20Sopenharmony_ci /* Setup final PLL */ 4838c2ecf20Sopenharmony_ci mtspr SPRN_HID1,r4 4848c2ecf20Sopenharmony_ci1: 4858c2ecf20Sopenharmony_ci mtcr r7 4868c2ecf20Sopenharmony_ci blr 4878c2ecf20Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(__restore_cpu_setup) 4888c2ecf20Sopenharmony_ci 489