All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback
@ 2011-01-18 10:58 Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

This patchset allows a new property type called PROP_TYPE_ENUM,
I want to use it for the backend property in the ccid patches (will
send the patchset that uses it after this), libvirt is the ultimate
user.

The first patch adds a print_options callback that works with this
property type to print the optional values.

The second patch allows storing the name/value mapping in the property,
using a void ptr for later different uses.

The third patch adds the property itself.

Alon Levy (3):
  qdev: add print_options callback
  qdev: add data pointer to Property
  qdev-properties: add PROP_TYPE_ENUM

 hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.c            |   10 +++++++-
 hw/qdev.h            |   17 ++++++++++++++
 3 files changed, 86 insertions(+), 1 deletions(-)

-- 
1.7.3.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/3] qdev: add print_options callback
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

another callback added to PropertyInfo, for later use by PROP_TYPE_ENUM.
Allows printing of runtime computed options when doing:
 qemu -device foo,?
---
 hw/qdev.c |   10 +++++++++-
 hw/qdev.h |    1 +
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 5b8d374..d1550b9 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -188,7 +188,15 @@ int qdev_device_help(QemuOpts *opts)
         if (!prop->info->parse) {
             continue;           /* no way to set it, don't show */
         }
-        error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
+        if (prop->info->print_options) {
+            char buf[256];
+            int ret;
+            ret = prop->info->print_options(info, prop, buf, sizeof(buf) - 3);
+            error_printf("%s.%s=%s%s\n", info->name, prop->name, buf,
+                ret == sizeof(buf) - 3 ? "..." : "" );
+        } else {
+            error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
+        }
     }
     return 1;
 }
diff --git a/hw/qdev.h b/hw/qdev.h
index e520aaa..530fc5d 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -109,6 +109,7 @@ struct PropertyInfo {
     enum PropertyType type;
     int (*parse)(DeviceState *dev, Property *prop, const char *str);
     int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
+    int (*print_options)(DeviceInfo *info, Property *prop, char *dest, size_t len);
     void (*free)(DeviceState *dev, Property *prop);
 };
 
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
  2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

For later use by PROP_TYPE_ENUM, will store enumeration name/value
table there.
---
 hw/qdev.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.h b/hw/qdev.h
index 530fc5d..f6d5279 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -83,6 +83,7 @@ struct Property {
     int          offset;
     int          bitnr;
     void         *defval;
+    void         *data;
 };
 
 enum PropertyType {
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
@ 2011-01-18 10:58 ` Alon Levy
  2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-18 10:58 UTC (permalink / raw)
  To: qemu-devel

Example usage:

EnumTable foo_enum_table[] = {
    {"bar", 1},
    {"buz", 2},
    {NULL, 0},
};

DEFINE_PROP_ENUM("foo", State, foo, 1, foo_enum_table)

When using qemu -device foodev,? it will appear as:
 foodev.foo=bar/buz
---
 hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.h            |   15 ++++++++++++
 2 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index a493087..3157721 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -63,6 +63,66 @@ PropertyInfo qdev_prop_bit = {
     .print = print_bit,
 };
 
+/* --- Enumeration --- */
+/* Example usage:
+EnumTable foo_enum_table[] = {
+    {"bar", 1},
+    {"buz", 2},
+    {NULL, 0},
+};
+DEFINE_PROP_ENUM("foo", State, foo, 1, foo_enum_table),
+ */
+static int parse_enum(DeviceState *dev, Property *prop, const char *str)
+{
+    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
+    EnumTable *option = (EnumTable*)prop->data;
+
+    while (option->name != NULL) {
+        if (!strncmp(str, option->name, strlen(option->name))) {
+            *ptr = option->value;
+            return 0;
+        }
+        option++;
+    }
+    return -EINVAL;
+}
+
+static int print_enum(DeviceState *dev, Property *prop, char *dest, size_t len)
+{
+    uint32_t *p = qdev_get_prop_ptr(dev, prop);
+    EnumTable *option = (EnumTable*)prop->data;
+    while (option->name != NULL) {
+        if (*p == option->value) {
+            return snprintf(dest, len, "%s", option->name);
+        }
+        option++;
+    }
+    return 0;
+}
+
+static int print_enum_options(DeviceInfo *info, Property *prop, char *dest, size_t len)
+{
+    int ret = 0;
+    EnumTable *option = (EnumTable*)prop->data;
+    while (option->name != NULL) {
+        ret += snprintf(dest + ret, len - ret, "%s", option->name);
+        if (option[1].name != NULL) {
+            ret += snprintf(dest + ret, len - ret, "/");
+        }
+        option++;
+    }
+    return ret;
+}
+
+PropertyInfo qdev_prop_enum = {
+    .name  = "enum",
+    .type  = PROP_TYPE_ENUM,
+    .size  = sizeof(uint32_t),
+    .parse = parse_enum,
+    .print = print_enum,
+    .print_options = print_enum_options,
+};
+
 /* --- 8bit integer --- */
 
 static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
diff --git a/hw/qdev.h b/hw/qdev.h
index f6d5279..26b3d9e 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -102,6 +102,7 @@ enum PropertyType {
     PROP_TYPE_VLAN,
     PROP_TYPE_PTR,
     PROP_TYPE_BIT,
+    PROP_TYPE_ENUM,
 };
 
 struct PropertyInfo {
@@ -121,6 +122,11 @@ typedef struct GlobalProperty {
     QTAILQ_ENTRY(GlobalProperty) next;
 } GlobalProperty;
 
+typedef struct EnumTable {
+    const char *name;
+    uint32_t    value;
+} EnumTable;
+
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
 DeviceState *qdev_create(BusState *bus, const char *name);
@@ -237,6 +243,7 @@ extern PropertyInfo qdev_prop_drive;
 extern PropertyInfo qdev_prop_netdev;
 extern PropertyInfo qdev_prop_vlan;
 extern PropertyInfo qdev_prop_pci_devfn;
+extern PropertyInfo qdev_prop_enum;
 
 #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
         .name      = (_name),                                    \
@@ -259,6 +266,14 @@ extern PropertyInfo qdev_prop_pci_devfn;
             + type_check(uint32_t,typeof_field(_state, _field)), \
         .defval    = (bool[]) { (_defval) },                     \
         }
+#define DEFINE_PROP_ENUM(_name, _state, _field, _defval, _options) {    \
+        .name      = (_name),                                           \
+        .info      = &(qdev_prop_enum),                                 \
+        .offset    = offsetof(_state, _field)                           \
+            + type_check(uint32_t,typeof_field(_state, _field)),        \
+        .defval    = (uint32_t[]) { (_defval) },                        \
+        .data      = (void*)(_options),                                 \
+        }
 
 #define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \
     DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback
  2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
                   ` (2 preceding siblings ...)
  2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
@ 2011-01-25 15:58 ` Alon Levy
  3 siblings, 0 replies; 5+ messages in thread
From: Alon Levy @ 2011-01-25 15:58 UTC (permalink / raw)
  To: qemu-devel

On Tue, Jan 18, 2011 at 12:58:37PM +0200, Alon Levy wrote:
> This patchset allows a new property type called PROP_TYPE_ENUM,
> I want to use it for the backend property in the ccid patches (will
> send the patchset that uses it after this), libvirt is the ultimate
> user.

Ping.

Anthony - this is required for the ccid patch I will sent (ok, a little
predictive) since it makes choosing a backend for ccid-card-emulated simpler,
all the string comparing is here.

Looking at other devices this can be used:
 * ivshmem.c: role

> 
> The first patch adds a print_options callback that works with this
> property type to print the optional values.
> 
> The second patch allows storing the name/value mapping in the property,
> using a void ptr for later different uses.
> 
> The third patch adds the property itself.
> 
> Alon Levy (3):
>   qdev: add print_options callback
>   qdev: add data pointer to Property
>   qdev-properties: add PROP_TYPE_ENUM
> 
>  hw/qdev-properties.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/qdev.c            |   10 +++++++-
>  hw/qdev.h            |   17 ++++++++++++++
>  3 files changed, 86 insertions(+), 1 deletions(-)
> 
> -- 
> 1.7.3.4
> 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-01-25 15:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-18 10:58 [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 1/3] qdev: add " Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 2/3] qdev: add data pointer to Property Alon Levy
2011-01-18 10:58 ` [Qemu-devel] [PATCH 3/3] qdev-properties: add PROP_TYPE_ENUM Alon Levy
2011-01-25 15:58 ` [Qemu-devel] [PATCH 0/3] add PROP_TYPE_ENUM and print_options callback Alon Levy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.