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