qdev.h 7.2 KB
Newer Older
P
Paul Brook 已提交
1 2 3 4
#ifndef QDEV_H
#define QDEV_H

#include "hw.h"
G
Gerd Hoffmann 已提交
5
#include "sysemu.h"
P
Paul Brook 已提交
6
#include "sys-queue.h"
7
#include "qemu-char.h"
G
Gerd Hoffmann 已提交
8
#include "qemu-option.h"
P
Paul Brook 已提交
9

G
Gerd Hoffmann 已提交
10 11 12
typedef struct Property Property;

typedef struct PropertyInfo PropertyInfo;
P
Paul Brook 已提交
13

14 15
typedef struct CompatProperty CompatProperty;

G
Gerd Hoffmann 已提交
16
typedef struct DeviceInfo DeviceInfo;
P
Paul Brook 已提交
17

P
Paul Brook 已提交
18
typedef struct BusState BusState;
P
Paul Brook 已提交
19

20 21
typedef struct BusInfo BusInfo;

P
Paul Brook 已提交
22 23
/* This structure should not be accessed directly.  We declare it here
   so that it can be embedded in individual device state structures.  */
P
Paul Brook 已提交
24
struct DeviceState {
G
Gerd Hoffmann 已提交
25
    const char *id;
G
Gerd Hoffmann 已提交
26
    DeviceInfo *info;
P
Paul Brook 已提交
27
    BusState *parent_bus;
P
Paul Brook 已提交
28 29 30 31
    int num_gpio_out;
    qemu_irq *gpio_out;
    int num_gpio_in;
    qemu_irq *gpio_in;
P
Paul Brook 已提交
32
    LIST_HEAD(, BusState) child_bus;
G
Gerd Hoffmann 已提交
33
    int num_child_bus;
P
Paul Brook 已提交
34
    NICInfo *nd;
P
Paul Brook 已提交
35 36 37
    LIST_ENTRY(DeviceState) sibling;
};

38 39 40 41 42
typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent);
struct BusInfo {
    const char *name;
    size_t size;
    bus_dev_printfn print_dev;
G
Gerd Hoffmann 已提交
43
    Property *props;
44
};
P
Paul Brook 已提交
45 46 47

struct BusState {
    DeviceState *parent;
48
    BusInfo *info;
P
Paul Brook 已提交
49 50 51
    const char *name;
    LIST_HEAD(, DeviceState) children;
    LIST_ENTRY(BusState) sibling;
P
Paul Brook 已提交
52 53
};

G
Gerd Hoffmann 已提交
54 55 56 57 58 59 60 61 62 63 64
struct Property {
    const char   *name;
    PropertyInfo *info;
    int          offset;
    void         *defval;
};

enum PropertyType {
    PROP_TYPE_UNSPEC = 0,
    PROP_TYPE_UINT16,
    PROP_TYPE_UINT32,
B
Blue Swirl 已提交
65
    PROP_TYPE_UINT64,
G
Gerd Hoffmann 已提交
66 67
    PROP_TYPE_TADDR,
    PROP_TYPE_MACADDR,
G
Gerd Hoffmann 已提交
68
    PROP_TYPE_DRIVE,
69
    PROP_TYPE_CHR,
G
Gerd Hoffmann 已提交
70 71 72 73 74 75 76 77 78 79 80
    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);
};

81 82 83 84 85 86
struct CompatProperty {
    const char *driver;
    const char *property;
    const char *value;
};

P
Paul Brook 已提交
87 88
/*** Board API.  This should go away once we have a machine config file.  ***/

P
Paul Brook 已提交
89
DeviceState *qdev_create(BusState *bus, const char *name);
G
Gerd Hoffmann 已提交
90
DeviceState *qdev_device_add(QemuOpts *opts);
P
Paul Brook 已提交
91
void qdev_init(DeviceState *dev);
P
Paul Brook 已提交
92
void qdev_free(DeviceState *dev);
P
Paul Brook 已提交
93 94 95 96

qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);

P
Paul Brook 已提交
97
BusState *qdev_get_child_bus(DeviceState *dev, const char *name);
P
Paul Brook 已提交
98

P
Paul Brook 已提交
99 100
/*** Device API.  ***/

P
Paul Brook 已提交
101
typedef void (*qdev_initfn)(DeviceState *dev, DeviceInfo *info);
P
Paul Brook 已提交
102 103
typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
              int unit);
P
Paul Brook 已提交
104

P
Paul Brook 已提交
105
struct DeviceInfo {
106
    const char *name;
107 108
    const char *alias;
    const char *desc;
109
    size_t size;
G
Gerd Hoffmann 已提交
110
    Property *props;
111
    int no_user;
112 113

    /* Private to qdev / bus.  */
P
Paul Brook 已提交
114
    qdev_initfn init;
115
    BusInfo *bus_info;
G
Gerd Hoffmann 已提交
116
    struct DeviceInfo *next;
P
Paul Brook 已提交
117 118
};

119
void qdev_register(DeviceInfo *info);
P
Paul Brook 已提交
120 121

/* Register device properties.  */
P
Paul Brook 已提交
122
/* GPIO inputs also double as IRQ sinks.  */
P
Paul Brook 已提交
123 124 125
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n);
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n);

P
Paul Brook 已提交
126 127
void scsi_bus_new(DeviceState *host, SCSIAttachFn attach);

P
Paul Brook 已提交
128 129
CharDriverState *qdev_init_chardev(DeviceState *dev);

P
Paul Brook 已提交
130
BusState *qdev_get_parent_bus(DeviceState *dev);
P
Paul Brook 已提交
131 132 133 134 135 136 137 138 139 140 141

/* Convery from a base type to a parent type, with compile time checking.  */
#ifdef __GNUC__
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
    char __attribute__((unused)) offset_must_be_zero[ \
        -offsetof(type, field)]; \
    container_of(dev, type, field);}))
#else
#define DO_UPCAST(type, field, dev) container_of(dev, type, field)
#endif

P
Paul Brook 已提交
142 143
/*** BUS API. ***/

144
BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name);
P
Paul Brook 已提交
145 146 147

#define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)

148 149 150
/*** monitor commands ***/

void do_info_qtree(Monitor *mon);
G
Gerd Hoffmann 已提交
151
void do_info_qdm(Monitor *mon);
152

G
Gerd Hoffmann 已提交
153 154 155 156
/*** qdev-properties.c ***/

extern PropertyInfo qdev_prop_uint16;
extern PropertyInfo qdev_prop_uint32;
B
Blue Swirl 已提交
157
extern PropertyInfo qdev_prop_uint64;
G
Gerd Hoffmann 已提交
158
extern PropertyInfo qdev_prop_hex32;
B
Blue Swirl 已提交
159
extern PropertyInfo qdev_prop_hex64;
160
extern PropertyInfo qdev_prop_chr;
G
Gerd Hoffmann 已提交
161 162
extern PropertyInfo qdev_prop_ptr;
extern PropertyInfo qdev_prop_macaddr;
G
Gerd Hoffmann 已提交
163
extern PropertyInfo qdev_prop_drive;
164
extern PropertyInfo qdev_prop_pci_devfn;
G
Gerd Hoffmann 已提交
165

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
        .name      = (_name),                                    \
        .info      = &(_prop),                                   \
        .offset    = offsetof(_state, _field)                    \
            + type_check(_type,typeof_field(_state, _field)),    \
        }
#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
        .name      = (_name),                                           \
        .info      = &(_prop),                                          \
        .offset    = offsetof(_state, _field)                           \
            + type_check(_type,typeof_field(_state, _field)),           \
        .defval    = (_type[]) { _defval },                             \
        }

#define DEFINE_PROP_UINT16(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
#define DEFINE_PROP_UINT32(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
#define DEFINE_PROP_UINT64(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
#define DEFINE_PROP_HEX32(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t)
#define DEFINE_PROP_HEX64(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t)
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d)                   \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t)

#define DEFINE_PROP_PTR(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
195 196
#define DEFINE_PROP_CHR(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
G
Gerd Hoffmann 已提交
197
#define DEFINE_PROP_DRIVE(_n, _s, _f)             \
A
Anthony Liguori 已提交
198
    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*)
199 200 201 202 203 204
#define DEFINE_PROP_MACADDR(_n, _s, _f)         \
    DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, uint8_t[6])

#define DEFINE_PROP_END_OF_LIST()               \
    {}

G
Gerd Hoffmann 已提交
205 206 207 208 209 210
/* 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);
B
Blue Swirl 已提交
211
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value);
212
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value);
G
Gerd Hoffmann 已提交
213
void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value);
G
Gerd Hoffmann 已提交
214 215 216 217
/* 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);

218 219 220
void qdev_prop_register_compat(CompatProperty *props);
void qdev_prop_set_compat(DeviceState *dev);

B
Blue Swirl 已提交
221 222 223
/* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
extern struct BusInfo system_bus_info;

P
Paul Brook 已提交
224
#endif