Alexander Shishkin <virtuoso@xxxxxxxxx> writes: > This prevents ETM stalls whenever core enters OFF mode. Original patch > author is Richard Woodruff <r-woodruff2@xxxxxx>. > > This patch applies on top of pm branch. There doesn't seem to be any dependencies on PM branch here. Applying to l-o master has a minor conflict with the adding of the base addresses that could be easily fixed. Please rebase onto l-o master. Thanks, Kevin > Signed-off-by: Alexander Shishkin <virtuoso@xxxxxxxxx> > CC: Richard Woodruff <r-woodruff2@xxxxxx> > --- > arch/arm/mach-omap2/Kconfig | 9 ++ > arch/arm/mach-omap2/control.c | 2 +- > arch/arm/mach-omap2/sleep34xx.S | 133 +++++++++++++++++++++++++++++ > arch/arm/plat-omap/include/plat/control.h | 2 +- > 4 files changed, 144 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig > index 606bf04..02ea136 100644 > --- a/arch/arm/mach-omap2/Kconfig > +++ b/arch/arm/mach-omap2/Kconfig > @@ -153,6 +153,15 @@ config MACH_OMAP_4430SDP > bool "OMAP 4430 SDP board" > depends on ARCH_OMAP4 > > +config ENABLE_OFF_MODE_JTAG_ETM_DEBUG > + bool "Enable hardware emulation context save and restore" > + depends on ARCH_OMAP3 > + default y > + help > + This option enables JTAG & ETM debugging across power states. > + With out this option emulation features are reset across OFF > + mode state changes. > + > config OMAP3_EMU > bool "OMAP3 debugging peripherals" > depends on ARCH_OMAP3 > diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c > index cdd1f35..78f4634 100644 > --- a/arch/arm/mach-omap2/control.c > +++ b/arch/arm/mach-omap2/control.c > @@ -93,7 +93,7 @@ void *omap3_secure_ram_storage; > * The address is stored in scratchpad, so that it can be used > * during the restore path. > */ > -u32 omap3_arm_context[128]; > +u32 omap3_arm_context[256]; > > struct omap3_control_regs { > u32 sysconfig; > diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S > index 69521be..0a5ec86 100644 > --- a/arch/arm/mach-omap2/sleep34xx.S > +++ b/arch/arm/mach-omap2/sleep34xx.S > @@ -59,6 +59,13 @@ > #define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) > #define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) > > +#define CORTEX_CORSIGHT_OFF (0x00011000) > +#define CORTEX_EMU_DEBUG_V (L4_EMU_34XX_VIRT + CORTEX_CORSIGHT_OFF) > +#define CORTEX_EMU_DEBUG_P (L4_EMU_34XX_PHYS + CORTEX_CORSIGHT_OFF) > +#define ETM_CORSIGHT_OFF (0x00010000) > +#define CORTEX_EMU_ETM_V (L4_EMU_34XX_VIRT + ETM_CORSIGHT_OFF) > +#define CORTEX_EMU_ETM_P (L4_EMU_34XX_PHYS + ETM_CORSIGHT_OFF) > + > .text > /* Function to aquire the semaphore in scratchpad */ > ENTRY(lock_scratchpad_sem) > @@ -226,6 +233,18 @@ loop: > nop > bl wait_sdrc_ok > > +#ifdef CONFIG_ENABLE_OFF_MODE_JTAG_ETM_DEBUG > + /* > + * Restore Coresight debug registers > + */ > + ldr r6, debug_vbase /* base Vaddr of CortexA8-Debug */ > + ldr r4, debug_xlar_key /* get lock key for OSLAR */ > + bl unlock_debug /* remove global lock if set */ > + ldr r6, etm_vbase /* base Vaddr of ETM */ > + bl unlock_debug /* remove global lock if set */ > + str r6, [r6, #0x300] /* clear OSLAR lock using non-key */ > +#endif > + > ldmfd sp!, {r0-r12, pc} @ restore regs and return > restore_es3: > /*b restore_es3*/ @ Enable to debug restore code > @@ -385,6 +404,50 @@ logic_l1_restore: > /*normal memory remap register */ > MCR p15, 0, r5, c10, c2, 1 > > +#ifdef CONFIG_ENABLE_OFF_MODE_JTAG_ETM_DEBUG > + /* > + * Restore Coresight debug registers > + */ > + ldr r6, debug_pbase /* base paddr of CortexA8-Debug */ > + ldr r4, debug_xlar_key /* get lock key for OSLAR */ > + bl unlock_debug /* remove global lock if set */ > + str r4, [r6, #0x300] /* reset-pointer (already locked) */ > + ldr r4, [r6, #0x308] /* dummy read */ > + ldr r4, [r3], #4 /* load save size */ > + cmp r4, #0 /* check for zero */ > +debug_restore: > + ittt ne /* t2/compat if-then block */ > + ldrne r5, [r3], #4 /* get save value */ > + strne r5, [r6,#0x308] /* restore cp14 value */ > + subnes r4, r4, #1 /* decrement loop */ > + bne debug_restore /* loop till done */ > + str r5, [r6, #0x300] /* clear lock */ > + /* > + * Restore CoreSight ETM registers > + */ > + ldr r6, etm_pbase /* base paddr of ETM */ > + ldr r4, debug_xlar_key /* get lock key for OSLAR */ > + bl unlock_debug /* remove global lock if set */ > + ldr r4, [r3], #4 /* load save size */ > + cmp r4, #0 /* check for zero */ > + beq etm_skip > + sub r4, #1 > + ldr r7, [r3], #4 /* get/store first value to r7 */ > + mov r5, #0x3 /* enable programming in ETMCR*/ > + lsl r5, r5, #10 > + orr r5, r7 > + str r5,[r6], #4 > + cmp r4, #0 /* check for zero */ > +etm_restore: > + ldrne r5, [r3], #4 /* get save value */ > + strne r5, [r6], #4 /* restore cp14 value */ > + subnes r4, r4, #1 /* decrement loop */ > + bne etm_restore /* loop till done */ > + ldr r6, etm_pbase /* base paddr of ETM */ > + str r7,[r6] /* dis-able programming in ETMCR */ > +etm_skip: > +#endif > + > /* Restore cpsr */ > ldmia r3!,{r4} /*load CPSR from SDRAM*/ > msr cpsr, r4 /*store cpsr */ > @@ -506,6 +569,39 @@ l1_logic_lost: > mrc p15, 0, r5, c10, c2, 1 > stmia r8!,{r4-r5} > > +#ifdef CONFIG_ENABLE_OFF_MODE_JTAG_ETM_DEBUG > + /* > + * Save Coresight debug registers > + */ > + ldr r6, debug_vbase /* base vaddr of CortexA8-Debug */ > + ldr r4, debug_xlar_key /* get lock key for OSLAR */ > + bl unlock_debug /* force global unlock */ > + str r4, [r6, #0x300] /* lock debug access */ > + ldr r4, [r6, #0x308] /* OSSRR returns size on first read */ > + str r4, [r8], #4 /* push item to save area */ > + cmp r4, #0 /* zero check */ > +debug_save: > + ittt ne /* thumb 2 compat if-then block */ > + ldrne r5, [r6, #0x308] /* get reg value */ > + strne r5, [r8], #4 /* push item to save area */ > + subnes r4, r4, #1 /* decrement size */ > + bne debug_save /* loop till done */ > + /* > + * Save etm registers > + */ > + ldr r6, etm_vbase /* base vaddr of CortexA8-Debug */ > + ldr r4, debug_xlar_key /* get lock key for OSLAR */ > + bl unlock_debug /* force global unlock */ > + mov r4, #128 /* OSSRR returns size on first read */ > + str r4, [r8], #4 /* push item to save area */ > + cmp r4, #0 /* zero check */ > +etm_save: > + ldrne r5, [r6], #4 /* get reg value */ > + strne r5, [r8], #4 /* push item to save area */ > + subnes r4, r4, #1 /* decrement size */ > + bne etm_save /* loop till done */ > +#endif > + > /* Store current cpsr*/ > mrs r2, cpsr > stmia r8!, {r2} > @@ -520,6 +616,7 @@ clean_caches: > cmp r9, #1 /* Check whether L2 inval is required or not*/ > bne skip_l2_inval > clean_l2: > +#if 0 > /* read clidr */ > mrc p15, 1, r0, c0, c0, 1 > /* extract loc from clidr */ > @@ -586,6 +683,12 @@ finished: > /* select current cache level in cssr */ > mcr p15, 2, r10, c0, c0, 0 > isb > +#else > + ldr r1, kernel_flush /* get 32 bit addr of flush */ > + mov lr, pc /* prepare for return */ > + bx r1 /* do it */ > +#endif > + > skip_l2_inval: > /* Data memory barrier and Data sync barrier */ > mov r1, #0 > @@ -632,6 +735,36 @@ wait_dll_lock: > bne wait_dll_lock > bx lr > > +#ifdef CONFIG_ENABLE_OFF_MODE_JTAG_ETM_DEBUG > + /* > + * unlock debug: > + * Input: > + * r6 has base address of emulation > + * r4 has unlock key > + * Output > + * r5 has PDS value (1=accessable) > + */ > +unlock_debug: > + ldr r5, [r6, #0xfb4] /* get LSR */ > + cmp r5, #0x3 /* need unlocking? */ > + streq r4, [r6, #0xfb0] /* unlock if so */ > + ldr r5, [r6, #0x314] /* clear power status */ > + bx lr /* back to caller */ > + > +debug_vbase: > + .word CORTEX_EMU_DEBUG_V > +debug_pbase: > + .word CORTEX_EMU_DEBUG_P > +etm_vbase: > + .word CORTEX_EMU_ETM_V > +etm_pbase: > + .word CORTEX_EMU_ETM_P > +debug_xlar_key: > + .word 0xC5ACCE55 > +#endif > + > +kernel_flush: > + .word v7_flush_dcache_all > cm_idlest1_core: > .word CM_IDLEST1_CORE_V > sdrc_dlla_status: > diff --git a/arch/arm/plat-omap/include/plat/control.h b/arch/arm/plat-omap/include/plat/control.h > index 69428ff..22c492c 100644 > --- a/arch/arm/plat-omap/include/plat/control.h > +++ b/arch/arm/plat-omap/include/plat/control.h > @@ -324,7 +324,7 @@ extern void omap3_save_scratchpad_contents(void); > extern void omap3_clear_scratchpad_contents(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[256]; > extern void omap3_control_save_context(void); > extern void omap3_control_restore_context(void); > > -- > 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html