RE: [PATCH 5/6] save and restore etm state across core OFF modes

2010-10-06 Thread ext-madhusudhan.1.gowda
Hi,

> > +   bne debug_restore   /* loop till done */
> > +   str r5, [r6, #ETMMR_OSSRR]  /* clear lock */
I had informed Alexander about the missing OSLAR  to clear the lock and also 
the do_etm_save value does not retain across coreoff since sram size may vary 
across coreoffs. We need to save this do_etm_save value to sdram along with the 
jtag etm debug context and restore it to do_etm_save.

Thanks
Gowda



From: Eduardo Valentin [eduardo.valen...@nokia.com]
Sent: Wednesday, October 06, 2010 2:22 PM
To: Valentin Eduardo (Nokia-MS/Helsinki)
Cc: ext virtu...@slind.org; t...@atomide.com; linux-omap@vger.kernel.org; 
khil...@deeprootsystems.com; r-woodru...@ti.com; Gowda Madhusudhan.1 
(EXT-Elektrobit/Helsinki)
Subject: Re: [PATCH 5/6] save and restore etm state across core OFF modes

Hey,

I think Gowda had also some thoughts about this patch. Cc'ing him.

BR,
On Wed, Oct 06, 2010 at 10:35:09AM +0200, Valentin Eduardo (Nokia-D/Helsinki) 
wrote:
> Hello Alexander,
>
> Few points as follows,
>
> On Sat, May 01, 2010 at 07:38:20PM +0200, ext virtu...@slind.org wrote:
> > From: Alexander Shishkin 
> >
> > This prevents ETM stalls whenever core enters OFF mode. Original patch
> > author is Richard Woodruff .
> >
> > This version of the patch makes use of the ETM OS save/restore mechanism,
> > which takes about 55 words in omap3_arm_context[] instead of 128. Also,
> > saving ETM context can be switched on/off at runtime.
> >
> > Signed-off-by: Alexander Shishkin 
> > CC: Richard Woodruff 
> > ---
> >  arch/arm/mach-omap2/Kconfig   |9 ++
> >  arch/arm/mach-omap2/control.c |2 +-
> >  arch/arm/mach-omap2/sleep34xx.S   |  135 
> > +
> >  arch/arm/plat-omap/include/plat/control.h |2 +-
> >  4 files changed, 146 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> > index 2455dcc..5460bfe 100644
> > --- a/arch/arm/mach-omap2/Kconfig
> > +++ b/arch/arm/mach-omap2/Kconfig
> > @@ -150,6 +150,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 43f8a33..70b1674 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 d522cd7..cd6a1d4 100644
> > --- a/arch/arm/mach-omap2/sleep34xx.S
> > +++ b/arch/arm/mach-omap2/sleep34xx.S
> > @@ -28,6 +28,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >
> >  #include "cm.h"
> >  #include "prm.h"
> > @@ -226,6 +227,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, #ETMMR_OSLAR]  /* 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 +398,44 @@ logic_l1_restore:
> > /*normal memory remap register */
> > MCR p15, 0, r5, c10, c2, 1
>

Re: [PATCH 5/6] save and restore etm state across core OFF modes

2010-10-06 Thread Eduardo Valentin
Hey,

I think Gowda had also some thoughts about this patch. Cc'ing him.

BR,
On Wed, Oct 06, 2010 at 10:35:09AM +0200, Valentin Eduardo (Nokia-D/Helsinki) 
wrote:
> Hello Alexander,
> 
> Few points as follows,
> 
> On Sat, May 01, 2010 at 07:38:20PM +0200, ext virtu...@slind.org wrote:
> > From: Alexander Shishkin 
> > 
> > This prevents ETM stalls whenever core enters OFF mode. Original patch
> > author is Richard Woodruff .
> > 
> > This version of the patch makes use of the ETM OS save/restore mechanism,
> > which takes about 55 words in omap3_arm_context[] instead of 128. Also,
> > saving ETM context can be switched on/off at runtime.
> > 
> > Signed-off-by: Alexander Shishkin 
> > CC: Richard Woodruff 
> > ---
> >  arch/arm/mach-omap2/Kconfig   |9 ++
> >  arch/arm/mach-omap2/control.c |2 +-
> >  arch/arm/mach-omap2/sleep34xx.S   |  135 
> > +
> >  arch/arm/plat-omap/include/plat/control.h |2 +-
> >  4 files changed, 146 insertions(+), 2 deletions(-)
> > 
> > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> > index 2455dcc..5460bfe 100644
> > --- a/arch/arm/mach-omap2/Kconfig
> > +++ b/arch/arm/mach-omap2/Kconfig
> > @@ -150,6 +150,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 43f8a33..70b1674 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 d522cd7..cd6a1d4 100644
> > --- a/arch/arm/mach-omap2/sleep34xx.S
> > +++ b/arch/arm/mach-omap2/sleep34xx.S
> > @@ -28,6 +28,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  
> >  #include "cm.h"
> >  #include "prm.h"
> > @@ -226,6 +227,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, #ETMMR_OSLAR]  /* 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 +398,44 @@ 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, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
> > +   ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
> > +   ldr r4, [r3], #4/* load save size */
> > +   cmp r4, #0  /* check for zero */
> > +debug_restore:
> > +   itttne  /* t2/compat if-then block */
> > +   ldrne   r5, [r3], #4/* get saved value */
> > +   strne   r5, [r6,#ETMMR_OSSRR]   /* restore saved value */
> > +   subnes  r4, r4, #1  /* decrement loop */
> > +   bne debug_restore   /* loop till done */
> > +   str r5, [r6, #ETMMR_OSSRR]  /* clear lock */
> 
> Maybe you mean ETMMR_OSLAR?
> 
> > +   /*
> > +* 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 */
> > +   str r4, [r6, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
> > +   ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
> > +   ldr r4, [r3],

Re: [PATCH 5/6] save and restore etm state across core OFF modes

2010-10-06 Thread Eduardo Valentin
Hello Alexander,

Few points as follows,

On Sat, May 01, 2010 at 07:38:20PM +0200, ext virtu...@slind.org wrote:
> From: Alexander Shishkin 
> 
> This prevents ETM stalls whenever core enters OFF mode. Original patch
> author is Richard Woodruff .
> 
> This version of the patch makes use of the ETM OS save/restore mechanism,
> which takes about 55 words in omap3_arm_context[] instead of 128. Also,
> saving ETM context can be switched on/off at runtime.
> 
> Signed-off-by: Alexander Shishkin 
> CC: Richard Woodruff 
> ---
>  arch/arm/mach-omap2/Kconfig   |9 ++
>  arch/arm/mach-omap2/control.c |2 +-
>  arch/arm/mach-omap2/sleep34xx.S   |  135 
> +
>  arch/arm/plat-omap/include/plat/control.h |2 +-
>  4 files changed, 146 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> index 2455dcc..5460bfe 100644
> --- a/arch/arm/mach-omap2/Kconfig
> +++ b/arch/arm/mach-omap2/Kconfig
> @@ -150,6 +150,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 43f8a33..70b1674 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 d522cd7..cd6a1d4 100644
> --- a/arch/arm/mach-omap2/sleep34xx.S
> +++ b/arch/arm/mach-omap2/sleep34xx.S
> @@ -28,6 +28,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include "cm.h"
>  #include "prm.h"
> @@ -226,6 +227,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, #ETMMR_OSLAR]  /* 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 +398,44 @@ 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, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
> + ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
> + ldr r4, [r3], #4/* load save size */
> + cmp r4, #0  /* check for zero */
> +debug_restore:
> + itttne  /* t2/compat if-then block */
> + ldrne   r5, [r3], #4/* get saved value */
> + strne   r5, [r6,#ETMMR_OSSRR]   /* restore saved value */
> + subnes  r4, r4, #1  /* decrement loop */
> + bne debug_restore   /* loop till done */
> + str r5, [r6, #ETMMR_OSSRR]  /* clear lock */

Maybe you mean ETMMR_OSLAR?

> + /*
> +  * 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 */
> + str r4, [r6, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
> + ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
> + ldr r4, [r3], #4/* load save size */
> + cmp r4, #0  /* check for zero */
> + beq etm_skip
> +etm_restore:
> + ldrne   r5, [r3], #4/* get saved value */
> + strne   r5, [r6, #ETMMR_OSSRR]  /* restore saved value */
> + subnes  r4, r4, #1  /* 

[PATCH 5/6] save and restore etm state across core OFF modes

2010-05-01 Thread virtuoso
From: Alexander Shishkin 

This prevents ETM stalls whenever core enters OFF mode. Original patch
author is Richard Woodruff .

This version of the patch makes use of the ETM OS save/restore mechanism,
which takes about 55 words in omap3_arm_context[] instead of 128. Also,
saving ETM context can be switched on/off at runtime.

Signed-off-by: Alexander Shishkin 
CC: Richard Woodruff 
---
 arch/arm/mach-omap2/Kconfig   |9 ++
 arch/arm/mach-omap2/control.c |2 +-
 arch/arm/mach-omap2/sleep34xx.S   |  135 +
 arch/arm/plat-omap/include/plat/control.h |2 +-
 4 files changed, 146 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 2455dcc..5460bfe 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -150,6 +150,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 43f8a33..70b1674 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 d522cd7..cd6a1d4 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "cm.h"
 #include "prm.h"
@@ -226,6 +227,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, #ETMMR_OSLAR]  /* 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 +398,44 @@ 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, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
+   ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
+   ldr r4, [r3], #4/* load save size */
+   cmp r4, #0  /* check for zero */
+debug_restore:
+   itttne  /* t2/compat if-then block */
+   ldrne   r5, [r3], #4/* get saved value */
+   strne   r5, [r6,#ETMMR_OSSRR]   /* restore saved value */
+   subnes  r4, r4, #1  /* decrement loop */
+   bne debug_restore   /* loop till done */
+   str r5, [r6, #ETMMR_OSSRR]  /* 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 */
+   str r4, [r6, #ETMMR_OSLAR]  /* reset-pointer (already locked) */
+   ldr r4, [r6, #ETMMR_OSSRR]  /* dummy read */
+   ldr r4, [r3], #4/* load save size */
+   cmp r4, #0  /* check for zero */
+   beq etm_skip
+etm_restore:
+   ldrne   r5, [r3], #4/* get saved value */
+   strne   r5, [r6, #ETMMR_OSSRR]  /* restore saved value */
+   subnes  r4, r4, #1  /* decrement loop */
+   bne etm_restore /* loop till done */
+etm_skip:
+   str r6, [r6, #ETMMR_OSLAR]  /* remove OS lock */
+#endif
+
/* Restore cpsr */
ldmia   r3!,{r4}/*load CPSR from SDRAM*/
msr cpsr, r4