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:
Akihiko Odaki 2025-05-30 13:33:16 +09:00 committed by Michael S. Tsirkin
parent 9a4e273dde
commit 52f45faa4f
2 changed files with 84 additions and 1 deletions

View file

@ -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,

View file

@ -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, \