diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-07-15 13:43:31 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-07-16 17:28:51 -0500 |
commit | ee6847d19be16c789b8bd4e553b7cd6701ba1245 (patch) | |
tree | 41845b3b1e8740ce97daf0582e124c6b6e0a6873 /hw/qdev.h | |
parent | f114784f69ec3b9af342148025de14dbd1b429a5 (diff) | |
download | qemu-ee6847d19be16c789b8bd4e553b7cd6701ba1245.zip qemu-ee6847d19be16c789b8bd4e553b7cd6701ba1245.tar.gz qemu-ee6847d19be16c789b8bd4e553b7cd6701ba1245.tar.bz2 |
qdev: rework device properties.
This patch is a major overhaul of the device properties. The properties
are saved directly in the device state struct now, the linked list of
property values is gone.
Advantages:
* We don't have to maintain the list with the property values.
* The value in the property list and the value actually used by
the device can't go out of sync any more (used to happen for
the pci.devfn == -1 case) because there is only one place where
the value is stored.
* A record describing the property is required now, you can't set
random properties any more.
There are bus-specific and device-specific properties. The former
should be used for properties common to all bus drivers. Typical
use case is bus addressing, i.e. pci.devfn and i2c.address.
Properties have a PropertyInfo struct attached with name, size and
function pointers to parse and print properties. A few common property
types have PropertyInfos defined in qdev-properties.c. Drivers are free
to implement their own very special property parsers if needed.
Properties can have default values. If unset they are zero-filled.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/qdev.h')
-rw-r--r-- | hw/qdev.h | 73 |
1 files changed, 48 insertions, 25 deletions
@@ -4,9 +4,11 @@ #include "hw.h" #include "sys-queue.h" -typedef struct DeviceInfo DeviceInfo; +typedef struct Property Property; + +typedef struct PropertyInfo PropertyInfo; -typedef struct DeviceProperty DeviceProperty; +typedef struct DeviceInfo DeviceInfo; typedef struct BusState BusState; @@ -17,7 +19,6 @@ typedef struct BusInfo BusInfo; struct DeviceState { DeviceInfo *info; BusState *parent_bus; - DeviceProperty *props; int num_gpio_out; qemu_irq *gpio_out; int num_gpio_in; @@ -32,6 +33,7 @@ struct BusInfo { const char *name; size_t size; bus_dev_printfn print_dev; + Property *props; }; struct BusState { @@ -42,18 +44,36 @@ struct BusState { LIST_ENTRY(BusState) sibling; }; +struct Property { + const char *name; + PropertyInfo *info; + int offset; + void *defval; +}; + +enum PropertyType { + PROP_TYPE_UNSPEC = 0, + PROP_TYPE_UINT16, + PROP_TYPE_UINT32, + PROP_TYPE_TADDR, + PROP_TYPE_MACADDR, + PROP_TYPE_PTR, +}; + +struct PropertyInfo { + const char *name; + size_t size; + enum PropertyType type; + int (*parse)(DeviceState *dev, Property *prop, const char *str); + int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); +}; + /*** Board API. This should go away once we have a machine config file. ***/ DeviceState *qdev_create(BusState *bus, const char *name); void qdev_init(DeviceState *dev); void qdev_free(DeviceState *dev); -/* Set properties between creation and init. */ -void qdev_set_prop_int(DeviceState *dev, const char *name, uint64_t value); -void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value); -void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value); -void qdev_set_netdev(DeviceState *dev, NICInfo *nd); - qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); @@ -61,17 +81,6 @@ BusState *qdev_get_child_bus(DeviceState *dev, const char *name); /*** Device API. ***/ -typedef enum { - PROP_TYPE_INT, - PROP_TYPE_PTR, - PROP_TYPE_DEV -} DevicePropType; - -typedef struct { - const char *name; - DevicePropType type; -} DevicePropList; - typedef void (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv, int unit); @@ -79,7 +88,7 @@ typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv, struct DeviceInfo { const char *name; size_t size; - DevicePropList *props; + Property *props; /* Private to qdev / bus. */ qdev_initfn init; @@ -99,10 +108,6 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach); CharDriverState *qdev_init_chardev(DeviceState *dev); BusState *qdev_get_parent_bus(DeviceState *dev); -uint64_t qdev_get_prop_int(DeviceState *dev, const char *name, uint64_t def); -DeviceState *qdev_get_prop_dev(DeviceState *dev, const char *name); -/* FIXME: Remove opaque pointer properties. */ -void *qdev_get_prop_ptr(DeviceState *dev, const char *name); /* Convery from a base type to a parent type, with compile time checking. */ #ifdef __GNUC__ @@ -124,4 +129,22 @@ BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name); void do_info_qtree(Monitor *mon); +/*** qdev-properties.c ***/ + +extern PropertyInfo qdev_prop_uint16; +extern PropertyInfo qdev_prop_uint32; +extern PropertyInfo qdev_prop_hex32; +extern PropertyInfo qdev_prop_ptr; +extern PropertyInfo qdev_prop_macaddr; + +/* Set properties between creation and init. */ +void *qdev_get_prop_ptr(DeviceState *dev, Property *prop); +int qdev_prop_parse(DeviceState *dev, const char *name, const char *value); +void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type); +void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value); +void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value); +/* FIXME: Remove opaque pointer properties. */ +void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); +void qdev_prop_set_defaults(DeviceState *dev, Property *props); + #endif |