diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-11-12 05:58:27 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-11-12 05:58:27 -0500 |
commit | ec1e20a02fe33b767ffcca8920a32211492416d7 (patch) | |
tree | 85cfc0bbc1aac672b5ee4d540d1eeb2cc0d96f61 /arch/arm/mach-vexpress | |
parent | 959f58544b7f20c92d5eb43d1232c96c15c01bfb (diff) | |
parent | aed3a4ed7222ae37860ae33cbad3ea7a6b2eaf8e (diff) |
Merge branch 'misc' into for-next
Diffstat (limited to 'arch/arm/mach-vexpress')
-rw-r--r-- | arch/arm/mach-vexpress/dcscb.c | 56 | ||||
-rw-r--r-- | arch/arm/mach-vexpress/tc2_pm.c | 48 |
2 files changed, 6 insertions, 98 deletions
diff --git a/arch/arm/mach-vexpress/dcscb.c b/arch/arm/mach-vexpress/dcscb.c index 3a6384c6c435..14d499688736 100644 --- a/arch/arm/mach-vexpress/dcscb.c +++ b/arch/arm/mach-vexpress/dcscb.c | |||
@@ -133,38 +133,8 @@ static void dcscb_power_down(void) | |||
133 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { | 133 | if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) { |
134 | arch_spin_unlock(&dcscb_lock); | 134 | arch_spin_unlock(&dcscb_lock); |
135 | 135 | ||
136 | /* | 136 | /* Flush all cache levels for this cluster. */ |
137 | * Flush all cache levels for this cluster. | 137 | v7_exit_coherency_flush(all); |
138 | * | ||
139 | * To do so we do: | ||
140 | * - Clear the SCTLR.C bit to prevent further cache allocations | ||
141 | * - Flush the whole cache | ||
142 | * - Clear the ACTLR "SMP" bit to disable local coherency | ||
143 | * | ||
144 | * Let's do it in the safest possible way i.e. with | ||
145 | * no memory access within the following sequence | ||
146 | * including to the stack. | ||
147 | * | ||
148 | * Note: fp is preserved to the stack explicitly prior doing | ||
149 | * this since adding it to the clobber list is incompatible | ||
150 | * with having CONFIG_FRAME_POINTER=y. | ||
151 | */ | ||
152 | asm volatile( | ||
153 | "str fp, [sp, #-4]! \n\t" | ||
154 | "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t" | ||
155 | "bic r0, r0, #"__stringify(CR_C)" \n\t" | ||
156 | "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t" | ||
157 | "isb \n\t" | ||
158 | "bl v7_flush_dcache_all \n\t" | ||
159 | "clrex \n\t" | ||
160 | "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t" | ||
161 | "bic r0, r0, #(1 << 6) @ disable local coherency \n\t" | ||
162 | "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t" | ||
163 | "isb \n\t" | ||
164 | "dsb \n\t" | ||
165 | "ldr fp, [sp], #4" | ||
166 | : : : "r0","r1","r2","r3","r4","r5","r6","r7", | ||
167 | "r9","r10","lr","memory"); | ||
168 | 138 | ||
169 | /* | 139 | /* |
170 | * This is a harmless no-op. On platforms with a real | 140 | * This is a harmless no-op. On platforms with a real |
@@ -183,26 +153,8 @@ static void dcscb_power_down(void) | |||
183 | } else { | 153 | } else { |
184 | arch_spin_unlock(&dcscb_lock); | 154 | arch_spin_unlock(&dcscb_lock); |
185 | 155 | ||
186 | /* | 156 | /* Disable and flush the local CPU cache. */ |
187 | * Flush the local CPU cache. | 157 | v7_exit_coherency_flush(louis); |
188 | * Let's do it in the safest possible way as above. | ||
189 | */ | ||
190 | asm volatile( | ||
191 | "str fp, [sp, #-4]! \n\t" | ||
192 | "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t" | ||
193 | "bic r0, r0, #"__stringify(CR_C)" \n\t" | ||
194 | "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t" | ||
195 | "isb \n\t" | ||
196 | "bl v7_flush_dcache_louis \n\t" | ||
197 | "clrex \n\t" | ||
198 | "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t" | ||
199 | "bic r0, r0, #(1 << 6) @ disable local coherency \n\t" | ||
200 | "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t" | ||
201 | "isb \n\t" | ||
202 | "dsb \n\t" | ||
203 | "ldr fp, [sp], #4" | ||
204 | : : : "r0","r1","r2","r3","r4","r5","r6","r7", | ||
205 | "r9","r10","lr","memory"); | ||
206 | } | 158 | } |
207 | 159 | ||
208 | __mcpm_cpu_down(cpu, cluster); | 160 | __mcpm_cpu_down(cpu, cluster); |
diff --git a/arch/arm/mach-vexpress/tc2_pm.c b/arch/arm/mach-vexpress/tc2_pm.c index e6eb48192912..4eb92ebfd953 100644 --- a/arch/arm/mach-vexpress/tc2_pm.c +++ b/arch/arm/mach-vexpress/tc2_pm.c | |||
@@ -156,32 +156,7 @@ static void tc2_pm_down(u64 residency) | |||
156 | : : "r" (0x400) ); | 156 | : : "r" (0x400) ); |
157 | } | 157 | } |
158 | 158 | ||
159 | /* | 159 | v7_exit_coherency_flush(all); |
160 | * We need to disable and flush the whole (L1 and L2) cache. | ||
161 | * Let's do it in the safest possible way i.e. with | ||
162 | * no memory access within the following sequence | ||
163 | * including the stack. | ||
164 | * | ||
165 | * Note: fp is preserved to the stack explicitly prior doing | ||
166 | * this since adding it to the clobber list is incompatible | ||
167 | * with having CONFIG_FRAME_POINTER=y. | ||
168 | */ | ||
169 | asm volatile( | ||
170 | "str fp, [sp, #-4]! \n\t" | ||
171 | "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t" | ||
172 | "bic r0, r0, #"__stringify(CR_C)" \n\t" | ||
173 | "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t" | ||
174 | "isb \n\t" | ||
175 | "bl v7_flush_dcache_all \n\t" | ||
176 | "clrex \n\t" | ||
177 | "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t" | ||
178 | "bic r0, r0, #(1 << 6) @ disable local coherency \n\t" | ||
179 | "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t" | ||
180 | "isb \n\t" | ||
181 | "dsb \n\t" | ||
182 | "ldr fp, [sp], #4" | ||
183 | : : : "r0","r1","r2","r3","r4","r5","r6","r7", | ||
184 | "r9","r10","lr","memory"); | ||
185 | 160 | ||
186 | cci_disable_port_by_cpu(mpidr); | 161 | cci_disable_port_by_cpu(mpidr); |
187 | 162 | ||
@@ -197,26 +172,7 @@ static void tc2_pm_down(u64 residency) | |||
197 | 172 | ||
198 | arch_spin_unlock(&tc2_pm_lock); | 173 | arch_spin_unlock(&tc2_pm_lock); |
199 | 174 | ||
200 | /* | 175 | v7_exit_coherency_flush(louis); |
201 | * We need to disable and flush only the L1 cache. | ||
202 | * Let's do it in the safest possible way as above. | ||
203 | */ | ||
204 | asm volatile( | ||
205 | "str fp, [sp, #-4]! \n\t" | ||
206 | "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t" | ||
207 | "bic r0, r0, #"__stringify(CR_C)" \n\t" | ||
208 | "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t" | ||
209 | "isb \n\t" | ||
210 | "bl v7_flush_dcache_louis \n\t" | ||
211 | "clrex \n\t" | ||
212 | "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t" | ||
213 | "bic r0, r0, #(1 << 6) @ disable local coherency \n\t" | ||
214 | "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t" | ||
215 | "isb \n\t" | ||
216 | "dsb \n\t" | ||
217 | "ldr fp, [sp], #4" | ||
218 | : : : "r0","r1","r2","r3","r4","r5","r6","r7", | ||
219 | "r9","r10","lr","memory"); | ||
220 | } | 176 | } |
221 | 177 | ||
222 | __mcpm_cpu_down(cpu, cluster); | 178 | __mcpm_cpu_down(cpu, cluster); |