From 9ffea096b93388e4a3727ae766583715d9e61741 Mon Sep 17 00:00:00 2001 From: Peter Xu Date: Tue, 27 Jun 2017 12:10:11 +0800 Subject: [PATCH] accel: introduce AccelClass.global_props Introduce this new field for the accelerator classes so that each specific accelerator in the future can register its own global properties to be used further by the system. It works just like how the old machine compatible properties do, but only tailored for accelerators. Introduce register_compat_props_array() for it. Export it so that it may be used in other codes as well in the future. Suggested-by: Eduardo Habkost Signed-off-by: Peter Xu Message-Id: <1498536619-14548-3-git-send-email-peterx@redhat.com> Reviewed-by: Eduardo Habkost Signed-off-by: Juan Quintela --- accel/accel.c | 6 ++++++ hw/core/qdev-properties.c | 7 +++++++ include/hw/qdev-properties.h | 6 ++++++ include/sysemu/accel.h | 11 +++++++++++ vl.c | 1 + 5 files changed, 31 insertions(+) diff --git a/accel/accel.c b/accel/accel.c index 7c079a56115..fa8584488e5 100644 --- a/accel/accel.c +++ b/accel/accel.c @@ -120,6 +120,12 @@ void configure_accelerator(MachineState *ms) } } +void accel_register_compat_props(AccelState *accel) +{ + AccelClass *class = ACCEL_GET_CLASS(accel); + register_compat_props_array(class->global_props); +} + static void register_accel_types(void) { type_register_static(&accel_type); diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index adf62ad6715..f11d57831bc 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -1098,6 +1098,13 @@ void register_compat_prop(const char *driver, qdev_prop_register_global(p); } +void register_compat_props_array(GlobalProperty *prop) +{ + for (; prop && prop->driver; prop++) { + register_compat_prop(prop->driver, prop->property, prop->value); + } +} + void qdev_prop_register_global_list(GlobalProperty *props) { int i; diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 50ade839b71..0604c337e06 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -231,6 +231,12 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, */ void register_compat_prop(const char *driver, const char *property, const char *value); +/* + * register_compat_props_array(): using register_compat_prop(), which + * only registers internal global properties (which has lower priority + * than user-provided global properties) + */ +void register_compat_props_array(GlobalProperty *prop); /** * qdev_property_add_static: diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h index 15944c152c1..ecc5c846217 100644 --- a/include/sysemu/accel.h +++ b/include/sysemu/accel.h @@ -24,6 +24,7 @@ #define HW_ACCEL_H #include "qom/object.h" +#include "hw/qdev-properties.h" typedef struct AccelState { /*< private >*/ @@ -40,6 +41,14 @@ typedef struct AccelClass { int (*available)(void); int (*init_machine)(MachineState *ms); bool *allowed; + /* + * Array of global properties that would be applied when specific + * accelerator is chosen. It works like MachineClass.compat_props + * but it's for accelerators not machines. Accelerator-provided + * global properties may be overridden by machine-type + * compat_props or user-provided global properties. + */ + GlobalProperty *global_props; } AccelClass; #define TYPE_ACCEL "accel" @@ -57,5 +66,7 @@ typedef struct AccelClass { extern int tcg_tb_size; void configure_accelerator(MachineState *ms); +/* Register accelerator specific global properties */ +void accel_register_compat_props(AccelState *accel); #endif diff --git a/vl.c b/vl.c index 59fea154885..4452d7ab1e3 100644 --- a/vl.c +++ b/vl.c @@ -4571,6 +4571,7 @@ int main(int argc, char **argv, char **envp) exit (i == 1 ? 1 : 0); } + accel_register_compat_props(current_machine->accelerator); machine_register_compat_props(current_machine); qemu_opts_foreach(qemu_find_opts("global"), -- 2.39.5