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 <ehabkost@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-Id: <1498536619-14548-3-git-send-email-peterx@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Peter Xu 2017-06-27 12:10:11 +08:00 committed by Juan Quintela
parent 60d7cacac8
commit 9ffea096b9
5 changed files with 31 additions and 0 deletions

View File

@ -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) static void register_accel_types(void)
{ {
type_register_static(&accel_type); type_register_static(&accel_type);

View File

@ -1098,6 +1098,13 @@ void register_compat_prop(const char *driver,
qdev_prop_register_global(p); 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) void qdev_prop_register_global_list(GlobalProperty *props)
{ {
int i; int i;

View File

@ -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, void register_compat_prop(const char *driver, const char *property,
const char *value); 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: * qdev_property_add_static:

View File

@ -24,6 +24,7 @@
#define HW_ACCEL_H #define HW_ACCEL_H
#include "qom/object.h" #include "qom/object.h"
#include "hw/qdev-properties.h"
typedef struct AccelState { typedef struct AccelState {
/*< private >*/ /*< private >*/
@ -40,6 +41,14 @@ typedef struct AccelClass {
int (*available)(void); int (*available)(void);
int (*init_machine)(MachineState *ms); int (*init_machine)(MachineState *ms);
bool *allowed; 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; } AccelClass;
#define TYPE_ACCEL "accel" #define TYPE_ACCEL "accel"
@ -57,5 +66,7 @@ typedef struct AccelClass {
extern int tcg_tb_size; extern int tcg_tb_size;
void configure_accelerator(MachineState *ms); void configure_accelerator(MachineState *ms);
/* Register accelerator specific global properties */
void accel_register_compat_props(AccelState *accel);
#endif #endif

1
vl.c
View File

@ -4571,6 +4571,7 @@ int main(int argc, char **argv, char **envp)
exit (i == 1 ? 1 : 0); exit (i == 1 ? 1 : 0);
} }
accel_register_compat_props(current_machine->accelerator);
machine_register_compat_props(current_machine); machine_register_compat_props(current_machine);
qemu_opts_foreach(qemu_find_opts("global"), qemu_opts_foreach(qemu_find_opts("global"),