* L2 cache suspend/resume
@ 2014-04-05 11:27 Russell King - ARM Linux
2014-04-06 11:40 ` Shawn Guo
2014-04-07 15:35 ` Stephen Warren
0 siblings, 2 replies; 6+ messages in thread
From: Russell King - ARM Linux @ 2014-04-05 11:27 UTC (permalink / raw)
To: linux-arm-kernel
While looking through the L2 resume code paths, I notice that:
* exynos
* imx
* tegra
all resume their L2 caches from assembly code, rather than using
outer_disable() before cpu_suspend(), and outer_resume() afterwards.
>From what I can see, these are all running in the secure world, so that
isn't the reason.
What is the reason for this difference? Can these three be converted to
the outer_disable()...outer_resume() method?
--
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly
improving, and getting towards what was expected from it.
^ permalink raw reply [flat|nested] 6+ messages in thread* L2 cache suspend/resume 2014-04-05 11:27 L2 cache suspend/resume Russell King - ARM Linux @ 2014-04-06 11:40 ` Shawn Guo 2014-04-06 11:46 ` Russell King - ARM Linux 2014-04-07 15:35 ` Stephen Warren 1 sibling, 1 reply; 6+ messages in thread From: Shawn Guo @ 2014-04-06 11:40 UTC (permalink / raw) To: linux-arm-kernel On Sat, Apr 05, 2014 at 12:27:00PM +0100, Russell King - ARM Linux wrote: > While looking through the L2 resume code paths, I notice that: > > * exynos > * imx > * tegra > > all resume their L2 caches from assembly code, rather than using > outer_disable() before cpu_suspend(), and outer_resume() afterwards. > From what I can see, these are all running in the secure world, so that > isn't the reason. > > What is the reason for this difference? Can these three be converted to > the outer_disable()...outer_resume() method? For imx, the L2 power and therefore the memory array is retained in suspend. We do not want to call outer_disable() to have these data flushed, and need to restore L2 controller before MMU is enabled. Shawn ^ permalink raw reply [flat|nested] 6+ messages in thread
* L2 cache suspend/resume 2014-04-06 11:40 ` Shawn Guo @ 2014-04-06 11:46 ` Russell King - ARM Linux 2014-04-06 12:19 ` Shawn Guo 0 siblings, 1 reply; 6+ messages in thread From: Russell King - ARM Linux @ 2014-04-06 11:46 UTC (permalink / raw) To: linux-arm-kernel On Sun, Apr 06, 2014 at 07:40:35PM +0800, Shawn Guo wrote: > On Sat, Apr 05, 2014 at 12:27:00PM +0100, Russell King - ARM Linux wrote: > > While looking through the L2 resume code paths, I notice that: > > > > * exynos > > * imx > > * tegra > > > > all resume their L2 caches from assembly code, rather than using > > outer_disable() before cpu_suspend(), and outer_resume() afterwards. > > From what I can see, these are all running in the secure world, so that > > isn't the reason. > > > > What is the reason for this difference? Can these three be converted to > > the outer_disable()...outer_resume() method? > > For imx, the L2 power and therefore the memory array is retained in > suspend. We do not want to call outer_disable() to have these data > flushed, and need to restore L2 controller before MMU is enabled. Okay, any objection then to separating out the L2 resume code into an early L2 resume helper in arch/arm/mm ? I currently have this prototyped: ENTRY(l2c310_early_resume) adr r0, 1f ldr r2, [r0] add r0, r2, r0 ldmia r0, {r1, r2, r3, r4, r5, r6, r7, r8} @ r1 = phys address of L2C-310 controller @ r2 = aux_ctrl @ r3 = tag_latency @ r4 = data_latency @ r5 = filter_start @ r6 = filter_end @ r7 = prefetch_ctrl @ r8 = pwr_ctrl @ Check that the address has been initialised teq r1, #0 moveq pc, lr @ The prefetch and power control registers are revision dependent @ and can be written whether or not the L2 cache is enabled ldr r0, [r1, #L2X0_CACHE_ID] and r0, r0, #L2X0_CACHE_ID_RTL_MASK cmp r0, #L310_CACHE_ID_RTL_R2P0 strcs r7, [r1, #L310_PREFETCH_CTRL] cmp r0, #L310_CACHE_ID_RTL_R3P0 strcs r8, [r1, #L310_POWER_CTRL] @ Don't setup the L2 cache if it is already enabled ldr r0, [r1, #L2X0_CTRL] tst r0, #L2X0_CTRL_EN movne pc, lr str r3, [r1, #L310_TAG_LATENCY_CTRL] str r4, [r1, #L310_DATA_LATENCY_CTRL] str r6, [r1, #L310_ADDR_FILTER_END] str r5, [r1, #L310_ADDR_FILTER_START] str r2, [r1, #L2X0_AUX_CTRL] mov r9, #L2X0_CTRL_EN str r9, [r1, #L2X0_CTRL] mov pc, lr ENDPROC(l2c310_early_resume) .align 1: .long l2x0_saved_regs - . and suspend-imx6.S becomes: ENTRY(v7_cpu_resume) bl v7_invalidate_l1 #ifdef CONFIG_CACHE_L2X0 bl l2c310_early_resume #endif b cpu_resume ENDPROC(v7_cpu_resume) and similar for the other two SoCs. -- FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it. ^ permalink raw reply [flat|nested] 6+ messages in thread
* L2 cache suspend/resume 2014-04-06 11:46 ` Russell King - ARM Linux @ 2014-04-06 12:19 ` Shawn Guo 0 siblings, 0 replies; 6+ messages in thread From: Shawn Guo @ 2014-04-06 12:19 UTC (permalink / raw) To: linux-arm-kernel On Sun, Apr 06, 2014 at 12:46:52PM +0100, Russell King - ARM Linux wrote: > > For imx, the L2 power and therefore the memory array is retained in > > suspend. We do not want to call outer_disable() to have these data > > flushed, and need to restore L2 controller before MMU is enabled. > > Okay, any objection then to separating out the L2 resume code into an > early L2 resume helper in arch/arm/mm ? Move platform code into core is always a nice thing for platform maintainers, so no objection from me :) Shawn ^ permalink raw reply [flat|nested] 6+ messages in thread
* L2 cache suspend/resume 2014-04-05 11:27 L2 cache suspend/resume Russell King - ARM Linux 2014-04-06 11:40 ` Shawn Guo @ 2014-04-07 15:35 ` Stephen Warren 2014-04-08 2:46 ` Joseph Lo 1 sibling, 1 reply; 6+ messages in thread From: Stephen Warren @ 2014-04-07 15:35 UTC (permalink / raw) To: linux-arm-kernel On 04/05/2014 05:27 AM, Russell King - ARM Linux wrote: > While looking through the L2 resume code paths, I notice that: > > * exynos > * imx > * tegra > > all resume their L2 caches from assembly code, rather than using > outer_disable() before cpu_suspend(), and outer_resume() afterwards. > From what I can see, these are all running in the secure world, so that > isn't the reason. > > What is the reason for this difference? Can these three be converted to > the outer_disable()...outer_resume() method? Joseph, Peter, can you please comment on this. Thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
* L2 cache suspend/resume 2014-04-07 15:35 ` Stephen Warren @ 2014-04-08 2:46 ` Joseph Lo 0 siblings, 0 replies; 6+ messages in thread From: Joseph Lo @ 2014-04-08 2:46 UTC (permalink / raw) To: linux-arm-kernel On 04/07/2014 11:35 PM, Stephen Warren wrote: > On 04/05/2014 05:27 AM, Russell King - ARM Linux wrote: >> While looking through the L2 resume code paths, I notice that: >> >> * exynos >> * imx >> * tegra >> >> all resume their L2 caches from assembly code, rather than using >> outer_disable() before cpu_suspend(), and outer_resume() afterwards. >> From what I can see, these are all running in the secure world, so that >> isn't the reason. >> >> What is the reason for this difference? Can these three be converted to >> the outer_disable()...outer_resume() method? > Joseph, Peter, can you please comment on this. Thanks. For Tegra, the L2 RAM were not in the same power domain as CPU cluster. We retain the L2 data across the CPU cluster power down state and only restore the L2 controller before MMU got enabled in the resume flow. And read the other mail from Russell that add these support into common code, that's nice for us too. We don't need to separate the same code for different SoCs that needs the same method. :) -Joseph ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-04-08 2:46 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-04-05 11:27 L2 cache suspend/resume Russell King - ARM Linux 2014-04-06 11:40 ` Shawn Guo 2014-04-06 11:46 ` Russell King - ARM Linux 2014-04-06 12:19 ` Shawn Guo 2014-04-07 15:35 ` Stephen Warren 2014-04-08 2:46 ` Joseph Lo
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).