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