xref: /openbmc/linux/arch/powerpc/boot/wii-head.S (revision 6cdd24179d31b5e9beaea01f8ac5a1ba77415e33)
1*6cdd2417SAlbert Herranz/*
2*6cdd2417SAlbert Herranz * arch/powerpc/boot/wii-head.S
3*6cdd2417SAlbert Herranz *
4*6cdd2417SAlbert Herranz * Nintendo Wii bootwrapper entry.
5*6cdd2417SAlbert Herranz * Copyright (C) 2008-2009 The GameCube Linux Team
6*6cdd2417SAlbert Herranz * Copyright (C) 2008,2009 Albert Herranz
7*6cdd2417SAlbert Herranz *
8*6cdd2417SAlbert Herranz * This program is free software; you can redistribute it and/or
9*6cdd2417SAlbert Herranz * modify it under the terms of the GNU General Public License
10*6cdd2417SAlbert Herranz * as published by the Free Software Foundation; either version 2
11*6cdd2417SAlbert Herranz * of the License, or (at your option) any later version.
12*6cdd2417SAlbert Herranz *
13*6cdd2417SAlbert Herranz */
14*6cdd2417SAlbert Herranz
15*6cdd2417SAlbert Herranz#include "ppc_asm.h"
16*6cdd2417SAlbert Herranz
17*6cdd2417SAlbert Herranz/*
18*6cdd2417SAlbert Herranz * The entry code does no assumptions regarding:
19*6cdd2417SAlbert Herranz * - if the data and instruction caches are enabled or not
20*6cdd2417SAlbert Herranz * - if the MMU is enabled or not
21*6cdd2417SAlbert Herranz * - if the high BATs are enabled or not
22*6cdd2417SAlbert Herranz *
23*6cdd2417SAlbert Herranz * We enable the high BATs, enable the caches if not already enabled,
24*6cdd2417SAlbert Herranz * enable the MMU with an identity mapping scheme and jump to the start code.
25*6cdd2417SAlbert Herranz */
26*6cdd2417SAlbert Herranz
27*6cdd2417SAlbert Herranz	.text
28*6cdd2417SAlbert Herranz
29*6cdd2417SAlbert Herranz	.globl _zimage_start
30*6cdd2417SAlbert Herranz_zimage_start:
31*6cdd2417SAlbert Herranz
32*6cdd2417SAlbert Herranz	/* turn the MMU off */
33*6cdd2417SAlbert Herranz	mfmsr	9
34*6cdd2417SAlbert Herranz	rlwinm	9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */
35*6cdd2417SAlbert Herranz	bcl	20, 31, 1f
36*6cdd2417SAlbert Herranz1:
37*6cdd2417SAlbert Herranz	mflr	8
38*6cdd2417SAlbert Herranz	clrlwi	8, 8, 3		/* convert to a real address */
39*6cdd2417SAlbert Herranz	addi	8, 8, _mmu_off - 1b
40*6cdd2417SAlbert Herranz	mtsrr0	8
41*6cdd2417SAlbert Herranz	mtsrr1	9
42*6cdd2417SAlbert Herranz	rfi
43*6cdd2417SAlbert Herranz_mmu_off:
44*6cdd2417SAlbert Herranz	/* MMU disabled */
45*6cdd2417SAlbert Herranz
46*6cdd2417SAlbert Herranz	/* setup BATs */
47*6cdd2417SAlbert Herranz	isync
48*6cdd2417SAlbert Herranz	li      8, 0
49*6cdd2417SAlbert Herranz	mtspr	0x210, 8	/* IBAT0U */
50*6cdd2417SAlbert Herranz	mtspr	0x212, 8	/* IBAT1U */
51*6cdd2417SAlbert Herranz	mtspr	0x214, 8	/* IBAT2U */
52*6cdd2417SAlbert Herranz	mtspr	0x216, 8	/* IBAT3U */
53*6cdd2417SAlbert Herranz	mtspr	0x218, 8	/* DBAT0U */
54*6cdd2417SAlbert Herranz	mtspr	0x21a, 8	/* DBAT1U */
55*6cdd2417SAlbert Herranz	mtspr	0x21c, 8	/* DBAT2U */
56*6cdd2417SAlbert Herranz	mtspr	0x21e, 8	/* DBAT3U */
57*6cdd2417SAlbert Herranz
58*6cdd2417SAlbert Herranz	mtspr	0x230, 8	/* IBAT4U */
59*6cdd2417SAlbert Herranz	mtspr	0x232, 8	/* IBAT5U */
60*6cdd2417SAlbert Herranz	mtspr	0x234, 8	/* IBAT6U */
61*6cdd2417SAlbert Herranz	mtspr	0x236, 8	/* IBAT7U */
62*6cdd2417SAlbert Herranz	mtspr	0x238, 8	/* DBAT4U */
63*6cdd2417SAlbert Herranz	mtspr	0x23a, 8	/* DBAT5U */
64*6cdd2417SAlbert Herranz	mtspr	0x23c, 8	/* DBAT6U */
65*6cdd2417SAlbert Herranz	mtspr	0x23e, 8	/* DBAT7U */
66*6cdd2417SAlbert Herranz
67*6cdd2417SAlbert Herranz	li	8, 0x01ff	/* first 16MiB */
68*6cdd2417SAlbert Herranz	li	9, 0x0002	/* rw */
69*6cdd2417SAlbert Herranz	mtspr	0x211, 9	/* IBAT0L */
70*6cdd2417SAlbert Herranz	mtspr	0x210, 8	/* IBAT0U */
71*6cdd2417SAlbert Herranz	mtspr	0x219, 9	/* DBAT0L */
72*6cdd2417SAlbert Herranz	mtspr	0x218, 8	/* DBAT0U */
73*6cdd2417SAlbert Herranz
74*6cdd2417SAlbert Herranz	lis	8, 0x0c00	/* I/O mem */
75*6cdd2417SAlbert Herranz	ori	8, 8, 0x3ff	/* 32MiB */
76*6cdd2417SAlbert Herranz	lis	9, 0x0c00
77*6cdd2417SAlbert Herranz	ori	9, 9, 0x002a	/* uncached, guarded, rw */
78*6cdd2417SAlbert Herranz	mtspr	0x21b, 9	/* DBAT1L */
79*6cdd2417SAlbert Herranz	mtspr	0x21a, 8	/* DBAT1U */
80*6cdd2417SAlbert Herranz
81*6cdd2417SAlbert Herranz	lis	8, 0x0100	/* next 8MiB */
82*6cdd2417SAlbert Herranz	ori	8, 8, 0x00ff	/* 8MiB */
83*6cdd2417SAlbert Herranz	lis	9, 0x0100
84*6cdd2417SAlbert Herranz	ori	9, 9, 0x0002	/* rw */
85*6cdd2417SAlbert Herranz	mtspr	0x215, 9	/* IBAT2L */
86*6cdd2417SAlbert Herranz	mtspr	0x214, 8	/* IBAT2U */
87*6cdd2417SAlbert Herranz	mtspr	0x21d, 9	/* DBAT2L */
88*6cdd2417SAlbert Herranz	mtspr	0x21c, 8	/* DBAT2U */
89*6cdd2417SAlbert Herranz
90*6cdd2417SAlbert Herranz	lis	8, 0x1000	/* MEM2 */
91*6cdd2417SAlbert Herranz	ori	8, 8, 0x07ff	/* 64MiB */
92*6cdd2417SAlbert Herranz	lis	9, 0x1000
93*6cdd2417SAlbert Herranz	ori	9, 9, 0x0002	/* rw */
94*6cdd2417SAlbert Herranz	mtspr	0x216, 8	/* IBAT3U */
95*6cdd2417SAlbert Herranz	mtspr	0x217, 9	/* IBAT3L */
96*6cdd2417SAlbert Herranz	mtspr	0x21e, 8	/* DBAT3U */
97*6cdd2417SAlbert Herranz	mtspr	0x21f, 9	/* DBAT3L */
98*6cdd2417SAlbert Herranz
99*6cdd2417SAlbert Herranz	/* enable the high BATs */
100*6cdd2417SAlbert Herranz	mfspr	8, 0x3f3	/* HID4 */
101*6cdd2417SAlbert Herranz	oris	8, 8, 0x0200
102*6cdd2417SAlbert Herranz	mtspr	0x3f3, 8	/* HID4 */
103*6cdd2417SAlbert Herranz
104*6cdd2417SAlbert Herranz	/* enable and invalidate the caches if not already enabled */
105*6cdd2417SAlbert Herranz	mfspr	8, 0x3f0	/* HID0 */
106*6cdd2417SAlbert Herranz	andi.	0, 8, (1<<15)		/* HID0_ICE */
107*6cdd2417SAlbert Herranz	bne	1f
108*6cdd2417SAlbert Herranz	ori	8, 8, (1<<15)|(1<<11)	/* HID0_ICE|HID0_ICFI*/
109*6cdd2417SAlbert Herranz1:
110*6cdd2417SAlbert Herranz	andi.	0, 8, (1<<14)		/* HID0_DCE */
111*6cdd2417SAlbert Herranz	bne	1f
112*6cdd2417SAlbert Herranz	ori	8, 8, (1<<14)|(1<<10)	/* HID0_DCE|HID0_DCFI*/
113*6cdd2417SAlbert Herranz1:
114*6cdd2417SAlbert Herranz	mtspr	0x3f0, 8	/* HID0 */
115*6cdd2417SAlbert Herranz	isync
116*6cdd2417SAlbert Herranz
117*6cdd2417SAlbert Herranz	/* initialize arguments */
118*6cdd2417SAlbert Herranz	li	3, 0
119*6cdd2417SAlbert Herranz	li	4, 0
120*6cdd2417SAlbert Herranz	li	5, 0
121*6cdd2417SAlbert Herranz
122*6cdd2417SAlbert Herranz	/* turn the MMU on */
123*6cdd2417SAlbert Herranz	bcl	20, 31, 1f
124*6cdd2417SAlbert Herranz1:
125*6cdd2417SAlbert Herranz	mflr	8
126*6cdd2417SAlbert Herranz	addi	8, 8, _mmu_on - 1b
127*6cdd2417SAlbert Herranz	mfmsr	9
128*6cdd2417SAlbert Herranz	ori	9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */
129*6cdd2417SAlbert Herranz	mtsrr0	8
130*6cdd2417SAlbert Herranz	mtsrr1	9
131*6cdd2417SAlbert Herranz	sync
132*6cdd2417SAlbert Herranz	rfi
133*6cdd2417SAlbert Herranz_mmu_on:
134*6cdd2417SAlbert Herranz	/* turn on the front blue led (aka: yay! we got here!) */
135*6cdd2417SAlbert Herranz	lis	8, 0x0d00
136*6cdd2417SAlbert Herranz	ori	8, 8, 0x00c0
137*6cdd2417SAlbert Herranz	lwz	9, 0(8)
138*6cdd2417SAlbert Herranz	ori	9, 9, 0x20
139*6cdd2417SAlbert Herranz	stw	9, 0(8)
140*6cdd2417SAlbert Herranz
141*6cdd2417SAlbert Herranz	b _zimage_start_lib
142*6cdd2417SAlbert Herranz
143