A minimal abstract device that target machines can create sub-types of to define their own cpu-package devices. Provides a realize routine that walks the child objects and realizes them iteratively. Hence cpu-package interface expects the target implementations to have a hierarchical setup for their CPU objects.
Signed-off-by: Bharata B Rao <bhar...@linux.vnet.ibm.com> --- hw/cpu/Makefile.objs | 1 + hw/cpu/package.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/cpu/package.h | 27 ++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 hw/cpu/package.c create mode 100644 include/hw/cpu/package.h diff --git a/hw/cpu/Makefile.objs b/hw/cpu/Makefile.objs index 0954a18..f540826 100644 --- a/hw/cpu/Makefile.objs +++ b/hw/cpu/Makefile.objs @@ -2,4 +2,5 @@ obj-$(CONFIG_ARM11MPCORE) += arm11mpcore.o obj-$(CONFIG_REALVIEW) += realview_mpcore.o obj-$(CONFIG_A9MPCORE) += a9mpcore.o obj-$(CONFIG_A15MPCORE) += a15mpcore.o +obj-y += package.o diff --git a/hw/cpu/package.c b/hw/cpu/package.c new file mode 100644 index 0000000..259dbfa --- /dev/null +++ b/hw/cpu/package.c @@ -0,0 +1,66 @@ +/* + * CPU package device + * + * Copyright (C) 2016 Bharata B Rao <bhar...@linux.vnet.ibm.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#include "hw/cpu/package.h" +#include "qom/object_interfaces.h" + +Object *cpu_package_create_object(const char *typename, uint32_t index, + Error **errp) +{ + char *id; + Object *obj; + + id = g_strdup_printf("" TYPE_CPU_PACKAGE "[%"PRIu32"]", index); + obj = object_new(typename); + object_property_add_child(qdev_get_machine(), id, obj, errp); + g_free(id); + + if (*errp) { + return NULL; + } else { + return obj; + } +} + +static int cpu_package_realize_child(Object *child, void *opaque) +{ + Error **errp = opaque; + + object_property_set_bool(child, true, "realized", errp); + if (*errp) { + return 1; + } + return 0; +} + +static void cpu_package_realize(DeviceState *dev, Error **errp) +{ + object_child_foreach(OBJECT(dev), cpu_package_realize_child, errp); +} + +static void cpu_package_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = cpu_package_realize; +} + +static const TypeInfo cpu_package_info = { + .name = TYPE_CPU_PACKAGE, + .parent = TYPE_DEVICE, + .abstract = true, + .instance_size = sizeof(CPUPackage), + .class_init = cpu_package_class_init, +}; + +static void cpu_package_register_types(void) +{ + type_register_static(&cpu_package_info); +} + +type_init(cpu_package_register_types) diff --git a/include/hw/cpu/package.h b/include/hw/cpu/package.h new file mode 100644 index 0000000..0579a42 --- /dev/null +++ b/include/hw/cpu/package.h @@ -0,0 +1,27 @@ +/* + * CPU package device + * + * Copyright (C) 2016 Bharata B Rao <bhar...@linux.vnet.ibm.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#ifndef HW_CPU_PACKAGE_H +#define HW_CPU_PACKAGE_H + +#include "hw/qdev.h" + +#define TYPE_CPU_PACKAGE "cpu-package" +#define CPU_PACKAGE(obj) \ + OBJECT_CHECK(CPUPackage, (obj), TYPE_CPU_PACKAGE) + +typedef struct CPUPackage { + /* private */ + DeviceState parent_obj; + + /* public */ +} CPUPackage; + +Object *cpu_package_create_object(const char *typename, uint32_t index, + Error **errp); +#endif -- 2.1.0