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