Subject: [PATCH 2/3] ARM: convert platform hotplug inline assembly to C

From: [email-masked] (Rob Herring)
Date: Thu, 17 Jan 2013 08:18:23 -0600

On 01/16/2013 10:40 PM, Nicolas Pitre wrote:
> On Wed, 16 Jan 2013, Rob Herring wrote:
> 
>> From: Rob Herring <[email-masked]>
>>
>> With the addition of set_auxcr/get_auxcr, all the hotplug inline assembly
>> code for exynos, imx, realview, spear13xx and vexpress can be converted to
>> C code.
> 
> That might not be all safe.  Please see
> http://article.gmane.org/gmane.linux.ports.arm.kernel/209584

Other than the OR/AND operations, it's all just inline assembly
functions that are called, so it gets compiled to the same code. Perhaps
I should put noinline on the functions so they stay of limited
complexity. If you don't think doing this in C is okay, then there is
probably no point in having the set_auxcr/get_auxcr functions.

Alternatively, we could create common enter/exit coherency functions.

Rob

> 
> 
>>
>> Signed-off-by: Rob Herring <[email-masked]>
>> Cc: Kukjin Kim <[email-masked]>
>> Cc: Russell King <[email-masked]>
>> Cc: Sascha Hauer <[email-masked]>
>> Cc: Viresh Kumar <[email-masked]>
>> Cc: Shiraz Hashim <[email-masked]>
>> ---
>>  arch/arm/mach-exynos/hotplug.c    |   57 ++++++-------------------------------
>>  arch/arm/mach-imx/hotplug.c       |   19 ++++---------
>>  arch/arm/mach-realview/hotplug.c  |   32 +++++----------------
>>  arch/arm/mach-spear13xx/hotplug.c |   32 +++++----------------
>>  arch/arm/mach-vexpress/hotplug.c  |   33 +++++----------------
>>  5 files changed, 35 insertions(+), 138 deletions(-)
>>
>> diff --git a/arch/arm/mach-exynos/hotplug.c b/arch/arm/mach-exynos/hotplug.c
>> index c3f825b..5548fa3 100644
>> --- a/arch/arm/mach-exynos/hotplug.c
>> +++ b/arch/arm/mach-exynos/hotplug.c
>> @@ -26,69 +26,30 @@
>>  
>>  static inline void cpu_enter_lowpower_a9(void)
>>  {
>> -	unsigned int v;
>> -
>>  	flush_cache_all();
>> -	asm volatile(
>> -	"	mcr	p15, 0, %1, c7, c5, 0\n"
>> -	"	mcr	p15, 0, %1, c7, c10, 4\n"
>> +	__flush_icache_all();
>> +	dsb();
>> +
>>  	/*
>>  	 * Turn off coherency
>>  	 */
>> -	"	mrc	p15, 0, %0, c1, c0, 1\n"
>> -	"	bic	%0, %0, %3\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	"	mrc	p15, 0, %0, c1, c0, 0\n"
>> -	"	bic	%0, %0, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	  : "=&r" (v)
>> -	  : "r" (0), "Ir" (CR_C), "Ir" (0x40)
>> -	  : "cc");
>> +	set_auxcr(get_auxcr() & ~0x40);
>> +	set_cr(get_cr() & ~CR_C);
>>  }
>>  
>>  static inline void cpu_enter_lowpower_a15(void)
>>  {
>> -	unsigned int v;
>> -
>> -	asm volatile(
>> -	"	mrc	p15, 0, %0, c1, c0, 0\n"
>> -	"	bic	%0, %0, %1\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	  : "=&r" (v)
>> -	  : "Ir" (CR_C)
>> -	  : "cc");
>> -
>> +	set_cr(get_cr() & ~CR_C);
>>  	flush_cache_louis();
>> +	set_auxcr(get_auxcr() & ~0x40);
>>  
>> -	asm volatile(
>> -	/*
>> -	* Turn off coherency
>> -	*/
>> -	"	mrc	p15, 0, %0, c1, c0, 1\n"
>> -	"	bic	%0, %0, %1\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	: "=&r" (v)
>> -	: "Ir" (0x40)
>> -	: "cc");
>> -
>> -	isb();
>>  	dsb();
>>  }
>>  
>>  static inline void cpu_leave_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>> -	asm volatile(
>> -	"mrc	p15, 0, %0, c1, c0, 0\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, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	  : "=&r" (v)
>> -	  : "Ir" (CR_C), "Ir" (0x40)
>> -	  : "cc");
>> +	set_cr(get_cr() | CR_C);
>> +	set_auxcr(get_auxcr() | 0x40);
>>  }
>>  
>>  static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
>> diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c
>> index 3dec962..1470c75 100644
>> --- a/arch/arm/mach-imx/hotplug.c
>> +++ b/arch/arm/mach-imx/hotplug.c
>> @@ -18,24 +18,15 @@
>>  
>>  static inline void cpu_enter_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>>  	flush_cache_all();
>> -	asm volatile(
>> -		"mcr	p15, 0, %1, c7, c5, 0\n"
>> -	"	mcr	p15, 0, %1, c7, c10, 4\n"
>> +	__flush_icache_all();
>> +	dsb();
>> +
>>  	/*
>>  	 * Turn off coherency
>>  	 */
>> -	"	mrc	p15, 0, %0, c1, c0, 1\n"
>> -	"	bic	%0, %0, %3\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	"	mrc	p15, 0, %0, c1, c0, 0\n"
>> -	"	bic	%0, %0, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	  : "=&r" (v)
>> -	  : "r" (0), "Ir" (CR_C), "Ir" (0x40)
>> -	  : "cc");
>> +	set_auxcr(get_auxcr() & ~0x40);
>> +	set_cr(get_cr() & ~CR_C);
>>  }
>>  
>>  /*
>> diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c
>> index 53818e5..c17c8c0 100644
>> --- a/arch/arm/mach-realview/hotplug.c
>> +++ b/arch/arm/mach-realview/hotplug.c
>> @@ -18,39 +18,21 @@
>>  
>>  static inline void cpu_enter_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>>  	flush_cache_all();
>> -	asm volatile(
>> -	"	mcr	p15, 0, %1, c7, c5, 0\n"
>> -	"	mcr	p15, 0, %1, c7, c10, 4\n"
>> +	__flush_icache_all();
>> +	dsb();
>> +
>>  	/*
>>  	 * Turn off coherency
>>  	 */
>> -	"	mrc	p15, 0, %0, c1, c0, 1\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, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	  : "=&r" (v)
>> -	  : "r" (0), "Ir" (CR_C)
>> -	  : "cc");
>> +	set_auxcr(get_auxcr() & ~0x40);
>> +	set_cr(get_cr() & ~CR_C);
>>  }
>>  
>>  static inline void cpu_leave_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>> -	asm volatile(	"mrc	p15, 0, %0, c1, c0, 0\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");
>> +	set_cr(get_cr() | CR_C);
>> +	set_auxcr(get_auxcr() | 0x40);
>>  }
>>  
>>  static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
>> diff --git a/arch/arm/mach-spear13xx/hotplug.c b/arch/arm/mach-spear13xx/hotplug.c
>> index a7d2dd1..a38a087 100644
>> --- a/arch/arm/mach-spear13xx/hotplug.c
>> +++ b/arch/arm/mach-spear13xx/hotplug.c
>> @@ -19,39 +19,21 @@
>>  
>>  static inline void cpu_enter_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>>  	flush_cache_all();
>> -	asm volatile(
>> -	"	mcr	p15, 0, %1, c7, c5, 0\n"
>> -	"	dsb\n"
>> +	__flush_icache_all();
>> +	dsb();
>> +
>>  	/*
>>  	 * Turn off coherency
>>  	 */
>> -	"	mrc	p15, 0, %0, c1, c0, 1\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, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	: "=&r" (v)
>> -	: "r" (0), "Ir" (CR_C)
>> -	: "cc", "memory");
>> +	set_auxcr(get_auxcr() & ~0x40);
>> +	set_cr(get_cr() & ~CR_C);
>>  }
>>  
>>  static inline void cpu_leave_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>> -	asm volatile("mrc	p15, 0, %0, c1, c0, 0\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");
>> +	set_cr(get_cr() | CR_C);
>> +	set_auxcr(get_auxcr() | 0x40);
>>  }
>>  
>>  static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
>> diff --git a/arch/arm/mach-vexpress/hotplug.c b/arch/arm/mach-vexpress/hotplug.c
>> index a141b98..74a9eb5 100644
>> --- a/arch/arm/mach-vexpress/hotplug.c
>> +++ b/arch/arm/mach-vexpress/hotplug.c
>> @@ -18,40 +18,21 @@
>>  
>>  static inline void cpu_enter_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>>  	flush_cache_all();
>> -	asm volatile(
>> -		"mcr	p15, 0, %1, c7, c5, 0\n"
>> -	"	mcr	p15, 0, %1, c7, c10, 4\n"
>> +	__flush_icache_all();
>> +	dsb();
>> +
>>  	/*
>>  	 * Turn off coherency
>>  	 */
>> -	"	mrc	p15, 0, %0, c1, c0, 1\n"
>> -	"	bic	%0, %0, %3\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	"	mrc	p15, 0, %0, c1, c0, 0\n"
>> -	"	bic	%0, %0, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 0\n"
>> -	  : "=&r" (v)
>> -	  : "r" (0), "Ir" (CR_C), "Ir" (0x40)
>> -	  : "cc");
>> +	set_auxcr(get_auxcr() & ~0x40);
>> +	set_cr(get_cr() & ~CR_C);
>>  }
>>  
>>  static inline void cpu_leave_lowpower(void)
>>  {
>> -	unsigned int v;
>> -
>> -	asm volatile(
>> -		"mrc	p15, 0, %0, c1, c0, 0\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, %2\n"
>> -	"	mcr	p15, 0, %0, c1, c0, 1\n"
>> -	  : "=&r" (v)
>> -	  : "Ir" (CR_C), "Ir" (0x40)
>> -	  : "cc");
>> +	set_cr(get_cr() | CR_C);
>> +	set_auxcr(get_auxcr() | 0x40);
>>  }
>>  
>>  static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
>> -- 
>> 1.7.10.4
>>