1 1.2 jmcneill /* $NetBSD: wii_mmuinit.S,v 1.2 2024/10/13 16:21:37 jmcneill Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill /*- 4 1.1 jmcneill * Copyright (C) 2012 Margarida Gouveia 5 1.1 jmcneill * All rights reserved. 6 1.1 jmcneill * 7 1.1 jmcneill * Redistribution and use in source and binary forms, with or without 8 1.1 jmcneill * modification, are permitted provided that the following conditions 9 1.1 jmcneill * are met: 10 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright 11 1.1 jmcneill * notice, this list of conditions and the following disclaimer. 12 1.1 jmcneill * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 jmcneill * notice, this list of conditions and the following disclaimer in the 14 1.1 jmcneill * documentation and/or other materials provided with the distribution. 15 1.1 jmcneill * 16 1.1 jmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 jmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 jmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 jmcneill * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 1.1 jmcneill * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 1.1 jmcneill * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 1.1 jmcneill * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 1.1 jmcneill * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 1.1 jmcneill * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 1.1 jmcneill * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 jmcneill * 27 1.1 jmcneill * $FreeBSD$ 28 1.1 jmcneill */ 29 1.1 jmcneill 30 1.1 jmcneill #include <powerpc/oea/bat.h> 31 1.1 jmcneill 32 1.1 jmcneill /* 33 1.1 jmcneill * When we are invoked from Wii loaders, the state of the MMU and the BAT 34 1.1 jmcneill * mappings can vary. In this file we try to reset the MMU to a state 35 1.1 jmcneill * that lets us boot NetBSD. 36 1.1 jmcneill * 37 1.1 jmcneill * This file is being included from wii_locore.S. 38 1.1 jmcneill */ 39 1.1 jmcneill 40 1.1 jmcneill #define MMU_REALMODE() \ 41 1.1 jmcneill mfmsr %r12; \ 42 1.1 jmcneill rlwinm %r12, %r12, 0, ~(PSL_DR|PSL_IR);\ 43 1.1 jmcneill sync; \ 44 1.1 jmcneill bl 1f; \ 45 1.1 jmcneill 1: \ 46 1.1 jmcneill mflr %r11; \ 47 1.1 jmcneill clrlwi %r11, %r11, 3; /* XXX why? */ \ 48 1.1 jmcneill addi %r11, %r11, 2f - 1b; \ 49 1.1 jmcneill mtsrr0 %r11; \ 50 1.1 jmcneill mtsrr1 %r12; /* Disables the MMU */ \ 51 1.1 jmcneill isync; \ 52 1.1 jmcneill rfi; \ 53 1.1 jmcneill 2: 54 1.1 jmcneill 55 1.1 jmcneill #define MMU_VIRTUALMODE() \ 56 1.1 jmcneill bl 3f; \ 57 1.1 jmcneill 3: \ 58 1.1 jmcneill mflr %r11; \ 59 1.1 jmcneill addi %r11, %r11, 4f - 3b; \ 60 1.1 jmcneill mfmsr %r12; \ 61 1.1 jmcneill ori %r12, %r12, PSL_DR|PSL_IR; \ 62 1.1 jmcneill mtsrr0 %r11; \ 63 1.1 jmcneill mtsrr1 %r12; /* Enables the MMU */ \ 64 1.1 jmcneill isync; \ 65 1.1 jmcneill rfi; \ 66 1.1 jmcneill 4: 67 1.1 jmcneill 68 1.1 jmcneill MMU_REALMODE() 69 1.1 jmcneill 70 1.2 jmcneill /* Initialize HID0 and HID4 */ 71 1.2 jmcneill lis %r11, 0x0011 72 1.2 jmcneill ori %r11, %r11, 0x0c64 73 1.2 jmcneill mtspr SPR_HID0, %r11 74 1.2 jmcneill isync 75 1.2 jmcneill 76 1.2 jmcneill lis %r11, 0x8200 77 1.2 jmcneill mtspr 1011, %r11 /* 1011 = SPR_HID4 */ 78 1.2 jmcneill isync 79 1.2 jmcneill 80 1.2 jmcneill mfspr %r11, 920 81 1.2 jmcneill oris %r11, %r11, 0xa000 82 1.2 jmcneill mtspr 920, %r11 83 1.2 jmcneill 84 1.2 jmcneill mfspr %r11, SPR_HID0 85 1.2 jmcneill ori %r11, %r11, 0xc000 86 1.2 jmcneill ori %r11, %r11, 0x0800 87 1.2 jmcneill ori %r11, %r11, 0x0200 88 1.2 jmcneill mtspr SPR_HID0, %r11 89 1.2 jmcneill isync 90 1.2 jmcneill 91 1.1 jmcneill /* Reset standard BATs */ 92 1.1 jmcneill li %r11, 0 93 1.1 jmcneill mtibatu 0, %r11 94 1.1 jmcneill mtibatl 0, %r11 95 1.1 jmcneill mtdbatu 0, %r11 96 1.1 jmcneill mtdbatl 0, %r11 97 1.1 jmcneill mtibatu 1, %r11 98 1.1 jmcneill mtibatl 1, %r11 99 1.1 jmcneill mtdbatu 1, %r11 100 1.1 jmcneill mtdbatl 1, %r11 101 1.1 jmcneill mtibatu 2, %r11 102 1.1 jmcneill mtibatl 2, %r11 103 1.1 jmcneill mtdbatu 2, %r11 104 1.1 jmcneill mtdbatl 2, %r11 105 1.1 jmcneill mtibatu 3, %r11 106 1.1 jmcneill mtibatl 3, %r11 107 1.1 jmcneill mtdbatu 3, %r11 108 1.1 jmcneill mtdbatl 3, %r11 109 1.1 jmcneill 110 1.1 jmcneill /* Reset high BATs. IBAT[4-7][UL] + DBAT[4-7][UL] */ 111 1.1 jmcneill mtspr 560, %r11 112 1.1 jmcneill mtspr 561, %r11 113 1.1 jmcneill mtspr 562, %r11 114 1.1 jmcneill mtspr 563, %r11 115 1.1 jmcneill mtspr 564, %r11 116 1.1 jmcneill mtspr 565, %r11 117 1.1 jmcneill mtspr 566, %r11 118 1.1 jmcneill mtspr 567, %r11 119 1.1 jmcneill mtspr 568, %r11 120 1.1 jmcneill mtspr 569, %r11 121 1.1 jmcneill mtspr 570, %r11 122 1.1 jmcneill mtspr 571, %r11 123 1.1 jmcneill mtspr 572, %r11 124 1.1 jmcneill mtspr 573, %r11 125 1.1 jmcneill mtspr 574, %r11 126 1.1 jmcneill mtspr 575, %r11 127 1.1 jmcneill 128 1.1 jmcneill /* 129 1.1 jmcneill * We need to setup BAT0 as in mmu_oea.c. 130 1.1 jmcneill */ 131 1.1 jmcneill li %r11, BATU(0x00000000, BAT_BL_256M, BAT_Vs) 132 1.1 jmcneill li %r12, BATL(0x00000000, BAT_M, BAT_PP_RW) 133 1.1 jmcneill mtdbatu 0, %r11 134 1.1 jmcneill mtdbatl 0, %r12 135 1.1 jmcneill mtibatu 0, %r11 136 1.1 jmcneill mtibatl 0, %r12 137 1.1 jmcneill isync 138 1.1 jmcneill 139 1.1 jmcneill /* 140 1.1 jmcneill * We use BAT1 to be able to write I/O memory, including the 141 1.1 jmcneill * framebuffer registers. 142 1.1 jmcneill */ 143 1.1 jmcneill /* BATU(0x0c000000, BAT_BL_32M, BAT_Vs) */ 144 1.1 jmcneill lis %r11, 0x0c00 145 1.1 jmcneill ori %r11, %r11, BAT_BL_32M|BAT_Vs 146 1.1 jmcneill /* BATL(0x0c000000, BAT_I|BAT_G, BAT_PP_RW) */ 147 1.1 jmcneill lis %r12, 0x0c00 148 1.1 jmcneill ori %r12, %r12, BAT_I|BAT_G|BAT_PP_RW 149 1.1 jmcneill mtdbatu 1, %r11 150 1.1 jmcneill mtdbatl 1, %r12 151 1.1 jmcneill isync 152 1.1 jmcneill 153 1.1 jmcneill MMU_VIRTUALMODE() 154