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