Path: blob/master/arch/powerpc/kernel/cpu_setup_ppc970.S
26451 views
/* SPDX-License-Identifier: GPL-2.0-or-later */1/*2* This file contains low level CPU setup functions.3* Copyright (C) 2003 Benjamin Herrenschmidt ([email protected])4*/56#include <asm/processor.h>7#include <asm/page.h>8#include <asm/cputable.h>9#include <asm/ppc_asm.h>10#include <asm/asm-offsets.h>11#include <asm/cache.h>1213_GLOBAL(__cpu_preinit_ppc970)14/* Do nothing if not running in HV mode */15mfmsr r016rldicl. r0,r0,4,6317beqlr1819/* Make sure HID4:rm_ci is off before MMU is turned off, that large20* pages are enabled with HID4:61 and clear HID5:DCBZ_size and21* HID5:DCBZ32_ill22*/23li r0,024mfspr r3,SPRN_HID425rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */26rldimi r3,r0,2,61 /* clear bit 61 (lg_pg_en) */27sync28mtspr SPRN_HID4,r329isync30sync31mfspr r3,SPRN_HID532rldimi r3,r0,6,56 /* clear bits 56 & 57 (DCBZ*) */33sync34mtspr SPRN_HID5,r335isync36sync3738/* Setup some basic HID1 features */39mfspr r0,SPRN_HID140li r3,0x1200 /* enable i-fetch cacheability */41sldi r3,r3,44 /* and prefetch */42or r0,r0,r343mtspr SPRN_HID1,r044mtspr SPRN_HID1,r045isync4647/* Clear HIOR */48li r0,049sync50mtspr SPRN_HIOR,0 /* Clear interrupt prefix */51isync52blr5354/* Definitions for the table use to save CPU states */55#define CS_HID0 056#define CS_HID1 857#define CS_HID4 1658#define CS_HID5 2459#define CS_SIZE 326061.data62.balign L1_CACHE_BYTES,063cpu_state_storage:64.space CS_SIZE65.balign L1_CACHE_BYTES,066.text676869_GLOBAL(__setup_cpu_ppc970)70/* Do nothing if not running in HV mode */71mfmsr r072rldicl. r0,r0,4,6373beq no_hv_mode7475mfspr r0,SPRN_HID076li r11,5 /* clear DOZE and SLEEP */77rldimi r0,r11,52,8 /* set NAP and DPM */78li r11,079rldimi r0,r11,32,31 /* clear EN_ATTN */80b load_hids /* Jump to shared code */818283_GLOBAL(__setup_cpu_ppc970MP)84/* Do nothing if not running in HV mode */85mfmsr r086rldicl. r0,r0,4,6387beq no_hv_mode8889mfspr r0,SPRN_HID090li r11,0x15 /* clear DOZE and SLEEP */91rldimi r0,r11,52,6 /* set DEEPNAP, NAP and DPM */92li r11,093rldimi r0,r11,32,31 /* clear EN_ATTN */9495load_hids:96mtspr SPRN_HID0,r097mfspr r0,SPRN_HID098mfspr r0,SPRN_HID099mfspr r0,SPRN_HID0100mfspr r0,SPRN_HID0101mfspr r0,SPRN_HID0102mfspr r0,SPRN_HID0103sync104isync105106/* Try to set LPES = 01 in HID4 */107mfspr r0,SPRN_HID4108clrldi r0,r0,1 /* clear LPES0 */109ori r0,r0,HID4_LPES1 /* set LPES1 */110sync111mtspr SPRN_HID4,r0112isync113114/* Save away cpu state */115LOAD_REG_ADDR(r5,cpu_state_storage)116117/* Save HID0,1,4 and 5 */118mfspr r3,SPRN_HID0119std r3,CS_HID0(r5)120mfspr r3,SPRN_HID1121std r3,CS_HID1(r5)122mfspr r4,SPRN_HID4123std r4,CS_HID4(r5)124mfspr r3,SPRN_HID5125std r3,CS_HID5(r5)126127/* See if we successfully set LPES1 to 1; if not we are in Apple mode */128andi. r4,r4,HID4_LPES1129bnelr130131no_hv_mode:132/* Disable CPU_FTR_HVMODE and exit, since we don't have HV mode */133ld r5,CPU_SPEC_FEATURES(r4)134LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE)135andc r5,r5,r6136std r5,CPU_SPEC_FEATURES(r4)137blr138139/* Called with no MMU context (typically MSR:IR/DR off) to140* restore CPU state as backed up by the previous141* function. This does not include cache setting142*/143_GLOBAL(__restore_cpu_ppc970)144/* Do nothing if not running in HV mode */145mfmsr r0146rldicl. r0,r0,4,63147beqlr148149LOAD_REG_ADDR(r5,cpu_state_storage)150/* Before accessing memory, we make sure rm_ci is clear */151li r0,0152mfspr r3,SPRN_HID4153rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */154sync155mtspr SPRN_HID4,r3156isync157sync158159/* Clear interrupt prefix */160li r0,0161sync162mtspr SPRN_HIOR,0163isync164165/* Restore HID0 */166ld r3,CS_HID0(r5)167sync168isync169mtspr SPRN_HID0,r3170mfspr r3,SPRN_HID0171mfspr r3,SPRN_HID0172mfspr r3,SPRN_HID0173mfspr r3,SPRN_HID0174mfspr r3,SPRN_HID0175mfspr r3,SPRN_HID0176sync177isync178179/* Restore HID1 */180ld r3,CS_HID1(r5)181sync182isync183mtspr SPRN_HID1,r3184mtspr SPRN_HID1,r3185sync186isync187188/* Restore HID4 */189ld r3,CS_HID4(r5)190sync191isync192mtspr SPRN_HID4,r3193sync194isync195196/* Restore HID5 */197ld r3,CS_HID5(r5)198sync199isync200mtspr SPRN_HID5,r3201sync202isync203blr204205206207