From: Santosh Shilimkar <santosh.shilimkar@ti.com>
To: linux-omap@vger.kernel.org
Cc: khilman@ti.com, rnayak@ti.com,
linux-arm-kernel@lists.infradead.org,
Santosh Shilimkar <santosh.shilimkar@ti.com>
Subject: [PATCH v2 12/19] OMAP4: PM: Add L2 cache lowpower support
Date: Thu, 10 Mar 2011 19:38:08 +0530 [thread overview]
Message-ID: <1299766095-23879-13-git-send-email-santosh.shilimkar@ti.com> (raw)
In-Reply-To: <1299766095-23879-1-git-send-email-santosh.shilimkar@ti.com>
When MPUSS hits off-mode e, L2 cache is lost. This patch adds L2X0
necessary maintenance operations and context restoration in the
low power code.
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
---
arch/arm/mach-omap2/omap4-mpuss-lowpower.c | 18 ++++++++
arch/arm/mach-omap2/omap4-sar-layout.h | 2 +
arch/arm/mach-omap2/sleep44xx.S | 65 ++++++++++++++++++++++++++++
3 files changed, 85 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/omap4-mpuss-lowpower.c b/arch/arm/mach-omap2/omap4-mpuss-lowpower.c
index ddf5b72..026c955 100644
--- a/arch/arm/mach-omap2/omap4-mpuss-lowpower.c
+++ b/arch/arm/mach-omap2/omap4-mpuss-lowpower.c
@@ -49,6 +49,7 @@
#include <asm/system.h>
#include <asm/irq.h>
#include <asm/hardware/gic.h>
+#include <asm/hardware/cache-l2x0.h>
#include <plat/omap44xx.h>
#include <mach/omap4-common.h>
@@ -336,6 +337,21 @@ ret:
return 0;
}
+static void save_l2x0_auxctrl(void)
+{
+#ifdef CONFIG_CACHE_L2X0
+ /*
+ * Save the L2X0 AUXCTRL value to SAR memory. Its used to
+ * in every restore patch MPUSS OFF path.
+ */
+ void __iomem *l2x0_base = omap4_get_l2cache_base();
+ u32 val;
+
+ val = __raw_readl(l2x0_base + L2X0_AUX_CTRL);
+ __raw_writel(val, sar_base + L2X0_AUXCTRL_OFFSET);
+#endif
+}
+
/*
* Initialise OMAP4 MPUSS
*/
@@ -418,6 +434,8 @@ int __init omap4_mpuss_init(void)
for (i = 0; i < max_spi_reg; i++)
sar_writel(GIC_ISR_NON_SECURE, ICDISR_SPI_OFFSET, i);
+ save_l2x0_auxctrl();
+
return 0;
}
diff --git a/arch/arm/mach-omap2/omap4-sar-layout.h b/arch/arm/mach-omap2/omap4-sar-layout.h
index 3f3e3c9..c72c0c5 100644
--- a/arch/arm/mach-omap2/omap4-sar-layout.h
+++ b/arch/arm/mach-omap2/omap4-sar-layout.h
@@ -25,6 +25,8 @@
#define MMU_OFFSET 0xd00
#define SCU_OFFSET0 0xd20
#define SCU_OFFSET1 0xd24
+#define L2X0_OFFSET 0xd28
+#define L2X0_AUXCTRL_OFFSET 0xd2c
/* CPUx Wakeup Non-Secure Physical Address offsets in SAR_BANK3 */
#define CPU0_WAKEUP_NS_PA_ADDR_OFFSET 0xa04
diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep44xx.S
index 1d166ef..4dd55c4 100644
--- a/arch/arm/mach-omap2/sleep44xx.S
+++ b/arch/arm/mach-omap2/sleep44xx.S
@@ -13,6 +13,7 @@
#include <asm/system.h>
#include <asm/smp_scu.h>
#include <asm/memory.h>
+#include <asm/hardware/cache-l2x0.h>
#include <plat/omap44xx.h>
#include <mach/omap4-common.h>
@@ -59,8 +60,10 @@ ENTRY(omap4_cpu_suspend)
cmp r1, #0x0
beq do_WFI @ Nothing to save, jump to WFI
mov r5, r0
+ mov r6, r1
bl omap4_get_sar_ram_base
mov r8, r0
+ str r6, [r8, #L2X0_OFFSET] @ Store save state
ands r5, r5, #0x0f
orreq r8, r8, #CPU0_SAVE_OFFSET
orrne r8, r8, #CPU1_SAVE_OFFSET
@@ -138,6 +141,42 @@ ENTRY(omap4_cpu_suspend)
ldrne r1, [r8, #SCU_OFFSET1]
bl omap4_get_scu_base
bl scu_power_mode
+ isb
+ dsb
+
+#ifdef CONFIG_CACHE_L2X0
+ /*
+ * Clean and invalidate the L2 cache.
+ * Common cache-l2x0.c functions can't be used here since it
+ * uses spinlocks. We are out of coherency here with data cache
+ * disabled. The spinlock implementation uses exclusive load/store
+ * instruction which can fail without data cache being enabled.
+ * OMAP4 hardware doesn't support exclusive monitor which can
+ * overcome exclusive access issue. Because of this, CPU can
+ * lead to deadlock.
+ */
+l2x_clean_inv:
+ bl omap4_get_sar_ram_base
+ mov r8, r0
+ ldr r0, [r8, #L2X0_OFFSET]
+ cmp r0, #3
+ bne do_WFI
+ bl omap4_get_l2cache_base
+ mov r2, r0
+ mov r0, #0xff
+ str r0, [r2, #L2X0_CLEAN_WAY]
+wait:
+ ldr r0, [r2, #L2X0_CLEAN_WAY]
+ ands r0, r0, #0xff
+ bne wait
+l2x_sync:
+ mov r0, #0x0
+ str r0, [r2, #L2X0_CACHE_SYNC]
+sync:
+ ldr r0, [r2, #L2X0_CACHE_SYNC]
+ ands r0, r0, #0x1
+ bne sync
+#endif
do_WFI:
/*
@@ -199,6 +238,32 @@ ENDPROC(omap4_cpu_suspend)
*/
ENTRY(omap4_cpu_resume)
+#ifdef CONFIG_CACHE_L2X0
+ /*
+ * Restore the L2 AUXCTRL and enable the L2 cache.
+ * 0x109 = Program the L2X0 AUXCTRL
+ * 0x102 = Enable the L2 using L2X0 CTRL
+ * register r0 contains value to be programmed.
+ * L2 cache is already invalidate by ROM code as part
+ * of MPUSS OFF wakeup path.
+ */
+ ldr r2, =OMAP44XX_L2CACHE_BASE
+ ldr r0, [r2, #L2X0_CTRL]
+ and r0, #0x0f
+ cmp r0, #1
+ beq skip_l2en @ Skip if already enabled
+ ldr r3, =OMAP44XX_SAR_RAM_BASE
+ ldr r0, [r3, #L2X0_AUXCTRL_OFFSET]
+ ldr r12, =0x109 @ Setup L2 AUXCTRL value
+ dsb
+ smc #0
+ mov r0, #0x1
+ ldr r12, =0x102 @ Enable L2 Cache controller
+ dsb
+ smc #0
+skip_l2en:
+#endif
+
/*
* Check the wakeup cpuid and use appropriate
* SAR BANK location for context restore.
--
1.6.0.4
next prev parent reply other threads:[~2011-03-10 14:08 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-10 14:07 [PATCH v2 00/19] OMAP4: PM: Suspend, CPU-hotplug and CPUilde support Santosh Shilimkar
2011-03-10 14:07 ` [PATCH v2 01/19] OMAP4: PM: Add omap WakeupGen module support Santosh Shilimkar
2011-03-10 14:07 ` [PATCH v2 02/19] OMAP4: Use WARN_ON() instead of BUG_ON() with graceful exit Santosh Shilimkar
2011-03-10 14:07 ` [PATCH v2 03/19] OMAP4: PM: Export omap4_get_base*() rather than global address pointers Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 04/19] OMAP4: PM: Add SAR RAM support Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 05/19] OMAP4: PM: Add CPUX OFF mode support Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 06/19] OMAP4: PM: Initialise all the clockdomains to supported states Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 07/19] OMAP4: PM: Program CPU1 to hit OFF when off-lined Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 08/19] OMAP4: PM: CPU1 wakeup workaround from Low power modes Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 09/19] OMAP4: PM: Add GIC distributor and interface enable/disable accessory API Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 10/19] OMAP4: PM: Add GIC save/restore support Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 11/19] OMAP4: PM: Add WakeupGen " Santosh Shilimkar
2011-03-10 14:08 ` Santosh Shilimkar [this message]
2011-03-10 14:08 ` [PATCH v2 13/19] OMAP4: suspend: Add MPUSS RET and OFF support Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 14/19] OMAP4: pm-debug: Add wakeup timer and debug counters Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 15/19] OMAP4: cpuidle: Basic CPUidle support Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 16/19] OMAP4: cpuidle: Add MPUSS RET OFF states Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 17/19] OMAP4: cpuidle: Switch to gptimer from twd in deeper C-states Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 18/19] OMAP4: cpuidle: Add CPU hotplug notifier and prepare() hook Santosh Shilimkar
2011-03-10 14:08 ` [PATCH v2 19/19] OMAP4: Remove un-used do_wfi() macro Santosh Shilimkar
2011-03-10 19:11 ` [PATCH v2 00/19] OMAP4: PM: Suspend, CPU-hotplug and CPUilde support Kevin Hilman
2011-03-11 1:42 ` Kevin Hilman
2011-03-11 5:52 ` Santosh Shilimkar
2011-03-11 15:52 ` Kevin Hilman
2011-03-11 17:26 ` [PATCH v2 00/19] OMAP4: PM: Suspend,CPU-hotplug " Santosh Shilimkar
2011-03-11 17:50 ` Kevin Hilman
2011-03-11 17:58 ` Santosh Shilimkar
2011-03-11 18:03 ` Kevin Hilman
2011-03-11 18:13 ` Santosh Shilimkar
2011-03-11 19:53 ` Santosh Shilimkar
2011-03-11 12:31 ` [PATCH v2 00/19] OMAP4: PM: Suspend, CPU-hotplug " Santosh Shilimkar
2011-03-11 15:56 ` Kevin Hilman
2011-03-11 17:06 ` Santosh Shilimkar
2011-03-24 15:09 ` Kevin Hilman
2011-03-25 7:05 ` Santosh Shilimkar
2011-03-25 15:24 ` Kevin Hilman
2011-03-25 15:30 ` Santosh Shilimkar
2011-03-28 10:47 ` Santosh Shilimkar
2011-03-28 11:02 ` Santosh Shilimkar
2011-03-28 15:56 ` Kevin Hilman
2011-03-28 16:02 ` Santosh Shilimkar
2011-03-28 16:10 ` Kevin Hilman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1299766095-23879-13-git-send-email-santosh.shilimkar@ti.com \
--to=santosh.shilimkar@ti.com \
--cc=khilman@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=rnayak@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).