Messages in this thread | | | Date | Fri, 13 May 2022 14:19:44 -0700 | From | Ricardo Neri <> | Subject | Re: [PATCH v6 15/29] x86/hpet: Add helper function hpet_set_comparator_periodic() |
| |
On Fri, May 06, 2022 at 11:41:13PM +0200, Thomas Gleixner wrote: > On Thu, May 05 2022 at 16:59, Ricardo Neri wrote: > > Programming an HPET channel as periodic requires setting the > > HPET_TN_SETVAL bit in the channel configuration. Plus, the comparator > > register must be written twice (once for the comparator value and once for > > the periodic value). Since this programming might be needed in several > > places (e.g., the HPET clocksource and the HPET-based hardlockup detector), > > add a helper function for this purpose. > > > > A helper function hpet_set_comparator_oneshot() could also be implemented. > > However, such function would only program the comparator register and the > > function would be quite small. Hence, it is better to not bloat the code > > with such an obvious function. > > This word salad above does not provide a single reason why the periodic > programming function is required and better suited for the NMI watchdog > case
The goal of hpet_set_comparator_periodic() is to avoid code duplication. The functions hpet_clkevt_set_state_periodic() and kick_timer() in the HPET NMI watchdog need to program a periodic HPET channel when supported.
> and then goes on and blurbs about why a function which is not > required is not implemented.
I can remove this.
> The argument about not bloating the code > with an "obvious???" function which is quite small is slightly beyond my > comprehension level.
That obvious function would look like this:
void hpet_set_comparator_one_shot(int channel, u32 delta) { u32 count;
count = hpet_readl(HPET_COUNTER); count += delta; hpet_writel(count, HPET_Tn_CMP(channel)); }
It involves one register read, one addition and one register write. IMO, this code is sufficiently simple and small to allow duplication.
Programming a periodic HPET channel is not as straightforward, IMO. It involves handling two different values (period and comparator) written in a specific sequence, one configuration bit, and one delay. It also involves three register writes and one register read.
Thanks and BR, Ricardo
| |