162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/powerpc/boot/wii-head.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Nintendo Wii bootwrapper entry. 662306a36Sopenharmony_ci * Copyright (C) 2008-2009 The GameCube Linux Team 762306a36Sopenharmony_ci * Copyright (C) 2008,2009 Albert Herranz 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "ppc_asm.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * The entry code does no assumptions regarding: 1462306a36Sopenharmony_ci * - if the data and instruction caches are enabled or not 1562306a36Sopenharmony_ci * - if the MMU is enabled or not 1662306a36Sopenharmony_ci * - if the high BATs are enabled or not 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * We enable the high BATs, enable the caches if not already enabled, 1962306a36Sopenharmony_ci * enable the MMU with an identity mapping scheme and jump to the start code. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci .text 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci .globl _zimage_start 2562306a36Sopenharmony_ci_zimage_start: 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci /* turn the MMU off */ 2862306a36Sopenharmony_ci mfmsr 9 2962306a36Sopenharmony_ci rlwinm 9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */ 3062306a36Sopenharmony_ci bcl 20, 31, 1f 3162306a36Sopenharmony_ci1: 3262306a36Sopenharmony_ci mflr 8 3362306a36Sopenharmony_ci clrlwi 8, 8, 3 /* convert to a real address */ 3462306a36Sopenharmony_ci addi 8, 8, _mmu_off - 1b 3562306a36Sopenharmony_ci mtsrr0 8 3662306a36Sopenharmony_ci mtsrr1 9 3762306a36Sopenharmony_ci rfi 3862306a36Sopenharmony_ci_mmu_off: 3962306a36Sopenharmony_ci /* MMU disabled */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci /* setup BATs */ 4262306a36Sopenharmony_ci isync 4362306a36Sopenharmony_ci li 8, 0 4462306a36Sopenharmony_ci mtspr 0x210, 8 /* IBAT0U */ 4562306a36Sopenharmony_ci mtspr 0x212, 8 /* IBAT1U */ 4662306a36Sopenharmony_ci mtspr 0x214, 8 /* IBAT2U */ 4762306a36Sopenharmony_ci mtspr 0x216, 8 /* IBAT3U */ 4862306a36Sopenharmony_ci mtspr 0x218, 8 /* DBAT0U */ 4962306a36Sopenharmony_ci mtspr 0x21a, 8 /* DBAT1U */ 5062306a36Sopenharmony_ci mtspr 0x21c, 8 /* DBAT2U */ 5162306a36Sopenharmony_ci mtspr 0x21e, 8 /* DBAT3U */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci mtspr 0x230, 8 /* IBAT4U */ 5462306a36Sopenharmony_ci mtspr 0x232, 8 /* IBAT5U */ 5562306a36Sopenharmony_ci mtspr 0x234, 8 /* IBAT6U */ 5662306a36Sopenharmony_ci mtspr 0x236, 8 /* IBAT7U */ 5762306a36Sopenharmony_ci mtspr 0x238, 8 /* DBAT4U */ 5862306a36Sopenharmony_ci mtspr 0x23a, 8 /* DBAT5U */ 5962306a36Sopenharmony_ci mtspr 0x23c, 8 /* DBAT6U */ 6062306a36Sopenharmony_ci mtspr 0x23e, 8 /* DBAT7U */ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci li 8, 0x01ff /* first 16MiB */ 6362306a36Sopenharmony_ci li 9, 0x0002 /* rw */ 6462306a36Sopenharmony_ci mtspr 0x211, 9 /* IBAT0L */ 6562306a36Sopenharmony_ci mtspr 0x210, 8 /* IBAT0U */ 6662306a36Sopenharmony_ci mtspr 0x219, 9 /* DBAT0L */ 6762306a36Sopenharmony_ci mtspr 0x218, 8 /* DBAT0U */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci lis 8, 0x0c00 /* I/O mem */ 7062306a36Sopenharmony_ci ori 8, 8, 0x3ff /* 32MiB */ 7162306a36Sopenharmony_ci lis 9, 0x0c00 7262306a36Sopenharmony_ci ori 9, 9, 0x002a /* uncached, guarded, rw */ 7362306a36Sopenharmony_ci mtspr 0x21b, 9 /* DBAT1L */ 7462306a36Sopenharmony_ci mtspr 0x21a, 8 /* DBAT1U */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci lis 8, 0x0100 /* next 8MiB */ 7762306a36Sopenharmony_ci ori 8, 8, 0x00ff /* 8MiB */ 7862306a36Sopenharmony_ci lis 9, 0x0100 7962306a36Sopenharmony_ci ori 9, 9, 0x0002 /* rw */ 8062306a36Sopenharmony_ci mtspr 0x215, 9 /* IBAT2L */ 8162306a36Sopenharmony_ci mtspr 0x214, 8 /* IBAT2U */ 8262306a36Sopenharmony_ci mtspr 0x21d, 9 /* DBAT2L */ 8362306a36Sopenharmony_ci mtspr 0x21c, 8 /* DBAT2U */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci lis 8, 0x1000 /* MEM2 */ 8662306a36Sopenharmony_ci ori 8, 8, 0x07ff /* 64MiB */ 8762306a36Sopenharmony_ci lis 9, 0x1000 8862306a36Sopenharmony_ci ori 9, 9, 0x0002 /* rw */ 8962306a36Sopenharmony_ci mtspr 0x216, 8 /* IBAT3U */ 9062306a36Sopenharmony_ci mtspr 0x217, 9 /* IBAT3L */ 9162306a36Sopenharmony_ci mtspr 0x21e, 8 /* DBAT3U */ 9262306a36Sopenharmony_ci mtspr 0x21f, 9 /* DBAT3L */ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci /* enable the high BATs */ 9562306a36Sopenharmony_ci mfspr 8, 0x3f3 /* HID4 */ 9662306a36Sopenharmony_ci oris 8, 8, 0x0200 9762306a36Sopenharmony_ci mtspr 0x3f3, 8 /* HID4 */ 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* enable and invalidate the caches if not already enabled */ 10062306a36Sopenharmony_ci mfspr 8, 0x3f0 /* HID0 */ 10162306a36Sopenharmony_ci andi. 0, 8, (1<<15) /* HID0_ICE */ 10262306a36Sopenharmony_ci bne 1f 10362306a36Sopenharmony_ci ori 8, 8, (1<<15)|(1<<11) /* HID0_ICE|HID0_ICFI*/ 10462306a36Sopenharmony_ci1: 10562306a36Sopenharmony_ci andi. 0, 8, (1<<14) /* HID0_DCE */ 10662306a36Sopenharmony_ci bne 1f 10762306a36Sopenharmony_ci ori 8, 8, (1<<14)|(1<<10) /* HID0_DCE|HID0_DCFI*/ 10862306a36Sopenharmony_ci1: 10962306a36Sopenharmony_ci mtspr 0x3f0, 8 /* HID0 */ 11062306a36Sopenharmony_ci isync 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* initialize arguments */ 11362306a36Sopenharmony_ci li 3, 0 11462306a36Sopenharmony_ci li 4, 0 11562306a36Sopenharmony_ci li 5, 0 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci /* turn the MMU on */ 11862306a36Sopenharmony_ci bcl 20, 31, 1f 11962306a36Sopenharmony_ci1: 12062306a36Sopenharmony_ci mflr 8 12162306a36Sopenharmony_ci addi 8, 8, _mmu_on - 1b 12262306a36Sopenharmony_ci mfmsr 9 12362306a36Sopenharmony_ci ori 9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */ 12462306a36Sopenharmony_ci mtsrr0 8 12562306a36Sopenharmony_ci mtsrr1 9 12662306a36Sopenharmony_ci sync 12762306a36Sopenharmony_ci rfi 12862306a36Sopenharmony_ci_mmu_on: 12962306a36Sopenharmony_ci /* turn on the front blue led (aka: yay! we got here!) */ 13062306a36Sopenharmony_ci lis 8, 0x0d00 13162306a36Sopenharmony_ci ori 8, 8, 0x00c0 13262306a36Sopenharmony_ci lwz 9, 0(8) 13362306a36Sopenharmony_ci ori 9, 9, 0x20 13462306a36Sopenharmony_ci stw 9, 0(8) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci b _zimage_start_lib 13762306a36Sopenharmony_ci 138