L2 cache suspend/resume
Russell King - ARM Linux
linux at arm.linux.org.uk
Sun Apr 6 04:46:52 PDT 2014
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.
More information about the linux-arm-kernel
mailing list