/* * Rockchip resume header (API from kernel to embedded code) * * Copyright (c) 2014 Google, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __MACH_ROCKCHIP_RK3288_RESUME_H #define __MACH_ROCKCHIP_RK3288_RESUME_H #define RK3288_NUM_DDR_PORTS 2 #define RK3288_MAX_PWM_REGS 3 #define RK3288_MAX_DDR_PHY_DLL_REGS 7 #define RK3288_MAX_DDR_CTRL_REGS 64 #define RK3288_MAX_DDR_PHY_REGS 29 #define RK3288_MAX_DDR_MSCH_REGS 6 #define RK3288_MAX_DDR_PHY_ZQCR_REGS 2 #define RK3288_BOGUS_OFFSET 0xffffffff /** * rk3288_ddr_save - Parameters needed to reinit SDRAM after suspend * * This structure contains data needed to restore SDRAM after suspend. * Generally: * - There are two controllers and we need to save data for both. We save * the same registers for both, so you see two sets of values and one sets * of offsets (the register offset from the base of the controller). * There are a few registers that are always the same for both controllers * so we only save one set of values. * * Offsets are saved at init time and vals are saved on each suspend. * * NOTE: offsets are u32 values right now to keep everything 32-bit and avoid * 8-bit and 16-bit access problems in PMU SRAM (see WARNING below). * Technically, though, 8-bit and 16-bit _reads_ seem to work, so as long as * we were careful in setting things up we could possibly save some memory by * storing 16-bit offsets. We can investigate if we ever get that tight on * space. */ struct rk3288_ddr_save_data { u32 pwm_addrs[RK3288_MAX_PWM_REGS]; u32 pwm_vals[RK3288_MAX_PWM_REGS]; u32 phy_dll_offsets[RK3288_MAX_DDR_PHY_DLL_REGS]; u32 phy_dll_vals[RK3288_NUM_DDR_PORTS][RK3288_MAX_DDR_PHY_DLL_REGS]; u32 ctrl_offsets[RK3288_MAX_DDR_CTRL_REGS]; u32 ctrl_vals[RK3288_MAX_DDR_CTRL_REGS]; /* Both same */ u32 phy_offsets[RK3288_MAX_DDR_PHY_REGS]; u32 phy_vals[RK3288_NUM_DDR_PORTS][RK3288_MAX_DDR_PHY_REGS]; u32 msch_offsets[RK3288_MAX_DDR_MSCH_REGS]; u32 msch_vals[RK3288_NUM_DDR_PORTS][RK3288_MAX_DDR_MSCH_REGS]; u32 phy_zqcr_offsets[RK3288_MAX_DDR_PHY_ZQCR_REGS]; u32 phy_zqcr_vals[RK3288_MAX_DDR_PHY_ZQCR_REGS]; /* Both same */ }; /** * rk3288_resume_params - Parameter space for the resume code * * This structure is at the start of the resume blob and is used to communicate * between the resume blob and the callers. * * WARNING: This structure is sitting in PMU SRAM. If you try to write to that * memory using an 8-bit access (or even 16-bit) you'll get an imprecise data * abort and it will be very hard to debug. Keep everything in here as 32-bit * wide and aligned. YOU'VE BEEN WARNED. * * @resume_loc: The value here should be the resume address that the CPU * is programmed to go to at resume time. * * @l2ctlr_f: If non-zero we'll set l2ctlr at resume time. * @l2ctlr: The value to set l2ctlr to at resume time. * * @ddr_resume_f True if we should resume DDR. * @ddr_save_data: Data for save / restore of DDR. * * @cpu_resume: The function to jump to when we're all done. */ struct rk3288_resume_params { /* This is compiled in and can be read to find the resume location */ __noreturn void (*resume_loc)(void); /* Filled in by the client of the resume code */ u32 l2ctlr_f; /* u32 not bool to avoid 8-bit SRAM access */ u32 l2ctlr; u32 ddr_resume_f; /* u32 not bool to avoid 8-bit SRAM access */ struct rk3288_ddr_save_data ddr_save_data; __noreturn void (*cpu_resume)(void); }; #endif /* __MACH_ROCKCHIP_RK3288_RESUME_H */