[RFC PATCH v5] ARM hibernation / suspend-to-disk (fwd)

Barry Song 21cnbao at gmail.com
Fri Sep 30 03:48:23 EDT 2011


Hi Frank,

2011/6/13 Frank Hofmann <frank.hofmann at tomtom.com>:
> Hi,
>
> to make one thing clear to start with:
>
> This is not a proposal to integrate the hibernation feature into mainline.
>
> It's not ripe for that because it's unclear what exactly the differences are
> between what the hibernation / S2RAM codepaths have to do, and/or how much
> code sharing between these codepaths is advisable.
>
>
> Therefore, I'm merely putting this out as-is as a reference / base for those
> who want to do their own experiments with the feature.
>
> Prerequisites:
>
> * The patch requires a working cpu_reset(); for v6/v7, that's in Will
>  Deacon's patch series from last week.
>
> * It also requires being able to take the address of cpu_reset and
>  on MULTI_CPU configs therefore, again see Will Deacon's patch series.
>
> * It uses on cpu_suspend() / cpu_resume(), therefore a recent-enough
>  kernel (or a port of those to whatever you're using) is required.
>
>
> Important / Limitations:
>
> A) For platforms that currently use cpu_suspend/cpu_resume in their s2ram
>  codepaths AND DO NOTHING ELSE BEFORE AND NOTHING ELSE AFTER THAT BUT TO
>  "ENTER LOW POWER", the way the hibernation state snapshot for the CPU
>  core is done by this patch is sufficient.
>
>  To make it clear: IF AND ONLY IF your suspend(-to-ram) func looks like:
>
>        ENTRY(acmeSoC_cpu_suspend)
>                stmfd   sp!, {r4-r12,lr}
>                ldr     r3, resume_mmu_done
>                bl      cpu_suspend
>        resume_mmu_done:
>                ldmfd   sp!, {r3-r12,pc}
>        ENDPROC(acmeSoC_cpu_suspend)
>
>  then this patch is ok to provide hibernation support for your CPU core.
>
>  In all other cases, item B).
>
>  IN ALL CASES, read item C) below; there's more than the core to the SoC.
>
> B) If there's any cpu-specific / SoC-specific state that needs (re)init
>  over a suspend-to-disk/resume-from-disk cycle, this patch is incomplete
>  because it provides no hooks/code for that.
>
>  This is the case e.g. for "secure" SoCs that have different sets of
>  control registers and/or different CR reg access patterns.
>
>  It's also the case e.g. for SoCs with L2 caches as the activation
>  sequence there is SoC-dependent; a full off-on cycle for L2 is not done
>  by the hibernation support code.
>
>  It's also the case if the SoC requires steps on wakeup _before_ the
>  "generic" parts done by cpu_suspend / cpu_resume can work correctly.
>
>  (OMAP is an example of such a SoC; the patch "works" on OMAP in the
>  sense that it gets you a non-secure OMAP back from hibernation but as
>  mentioned, your mileage may vary; I for example don't know what the
>  consequences  of not disabling / reenabling the L2 cache over cpu_reset
>  are)
>
> C) The current low-power handling may perform SoC-specific tasks such
>  as GPIO state handling, which is currently also not addressed by this
>  patch; the assumption is rather that device suspend/resume deals with
>  this. That is not guaranteed to be complete / sufficient - if your SoC
>  and/or your device drivers have particular needs in this area, you can
>  put hooks performing these actions into save_/restore_processor_state().
>
> D) If you wish to extend this to a SoC for which the generic CPU core
>  hooks (i.e. what cpu_suspend/resume provide) are either insufficient
>  or unavailable, hook your own state snapshot mechanism into the places
>  where this code currently calls cpu_suspend and cpu_resume. The main
>  assumption by the assembly code within swusp_arch_resume() is that
>  __swsusp_arch_restore_image() returns to its caller with the stack
>  restored - how you achieve that is up to you, the patch as-is does it
>  by cpu_reset(cpu_resume) but your mileage may vary.
>
>
> I will, at this point, not send further iterations of this patch.
>
> I'll answer questions about it though, if there are any.

i did bring-up prima2(cortex-a9) swsusp hibernation support based on
your patch. i am considering whether we can have some ways to make the
resume faster.

Now the resume flow is:
[1] poweron -> bootloader -> kernel -> all boot and device probed ->
late_init() -> loading snapshot from disk to memory -> resume devices
and software

Is it possible we make it:
[2] poweron -> bootloader -> loading snapshot from disk to memory ->
resume devices and software

Then the sub-process "bootloader -> kernel -> all boot and device
probed -> late_init()" will be eliminated and time to boot kernel will
not be needed too.

the flow [2] is more platform-related. so it is probably we can use
platform_hibernation_ops to handle. but it can be generic as well.

>
>
> Thanks for all the comments during the previous threads - learned a lot !
>
>
> Best regards,
> FrankH.

-barry



More information about the linux-arm-kernel mailing list