diff mbox series

[for-6.2,06/25] hw/arm/armv7m: Create input clocks

Message ID 20210812093356.1946-7-peter.maydell@linaro.org
State Superseded
Headers show
Series arm: Get rid of system_clock_scale global | expand

Commit Message

Peter Maydell Aug. 12, 2021, 9:33 a.m. UTC
Create input clocks on the armv7m container object which pass through
to the systick timers, so that users of the armv7m object can specify
the clocks being used.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

---
 include/hw/arm/armv7m.h |  6 ++++++
 hw/arm/armv7m.c         | 23 +++++++++++++++++++++++
 2 files changed, 29 insertions(+)

-- 
2.20.1

Comments

Alistair Francis Aug. 13, 2021, 1:28 a.m. UTC | #1
On Thu, Aug 12, 2021 at 7:38 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>

> Create input clocks on the armv7m container object which pass through

> to the systick timers, so that users of the armv7m object can specify

> the clocks being used.

>

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Alistair Francis <alistair.francis@wdc.com>


Alistair

> ---

>  include/hw/arm/armv7m.h |  6 ++++++

>  hw/arm/armv7m.c         | 23 +++++++++++++++++++++++

>  2 files changed, 29 insertions(+)

>

> diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h

> index fe8b248a6c6..b7ba0ff409c 100644

> --- a/include/hw/arm/armv7m.h

> +++ b/include/hw/arm/armv7m.h

> @@ -15,6 +15,7 @@

>  #include "hw/misc/armv7m_ras.h"

>  #include "target/arm/idau.h"

>  #include "qom/object.h"

> +#include "hw/clock.h"

>

>  #define TYPE_BITBAND "ARM-bitband-memory"

>  OBJECT_DECLARE_SIMPLE_TYPE(BitBandState, BITBAND)

> @@ -51,6 +52,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(ARMv7MState, ARMV7M)

>   * + Property "vfp": enable VFP (forwarded to CPU object)

>   * + Property "dsp": enable DSP (forwarded to CPU object)

>   * + Property "enable-bitband": expose bitbanded IO

> + * + Clock input "refclk" is the external reference clock for the systick timers

> + * + Clock input "cpuclk" is the main CPU clock

>   */

>  struct ARMv7MState {

>      /*< private >*/

> @@ -82,6 +85,9 @@ struct ARMv7MState {

>      /* MR providing default PPB behaviour */

>      MemoryRegion defaultmem;

>

> +    Clock *refclk;

> +    Clock *cpuclk;

> +

>      /* Properties */

>      char *cpu_type;

>      /* MemoryRegion the board provides to us (with its devices, RAM, etc) */

> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c

> index 7e7fb7a3ad3..db1bfa98df0 100644

> --- a/hw/arm/armv7m.c

> +++ b/hw/arm/armv7m.c

> @@ -14,12 +14,14 @@

>  #include "hw/arm/boot.h"

>  #include "hw/loader.h"

>  #include "hw/qdev-properties.h"

> +#include "hw/qdev-clock.h"

>  #include "elf.h"

>  #include "sysemu/reset.h"

>  #include "qemu/error-report.h"

>  #include "qemu/module.h"

>  #include "qemu/log.h"

>  #include "target/arm/idau.h"

> +#include "migration/vmstate.h"

>

>  /* Bitbanded IO.  Each word corresponds to a single bit.  */

>

> @@ -265,6 +267,9 @@ static void armv7m_instance_init(Object *obj)

>          object_initialize_child(obj, "bitband[*]", &s->bitband[i],

>                                  TYPE_BITBAND);

>      }

> +

> +    s->refclk = qdev_init_clock_in(DEVICE(obj), "refclk", NULL, NULL, 0);

> +    s->cpuclk = qdev_init_clock_in(DEVICE(obj), "cpuclk", NULL, NULL, 0);

>  }

>

>  static void armv7m_realize(DeviceState *dev, Error **errp)

> @@ -416,6 +421,8 @@ static void armv7m_realize(DeviceState *dev, Error **errp)

>      }

>

>      /* Create and map the systick devices */

> +    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);

> +    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);

>      if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {

>          return;

>      }

> @@ -431,6 +438,10 @@ static void armv7m_realize(DeviceState *dev, Error **errp)

>           */

>          object_initialize_child(OBJECT(dev), "systick-reg-s",

>                                  &s->systick[M_REG_S], TYPE_SYSTICK);

> +        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",

> +                              s->refclk);

> +        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",

> +                              s->cpuclk);

>

>          if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {

>              return;

> @@ -504,11 +515,23 @@ static Property armv7m_properties[] = {

>      DEFINE_PROP_END_OF_LIST(),

>  };

>

> +static const VMStateDescription vmstate_armv7m = {

> +    .name = "armv7m",

> +    .version_id = 1,

> +    .minimum_version_id = 1,

> +    .fields = (VMStateField[]) {

> +        VMSTATE_CLOCK(refclk, SysTickState),

> +        VMSTATE_CLOCK(cpuclk, SysTickState),

> +        VMSTATE_END_OF_LIST()

> +    }

> +};

> +

>  static void armv7m_class_init(ObjectClass *klass, void *data)

>  {

>      DeviceClass *dc = DEVICE_CLASS(klass);

>

>      dc->realize = armv7m_realize;

> +    dc->vmsd = &vmstate_armv7m;

>      device_class_set_props(dc, armv7m_properties);

>  }

>

> --

> 2.20.1

>

>
Luc Michel Aug. 17, 2021, 9:34 a.m. UTC | #2
On 10:33 Thu 12 Aug     , Peter Maydell wrote:
> Create input clocks on the armv7m container object which pass through

> to the systick timers, so that users of the armv7m object can specify

> the clocks being used.

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Luc Michel <luc@lmichel.fr>


> ---

>  include/hw/arm/armv7m.h |  6 ++++++

>  hw/arm/armv7m.c         | 23 +++++++++++++++++++++++

>  2 files changed, 29 insertions(+)

> 

> diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h

> index fe8b248a6c6..b7ba0ff409c 100644

> --- a/include/hw/arm/armv7m.h

> +++ b/include/hw/arm/armv7m.h

> @@ -15,6 +15,7 @@

>  #include "hw/misc/armv7m_ras.h"

>  #include "target/arm/idau.h"

>  #include "qom/object.h"

> +#include "hw/clock.h"

>  

>  #define TYPE_BITBAND "ARM-bitband-memory"

>  OBJECT_DECLARE_SIMPLE_TYPE(BitBandState, BITBAND)

> @@ -51,6 +52,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(ARMv7MState, ARMV7M)

>   * + Property "vfp": enable VFP (forwarded to CPU object)

>   * + Property "dsp": enable DSP (forwarded to CPU object)

>   * + Property "enable-bitband": expose bitbanded IO

> + * + Clock input "refclk" is the external reference clock for the systick timers

> + * + Clock input "cpuclk" is the main CPU clock

>   */

>  struct ARMv7MState {

>      /*< private >*/

> @@ -82,6 +85,9 @@ struct ARMv7MState {

>      /* MR providing default PPB behaviour */

>      MemoryRegion defaultmem;

>  

> +    Clock *refclk;

> +    Clock *cpuclk;

> +

>      /* Properties */

>      char *cpu_type;

>      /* MemoryRegion the board provides to us (with its devices, RAM, etc) */

> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c

> index 7e7fb7a3ad3..db1bfa98df0 100644

> --- a/hw/arm/armv7m.c

> +++ b/hw/arm/armv7m.c

> @@ -14,12 +14,14 @@

>  #include "hw/arm/boot.h"

>  #include "hw/loader.h"

>  #include "hw/qdev-properties.h"

> +#include "hw/qdev-clock.h"

>  #include "elf.h"

>  #include "sysemu/reset.h"

>  #include "qemu/error-report.h"

>  #include "qemu/module.h"

>  #include "qemu/log.h"

>  #include "target/arm/idau.h"

> +#include "migration/vmstate.h"

>  

>  /* Bitbanded IO.  Each word corresponds to a single bit.  */

>  

> @@ -265,6 +267,9 @@ static void armv7m_instance_init(Object *obj)

>          object_initialize_child(obj, "bitband[*]", &s->bitband[i],

>                                  TYPE_BITBAND);

>      }

> +

> +    s->refclk = qdev_init_clock_in(DEVICE(obj), "refclk", NULL, NULL, 0);

> +    s->cpuclk = qdev_init_clock_in(DEVICE(obj), "cpuclk", NULL, NULL, 0);

>  }

>  

>  static void armv7m_realize(DeviceState *dev, Error **errp)

> @@ -416,6 +421,8 @@ static void armv7m_realize(DeviceState *dev, Error **errp)

>      }

>  

>      /* Create and map the systick devices */

> +    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);

> +    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);

>      if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {

>          return;

>      }

> @@ -431,6 +438,10 @@ static void armv7m_realize(DeviceState *dev, Error **errp)

>           */

>          object_initialize_child(OBJECT(dev), "systick-reg-s",

>                                  &s->systick[M_REG_S], TYPE_SYSTICK);

> +        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",

> +                              s->refclk);

> +        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",

> +                              s->cpuclk);

>  

>          if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {

>              return;

> @@ -504,11 +515,23 @@ static Property armv7m_properties[] = {

>      DEFINE_PROP_END_OF_LIST(),

>  };

>  

> +static const VMStateDescription vmstate_armv7m = {

> +    .name = "armv7m",

> +    .version_id = 1,

> +    .minimum_version_id = 1,

> +    .fields = (VMStateField[]) {

> +        VMSTATE_CLOCK(refclk, SysTickState),

> +        VMSTATE_CLOCK(cpuclk, SysTickState),

> +        VMSTATE_END_OF_LIST()

> +    }

> +};

> +

>  static void armv7m_class_init(ObjectClass *klass, void *data)

>  {

>      DeviceClass *dc = DEVICE_CLASS(klass);

>  

>      dc->realize = armv7m_realize;

> +    dc->vmsd = &vmstate_armv7m;

>      device_class_set_props(dc, armv7m_properties);

>  }

>  

> -- 

> 2.20.1

> 


--
diff mbox series

Patch

diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
index fe8b248a6c6..b7ba0ff409c 100644
--- a/include/hw/arm/armv7m.h
+++ b/include/hw/arm/armv7m.h
@@ -15,6 +15,7 @@ 
 #include "hw/misc/armv7m_ras.h"
 #include "target/arm/idau.h"
 #include "qom/object.h"
+#include "hw/clock.h"
 
 #define TYPE_BITBAND "ARM-bitband-memory"
 OBJECT_DECLARE_SIMPLE_TYPE(BitBandState, BITBAND)
@@ -51,6 +52,8 @@  OBJECT_DECLARE_SIMPLE_TYPE(ARMv7MState, ARMV7M)
  * + Property "vfp": enable VFP (forwarded to CPU object)
  * + Property "dsp": enable DSP (forwarded to CPU object)
  * + Property "enable-bitband": expose bitbanded IO
+ * + Clock input "refclk" is the external reference clock for the systick timers
+ * + Clock input "cpuclk" is the main CPU clock
  */
 struct ARMv7MState {
     /*< private >*/
@@ -82,6 +85,9 @@  struct ARMv7MState {
     /* MR providing default PPB behaviour */
     MemoryRegion defaultmem;
 
+    Clock *refclk;
+    Clock *cpuclk;
+
     /* Properties */
     char *cpu_type;
     /* MemoryRegion the board provides to us (with its devices, RAM, etc) */
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 7e7fb7a3ad3..db1bfa98df0 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -14,12 +14,14 @@ 
 #include "hw/arm/boot.h"
 #include "hw/loader.h"
 #include "hw/qdev-properties.h"
+#include "hw/qdev-clock.h"
 #include "elf.h"
 #include "sysemu/reset.h"
 #include "qemu/error-report.h"
 #include "qemu/module.h"
 #include "qemu/log.h"
 #include "target/arm/idau.h"
+#include "migration/vmstate.h"
 
 /* Bitbanded IO.  Each word corresponds to a single bit.  */
 
@@ -265,6 +267,9 @@  static void armv7m_instance_init(Object *obj)
         object_initialize_child(obj, "bitband[*]", &s->bitband[i],
                                 TYPE_BITBAND);
     }
+
+    s->refclk = qdev_init_clock_in(DEVICE(obj), "refclk", NULL, NULL, 0);
+    s->cpuclk = qdev_init_clock_in(DEVICE(obj), "cpuclk", NULL, NULL, 0);
 }
 
 static void armv7m_realize(DeviceState *dev, Error **errp)
@@ -416,6 +421,8 @@  static void armv7m_realize(DeviceState *dev, Error **errp)
     }
 
     /* Create and map the systick devices */
+    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);
+    qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
         return;
     }
@@ -431,6 +438,10 @@  static void armv7m_realize(DeviceState *dev, Error **errp)
          */
         object_initialize_child(OBJECT(dev), "systick-reg-s",
                                 &s->systick[M_REG_S], TYPE_SYSTICK);
+        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
+                              s->refclk);
+        qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",
+                              s->cpuclk);
 
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {
             return;
@@ -504,11 +515,23 @@  static Property armv7m_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
+static const VMStateDescription vmstate_armv7m = {
+    .name = "armv7m",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_CLOCK(refclk, SysTickState),
+        VMSTATE_CLOCK(cpuclk, SysTickState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static void armv7m_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = armv7m_realize;
+    dc->vmsd = &vmstate_armv7m;
     device_class_set_props(dc, armv7m_properties);
 }