On Tue, Feb 25, 2020 at 5:52 AM Damien Hedde <damien.hedde@greensocs.com> wrote:
>
> This prints the clocks attached to a DeviceState when using
> "info qtree" monitor command. For every clock, it displays the
> direction, the name and if the clock is forwarded. For input clock,
> it displays also the frequency.
>
> This is based on the original work of Frederic Konrad.
>
> Here follows a sample of `info qtree` output on xilinx_zynq machine
> after linux boot with only one uart clocked:
> > bus: main-system-bus
> > type System
> > [...]
> > dev: cadence_uart, id ""
> > gpio-out "sysbus-irq" 1
> > clock-in "refclk" freq_hz=0.000000e+00
> > chardev = ""
> > mmio 00000000e0001000/0000000000001000
> > dev: cadence_uart, id ""
> > gpio-out "sysbus-irq" 1
> > clock-in "refclk" freq_hz=1.375661e+07
> > chardev = "serial0"
> > mmio 00000000e0000000/0000000000001000
> > [...]
> > dev: xilinx,zynq_slcr, id ""
> > clock-out "uart1_ref_clk" freq_hz=0.000000e+00
> > clock-out "uart0_ref_clk" freq_hz=1.375661e+07
> > clock-in "ps_clk" freq_hz=3.333333e+07
> > mmio 00000000f8000000/0000000000001000
>
> Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
>
> v7:
> + print output clocks frequencies too
> + add sample of qtree message above
> + display frequencies in floating-point
> ---
> qdev-monitor.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 8ce71a206b..1d84b4e416 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -38,6 +38,7 @@
> #include "migration/misc.h"
> #include "migration/migration.h"
> #include "qemu/cutils.h"
> +#include "hw/clock.h"
>
> /*
> * Aliases were a bad idea from the start. Let's keep them
> @@ -736,6 +737,7 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
> ObjectClass *class;
> BusState *child;
> NamedGPIOList *ngl;
> + NamedClockList *ncl;
>
> qdev_printf("dev: %s, id \"%s\"\n", object_get_typename(OBJECT(dev)),
> dev->id ? dev->id : "");
> @@ -750,6 +752,13 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
> ngl->num_out);
> }
> }
> + QLIST_FOREACH(ncl, &dev->clocks, node) {
> + qdev_printf("clock-%s%s \"%s\" freq_hz=%e\n",
> + ncl->output ? "out" : "in",
> + ncl->alias ? " (alias)" : "",
> + ncl->name,
> + CLOCK_PERIOD_TO_HZ(1.0 * clock_get(ncl->clock)));
> + }
> class = object_get_class(OBJECT(dev));
> do {
> qdev_print_props(mon, dev, DEVICE_CLASS(class)->props_, indent);
> --
> 2.25.1
>
>