162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/powerpc/boot/gamecube-head.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Nintendo GameCube bootwrapper entry. 662306a36Sopenharmony_ci * Copyright (C) 2004-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 * 1762306a36Sopenharmony_ci * We enable the caches if not already enabled, enable the MMU with an 1862306a36Sopenharmony_ci * identity mapping scheme and jump to the start code. 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci .text 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci .globl _zimage_start 2462306a36Sopenharmony_ci_zimage_start: 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci /* turn the MMU off */ 2762306a36Sopenharmony_ci mfmsr 9 2862306a36Sopenharmony_ci rlwinm 9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */ 2962306a36Sopenharmony_ci bcl 20, 31, 1f 3062306a36Sopenharmony_ci1: 3162306a36Sopenharmony_ci mflr 8 3262306a36Sopenharmony_ci clrlwi 8, 8, 3 /* convert to a real address */ 3362306a36Sopenharmony_ci addi 8, 8, _mmu_off - 1b 3462306a36Sopenharmony_ci mtsrr0 8 3562306a36Sopenharmony_ci mtsrr1 9 3662306a36Sopenharmony_ci rfi 3762306a36Sopenharmony_ci_mmu_off: 3862306a36Sopenharmony_ci /* MMU disabled */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci /* setup BATs */ 4162306a36Sopenharmony_ci isync 4262306a36Sopenharmony_ci li 8, 0 4362306a36Sopenharmony_ci mtspr 0x210, 8 /* IBAT0U */ 4462306a36Sopenharmony_ci mtspr 0x212, 8 /* IBAT1U */ 4562306a36Sopenharmony_ci mtspr 0x214, 8 /* IBAT2U */ 4662306a36Sopenharmony_ci mtspr 0x216, 8 /* IBAT3U */ 4762306a36Sopenharmony_ci mtspr 0x218, 8 /* DBAT0U */ 4862306a36Sopenharmony_ci mtspr 0x21a, 8 /* DBAT1U */ 4962306a36Sopenharmony_ci mtspr 0x21c, 8 /* DBAT2U */ 5062306a36Sopenharmony_ci mtspr 0x21e, 8 /* DBAT3U */ 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci li 8, 0x01ff /* first 16MiB */ 5362306a36Sopenharmony_ci li 9, 0x0002 /* rw */ 5462306a36Sopenharmony_ci mtspr 0x211, 9 /* IBAT0L */ 5562306a36Sopenharmony_ci mtspr 0x210, 8 /* IBAT0U */ 5662306a36Sopenharmony_ci mtspr 0x219, 9 /* DBAT0L */ 5762306a36Sopenharmony_ci mtspr 0x218, 8 /* DBAT0U */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci lis 8, 0x0c00 /* I/O mem */ 6062306a36Sopenharmony_ci ori 8, 8, 0x3ff /* 32MiB */ 6162306a36Sopenharmony_ci lis 9, 0x0c00 6262306a36Sopenharmony_ci ori 9, 9, 0x002a /* uncached, guarded, rw */ 6362306a36Sopenharmony_ci mtspr 0x21b, 9 /* DBAT1L */ 6462306a36Sopenharmony_ci mtspr 0x21a, 8 /* DBAT1U */ 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci lis 8, 0x0100 /* next 8MiB */ 6762306a36Sopenharmony_ci ori 8, 8, 0x00ff /* 8MiB */ 6862306a36Sopenharmony_ci lis 9, 0x0100 6962306a36Sopenharmony_ci ori 9, 9, 0x0002 /* rw */ 7062306a36Sopenharmony_ci mtspr 0x215, 9 /* IBAT2L */ 7162306a36Sopenharmony_ci mtspr 0x214, 8 /* IBAT2U */ 7262306a36Sopenharmony_ci mtspr 0x21d, 9 /* DBAT2L */ 7362306a36Sopenharmony_ci mtspr 0x21c, 8 /* DBAT2U */ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* enable and invalidate the caches if not already enabled */ 7662306a36Sopenharmony_ci mfspr 8, 0x3f0 /* HID0 */ 7762306a36Sopenharmony_ci andi. 0, 8, (1<<15) /* HID0_ICE */ 7862306a36Sopenharmony_ci bne 1f 7962306a36Sopenharmony_ci ori 8, 8, (1<<15)|(1<<11) /* HID0_ICE|HID0_ICFI*/ 8062306a36Sopenharmony_ci1: 8162306a36Sopenharmony_ci andi. 0, 8, (1<<14) /* HID0_DCE */ 8262306a36Sopenharmony_ci bne 1f 8362306a36Sopenharmony_ci ori 8, 8, (1<<14)|(1<<10) /* HID0_DCE|HID0_DCFI*/ 8462306a36Sopenharmony_ci1: 8562306a36Sopenharmony_ci mtspr 0x3f0, 8 /* HID0 */ 8662306a36Sopenharmony_ci isync 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci /* initialize arguments */ 8962306a36Sopenharmony_ci li 3, 0 9062306a36Sopenharmony_ci li 4, 0 9162306a36Sopenharmony_ci li 5, 0 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci /* turn the MMU on */ 9462306a36Sopenharmony_ci bcl 20, 31, 1f 9562306a36Sopenharmony_ci1: 9662306a36Sopenharmony_ci mflr 8 9762306a36Sopenharmony_ci addi 8, 8, _mmu_on - 1b 9862306a36Sopenharmony_ci mfmsr 9 9962306a36Sopenharmony_ci ori 9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */ 10062306a36Sopenharmony_ci mtsrr0 8 10162306a36Sopenharmony_ci mtsrr1 9 10262306a36Sopenharmony_ci sync 10362306a36Sopenharmony_ci rfi 10462306a36Sopenharmony_ci_mmu_on: 10562306a36Sopenharmony_ci b _zimage_start_lib 10662306a36Sopenharmony_ci 107