From: Joerg Roedel Add a property to track the plane into which the qdev needs to inject IRQs. Co-developed-by: Luigi Leonardi Signed-off-by: Joerg Roedel --- hw/core/qdev.c | 26 ++++++++++++++++++++++++++ include/hw/core/qdev.h | 4 ++++ tests/unit/test-qdev-global-props.c | 5 +++++ tests/unit/test-qdev.c | 5 +++++ 4 files changed, 40 insertions(+) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index e48616b2c6f2..73d18fc0d639 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -662,6 +662,28 @@ static bool device_get_hotplugged(Object *obj, Error **errp) return dev->hotplugged; } +static void device_get_plane(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + uint8_t value = dev->plane; + + visit_type_uint8(v, name, &value, errp); +} + +static void device_set_plane(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + uint8_t value; + + if (!visit_type_uint8(v, name, &value, errp)) { + return; + } + + dev->plane = value; +} + static void device_initfn(Object *obj) { DeviceState *dev = DEVICE(obj); @@ -674,6 +696,7 @@ static void device_initfn(Object *obj) dev->instance_id_alias = -1; dev->realized = false; dev->allow_unplug_during_migration = false; + dev->plane = qdev_default_plane(); QLIST_INIT(&dev->gpios); QLIST_INIT(&dev->clocks); @@ -796,6 +819,9 @@ static void device_class_init(ObjectClass *class, const void *data) device_get_hotplugged, NULL); object_class_property_add_link(class, "parent_bus", TYPE_BUS, offsetof(DeviceState, parent_bus), NULL, 0); + object_class_property_add(class, "plane", "uint8", + device_get_plane, device_set_plane, + NULL, NULL); } static void do_legacy_reset(Object *obj, ResetType type) diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h index 83ad1d5f1550..28d2efcbe455 100644 --- a/include/hw/core/qdev.h +++ b/include/hw/core/qdev.h @@ -295,6 +295,10 @@ struct DeviceState { * Used to prevent re-entrancy confusing things. */ MemReentrancyGuard mem_reentrancy_guard; + /** + * @plane: Plane the device is assigned to. + */ + uint8_t plane; }; typedef struct DeviceListener DeviceListener; diff --git a/tests/unit/test-qdev-global-props.c b/tests/unit/test-qdev-global-props.c index 8ea362cbb902..2aca5bda22b9 100644 --- a/tests/unit/test-qdev-global-props.c +++ b/tests/unit/test-qdev-global-props.c @@ -71,6 +71,11 @@ static const TypeInfo subclass_type = { .parent = TYPE_STATIC_PROPS, }; +uint8_t qdev_default_plane(void) +{ + return 0; +} + /* * Initialize a fake machine, being prepared for future tests. * diff --git a/tests/unit/test-qdev.c b/tests/unit/test-qdev.c index 20eae38e03f4..6e3127b41afd 100644 --- a/tests/unit/test-qdev.c +++ b/tests/unit/test-qdev.c @@ -26,6 +26,11 @@ static const Property my_dev_props[] = { qdev_prop_uint32, uint32_t), }; +uint8_t qdev_default_plane(void) +{ + return 0; +} + static void my_dev_class_init(ObjectClass *oc, const void *data) { DeviceClass *dc = DEVICE_CLASS(oc); -- 2.53.0