diff options
author | Peter Maydell | 2021-01-28 12:41:21 +0100 |
---|---|---|
committer | Peter Maydell | 2021-01-29 16:54:42 +0100 |
commit | ad140dadd591cdfd47959a7b4538e8133053b3c7 (patch) | |
tree | 49668bb984275142dfd07f2c9b5112ac6ea0a63f /include/hw | |
parent | tests/qtest: add a test case for pvpanic-pci (diff) | |
download | qemu-ad140dadd591cdfd47959a7b4538e8133053b3c7.tar.gz qemu-ad140dadd591cdfd47959a7b4538e8133053b3c7.tar.xz qemu-ad140dadd591cdfd47959a7b4538e8133053b3c7.zip |
ptimer: Add new ptimer_set_period_from_clock() function
The ptimer API currently provides two methods for setting the period:
ptimer_set_period(), which takes a period in nanoseconds, and
ptimer_set_freq(), which takes a frequency in Hz. Neither of these
lines up nicely with the Clock API, because although both the Clock
and the ptimer track the frequency using a representation of whole
and fractional nanoseconds, conversion via either period-in-ns or
frequency-in-Hz will introduce a rounding error.
Add a new function ptimer_set_period_from_clock() which takes the
Clock object directly to avoid the rounding issues. This includes a
facility for the user to specify that there is a frequency divider
between the Clock proper and the timer, as some timer devices like
the CMSDK APB dualtimer need this.
To avoid having to drag in clock.h from ptimer.h we add the Clock
type to typedefs.h.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Luc Michel <luc@lmichel.fr>
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 20210128114145.20536-2-peter.maydell@linaro.org
Message-id: 20210121190622.22000-2-peter.maydell@linaro.org
Diffstat (limited to 'include/hw')
-rw-r--r-- | include/hw/ptimer.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h index 412763fffb..c443218475 100644 --- a/include/hw/ptimer.h +++ b/include/hw/ptimer.h @@ -166,6 +166,28 @@ void ptimer_transaction_commit(ptimer_state *s); void ptimer_set_period(ptimer_state *s, int64_t period); /** + * ptimer_set_period_from_clock - Set counter increment from a Clock + * @s: ptimer to configure + * @clk: pointer to Clock object to take period from + * @divisor: value to scale the clock frequency down by + * + * If the ptimer is being driven from a Clock, this is the preferred + * way to tell the ptimer about the period, because it avoids any + * possible rounding errors that might happen if the internal + * representation of the Clock period was converted to either a period + * in ns or a frequency in Hz. + * + * If the ptimer should run at the same frequency as the clock, + * pass 1 as the @divisor; if the ptimer should run at half the + * frequency, pass 2, and so on. + * + * This function will assert if it is called outside a + * ptimer_transaction_begin/commit block. + */ +void ptimer_set_period_from_clock(ptimer_state *s, const Clock *clock, + unsigned int divisor); + +/** * ptimer_set_freq - Set counter frequency in Hz * @s: ptimer to configure * @freq: counter frequency in Hz |