@@ -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);
@@ -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;
@@ -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:
@@ -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
@@ -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"),