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