11.2Sjmcneill/* $NetBSD: mmuinit.S,v 1.2 2026/01/10 22:45:57 jmcneill Exp $ */ 21.1Sjmcneill 31.1Sjmcneill/*- 41.1Sjmcneill * Copyright (C) 2012 Margarida Gouveia 51.1Sjmcneill * All rights reserved. 61.1Sjmcneill * 71.1Sjmcneill * Redistribution and use in source and binary forms, with or without 81.1Sjmcneill * modification, are permitted provided that the following conditions 91.1Sjmcneill * are met: 101.1Sjmcneill * 1. Redistributions of source code must retain the above copyright 111.1Sjmcneill * notice, this list of conditions and the following disclaimer. 121.1Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright 131.1Sjmcneill * notice, this list of conditions and the following disclaimer in the 141.1Sjmcneill * documentation and/or other materials provided with the distribution. 151.1Sjmcneill * 161.1Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 171.1Sjmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 181.1Sjmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 191.1Sjmcneill * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 201.1Sjmcneill * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 211.1Sjmcneill * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 221.1Sjmcneill * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 231.1Sjmcneill * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 241.1Sjmcneill * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 251.1Sjmcneill * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 261.1Sjmcneill * 271.1Sjmcneill * $FreeBSD$ 281.1Sjmcneill */ 291.1Sjmcneill 301.1Sjmcneill#include <powerpc/oea/bat.h> 311.1Sjmcneill 321.1Sjmcneill/* 331.1Sjmcneill * When we are invoked from Wii loaders, the state of the MMU and the BAT 341.1Sjmcneill * mappings can vary. In this file we try to reset the MMU to a state 351.1Sjmcneill * that lets us boot NetBSD. 361.1Sjmcneill * 371.1Sjmcneill * This file is being included from wii_locore.S. 381.1Sjmcneill */ 391.1Sjmcneill 401.1Sjmcneill#define MMU_REALMODE() \ 411.1Sjmcneill mfmsr %r12; \ 421.1Sjmcneill rlwinm %r12, %r12, 0, ~(PSL_DR|PSL_IR);\ 431.1Sjmcneill sync; \ 441.1Sjmcneill bl 1f; \ 451.1Sjmcneill1: \ 461.1Sjmcneill mflr %r11; \ 471.1Sjmcneill clrlwi %r11, %r11, 3; /* XXX why? */ \ 481.1Sjmcneill addi %r11, %r11, 2f - 1b; \ 491.1Sjmcneill mtsrr0 %r11; \ 501.1Sjmcneill mtsrr1 %r12; /* Disables the MMU */ \ 511.1Sjmcneill isync; \ 521.1Sjmcneill rfi; \ 531.1Sjmcneill2: 541.1Sjmcneill 551.1Sjmcneill#define MMU_VIRTUALMODE() \ 561.1Sjmcneill bl 3f; \ 571.1Sjmcneill3: \ 581.1Sjmcneill mflr %r11; \ 591.1Sjmcneill addi %r11, %r11, 4f - 3b; \ 601.1Sjmcneill mfmsr %r12; \ 611.1Sjmcneill ori %r12, %r12, PSL_DR|PSL_IR; \ 621.1Sjmcneill mtsrr0 %r11; \ 631.1Sjmcneill mtsrr1 %r12; /* Enables the MMU */ \ 641.1Sjmcneill isync; \ 651.1Sjmcneill rfi; \ 661.1Sjmcneill4: 671.1Sjmcneill 681.1Sjmcneill MMU_REALMODE() 691.1Sjmcneill 701.1Sjmcneill /* Initialize HID0 and HID4 */ 711.1Sjmcneill lis %r11, 0x0011 721.1Sjmcneill ori %r11, %r11, 0x0c64 731.1Sjmcneill mtspr SPR_HID0, %r11 741.1Sjmcneill isync 751.1Sjmcneill 761.1Sjmcneill lis %r11, 0x8200 771.1Sjmcneill mtspr 1011, %r11 /* 1011 = SPR_HID4 */ 781.1Sjmcneill isync 791.1Sjmcneill 801.1Sjmcneill mfspr %r11, 920 811.1Sjmcneill oris %r11, %r11, 0xa000 821.1Sjmcneill mtspr 920, %r11 831.1Sjmcneill 841.1Sjmcneill mfspr %r11, SPR_HID0 851.1Sjmcneill ori %r11, %r11, 0xc000 861.1Sjmcneill ori %r11, %r11, 0x0800 871.1Sjmcneill ori %r11, %r11, 0x0200 881.1Sjmcneill mtspr SPR_HID0, %r11 891.1Sjmcneill isync 901.1Sjmcneill 911.1Sjmcneill /* Reset standard BATs */ 921.1Sjmcneill li %r11, 0 931.1Sjmcneill mtibatu 0, %r11 941.1Sjmcneill mtibatl 0, %r11 951.1Sjmcneill mtdbatu 0, %r11 961.1Sjmcneill mtdbatl 0, %r11 971.1Sjmcneill mtibatu 1, %r11 981.1Sjmcneill mtibatl 1, %r11 991.1Sjmcneill mtdbatu 1, %r11 1001.1Sjmcneill mtdbatl 1, %r11 1011.1Sjmcneill mtibatu 2, %r11 1021.1Sjmcneill mtibatl 2, %r11 1031.1Sjmcneill mtdbatu 2, %r11 1041.1Sjmcneill mtdbatl 2, %r11 1051.1Sjmcneill mtibatu 3, %r11 1061.1Sjmcneill mtibatl 3, %r11 1071.1Sjmcneill mtdbatu 3, %r11 1081.1Sjmcneill mtdbatl 3, %r11 1091.1Sjmcneill 1101.1Sjmcneill /* Reset high BATs. IBAT[4-7][UL] + DBAT[4-7][UL] */ 1111.1Sjmcneill mtspr 560, %r11 1121.1Sjmcneill mtspr 561, %r11 1131.1Sjmcneill mtspr 562, %r11 1141.1Sjmcneill mtspr 563, %r11 1151.1Sjmcneill mtspr 564, %r11 1161.1Sjmcneill mtspr 565, %r11 1171.1Sjmcneill mtspr 566, %r11 1181.1Sjmcneill mtspr 567, %r11 1191.1Sjmcneill mtspr 568, %r11 1201.1Sjmcneill mtspr 569, %r11 1211.1Sjmcneill mtspr 570, %r11 1221.1Sjmcneill mtspr 571, %r11 1231.1Sjmcneill mtspr 572, %r11 1241.1Sjmcneill mtspr 573, %r11 1251.1Sjmcneill mtspr 574, %r11 1261.1Sjmcneill mtspr 575, %r11 1271.1Sjmcneill 1281.1Sjmcneill /* 1291.1Sjmcneill * We need to setup BAT0 as in mmu_oea.c. 1301.1Sjmcneill */ 1311.1Sjmcneill li %r11, BATU(0x00000000, BAT_BL_32M, BAT_Vs) 1321.1Sjmcneill li %r12, BATL(0x00000000, BAT_M, BAT_PP_RW) 1331.1Sjmcneill mtdbatu 0, %r11 1341.1Sjmcneill mtdbatl 0, %r12 1351.1Sjmcneill mtibatu 0, %r11 1361.1Sjmcneill mtibatl 0, %r12 1371.1Sjmcneill isync 1381.1Sjmcneill 1391.1Sjmcneill /* 1401.1Sjmcneill * Use BAT1 to access MEM2. 1411.1Sjmcneill */ 1421.1Sjmcneill /* BATU(0x10000000, BAT_BL_256M, BAT_Vs) */ 1431.1Sjmcneill lis %r11, 0x1000 1441.1Sjmcneill ori %r11, %r11, BAT_BL_256M|BAT_Vs 1451.1Sjmcneill /* BATL(0x10000000, BAT_M, BAT_PP_RW) */ 1461.1Sjmcneill lis %r12, 0x1000 1471.1Sjmcneill ori %r12, %r12, BAT_M|BAT_PP_RW 1481.1Sjmcneill mtdbatu 1, %r11 1491.1Sjmcneill mtdbatl 1, %r12 1501.1Sjmcneill isync 1511.1Sjmcneill 1521.1Sjmcneill /* 1531.1Sjmcneill * We use BAT2 to be able to write I/O memory, including the 1541.1Sjmcneill * framebuffer registers. 1551.1Sjmcneill */ 1561.1Sjmcneill /* BATU(0x0c000000, BAT_BL_32M, BAT_Vs) */ 1571.1Sjmcneill lis %r11, 0x0c00 1581.1Sjmcneill ori %r11, %r11, BAT_BL_32M|BAT_Vs 1591.1Sjmcneill /* BATL(0x0c000000, BAT_I|BAT_G, BAT_PP_RW) */ 1601.1Sjmcneill lis %r12, 0x0c00 1611.1Sjmcneill ori %r12, %r12, BAT_I|BAT_G|BAT_PP_RW 1621.1Sjmcneill mtdbatu 2, %r11 1631.1Sjmcneill mtdbatl 2, %r12 1641.1Sjmcneill isync 1651.1Sjmcneill 1661.2Sjmcneill /* 1671.2Sjmcneill * BAT3 is used to access loader data (kernel cmdline) on Wii U. 1681.2Sjmcneill */ 1691.2Sjmcneill /* BATU(0x89000000, BAT_BL_8M, BAT_Vs) */ 1701.2Sjmcneill lis %r11, 0x8900 1711.2Sjmcneill ori %r11, %r11, BAT_BL_8M|BAT_Vs 1721.2Sjmcneill /* BATL(0x89000000, BAT_M, BAT_PP_RW) */ 1731.2Sjmcneill lis %r12, 0x8900 1741.2Sjmcneill ori %r12, %r12, BAT_M|BAT_PP_RW 1751.2Sjmcneill mtdbatu 1, %r11 1761.2Sjmcneill mtdbatl 1, %r12 1771.2Sjmcneill isync 1781.2Sjmcneill 1791.1Sjmcneill MMU_VIRTUALMODE() 180