16b7ba544SRafal Jaworowski/*- 228bb01e5SRafal Jaworowski * Copyright (C) 2007-2009 Semihalf, Rafal Jaworowski <raj@semihalf.com> 36b7ba544SRafal Jaworowski * Copyright (C) 2006 Semihalf, Marian Balakowicz <m8@semihalf.com> 46b7ba544SRafal Jaworowski * All rights reserved. 56b7ba544SRafal Jaworowski * 66b7ba544SRafal Jaworowski * Redistribution and use in source and binary forms, with or without 76b7ba544SRafal Jaworowski * modification, are permitted provided that the following conditions 86b7ba544SRafal Jaworowski * are met: 96b7ba544SRafal Jaworowski * 1. Redistributions of source code must retain the above copyright 106b7ba544SRafal Jaworowski * notice, this list of conditions and the following disclaimer. 116b7ba544SRafal Jaworowski * 2. Redistributions in binary form must reproduce the above copyright 126b7ba544SRafal Jaworowski * notice, this list of conditions and the following disclaimer in the 136b7ba544SRafal Jaworowski * documentation and/or other materials provided with the distribution. 146b7ba544SRafal Jaworowski * 156b7ba544SRafal Jaworowski * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 166b7ba544SRafal Jaworowski * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 176b7ba544SRafal Jaworowski * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 186b7ba544SRafal Jaworowski * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 196b7ba544SRafal Jaworowski * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 206b7ba544SRafal Jaworowski * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 216b7ba544SRafal Jaworowski * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 226b7ba544SRafal Jaworowski * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 236b7ba544SRafal Jaworowski * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 246b7ba544SRafal Jaworowski * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 256b7ba544SRafal Jaworowski * 266b7ba544SRafal Jaworowski * $FreeBSD$ 276b7ba544SRafal Jaworowski */ 286b7ba544SRafal Jaworowski 296b7ba544SRafal Jaworowski#include "assym.s" 306b7ba544SRafal Jaworowski 31a7452468SJustin Hibbits#include "opt_hwpmc_hooks.h" 32a7452468SJustin Hibbits 336b7ba544SRafal Jaworowski#include <machine/asm.h> 34b9b8eb77SRafal Jaworowski#include <machine/hid.h> 35fdd28cb8SRafal Jaworowski#include <machine/param.h> 366b7ba544SRafal Jaworowski#include <machine/spr.h> 376b7ba544SRafal Jaworowski#include <machine/pte.h> 386b7ba544SRafal Jaworowski#include <machine/trap.h> 396b7ba544SRafal Jaworowski#include <machine/vmparam.h> 406b7ba544SRafal Jaworowski#include <machine/tlb.h> 416b7ba544SRafal Jaworowski 42959aea56SRafal Jaworowski#define TMPSTACKSZ 16384 43959aea56SRafal Jaworowski 44dc9d1684SMarcel Moolenaar .text 45dc9d1684SMarcel Moolenaar .globl btext 46dc9d1684SMarcel Moolenaarbtext: 47dc9d1684SMarcel Moolenaar 486b7ba544SRafal Jaworowski/* 496b7ba544SRafal Jaworowski * This symbol is here for the benefit of kvm_mkdb, and is supposed to 506b7ba544SRafal Jaworowski * mark the start of kernel text. 516b7ba544SRafal Jaworowski */ 526b7ba544SRafal Jaworowski .globl kernel_text 536b7ba544SRafal Jaworowskikernel_text: 546b7ba544SRafal Jaworowski 556b7ba544SRafal Jaworowski/* 566b7ba544SRafal Jaworowski * Startup entry. Note, this must be the first thing in the text segment! 576b7ba544SRafal Jaworowski */ 586b7ba544SRafal Jaworowski .text 596b7ba544SRafal Jaworowski .globl __start 606b7ba544SRafal Jaworowski__start: 616b7ba544SRafal Jaworowski 626b7ba544SRafal Jaworowski/* 63fdd28cb8SRafal Jaworowski * Assumptions on the boot loader: 647f7fcf55SJustin Hibbits * - System memory starts from physical address 0 657f7fcf55SJustin Hibbits * - It's mapped by a single TLB1 entry 666b7ba544SRafal Jaworowski * - TLB1 mapping is 1:1 pa to va 677f7fcf55SJustin Hibbits * - Kernel is loaded at 64MB boundary 687f7fcf55SJustin Hibbits * - All PID registers are set to the same value 69fdd28cb8SRafal Jaworowski * - CPU is running in AS=0 706b7ba544SRafal Jaworowski * 71fdd28cb8SRafal Jaworowski * Registers contents provided by the loader(8): 726b7ba544SRafal Jaworowski * r1 : stack pointer 736b7ba544SRafal Jaworowski * r3 : metadata pointer 746b7ba544SRafal Jaworowski * 756b7ba544SRafal Jaworowski * We rearrange the TLB1 layout as follows: 767f7fcf55SJustin Hibbits * - Find TLB1 entry we started in 777f7fcf55SJustin Hibbits * - Make sure it's protected, invalidate other entries 787f7fcf55SJustin Hibbits * - Create temp entry in the second AS (make sure it's not TLB[1]) 797f7fcf55SJustin Hibbits * - Switch to temp mapping 807f7fcf55SJustin Hibbits * - Map 64MB of RAM in TLB1[1] 817f7fcf55SJustin Hibbits * - Use AS=1, set EPN to KERNBASE and RPN to kernel load address 827f7fcf55SJustin Hibbits * - Switch to to TLB1[1] mapping 837f7fcf55SJustin Hibbits * - Invalidate temp mapping 846b7ba544SRafal Jaworowski * 85fdd28cb8SRafal Jaworowski * locore registers use: 866b7ba544SRafal Jaworowski * r1 : stack pointer 87fdd28cb8SRafal Jaworowski * r2 : trace pointer (AP only, for early diagnostics) 882b5bf115SMarcel Moolenaar * r3-r27 : scratch registers 89ebf84cecSMarcel Moolenaar * r28 : temp TLB1 entry 90ebf84cecSMarcel Moolenaar * r29 : initial TLB1 entry we started in 91ebf84cecSMarcel Moolenaar * r30-r31 : arguments (metadata pointer) 926b7ba544SRafal Jaworowski */ 936b7ba544SRafal Jaworowski 946b7ba544SRafal Jaworowski/* 95ebf84cecSMarcel Moolenaar * Keep arguments in r30 & r31 for later use. 966b7ba544SRafal Jaworowski */ 97ebf84cecSMarcel Moolenaar mr %r30, %r3 98ebf84cecSMarcel Moolenaar mr %r31, %r4 996b7ba544SRafal Jaworowski 1006b7ba544SRafal Jaworowski/* 1016b7ba544SRafal Jaworowski * Initial cleanup 1026b7ba544SRafal Jaworowski */ 103fdd28cb8SRafal Jaworowski li %r3, PSL_DE /* Keep debug exceptions for CodeWarrior. */ 104fdd28cb8SRafal Jaworowski mtmsr %r3 1056b7ba544SRafal Jaworowski isync 1066b7ba544SRafal Jaworowski 107f60708c9SJustin Hibbits/* 108f60708c9SJustin Hibbits * Initial HIDs configuration 109f60708c9SJustin Hibbits */ 110f60708c9SJustin Hibbits1: 1117f7fcf55SJustin Hibbits mfpvr %r3 1127f7fcf55SJustin Hibbits rlwinm %r3, %r3, 16, 16, 31 1137f7fcf55SJustin Hibbits 1147f7fcf55SJustin Hibbits lis %r4, HID0_E500_DEFAULT_SET@h 1157f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E500_DEFAULT_SET@l 1167f7fcf55SJustin Hibbits 1177f7fcf55SJustin Hibbits /* Check for e500mc and e5500 */ 1187f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E500mc 1197f7fcf55SJustin Hibbits bne 2f 1207f7fcf55SJustin Hibbits 1217f7fcf55SJustin Hibbits lis %r4, HID0_E500MC_DEFAULT_SET@h 1227f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E500MC_DEFAULT_SET@l 1237f7fcf55SJustin Hibbits b 3f 1247f7fcf55SJustin Hibbits2: 1257f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E5500 1267f7fcf55SJustin Hibbits bne 3f 1277f7fcf55SJustin Hibbits 1287f7fcf55SJustin Hibbits lis %r4, HID0_E5500_DEFAULT_SET@h 1297f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E5500_DEFAULT_SET@l 1307f7fcf55SJustin Hibbits 1317f7fcf55SJustin Hibbits3: 1327f7fcf55SJustin Hibbits mtspr SPR_HID0, %r4 133b9b8eb77SRafal Jaworowski isync 1347f7fcf55SJustin Hibbits 1357f7fcf55SJustin Hibbits/* 1367f7fcf55SJustin Hibbits * E500mc and E5500 do not have HID1 register, so skip HID1 setup on 1377f7fcf55SJustin Hibbits * this core. 1387f7fcf55SJustin Hibbits */ 1397f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E500mc 1407f7fcf55SJustin Hibbits beq 1f 1417f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E5500 1427f7fcf55SJustin Hibbits beq 1f 1437f7fcf55SJustin Hibbits 144b9b8eb77SRafal Jaworowski lis %r3, HID1_E500_DEFAULT_SET@h 145b9b8eb77SRafal Jaworowski ori %r3, %r3, HID1_E500_DEFAULT_SET@l 146b9b8eb77SRafal Jaworowski mtspr SPR_HID1, %r3 147b9b8eb77SRafal Jaworowski isync 1487f7fcf55SJustin Hibbits1: 149fdd28cb8SRafal Jaworowski /* Invalidate all entries in TLB0 */ 150fdd28cb8SRafal Jaworowski li %r3, 0 151fdd28cb8SRafal Jaworowski bl tlb_inval_all 1526b7ba544SRafal Jaworowski 1532b5bf115SMarcel Moolenaar cmpwi %r30, 0 1542b5bf115SMarcel Moolenaar beq done_mapping 1552b5bf115SMarcel Moolenaar 1566b7ba544SRafal Jaworowski/* 157fdd28cb8SRafal Jaworowski * Locate the TLB1 entry that maps this code 1586b7ba544SRafal Jaworowski */ 159fdd28cb8SRafal Jaworowski bl 1f 160fdd28cb8SRafal Jaworowski1: mflr %r3 161ebf84cecSMarcel Moolenaar bl tlb1_find_current /* the entry found is returned in r29 */ 1626b7ba544SRafal Jaworowski 163fdd28cb8SRafal Jaworowski bl tlb1_inval_all_but_current 1644a49da83SMarcel Moolenaar 1656b7ba544SRafal Jaworowski/* 166fdd28cb8SRafal Jaworowski * Create temporary mapping in AS=1 and switch to it 1676b7ba544SRafal Jaworowski */ 168fdd28cb8SRafal Jaworowski bl tlb1_temp_mapping_as1 1696b7ba544SRafal Jaworowski 170fdd28cb8SRafal Jaworowski mfmsr %r3 171fdd28cb8SRafal Jaworowski ori %r3, %r3, (PSL_IS | PSL_DS) 172fdd28cb8SRafal Jaworowski bl 2f 173fdd28cb8SRafal Jaworowski2: mflr %r4 174*d071aa6dSJustin Hibbits addi %r4, %r4, (3f - 2b) 175fdd28cb8SRafal Jaworowski mtspr SPR_SRR0, %r4 176fdd28cb8SRafal Jaworowski mtspr SPR_SRR1, %r3 1776b7ba544SRafal Jaworowski rfi /* Switch context */ 1786b7ba544SRafal Jaworowski 1796b7ba544SRafal Jaworowski/* 1806b7ba544SRafal Jaworowski * Invalidate initial entry 1816b7ba544SRafal Jaworowski */ 182*d071aa6dSJustin Hibbits3: 183ebf84cecSMarcel Moolenaar mr %r3, %r29 1846b7ba544SRafal Jaworowski bl tlb1_inval_entry 1856b7ba544SRafal Jaworowski 1866b7ba544SRafal Jaworowski/* 1876b7ba544SRafal Jaworowski * Setup final mapping in TLB1[1] and switch to it 1886b7ba544SRafal Jaworowski */ 1897f7fcf55SJustin Hibbits /* Final kernel mapping, map in 64 MB of RAM */ 190fdd28cb8SRafal Jaworowski lis %r3, MAS0_TLBSEL1@h /* Select TLB1 */ 1916a76463eSMarcel Moolenaar li %r4, 0 /* Entry 0 */ 1927f7fcf55SJustin Hibbits rlwimi %r3, %r4, 16, 10, 15 193fdd28cb8SRafal Jaworowski mtspr SPR_MAS0, %r3 1946b7ba544SRafal Jaworowski isync 1956b7ba544SRafal Jaworowski 196d2a406ddSNathan Whitehorn li %r3, (TLB_SIZE_64M << MAS1_TSIZE_SHIFT)@l 197fdd28cb8SRafal Jaworowski oris %r3, %r3, (MAS1_VALID | MAS1_IPROT)@h 198fdd28cb8SRafal Jaworowski mtspr SPR_MAS1, %r3 /* note TS was not filled, so it's TS=0 */ 1996b7ba544SRafal Jaworowski isync 2006b7ba544SRafal Jaworowski 201fdd28cb8SRafal Jaworowski lis %r3, KERNBASE@h 202fdd28cb8SRafal Jaworowski ori %r3, %r3, KERNBASE@l /* EPN = KERNBASE */ 20328bb01e5SRafal Jaworowski#ifdef SMP 204f60708c9SJustin Hibbits ori %r3, %r3, (_TLB_ENTRY_SHARED | MAS2_M)@l /* WIMGE = 0b00100 */ 20528bb01e5SRafal Jaworowski#endif 206fdd28cb8SRafal Jaworowski mtspr SPR_MAS2, %r3 2076b7ba544SRafal Jaworowski isync 2086b7ba544SRafal Jaworowski 209fdd28cb8SRafal Jaworowski /* Discover phys load address */ 210fdd28cb8SRafal Jaworowski bl 3f 211fdd28cb8SRafal Jaworowski3: mflr %r4 /* Use current address */ 2127f7fcf55SJustin Hibbits rlwinm %r4, %r4, 0, 0, 5 /* 64MB alignment mask */ 213fdd28cb8SRafal Jaworowski ori %r4, %r4, (MAS3_SX | MAS3_SW | MAS3_SR)@l 214fdd28cb8SRafal Jaworowski mtspr SPR_MAS3, %r4 /* Set RPN and protection */ 2156b7ba544SRafal Jaworowski isync 2167f7fcf55SJustin Hibbits bl zero_mas7 2177f7fcf55SJustin Hibbits bl zero_mas8 2186b7ba544SRafal Jaworowski tlbwe 2196b7ba544SRafal Jaworowski isync 2206b7ba544SRafal Jaworowski msync 2216b7ba544SRafal Jaworowski 2226b7ba544SRafal Jaworowski /* Switch to the above TLB1[1] mapping */ 223fdd28cb8SRafal Jaworowski bl 4f 224fdd28cb8SRafal Jaworowski4: mflr %r4 225fdd28cb8SRafal Jaworowski rlwinm %r4, %r4, 0, 8, 31 /* Current offset from kernel load address */ 226fdd28cb8SRafal Jaworowski rlwinm %r3, %r3, 0, 0, 19 227fdd28cb8SRafal Jaworowski add %r4, %r4, %r3 /* Convert to kernel virtual address */ 228*d071aa6dSJustin Hibbits addi %r4, %r4, (5f - 4b) 229fdd28cb8SRafal Jaworowski li %r3, PSL_DE /* Note AS=0 */ 230fdd28cb8SRafal Jaworowski mtspr SPR_SRR0, %r4 231fdd28cb8SRafal Jaworowski mtspr SPR_SRR1, %r3 2326b7ba544SRafal Jaworowski rfi 2336b7ba544SRafal Jaworowski 2346b7ba544SRafal Jaworowski/* 2356b7ba544SRafal Jaworowski * Invalidate temp mapping 2366b7ba544SRafal Jaworowski */ 237*d071aa6dSJustin Hibbits5: 238ebf84cecSMarcel Moolenaar mr %r3, %r28 2396b7ba544SRafal Jaworowski bl tlb1_inval_entry 2406b7ba544SRafal Jaworowski 2412b5bf115SMarcel Moolenaardone_mapping: 242fdd28cb8SRafal Jaworowski 243fdd28cb8SRafal Jaworowski/* 2446b7ba544SRafal Jaworowski * Setup a temporary stack 2456b7ba544SRafal Jaworowski */ 2465c845fdeSNathan Whitehorn bl 1f 2475c845fdeSNathan Whitehorn .long tmpstack-. 2485c845fdeSNathan Whitehorn1: mflr %r1 2495c845fdeSNathan Whitehorn lwz %r2,0(%r1) 2505c845fdeSNathan Whitehorn add %r1,%r1,%r2 251bb808254SNathan Whitehorn addi %r1, %r1, (TMPSTACKSZ - 16) 2526b7ba544SRafal Jaworowski 2536b7ba544SRafal Jaworowski/* 2545c845fdeSNathan Whitehorn * Relocate kernel 2555c845fdeSNathan Whitehorn */ 2565c845fdeSNathan Whitehorn bl 1f 2575c845fdeSNathan Whitehorn .long _DYNAMIC-. 2585c845fdeSNathan Whitehorn .long _GLOBAL_OFFSET_TABLE_-. 2595c845fdeSNathan Whitehorn1: mflr %r5 2605c845fdeSNathan Whitehorn lwz %r3,0(%r5) /* _DYNAMIC in %r3 */ 2615c845fdeSNathan Whitehorn add %r3,%r3,%r5 2625c845fdeSNathan Whitehorn lwz %r4,4(%r5) /* GOT pointer */ 2635c845fdeSNathan Whitehorn add %r4,%r4,%r5 2645c845fdeSNathan Whitehorn lwz %r4,4(%r4) /* got[0] is _DYNAMIC link addr */ 2655c845fdeSNathan Whitehorn subf %r4,%r4,%r3 /* subtract to calculate relocbase */ 2665c845fdeSNathan Whitehorn bl elf_reloc_self 2675c845fdeSNathan Whitehorn 2685c845fdeSNathan Whitehorn/* 269f01415c3SRafal Jaworowski * Initialise exception vector offsets 2706b7ba544SRafal Jaworowski */ 2716b7ba544SRafal Jaworowski bl ivor_setup 2726b7ba544SRafal Jaworowski 2736b7ba544SRafal Jaworowski/* 274fdd28cb8SRafal Jaworowski * Set up arguments and jump to system initialization code 2756b7ba544SRafal Jaworowski */ 276ebf84cecSMarcel Moolenaar mr %r3, %r30 277ebf84cecSMarcel Moolenaar mr %r4, %r31 2786b7ba544SRafal Jaworowski 27917f4cae4SRafal Jaworowski /* Prepare core */ 280ebf84cecSMarcel Moolenaar bl booke_init 281959aea56SRafal Jaworowski 282fdd28cb8SRafal Jaworowski /* Switch to thread0.td_kstack now */ 283959aea56SRafal Jaworowski mr %r1, %r3 284959aea56SRafal Jaworowski li %r3, 0 285959aea56SRafal Jaworowski stw %r3, 0(%r1) 286959aea56SRafal Jaworowski 287fdd28cb8SRafal Jaworowski /* Machine independet part, does not return */ 288fdd28cb8SRafal Jaworowski bl mi_startup 289fdd28cb8SRafal Jaworowski /* NOT REACHED */ 290fdd28cb8SRafal Jaworowski5: b 5b 2916b7ba544SRafal Jaworowski 29228bb01e5SRafal Jaworowski 29328bb01e5SRafal Jaworowski#ifdef SMP 29428bb01e5SRafal Jaworowski/************************************************************************/ 29528bb01e5SRafal Jaworowski/* AP Boot page */ 29628bb01e5SRafal Jaworowski/************************************************************************/ 29728bb01e5SRafal Jaworowski .text 29828bb01e5SRafal Jaworowski .globl __boot_page 29928bb01e5SRafal Jaworowski .align 12 30028bb01e5SRafal Jaworowski__boot_page: 30128bb01e5SRafal Jaworowski bl 1f 30228bb01e5SRafal Jaworowski 303f60708c9SJustin Hibbits .globl bp_trace 304f60708c9SJustin Hibbitsbp_trace: 305a45d9127SMarcel Moolenaar .long 0 306a45d9127SMarcel Moolenaar 307f60708c9SJustin Hibbits .globl bp_kernload 308f60708c9SJustin Hibbitsbp_kernload: 309f60708c9SJustin Hibbits .long 0 31028bb01e5SRafal Jaworowski 31128bb01e5SRafal Jaworowski/* 31228bb01e5SRafal Jaworowski * Initial configuration 31328bb01e5SRafal Jaworowski */ 314f60708c9SJustin Hibbits1: 315f60708c9SJustin Hibbits mflr %r31 /* r31 hold the address of bp_trace */ 316a45d9127SMarcel Moolenaar 31728bb01e5SRafal Jaworowski /* Set HIDs */ 3187f7fcf55SJustin Hibbits mfpvr %r3 3197f7fcf55SJustin Hibbits rlwinm %r3, %r3, 16, 16, 31 3207f7fcf55SJustin Hibbits 3217f7fcf55SJustin Hibbits /* HID0 for E500 is default */ 3227f7fcf55SJustin Hibbits lis %r4, HID0_E500_DEFAULT_SET@h 3237f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E500_DEFAULT_SET@l 3247f7fcf55SJustin Hibbits 3257f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E500mc 3267f7fcf55SJustin Hibbits bne 2f 3277f7fcf55SJustin Hibbits lis %r4, HID0_E500MC_DEFAULT_SET@h 3287f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E500MC_DEFAULT_SET@l 3297f7fcf55SJustin Hibbits b 3f 3307f7fcf55SJustin Hibbits2: 3317f7fcf55SJustin Hibbits cmpli 0, 0, %r3, FSL_E5500 3327f7fcf55SJustin Hibbits bne 3f 3337f7fcf55SJustin Hibbits lis %r4, HID0_E5500_DEFAULT_SET@h 3347f7fcf55SJustin Hibbits ori %r4, %r4, HID0_E5500_DEFAULT_SET@l 3357f7fcf55SJustin Hibbits3: 3367f7fcf55SJustin Hibbits mtspr SPR_HID0, %r4 33728bb01e5SRafal Jaworowski isync 3387f7fcf55SJustin Hibbits 33928bb01e5SRafal Jaworowski /* Enable branch prediction */ 34028bb01e5SRafal Jaworowski li %r3, BUCSR_BPEN 34128bb01e5SRafal Jaworowski mtspr SPR_BUCSR, %r3 34228bb01e5SRafal Jaworowski isync 34328bb01e5SRafal Jaworowski 34428bb01e5SRafal Jaworowski /* Invalidate all entries in TLB0 */ 34528bb01e5SRafal Jaworowski li %r3, 0 34628bb01e5SRafal Jaworowski bl tlb_inval_all 34728bb01e5SRafal Jaworowski 34828bb01e5SRafal Jaworowski/* 34928bb01e5SRafal Jaworowski * Find TLB1 entry which is translating us now 35028bb01e5SRafal Jaworowski */ 35128bb01e5SRafal Jaworowski bl 2f 35228bb01e5SRafal Jaworowski2: mflr %r3 353ebf84cecSMarcel Moolenaar bl tlb1_find_current /* the entry number found is in r29 */ 35428bb01e5SRafal Jaworowski 35528bb01e5SRafal Jaworowski bl tlb1_inval_all_but_current 3564a49da83SMarcel Moolenaar 35728bb01e5SRafal Jaworowski/* 35828bb01e5SRafal Jaworowski * Create temporary translation in AS=1 and switch to it 35928bb01e5SRafal Jaworowski */ 360f60708c9SJustin Hibbits 36128bb01e5SRafal Jaworowski bl tlb1_temp_mapping_as1 36228bb01e5SRafal Jaworowski 36328bb01e5SRafal Jaworowski mfmsr %r3 36428bb01e5SRafal Jaworowski ori %r3, %r3, (PSL_IS | PSL_DS) 36528bb01e5SRafal Jaworowski bl 3f 36628bb01e5SRafal Jaworowski3: mflr %r4 367*d071aa6dSJustin Hibbits addi %r4, %r4, (4f - 3b) 36828bb01e5SRafal Jaworowski mtspr SPR_SRR0, %r4 36928bb01e5SRafal Jaworowski mtspr SPR_SRR1, %r3 37028bb01e5SRafal Jaworowski rfi /* Switch context */ 37128bb01e5SRafal Jaworowski 37228bb01e5SRafal Jaworowski/* 37328bb01e5SRafal Jaworowski * Invalidate initial entry 37428bb01e5SRafal Jaworowski */ 375*d071aa6dSJustin Hibbits4: 376ebf84cecSMarcel Moolenaar mr %r3, %r29 37728bb01e5SRafal Jaworowski bl tlb1_inval_entry 37828bb01e5SRafal Jaworowski 37928bb01e5SRafal Jaworowski/* 38028bb01e5SRafal Jaworowski * Setup final mapping in TLB1[1] and switch to it 38128bb01e5SRafal Jaworowski */ 382f60708c9SJustin Hibbits /* Final kernel mapping, map in 64 MB of RAM */ 383f60708c9SJustin Hibbits lis %r3, MAS0_TLBSEL1@h /* Select TLB1 */ 384f60708c9SJustin Hibbits li %r4, 0 /* Entry 0 */ 385f60708c9SJustin Hibbits rlwimi %r3, %r4, 16, 4, 15 38628bb01e5SRafal Jaworowski mtspr SPR_MAS0, %r3 38728bb01e5SRafal Jaworowski isync 388f60708c9SJustin Hibbits 389f60708c9SJustin Hibbits li %r3, (TLB_SIZE_64M << MAS1_TSIZE_SHIFT)@l 390f60708c9SJustin Hibbits oris %r3, %r3, (MAS1_VALID | MAS1_IPROT)@h 391f60708c9SJustin Hibbits mtspr SPR_MAS1, %r3 /* note TS was not filled, so it's TS=0 */ 39228bb01e5SRafal Jaworowski isync 393f60708c9SJustin Hibbits 394f60708c9SJustin Hibbits lis %r3, KERNBASE@h 395f60708c9SJustin Hibbits ori %r3, %r3, KERNBASE@l /* EPN = KERNBASE */ 396f60708c9SJustin Hibbits ori %r3, %r3, (_TLB_ENTRY_SHARED | MAS2_M)@l /* WIMGE = 0b00100 */ 39728bb01e5SRafal Jaworowski mtspr SPR_MAS2, %r3 39828bb01e5SRafal Jaworowski isync 399f60708c9SJustin Hibbits 400f60708c9SJustin Hibbits /* Retrieve kernel load [physical] address from bp_kernload */ 401*d071aa6dSJustin Hibbits bl 5f 402f60708c9SJustin Hibbits .long bp_kernload 403f60708c9SJustin Hibbits .long __boot_page 404*d071aa6dSJustin Hibbits5: mflr %r3 405f60708c9SJustin Hibbits lwz %r4, 0(%r3) 406f60708c9SJustin Hibbits lwz %r5, 4(%r3) 407f60708c9SJustin Hibbits rlwinm %r3, %r3, 0, 0, 19 408f60708c9SJustin Hibbits sub %r4, %r4, %r5 /* offset of bp_kernload within __boot_page */ 409f60708c9SJustin Hibbits lwzx %r3, %r4, %r3 410f60708c9SJustin Hibbits 411f60708c9SJustin Hibbits /* Set RPN and protection */ 412f60708c9SJustin Hibbits ori %r3, %r3, (MAS3_SX | MAS3_SW | MAS3_SR)@l 41328bb01e5SRafal Jaworowski mtspr SPR_MAS3, %r3 41428bb01e5SRafal Jaworowski isync 41528bb01e5SRafal Jaworowski tlbwe 41628bb01e5SRafal Jaworowski isync 41728bb01e5SRafal Jaworowski msync 41828bb01e5SRafal Jaworowski 41928bb01e5SRafal Jaworowski /* Switch to the final mapping */ 420*d071aa6dSJustin Hibbits bl 6f 421*d071aa6dSJustin Hibbits6: mflr %r3 42228bb01e5SRafal Jaworowski rlwinm %r3, %r3, 0, 0xfff /* Offset from boot page start */ 42328bb01e5SRafal Jaworowski add %r3, %r3, %r5 /* Make this virtual address */ 424*d071aa6dSJustin Hibbits addi %r3, %r3, (7f - 6b) 42528bb01e5SRafal Jaworowski li %r4, 0 /* Note AS=0 */ 42628bb01e5SRafal Jaworowski mtspr SPR_SRR0, %r3 42728bb01e5SRafal Jaworowski mtspr SPR_SRR1, %r4 42828bb01e5SRafal Jaworowski rfi 429*d071aa6dSJustin Hibbits7: 43028bb01e5SRafal Jaworowski 43128bb01e5SRafal Jaworowski/* 43228bb01e5SRafal Jaworowski * At this point we're running at virtual addresses KERNBASE and beyond so 43328bb01e5SRafal Jaworowski * it's allowed to directly access all locations the kernel was linked 43428bb01e5SRafal Jaworowski * against. 43528bb01e5SRafal Jaworowski */ 43628bb01e5SRafal Jaworowski 43728bb01e5SRafal Jaworowski/* 43828bb01e5SRafal Jaworowski * Invalidate temp mapping 43928bb01e5SRafal Jaworowski */ 440ebf84cecSMarcel Moolenaar mr %r3, %r28 44128bb01e5SRafal Jaworowski bl tlb1_inval_entry 44228bb01e5SRafal Jaworowski 44328bb01e5SRafal Jaworowski/* 44428bb01e5SRafal Jaworowski * Setup a temporary stack 44528bb01e5SRafal Jaworowski */ 4465c845fdeSNathan Whitehorn bl 1f 4475c845fdeSNathan Whitehorn .long tmpstack-. 4485c845fdeSNathan Whitehorn1: mflr %r1 4495c845fdeSNathan Whitehorn lwz %r2,0(%r1) 4505c845fdeSNathan Whitehorn add %r1,%r1,%r2 451f60708c9SJustin Hibbits stw %r1, 0(%r1) 452bb808254SNathan Whitehorn addi %r1, %r1, (TMPSTACKSZ - 16) 45328bb01e5SRafal Jaworowski 45428bb01e5SRafal Jaworowski/* 45528bb01e5SRafal Jaworowski * Initialise exception vector offsets 45628bb01e5SRafal Jaworowski */ 45728bb01e5SRafal Jaworowski bl ivor_setup 45828bb01e5SRafal Jaworowski 45928bb01e5SRafal Jaworowski /* 46028bb01e5SRafal Jaworowski * Assign our pcpu instance 46128bb01e5SRafal Jaworowski */ 4625c845fdeSNathan Whitehorn bl 1f 4635c845fdeSNathan Whitehorn .long ap_pcpu-. 4645c845fdeSNathan Whitehorn1: mflr %r4 4655c845fdeSNathan Whitehorn lwz %r3, 0(%r4) 4665c845fdeSNathan Whitehorn add %r3, %r3, %r4 46728bb01e5SRafal Jaworowski lwz %r3, 0(%r3) 46828bb01e5SRafal Jaworowski mtsprg0 %r3 46928bb01e5SRafal Jaworowski 47028bb01e5SRafal Jaworowski bl pmap_bootstrap_ap 47128bb01e5SRafal Jaworowski 47228bb01e5SRafal Jaworowski bl cpudep_ap_bootstrap 47328bb01e5SRafal Jaworowski /* Switch to the idle thread's kstack */ 47428bb01e5SRafal Jaworowski mr %r1, %r3 47528bb01e5SRafal Jaworowski 47628bb01e5SRafal Jaworowski bl machdep_ap_bootstrap 47728bb01e5SRafal Jaworowski 47828bb01e5SRafal Jaworowski /* NOT REACHED */ 47928bb01e5SRafal Jaworowski6: b 6b 48028bb01e5SRafal Jaworowski#endif /* SMP */ 48128bb01e5SRafal Jaworowski 482f60708c9SJustin Hibbits#if defined (BOOKE_E500) 483fdd28cb8SRafal Jaworowski/* 484fdd28cb8SRafal Jaworowski * Invalidate all entries in the given TLB. 485fdd28cb8SRafal Jaworowski * 486fdd28cb8SRafal Jaworowski * r3 TLBSEL 487fdd28cb8SRafal Jaworowski */ 488fdd28cb8SRafal Jaworowskitlb_inval_all: 4897f7fcf55SJustin Hibbits rlwinm %r3, %r3, 3, (1 << 3) /* TLBSEL */ 4907f7fcf55SJustin Hibbits ori %r3, %r3, (1 << 2) /* INVALL */ 491fdd28cb8SRafal Jaworowski tlbivax 0, %r3 4926b7ba544SRafal Jaworowski isync 493fdd28cb8SRafal Jaworowski msync 4946b7ba544SRafal Jaworowski 495fdd28cb8SRafal Jaworowski tlbsync 496fdd28cb8SRafal Jaworowski msync 497fdd28cb8SRafal Jaworowski blr 498fdd28cb8SRafal Jaworowski 499fdd28cb8SRafal Jaworowski/* 500ebf84cecSMarcel Moolenaar * expects address to look up in r3, returns entry number in r29 501fdd28cb8SRafal Jaworowski * 502fdd28cb8SRafal Jaworowski * FIXME: the hidden assumption is we are now running in AS=0, but we should 503fdd28cb8SRafal Jaworowski * retrieve actual AS from MSR[IS|DS] and put it in MAS6[SAS] 504fdd28cb8SRafal Jaworowski */ 505fdd28cb8SRafal Jaworowskitlb1_find_current: 506fdd28cb8SRafal Jaworowski mfspr %r17, SPR_PID0 507fdd28cb8SRafal Jaworowski slwi %r17, %r17, MAS6_SPID0_SHIFT 508fdd28cb8SRafal Jaworowski mtspr SPR_MAS6, %r17 509fdd28cb8SRafal Jaworowski isync 510fdd28cb8SRafal Jaworowski tlbsx 0, %r3 511fdd28cb8SRafal Jaworowski mfspr %r17, SPR_MAS0 512f60708c9SJustin Hibbits rlwinm %r29, %r17, 16, 26, 31 /* MAS0[ESEL] -> r29 */ 513fdd28cb8SRafal Jaworowski 514fdd28cb8SRafal Jaworowski /* Make sure we have IPROT set on the entry */ 515fdd28cb8SRafal Jaworowski mfspr %r17, SPR_MAS1 516fdd28cb8SRafal Jaworowski oris %r17, %r17, MAS1_IPROT@h 517fdd28cb8SRafal Jaworowski mtspr SPR_MAS1, %r17 5186b7ba544SRafal Jaworowski isync 5196b7ba544SRafal Jaworowski tlbwe 5206b7ba544SRafal Jaworowski isync 5216b7ba544SRafal Jaworowski msync 5226b7ba544SRafal Jaworowski blr 5236b7ba544SRafal Jaworowski 524fdd28cb8SRafal Jaworowski/* 525fdd28cb8SRafal Jaworowski * Invalidates a single entry in TLB1. 526fdd28cb8SRafal Jaworowski * 527fdd28cb8SRafal Jaworowski * r3 ESEL 528fdd28cb8SRafal Jaworowski * r4-r5 scratched 529fdd28cb8SRafal Jaworowski */ 530fdd28cb8SRafal Jaworowskitlb1_inval_entry: 531fdd28cb8SRafal Jaworowski lis %r4, MAS0_TLBSEL1@h /* Select TLB1 */ 5327f7fcf55SJustin Hibbits rlwimi %r4, %r3, 16, 10, 15 /* Select our entry */ 533fdd28cb8SRafal Jaworowski mtspr SPR_MAS0, %r4 534fdd28cb8SRafal Jaworowski isync 535fdd28cb8SRafal Jaworowski tlbre 536fdd28cb8SRafal Jaworowski li %r5, 0 /* MAS1[V] = 0 */ 537fdd28cb8SRafal Jaworowski mtspr SPR_MAS1, %r5 538fdd28cb8SRafal Jaworowski isync 539fdd28cb8SRafal Jaworowski tlbwe 540fdd28cb8SRafal Jaworowski isync 541fdd28cb8SRafal Jaworowski msync 542fdd28cb8SRafal Jaworowski blr 543fdd28cb8SRafal Jaworowski 544fdd28cb8SRafal Jaworowski/* 545f60708c9SJustin Hibbits * r29 current entry number 546f60708c9SJustin Hibbits * r28 returned temp entry 547f60708c9SJustin Hibbits * r3-r5 scratched 548fdd28cb8SRafal Jaworowski */ 549fdd28cb8SRafal Jaworowskitlb1_temp_mapping_as1: 550fdd28cb8SRafal Jaworowski /* Read our current translation */ 551fdd28cb8SRafal Jaworowski lis %r3, MAS0_TLBSEL1@h /* Select TLB1 */ 5527f7fcf55SJustin Hibbits rlwimi %r3, %r29, 16, 10, 15 /* Select our current entry */ 553fdd28cb8SRafal Jaworowski mtspr SPR_MAS0, %r3 554fdd28cb8SRafal Jaworowski isync 555fdd28cb8SRafal Jaworowski tlbre 556fdd28cb8SRafal Jaworowski 557f60708c9SJustin Hibbits /* 558f60708c9SJustin Hibbits * Prepare and write temp entry 559f60708c9SJustin Hibbits * 560f60708c9SJustin Hibbits * FIXME this is not robust against overflow i.e. when the current 561f60708c9SJustin Hibbits * entry is the last in TLB1 562f60708c9SJustin Hibbits */ 563fdd28cb8SRafal Jaworowski lis %r3, MAS0_TLBSEL1@h /* Select TLB1 */ 564f60708c9SJustin Hibbits addi %r28, %r29, 1 /* Use next entry. */ 5657f7fcf55SJustin Hibbits rlwimi %r3, %r28, 16, 10, 15 /* Select temp entry */ 566fdd28cb8SRafal Jaworowski mtspr SPR_MAS0, %r3 567fdd28cb8SRafal Jaworowski isync 568fdd28cb8SRafal Jaworowski mfspr %r5, SPR_MAS1 569fdd28cb8SRafal Jaworowski li %r4, 1 /* AS=1 */ 570fdd28cb8SRafal Jaworowski rlwimi %r5, %r4, 12, 19, 19 571fdd28cb8SRafal Jaworowski li %r4, 0 /* Global mapping, TID=0 */ 572fdd28cb8SRafal Jaworowski rlwimi %r5, %r4, 16, 8, 15 573fdd28cb8SRafal Jaworowski oris %r5, %r5, (MAS1_VALID | MAS1_IPROT)@h 574fdd28cb8SRafal Jaworowski mtspr SPR_MAS1, %r5 575fdd28cb8SRafal Jaworowski isync 5767f7fcf55SJustin Hibbits mflr %r3 5777f7fcf55SJustin Hibbits bl zero_mas7 5787f7fcf55SJustin Hibbits bl zero_mas8 5797f7fcf55SJustin Hibbits mtlr %r3 580fdd28cb8SRafal Jaworowski tlbwe 581fdd28cb8SRafal Jaworowski isync 582fdd28cb8SRafal Jaworowski msync 583fdd28cb8SRafal Jaworowski blr 584fdd28cb8SRafal Jaworowski 585fdd28cb8SRafal Jaworowski/* 586fdd28cb8SRafal Jaworowski * Loops over TLB1, invalidates all entries skipping the one which currently 587fdd28cb8SRafal Jaworowski * maps this code. 588fdd28cb8SRafal Jaworowski * 589ebf84cecSMarcel Moolenaar * r29 current entry 590fdd28cb8SRafal Jaworowski * r3-r5 scratched 591fdd28cb8SRafal Jaworowski */ 592fdd28cb8SRafal Jaworowskitlb1_inval_all_but_current: 593fdd28cb8SRafal Jaworowski mr %r6, %r3 594fdd28cb8SRafal Jaworowski mfspr %r3, SPR_TLB1CFG /* Get number of entries */ 595fdd28cb8SRafal Jaworowski andi. %r3, %r3, TLBCFG_NENTRY_MASK@l 596fdd28cb8SRafal Jaworowski li %r4, 0 /* Start from Entry 0 */ 597fdd28cb8SRafal Jaworowski1: lis %r5, MAS0_TLBSEL1@h 5987f7fcf55SJustin Hibbits rlwimi %r5, %r4, 16, 10, 15 599fdd28cb8SRafal Jaworowski mtspr SPR_MAS0, %r5 600fdd28cb8SRafal Jaworowski isync 601fdd28cb8SRafal Jaworowski tlbre 602fdd28cb8SRafal Jaworowski mfspr %r5, SPR_MAS1 603ebf84cecSMarcel Moolenaar cmpw %r4, %r29 /* our current entry? */ 604fdd28cb8SRafal Jaworowski beq 2f 605fdd28cb8SRafal Jaworowski rlwinm %r5, %r5, 0, 2, 31 /* clear VALID and IPROT bits */ 606fdd28cb8SRafal Jaworowski mtspr SPR_MAS1, %r5 607fdd28cb8SRafal Jaworowski isync 608fdd28cb8SRafal Jaworowski tlbwe 609fdd28cb8SRafal Jaworowski isync 610fdd28cb8SRafal Jaworowski msync 611fdd28cb8SRafal Jaworowski2: addi %r4, %r4, 1 612fdd28cb8SRafal Jaworowski cmpw %r4, %r3 /* Check if this is the last entry */ 613fdd28cb8SRafal Jaworowski bne 1b 614fdd28cb8SRafal Jaworowski blr 615fdd28cb8SRafal Jaworowski 6167f7fcf55SJustin Hibbits/* 6177f7fcf55SJustin Hibbits * MAS7 and MAS8 conditional zeroing. 6187f7fcf55SJustin Hibbits */ 6197f7fcf55SJustin Hibbits.globl zero_mas7 6207f7fcf55SJustin Hibbitszero_mas7: 6217f7fcf55SJustin Hibbits mfpvr %r20 6227f7fcf55SJustin Hibbits rlwinm %r20, %r20, 16, 16, 31 6237f7fcf55SJustin Hibbits cmpli 0, 0, %r20, FSL_E500v1 6247f7fcf55SJustin Hibbits beq 1f 6257f7fcf55SJustin Hibbits 6267f7fcf55SJustin Hibbits li %r20, 0 6277f7fcf55SJustin Hibbits mtspr SPR_MAS7, %r20 6287f7fcf55SJustin Hibbits isync 6297f7fcf55SJustin Hibbits1: 6307f7fcf55SJustin Hibbits blr 6317f7fcf55SJustin Hibbits 6327f7fcf55SJustin Hibbits.globl zero_mas8 6337f7fcf55SJustin Hibbitszero_mas8: 6347f7fcf55SJustin Hibbits mfpvr %r20 6357f7fcf55SJustin Hibbits rlwinm %r20, %r20, 16, 16, 31 6367f7fcf55SJustin Hibbits cmpli 0, 0, %r20, FSL_E500mc 6377f7fcf55SJustin Hibbits beq 1f 6387f7fcf55SJustin Hibbits cmpli 0, 0, %r20, FSL_E5500 6397f7fcf55SJustin Hibbits beq 1f 6407f7fcf55SJustin Hibbits 6417f7fcf55SJustin Hibbits blr 6427f7fcf55SJustin Hibbits1: 6437f7fcf55SJustin Hibbits li %r20, 0 6447f7fcf55SJustin Hibbits mtspr SPR_MAS8, %r20 6457f7fcf55SJustin Hibbits isync 6467f7fcf55SJustin Hibbits blr 647f60708c9SJustin Hibbits#endif 6487f7fcf55SJustin Hibbits 64928bb01e5SRafal Jaworowski#ifdef SMP 650f60708c9SJustin Hibbits.globl __boot_tlb1 651f60708c9SJustin Hibbits /* 652f60708c9SJustin Hibbits * The __boot_tlb1 table is used to hold BSP TLB1 entries 653f60708c9SJustin Hibbits * marked with _TLB_ENTRY_SHARED flag during AP bootstrap. 654f60708c9SJustin Hibbits * The BSP fills in the table in tlb_ap_prep() function. Next, 655f60708c9SJustin Hibbits * AP loads its contents to TLB1 hardware in pmap_bootstrap_ap(). 656f60708c9SJustin Hibbits */ 657f60708c9SJustin Hibbits__boot_tlb1: 658f60708c9SJustin Hibbits .space TLB1_MAX_ENTRIES * TLB_ENTRY_SIZE 659f60708c9SJustin Hibbits 66028bb01e5SRafal Jaworowski__boot_page_padding: 66128bb01e5SRafal Jaworowski /* 66228bb01e5SRafal Jaworowski * Boot page needs to be exactly 4K, with the last word of this page 66328bb01e5SRafal Jaworowski * acting as the reset vector, so we need to stuff the remainder. 66428bb01e5SRafal Jaworowski * Upon release from holdoff CPU fetches the last word of the boot 66528bb01e5SRafal Jaworowski * page. 66628bb01e5SRafal Jaworowski */ 66728bb01e5SRafal Jaworowski .space 4092 - (__boot_page_padding - __boot_page) 66828bb01e5SRafal Jaworowski b __boot_page 66928bb01e5SRafal Jaworowski#endif /* SMP */ 67028bb01e5SRafal Jaworowski 671fdd28cb8SRafal Jaworowski/************************************************************************/ 672fdd28cb8SRafal Jaworowski/* locore subroutines */ 673fdd28cb8SRafal Jaworowski/************************************************************************/ 674fdd28cb8SRafal Jaworowski 6756b7ba544SRafal Jaworowski/* 6766b7ba544SRafal Jaworowski * Cache disable/enable/inval sequences according 6776b7ba544SRafal Jaworowski * to section 2.16 of E500CORE RM. 6786b7ba544SRafal Jaworowski */ 6796b7ba544SRafal JaworowskiENTRY(dcache_inval) 6806b7ba544SRafal Jaworowski /* Invalidate d-cache */ 6816b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR0 6826b7ba544SRafal Jaworowski ori %r3, %r3, (L1CSR0_DCFI | L1CSR0_DCLFR)@l 6836b7ba544SRafal Jaworowski msync 6846b7ba544SRafal Jaworowski isync 6856b7ba544SRafal Jaworowski mtspr SPR_L1CSR0, %r3 6866b7ba544SRafal Jaworowski isync 687ece0de20SRafal Jaworowski1: mfspr %r3, SPR_L1CSR0 688ece0de20SRafal Jaworowski andi. %r3, %r3, L1CSR0_DCFI 689ece0de20SRafal Jaworowski bne 1b 6906b7ba544SRafal Jaworowski blr 6916b7ba544SRafal Jaworowski 6926b7ba544SRafal JaworowskiENTRY(dcache_disable) 6936b7ba544SRafal Jaworowski /* Disable d-cache */ 6946b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR0 6956b7ba544SRafal Jaworowski li %r4, L1CSR0_DCE@l 6966b7ba544SRafal Jaworowski not %r4, %r4 6976b7ba544SRafal Jaworowski and %r3, %r3, %r4 6986b7ba544SRafal Jaworowski msync 6996b7ba544SRafal Jaworowski isync 7006b7ba544SRafal Jaworowski mtspr SPR_L1CSR0, %r3 7016b7ba544SRafal Jaworowski isync 7026b7ba544SRafal Jaworowski blr 7036b7ba544SRafal Jaworowski 7046b7ba544SRafal JaworowskiENTRY(dcache_enable) 7056b7ba544SRafal Jaworowski /* Enable d-cache */ 7066b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR0 7076b7ba544SRafal Jaworowski oris %r3, %r3, (L1CSR0_DCPE | L1CSR0_DCE)@h 7086b7ba544SRafal Jaworowski ori %r3, %r3, (L1CSR0_DCPE | L1CSR0_DCE)@l 7096b7ba544SRafal Jaworowski msync 7106b7ba544SRafal Jaworowski isync 7116b7ba544SRafal Jaworowski mtspr SPR_L1CSR0, %r3 7126b7ba544SRafal Jaworowski isync 7136b7ba544SRafal Jaworowski blr 7146b7ba544SRafal Jaworowski 7156b7ba544SRafal JaworowskiENTRY(icache_inval) 7166b7ba544SRafal Jaworowski /* Invalidate i-cache */ 7176b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR1 7186b7ba544SRafal Jaworowski ori %r3, %r3, (L1CSR1_ICFI | L1CSR1_ICLFR)@l 7196b7ba544SRafal Jaworowski isync 7206b7ba544SRafal Jaworowski mtspr SPR_L1CSR1, %r3 7216b7ba544SRafal Jaworowski isync 722ece0de20SRafal Jaworowski1: mfspr %r3, SPR_L1CSR1 723ece0de20SRafal Jaworowski andi. %r3, %r3, L1CSR1_ICFI 724ece0de20SRafal Jaworowski bne 1b 7256b7ba544SRafal Jaworowski blr 7266b7ba544SRafal Jaworowski 7276b7ba544SRafal JaworowskiENTRY(icache_disable) 7286b7ba544SRafal Jaworowski /* Disable i-cache */ 7296b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR1 7306b7ba544SRafal Jaworowski li %r4, L1CSR1_ICE@l 7316b7ba544SRafal Jaworowski not %r4, %r4 7326b7ba544SRafal Jaworowski and %r3, %r3, %r4 7336b7ba544SRafal Jaworowski isync 7346b7ba544SRafal Jaworowski mtspr SPR_L1CSR1, %r3 7356b7ba544SRafal Jaworowski isync 7366b7ba544SRafal Jaworowski blr 7376b7ba544SRafal Jaworowski 7386b7ba544SRafal JaworowskiENTRY(icache_enable) 7396b7ba544SRafal Jaworowski /* Enable i-cache */ 7406b7ba544SRafal Jaworowski mfspr %r3, SPR_L1CSR1 7416b7ba544SRafal Jaworowski oris %r3, %r3, (L1CSR1_ICPE | L1CSR1_ICE)@h 7426b7ba544SRafal Jaworowski ori %r3, %r3, (L1CSR1_ICPE | L1CSR1_ICE)@l 7436b7ba544SRafal Jaworowski isync 7446b7ba544SRafal Jaworowski mtspr SPR_L1CSR1, %r3 7456b7ba544SRafal Jaworowski isync 7466b7ba544SRafal Jaworowski blr 7476b7ba544SRafal Jaworowski 7486b7ba544SRafal Jaworowski/* 7493f068cbfSJustin Hibbits * L2 cache disable/enable/inval sequences for E500mc. 7503f068cbfSJustin Hibbits */ 7513f068cbfSJustin Hibbits 7523f068cbfSJustin HibbitsENTRY(l2cache_inval) 7533f068cbfSJustin Hibbits mfspr %r3, SPR_L2CSR0 7543f068cbfSJustin Hibbits oris %r3, %r3, (L2CSR0_L2FI | L2CSR0_L2LFC)@h 7553f068cbfSJustin Hibbits ori %r3, %r3, (L2CSR0_L2FI | L2CSR0_L2LFC)@l 7563f068cbfSJustin Hibbits isync 7573f068cbfSJustin Hibbits mtspr SPR_L2CSR0, %r3 7583f068cbfSJustin Hibbits isync 7593f068cbfSJustin Hibbits1: mfspr %r3, SPR_L2CSR0 7603f068cbfSJustin Hibbits andis. %r3, %r3, L2CSR0_L2FI@h 7613f068cbfSJustin Hibbits bne 1b 7623f068cbfSJustin Hibbits blr 7633f068cbfSJustin Hibbits 7643f068cbfSJustin HibbitsENTRY(l2cache_enable) 7653f068cbfSJustin Hibbits mfspr %r3, SPR_L2CSR0 7663f068cbfSJustin Hibbits oris %r3, %r3, (L2CSR0_L2E | L2CSR0_L2PE)@h 7673f068cbfSJustin Hibbits isync 7683f068cbfSJustin Hibbits mtspr SPR_L2CSR0, %r3 7693f068cbfSJustin Hibbits isync 7703f068cbfSJustin Hibbits blr 7713f068cbfSJustin Hibbits 7723f068cbfSJustin Hibbits/* 7733f068cbfSJustin Hibbits * Branch predictor setup. 7743f068cbfSJustin Hibbits */ 7753f068cbfSJustin HibbitsENTRY(bpred_enable) 7763f068cbfSJustin Hibbits mfspr %r3, SPR_BUCSR 7773f068cbfSJustin Hibbits ori %r3, %r3, BUCSR_BBFI 7783f068cbfSJustin Hibbits isync 7793f068cbfSJustin Hibbits mtspr SPR_BUCSR, %r3 7803f068cbfSJustin Hibbits isync 7813f068cbfSJustin Hibbits ori %r3, %r3, BUCSR_BPEN 7823f068cbfSJustin Hibbits isync 7833f068cbfSJustin Hibbits mtspr SPR_BUCSR, %r3 7843f068cbfSJustin Hibbits isync 7853f068cbfSJustin Hibbits blr 7863f068cbfSJustin Hibbits 7873f068cbfSJustin HibbitsENTRY(dataloss_erratum_access) 7883f068cbfSJustin Hibbits /* Lock two cache lines into I-Cache */ 7893f068cbfSJustin Hibbits sync 7903f068cbfSJustin Hibbits mfspr %r11, SPR_L1CSR1 7913f068cbfSJustin Hibbits rlwinm %r11, %r11, 0, ~L1CSR1_ICUL 7923f068cbfSJustin Hibbits sync 7933f068cbfSJustin Hibbits isync 7943f068cbfSJustin Hibbits mtspr SPR_L1CSR1, %r11 7953f068cbfSJustin Hibbits isync 7963f068cbfSJustin Hibbits 797f60708c9SJustin Hibbits lis %r8, 2f@h 798f60708c9SJustin Hibbits ori %r8, %r8, 2f@l 7993f068cbfSJustin Hibbits icbtls 0, 0, %r8 8003f068cbfSJustin Hibbits addi %r9, %r8, 64 8013f068cbfSJustin Hibbits 8023f068cbfSJustin Hibbits sync 8033f068cbfSJustin Hibbits mfspr %r11, SPR_L1CSR1 8043f068cbfSJustin Hibbits3: andi. %r11, %r11, L1CSR1_ICUL 8053f068cbfSJustin Hibbits bne 3b 8063f068cbfSJustin Hibbits 8073f068cbfSJustin Hibbits icbtls 0, 0, %r9 8083f068cbfSJustin Hibbits 8093f068cbfSJustin Hibbits sync 8103f068cbfSJustin Hibbits mfspr %r11, SPR_L1CSR1 8113f068cbfSJustin Hibbits3: andi. %r11, %r11, L1CSR1_ICUL 8123f068cbfSJustin Hibbits bne 3b 8133f068cbfSJustin Hibbits 8143f068cbfSJustin Hibbits b 2f 8153f068cbfSJustin Hibbits .align 6 8163f068cbfSJustin Hibbits /* Inside a locked cacheline, wait a while, write, then wait a while */ 8173f068cbfSJustin Hibbits2: sync 8183f068cbfSJustin Hibbits 8193f068cbfSJustin Hibbits mfspr %r5, TBR_TBL 8203f068cbfSJustin Hibbits4: addis %r11, %r5, 0x100000@h /* wait around one million timebase ticks */ 8213f068cbfSJustin Hibbits mfspr %r5, TBR_TBL 8223f068cbfSJustin Hibbits subf. %r5, %r5, %r11 8233f068cbfSJustin Hibbits bgt 4b 8243f068cbfSJustin Hibbits 8253f068cbfSJustin Hibbits stw %r4, 0(%r3) 8263f068cbfSJustin Hibbits 8273f068cbfSJustin Hibbits mfspr %r5, TBR_TBL 8283f068cbfSJustin Hibbits4: addis %r11, %r5, 0x100000@h /* wait around one million timebase ticks */ 8293f068cbfSJustin Hibbits mfspr %r5, TBR_TBL 8303f068cbfSJustin Hibbits subf. %r5, %r5, %r11 8313f068cbfSJustin Hibbits bgt 4b 8323f068cbfSJustin Hibbits 8333f068cbfSJustin Hibbits sync 8343f068cbfSJustin Hibbits 8353f068cbfSJustin Hibbits /* 8363f068cbfSJustin Hibbits * Fill out the rest of this cache line and the next with nops, 8373f068cbfSJustin Hibbits * to ensure that nothing outside the locked area will be 8383f068cbfSJustin Hibbits * fetched due to a branch. 8393f068cbfSJustin Hibbits */ 8403f068cbfSJustin Hibbits .rept 19 8413f068cbfSJustin Hibbits nop 8423f068cbfSJustin Hibbits .endr 8433f068cbfSJustin Hibbits 8443f068cbfSJustin Hibbits icblc 0, 0, %r8 8453f068cbfSJustin Hibbits icblc 0, 0, %r9 8463f068cbfSJustin Hibbits 8473f068cbfSJustin Hibbits blr 8483f068cbfSJustin Hibbits 8496b7ba544SRafal Jaworowski/************************************************************************/ 8506b7ba544SRafal Jaworowski/* Data section */ 8516b7ba544SRafal Jaworowski/************************************************************************/ 8526b7ba544SRafal Jaworowski .data 8535c845fdeSNathan Whitehorn .align 3 8545c845fdeSNathan WhitehornGLOBAL(__startkernel) 8555c845fdeSNathan Whitehorn .long begin 8565c845fdeSNathan WhitehornGLOBAL(__endkernel) 8575c845fdeSNathan Whitehorn .long end 8586b7ba544SRafal Jaworowski .align 4 859959aea56SRafal Jaworowskitmpstack: 860959aea56SRafal Jaworowski .space TMPSTACKSZ 861bb808254SNathan Whitehorntmpstackbound: 862bb808254SNathan Whitehorn .space 10240 /* XXX: this really should not be necessary */ 8636b7ba544SRafal Jaworowski 8646b7ba544SRafal Jaworowski/* 8656b7ba544SRafal Jaworowski * Compiled KERNBASE locations 8666b7ba544SRafal Jaworowski */ 8676b7ba544SRafal Jaworowski .globl kernbase 8686b7ba544SRafal Jaworowski .set kernbase, KERNBASE 8696b7ba544SRafal Jaworowski 8706b7ba544SRafal Jaworowski#include <powerpc/booke/trap_subr.S> 871