qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64()
DEFINE_PROP_ON_OFF_AUTO_BIT64() corresponds to DEFINE_PROP_ON_OFF_AUTO() as DEFINE_PROP_BIT64() corresponds to DEFINE_PROP_BOOL(). The difference is that DEFINE_PROP_ON_OFF_AUTO_BIT64() exposes OnOffAuto instead of bool. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20250530-vdpa-v1-1-5af4109b1c19@daynix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9a4e273dde
commit
52f45faa4f
2 changed files with 84 additions and 1 deletions
|
|
@ -2,6 +2,7 @@
|
|||
#include "hw/qdev-properties.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-types-misc.h"
|
||||
#include "qapi/qapi-visit-common.h"
|
||||
#include "qobject/qlist.h"
|
||||
#include "qemu/ctype.h"
|
||||
#include "qemu/error-report.h"
|
||||
|
|
@ -180,7 +181,8 @@ const PropertyInfo qdev_prop_bit = {
|
|||
|
||||
static uint64_t qdev_get_prop_mask64(const Property *prop)
|
||||
{
|
||||
assert(prop->info == &qdev_prop_bit64);
|
||||
assert(prop->info == &qdev_prop_bit64 ||
|
||||
prop->info == &qdev_prop_on_off_auto_bit64);
|
||||
return 0x1ull << prop->bitnr;
|
||||
}
|
||||
|
||||
|
|
@ -225,6 +227,69 @@ const PropertyInfo qdev_prop_bit64 = {
|
|||
.set_default_value = set_default_value_bool,
|
||||
};
|
||||
|
||||
static void prop_get_on_off_auto_bit64(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop);
|
||||
OnOffAuto value;
|
||||
uint64_t mask = qdev_get_prop_mask64(prop);
|
||||
|
||||
if (p->auto_bits & mask) {
|
||||
value = ON_OFF_AUTO_AUTO;
|
||||
} else if (p->on_bits & mask) {
|
||||
value = ON_OFF_AUTO_ON;
|
||||
} else {
|
||||
value = ON_OFF_AUTO_OFF;
|
||||
}
|
||||
|
||||
visit_type_OnOffAuto(v, name, &value, errp);
|
||||
}
|
||||
|
||||
static void prop_set_on_off_auto_bit64(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
Property *prop = opaque;
|
||||
OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop);
|
||||
OnOffAuto value;
|
||||
uint64_t mask = qdev_get_prop_mask64(prop);
|
||||
|
||||
if (!visit_type_OnOffAuto(v, name, &value, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (value) {
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
p->on_bits &= ~mask;
|
||||
p->auto_bits |= mask;
|
||||
break;
|
||||
|
||||
case ON_OFF_AUTO_ON:
|
||||
p->on_bits |= mask;
|
||||
p->auto_bits &= ~mask;
|
||||
break;
|
||||
|
||||
case ON_OFF_AUTO_OFF:
|
||||
p->on_bits &= ~mask;
|
||||
p->auto_bits &= ~mask;
|
||||
break;
|
||||
|
||||
case ON_OFF_AUTO__MAX:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
const PropertyInfo qdev_prop_on_off_auto_bit64 = {
|
||||
.type = "OnOffAuto",
|
||||
.description = "on/off/auto",
|
||||
.enum_table = &OnOffAuto_lookup,
|
||||
.get = prop_get_on_off_auto_bit64,
|
||||
.set = prop_set_on_off_auto_bit64,
|
||||
.set_default_value = qdev_propinfo_set_default_value_enum,
|
||||
};
|
||||
|
||||
/* --- bool --- */
|
||||
|
||||
static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
|
||||
|
|
|
|||
|
|
@ -43,11 +43,22 @@ struct PropertyInfo {
|
|||
ObjectPropertyRelease *release;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct OnOffAutoBit64 - OnOffAuto storage with 64 elements.
|
||||
* @on_bits: Bitmap of elements with "on".
|
||||
* @auto_bits: Bitmap of elements with "auto".
|
||||
*/
|
||||
typedef struct OnOffAutoBit64 {
|
||||
uint64_t on_bits;
|
||||
uint64_t auto_bits;
|
||||
} OnOffAutoBit64;
|
||||
|
||||
|
||||
/*** qdev-properties.c ***/
|
||||
|
||||
extern const PropertyInfo qdev_prop_bit;
|
||||
extern const PropertyInfo qdev_prop_bit64;
|
||||
extern const PropertyInfo qdev_prop_on_off_auto_bit64;
|
||||
extern const PropertyInfo qdev_prop_bool;
|
||||
extern const PropertyInfo qdev_prop_uint8;
|
||||
extern const PropertyInfo qdev_prop_uint16;
|
||||
|
|
@ -100,6 +111,13 @@ extern const PropertyInfo qdev_prop_link;
|
|||
.set_default = true, \
|
||||
.defval.u = (bool)_defval)
|
||||
|
||||
#define DEFINE_PROP_ON_OFF_AUTO_BIT64(_name, _state, _field, _bit, _defval) \
|
||||
DEFINE_PROP(_name, _state, _field, qdev_prop_on_off_auto_bit64, \
|
||||
OnOffAutoBit64, \
|
||||
.bitnr = (_bit), \
|
||||
.set_default = true, \
|
||||
.defval.i = (OnOffAuto)_defval)
|
||||
|
||||
#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \
|
||||
DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \
|
||||
.set_default = true, \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue