linux/arch/powerpc/boot/gamecube-head.S
<<
>>
Prefs
   1/*
   2 * arch/powerpc/boot/gamecube-head.S
   3 *
   4 * Nintendo GameCube bootwrapper entry.
   5 * Copyright (C) 2004-2009 The GameCube Linux Team
   6 * Copyright (C) 2008,2009 Albert Herranz
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * as published by the Free Software Foundation; either version 2
  11 * of the License, or (at your option) any later version.
  12 *
  13 */
  14
  15#include "ppc_asm.h"
  16
  17/*
  18 * The entry code does no assumptions regarding:
  19 * - if the data and instruction caches are enabled or not
  20 * - if the MMU is enabled or not
  21 *
  22 * We enable the caches if not already enabled, enable the MMU with an
  23 * identity mapping scheme and jump to the start code.
  24 */
  25
  26        .text
  27
  28        .globl _zimage_start
  29_zimage_start:
  30
  31        /* turn the MMU off */
  32        mfmsr   9
  33        rlwinm  9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */
  34        bcl     20, 31, 1f
  351:
  36        mflr    8
  37        clrlwi  8, 8, 3         /* convert to a real address */
  38        addi    8, 8, _mmu_off - 1b
  39        mtsrr0  8
  40        mtsrr1  9
  41        rfi
  42_mmu_off:
  43        /* MMU disabled */
  44
  45        /* setup BATs */
  46        isync
  47        li      8, 0
  48        mtspr   0x210, 8        /* IBAT0U */
  49        mtspr   0x212, 8        /* IBAT1U */
  50        mtspr   0x214, 8        /* IBAT2U */
  51        mtspr   0x216, 8        /* IBAT3U */
  52        mtspr   0x218, 8        /* DBAT0U */
  53        mtspr   0x21a, 8        /* DBAT1U */
  54        mtspr   0x21c, 8        /* DBAT2U */
  55        mtspr   0x21e, 8        /* DBAT3U */
  56
  57        li      8, 0x01ff       /* first 16MiB */
  58        li      9, 0x0002       /* rw */
  59        mtspr   0x211, 9        /* IBAT0L */
  60        mtspr   0x210, 8        /* IBAT0U */
  61        mtspr   0x219, 9        /* DBAT0L */
  62        mtspr   0x218, 8        /* DBAT0U */
  63
  64        lis     8, 0x0c00       /* I/O mem */
  65        ori     8, 8, 0x3ff     /* 32MiB */
  66        lis     9, 0x0c00
  67        ori     9, 9, 0x002a    /* uncached, guarded, rw */
  68        mtspr   0x21b, 9        /* DBAT1L */
  69        mtspr   0x21a, 8        /* DBAT1U */
  70
  71        lis     8, 0x0100       /* next 8MiB */
  72        ori     8, 8, 0x00ff    /* 8MiB */
  73        lis     9, 0x0100
  74        ori     9, 9, 0x0002    /* rw */
  75        mtspr   0x215, 9        /* IBAT2L */
  76        mtspr   0x214, 8        /* IBAT2U */
  77        mtspr   0x21d, 9        /* DBAT2L */
  78        mtspr   0x21c, 8        /* DBAT2U */
  79
  80        /* enable and invalidate the caches if not already enabled */
  81        mfspr   8, 0x3f0        /* HID0 */
  82        andi.   0, 8, (1<<15)           /* HID0_ICE */
  83        bne     1f
  84        ori     8, 8, (1<<15)|(1<<11)   /* HID0_ICE|HID0_ICFI*/
  851:
  86        andi.   0, 8, (1<<14)           /* HID0_DCE */
  87        bne     1f
  88        ori     8, 8, (1<<14)|(1<<10)   /* HID0_DCE|HID0_DCFI*/
  891:
  90        mtspr   0x3f0, 8        /* HID0 */
  91        isync
  92
  93        /* initialize arguments */
  94        li      3, 0
  95        li      4, 0
  96        li      5, 0
  97
  98        /* turn the MMU on */
  99        bcl     20, 31, 1f
 1001:
 101        mflr    8
 102        addi    8, 8, _mmu_on - 1b
 103        mfmsr   9
 104        ori     9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */
 105        mtsrr0  8
 106        mtsrr1  9
 107        sync
 108        rfi
 109_mmu_on:
 110        b _zimage_start_lib
 111
 112