1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2*2da37761SChristophe Leroy#include <linux/linkage.h> 3*2da37761SChristophe Leroy 4ee983079SDomen Puncer#include <asm/reg.h> 5ee983079SDomen Puncer#include <asm/ppc_asm.h> 6ee983079SDomen Puncer#include <asm/processor.h> 7ee983079SDomen Puncer#include <asm/cache.h> 8ee983079SDomen Puncer 9ee983079SDomen Puncer 10ee983079SDomen Puncer#define SDRAM_CTRL 0x104 11ee983079SDomen Puncer#define SC_MODE_EN (1<<31) 12ee983079SDomen Puncer#define SC_CKE (1<<30) 13ee983079SDomen Puncer#define SC_REF_EN (1<<28) 14ee983079SDomen Puncer#define SC_SOFT_PRE (1<<1) 15ee983079SDomen Puncer 16ee983079SDomen Puncer#define GPIOW_GPIOE 0xc00 17ee983079SDomen Puncer#define GPIOW_DDR 0xc08 18ee983079SDomen Puncer#define GPIOW_DVO 0xc0c 19ee983079SDomen Puncer 20ee983079SDomen Puncer#define CDM_CE 0x214 21ee983079SDomen Puncer#define CDM_SDRAM (1<<3) 22ee983079SDomen Puncer 23ee983079SDomen Puncer 24ee983079SDomen Puncer/* helpers... beware: r10 and r4 are overwritten */ 25ee983079SDomen Puncer#define SAVE_SPRN(reg, addr) \ 26ee983079SDomen Puncer mfspr r10, SPRN_##reg; \ 27ee983079SDomen Puncer stw r10, ((addr)*4)(r4); 28ee983079SDomen Puncer 29ee983079SDomen Puncer#define LOAD_SPRN(reg, addr) \ 30ee983079SDomen Puncer lwz r10, ((addr)*4)(r4); \ 31ee983079SDomen Puncer mtspr SPRN_##reg, r10; \ 32ee983079SDomen Puncer sync; \ 33ee983079SDomen Puncer isync; 34ee983079SDomen Puncer 35ee983079SDomen Puncer 36ee983079SDomen Puncer .data 37ee983079SDomen Puncerregisters: 38ee983079SDomen Puncer .space 0x5c*4 39ee983079SDomen Puncer .text 40ee983079SDomen Puncer 41ee983079SDomen Puncer/* ---------------------------------------------------------------------- */ 42ee983079SDomen Puncer/* low-power mode with help of M68HLC908QT1 */ 43ee983079SDomen Puncer 44ee983079SDomen Puncer .globl lite5200_low_power 45ee983079SDomen Puncerlite5200_low_power: 46ee983079SDomen Puncer 47ee983079SDomen Puncer mr r7, r3 /* save SRAM va */ 48ee983079SDomen Puncer mr r8, r4 /* save MBAR va */ 49ee983079SDomen Puncer 50ee983079SDomen Puncer /* setup wakeup address for u-boot at physical location 0x0 */ 51ee983079SDomen Puncer lis r3, CONFIG_KERNEL_START@h 52ee983079SDomen Puncer lis r4, lite5200_wakeup@h 53ee983079SDomen Puncer ori r4, r4, lite5200_wakeup@l 54ee983079SDomen Puncer sub r4, r4, r3 55ee983079SDomen Puncer stw r4, 0(r3) 56ee983079SDomen Puncer 57ee983079SDomen Puncer 58ee983079SDomen Puncer /* 59ee983079SDomen Puncer * save stuff BDI overwrites 60ee983079SDomen Puncer * 0xf0 (0xe0->0x100 gets overwritten when BDI connected; 618cdcde5fSMichael Ellerman * even when CONFIG_BDI_SWITCH is disabled and MMU XLAT commented; heisenbug?)) 62ee983079SDomen Puncer * WARNING: self-refresh doesn't seem to work when BDI2000 is connected, 63ee983079SDomen Puncer * possibly because BDI sets SDRAM registers before wakeup code does 64ee983079SDomen Puncer */ 65ee983079SDomen Puncer lis r4, registers@h 66ee983079SDomen Puncer ori r4, r4, registers@l 67ee983079SDomen Puncer lwz r10, 0xf0(r3) 68ee983079SDomen Puncer stw r10, (0x1d*4)(r4) 69ee983079SDomen Puncer 70ee983079SDomen Puncer /* save registers to r4 [destroys r10] */ 71ee983079SDomen Puncer SAVE_SPRN(LR, 0x1c) 72ee983079SDomen Puncer bl save_regs 73ee983079SDomen Puncer 74ee983079SDomen Puncer /* flush caches [destroys r3, r4] */ 75ee983079SDomen Puncer bl flush_data_cache 76ee983079SDomen Puncer 77ee983079SDomen Puncer 78ee983079SDomen Puncer /* copy code to sram */ 79ee983079SDomen Puncer mr r4, r7 80ee983079SDomen Puncer li r3, (sram_code_end - sram_code)/4 81ee983079SDomen Puncer mtctr r3 82ee983079SDomen Puncer lis r3, sram_code@h 83ee983079SDomen Puncer ori r3, r3, sram_code@l 84ee983079SDomen Puncer1: 85ee983079SDomen Puncer lwz r5, 0(r3) 86ee983079SDomen Puncer stw r5, 0(r4) 87ee983079SDomen Puncer addi r3, r3, 4 88ee983079SDomen Puncer addi r4, r4, 4 89ee983079SDomen Puncer bdnz 1b 90ee983079SDomen Puncer 91ee983079SDomen Puncer /* get tb_ticks_per_usec */ 92ee983079SDomen Puncer lis r3, tb_ticks_per_usec@h 93ee983079SDomen Puncer lwz r11, tb_ticks_per_usec@l(r3) 94ee983079SDomen Puncer 95ee983079SDomen Puncer /* disable I and D caches */ 96ee983079SDomen Puncer mfspr r3, SPRN_HID0 97ee983079SDomen Puncer ori r3, r3, HID0_ICE | HID0_DCE 98ee983079SDomen Puncer xori r3, r3, HID0_ICE | HID0_DCE 99ee983079SDomen Puncer sync; isync; 100ee983079SDomen Puncer mtspr SPRN_HID0, r3 101ee983079SDomen Puncer sync; isync; 102ee983079SDomen Puncer 103ee983079SDomen Puncer /* jump to sram */ 104ee983079SDomen Puncer mtlr r7 105ee983079SDomen Puncer blrl 106ee983079SDomen Puncer /* doesn't return */ 107ee983079SDomen Puncer 108ee983079SDomen Puncer 109ee983079SDomen Puncersram_code: 110ee983079SDomen Puncer /* self refresh */ 111ee983079SDomen Puncer lwz r4, SDRAM_CTRL(r8) 112ee983079SDomen Puncer 113ee983079SDomen Puncer /* send NOP (precharge) */ 114ee983079SDomen Puncer oris r4, r4, SC_MODE_EN@h /* mode_en */ 115ee983079SDomen Puncer stw r4, SDRAM_CTRL(r8) 116ee983079SDomen Puncer sync 117ee983079SDomen Puncer 118ee983079SDomen Puncer ori r4, r4, SC_SOFT_PRE /* soft_pre */ 119ee983079SDomen Puncer stw r4, SDRAM_CTRL(r8) 120ee983079SDomen Puncer sync 121ee983079SDomen Puncer xori r4, r4, SC_SOFT_PRE 122ee983079SDomen Puncer 123ee983079SDomen Puncer xoris r4, r4, SC_MODE_EN@h /* !mode_en */ 124ee983079SDomen Puncer stw r4, SDRAM_CTRL(r8) 125ee983079SDomen Puncer sync 126ee983079SDomen Puncer 127ee983079SDomen Puncer /* delay (for NOP to finish) */ 128ee983079SDomen Puncer li r12, 1 129ee983079SDomen Puncer bl udelay 130ee983079SDomen Puncer 131ee983079SDomen Puncer /* 132ee983079SDomen Puncer * mode_en must not be set when enabling self-refresh 133ee983079SDomen Puncer * send AR with CKE low (self-refresh) 134ee983079SDomen Puncer */ 135ee983079SDomen Puncer oris r4, r4, (SC_REF_EN | SC_CKE)@h 136ee983079SDomen Puncer xoris r4, r4, (SC_CKE)@h /* ref_en !cke */ 137ee983079SDomen Puncer stw r4, SDRAM_CTRL(r8) 138ee983079SDomen Puncer sync 139ee983079SDomen Puncer 140ee983079SDomen Puncer /* delay (after !CKE there should be two cycles) */ 141ee983079SDomen Puncer li r12, 1 142ee983079SDomen Puncer bl udelay 143ee983079SDomen Puncer 144ee983079SDomen Puncer /* disable clock */ 145ee983079SDomen Puncer lwz r4, CDM_CE(r8) 146ee983079SDomen Puncer ori r4, r4, CDM_SDRAM 147ee983079SDomen Puncer xori r4, r4, CDM_SDRAM 148ee983079SDomen Puncer stw r4, CDM_CE(r8) 149ee983079SDomen Puncer sync 150ee983079SDomen Puncer 151ee983079SDomen Puncer /* delay a bit */ 152ee983079SDomen Puncer li r12, 1 153ee983079SDomen Puncer bl udelay 154ee983079SDomen Puncer 155ee983079SDomen Puncer 156ee983079SDomen Puncer /* turn off with QT chip */ 157ee983079SDomen Puncer li r4, 0x02 158ee983079SDomen Puncer stb r4, GPIOW_GPIOE(r8) /* enable gpio_wkup1 */ 159ee983079SDomen Puncer sync 160ee983079SDomen Puncer 161ee983079SDomen Puncer stb r4, GPIOW_DVO(r8) /* "output" high */ 162ee983079SDomen Puncer sync 163ee983079SDomen Puncer stb r4, GPIOW_DDR(r8) /* output */ 164ee983079SDomen Puncer sync 165ee983079SDomen Puncer stb r4, GPIOW_DVO(r8) /* output high */ 166ee983079SDomen Puncer sync 167ee983079SDomen Puncer 168ee983079SDomen Puncer /* 10uS delay */ 169ee983079SDomen Puncer li r12, 10 170ee983079SDomen Puncer bl udelay 171ee983079SDomen Puncer 172ee983079SDomen Puncer /* turn off */ 173ee983079SDomen Puncer li r4, 0 174ee983079SDomen Puncer stb r4, GPIOW_DVO(r8) /* output low */ 175ee983079SDomen Puncer sync 176ee983079SDomen Puncer 177ee983079SDomen Puncer /* wait until we're offline */ 178ee983079SDomen Puncer 1: 179ee983079SDomen Puncer b 1b 180ee983079SDomen Puncer 181ee983079SDomen Puncer 182ee983079SDomen Puncer /* local udelay in sram is needed */ 183*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(udelay) 184*2da37761SChristophe Leroy /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */ 185ee983079SDomen Puncer mullw r12, r12, r11 186ee983079SDomen Puncer mftb r13 /* start */ 1878a87a507SChristophe Leroy add r12, r13, r12 /* end */ 188ee983079SDomen Puncer 1: 189ee983079SDomen Puncer mftb r13 /* current */ 190ee983079SDomen Puncer cmp cr0, r13, r12 191ee983079SDomen Puncer blt 1b 192ee983079SDomen Puncer blr 193*2da37761SChristophe LeroySYM_FUNC_END(udelay) 194ee983079SDomen Puncer 195ee983079SDomen Puncersram_code_end: 196ee983079SDomen Puncer 197ee983079SDomen Puncer 198ee983079SDomen Puncer 199ee983079SDomen Puncer/* uboot jumps here on resume */ 200ee983079SDomen Puncerlite5200_wakeup: 201ee983079SDomen Puncer bl restore_regs 202ee983079SDomen Puncer 203ee983079SDomen Puncer 204ee983079SDomen Puncer /* HIDs, MSR */ 205ee983079SDomen Puncer LOAD_SPRN(HID1, 0x19) 206ee983079SDomen Puncer LOAD_SPRN(HID2, 0x1a) 207ee983079SDomen Puncer 208ee983079SDomen Puncer 209ee983079SDomen Puncer /* address translation is tricky (see turn_on_mmu) */ 210ee983079SDomen Puncer mfmsr r10 211ee983079SDomen Puncer ori r10, r10, MSR_DR | MSR_IR 212ee983079SDomen Puncer 213ee983079SDomen Puncer 214ee983079SDomen Puncer mtspr SPRN_SRR1, r10 215ee983079SDomen Puncer lis r10, mmu_on@h 216ee983079SDomen Puncer ori r10, r10, mmu_on@l 217ee983079SDomen Puncer mtspr SPRN_SRR0, r10 218ee983079SDomen Puncer sync 219ee983079SDomen Puncer rfi 220ee983079SDomen Puncermmu_on: 221ee983079SDomen Puncer /* kernel offset (r4 is still set from restore_registers) */ 222ee983079SDomen Puncer addis r4, r4, CONFIG_KERNEL_START@h 223ee983079SDomen Puncer 224ee983079SDomen Puncer 225ee983079SDomen Puncer /* restore MSR */ 226ee983079SDomen Puncer lwz r10, (4*0x1b)(r4) 227ee983079SDomen Puncer mtmsr r10 228ee983079SDomen Puncer sync; isync; 229ee983079SDomen Puncer 230ee983079SDomen Puncer /* invalidate caches */ 231ee983079SDomen Puncer mfspr r10, SPRN_HID0 232ee983079SDomen Puncer ori r5, r10, HID0_ICFI | HID0_DCI 233ee983079SDomen Puncer mtspr SPRN_HID0, r5 /* invalidate caches */ 234ee983079SDomen Puncer sync; isync; 235ee983079SDomen Puncer mtspr SPRN_HID0, r10 236ee983079SDomen Puncer sync; isync; 237ee983079SDomen Puncer 238ee983079SDomen Puncer /* enable caches */ 239ee983079SDomen Puncer lwz r10, (4*0x18)(r4) 240ee983079SDomen Puncer mtspr SPRN_HID0, r10 /* restore (enable caches, DPM) */ 241ee983079SDomen Puncer /* ^ this has to be after address translation set in MSR */ 242ee983079SDomen Puncer sync 243ee983079SDomen Puncer isync 244ee983079SDomen Puncer 245ee983079SDomen Puncer 246ee983079SDomen Puncer /* restore 0xf0 (BDI2000) */ 247ee983079SDomen Puncer lis r3, CONFIG_KERNEL_START@h 248ee983079SDomen Puncer lwz r10, (0x1d*4)(r4) 249ee983079SDomen Puncer stw r10, 0xf0(r3) 250ee983079SDomen Puncer 251ee983079SDomen Puncer LOAD_SPRN(LR, 0x1c) 252ee983079SDomen Puncer 253ee983079SDomen Puncer 254ee983079SDomen Puncer blr 255e83f01fdSChristophe Leroy_ASM_NOKPROBE_SYMBOL(lite5200_wakeup) 256ee983079SDomen Puncer 257ee983079SDomen Puncer 258ee983079SDomen Puncer/* ---------------------------------------------------------------------- */ 259ee983079SDomen Puncer/* boring code: helpers */ 260ee983079SDomen Puncer 261ee983079SDomen Puncer/* save registers */ 262ee983079SDomen Puncer#define SAVE_BAT(n, addr) \ 263ee983079SDomen Puncer SAVE_SPRN(DBAT##n##L, addr); \ 264ee983079SDomen Puncer SAVE_SPRN(DBAT##n##U, addr+1); \ 265ee983079SDomen Puncer SAVE_SPRN(IBAT##n##L, addr+2); \ 266ee983079SDomen Puncer SAVE_SPRN(IBAT##n##U, addr+3); 267ee983079SDomen Puncer 268ee983079SDomen Puncer#define SAVE_SR(n, addr) \ 269ee983079SDomen Puncer mfsr r10, n; \ 270ee983079SDomen Puncer stw r10, ((addr)*4)(r4); 271ee983079SDomen Puncer 272ee983079SDomen Puncer#define SAVE_4SR(n, addr) \ 273ee983079SDomen Puncer SAVE_SR(n, addr); \ 274ee983079SDomen Puncer SAVE_SR(n+1, addr+1); \ 275ee983079SDomen Puncer SAVE_SR(n+2, addr+2); \ 276ee983079SDomen Puncer SAVE_SR(n+3, addr+3); 277ee983079SDomen Puncer 278*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(save_regs) 279ee983079SDomen Puncer stw r0, 0(r4) 280ee983079SDomen Puncer stw r1, 0x4(r4) 281ee983079SDomen Puncer stw r2, 0x8(r4) 282ee983079SDomen Puncer stmw r11, 0xc(r4) /* 0xc -> 0x5f, (0x18*4-1) */ 283ee983079SDomen Puncer 284ee983079SDomen Puncer SAVE_SPRN(HID0, 0x18) 285ee983079SDomen Puncer SAVE_SPRN(HID1, 0x19) 286ee983079SDomen Puncer SAVE_SPRN(HID2, 0x1a) 287ee983079SDomen Puncer mfmsr r10 288ee983079SDomen Puncer stw r10, (4*0x1b)(r4) 289ee983079SDomen Puncer /*SAVE_SPRN(LR, 0x1c) have to save it before the call */ 290ee983079SDomen Puncer /* 0x1d reserved by 0xf0 */ 291ee983079SDomen Puncer SAVE_SPRN(RPA, 0x1e) 292ee983079SDomen Puncer SAVE_SPRN(SDR1, 0x1f) 293ee983079SDomen Puncer 294ee983079SDomen Puncer /* save MMU regs */ 295ee983079SDomen Puncer SAVE_BAT(0, 0x20) 296ee983079SDomen Puncer SAVE_BAT(1, 0x24) 297ee983079SDomen Puncer SAVE_BAT(2, 0x28) 298ee983079SDomen Puncer SAVE_BAT(3, 0x2c) 299ee983079SDomen Puncer SAVE_BAT(4, 0x30) 300ee983079SDomen Puncer SAVE_BAT(5, 0x34) 301ee983079SDomen Puncer SAVE_BAT(6, 0x38) 302ee983079SDomen Puncer SAVE_BAT(7, 0x3c) 303ee983079SDomen Puncer 304ee983079SDomen Puncer SAVE_4SR(0, 0x40) 305ee983079SDomen Puncer SAVE_4SR(4, 0x44) 306ee983079SDomen Puncer SAVE_4SR(8, 0x48) 307ee983079SDomen Puncer SAVE_4SR(12, 0x4c) 308ee983079SDomen Puncer 309ee983079SDomen Puncer SAVE_SPRN(SPRG0, 0x50) 310ee983079SDomen Puncer SAVE_SPRN(SPRG1, 0x51) 311ee983079SDomen Puncer SAVE_SPRN(SPRG2, 0x52) 312ee983079SDomen Puncer SAVE_SPRN(SPRG3, 0x53) 313ee983079SDomen Puncer SAVE_SPRN(SPRG4, 0x54) 314ee983079SDomen Puncer SAVE_SPRN(SPRG5, 0x55) 315ee983079SDomen Puncer SAVE_SPRN(SPRG6, 0x56) 316ee983079SDomen Puncer SAVE_SPRN(SPRG7, 0x57) 317ee983079SDomen Puncer 318ee983079SDomen Puncer SAVE_SPRN(IABR, 0x58) 319ee983079SDomen Puncer SAVE_SPRN(DABR, 0x59) 320ee983079SDomen Puncer SAVE_SPRN(TBRL, 0x5a) 321ee983079SDomen Puncer SAVE_SPRN(TBRU, 0x5b) 322ee983079SDomen Puncer 323ee983079SDomen Puncer blr 324*2da37761SChristophe LeroySYM_FUNC_END(save_regs) 325ee983079SDomen Puncer 326ee983079SDomen Puncer 327ee983079SDomen Puncer/* restore registers */ 328ee983079SDomen Puncer#define LOAD_BAT(n, addr) \ 329ee983079SDomen Puncer LOAD_SPRN(DBAT##n##L, addr); \ 330ee983079SDomen Puncer LOAD_SPRN(DBAT##n##U, addr+1); \ 331ee983079SDomen Puncer LOAD_SPRN(IBAT##n##L, addr+2); \ 332ee983079SDomen Puncer LOAD_SPRN(IBAT##n##U, addr+3); 333ee983079SDomen Puncer 334ee983079SDomen Puncer#define LOAD_SR(n, addr) \ 335ee983079SDomen Puncer lwz r10, ((addr)*4)(r4); \ 336ee983079SDomen Puncer mtsr n, r10; 337ee983079SDomen Puncer 338ee983079SDomen Puncer#define LOAD_4SR(n, addr) \ 339ee983079SDomen Puncer LOAD_SR(n, addr); \ 340ee983079SDomen Puncer LOAD_SR(n+1, addr+1); \ 341ee983079SDomen Puncer LOAD_SR(n+2, addr+2); \ 342ee983079SDomen Puncer LOAD_SR(n+3, addr+3); 343ee983079SDomen Puncer 344*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(restore_regs) 345ee983079SDomen Puncer lis r4, registers@h 346ee983079SDomen Puncer ori r4, r4, registers@l 347ee983079SDomen Puncer 348ee983079SDomen Puncer /* MMU is not up yet */ 349ee983079SDomen Puncer subis r4, r4, CONFIG_KERNEL_START@h 350ee983079SDomen Puncer 351ee983079SDomen Puncer lwz r0, 0(r4) 352ee983079SDomen Puncer lwz r1, 0x4(r4) 353ee983079SDomen Puncer lwz r2, 0x8(r4) 354ee983079SDomen Puncer lmw r11, 0xc(r4) 355ee983079SDomen Puncer 356ee983079SDomen Puncer /* 357ee983079SDomen Puncer * these are a bit tricky 358ee983079SDomen Puncer * 359ee983079SDomen Puncer * 0x18 - HID0 360ee983079SDomen Puncer * 0x19 - HID1 361ee983079SDomen Puncer * 0x1a - HID2 362ee983079SDomen Puncer * 0x1b - MSR 363ee983079SDomen Puncer * 0x1c - LR 364ee983079SDomen Puncer * 0x1d - reserved by 0xf0 (BDI2000) 365ee983079SDomen Puncer */ 366ee983079SDomen Puncer LOAD_SPRN(RPA, 0x1e); 367ee983079SDomen Puncer LOAD_SPRN(SDR1, 0x1f); 368ee983079SDomen Puncer 369ee983079SDomen Puncer /* restore MMU regs */ 370ee983079SDomen Puncer LOAD_BAT(0, 0x20) 371ee983079SDomen Puncer LOAD_BAT(1, 0x24) 372ee983079SDomen Puncer LOAD_BAT(2, 0x28) 373ee983079SDomen Puncer LOAD_BAT(3, 0x2c) 374ee983079SDomen Puncer LOAD_BAT(4, 0x30) 375ee983079SDomen Puncer LOAD_BAT(5, 0x34) 376ee983079SDomen Puncer LOAD_BAT(6, 0x38) 377ee983079SDomen Puncer LOAD_BAT(7, 0x3c) 378ee983079SDomen Puncer 379ee983079SDomen Puncer LOAD_4SR(0, 0x40) 380ee983079SDomen Puncer LOAD_4SR(4, 0x44) 381ee983079SDomen Puncer LOAD_4SR(8, 0x48) 382ee983079SDomen Puncer LOAD_4SR(12, 0x4c) 383ee983079SDomen Puncer 384ee983079SDomen Puncer /* rest of regs */ 385ee983079SDomen Puncer LOAD_SPRN(SPRG0, 0x50); 386ee983079SDomen Puncer LOAD_SPRN(SPRG1, 0x51); 387ee983079SDomen Puncer LOAD_SPRN(SPRG2, 0x52); 388ee983079SDomen Puncer LOAD_SPRN(SPRG3, 0x53); 389ee983079SDomen Puncer LOAD_SPRN(SPRG4, 0x54); 390ee983079SDomen Puncer LOAD_SPRN(SPRG5, 0x55); 391ee983079SDomen Puncer LOAD_SPRN(SPRG6, 0x56); 392ee983079SDomen Puncer LOAD_SPRN(SPRG7, 0x57); 393ee983079SDomen Puncer 394ee983079SDomen Puncer LOAD_SPRN(IABR, 0x58); 395ee983079SDomen Puncer LOAD_SPRN(DABR, 0x59); 396ee983079SDomen Puncer LOAD_SPRN(TBWL, 0x5a); /* these two have separate R/W regs */ 397ee983079SDomen Puncer LOAD_SPRN(TBWU, 0x5b); 398ee983079SDomen Puncer 399ee983079SDomen Puncer blr 400e83f01fdSChristophe Leroy_ASM_NOKPROBE_SYMBOL(restore_regs) 401*2da37761SChristophe LeroySYM_FUNC_END(restore_regs) 402ee983079SDomen Puncer 403ee983079SDomen Puncer 404ee983079SDomen Puncer 405ee983079SDomen Puncer/* cache flushing code. copied from arch/ppc/boot/util.S */ 406ee983079SDomen Puncer#define NUM_CACHE_LINES (128*8) 407ee983079SDomen Puncer 408ee983079SDomen Puncer/* 409ee983079SDomen Puncer * Flush data cache 410ee983079SDomen Puncer * Do this by just reading lots of stuff into the cache. 411ee983079SDomen Puncer */ 412*2da37761SChristophe LeroySYM_FUNC_START_LOCAL(flush_data_cache) 413ee983079SDomen Puncer lis r3,CONFIG_KERNEL_START@h 414ee983079SDomen Puncer ori r3,r3,CONFIG_KERNEL_START@l 415ee983079SDomen Puncer li r4,NUM_CACHE_LINES 416ee983079SDomen Puncer mtctr r4 417ee983079SDomen Puncer1: 418ee983079SDomen Puncer lwz r4,0(r3) 419ee983079SDomen Puncer addi r3,r3,L1_CACHE_BYTES /* Next line, please */ 420ee983079SDomen Puncer bdnz 1b 421ee983079SDomen Puncer blr 422*2da37761SChristophe LeroySYM_FUNC_END(flush_data_cache) 423