Re: [RFC PATCH v2 03/14] x86/hpet: Calculate ticks-per-second in a separate function

2019-04-08 Thread Ricardo Neri
On Tue, Mar 26, 2019 at 10:03:02PM +0100, Thomas Gleixner wrote:
> On Wed, 27 Feb 2019, Ricardo Neri wrote:
> >  int hpet_alloc(struct hpet_data *hdp)
> >  {
> > u64 cap, mcfg;
> > @@ -845,7 +868,6 @@ int hpet_alloc(struct hpet_data *hdp)
> > size_t siz;
> > struct hpet __iomem *hpet;
> > static struct hpets *last;
> > -   unsigned long period;
> > unsigned long long temp;
> > u32 remainder;
> >  
> > @@ -881,6 +903,8 @@ int hpet_alloc(struct hpet_data *hdp)
> >  
> > cap = readq(>hpet_cap);
> >  
> > +   temp = hpet_get_ticks_per_sec(cap);
> 
> Just putting stuff to random places does not make the code any better.

This seems to not be needed. I'll remove it and directly save the result
in hpetp->hp_tick_freq;

> 
> > ntimer = ((cap & HPET_NUM_TIM_CAP_MASK) >> HPET_NUM_TIM_CAP_SHIFT) + 1;
> >  
> > if (hpetp->hp_ntimer != ntimer) {
> > @@ -897,11 +921,6 @@ int hpet_alloc(struct hpet_data *hdp)
> >  
> > last = hpetp;
> >  
> > -   period = (cap & HPET_COUNTER_CLK_PERIOD_MASK) >>
> > -   HPET_COUNTER_CLK_PERIOD_SHIFT; /* fs, 10^-15 */
> > -   temp = 1000uLL; /* 10^15 femtoseconds per second */
> > -   temp += period >> 1; /* round */
> > -   do_div(temp, period);
> > hpetp->hp_tick_freq = temp; /* ticks per second */
> 
> What's wrong with the obvious:
> 
>hpetp->hp_tick_freq = hpet_get_ticks_per_sec(cap);
> 
> Hmm?

Nothing wrong. I'll implement this change.

Thanks and BR,
Ricardo


Re: [RFC PATCH v2 03/14] x86/hpet: Calculate ticks-per-second in a separate function

2019-03-26 Thread Thomas Gleixner
On Wed, 27 Feb 2019, Ricardo Neri wrote:
>  int hpet_alloc(struct hpet_data *hdp)
>  {
>   u64 cap, mcfg;
> @@ -845,7 +868,6 @@ int hpet_alloc(struct hpet_data *hdp)
>   size_t siz;
>   struct hpet __iomem *hpet;
>   static struct hpets *last;
> - unsigned long period;
>   unsigned long long temp;
>   u32 remainder;
>  
> @@ -881,6 +903,8 @@ int hpet_alloc(struct hpet_data *hdp)
>  
>   cap = readq(>hpet_cap);
>  
> + temp = hpet_get_ticks_per_sec(cap);

Just putting stuff to random places does not make the code any better.

>   ntimer = ((cap & HPET_NUM_TIM_CAP_MASK) >> HPET_NUM_TIM_CAP_SHIFT) + 1;
>  
>   if (hpetp->hp_ntimer != ntimer) {
> @@ -897,11 +921,6 @@ int hpet_alloc(struct hpet_data *hdp)
>  
>   last = hpetp;
>  
> - period = (cap & HPET_COUNTER_CLK_PERIOD_MASK) >>
> - HPET_COUNTER_CLK_PERIOD_SHIFT; /* fs, 10^-15 */
> - temp = 1000uLL; /* 10^15 femtoseconds per second */
> - temp += period >> 1; /* round */
> - do_div(temp, period);
>   hpetp->hp_tick_freq = temp; /* ticks per second */

What's wrong with the obvious:

   hpetp->hp_tick_freq = hpet_get_ticks_per_sec(cap);

Hmm?

Thanks,

tglx


[RFC PATCH v2 03/14] x86/hpet: Calculate ticks-per-second in a separate function

2019-02-27 Thread Ricardo Neri
It is easier to compute the expiration times of an HPET timer by using
its frequency (i.e., the number of times it ticks in a second) than its
period, as given in the capabilities register.

In addition to the HPET char driver, the HPET-based hardlockup detector
will also need to know the timer's frequency. Thus, create a common
function that both can use.

Cc: "H. Peter Anvin" 
Cc: Ashok Raj 
Cc: Andi Kleen 
Cc: Tony Luck 
Cc: Clemens Ladisch 
Cc: Arnd Bergmann 
Cc: Philippe Ombredanne 
Cc: Kate Stewart 
Cc: "Rafael J. Wysocki" 
Cc: "Ravi V. Shankar" 
Cc: x...@kernel.org
Signed-off-by: Ricardo Neri 
---
 drivers/char/hpet.c  | 31 +--
 include/linux/hpet.h |  1 +
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index 4a22b4b41aef..b73b68c0e127 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -836,6 +836,29 @@ static unsigned long hpet_calibrate(struct hpets *hpetp)
return ret;
 }
 
+u64 hpet_get_ticks_per_sec(u64 hpet_caps)
+{
+   u64 ticks_per_sec, period;
+
+   period = (hpet_caps & HPET_COUNTER_CLK_PERIOD_MASK) >>
+HPET_COUNTER_CLK_PERIOD_SHIFT; /* fs, 10^-15 */
+
+   /*
+* The frequency is the reciprocal of the period. The period is given
+* femtoseconds per second. Thus, prepare a dividend to obtain the
+* frequency in ticks per second.
+*/
+
+   /* 10^15 femtoseconds per second */
+   ticks_per_sec = 1000uLL;
+   ticks_per_sec += period >> 1; /* round */
+
+   /* The quotient is put in the dividend. We drop the remainder. */
+   do_div(ticks_per_sec, period);
+
+   return ticks_per_sec;
+}
+
 int hpet_alloc(struct hpet_data *hdp)
 {
u64 cap, mcfg;
@@ -845,7 +868,6 @@ int hpet_alloc(struct hpet_data *hdp)
size_t siz;
struct hpet __iomem *hpet;
static struct hpets *last;
-   unsigned long period;
unsigned long long temp;
u32 remainder;
 
@@ -881,6 +903,8 @@ int hpet_alloc(struct hpet_data *hdp)
 
cap = readq(>hpet_cap);
 
+   temp = hpet_get_ticks_per_sec(cap);
+
ntimer = ((cap & HPET_NUM_TIM_CAP_MASK) >> HPET_NUM_TIM_CAP_SHIFT) + 1;
 
if (hpetp->hp_ntimer != ntimer) {
@@ -897,11 +921,6 @@ int hpet_alloc(struct hpet_data *hdp)
 
last = hpetp;
 
-   period = (cap & HPET_COUNTER_CLK_PERIOD_MASK) >>
-   HPET_COUNTER_CLK_PERIOD_SHIFT; /* fs, 10^-15 */
-   temp = 1000uLL; /* 10^15 femtoseconds per second */
-   temp += period >> 1; /* round */
-   do_div(temp, period);
hpetp->hp_tick_freq = temp; /* ticks per second */
 
printk(KERN_INFO "hpet%d: at MMIO 0x%lx, IRQ%s",
diff --git a/include/linux/hpet.h b/include/linux/hpet.h
index 8604564b985d..e7b36bcf4699 100644
--- a/include/linux/hpet.h
+++ b/include/linux/hpet.h
@@ -107,5 +107,6 @@ static inline void hpet_reserve_timer(struct hpet_data *hd, 
int timer)
 }
 
 int hpet_alloc(struct hpet_data *);
+u64 hpet_get_ticks_per_sec(u64 hpet_caps);
 
 #endif /* !__HPET__ */
-- 
2.17.1