xref: /openbmc/linux/arch/powerpc/boot/wii-head.S (revision 2874c5fd)
12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
26cdd2417SAlbert Herranz/*
36cdd2417SAlbert Herranz * arch/powerpc/boot/wii-head.S
46cdd2417SAlbert Herranz *
56cdd2417SAlbert Herranz * Nintendo Wii bootwrapper entry.
66cdd2417SAlbert Herranz * Copyright (C) 2008-2009 The GameCube Linux Team
76cdd2417SAlbert Herranz * Copyright (C) 2008,2009 Albert Herranz
86cdd2417SAlbert Herranz */
96cdd2417SAlbert Herranz
106cdd2417SAlbert Herranz#include "ppc_asm.h"
116cdd2417SAlbert Herranz
126cdd2417SAlbert Herranz/*
136cdd2417SAlbert Herranz * The entry code does no assumptions regarding:
146cdd2417SAlbert Herranz * - if the data and instruction caches are enabled or not
156cdd2417SAlbert Herranz * - if the MMU is enabled or not
166cdd2417SAlbert Herranz * - if the high BATs are enabled or not
176cdd2417SAlbert Herranz *
186cdd2417SAlbert Herranz * We enable the high BATs, enable the caches if not already enabled,
196cdd2417SAlbert Herranz * enable the MMU with an identity mapping scheme and jump to the start code.
206cdd2417SAlbert Herranz */
216cdd2417SAlbert Herranz
226cdd2417SAlbert Herranz	.text
236cdd2417SAlbert Herranz
246cdd2417SAlbert Herranz	.globl _zimage_start
256cdd2417SAlbert Herranz_zimage_start:
266cdd2417SAlbert Herranz
276cdd2417SAlbert Herranz	/* turn the MMU off */
286cdd2417SAlbert Herranz	mfmsr	9
296cdd2417SAlbert Herranz	rlwinm	9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */
306cdd2417SAlbert Herranz	bcl	20, 31, 1f
316cdd2417SAlbert Herranz1:
326cdd2417SAlbert Herranz	mflr	8
336cdd2417SAlbert Herranz	clrlwi	8, 8, 3		/* convert to a real address */
346cdd2417SAlbert Herranz	addi	8, 8, _mmu_off - 1b
356cdd2417SAlbert Herranz	mtsrr0	8
366cdd2417SAlbert Herranz	mtsrr1	9
376cdd2417SAlbert Herranz	rfi
386cdd2417SAlbert Herranz_mmu_off:
396cdd2417SAlbert Herranz	/* MMU disabled */
406cdd2417SAlbert Herranz
416cdd2417SAlbert Herranz	/* setup BATs */
426cdd2417SAlbert Herranz	isync
436cdd2417SAlbert Herranz	li      8, 0
446cdd2417SAlbert Herranz	mtspr	0x210, 8	/* IBAT0U */
456cdd2417SAlbert Herranz	mtspr	0x212, 8	/* IBAT1U */
466cdd2417SAlbert Herranz	mtspr	0x214, 8	/* IBAT2U */
476cdd2417SAlbert Herranz	mtspr	0x216, 8	/* IBAT3U */
486cdd2417SAlbert Herranz	mtspr	0x218, 8	/* DBAT0U */
496cdd2417SAlbert Herranz	mtspr	0x21a, 8	/* DBAT1U */
506cdd2417SAlbert Herranz	mtspr	0x21c, 8	/* DBAT2U */
516cdd2417SAlbert Herranz	mtspr	0x21e, 8	/* DBAT3U */
526cdd2417SAlbert Herranz
536cdd2417SAlbert Herranz	mtspr	0x230, 8	/* IBAT4U */
546cdd2417SAlbert Herranz	mtspr	0x232, 8	/* IBAT5U */
556cdd2417SAlbert Herranz	mtspr	0x234, 8	/* IBAT6U */
566cdd2417SAlbert Herranz	mtspr	0x236, 8	/* IBAT7U */
576cdd2417SAlbert Herranz	mtspr	0x238, 8	/* DBAT4U */
586cdd2417SAlbert Herranz	mtspr	0x23a, 8	/* DBAT5U */
596cdd2417SAlbert Herranz	mtspr	0x23c, 8	/* DBAT6U */
606cdd2417SAlbert Herranz	mtspr	0x23e, 8	/* DBAT7U */
616cdd2417SAlbert Herranz
626cdd2417SAlbert Herranz	li	8, 0x01ff	/* first 16MiB */
636cdd2417SAlbert Herranz	li	9, 0x0002	/* rw */
646cdd2417SAlbert Herranz	mtspr	0x211, 9	/* IBAT0L */
656cdd2417SAlbert Herranz	mtspr	0x210, 8	/* IBAT0U */
666cdd2417SAlbert Herranz	mtspr	0x219, 9	/* DBAT0L */
676cdd2417SAlbert Herranz	mtspr	0x218, 8	/* DBAT0U */
686cdd2417SAlbert Herranz
696cdd2417SAlbert Herranz	lis	8, 0x0c00	/* I/O mem */
706cdd2417SAlbert Herranz	ori	8, 8, 0x3ff	/* 32MiB */
716cdd2417SAlbert Herranz	lis	9, 0x0c00
726cdd2417SAlbert Herranz	ori	9, 9, 0x002a	/* uncached, guarded, rw */
736cdd2417SAlbert Herranz	mtspr	0x21b, 9	/* DBAT1L */
746cdd2417SAlbert Herranz	mtspr	0x21a, 8	/* DBAT1U */
756cdd2417SAlbert Herranz
766cdd2417SAlbert Herranz	lis	8, 0x0100	/* next 8MiB */
776cdd2417SAlbert Herranz	ori	8, 8, 0x00ff	/* 8MiB */
786cdd2417SAlbert Herranz	lis	9, 0x0100
796cdd2417SAlbert Herranz	ori	9, 9, 0x0002	/* rw */
806cdd2417SAlbert Herranz	mtspr	0x215, 9	/* IBAT2L */
816cdd2417SAlbert Herranz	mtspr	0x214, 8	/* IBAT2U */
826cdd2417SAlbert Herranz	mtspr	0x21d, 9	/* DBAT2L */
836cdd2417SAlbert Herranz	mtspr	0x21c, 8	/* DBAT2U */
846cdd2417SAlbert Herranz
856cdd2417SAlbert Herranz	lis	8, 0x1000	/* MEM2 */
866cdd2417SAlbert Herranz	ori	8, 8, 0x07ff	/* 64MiB */
876cdd2417SAlbert Herranz	lis	9, 0x1000
886cdd2417SAlbert Herranz	ori	9, 9, 0x0002	/* rw */
896cdd2417SAlbert Herranz	mtspr	0x216, 8	/* IBAT3U */
906cdd2417SAlbert Herranz	mtspr	0x217, 9	/* IBAT3L */
916cdd2417SAlbert Herranz	mtspr	0x21e, 8	/* DBAT3U */
926cdd2417SAlbert Herranz	mtspr	0x21f, 9	/* DBAT3L */
936cdd2417SAlbert Herranz
946cdd2417SAlbert Herranz	/* enable the high BATs */
956cdd2417SAlbert Herranz	mfspr	8, 0x3f3	/* HID4 */
966cdd2417SAlbert Herranz	oris	8, 8, 0x0200
976cdd2417SAlbert Herranz	mtspr	0x3f3, 8	/* HID4 */
986cdd2417SAlbert Herranz
996cdd2417SAlbert Herranz	/* enable and invalidate the caches if not already enabled */
1006cdd2417SAlbert Herranz	mfspr	8, 0x3f0	/* HID0 */
1016cdd2417SAlbert Herranz	andi.	0, 8, (1<<15)		/* HID0_ICE */
1026cdd2417SAlbert Herranz	bne	1f
1036cdd2417SAlbert Herranz	ori	8, 8, (1<<15)|(1<<11)	/* HID0_ICE|HID0_ICFI*/
1046cdd2417SAlbert Herranz1:
1056cdd2417SAlbert Herranz	andi.	0, 8, (1<<14)		/* HID0_DCE */
1066cdd2417SAlbert Herranz	bne	1f
1076cdd2417SAlbert Herranz	ori	8, 8, (1<<14)|(1<<10)	/* HID0_DCE|HID0_DCFI*/
1086cdd2417SAlbert Herranz1:
1096cdd2417SAlbert Herranz	mtspr	0x3f0, 8	/* HID0 */
1106cdd2417SAlbert Herranz	isync
1116cdd2417SAlbert Herranz
1126cdd2417SAlbert Herranz	/* initialize arguments */
1136cdd2417SAlbert Herranz	li	3, 0
1146cdd2417SAlbert Herranz	li	4, 0
1156cdd2417SAlbert Herranz	li	5, 0
1166cdd2417SAlbert Herranz
1176cdd2417SAlbert Herranz	/* turn the MMU on */
1186cdd2417SAlbert Herranz	bcl	20, 31, 1f
1196cdd2417SAlbert Herranz1:
1206cdd2417SAlbert Herranz	mflr	8
1216cdd2417SAlbert Herranz	addi	8, 8, _mmu_on - 1b
1226cdd2417SAlbert Herranz	mfmsr	9
1236cdd2417SAlbert Herranz	ori	9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */
1246cdd2417SAlbert Herranz	mtsrr0	8
1256cdd2417SAlbert Herranz	mtsrr1	9
1266cdd2417SAlbert Herranz	sync
1276cdd2417SAlbert Herranz	rfi
1286cdd2417SAlbert Herranz_mmu_on:
1296cdd2417SAlbert Herranz	/* turn on the front blue led (aka: yay! we got here!) */
1306cdd2417SAlbert Herranz	lis	8, 0x0d00
1316cdd2417SAlbert Herranz	ori	8, 8, 0x00c0
1326cdd2417SAlbert Herranz	lwz	9, 0(8)
1336cdd2417SAlbert Herranz	ori	9, 9, 0x20
1346cdd2417SAlbert Herranz	stw	9, 0(8)
1356cdd2417SAlbert Herranz
1366cdd2417SAlbert Herranz	b _zimage_start_lib
1376cdd2417SAlbert Herranz
138