OMAP3: PM: SDRC auto-refresh workaround for off-mode
Errata: ES3.0, ES3.1 SDRC not sending auto-refresh when OMAP wakes-up from OFF mode Signed-off-by: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Kalle Jokiniemi <kalle.jokiniemi@digia.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
This commit is contained in:
parent
692ec4abb9
commit
0795a75a36
|
@ -209,8 +209,13 @@ void omap3_save_scratchpad_contents(void)
|
||||||
|
|
||||||
/* Populate the Scratchpad contents */
|
/* Populate the Scratchpad contents */
|
||||||
scratchpad_contents.boot_config_ptr = 0x0;
|
scratchpad_contents.boot_config_ptr = 0x0;
|
||||||
scratchpad_contents.public_restore_ptr =
|
if (omap_rev() != OMAP3430_REV_ES3_0 &&
|
||||||
virt_to_phys(get_restore_pointer());
|
omap_rev() != OMAP3430_REV_ES3_1)
|
||||||
|
scratchpad_contents.public_restore_ptr =
|
||||||
|
virt_to_phys(get_restore_pointer());
|
||||||
|
else
|
||||||
|
scratchpad_contents.public_restore_ptr =
|
||||||
|
virt_to_phys(get_es3_restore_pointer());
|
||||||
if (omap_type() == OMAP2_DEVICE_TYPE_GP)
|
if (omap_type() == OMAP2_DEVICE_TYPE_GP)
|
||||||
scratchpad_contents.secure_ram_restore_ptr = 0x0;
|
scratchpad_contents.secure_ram_restore_ptr = 0x0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
|
#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
|
||||||
OMAP3430_PM_PREPWSTST)
|
OMAP3430_PM_PREPWSTST)
|
||||||
|
#define PM_PREPWSTST_CORE_P 0x48306AE8
|
||||||
#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \
|
#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \
|
||||||
OMAP3430_PM_PREPWSTST)
|
OMAP3430_PM_PREPWSTST)
|
||||||
#define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + PM_PWSTCTRL
|
#define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + PM_PWSTCTRL
|
||||||
|
@ -44,6 +45,13 @@
|
||||||
#define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
|
#define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
|
||||||
+ SCRATCHPAD_MEM_OFFS)
|
+ SCRATCHPAD_MEM_OFFS)
|
||||||
#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
|
#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
|
||||||
|
#define SDRC_SYSCONFIG_P (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
|
||||||
|
#define SDRC_MR_0_P (OMAP343X_SDRC_BASE + SDRC_MR_0)
|
||||||
|
#define SDRC_EMR2_0_P (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
|
||||||
|
#define SDRC_MANUAL_0_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
|
||||||
|
#define SDRC_MR_1_P (OMAP343X_SDRC_BASE + SDRC_MR_1)
|
||||||
|
#define SDRC_EMR2_1_P (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
|
||||||
|
#define SDRC_MANUAL_1_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
|
||||||
|
|
||||||
.text
|
.text
|
||||||
/* Function call to get the restore pointer for resume from OFF */
|
/* Function call to get the restore pointer for resume from OFF */
|
||||||
|
@ -52,7 +60,59 @@ ENTRY(get_restore_pointer)
|
||||||
adr r0, restore
|
adr r0, restore
|
||||||
ldmfd sp!, {pc} @ restore regs and return
|
ldmfd sp!, {pc} @ restore regs and return
|
||||||
ENTRY(get_restore_pointer_sz)
|
ENTRY(get_restore_pointer_sz)
|
||||||
.word . - get_restore_pointer_sz
|
.word . - get_restore_pointer
|
||||||
|
|
||||||
|
.text
|
||||||
|
/* Function call to get the restore pointer for for ES3 to resume from OFF */
|
||||||
|
ENTRY(get_es3_restore_pointer)
|
||||||
|
stmfd sp!, {lr} @ save registers on stack
|
||||||
|
adr r0, restore_es3
|
||||||
|
ldmfd sp!, {pc} @ restore regs and return
|
||||||
|
ENTRY(get_es3_restore_pointer_sz)
|
||||||
|
.word . - get_es3_restore_pointer
|
||||||
|
|
||||||
|
ENTRY(es3_sdrc_fix)
|
||||||
|
ldr r4, sdrc_syscfg @ get config addr
|
||||||
|
ldr r5, [r4] @ get value
|
||||||
|
tst r5, #0x100 @ is part access blocked
|
||||||
|
it eq
|
||||||
|
biceq r5, r5, #0x100 @ clear bit if set
|
||||||
|
str r5, [r4] @ write back change
|
||||||
|
ldr r4, sdrc_mr_0 @ get config addr
|
||||||
|
ldr r5, [r4] @ get value
|
||||||
|
str r5, [r4] @ write back change
|
||||||
|
ldr r4, sdrc_emr2_0 @ get config addr
|
||||||
|
ldr r5, [r4] @ get value
|
||||||
|
str r5, [r4] @ write back change
|
||||||
|
ldr r4, sdrc_manual_0 @ get config addr
|
||||||
|
mov r5, #0x2 @ autorefresh command
|
||||||
|
str r5, [r4] @ kick off refreshes
|
||||||
|
ldr r4, sdrc_mr_1 @ get config addr
|
||||||
|
ldr r5, [r4] @ get value
|
||||||
|
str r5, [r4] @ write back change
|
||||||
|
ldr r4, sdrc_emr2_1 @ get config addr
|
||||||
|
ldr r5, [r4] @ get value
|
||||||
|
str r5, [r4] @ write back change
|
||||||
|
ldr r4, sdrc_manual_1 @ get config addr
|
||||||
|
mov r5, #0x2 @ autorefresh command
|
||||||
|
str r5, [r4] @ kick off refreshes
|
||||||
|
bx lr
|
||||||
|
sdrc_syscfg:
|
||||||
|
.word SDRC_SYSCONFIG_P
|
||||||
|
sdrc_mr_0:
|
||||||
|
.word SDRC_MR_0_P
|
||||||
|
sdrc_emr2_0:
|
||||||
|
.word SDRC_EMR2_0_P
|
||||||
|
sdrc_manual_0:
|
||||||
|
.word SDRC_MANUAL_0_P
|
||||||
|
sdrc_mr_1:
|
||||||
|
.word SDRC_MR_1_P
|
||||||
|
sdrc_emr2_1:
|
||||||
|
.word SDRC_EMR2_1_P
|
||||||
|
sdrc_manual_1:
|
||||||
|
.word SDRC_MANUAL_1_P
|
||||||
|
ENTRY(es3_sdrc_fix_sz)
|
||||||
|
.word . - es3_sdrc_fix
|
||||||
|
|
||||||
/* Function to call rom code to save secure ram context */
|
/* Function to call rom code to save secure ram context */
|
||||||
ENTRY(save_secure_ram_context)
|
ENTRY(save_secure_ram_context)
|
||||||
|
@ -130,6 +190,24 @@ loop:
|
||||||
bl i_dll_wait
|
bl i_dll_wait
|
||||||
|
|
||||||
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
||||||
|
restore_es3:
|
||||||
|
/*b restore_es3*/ @ Enable to debug restore code
|
||||||
|
ldr r5, pm_prepwstst_core_p
|
||||||
|
ldr r4, [r5]
|
||||||
|
and r4, r4, #0x3
|
||||||
|
cmp r4, #0x0 @ Check if previous power state of CORE is OFF
|
||||||
|
bne restore
|
||||||
|
adr r0, es3_sdrc_fix
|
||||||
|
ldr r1, sram_base
|
||||||
|
ldr r2, es3_sdrc_fix_sz
|
||||||
|
mov r2, r2, ror #2
|
||||||
|
copy_to_sram:
|
||||||
|
ldmia r0!, {r3} @ val = *src
|
||||||
|
stmia r1!, {r3} @ *dst = val
|
||||||
|
subs r2, r2, #0x1 @ num_words--
|
||||||
|
bne copy_to_sram
|
||||||
|
ldr r1, sram_base
|
||||||
|
blx r1
|
||||||
restore:
|
restore:
|
||||||
/* b restore*/ @ Enable to debug restore code
|
/* b restore*/ @ Enable to debug restore code
|
||||||
/* Check what was the reason for mpu reset and store the reason in r9*/
|
/* Check what was the reason for mpu reset and store the reason in r9*/
|
||||||
|
@ -478,12 +556,16 @@ i_dll_delay:
|
||||||
bx lr
|
bx lr
|
||||||
pm_prepwstst_core:
|
pm_prepwstst_core:
|
||||||
.word PM_PREPWSTST_CORE_V
|
.word PM_PREPWSTST_CORE_V
|
||||||
|
pm_prepwstst_core_p:
|
||||||
|
.word PM_PREPWSTST_CORE_P
|
||||||
pm_prepwstst_mpu:
|
pm_prepwstst_mpu:
|
||||||
.word PM_PREPWSTST_MPU_V
|
.word PM_PREPWSTST_MPU_V
|
||||||
pm_pwstctrl_mpu:
|
pm_pwstctrl_mpu:
|
||||||
.word PM_PWSTCTRL_MPU_P
|
.word PM_PWSTCTRL_MPU_P
|
||||||
scratchpad_base:
|
scratchpad_base:
|
||||||
.word SCRATCHPAD_BASE_P
|
.word SCRATCHPAD_BASE_P
|
||||||
|
sram_base:
|
||||||
|
.word SRAM_BASE_P + 0x8000
|
||||||
sdrc_power:
|
sdrc_power:
|
||||||
.word SDRC_POWER_V
|
.word SDRC_POWER_V
|
||||||
clk_stabilize_delay:
|
clk_stabilize_delay:
|
||||||
|
|
|
@ -268,6 +268,7 @@ extern void omap_ctrl_writel(u32 val, u16 offset);
|
||||||
extern void omap3_save_scratchpad_contents(void);
|
extern void omap3_save_scratchpad_contents(void);
|
||||||
extern void omap3_clear_scratchpad_contents(void);
|
extern void omap3_clear_scratchpad_contents(void);
|
||||||
extern u32 *get_restore_pointer(void);
|
extern u32 *get_restore_pointer(void);
|
||||||
|
extern u32 *get_es3_restore_pointer(void);
|
||||||
extern u32 omap3_arm_context[128];
|
extern u32 omap3_arm_context[128];
|
||||||
extern void omap3_control_save_context(void);
|
extern void omap3_control_save_context(void);
|
||||||
extern void omap3_control_restore_context(void);
|
extern void omap3_control_restore_context(void);
|
||||||
|
|
Loading…
Reference in New Issue