ARM: CPU hotplug: fix hard-coded control register constants
A message that is not in the archive (sent off-list or not yet received): [email protected]
Russell,
I was just tracking latest changes in realview, for preparing SPEAr support V4. I found below patch and didn't understood it very well.
Quoted 18 lines
Subject: [PATCH] ARM: CPU hotplug: fix hard-coded control register constants
Use the definition we've provided in
asm/system.hrather than numeric constants.Signed-off-by Russell King <[email protected]>--- arch/arm/mach-realview/hotplug.c | 8 ++++---- arch/arm/mach-s5pv310/hotplug.c | 8 ++++---- arch/arm/mach-tegra/hotplug.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-)arch/arm/mach-realview/hotplug.c +0
-0@@ -31,10 +31,10 @@ static inline void cpu_enter_lowpower(void)" bic %0, %0, #0x20\n"
arch/arm/mach-realview/hotplug.c static inline void cpu_enter_lowpower(void) · line 39
Quoted 10 lines
arch/arm/mach-realview/hotplug.c +2
-2" mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" -" bic %0, %0, #0x04\n" +" bic %0, %0, %2\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) - : "r" (0) + : "r" (0), "Ir" (CR_C) : "cc"); }
This looks fine as you have replaced 0x04 with CR_C, which itself is (1 << 2).
Quoted 6 lines
arch/arm/mach-realview/hotplug.c +0
-1@@ -43,13 +43,13 @@ static inline void cpu_leave_lowpower(void)unsigned int v; asm volatile( "mrc p15, 0, %0, c1, c0, 0\n" - " orr %0, %0, #0x04\n"
arch/arm/mach-realview/hotplug.c static inline void cpu_leave_lowpower(void) · line 54
Quoted 10 lines
arch/arm/mach-realview/hotplug.c +2
-1+" orr %0, %0, %1\n" " mcr p15, 0, %0, c1, c0, 0\n" " mrc p15, 0, %0, c1, c0, 1\n" " orr %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" : "=&r" (v) - : + : "Ir" (CR_C) : "cc"); }
fine here also.
arch/arm/mach-s5pv310/hotplug.c static inline void cpu_enter_lowpower(void) · line 33
Quoted 11 lines
arch/arm/mach-s5pv310/hotplug.c +1
-1@@ -30,13 +30,13 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, #0x20\n" +" bic %0, %0, %2\n"
but why replace 0x20 with CR_C instead of CR_D
Quoted 31 lines
arch/arm/mach-s5pv310/hotplug.c +3
-3" mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" " bic %0, %0, #0x04\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) - : "r" (0) + : "r" (0), "Ir" (CR_C) : "cc"); }@@ -46,13 +46,13 @@ static inline void cpu_leave_lowpower(void) asmvolatile ("mrc p15, 0, %0, c1, c0, 0\n" -" orr %0, %0, #0x04\n" +" orr %0, %0, %1\n" " mcr p15, 0, %0, c1, c0, 0\n" " mrc p15, 0, %0, c1, c0, 1\n" " orr %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" :"=&r" (v) - : + :"Ir" (CR_C ) :"cc" ); }arch/arm/mach-tegra/hotplug.c +0
-0
arch/arm/mach-tegra/hotplug.c static inline void cpu_enter_lowpower(void) · line 29
Quoted 5 lines
arch/arm/mach-tegra/hotplug.c +1
-1@@ -26,13 +26,13 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, #0x20\n" +" bic %0, %0, %2\n"
here also.
Was this code wrong earlier??
Signature · 1 line
viresh
Quoted 4 lines · viresh kumar
Quoted 4 lines
arch/arm/mach-s5pv310/hotplug.c +0
-0
Quoted 8 lines
arch/arm/mach-s5pv310/hotplug.c static inline void cpu_enter_lowpower(void) · line 33
Quoted 6 lines
arch/arm/mach-s5pv310/hotplug.c +1
-1@@ -30,13 +30,13 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, #0x20\n" +" bic %0, %0, %2\n" but why replace
0x20withCR_Cinstead ofCR_D
Looks like a mistake - it should've been the one below.
Quoted 8 lines
arch/arm/mach-s5pv310/hotplug.c static inline void cpu_enter_lowpower(void) · line 40
Quoted 8 lines
arch/arm/mach-s5pv310/hotplug.c +1
-1" mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" " bic %0, %0, #0x04\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) - : "r" (0) + : "r" (0), "Ir" (CR_C) : "cc");
In any case, this code is probably doing the wrong thing - if s5pv310 is not an ARMv6 MPCore the its fiddling with the auxillary control register is already broken.
Quoted 4 lines
Quoted 4 lines
arch/arm/mach-tegra/hotplug.c +0
-0
Quoted 8 lines
arch/arm/mach-tegra/hotplug.c static inline void cpu_enter_lowpower(void) · line 29
Quoted 6 lines
arch/arm/mach-tegra/hotplug.c +1
-1@@ -26,13 +26,13 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, #0x20\n" +" bic %0, %0, %2\n" here also.
Same comment.
Here's the fix which restores the old (but probably still broken) behaviour:
Subject: [PATCH] ARM: fix wrongly patched constants
e3d9c625 (ARM: CPU hotplug: fix hard-coded control register constants) changed the wrong constants in the hotplug assembly code. Fix this.
--- arch/arm/mach-s5pv310/hotplug.c | 4 ++-- arch/arm/mach-tegra/hotplug.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm/mach-s5pv310/hotplug.c +2 -2
@@ -30,10 +30,10 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, %2\n" +" bic %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" -" bic %0, %0, #0x04\n" +" bic %0, %0, %2\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) : "r" (0), "Ir" (CR_C)
arch/arm/mach-tegra/hotplug.c +2 -2
@@ -26,10 +26,10 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, %2\n" +" bic %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" -" bic %0, %0, #0x04\n" +" bic %0, %0, %2\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) : "r" (0), "Ir" (CR_C)
Signature · 1 line
1.6.2.5
viresh kumar
Acked-byQuoted 37 lines · Russell King - ARM Linux
Subject: [PATCH] ARM: fix wrongly patched constants
e3d9c625(ARM: CPU hotplug: fix hard-coded control register constants) changed the wrong constants in the hotplug assembly code. Fix this.Reported-by viresh kumar <[email protected]>Signed-off-by Russell King <[email protected]>--- arch/arm/mach-s5pv310/hotplug.c | 4 ++-- arch/arm/mach-tegra/hotplug.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)arch/arm/mach-s5pv310/hotplug.c +2
-2@@ -30,10 +30,10 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, %2\n" +" bic %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" -" bic %0, %0, #0x04\n" +" bic %0, %0, %2\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) : "r" (0), "Ir" (CR_C)arch/arm/mach-tegra/hotplug.c +0
-0@@ -26,10 +26,10 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */
arch/arm/mach-tegra/hotplug.c static inline void cpu_enter_lowpower(void) · line 35
Quoted 10 lines
arch/arm/mach-tegra/hotplug.c +2
-2" mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, %2\n" +" bic %0, %0, #0x20\n" " mcr p15, 0, %0, c1, c0, 1\n" " mrc p15, 0, %0, c1, c0, 0\n" -" bic %0, %0, #0x04\n" +" bic %0, %0, %2\n" " mcr p15, 0, %0, c1, c0, 0\n" : "=&r" (v) : "r" (0), "Ir" (CR_C)
Quoted 21 lines · Russell King
Sent: Friday, January 14, 2011 5:05 AM
On Fri, Jan 14, 2011 at 05:20:03PM +0530, viresh kumar wrote:
...
In any case, this code is probably doing the wrong thing - if s5pv310 is not an ARMv6 MPCore the its fiddling with the auxillary control register is already broken.Quoted 4 lines
Quoted 4 lines
arch/arm/mach-tegra/hotplug.c +0
-0Quoted 8 lines
arch/arm/mach-tegra/hotplug.c static inline void cpu_enter_lowpower(void) · line 29
Quoted 6 lines
arch/arm/mach-tegra/hotplug.c +1
-1@@ -26,13 +26,13 @@ static inline void cpu_enter_lowpower(void)* Turn off coherency */ " mrc p15, 0, %0, c1, c0, 1\n" -" bic %0, %0, #0x20\n" +" bic %0, %0, %2\n" here also.
Quoted 1 line
Same comment.
Just as an FYI, in various downstream trees, that file (for mach-tegra) has been removed and replaced with completely different code. However, the replacement isn't in the process of being upstreamed right yet. Specifically:
git://android.git.kernel.org/kernel/tegra.git
linux-tegra-2.6.37
cb8e70bd4fa41ea7ac66f01f7425943db99ac7d3
ARM: tegra: Add suspend and hotplug support
Hope this helps.
Signature · 1 line
nvpublic