162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#include <linux/linkage.h> 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <asm/reg.h> 562306a36Sopenharmony_ci#include <asm/ppc_asm.h> 662306a36Sopenharmony_ci#include <asm/processor.h> 762306a36Sopenharmony_ci#include <asm/cache.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define SDRAM_CTRL 0x104 1162306a36Sopenharmony_ci#define SC_MODE_EN (1<<31) 1262306a36Sopenharmony_ci#define SC_CKE (1<<30) 1362306a36Sopenharmony_ci#define SC_REF_EN (1<<28) 1462306a36Sopenharmony_ci#define SC_SOFT_PRE (1<<1) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define GPIOW_GPIOE 0xc00 1762306a36Sopenharmony_ci#define GPIOW_DDR 0xc08 1862306a36Sopenharmony_ci#define GPIOW_DVO 0xc0c 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define CDM_CE 0x214 2162306a36Sopenharmony_ci#define CDM_SDRAM (1<<3) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* helpers... beware: r10 and r4 are overwritten */ 2562306a36Sopenharmony_ci#define SAVE_SPRN(reg, addr) \ 2662306a36Sopenharmony_ci mfspr r10, SPRN_##reg; \ 2762306a36Sopenharmony_ci stw r10, ((addr)*4)(r4); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define LOAD_SPRN(reg, addr) \ 3062306a36Sopenharmony_ci lwz r10, ((addr)*4)(r4); \ 3162306a36Sopenharmony_ci mtspr SPRN_##reg, r10; \ 3262306a36Sopenharmony_ci sync; \ 3362306a36Sopenharmony_ci isync; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci .data 3762306a36Sopenharmony_ciregisters: 3862306a36Sopenharmony_ci .space 0x5c*4 3962306a36Sopenharmony_ci .text 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* ---------------------------------------------------------------------- */ 4262306a36Sopenharmony_ci/* low-power mode with help of M68HLC908QT1 */ 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci .globl lite5200_low_power 4562306a36Sopenharmony_cilite5200_low_power: 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci mr r7, r3 /* save SRAM va */ 4862306a36Sopenharmony_ci mr r8, r4 /* save MBAR va */ 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci /* setup wakeup address for u-boot at physical location 0x0 */ 5162306a36Sopenharmony_ci lis r3, CONFIG_KERNEL_START@h 5262306a36Sopenharmony_ci lis r4, lite5200_wakeup@h 5362306a36Sopenharmony_ci ori r4, r4, lite5200_wakeup@l 5462306a36Sopenharmony_ci sub r4, r4, r3 5562306a36Sopenharmony_ci stw r4, 0(r3) 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* 5962306a36Sopenharmony_ci * save stuff BDI overwrites 6062306a36Sopenharmony_ci * 0xf0 (0xe0->0x100 gets overwritten when BDI connected; 6162306a36Sopenharmony_ci * even when CONFIG_BDI_SWITCH is disabled and MMU XLAT commented; heisenbug?)) 6262306a36Sopenharmony_ci * WARNING: self-refresh doesn't seem to work when BDI2000 is connected, 6362306a36Sopenharmony_ci * possibly because BDI sets SDRAM registers before wakeup code does 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ci lis r4, registers@h 6662306a36Sopenharmony_ci ori r4, r4, registers@l 6762306a36Sopenharmony_ci lwz r10, 0xf0(r3) 6862306a36Sopenharmony_ci stw r10, (0x1d*4)(r4) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci /* save registers to r4 [destroys r10] */ 7162306a36Sopenharmony_ci SAVE_SPRN(LR, 0x1c) 7262306a36Sopenharmony_ci bl save_regs 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* flush caches [destroys r3, r4] */ 7562306a36Sopenharmony_ci bl flush_data_cache 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci /* copy code to sram */ 7962306a36Sopenharmony_ci mr r4, r7 8062306a36Sopenharmony_ci li r3, (sram_code_end - sram_code)/4 8162306a36Sopenharmony_ci mtctr r3 8262306a36Sopenharmony_ci lis r3, sram_code@h 8362306a36Sopenharmony_ci ori r3, r3, sram_code@l 8462306a36Sopenharmony_ci1: 8562306a36Sopenharmony_ci lwz r5, 0(r3) 8662306a36Sopenharmony_ci stw r5, 0(r4) 8762306a36Sopenharmony_ci addi r3, r3, 4 8862306a36Sopenharmony_ci addi r4, r4, 4 8962306a36Sopenharmony_ci bdnz 1b 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* get tb_ticks_per_usec */ 9262306a36Sopenharmony_ci lis r3, tb_ticks_per_usec@h 9362306a36Sopenharmony_ci lwz r11, tb_ticks_per_usec@l(r3) 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci /* disable I and D caches */ 9662306a36Sopenharmony_ci mfspr r3, SPRN_HID0 9762306a36Sopenharmony_ci ori r3, r3, HID0_ICE | HID0_DCE 9862306a36Sopenharmony_ci xori r3, r3, HID0_ICE | HID0_DCE 9962306a36Sopenharmony_ci sync; isync; 10062306a36Sopenharmony_ci mtspr SPRN_HID0, r3 10162306a36Sopenharmony_ci sync; isync; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci /* jump to sram */ 10462306a36Sopenharmony_ci mtlr r7 10562306a36Sopenharmony_ci blrl 10662306a36Sopenharmony_ci /* doesn't return */ 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cisram_code: 11062306a36Sopenharmony_ci /* self refresh */ 11162306a36Sopenharmony_ci lwz r4, SDRAM_CTRL(r8) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci /* send NOP (precharge) */ 11462306a36Sopenharmony_ci oris r4, r4, SC_MODE_EN@h /* mode_en */ 11562306a36Sopenharmony_ci stw r4, SDRAM_CTRL(r8) 11662306a36Sopenharmony_ci sync 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci ori r4, r4, SC_SOFT_PRE /* soft_pre */ 11962306a36Sopenharmony_ci stw r4, SDRAM_CTRL(r8) 12062306a36Sopenharmony_ci sync 12162306a36Sopenharmony_ci xori r4, r4, SC_SOFT_PRE 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci xoris r4, r4, SC_MODE_EN@h /* !mode_en */ 12462306a36Sopenharmony_ci stw r4, SDRAM_CTRL(r8) 12562306a36Sopenharmony_ci sync 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci /* delay (for NOP to finish) */ 12862306a36Sopenharmony_ci li r12, 1 12962306a36Sopenharmony_ci bl udelay 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* 13262306a36Sopenharmony_ci * mode_en must not be set when enabling self-refresh 13362306a36Sopenharmony_ci * send AR with CKE low (self-refresh) 13462306a36Sopenharmony_ci */ 13562306a36Sopenharmony_ci oris r4, r4, (SC_REF_EN | SC_CKE)@h 13662306a36Sopenharmony_ci xoris r4, r4, (SC_CKE)@h /* ref_en !cke */ 13762306a36Sopenharmony_ci stw r4, SDRAM_CTRL(r8) 13862306a36Sopenharmony_ci sync 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci /* delay (after !CKE there should be two cycles) */ 14162306a36Sopenharmony_ci li r12, 1 14262306a36Sopenharmony_ci bl udelay 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci /* disable clock */ 14562306a36Sopenharmony_ci lwz r4, CDM_CE(r8) 14662306a36Sopenharmony_ci ori r4, r4, CDM_SDRAM 14762306a36Sopenharmony_ci xori r4, r4, CDM_SDRAM 14862306a36Sopenharmony_ci stw r4, CDM_CE(r8) 14962306a36Sopenharmony_ci sync 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci /* delay a bit */ 15262306a36Sopenharmony_ci li r12, 1 15362306a36Sopenharmony_ci bl udelay 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* turn off with QT chip */ 15762306a36Sopenharmony_ci li r4, 0x02 15862306a36Sopenharmony_ci stb r4, GPIOW_GPIOE(r8) /* enable gpio_wkup1 */ 15962306a36Sopenharmony_ci sync 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci stb r4, GPIOW_DVO(r8) /* "output" high */ 16262306a36Sopenharmony_ci sync 16362306a36Sopenharmony_ci stb r4, GPIOW_DDR(r8) /* output */ 16462306a36Sopenharmony_ci sync 16562306a36Sopenharmony_ci stb r4, GPIOW_DVO(r8) /* output high */ 16662306a36Sopenharmony_ci sync 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci /* 10uS delay */ 16962306a36Sopenharmony_ci li r12, 10 17062306a36Sopenharmony_ci bl udelay 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* turn off */ 17362306a36Sopenharmony_ci li r4, 0 17462306a36Sopenharmony_ci stb r4, GPIOW_DVO(r8) /* output low */ 17562306a36Sopenharmony_ci sync 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* wait until we're offline */ 17862306a36Sopenharmony_ci 1: 17962306a36Sopenharmony_ci b 1b 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci /* local udelay in sram is needed */ 18362306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(udelay) 18462306a36Sopenharmony_ci /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */ 18562306a36Sopenharmony_ci mullw r12, r12, r11 18662306a36Sopenharmony_ci mftb r13 /* start */ 18762306a36Sopenharmony_ci add r12, r13, r12 /* end */ 18862306a36Sopenharmony_ci 1: 18962306a36Sopenharmony_ci mftb r13 /* current */ 19062306a36Sopenharmony_ci cmp cr0, r13, r12 19162306a36Sopenharmony_ci blt 1b 19262306a36Sopenharmony_ci blr 19362306a36Sopenharmony_ciSYM_FUNC_END(udelay) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cisram_code_end: 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/* uboot jumps here on resume */ 20062306a36Sopenharmony_cilite5200_wakeup: 20162306a36Sopenharmony_ci bl restore_regs 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci /* HIDs, MSR */ 20562306a36Sopenharmony_ci LOAD_SPRN(HID1, 0x19) 20662306a36Sopenharmony_ci LOAD_SPRN(HID2, 0x1a) 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* address translation is tricky (see turn_on_mmu) */ 21062306a36Sopenharmony_ci mfmsr r10 21162306a36Sopenharmony_ci ori r10, r10, MSR_DR | MSR_IR 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci mtspr SPRN_SRR1, r10 21562306a36Sopenharmony_ci lis r10, mmu_on@h 21662306a36Sopenharmony_ci ori r10, r10, mmu_on@l 21762306a36Sopenharmony_ci mtspr SPRN_SRR0, r10 21862306a36Sopenharmony_ci sync 21962306a36Sopenharmony_ci rfi 22062306a36Sopenharmony_cimmu_on: 22162306a36Sopenharmony_ci /* kernel offset (r4 is still set from restore_registers) */ 22262306a36Sopenharmony_ci addis r4, r4, CONFIG_KERNEL_START@h 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci /* restore MSR */ 22662306a36Sopenharmony_ci lwz r10, (4*0x1b)(r4) 22762306a36Sopenharmony_ci mtmsr r10 22862306a36Sopenharmony_ci sync; isync; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci /* invalidate caches */ 23162306a36Sopenharmony_ci mfspr r10, SPRN_HID0 23262306a36Sopenharmony_ci ori r5, r10, HID0_ICFI | HID0_DCI 23362306a36Sopenharmony_ci mtspr SPRN_HID0, r5 /* invalidate caches */ 23462306a36Sopenharmony_ci sync; isync; 23562306a36Sopenharmony_ci mtspr SPRN_HID0, r10 23662306a36Sopenharmony_ci sync; isync; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci /* enable caches */ 23962306a36Sopenharmony_ci lwz r10, (4*0x18)(r4) 24062306a36Sopenharmony_ci mtspr SPRN_HID0, r10 /* restore (enable caches, DPM) */ 24162306a36Sopenharmony_ci /* ^ this has to be after address translation set in MSR */ 24262306a36Sopenharmony_ci sync 24362306a36Sopenharmony_ci isync 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* restore 0xf0 (BDI2000) */ 24762306a36Sopenharmony_ci lis r3, CONFIG_KERNEL_START@h 24862306a36Sopenharmony_ci lwz r10, (0x1d*4)(r4) 24962306a36Sopenharmony_ci stw r10, 0xf0(r3) 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci LOAD_SPRN(LR, 0x1c) 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci blr 25562306a36Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(lite5200_wakeup) 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/* ---------------------------------------------------------------------- */ 25962306a36Sopenharmony_ci/* boring code: helpers */ 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* save registers */ 26262306a36Sopenharmony_ci#define SAVE_BAT(n, addr) \ 26362306a36Sopenharmony_ci SAVE_SPRN(DBAT##n##L, addr); \ 26462306a36Sopenharmony_ci SAVE_SPRN(DBAT##n##U, addr+1); \ 26562306a36Sopenharmony_ci SAVE_SPRN(IBAT##n##L, addr+2); \ 26662306a36Sopenharmony_ci SAVE_SPRN(IBAT##n##U, addr+3); 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci#define SAVE_SR(n, addr) \ 26962306a36Sopenharmony_ci mfsr r10, n; \ 27062306a36Sopenharmony_ci stw r10, ((addr)*4)(r4); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci#define SAVE_4SR(n, addr) \ 27362306a36Sopenharmony_ci SAVE_SR(n, addr); \ 27462306a36Sopenharmony_ci SAVE_SR(n+1, addr+1); \ 27562306a36Sopenharmony_ci SAVE_SR(n+2, addr+2); \ 27662306a36Sopenharmony_ci SAVE_SR(n+3, addr+3); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(save_regs) 27962306a36Sopenharmony_ci stw r0, 0(r4) 28062306a36Sopenharmony_ci stw r1, 0x4(r4) 28162306a36Sopenharmony_ci stw r2, 0x8(r4) 28262306a36Sopenharmony_ci stmw r11, 0xc(r4) /* 0xc -> 0x5f, (0x18*4-1) */ 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci SAVE_SPRN(HID0, 0x18) 28562306a36Sopenharmony_ci SAVE_SPRN(HID1, 0x19) 28662306a36Sopenharmony_ci SAVE_SPRN(HID2, 0x1a) 28762306a36Sopenharmony_ci mfmsr r10 28862306a36Sopenharmony_ci stw r10, (4*0x1b)(r4) 28962306a36Sopenharmony_ci /*SAVE_SPRN(LR, 0x1c) have to save it before the call */ 29062306a36Sopenharmony_ci /* 0x1d reserved by 0xf0 */ 29162306a36Sopenharmony_ci SAVE_SPRN(RPA, 0x1e) 29262306a36Sopenharmony_ci SAVE_SPRN(SDR1, 0x1f) 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci /* save MMU regs */ 29562306a36Sopenharmony_ci SAVE_BAT(0, 0x20) 29662306a36Sopenharmony_ci SAVE_BAT(1, 0x24) 29762306a36Sopenharmony_ci SAVE_BAT(2, 0x28) 29862306a36Sopenharmony_ci SAVE_BAT(3, 0x2c) 29962306a36Sopenharmony_ci SAVE_BAT(4, 0x30) 30062306a36Sopenharmony_ci SAVE_BAT(5, 0x34) 30162306a36Sopenharmony_ci SAVE_BAT(6, 0x38) 30262306a36Sopenharmony_ci SAVE_BAT(7, 0x3c) 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci SAVE_4SR(0, 0x40) 30562306a36Sopenharmony_ci SAVE_4SR(4, 0x44) 30662306a36Sopenharmony_ci SAVE_4SR(8, 0x48) 30762306a36Sopenharmony_ci SAVE_4SR(12, 0x4c) 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci SAVE_SPRN(SPRG0, 0x50) 31062306a36Sopenharmony_ci SAVE_SPRN(SPRG1, 0x51) 31162306a36Sopenharmony_ci SAVE_SPRN(SPRG2, 0x52) 31262306a36Sopenharmony_ci SAVE_SPRN(SPRG3, 0x53) 31362306a36Sopenharmony_ci SAVE_SPRN(SPRG4, 0x54) 31462306a36Sopenharmony_ci SAVE_SPRN(SPRG5, 0x55) 31562306a36Sopenharmony_ci SAVE_SPRN(SPRG6, 0x56) 31662306a36Sopenharmony_ci SAVE_SPRN(SPRG7, 0x57) 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci SAVE_SPRN(IABR, 0x58) 31962306a36Sopenharmony_ci SAVE_SPRN(DABR, 0x59) 32062306a36Sopenharmony_ci SAVE_SPRN(TBRL, 0x5a) 32162306a36Sopenharmony_ci SAVE_SPRN(TBRU, 0x5b) 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci blr 32462306a36Sopenharmony_ciSYM_FUNC_END(save_regs) 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci/* restore registers */ 32862306a36Sopenharmony_ci#define LOAD_BAT(n, addr) \ 32962306a36Sopenharmony_ci LOAD_SPRN(DBAT##n##L, addr); \ 33062306a36Sopenharmony_ci LOAD_SPRN(DBAT##n##U, addr+1); \ 33162306a36Sopenharmony_ci LOAD_SPRN(IBAT##n##L, addr+2); \ 33262306a36Sopenharmony_ci LOAD_SPRN(IBAT##n##U, addr+3); 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci#define LOAD_SR(n, addr) \ 33562306a36Sopenharmony_ci lwz r10, ((addr)*4)(r4); \ 33662306a36Sopenharmony_ci mtsr n, r10; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci#define LOAD_4SR(n, addr) \ 33962306a36Sopenharmony_ci LOAD_SR(n, addr); \ 34062306a36Sopenharmony_ci LOAD_SR(n+1, addr+1); \ 34162306a36Sopenharmony_ci LOAD_SR(n+2, addr+2); \ 34262306a36Sopenharmony_ci LOAD_SR(n+3, addr+3); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(restore_regs) 34562306a36Sopenharmony_ci lis r4, registers@h 34662306a36Sopenharmony_ci ori r4, r4, registers@l 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci /* MMU is not up yet */ 34962306a36Sopenharmony_ci subis r4, r4, CONFIG_KERNEL_START@h 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci lwz r0, 0(r4) 35262306a36Sopenharmony_ci lwz r1, 0x4(r4) 35362306a36Sopenharmony_ci lwz r2, 0x8(r4) 35462306a36Sopenharmony_ci lmw r11, 0xc(r4) 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci /* 35762306a36Sopenharmony_ci * these are a bit tricky 35862306a36Sopenharmony_ci * 35962306a36Sopenharmony_ci * 0x18 - HID0 36062306a36Sopenharmony_ci * 0x19 - HID1 36162306a36Sopenharmony_ci * 0x1a - HID2 36262306a36Sopenharmony_ci * 0x1b - MSR 36362306a36Sopenharmony_ci * 0x1c - LR 36462306a36Sopenharmony_ci * 0x1d - reserved by 0xf0 (BDI2000) 36562306a36Sopenharmony_ci */ 36662306a36Sopenharmony_ci LOAD_SPRN(RPA, 0x1e); 36762306a36Sopenharmony_ci LOAD_SPRN(SDR1, 0x1f); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci /* restore MMU regs */ 37062306a36Sopenharmony_ci LOAD_BAT(0, 0x20) 37162306a36Sopenharmony_ci LOAD_BAT(1, 0x24) 37262306a36Sopenharmony_ci LOAD_BAT(2, 0x28) 37362306a36Sopenharmony_ci LOAD_BAT(3, 0x2c) 37462306a36Sopenharmony_ci LOAD_BAT(4, 0x30) 37562306a36Sopenharmony_ci LOAD_BAT(5, 0x34) 37662306a36Sopenharmony_ci LOAD_BAT(6, 0x38) 37762306a36Sopenharmony_ci LOAD_BAT(7, 0x3c) 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci LOAD_4SR(0, 0x40) 38062306a36Sopenharmony_ci LOAD_4SR(4, 0x44) 38162306a36Sopenharmony_ci LOAD_4SR(8, 0x48) 38262306a36Sopenharmony_ci LOAD_4SR(12, 0x4c) 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci /* rest of regs */ 38562306a36Sopenharmony_ci LOAD_SPRN(SPRG0, 0x50); 38662306a36Sopenharmony_ci LOAD_SPRN(SPRG1, 0x51); 38762306a36Sopenharmony_ci LOAD_SPRN(SPRG2, 0x52); 38862306a36Sopenharmony_ci LOAD_SPRN(SPRG3, 0x53); 38962306a36Sopenharmony_ci LOAD_SPRN(SPRG4, 0x54); 39062306a36Sopenharmony_ci LOAD_SPRN(SPRG5, 0x55); 39162306a36Sopenharmony_ci LOAD_SPRN(SPRG6, 0x56); 39262306a36Sopenharmony_ci LOAD_SPRN(SPRG7, 0x57); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci LOAD_SPRN(IABR, 0x58); 39562306a36Sopenharmony_ci LOAD_SPRN(DABR, 0x59); 39662306a36Sopenharmony_ci LOAD_SPRN(TBWL, 0x5a); /* these two have separate R/W regs */ 39762306a36Sopenharmony_ci LOAD_SPRN(TBWU, 0x5b); 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci blr 40062306a36Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(restore_regs) 40162306a36Sopenharmony_ciSYM_FUNC_END(restore_regs) 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci/* cache flushing code. copied from arch/ppc/boot/util.S */ 40662306a36Sopenharmony_ci#define NUM_CACHE_LINES (128*8) 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* 40962306a36Sopenharmony_ci * Flush data cache 41062306a36Sopenharmony_ci * Do this by just reading lots of stuff into the cache. 41162306a36Sopenharmony_ci */ 41262306a36Sopenharmony_ciSYM_FUNC_START_LOCAL(flush_data_cache) 41362306a36Sopenharmony_ci lis r3,CONFIG_KERNEL_START@h 41462306a36Sopenharmony_ci ori r3,r3,CONFIG_KERNEL_START@l 41562306a36Sopenharmony_ci li r4,NUM_CACHE_LINES 41662306a36Sopenharmony_ci mtctr r4 41762306a36Sopenharmony_ci1: 41862306a36Sopenharmony_ci lwz r4,0(r3) 41962306a36Sopenharmony_ci addi r3,r3,L1_CACHE_BYTES /* Next line, please */ 42062306a36Sopenharmony_ci bdnz 1b 42162306a36Sopenharmony_ci blr 42262306a36Sopenharmony_ciSYM_FUNC_END(flush_data_cache) 423