Message ID | 20240428-auto-v1-1-7b012216a120@daynix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | virtio-net: Convert feature properties to OnOffAuto | expand |
On Sun, Apr 28, 2024 at 10:21 AM Akihiko Odaki <akihiko.odaki@daynix.com> wrote: > > 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> > --- > include/hw/qdev-properties.h | 18 ++++++++++++ > hw/core/qdev-properties.c | 65 +++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 82 insertions(+), 1 deletion(-) > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > index 09aa04ca1e27..afec53a48470 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -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_enum; > extern const PropertyInfo qdev_prop_uint8; > @@ -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, \ > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 7d6fa726fdf2..b96f54a1b912 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -188,7 +188,8 @@ const PropertyInfo qdev_prop_bit = { > > static uint64_t qdev_get_prop_mask64(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; > } > > @@ -233,6 +234,68 @@ 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); > + int 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_enum(v, name, &value, &OnOffAuto_lookup, 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); > + int value; > + uint64_t mask = qdev_get_prop_mask64(prop); > + > + if (!visit_type_enum(v, name, &value, &OnOffAuto_lookup, 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; > + } > +} > + > +const PropertyInfo qdev_prop_on_off_auto_bit64 = { > + .name = "bool", Does it mean that the name of this tristate type is "bool"? Or I miss something? > + .description = "on/off/auto", > + .enum_table = &OnOffAuto_lookup, > + .get = qdev_propinfo_get_enum, > + .set = qdev_propinfo_set_enum, > + .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, > > -- > 2.44.0 >
On 2024/04/30 23:41, Yuri Benditovich wrote: > On Sun, Apr 28, 2024 at 10:21 AM Akihiko Odaki <akihiko.odaki@daynix.com> wrote: >> >> 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> >> --- >> include/hw/qdev-properties.h | 18 ++++++++++++ >> hw/core/qdev-properties.c | 65 +++++++++++++++++++++++++++++++++++++++++++- >> 2 files changed, 82 insertions(+), 1 deletion(-) >> >> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h >> index 09aa04ca1e27..afec53a48470 100644 >> --- a/include/hw/qdev-properties.h >> +++ b/include/hw/qdev-properties.h >> @@ -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_enum; >> extern const PropertyInfo qdev_prop_uint8; >> @@ -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, \ >> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c >> index 7d6fa726fdf2..b96f54a1b912 100644 >> --- a/hw/core/qdev-properties.c >> +++ b/hw/core/qdev-properties.c >> @@ -188,7 +188,8 @@ const PropertyInfo qdev_prop_bit = { >> >> static uint64_t qdev_get_prop_mask64(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; >> } >> >> @@ -233,6 +234,68 @@ 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); >> + int 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_enum(v, name, &value, &OnOffAuto_lookup, 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); >> + int value; >> + uint64_t mask = qdev_get_prop_mask64(prop); >> + >> + if (!visit_type_enum(v, name, &value, &OnOffAuto_lookup, 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; >> + } >> +} >> + >> +const PropertyInfo qdev_prop_on_off_auto_bit64 = { >> + .name = "bool", > > Does it mean that the name of this tristate type is "bool"? Or I miss something? No, this should be OnOffAuto. Thanks for pointing out this; I'll fix this in the next version.
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 09aa04ca1e27..afec53a48470 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -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_enum; extern const PropertyInfo qdev_prop_uint8; @@ -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, \ diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 7d6fa726fdf2..b96f54a1b912 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -188,7 +188,8 @@ const PropertyInfo qdev_prop_bit = { static uint64_t qdev_get_prop_mask64(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; } @@ -233,6 +234,68 @@ 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); + int 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_enum(v, name, &value, &OnOffAuto_lookup, 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); + int value; + uint64_t mask = qdev_get_prop_mask64(prop); + + if (!visit_type_enum(v, name, &value, &OnOffAuto_lookup, 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; + } +} + +const PropertyInfo qdev_prop_on_off_auto_bit64 = { + .name = "bool", + .description = "on/off/auto", + .enum_table = &OnOffAuto_lookup, + .get = qdev_propinfo_get_enum, + .set = qdev_propinfo_set_enum, + .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,
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> --- include/hw/qdev-properties.h | 18 ++++++++++++ hw/core/qdev-properties.c | 65 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-)