hw/arm/armv7m: Create input clocks
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> Reviewed-by: Luc Michel <luc@lmichel.fr> Message-id: 20210812093356.1946-7-peter.maydell@linaro.org
This commit is contained in:
parent
5c6e1a1cf9
commit
d5093d9615
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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) */
|
||||
|
Loading…
Reference in New Issue
Block a user