linux/arch/powerpc/kernel/cpu_setup_ppc970.S
<<
>>
Prefs
   1/*
   2 * This file contains low level CPU setup functions.
   3 *    Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version
   8 * 2 of the License, or (at your option) any later version.
   9 *
  10 */
  11
  12#include <asm/processor.h>
  13#include <asm/page.h>
  14#include <asm/cputable.h>
  15#include <asm/ppc_asm.h>
  16#include <asm/asm-offsets.h>
  17#include <asm/cache.h>
  18
  19_GLOBAL(__cpu_preinit_ppc970)
  20        /* Do nothing if not running in HV mode */
  21        mfmsr   r0
  22        rldicl. r0,r0,4,63
  23        beqlr
  24
  25        /* Make sure HID4:rm_ci is off before MMU is turned off, that large
  26         * pages are enabled with HID4:61 and clear HID5:DCBZ_size and
  27         * HID5:DCBZ32_ill
  28         */
  29        li      r0,0
  30        mfspr   r3,SPRN_HID4
  31        rldimi  r3,r0,40,23     /* clear bit 23 (rm_ci) */
  32        rldimi  r3,r0,2,61      /* clear bit 61 (lg_pg_en) */
  33        sync
  34        mtspr   SPRN_HID4,r3
  35        isync
  36        sync
  37        mfspr   r3,SPRN_HID5
  38        rldimi  r3,r0,6,56      /* clear bits 56 & 57 (DCBZ*) */
  39        sync
  40        mtspr   SPRN_HID5,r3
  41        isync
  42        sync
  43
  44        /* Setup some basic HID1 features */
  45        mfspr   r0,SPRN_HID1
  46        li      r3,0x1200               /* enable i-fetch cacheability */
  47        sldi    r3,r3,44                /* and prefetch */
  48        or      r0,r0,r3
  49        mtspr   SPRN_HID1,r0
  50        mtspr   SPRN_HID1,r0
  51        isync
  52
  53        /* Clear HIOR */
  54        li      r0,0
  55        sync
  56        mtspr   SPRN_HIOR,0             /* Clear interrupt prefix */
  57        isync
  58        blr
  59
  60/* Definitions for the table use to save CPU states */
  61#define CS_HID0         0
  62#define CS_HID1         8
  63#define CS_HID4         16
  64#define CS_HID5         24
  65#define CS_SIZE         32
  66
  67        .data
  68        .balign L1_CACHE_BYTES,0
  69cpu_state_storage:
  70        .space  CS_SIZE
  71        .balign L1_CACHE_BYTES,0
  72        .text
  73
  74
  75_GLOBAL(__setup_cpu_ppc970)
  76        /* Do nothing if not running in HV mode */
  77        mfmsr   r0
  78        rldicl. r0,r0,4,63
  79        beq     no_hv_mode
  80
  81        mfspr   r0,SPRN_HID0
  82        li      r11,5                   /* clear DOZE and SLEEP */
  83        rldimi  r0,r11,52,8             /* set NAP and DPM */
  84        li      r11,0
  85        rldimi  r0,r11,32,31            /* clear EN_ATTN */
  86        b       load_hids               /* Jump to shared code */
  87
  88
  89_GLOBAL(__setup_cpu_ppc970MP)
  90        /* Do nothing if not running in HV mode */
  91        mfmsr   r0
  92        rldicl. r0,r0,4,63
  93        beq     no_hv_mode
  94
  95        mfspr   r0,SPRN_HID0
  96        li      r11,0x15                /* clear DOZE and SLEEP */
  97        rldimi  r0,r11,52,6             /* set DEEPNAP, NAP and DPM */
  98        li      r11,0
  99        rldimi  r0,r11,32,31            /* clear EN_ATTN */
 100
 101load_hids:
 102        mtspr   SPRN_HID0,r0
 103        mfspr   r0,SPRN_HID0
 104        mfspr   r0,SPRN_HID0
 105        mfspr   r0,SPRN_HID0
 106        mfspr   r0,SPRN_HID0
 107        mfspr   r0,SPRN_HID0
 108        mfspr   r0,SPRN_HID0
 109        sync
 110        isync
 111
 112        /* Try to set LPES = 01 in HID4 */
 113        mfspr   r0,SPRN_HID4
 114        clrldi  r0,r0,1                 /* clear LPES0 */
 115        ori     r0,r0,HID4_LPES1        /* set LPES1 */
 116        sync
 117        mtspr   SPRN_HID4,r0
 118        isync
 119
 120        /* Save away cpu state */
 121        LOAD_REG_ADDR(r5,cpu_state_storage)
 122
 123        /* Save HID0,1,4 and 5 */
 124        mfspr   r3,SPRN_HID0
 125        std     r3,CS_HID0(r5)
 126        mfspr   r3,SPRN_HID1
 127        std     r3,CS_HID1(r5)
 128        mfspr   r4,SPRN_HID4
 129        std     r4,CS_HID4(r5)
 130        mfspr   r3,SPRN_HID5
 131        std     r3,CS_HID5(r5)
 132
 133        /* See if we successfully set LPES1 to 1; if not we are in Apple mode */
 134        andi.   r4,r4,HID4_LPES1
 135        bnelr
 136
 137no_hv_mode:
 138        /* Disable CPU_FTR_HVMODE and exit, since we don't have HV mode */
 139        ld      r5,CPU_SPEC_FEATURES(r4)
 140        LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE)
 141        andc    r5,r5,r6
 142        std     r5,CPU_SPEC_FEATURES(r4)
 143        blr
 144
 145/* Called with no MMU context (typically MSR:IR/DR off) to
 146 * restore CPU state as backed up by the previous
 147 * function. This does not include cache setting
 148 */
 149_GLOBAL(__restore_cpu_ppc970)
 150        /* Do nothing if not running in HV mode */
 151        mfmsr   r0
 152        rldicl. r0,r0,4,63
 153        beqlr
 154
 155        LOAD_REG_ADDR(r5,cpu_state_storage)
 156        /* Before accessing memory, we make sure rm_ci is clear */
 157        li      r0,0
 158        mfspr   r3,SPRN_HID4
 159        rldimi  r3,r0,40,23     /* clear bit 23 (rm_ci) */
 160        sync
 161        mtspr   SPRN_HID4,r3
 162        isync
 163        sync
 164
 165        /* Clear interrupt prefix */
 166        li      r0,0
 167        sync
 168        mtspr   SPRN_HIOR,0
 169        isync
 170
 171        /* Restore HID0 */
 172        ld      r3,CS_HID0(r5)
 173        sync
 174        isync
 175        mtspr   SPRN_HID0,r3
 176        mfspr   r3,SPRN_HID0
 177        mfspr   r3,SPRN_HID0
 178        mfspr   r3,SPRN_HID0
 179        mfspr   r3,SPRN_HID0
 180        mfspr   r3,SPRN_HID0
 181        mfspr   r3,SPRN_HID0
 182        sync
 183        isync
 184
 185        /* Restore HID1 */
 186        ld      r3,CS_HID1(r5)
 187        sync
 188        isync
 189        mtspr   SPRN_HID1,r3
 190        mtspr   SPRN_HID1,r3
 191        sync
 192        isync
 193
 194        /* Restore HID4 */
 195        ld      r3,CS_HID4(r5)
 196        sync
 197        isync
 198        mtspr   SPRN_HID4,r3
 199        sync
 200        isync
 201
 202        /* Restore HID5 */
 203        ld      r3,CS_HID5(r5)
 204        sync
 205        isync
 206        mtspr   SPRN_HID5,r3
 207        sync
 208        isync
 209        blr
 210
 211