/* * Copyright (C) Paul Mackerras 1997. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ .text /* * Use the BAT2 & 3 registers to map the 1st 16MB of RAM to * the address given as the 1st argument. */ .globl setup_bats setup_bats: mfpvr 5 rlwinm 5,5,16,16,31 /* r3 = 1 for 601, 4 for 604 */ cmpwi 0,5,1 li 0,0 bne 4f mtibatl 3,0 /* invalidate BAT first */ ori 3,3,4 /* set up BAT registers for 601 */ li 4,0x7f mtibatu 2,3 mtibatl 2,4 oris 3,3,0x80 oris 4,4,0x80 mtibatu 3,3 mtibatl 3,4 b 5f 4: mtdbatu 3,0 /* invalidate BATs first */ mtibatu 3,0 ori 3,3,0xff /* set up BAT registers for 604 */ li 4,2 mtdbatl 2,4 mtdbatu 2,3 mtibatl 2,4 mtibatu 2,3 oris 3,3,0x80 oris 4,4,0x80 mtdbatl 3,4 mtdbatu 3,3 mtibatl 3,4 mtibatu 3,3 5: sync isync blr /* * Flush the dcache and invalidate the icache for a range of addresses. * * flush_cache(addr, len) */ .global flush_cache flush_cache: addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */ rlwinm. 4,4,27,5,31 mtctr 4 beqlr 1: dcbf 0,3 icbi 0,3 addi 3,3,0x20 bdnz 1b sync isync blr