* [PATCH-for-9.0 0/2] hw/clock: Propagate clock changes when STM32L4X5 MUX is updated
@ 2024-03-22 15:58 Philippe Mathieu-Daudé
2024-03-22 15:58 ` [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value Philippe Mathieu-Daudé
2024-03-22 15:58 ` [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock Philippe Mathieu-Daudé
0 siblings, 2 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-03-22 15:58 UTC (permalink / raw)
To: qemu-devel
Cc: Luc Michel, Luc Michel, Damien Hedde, Inès Varhol,
Arnaud Minier, qemu-arm, Philippe Mathieu-Daudé
Per https://www.qemu.org/docs/master/devel/clocks.html#clock-multiplier-and-divider-settings:
Note that clock_set_mul_div() does not automatically call
clock_propagate(). If you make a runtime change to the
multiplier or divider you must call clock_propagate() yourself.
Fix what we forgot to do that in recent commit ec7d83acbd
("hw/misc/stm32l4x5_rcc: Add an internal clock multiplexer object")
Arnaud Minier (1):
hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock
Philippe Mathieu-Daudé (1):
hw/clock: Let clock_set_mul_div() return boolean value
include/hw/clock.h | 4 +++-
hw/core/clock.c | 8 +++++++-
hw/misc/stm32l4x5_rcc.c | 5 ++++-
3 files changed, 14 insertions(+), 3 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value 2024-03-22 15:58 [PATCH-for-9.0 0/2] hw/clock: Propagate clock changes when STM32L4X5 MUX is updated Philippe Mathieu-Daudé @ 2024-03-22 15:58 ` Philippe Mathieu-Daudé 2024-03-22 16:40 ` Peter Maydell 2024-03-25 8:40 ` Luc Michel 2024-03-22 15:58 ` [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock Philippe Mathieu-Daudé 1 sibling, 2 replies; 8+ messages in thread From: Philippe Mathieu-Daudé @ 2024-03-22 15:58 UTC (permalink / raw) To: qemu-devel Cc: Luc Michel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm, Philippe Mathieu-Daudé Let clock_set_mul_div() return a boolean value whether the clock has been updated or not, similarly to clock_set(). Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- include/hw/clock.h | 4 +++- hw/core/clock.c | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/hw/clock.h b/include/hw/clock.h index bb12117f67..eb58599131 100644 --- a/include/hw/clock.h +++ b/include/hw/clock.h @@ -357,6 +357,8 @@ char *clock_display_freq(Clock *clk); * @multiplier: multiplier value * @divider: divider value * + * @return: true if the clock is changed. + * * By default, a Clock's children will all run with the same period * as their parent. This function allows you to adjust the multiplier * and divider used to derive the child clock frequency. @@ -374,6 +376,6 @@ char *clock_display_freq(Clock *clk); * Note that this function does not call clock_propagate(); the * caller should do that if necessary. */ -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); #endif /* QEMU_HW_CLOCK_H */ diff --git a/hw/core/clock.c b/hw/core/clock.c index d82e44cd1a..a19c7db7df 100644 --- a/hw/core/clock.c +++ b/hw/core/clock.c @@ -143,14 +143,20 @@ char *clock_display_freq(Clock *clk) return freq_to_str(clock_get_hz(clk)); } -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) { assert(divider != 0); + if (clk->multiplier == multiplier && clk->divider == divider) { + return false; + } + trace_clock_set_mul_div(CLOCK_PATH(clk), clk->multiplier, multiplier, clk->divider, divider); clk->multiplier = multiplier; clk->divider = divider; + + return true; } static void clock_initfn(Object *obj) -- 2.41.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value 2024-03-22 15:58 ` [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value Philippe Mathieu-Daudé @ 2024-03-22 16:40 ` Peter Maydell 2024-03-25 8:40 ` Luc Michel 1 sibling, 0 replies; 8+ messages in thread From: Peter Maydell @ 2024-03-22 16:40 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Luc Michel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm On Fri, 22 Mar 2024 at 15:58, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > Let clock_set_mul_div() return a boolean value whether the > clock has been updated or not, similarly to clock_set(). > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > include/hw/clock.h | 4 +++- > hw/core/clock.c | 8 +++++++- > 2 files changed, 10 insertions(+), 2 deletions(-) I guess this makes sense, especially since you often would like to know this to decide whether to call clock_propagate(). We should also update the docs/devel/clocks.rst to mention this. thanks -- PMM ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value 2024-03-22 15:58 ` [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value Philippe Mathieu-Daudé 2024-03-22 16:40 ` Peter Maydell @ 2024-03-25 8:40 ` Luc Michel 2024-03-25 9:05 ` Luc Michel 1 sibling, 1 reply; 8+ messages in thread From: Luc Michel @ 2024-03-25 8:40 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm On 16:58 Fri 22 Mar , Philippe Mathieu-Daudé wrote: > Let clock_set_mul_div() return a boolean value whether the > clock has been updated or not, similarly to clock_set(). > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Acked-by: Luc Michel <luc@lmichel.fr> > --- > include/hw/clock.h | 4 +++- > hw/core/clock.c | 8 +++++++- > 2 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/include/hw/clock.h b/include/hw/clock.h > index bb12117f67..eb58599131 100644 > --- a/include/hw/clock.h > +++ b/include/hw/clock.h > @@ -357,6 +357,8 @@ char *clock_display_freq(Clock *clk); > * @multiplier: multiplier value > * @divider: divider value > * > + * @return: true if the clock is changed. > + * > * By default, a Clock's children will all run with the same period > * as their parent. This function allows you to adjust the multiplier > * and divider used to derive the child clock frequency. > @@ -374,6 +376,6 @@ char *clock_display_freq(Clock *clk); > * Note that this function does not call clock_propagate(); the > * caller should do that if necessary. > */ > -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); > +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); > > #endif /* QEMU_HW_CLOCK_H */ > diff --git a/hw/core/clock.c b/hw/core/clock.c > index d82e44cd1a..a19c7db7df 100644 > --- a/hw/core/clock.c > +++ b/hw/core/clock.c > @@ -143,14 +143,20 @@ char *clock_display_freq(Clock *clk) > return freq_to_str(clock_get_hz(clk)); > } > > -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) > +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) > { > assert(divider != 0); > > + if (clk->multiplier == multiplier && clk->divider == divider) { > + return false; > + } > + > trace_clock_set_mul_div(CLOCK_PATH(clk), clk->multiplier, multiplier, > clk->divider, divider); > clk->multiplier = multiplier; > clk->divider = divider; > + > + return true; > } > > static void clock_initfn(Object *obj) > -- > 2.41.0 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value 2024-03-25 8:40 ` Luc Michel @ 2024-03-25 9:05 ` Luc Michel 0 siblings, 0 replies; 8+ messages in thread From: Luc Michel @ 2024-03-25 9:05 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm On 09:40 Mon 25 Mar , Luc Michel wrote: > On 16:58 Fri 22 Mar , Philippe Mathieu-Daudé wrote: > > Let clock_set_mul_div() return a boolean value whether the > > clock has been updated or not, similarly to clock_set(). > > > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > > Acked-by: Luc Michel <luc@lmichel.fr> Sorry, I forgot, as Peter suggested, can you add a word in the doc about this? Something in the vein of: + Similary to ``clock_set()``, ``clock_set_mul_div()`` returns ``true`` if + the clock state was modified, that it, if the multiplier or the diviser + or both were changed by the call. + Note that ``clock_set_mul_div()`` does not automatically call ``clock_propagate()``. If you make a runtime change to the multiplier or divider you must call clock_propagate() yourself. Thanks! -- Luc > > > --- > > include/hw/clock.h | 4 +++- > > hw/core/clock.c | 8 +++++++- > > 2 files changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/include/hw/clock.h b/include/hw/clock.h > > index bb12117f67..eb58599131 100644 > > --- a/include/hw/clock.h > > +++ b/include/hw/clock.h > > @@ -357,6 +357,8 @@ char *clock_display_freq(Clock *clk); > > * @multiplier: multiplier value > > * @divider: divider value > > * > > + * @return: true if the clock is changed. > > + * > > * By default, a Clock's children will all run with the same period > > * as their parent. This function allows you to adjust the multiplier > > * and divider used to derive the child clock frequency. > > @@ -374,6 +376,6 @@ char *clock_display_freq(Clock *clk); > > * Note that this function does not call clock_propagate(); the > > * caller should do that if necessary. > > */ > > -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); > > +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider); > > > > #endif /* QEMU_HW_CLOCK_H */ > > diff --git a/hw/core/clock.c b/hw/core/clock.c > > index d82e44cd1a..a19c7db7df 100644 > > --- a/hw/core/clock.c > > +++ b/hw/core/clock.c > > @@ -143,14 +143,20 @@ char *clock_display_freq(Clock *clk) > > return freq_to_str(clock_get_hz(clk)); > > } > > > > -void clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) > > +bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) > > { > > assert(divider != 0); > > > > + if (clk->multiplier == multiplier && clk->divider == divider) { > > + return false; > > + } > > + > > trace_clock_set_mul_div(CLOCK_PATH(clk), clk->multiplier, multiplier, > > clk->divider, divider); > > clk->multiplier = multiplier; > > clk->divider = divider; > > + > > + return true; > > } > > > > static void clock_initfn(Object *obj) > > -- > > 2.41.0 > > > -- ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock 2024-03-22 15:58 [PATCH-for-9.0 0/2] hw/clock: Propagate clock changes when STM32L4X5 MUX is updated Philippe Mathieu-Daudé 2024-03-22 15:58 ` [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value Philippe Mathieu-Daudé @ 2024-03-22 15:58 ` Philippe Mathieu-Daudé 2024-03-22 16:39 ` Peter Maydell 1 sibling, 1 reply; 8+ messages in thread From: Philippe Mathieu-Daudé @ 2024-03-22 15:58 UTC (permalink / raw) To: qemu-devel Cc: Luc Michel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm, Philippe Mathieu-Daudé From: Arnaud Minier <arnaud.minier@telecom-paris.fr> The "clock_set_mul_div" function doesn't propagate the clock period to the children if it is changed (e.g. by enabling/disabling a clock multiplexer). This was overlooked during the implementation due to late changes. This commit propagates the change if the multiplier or divider changes. Fixes: ec7d83acbd ("hw/misc/stm32l4x5_rcc: Add an internal clock multiplexer object") Signed-off-by: Arnaud Minier <arnaud.minier@telecom-paris.fr> Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr> Message-ID: <20240317103918.44375-2-arnaud.minier@telecom-paris.fr> [PMD: Check clock_set_mul_div() return value] Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- hw/misc/stm32l4x5_rcc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/misc/stm32l4x5_rcc.c b/hw/misc/stm32l4x5_rcc.c index bc2d63528b..7ad628b296 100644 --- a/hw/misc/stm32l4x5_rcc.c +++ b/hw/misc/stm32l4x5_rcc.c @@ -59,7 +59,10 @@ static void clock_mux_update(RccClockMuxState *mux, bool bypass_source) freq_multiplier = mux->divider; } - clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier); + if (clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier)) { + clock_propagate(mux->out); + } + clock_update(mux->out, clock_get(current_source)); src_freq = clock_get_hz(current_source); -- 2.41.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock 2024-03-22 15:58 ` [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock Philippe Mathieu-Daudé @ 2024-03-22 16:39 ` Peter Maydell 2024-03-25 8:56 ` Luc Michel 0 siblings, 1 reply; 8+ messages in thread From: Peter Maydell @ 2024-03-22 16:39 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Luc Michel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm On Fri, 22 Mar 2024 at 15:59, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > From: Arnaud Minier <arnaud.minier@telecom-paris.fr> > > The "clock_set_mul_div" function doesn't propagate the clock period > to the children if it is changed (e.g. by enabling/disabling a clock > multiplexer). > This was overlooked during the implementation due to late changes. > > This commit propagates the change if the multiplier or divider changes. > > Fixes: ec7d83acbd ("hw/misc/stm32l4x5_rcc: Add an internal clock multiplexer object") > Signed-off-by: Arnaud Minier <arnaud.minier@telecom-paris.fr> > Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr> > Message-ID: <20240317103918.44375-2-arnaud.minier@telecom-paris.fr> > [PMD: Check clock_set_mul_div() return value] > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > hw/misc/stm32l4x5_rcc.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/hw/misc/stm32l4x5_rcc.c b/hw/misc/stm32l4x5_rcc.c > index bc2d63528b..7ad628b296 100644 > --- a/hw/misc/stm32l4x5_rcc.c > +++ b/hw/misc/stm32l4x5_rcc.c > @@ -59,7 +59,10 @@ static void clock_mux_update(RccClockMuxState *mux, bool bypass_source) > freq_multiplier = mux->divider; > } > > - clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier); > + if (clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier)) { > + clock_propagate(mux->out); > + } > + > clock_update(mux->out, clock_get(current_source)); clock_update() also calls clock_propagate(), so this doesn't seem entirely right: shouldn't we figure out whether we need to do a clock_propagate() and do it once? (Maybe what seems odd to me is that clock_set() does clock_propagate() for you but clock_set_mul_div() does not...) (Also I think we should have the information we need now to be able to do the "reduce log spam" in the comment -- if neither clock_set_mul_div() nor clock_update() needed to do anything then we didn't actually change the config.) -- PMM ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock 2024-03-22 16:39 ` Peter Maydell @ 2024-03-25 8:56 ` Luc Michel 0 siblings, 0 replies; 8+ messages in thread From: Luc Michel @ 2024-03-25 8:56 UTC (permalink / raw) To: Peter Maydell Cc: Philippe Mathieu-Daudé, qemu-devel, Luc Michel, Damien Hedde, Inès Varhol, Arnaud Minier, qemu-arm On 16:39 Fri 22 Mar , Peter Maydell wrote: > On Fri, 22 Mar 2024 at 15:59, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > > > From: Arnaud Minier <arnaud.minier@telecom-paris.fr> > > > > The "clock_set_mul_div" function doesn't propagate the clock period > > to the children if it is changed (e.g. by enabling/disabling a clock > > multiplexer). > > This was overlooked during the implementation due to late changes. > > > > This commit propagates the change if the multiplier or divider changes. > > > > Fixes: ec7d83acbd ("hw/misc/stm32l4x5_rcc: Add an internal clock multiplexer object") > > Signed-off-by: Arnaud Minier <arnaud.minier@telecom-paris.fr> > > Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr> > > Message-ID: <20240317103918.44375-2-arnaud.minier@telecom-paris.fr> > > [PMD: Check clock_set_mul_div() return value] > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > > --- > > hw/misc/stm32l4x5_rcc.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/hw/misc/stm32l4x5_rcc.c b/hw/misc/stm32l4x5_rcc.c > > index bc2d63528b..7ad628b296 100644 > > --- a/hw/misc/stm32l4x5_rcc.c > > +++ b/hw/misc/stm32l4x5_rcc.c > > @@ -59,7 +59,10 @@ static void clock_mux_update(RccClockMuxState *mux, bool bypass_source) > > freq_multiplier = mux->divider; > > } > > > > - clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier); > > + if (clock_set_mul_div(mux->out, freq_multiplier, mux->multiplier)) { > > + clock_propagate(mux->out); > > + } > > + > > clock_update(mux->out, clock_get(current_source)); > > clock_update() also calls clock_propagate(), so this doesn't > seem entirely right: shouldn't we figure out whether we need to > do a clock_propagate() and do it once? (Maybe what seems odd to me > is that clock_set() does clock_propagate() for you but > clock_set_mul_div() does not...) clock_set() does not call clock_propagate(). clock_update() is a clock_set() followed by a clock_propagate() if the period changed. I think this is where the problem comes from here. clock_update() call won't call clock_propagate() if the clock period does not change. I think you'll want something like: bool changed; changed = clock_set_mul_div(mux->out, freq_multiplier, mux->multiplexer); changed ||= clock_set(clock_get(current_source)); if (changed) { clock_propagate(mux->out); } Thanks, -- Luc > > (Also I think we should have the information we need now to be able > to do the "reduce log spam" in the comment -- if neither > clock_set_mul_div() nor clock_update() needed to do anything > then we didn't actually change the config.) > > -- PMM -- ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-03-25 9:07 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-03-22 15:58 [PATCH-for-9.0 0/2] hw/clock: Propagate clock changes when STM32L4X5 MUX is updated Philippe Mathieu-Daudé 2024-03-22 15:58 ` [PATCH-for-9.0 1/2] hw/clock: Let clock_set_mul_div() return boolean value Philippe Mathieu-Daudé 2024-03-22 16:40 ` Peter Maydell 2024-03-25 8:40 ` Luc Michel 2024-03-25 9:05 ` Luc Michel 2024-03-22 15:58 ` [PATCH-for-9.0 2/2] hw/misc/stm32l4x5_rcc: Propagate period when enabling a clock Philippe Mathieu-Daudé 2024-03-22 16:39 ` Peter Maydell 2024-03-25 8:56 ` Luc Michel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).