2  * This file is subject to the terms and conditions of the GNU General Public
 
   3  * License.  See the file "COPYING" in the main directory of this archive
 
   6  * arch/shmedia/boot/compressed/head.S
 
   9  *   arch/shmedia/kernel/head.S
 
  10  * which carried the copyright:
 
  11  *   Copyright (C) 2000, 2001  Paolo Alberelli
 
  13  * Modification for compressed loader:
 
  14  *   Copyright (C) 2002 Stuart Menefy (stuart.menefy@st.com)
 
  16 #include <asm/cache.h>
 
  17 #include <cpu/mmu_context.h>
 
  18 #include <cpu/registers.h>
 
  21  * Fixed TLB entries to identity map the beginning of RAM
 
  23 #define MMUIR_TEXT_H    0x0000000000000003 | CONFIG_MEMORY_START
 
  24                         /* Enabled, Shared, ASID 0, Eff. Add. 0xA0000000 */
 
  25 #define MMUIR_TEXT_L    0x000000000000009a | CONFIG_MEMORY_START
 
  26                         /* 512 Mb, Cacheable (Write-back), execute, Not User, Ph. Add. */
 
  28 #define MMUDR_CACHED_H  0x0000000000000003 | CONFIG_MEMORY_START
 
  29                         /* Enabled, Shared, ASID 0, Eff. Add. 0xA0000000 */
 
  30 #define MMUDR_CACHED_L  0x000000000000015a | CONFIG_MEMORY_START
 
  31                         /* 512 Mb, Cacheable (Write-back), read/write, Not User, Ph. Add. */
 
  33 #define ICCR0_INIT_VAL  ICCR0_ON | ICCR0_ICI            /* ICE + ICI */
 
  34 #define ICCR1_INIT_VAL  ICCR1_NOLOCK                    /* No locking */
 
  37 #define OCCR0_INIT_VAL  OCCR0_ON | OCCR0_OCI | OCCR0_WB /* OCE + OCI + WB */
 
  39 #define OCCR0_INIT_VAL  OCCR0_OFF
 
  41 #define OCCR1_INIT_VAL  OCCR1_NOLOCK                    /* No locking */
 
  48          * Prevent speculative fetch on device memory due to
 
  49          * uninitialized target registers.
 
  50          * This must be executed before the first branch.
 
  63          * Set initial TLB entries for cached and uncached regions.
 
  64          * Note: PTA/BLINK is PIC code, PTABS/BLINK isn't !
 
  69         movi    ITLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
 
  70 1:      putcfg  r21, 0, r63             /* Clear MMUIR[n].PTEH.V */
 
  71         addi    r21, TLB_STEP, r21
 
  77         movi    DTLB_LAST_VAR_UNRESTRICTED+TLB_STEP, r22
 
  78 1:      putcfg  r21, 0, r63             /* Clear MMUDR[n].PTEH.V */
 
  79         addi    r21, TLB_STEP, r21
 
  82         /* Map one big (512Mb) page for ITLB */
 
  84         movi    MMUIR_TEXT_L, r22       /* PTEL first */
 
  85         putcfg  r21, 1, r22             /* Set MMUIR[0].PTEL */
 
  86         movi    MMUIR_TEXT_H, r22       /* PTEH last */
 
  87         putcfg  r21, 0, r22             /* Set MMUIR[0].PTEH */
 
  89         /* Map one big CACHED (512Mb) page for DTLB */
 
  91         movi    MMUDR_CACHED_L, r22     /* PTEL first */
 
  92         putcfg  r21, 1, r22             /* Set MMUDR[0].PTEL */
 
  93         movi    MMUDR_CACHED_H, r22     /* PTEH last */
 
  94         putcfg  r21, 0, r22             /* Set MMUDR[0].PTEH */
 
  98         movi    ICCR0_INIT_VAL, r22
 
  99         movi    ICCR1_INIT_VAL, r23
 
 100         putcfg  r21, ICCR_REG0, r22
 
 101         putcfg  r21, ICCR_REG1, r23
 
 106         movi    OCCR0_INIT_VAL, r22
 
 107         movi    OCCR1_INIT_VAL, r23
 
 108         putcfg  r21, OCCR_REG0, r22
 
 109         putcfg  r21, OCCR_REG1, r23
 
 114          * From here-on code can be non-PIC.
 
 116         movi    SR_HARMLESS | SR_ENABLE_MMU, r22
 
 121         rte                             /* And now go into the hyperspace ... */
 
 122 1:                                      /* ... that's the next instruction ! */
 
 124         /* Set initial stack pointer */
 
 125         movi    datalabel stack_start, r0
 
 132         movi    datalabel __bss_start, r22
 
 133         movi    datalabel _end, r23
 
 139          * Decompress the kernel.
 
 141         pt      decompress_kernel, tr0
 
 147         movi    SR_HARMLESS, r22
 
 152         rte                             /* And now go into the hyperspace ... */
 
 153 1:                                      /* ... that's the next instruction ! */
 
 155         /* Jump into the decompressed kernel */
 
 156         movi    datalabel (CONFIG_MEMORY_START + 0x2000)+1, r19
 
 160         /* Shouldn't return here, but just in case, loop forever */