diff mbox

[09/13] powerpc: Introduce new mask bit for soft_enabled

Message ID 1473944523-624-10-git-send-email-maddy@linux.vnet.ibm.com (mailing list archive)
State Superseded
Headers show

Commit Message

maddy Sept. 15, 2016, 1:01 p.m. UTC
Currently soft_enabled is used as the flag to determine
the interrupt state. Patch extends the soft_enabled
to be used as a mask instead of a flag.

Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/exception-64s.h | 4 ++--
 arch/powerpc/include/asm/hw_irq.h        | 1 +
 arch/powerpc/include/asm/irqflags.h      | 4 ++--
 arch/powerpc/kernel/entry_64.S           | 4 ++--
 arch/powerpc/kernel/exceptions-64e.S     | 6 +++---
 5 files changed, 10 insertions(+), 9 deletions(-)

Comments

Nicholas Piggin Sept. 16, 2016, 10:16 a.m. UTC | #1
On Thu, 15 Sep 2016 18:31:59 +0530
Madhavan Srinivasan <maddy@linux.vnet.ibm.com> wrote:

> Currently soft_enabled is used as the flag to determine
> the interrupt state. Patch extends the soft_enabled
> to be used as a mask instead of a flag.

This should be the title of the patch, IMO. Introducing the new
mask bit is incidental (and could be moved to patch 11). The key
here of course is switching the tests from a flag to a mask.

Very cool that you got this all worked out without adding any
new instructions.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>

> 
> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
> ---
>  arch/powerpc/include/asm/exception-64s.h | 4 ++--
>  arch/powerpc/include/asm/hw_irq.h        | 1 +
>  arch/powerpc/include/asm/irqflags.h      | 4 ++--
>  arch/powerpc/kernel/entry_64.S           | 4 ++--
>  arch/powerpc/kernel/exceptions-64e.S     | 6 +++---
>  5 files changed, 10 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
> index dd3253bd0d8e..1eea4ab75607 100644
> --- a/arch/powerpc/include/asm/exception-64s.h
> +++ b/arch/powerpc/include/asm/exception-64s.h
> @@ -430,9 +430,9 @@ label##_relon_hv:						\
>  
>  #define __SOFTEN_TEST(h, vec)						\
>  	lbz	r10,PACASOFTIRQEN(r13);					\
> -	cmpwi	r10,IRQ_DISABLE_MASK_LINUX;							\
> +	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;				\
>  	li	r10,SOFTEN_VALUE_##vec;					\
> -	beq	masked_##h##interrupt
> +	bne	masked_##h##interrupt
>  #define _SOFTEN_TEST(h, vec)	__SOFTEN_TEST(h, vec)
>  
>  #define SOFTEN_TEST_PR(vec)						\
> diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
> index fd9b421f9020..245262c02bab 100644
> --- a/arch/powerpc/include/asm/hw_irq.h
> +++ b/arch/powerpc/include/asm/hw_irq.h
> @@ -32,6 +32,7 @@
>   */
>  #define IRQ_DISABLE_MASK_NONE		0
>  #define IRQ_DISABLE_MASK_LINUX		1
> +#define IRQ_DISABLE_MASK_PMU		2
>  
>  #endif /* CONFIG_PPC64 */
>  
> diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h
> index d0ed2a7d7d10..9ff09747a226 100644
> --- a/arch/powerpc/include/asm/irqflags.h
> +++ b/arch/powerpc/include/asm/irqflags.h
> @@ -48,11 +48,11 @@
>  #define RECONCILE_IRQ_STATE(__rA, __rB)		\
>  	lbz	__rA,PACASOFTIRQEN(r13);	\
>  	lbz	__rB,PACAIRQHAPPENED(r13);	\
> -	cmpwi	cr0,__rA,IRQ_DISABLE_MASK_LINUX;\
> +	andi.	__rA,__rA,IRQ_DISABLE_MASK_LINUX;\
>  	li	__rA,IRQ_DISABLE_MASK_LINUX;	\
>  	ori	__rB,__rB,PACA_IRQ_HARD_DIS;	\
>  	stb	__rB,PACAIRQHAPPENED(r13);	\
> -	beq	44f;				\
> +	bne	44f;				\
>  	stb	__rA,PACASOFTIRQEN(r13);	\
>  	TRACE_DISABLE_INTS;			\
>  44:
> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
> index 879aeb11ad29..533e363914a9 100644
> --- a/arch/powerpc/kernel/entry_64.S
> +++ b/arch/powerpc/kernel/entry_64.S
> @@ -764,8 +764,8 @@ restore:
>  	 */
>  	ld	r5,SOFTE(r1)
>  	lbz	r6,PACASOFTIRQEN(r13)
> -	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
> -	beq	restore_irq_off
> +	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
> +	bne	restore_irq_off
>  
>  	/* We are enabling, were we already enabled ? Yes, just return */
>  	cmpwi	cr0,r6,IRQ_DISABLE_MASK_NONE
> diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
> index 5c628b5696f6..8e40df2c2f30 100644
> --- a/arch/powerpc/kernel/exceptions-64e.S
> +++ b/arch/powerpc/kernel/exceptions-64e.S
> @@ -212,8 +212,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
>  	/* Interrupts had better not already be enabled... */
>  	twnei	r6,IRQ_DISABLE_MASK_LINUX
>  
> -	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
> -	beq	1f
> +	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
> +	bne	1f
>  
>  	TRACE_ENABLE_INTS
>  	stb	r5,PACASOFTIRQEN(r13)
> @@ -352,7 +352,7 @@ ret_from_mc_except:
>  
>  #define PROLOG_ADDITION_MASKABLE_GEN(n)					    \
>  	lbz	r10,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */	    \
> -	cmpwi	cr0,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
> +	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
>  	beq	masked_interrupt_book3e_##n
>  
>  #define PROLOG_ADDITION_2REGS_GEN(n)					    \
maddy Sept. 19, 2016, 5:57 a.m. UTC | #2
On Friday 16 September 2016 03:46 PM, Nicholas Piggin wrote:
> On Thu, 15 Sep 2016 18:31:59 +0530
> Madhavan Srinivasan <maddy@linux.vnet.ibm.com> wrote:
>
>> Currently soft_enabled is used as the flag to determine
>> the interrupt state. Patch extends the soft_enabled
>> to be used as a mask instead of a flag.
> This should be the title of the patch, IMO. Introducing the new
> mask bit is incidental (and could be moved to patch 11). The key
> here of course is switching the tests from a flag to a mask.
>
> Very cool that you got this all worked out without adding any
> new instructions.

Will make the changes accordingly. Thanks

>
> Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
>
>> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>> ---
>>   arch/powerpc/include/asm/exception-64s.h | 4 ++--
>>   arch/powerpc/include/asm/hw_irq.h        | 1 +
>>   arch/powerpc/include/asm/irqflags.h      | 4 ++--
>>   arch/powerpc/kernel/entry_64.S           | 4 ++--
>>   arch/powerpc/kernel/exceptions-64e.S     | 6 +++---
>>   5 files changed, 10 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
>> index dd3253bd0d8e..1eea4ab75607 100644
>> --- a/arch/powerpc/include/asm/exception-64s.h
>> +++ b/arch/powerpc/include/asm/exception-64s.h
>> @@ -430,9 +430,9 @@ label##_relon_hv:						\
>>   
>>   #define __SOFTEN_TEST(h, vec)						\
>>   	lbz	r10,PACASOFTIRQEN(r13);					\
>> -	cmpwi	r10,IRQ_DISABLE_MASK_LINUX;							\
>> +	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;				\
>>   	li	r10,SOFTEN_VALUE_##vec;					\
>> -	beq	masked_##h##interrupt
>> +	bne	masked_##h##interrupt
>>   #define _SOFTEN_TEST(h, vec)	__SOFTEN_TEST(h, vec)
>>   
>>   #define SOFTEN_TEST_PR(vec)						\
>> diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
>> index fd9b421f9020..245262c02bab 100644
>> --- a/arch/powerpc/include/asm/hw_irq.h
>> +++ b/arch/powerpc/include/asm/hw_irq.h
>> @@ -32,6 +32,7 @@
>>    */
>>   #define IRQ_DISABLE_MASK_NONE		0
>>   #define IRQ_DISABLE_MASK_LINUX		1
>> +#define IRQ_DISABLE_MASK_PMU		2
>>   
>>   #endif /* CONFIG_PPC64 */
>>   
>> diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h
>> index d0ed2a7d7d10..9ff09747a226 100644
>> --- a/arch/powerpc/include/asm/irqflags.h
>> +++ b/arch/powerpc/include/asm/irqflags.h
>> @@ -48,11 +48,11 @@
>>   #define RECONCILE_IRQ_STATE(__rA, __rB)		\
>>   	lbz	__rA,PACASOFTIRQEN(r13);	\
>>   	lbz	__rB,PACAIRQHAPPENED(r13);	\
>> -	cmpwi	cr0,__rA,IRQ_DISABLE_MASK_LINUX;\
>> +	andi.	__rA,__rA,IRQ_DISABLE_MASK_LINUX;\
>>   	li	__rA,IRQ_DISABLE_MASK_LINUX;	\
>>   	ori	__rB,__rB,PACA_IRQ_HARD_DIS;	\
>>   	stb	__rB,PACAIRQHAPPENED(r13);	\
>> -	beq	44f;				\
>> +	bne	44f;				\
>>   	stb	__rA,PACASOFTIRQEN(r13);	\
>>   	TRACE_DISABLE_INTS;			\
>>   44:
>> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
>> index 879aeb11ad29..533e363914a9 100644
>> --- a/arch/powerpc/kernel/entry_64.S
>> +++ b/arch/powerpc/kernel/entry_64.S
>> @@ -764,8 +764,8 @@ restore:
>>   	 */
>>   	ld	r5,SOFTE(r1)
>>   	lbz	r6,PACASOFTIRQEN(r13)
>> -	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
>> -	beq	restore_irq_off
>> +	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
>> +	bne	restore_irq_off
>>   
>>   	/* We are enabling, were we already enabled ? Yes, just return */
>>   	cmpwi	cr0,r6,IRQ_DISABLE_MASK_NONE
>> diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
>> index 5c628b5696f6..8e40df2c2f30 100644
>> --- a/arch/powerpc/kernel/exceptions-64e.S
>> +++ b/arch/powerpc/kernel/exceptions-64e.S
>> @@ -212,8 +212,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
>>   	/* Interrupts had better not already be enabled... */
>>   	twnei	r6,IRQ_DISABLE_MASK_LINUX
>>   
>> -	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
>> -	beq	1f
>> +	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
>> +	bne	1f
>>   
>>   	TRACE_ENABLE_INTS
>>   	stb	r5,PACASOFTIRQEN(r13)
>> @@ -352,7 +352,7 @@ ret_from_mc_except:
>>   
>>   #define PROLOG_ADDITION_MASKABLE_GEN(n)					    \
>>   	lbz	r10,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */	    \
>> -	cmpwi	cr0,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
>> +	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
>>   	beq	masked_interrupt_book3e_##n
>>   
>>   #define PROLOG_ADDITION_2REGS_GEN(n)					    \
diff mbox

Patch

diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index dd3253bd0d8e..1eea4ab75607 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -430,9 +430,9 @@  label##_relon_hv:						\
 
 #define __SOFTEN_TEST(h, vec)						\
 	lbz	r10,PACASOFTIRQEN(r13);					\
-	cmpwi	r10,IRQ_DISABLE_MASK_LINUX;							\
+	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;				\
 	li	r10,SOFTEN_VALUE_##vec;					\
-	beq	masked_##h##interrupt
+	bne	masked_##h##interrupt
 #define _SOFTEN_TEST(h, vec)	__SOFTEN_TEST(h, vec)
 
 #define SOFTEN_TEST_PR(vec)						\
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
index fd9b421f9020..245262c02bab 100644
--- a/arch/powerpc/include/asm/hw_irq.h
+++ b/arch/powerpc/include/asm/hw_irq.h
@@ -32,6 +32,7 @@ 
  */
 #define IRQ_DISABLE_MASK_NONE		0
 #define IRQ_DISABLE_MASK_LINUX		1
+#define IRQ_DISABLE_MASK_PMU		2
 
 #endif /* CONFIG_PPC64 */
 
diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h
index d0ed2a7d7d10..9ff09747a226 100644
--- a/arch/powerpc/include/asm/irqflags.h
+++ b/arch/powerpc/include/asm/irqflags.h
@@ -48,11 +48,11 @@ 
 #define RECONCILE_IRQ_STATE(__rA, __rB)		\
 	lbz	__rA,PACASOFTIRQEN(r13);	\
 	lbz	__rB,PACAIRQHAPPENED(r13);	\
-	cmpwi	cr0,__rA,IRQ_DISABLE_MASK_LINUX;\
+	andi.	__rA,__rA,IRQ_DISABLE_MASK_LINUX;\
 	li	__rA,IRQ_DISABLE_MASK_LINUX;	\
 	ori	__rB,__rB,PACA_IRQ_HARD_DIS;	\
 	stb	__rB,PACAIRQHAPPENED(r13);	\
-	beq	44f;				\
+	bne	44f;				\
 	stb	__rA,PACASOFTIRQEN(r13);	\
 	TRACE_DISABLE_INTS;			\
 44:
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 879aeb11ad29..533e363914a9 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -764,8 +764,8 @@  restore:
 	 */
 	ld	r5,SOFTE(r1)
 	lbz	r6,PACASOFTIRQEN(r13)
-	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
-	beq	restore_irq_off
+	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
+	bne	restore_irq_off
 
 	/* We are enabling, were we already enabled ? Yes, just return */
 	cmpwi	cr0,r6,IRQ_DISABLE_MASK_NONE
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 5c628b5696f6..8e40df2c2f30 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -212,8 +212,8 @@  END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
 	/* Interrupts had better not already be enabled... */
 	twnei	r6,IRQ_DISABLE_MASK_LINUX
 
-	cmpwi	cr0,r5,IRQ_DISABLE_MASK_LINUX
-	beq	1f
+	andi.	r5,r5,IRQ_DISABLE_MASK_LINUX
+	bne	1f
 
 	TRACE_ENABLE_INTS
 	stb	r5,PACASOFTIRQEN(r13)
@@ -352,7 +352,7 @@  ret_from_mc_except:
 
 #define PROLOG_ADDITION_MASKABLE_GEN(n)					    \
 	lbz	r10,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */	    \
-	cmpwi	cr0,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
+	andi.	r10,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
 	beq	masked_interrupt_book3e_##n
 
 #define PROLOG_ADDITION_2REGS_GEN(n)					    \