diff options
author | Nicolas Pitre <nicolas.pitre@linaro.org> | 2012-09-20 16:05:37 -0400 |
---|---|---|
committer | Nicolas Pitre <nicolas.pitre@linaro.org> | 2013-04-24 10:36:59 -0400 |
commit | 7c2b860534d02d11923dd0504b961f21508173f1 (patch) | |
tree | 643030cebe48d267e67eb9b533284db881ef99a5 /arch/arm/include/asm/mcpm.h | |
parent | e8db288e05e588ad3f416b3a24354d60d02f35f2 (diff) |
ARM: mcpm: introduce the CPU/cluster power API
This is the basic API used to handle the powering up/down of individual
CPUs in a (multi-)cluster system. The platform specific backend
implementation has the responsibility to also handle the cluster level
power as well when the first/last CPU in a cluster is brought up/down.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm/include/asm/mcpm.h')
-rw-r--r-- | arch/arm/include/asm/mcpm.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/arch/arm/include/asm/mcpm.h b/arch/arm/include/asm/mcpm.h index 470a417d1351..627761fce780 100644 --- a/arch/arm/include/asm/mcpm.h +++ b/arch/arm/include/asm/mcpm.h | |||
@@ -38,5 +38,97 @@ extern void mcpm_entry_point(void); | |||
38 | */ | 38 | */ |
39 | void mcpm_set_entry_vector(unsigned cpu, unsigned cluster, void *ptr); | 39 | void mcpm_set_entry_vector(unsigned cpu, unsigned cluster, void *ptr); |
40 | 40 | ||
41 | /* | ||
42 | * CPU/cluster power operations API for higher subsystems to use. | ||
43 | */ | ||
44 | |||
45 | /** | ||
46 | * mcpm_cpu_power_up - make given CPU in given cluster runable | ||
47 | * | ||
48 | * @cpu: CPU number within given cluster | ||
49 | * @cluster: cluster number for the CPU | ||
50 | * | ||
51 | * The identified CPU is brought out of reset. If the cluster was powered | ||
52 | * down then it is brought up as well, taking care not to let the other CPUs | ||
53 | * in the cluster run, and ensuring appropriate cluster setup. | ||
54 | * | ||
55 | * Caller must ensure the appropriate entry vector is initialized with | ||
56 | * mcpm_set_entry_vector() prior to calling this. | ||
57 | * | ||
58 | * This must be called in a sleepable context. However, the implementation | ||
59 | * is strongly encouraged to return early and let the operation happen | ||
60 | * asynchronously, especially when significant delays are expected. | ||
61 | * | ||
62 | * If the operation cannot be performed then an error code is returned. | ||
63 | */ | ||
64 | int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster); | ||
65 | |||
66 | /** | ||
67 | * mcpm_cpu_power_down - power the calling CPU down | ||
68 | * | ||
69 | * The calling CPU is powered down. | ||
70 | * | ||
71 | * If this CPU is found to be the "last man standing" in the cluster | ||
72 | * then the cluster is prepared for power-down too. | ||
73 | * | ||
74 | * This must be called with interrupts disabled. | ||
75 | * | ||
76 | * This does not return. Re-entry in the kernel is expected via | ||
77 | * mcpm_entry_point. | ||
78 | */ | ||
79 | void mcpm_cpu_power_down(void); | ||
80 | |||
81 | /** | ||
82 | * mcpm_cpu_suspend - bring the calling CPU in a suspended state | ||
83 | * | ||
84 | * @expected_residency: duration in microseconds the CPU is expected | ||
85 | * to remain suspended, or 0 if unknown/infinity. | ||
86 | * | ||
87 | * The calling CPU is suspended. The expected residency argument is used | ||
88 | * as a hint by the platform specific backend to implement the appropriate | ||
89 | * sleep state level according to the knowledge it has on wake-up latency | ||
90 | * for the given hardware. | ||
91 | * | ||
92 | * If this CPU is found to be the "last man standing" in the cluster | ||
93 | * then the cluster may be prepared for power-down too, if the expected | ||
94 | * residency makes it worthwhile. | ||
95 | * | ||
96 | * This must be called with interrupts disabled. | ||
97 | * | ||
98 | * This does not return. Re-entry in the kernel is expected via | ||
99 | * mcpm_entry_point. | ||
100 | */ | ||
101 | void mcpm_cpu_suspend(u64 expected_residency); | ||
102 | |||
103 | /** | ||
104 | * mcpm_cpu_powered_up - housekeeping workafter a CPU has been powered up | ||
105 | * | ||
106 | * This lets the platform specific backend code perform needed housekeeping | ||
107 | * work. This must be called by the newly activated CPU as soon as it is | ||
108 | * fully operational in kernel space, before it enables interrupts. | ||
109 | * | ||
110 | * If the operation cannot be performed then an error code is returned. | ||
111 | */ | ||
112 | int mcpm_cpu_powered_up(void); | ||
113 | |||
114 | /* | ||
115 | * Platform specific methods used in the implementation of the above API. | ||
116 | */ | ||
117 | struct mcpm_platform_ops { | ||
118 | int (*power_up)(unsigned int cpu, unsigned int cluster); | ||
119 | void (*power_down)(void); | ||
120 | void (*suspend)(u64); | ||
121 | void (*powered_up)(void); | ||
122 | }; | ||
123 | |||
124 | /** | ||
125 | * mcpm_platform_register - register platform specific power methods | ||
126 | * | ||
127 | * @ops: mcpm_platform_ops structure to register | ||
128 | * | ||
129 | * An error is returned if the registration has been done previously. | ||
130 | */ | ||
131 | int __init mcpm_platform_register(const struct mcpm_platform_ops *ops); | ||
132 | |||
41 | #endif /* ! __ASSEMBLY__ */ | 133 | #endif /* ! __ASSEMBLY__ */ |
42 | #endif | 134 | #endif |