hw/arm/iotkit: Refactor into abstract base class and subclass

The Arm SSE-200 Subsystem for Embedded is a revised and
extended version of the older IoTKit SoC. Prepare for
adding a model of it by refactoring the IoTKit code into
an abstract base class which contains the functionality,
driven by a class data block specific to each subclass.
(This is the same approach used by the existing bcm283x
SoC family implementation.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20190121185118.18550-6-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2019-02-01 14:55:41 +00:00
parent 93dbd10347
commit 4c3690b591
2 changed files with 46 additions and 10 deletions

View File

@ -18,6 +18,16 @@
#include "hw/arm/iotkit.h" #include "hw/arm/iotkit.h"
#include "hw/arm/arm.h" #include "hw/arm/arm.h"
struct ARMSSEInfo {
const char *name;
};
static const ARMSSEInfo armsse_variants[] = {
{
.name = TYPE_IOTKIT,
},
};
/* Clock frequency in HZ of the 32KHz "slow clock" */ /* Clock frequency in HZ of the 32KHz "slow clock" */
#define S32KCLK (32 * 1000) #define S32KCLK (32 * 1000)
@ -732,29 +742,43 @@ static void iotkit_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass); IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
ARMSSEClass *asc = ARMSSE_CLASS(klass);
dc->realize = iotkit_realize; dc->realize = iotkit_realize;
dc->vmsd = &iotkit_vmstate; dc->vmsd = &iotkit_vmstate;
dc->props = iotkit_properties; dc->props = iotkit_properties;
dc->reset = iotkit_reset; dc->reset = iotkit_reset;
iic->check = iotkit_idau_check; iic->check = iotkit_idau_check;
asc->info = data;
} }
static const TypeInfo iotkit_info = { static const TypeInfo armsse_info = {
.name = TYPE_ARMSSE, .name = TYPE_ARMSSE,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(ARMSSE), .instance_size = sizeof(ARMSSE),
.instance_init = iotkit_init, .instance_init = iotkit_init,
.class_init = iotkit_class_init, .abstract = true,
.interfaces = (InterfaceInfo[]) { .interfaces = (InterfaceInfo[]) {
{ TYPE_IDAU_INTERFACE }, { TYPE_IDAU_INTERFACE },
{ } { }
} }
}; };
static void iotkit_register_types(void) static void armsse_register_types(void)
{ {
type_register_static(&iotkit_info); int i;
type_register_static(&armsse_info);
for (i = 0; i < ARRAY_SIZE(armsse_variants); i++) {
TypeInfo ti = {
.name = armsse_variants[i].name,
.parent = TYPE_ARMSSE,
.class_init = iotkit_class_init,
.class_data = (void *)&armsse_variants[i],
};
type_register(&ti);
}
} }
type_init(iotkit_register_types); type_init(armsse_register_types);

View File

@ -74,15 +74,15 @@
#include "hw/or-irq.h" #include "hw/or-irq.h"
#include "hw/core/split-irq.h" #include "hw/core/split-irq.h"
#define TYPE_ARMSSE "iotkit" #define TYPE_ARMSSE "arm-sse"
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE) #define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
/* /*
* For the moment TYPE_IOTKIT is a synonym for TYPE_ARMSSE (and the * These type names are for specific IoTKit subsystems; other than
* latter's underlying name is left as "iotkit"); in a later * instantiating them, code using these devices should always handle
* commit it will become a subclass of TYPE_ARMSSE. * them via the ARMSSE base class, so they have no IOTKIT() etc macros.
*/ */
#define TYPE_IOTKIT TYPE_ARMSSE #define TYPE_IOTKIT "iotkit"
/* We have an IRQ splitter and an OR gate input for each external PPC /* We have an IRQ splitter and an OR gate input for each external PPC
* and the 2 internal PPCs * and the 2 internal PPCs
@ -143,4 +143,16 @@ typedef struct ARMSSE {
uint32_t mainclk_frq; uint32_t mainclk_frq;
} ARMSSE; } ARMSSE;
typedef struct ARMSSEInfo ARMSSEInfo;
typedef struct ARMSSEClass {
DeviceClass parent_class;
const ARMSSEInfo *info;
} ARMSSEClass;
#define ARMSSE_CLASS(klass) \
OBJECT_CLASS_CHECK(ARMSSEClass, (klass), TYPE_ARMSSE)
#define ARMSSE_GET_CLASS(obj) \
OBJECT_GET_CLASS(ARMSSEClass, (obj), TYPE_ARMSSE)
#endif #endif