Thread (32 messages) 32 messages, 7 authors, 2011-02-28
STALE5574d

[PATCH v3 2/5] ARM: pm: add generic CPU suspend/resume support

From: Colin Cross <hidden>
Date: 2011-02-08 08:08:36

On Mon, Feb 7, 2011 at 8:17 AM, Russell King - ARM Linux
[off-list ref] wrote:

<snip>
quoted hunk ↗ jump to hunk
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
new file mode 100644
index 0000000..9f106fa
--- /dev/null
+++ b/arch/arm/kernel/sleep.S
@@ -0,0 +1,110 @@
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/assembler.h>
+#include <asm/glue-cache.h>
+#include <asm/glue-proc.h>
+ ? ? ? .text
+
+/*
+ * Save CPU state for a suspend
+ * ?r1 = v:p offset
+ * ?r3 = virtual return function
+ * Note: sp is decremented to allocate space for CPU state on stack
+ * r0-r3,r9,r10,lr corrupted
+ */
+ENTRY(cpu_suspend)
+ ? ? ? mov ? ? r9, lr
+#ifdef MULTI_CPU
+ ? ? ? ldr ? ? r10, =processor
+ ? ? ? mov ? ? r2, sp ? ? ? ? ? ? ? ? ?@ current virtual SP
+ ? ? ? ldr ? ? r0, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
+ ? ? ? ldr ? ? ip, [r10, #CPU_DO_RESUME] @ virtual resume function
+ ? ? ? sub ? ? sp, sp, r0 ? ? ? ? ? ? ?@ allocate CPU state on stack
+ ? ? ? mov ? ? r0, sp ? ? ? ? ? ? ? ? ?@ save pointer
+ ? ? ? add ? ? ip, ip, r1 ? ? ? ? ? ? ?@ convert resume fn to phys
+ ? ? ? stmfd ? sp!, {r1, r2, r3, ip} ? @ save v:p, virt SP, retfn, phys resume fn
+ ? ? ? ldr ? ? r3, =sleep_save_sp
The global variable will prevent using this function to save the state
of multiple CPUs during idle.

<snip>
quoted hunk ↗ jump to hunk
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 0c1172b..a5187dd 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
<snip>
+/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
+.globl cpu_v7_suspend_size
+.equ ? cpu_v7_suspend_size, 4 * 8
+#ifdef CONFIG_PM
+ENTRY(cpu_v7_do_suspend)
+ ? ? ? stmfd ? sp!, {r4 - r11, lr}
+ ? ? ? mrc ? ? p15, 0, r4, c13, c0, 0 ?@ FCSE/PID
+ ? ? ? mrc ? ? p15, 0, r5, c13, c0, 1 ?@ Context ID
+ ? ? ? mrc ? ? p15, 0, r6, c3, c0, 0 ? @ Domain ID
+ ? ? ? mrc ? ? p15, 0, r7, c2, c0, 0 ? @ TTB 0
+ ? ? ? mrc ? ? p15, 0, r8, c2, c0, 1 ? @ TTB 1
+ ? ? ? mrc ? ? p15, 0, r9, c1, c0, 0 ? @ Control register
+ ? ? ? mrc ? ? p15, 0, r10, c1, c0, 1 ?@ Auxiliary control register
+ ? ? ? mrc ? ? p15, 0, r11, c1, c0, 2 ?@ Co-processor access control
+ ? ? ? stmia ? r0, {r4 - r11}
+ ? ? ? ldmfd ? sp!, {r4 - r11, pc}
+ENDPROC(cpu_v7_do_suspend)
Should the FIQ banked registers be saved in here, or by the driver
that set them?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help