Re: [PATCH 1/2] powerpc/timer - large decrementer support

2016-06-02 Thread Balbir Singh


On 01/06/16 15:28, Michael Neuling wrote:
> On Tue, 2016-05-31 at 17:16 +1000, Oliver O'Halloran wrote:
>> POWER ISA v3 adds large decrementer (LD) mode of operation which
>> increases
>> the size of the decrementer register from 32 bits to an implementation
>> defined with of up to 64 bits.
>>
>> This patch adds support for the LD on processors with the
>> CPU_FTR_ARCH_300
>> cpu feature flag set. For CPUs with this feature LD mode is enabled when
>> when the ibm,dec-bits devicetree property is supplied for the boot CPU.
>> The
>> decrementer value is a signed quantity (with negative values indicating a
>> pending exception) and this property is required to find the maximum
>> positive decrementer value. If this property is not supplied then the
>> traditional decrementer width of 32 bits is assumed and LD mode is
>> disabled.
>>
>> This patch was based on initial work by Jack Miller.
>>
>> Signed-off-by: Oliver O'Halloran 
>> Cc: Michael Neuling 
> 
> Acked-by: Michael Neuling 
> 
>> Cc: Balbir Singh 
>> Cc: Jack Miller 

I had reviewed a previous post of this patchset

Reviewed-by: Balbir Singh 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] powerpc/timer - large decrementer support

2016-05-31 Thread Michael Neuling
On Tue, 2016-05-31 at 17:16 +1000, Oliver O'Halloran wrote:
> POWER ISA v3 adds large decrementer (LD) mode of operation which
> increases
> the size of the decrementer register from 32 bits to an implementation
> defined with of up to 64 bits.
> 
> This patch adds support for the LD on processors with the
> CPU_FTR_ARCH_300
> cpu feature flag set. For CPUs with this feature LD mode is enabled when
> when the ibm,dec-bits devicetree property is supplied for the boot CPU.
> The
> decrementer value is a signed quantity (with negative values indicating a
> pending exception) and this property is required to find the maximum
> positive decrementer value. If this property is not supplied then the
> traditional decrementer width of 32 bits is assumed and LD mode is
> disabled.
> 
> This patch was based on initial work by Jack Miller.
> 
> Signed-off-by: Oliver O'Halloran 
> Cc: Michael Neuling 

Acked-by: Michael Neuling 

> Cc: Balbir Singh 
> Cc: Jack Miller 
> ---
>  arch/powerpc/include/asm/reg.h  |  1 +
>  arch/powerpc/include/asm/time.h |  6 +--
>  arch/powerpc/kernel/time.c  | 94
> +
>  3 files changed, 90 insertions(+), 11 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/reg.h
> b/arch/powerpc/include/asm/reg.h
> index c1e82e968506..2793f3f03f9b 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -332,6 +332,7 @@
>  #define   LPCR_AIL_0 0x  /* MMU off exception
> offset 0x0 */
>  #define   LPCR_AIL_3 0x0180  /* MMU on exception offset
> 0xc00...4xxx */
>  #define   LPCR_ONL   0x0004  /* online - PURR/SPURR count
> */
> +#define   LPCR_LD0x0002  /* large decremeter */
>  #define   LPCR_PECE  0x0001f000  /* powersave exit cause
> enable */
>  #define LPCR_PECEDP  0x0001  /* directed priv dbells
> cause exit */
>  #define LPCR_PECEDH  0x8000  /* directed hyp dbells
> cause exit */
> diff --git a/arch/powerpc/include/asm/time.h
> b/arch/powerpc/include/asm/time.h
> index 1092fdd7e737..09211640a0e0 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -146,7 +146,7 @@ static inline void set_tb(unsigned int upper,
> unsigned int lower)
>   * in auto-reload mode.  The problem is PIT stops counting when it
>   * hits zero.  If it would wrap, we could use it just like a
> decrementer.
>   */
> -static inline unsigned int get_dec(void)
> +static inline u64 get_dec(void)
>  {
>  #if defined(CONFIG_40x)
>   return (mfspr(SPRN_PIT));
> @@ -160,10 +160,10 @@ static inline unsigned int get_dec(void)
>   * in when the decrementer generates its interrupt: on the 1 to 0
>   * transition for Book E/4xx, but on the 0 to -1 transition for others.
>   */
> -static inline void set_dec(int val)
> +static inline void set_dec(u64 val)
>  {
>  #if defined(CONFIG_40x)
> - mtspr(SPRN_PIT, val);
> + mtspr(SPRN_PIT, (u32) val);
>  #else
>  #ifndef CONFIG_BOOKE
>   --val;
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 3ed9a5a21d77..fe66f1c8d8b2 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -96,7 +96,8 @@ static struct clocksource clocksource_timebase = {
>   .read = timebase_read,
>  };
>  
> -#define DECREMENTER_MAX  0x7fff
> +#define DECREMENTER_DEFAULT_MAX 0x7FFF
> +u64 decrementer_max = DECREMENTER_DEFAULT_MAX;
>  
>  static int decrementer_set_next_event(unsigned long evt,
>     struct clock_event_device *dev);
> @@ -504,8 +505,8 @@ static void __timer_interrupt(void)
>   __this_cpu_inc(irq_stat.timer_irqs_event);
>   } else {
>   now = *next_tb - now;
> - if (now <= DECREMENTER_MAX)
> - set_dec((int)now);
> + if (now <= decrementer_max)
> + set_dec(now);
>   /* We may have raced with new irq work */
>   if (test_irq_work_pending())
>   set_dec(1);
> @@ -535,7 +536,7 @@ void timer_interrupt(struct pt_regs * regs)
>   /* Ensure a positive value is written to the decrementer, or
> else
>    * some CPUs will continue to take decrementer exceptions.
>    */
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>  
>   /* Some implementations of hotplug will get timer interrupts
> while
>    * offline, just ignore these and we also need to set
> @@ -583,9 +584,9 @@ static void generic_suspend_disable_irqs(void)
>    * with suspending.
>    */
>  
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>   local_irq_disable();
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>  }
>  
>  static void generic_suspend_enable_irqs(void)
> @@ -866,7 +867,7 @@ static int decrementer_set_next_event(unsigned long
> evt,
>  
>  static int decrementer_shutdown(struct clock_event_device *dev)
>  {
> -  

[PATCH 1/2] powerpc/timer - large decrementer support

2016-05-31 Thread Oliver O'Halloran
POWER ISA v3 adds large decrementer (LD) mode of operation which increases
the size of the decrementer register from 32 bits to an implementation
defined with of up to 64 bits.

This patch adds support for the LD on processors with the CPU_FTR_ARCH_300
cpu feature flag set. For CPUs with this feature LD mode is enabled when
when the ibm,dec-bits devicetree property is supplied for the boot CPU. The
decrementer value is a signed quantity (with negative values indicating a
pending exception) and this property is required to find the maximum
positive decrementer value. If this property is not supplied then the
traditional decrementer width of 32 bits is assumed and LD mode is disabled.

This patch was based on initial work by Jack Miller.

Signed-off-by: Oliver O'Halloran 
Cc: Michael Neuling 
Cc: Balbir Singh 
Cc: Jack Miller 
---
 arch/powerpc/include/asm/reg.h  |  1 +
 arch/powerpc/include/asm/time.h |  6 +--
 arch/powerpc/kernel/time.c  | 94 +
 3 files changed, 90 insertions(+), 11 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index c1e82e968506..2793f3f03f9b 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -332,6 +332,7 @@
 #define   LPCR_AIL_0   0x  /* MMU off exception offset 0x0 */
 #define   LPCR_AIL_3   0x0180  /* MMU on exception offset 0xc00...4xxx 
*/
 #define   LPCR_ONL 0x0004  /* online - PURR/SPURR count */
+#define   LPCR_LD  0x0002  /* large decremeter */
 #define   LPCR_PECE0x0001f000  /* powersave exit cause enable */
 #define LPCR_PECEDP0x0001  /* directed priv dbells cause 
exit */
 #define LPCR_PECEDH0x8000  /* directed hyp dbells cause 
exit */
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index 1092fdd7e737..09211640a0e0 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -146,7 +146,7 @@ static inline void set_tb(unsigned int upper, unsigned int 
lower)
  * in auto-reload mode.  The problem is PIT stops counting when it
  * hits zero.  If it would wrap, we could use it just like a decrementer.
  */
-static inline unsigned int get_dec(void)
+static inline u64 get_dec(void)
 {
 #if defined(CONFIG_40x)
return (mfspr(SPRN_PIT));
@@ -160,10 +160,10 @@ static inline unsigned int get_dec(void)
  * in when the decrementer generates its interrupt: on the 1 to 0
  * transition for Book E/4xx, but on the 0 to -1 transition for others.
  */
-static inline void set_dec(int val)
+static inline void set_dec(u64 val)
 {
 #if defined(CONFIG_40x)
-   mtspr(SPRN_PIT, val);
+   mtspr(SPRN_PIT, (u32) val);
 #else
 #ifndef CONFIG_BOOKE
--val;
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 3ed9a5a21d77..fe66f1c8d8b2 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -96,7 +96,8 @@ static struct clocksource clocksource_timebase = {
.read = timebase_read,
 };
 
-#define DECREMENTER_MAX0x7fff
+#define DECREMENTER_DEFAULT_MAX 0x7FFF
+u64 decrementer_max = DECREMENTER_DEFAULT_MAX;
 
 static int decrementer_set_next_event(unsigned long evt,
  struct clock_event_device *dev);
@@ -504,8 +505,8 @@ static void __timer_interrupt(void)
__this_cpu_inc(irq_stat.timer_irqs_event);
} else {
now = *next_tb - now;
-   if (now <= DECREMENTER_MAX)
-   set_dec((int)now);
+   if (now <= decrementer_max)
+   set_dec(now);
/* We may have raced with new irq work */
if (test_irq_work_pending())
set_dec(1);
@@ -535,7 +536,7 @@ void timer_interrupt(struct pt_regs * regs)
/* Ensure a positive value is written to the decrementer, or else
 * some CPUs will continue to take decrementer exceptions.
 */
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
 
/* Some implementations of hotplug will get timer interrupts while
 * offline, just ignore these and we also need to set
@@ -583,9 +584,9 @@ static void generic_suspend_disable_irqs(void)
 * with suspending.
 */
 
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
local_irq_disable();
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
 }
 
 static void generic_suspend_enable_irqs(void)
@@ -866,7 +867,7 @@ static int decrementer_set_next_event(unsigned long evt,
 
 static int decrementer_shutdown(struct clock_event_device *dev)
 {
-   decrementer_set_next_event(DECREMENTER_MAX, dev);
+   decrementer_set_next_event(decrementer_max, dev);
return 0;
 }
 
@@ -892,6 +893,76 @@ static void register_decrementer_clockevent(int cpu)
clockevents_register_device(dec);
 }
 
+static inline

Re: [PATCH 1/2] powerpc/timer - large decrementer support

2016-04-12 Thread Balbir Singh


On 12/04/16 14:38, Oliver O'Halloran wrote:
> POWER ISA v3 adds large decrementer (LD) mode of operation which increases
> the size of the decrementer register from 32 bits to an implementation
> defined with of up to 64 bits.
> 
> This patch adds support for the LD on processors with the CPU_FTR_ARCH_300
> cpu feature flag set. Even for CPUs with this feature LD mode is only
> enabled when the property ibm,dec-bits devicetree property is supplied
> for the boot CPU. The decrementer value is a signed quantity (with
> negative values indicating a pending exception) and this property is
> required to find the maximum positive decrementer value. If this property
> is not supplied then the traditional decrementer width of 32 bits is
> assumed and LD mode is disabled.
> 
> This patch was based on inital work by Jack Miller.
> 
> Signed-off-by: Oliver O'Halloran 
> Cc: Jack Miller 
> ---
>  arch/powerpc/include/asm/reg.h  |  1 +
>  arch/powerpc/include/asm/time.h |  6 +--
>  arch/powerpc/kernel/time.c  | 89 
> +
>  3 files changed, 86 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> index f5f4c66bbbc9..ff581ed1ab9d 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -332,6 +332,7 @@
>  #define   LPCR_AIL_0 0x  /* MMU off exception offset 0x0 */
>  #define   LPCR_AIL_3 0x0180  /* MMU on exception offset 0xc00...4xxx 
> */
>  #define   LPCR_ONL   0x0004  /* online - PURR/SPURR count */
> +#define   LPCR_LD0x0002  /* large decremeter */
>  #define   LPCR_PECE  0x0001f000  /* powersave exit cause enable */
>  #define LPCR_PECEDP  0x0001  /* directed priv dbells cause 
> exit */
>  #define LPCR_PECEDH  0x8000  /* directed hyp dbells cause 
> exit */
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 1092fdd7e737..09211640a0e0 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -146,7 +146,7 @@ static inline void set_tb(unsigned int upper, unsigned 
> int lower)
>   * in auto-reload mode.  The problem is PIT stops counting when it
>   * hits zero.  If it would wrap, we could use it just like a decrementer.
>   */
> -static inline unsigned int get_dec(void)
> +static inline u64 get_dec(void)
>  {
>  #if defined(CONFIG_40x)
>   return (mfspr(SPRN_PIT));
> @@ -160,10 +160,10 @@ static inline unsigned int get_dec(void)
>   * in when the decrementer generates its interrupt: on the 1 to 0
>   * transition for Book E/4xx, but on the 0 to -1 transition for others.
>   */
> -static inline void set_dec(int val)
> +static inline void set_dec(u64 val)
>  {
>  #if defined(CONFIG_40x)
> - mtspr(SPRN_PIT, val);
> + mtspr(SPRN_PIT, (u32) val);

We seem to be moving from signed (int) to unsigned 64 (u64). Could
you check to see if that breaks anything?



>  #else
>  #ifndef CONFIG_BOOKE
>   --val;
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 81b0900a39ee..0afaef6b5b6a 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -95,7 +95,8 @@ static struct clocksource clocksource_timebase = {
>   .read = timebase_read,
>  };
>  
> -#define DECREMENTER_MAX  0x7fff
> +#define DECREMENTER_DEFAULT_MAX 0x7FFF
> +u64 decrementer_max = DECREMENTER_DEFAULT_MAX;
>  
>  static int decrementer_set_next_event(unsigned long evt,
> struct clock_event_device *dev);
> @@ -503,7 +504,7 @@ static void __timer_interrupt(void)
>   __this_cpu_inc(irq_stat.timer_irqs_event);
>   } else {
>   now = *next_tb - now;
> - if (now <= DECREMENTER_MAX)
> + if (now <= decrementer_max)
>   set_dec((int)now);


>   /* We may have raced with new irq work */
>   if (test_irq_work_pending())
> @@ -534,7 +535,7 @@ void timer_interrupt(struct pt_regs * regs)
>   /* Ensure a positive value is written to the decrementer, or else
>* some CPUs will continue to take decrementer exceptions.
>*/
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>  
>   /* Some implementations of hotplug will get timer interrupts while
>* offline, just ignore these and we also need to set
> @@ -562,6 +563,7 @@ void timer_interrupt(struct pt_regs * regs)
>   irq_enter();
>  
>   __timer_interrupt();
> +

blank space -- required?

>   irq_exit();
>   set_irq_regs(old_regs);
>  }
> @@ -582,9 +584,9 @@ static void generic_suspend_disable_irqs(void)
>* with suspending.
>*/
>  
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>   local_irq_disable();
> - set_dec(DECREMENTER_MAX);
> + set_dec(decrementer_max);
>  }
>  
>  static void generic_suspend_enable_irqs(void)
> @

[PATCH 1/2] powerpc/timer - large decrementer support

2016-04-11 Thread Oliver O'Halloran
POWER ISA v3 adds large decrementer (LD) mode of operation which increases
the size of the decrementer register from 32 bits to an implementation
defined with of up to 64 bits.

This patch adds support for the LD on processors with the CPU_FTR_ARCH_300
cpu feature flag set. Even for CPUs with this feature LD mode is only
enabled when the property ibm,dec-bits devicetree property is supplied
for the boot CPU. The decrementer value is a signed quantity (with
negative values indicating a pending exception) and this property is
required to find the maximum positive decrementer value. If this property
is not supplied then the traditional decrementer width of 32 bits is
assumed and LD mode is disabled.

This patch was based on inital work by Jack Miller.

Signed-off-by: Oliver O'Halloran 
Cc: Jack Miller 
---
 arch/powerpc/include/asm/reg.h  |  1 +
 arch/powerpc/include/asm/time.h |  6 +--
 arch/powerpc/kernel/time.c  | 89 +
 3 files changed, 86 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index f5f4c66bbbc9..ff581ed1ab9d 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -332,6 +332,7 @@
 #define   LPCR_AIL_0   0x  /* MMU off exception offset 0x0 */
 #define   LPCR_AIL_3   0x0180  /* MMU on exception offset 0xc00...4xxx 
*/
 #define   LPCR_ONL 0x0004  /* online - PURR/SPURR count */
+#define   LPCR_LD  0x0002  /* large decremeter */
 #define   LPCR_PECE0x0001f000  /* powersave exit cause enable */
 #define LPCR_PECEDP0x0001  /* directed priv dbells cause 
exit */
 #define LPCR_PECEDH0x8000  /* directed hyp dbells cause 
exit */
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index 1092fdd7e737..09211640a0e0 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -146,7 +146,7 @@ static inline void set_tb(unsigned int upper, unsigned int 
lower)
  * in auto-reload mode.  The problem is PIT stops counting when it
  * hits zero.  If it would wrap, we could use it just like a decrementer.
  */
-static inline unsigned int get_dec(void)
+static inline u64 get_dec(void)
 {
 #if defined(CONFIG_40x)
return (mfspr(SPRN_PIT));
@@ -160,10 +160,10 @@ static inline unsigned int get_dec(void)
  * in when the decrementer generates its interrupt: on the 1 to 0
  * transition for Book E/4xx, but on the 0 to -1 transition for others.
  */
-static inline void set_dec(int val)
+static inline void set_dec(u64 val)
 {
 #if defined(CONFIG_40x)
-   mtspr(SPRN_PIT, val);
+   mtspr(SPRN_PIT, (u32) val);
 #else
 #ifndef CONFIG_BOOKE
--val;
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 81b0900a39ee..0afaef6b5b6a 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -95,7 +95,8 @@ static struct clocksource clocksource_timebase = {
.read = timebase_read,
 };
 
-#define DECREMENTER_MAX0x7fff
+#define DECREMENTER_DEFAULT_MAX 0x7FFF
+u64 decrementer_max = DECREMENTER_DEFAULT_MAX;
 
 static int decrementer_set_next_event(unsigned long evt,
  struct clock_event_device *dev);
@@ -503,7 +504,7 @@ static void __timer_interrupt(void)
__this_cpu_inc(irq_stat.timer_irqs_event);
} else {
now = *next_tb - now;
-   if (now <= DECREMENTER_MAX)
+   if (now <= decrementer_max)
set_dec((int)now);
/* We may have raced with new irq work */
if (test_irq_work_pending())
@@ -534,7 +535,7 @@ void timer_interrupt(struct pt_regs * regs)
/* Ensure a positive value is written to the decrementer, or else
 * some CPUs will continue to take decrementer exceptions.
 */
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
 
/* Some implementations of hotplug will get timer interrupts while
 * offline, just ignore these and we also need to set
@@ -562,6 +563,7 @@ void timer_interrupt(struct pt_regs * regs)
irq_enter();
 
__timer_interrupt();
+
irq_exit();
set_irq_regs(old_regs);
 }
@@ -582,9 +584,9 @@ static void generic_suspend_disable_irqs(void)
 * with suspending.
 */
 
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
local_irq_disable();
-   set_dec(DECREMENTER_MAX);
+   set_dec(decrementer_max);
 }
 
 static void generic_suspend_enable_irqs(void)
@@ -865,7 +867,7 @@ static int decrementer_set_next_event(unsigned long evt,
 
 static int decrementer_shutdown(struct clock_event_device *dev)
 {
-   decrementer_set_next_event(DECREMENTER_MAX, dev);
+   decrementer_set_next_event(decrementer_max, dev);
return 0;
 }
 
@@ -891,6 +893,72 @@ static void register_decrementer_clockeve