Re: [PATCH 3/5] OMAP3630: PM: Erratum i608: disable RTA

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Nishant,

On Tue, Nov 30, 2010 at 01:49, Nishanth Menon <nm@xxxxxx> wrote:
> Erratum id: i608
> RTA (Retention Till Access) feature is not supported and leads to device
> stability issues when enabled. This impacts modules with embedded memories
> on OMAP3630
>
> Workaround is to disable RTA on boot and coming out of core off.
> For disabling rta coming out of off mode, we do this by overriding the
> restore pointer for 3630 to allow us restore handler as the first point of
> entry before caches are touched and is common for GP and HS devices.
> to disable earlier than this could be possible by modifying the ppa for HS
> devices, but not for GP devices.
>
> Signed-off-by: Ambresh K <ambresh@xxxxxx>

not in Cc?

> Signed-off-by: Nishanth Menon <nm@xxxxxx>
> ---
> v2: fixed missing b restore for 3430 es3.1 code.
>        introduced erratum handling logic here splitting it out of uart errata
>        typo fixes for erratum
> v1: http://marc.info/?l=linux-omap&m=129013172825240&w=2
>
>  arch/arm/mach-omap2/control.c   |    5 ++++-
>  arch/arm/mach-omap2/control.h   |    5 +++++
>  arch/arm/mach-omap2/pm34xx.c    |   23 +++++++++++++++++++++++
>  arch/arm/mach-omap2/sleep34xx.S |   26 ++++++++++++++++++++++++++
>  4 files changed, 58 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
> index 1fa3294..728f268 100644
> --- a/arch/arm/mach-omap2/control.c
> +++ b/arch/arm/mach-omap2/control.c
> @@ -241,7 +241,10 @@ void omap3_save_scratchpad_contents(void)
>
>        /* Populate the Scratchpad contents */
>        scratchpad_contents.boot_config_ptr = 0x0;
> -       if (omap_rev() != OMAP3430_REV_ES3_0 &&
> +       if (cpu_is_omap3630())
> +               scratchpad_contents.public_restore_ptr =
> +                       virt_to_phys(get_omap3630_restore_pointer());
> +       else if (omap_rev() != OMAP3430_REV_ES3_0 &&
>                                        omap_rev() != OMAP3430_REV_ES3_1)
>                scratchpad_contents.public_restore_ptr =
>                        virt_to_phys(get_restore_pointer());
> diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
> index b6c6b7c..d7911c5 100644
> --- a/arch/arm/mach-omap2/control.h
> +++ b/arch/arm/mach-omap2/control.h
> @@ -204,6 +204,10 @@
>  #define OMAP343X_CONTROL_WKUP_DEBOBS3 (OMAP343X_CONTROL_GENERAL_WKUP + 0x014)
>  #define OMAP343X_CONTROL_WKUP_DEBOBS4 (OMAP343X_CONTROL_GENERAL_WKUP + 0x018)
>
> +/* 36xx-only RTA - Retention till Accesss control registers and bits */
> +#define OMAP36XX_CONTROL_MEM_RTA_CTRL  0x40C
> +#define OMAP36XX_RTA_DISABLE           0x0
> +
>  /* 34xx D2D idle-related pins, handled by PM core */
>  #define OMAP3_PADCONF_SAD2D_MSTANDBY   0x250
>  #define OMAP3_PADCONF_SAD2D_IDLEACK    0x254
> @@ -347,6 +351,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 *get_omap3630_restore_pointer(void);
>  extern u32 omap3_arm_context[128];
>  extern void omap3_control_save_context(void);
>  extern void omap3_control_restore_context(void);
> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
> index 75c0cd1..bd426cc 100644
> --- a/arch/arm/mach-omap2/pm34xx.c
> +++ b/arch/arm/mach-omap2/pm34xx.c
> @@ -54,6 +54,10 @@
>  #define OMAP343X_TABLE_VALUE_OFFSET       0xc0
>  #define OMAP343X_CONTROL_REG_VALUE_OFFSET  0xc8
>
> +#define RTA_ERRATUM_i608               (1 << 0)
> +static u16 pm34xx_errata;
> +#define IS_PM34XX_ERRATUM(id)          (pm34xx_errata & (id))
> +
>  struct power_state {
>        struct powerdomain *pwrdm;
>        u32 next_state;
> @@ -979,6 +983,14 @@ void omap_push_sram_idle(void)
>                                save_secure_ram_context_sz);
>  }
>
> +static void pm_errata_configure(void)
> +{
> +       if (cpu_is_omap34xx()) {
> +               if (cpu_is_omap3630())

Is it required to have both the cpu_is checks*?  Why?

> +                       pm34xx_errata |= RTA_ERRATUM_i608;
> +       }
> +}
> +

<<snip>>
--
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


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux