Re: [RFC PATCH v3 03/21] x86/hpet: Calculate ticks-per-second in a separate function
On Tue, May 14, 2019 at 07:23:47AM -0700, Randy Dunlap wrote: > On 5/14/19 7:01 AM, Ricardo Neri wrote: > > 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: Stephane Eranian > > Cc: Suravee Suthikulpanit > > 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, 25 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c > > index d0ad85900b79..bdcbecfdb858 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 > >* in femtoseconds per second. > Thanks for your review Randy! I'll fix this grammar issue. > > +* frequency in ticks per second. > > +*/ > > + > > + /* 10^15 femtoseconds per second */ > > + ticks_per_sec = 1000uLL; > > ULL is overwhelmingly used in the kernel. > Sure, I'll update it. BR, Ricardo
Re: [RFC PATCH v3 03/21] x86/hpet: Calculate ticks-per-second in a separate function
On 5/14/19 7:01 AM, Ricardo Neri wrote: > 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: Stephane Eranian > Cc: Suravee Suthikulpanit > 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, 25 insertions(+), 7 deletions(-) > > diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c > index d0ad85900b79..bdcbecfdb858 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 * in femtoseconds per second. > + * frequency in ticks per second. > + */ > + > + /* 10^15 femtoseconds per second */ > + ticks_per_sec = 1000uLL; ULL is overwhelmingly used in the kernel. > + 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; > @@ -844,7 +867,6 @@ int hpet_alloc(struct hpet_data *hdp) > struct hpets *hpetp; > struct hpet __iomem *hpet; > static struct hpets *last; > - unsigned long period; > unsigned long long temp; > u32 remainder; > > @@ -894,12 +916,7 @@ 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 */ > + hpetp->hp_tick_freq = hpet_get_ticks_per_sec(cap); > > printk(KERN_INFO "hpet%d: at MMIO 0x%lx, IRQ%s", > hpetp->hp_which, hdp->hd_phys_address, > 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__ */ > -- ~Randy ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
[RFC PATCH v3 03/21] x86/hpet: Calculate ticks-per-second in a separate function
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: Stephane Eranian Cc: Suravee Suthikulpanit 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, 25 insertions(+), 7 deletions(-) diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index d0ad85900b79..bdcbecfdb858 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; @@ -844,7 +867,6 @@ int hpet_alloc(struct hpet_data *hdp) struct hpets *hpetp; struct hpet __iomem *hpet; static struct hpets *last; - unsigned long period; unsigned long long temp; u32 remainder; @@ -894,12 +916,7 @@ 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 */ + hpetp->hp_tick_freq = hpet_get_ticks_per_sec(cap); printk(KERN_INFO "hpet%d: at MMIO 0x%lx, IRQ%s", hpetp->hp_which, hdp->hd_phys_address, 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 ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu