Revision ee6847d1
b/Makefile | ||
---|---|---|
108 | 108 |
obj-y += buffered_file.o migration.o migration-tcp.o net.o qemu-sockets.o |
109 | 109 |
obj-y += qemu-char.o aio.o net-checksum.o savevm.o cache-utils.o |
110 | 110 |
obj-y += msmouse.o ps2.o |
111 |
obj-y += qdev.o ssi.o |
|
111 |
obj-y += qdev.o qdev-properties.o ssi.o
|
|
112 | 112 |
|
113 | 113 |
obj-$(CONFIG_BRLAPI) += baum.o |
114 | 114 |
|
b/Makefile.hw | ||
---|---|---|
26 | 26 |
# SCSI layer |
27 | 27 |
obj-y += lsi53c895a.o esp.o |
28 | 28 |
|
29 |
obj-y += dma-helpers.o sysbus.o |
|
29 |
obj-y += dma-helpers.o sysbus.o qdev-addr.o
|
|
30 | 30 |
|
31 | 31 |
all: $(HWLIB) |
32 | 32 |
# Dummy command so that make thinks it has done something |
b/hw/arm_sysctl.c | ||
---|---|---|
194 | 194 |
arm_sysctl_state *s = FROM_SYSBUS(arm_sysctl_state, dev); |
195 | 195 |
int iomemtype; |
196 | 196 |
|
197 |
s->sys_id = qdev_get_prop_int(&dev->qdev, "sys_id", 0); |
|
198 | 197 |
/* The MPcore bootloader uses these flags to start secondary CPUs. |
199 | 198 |
We don't use a bootloader, so do this here. */ |
200 | 199 |
s->flags = 3; |
... | ... | |
210 | 209 |
DeviceState *dev; |
211 | 210 |
|
212 | 211 |
dev = qdev_create(NULL, "realview_sysctl"); |
213 |
qdev_set_prop_int(dev, "sys_id", sys_id);
|
|
212 |
qdev_prop_set_uint32(dev, "sys_id", sys_id);
|
|
214 | 213 |
qdev_init(dev); |
215 | 214 |
sysbus_mmio_map(sysbus_from_qdev(dev), 0, base); |
216 | 215 |
} |
217 | 216 |
|
217 |
static SysBusDeviceInfo arm_sysctl_info = { |
|
218 |
.init = arm_sysctl_init1, |
|
219 |
.qdev.name = "realview_sysctl", |
|
220 |
.qdev.size = sizeof(arm_sysctl_state), |
|
221 |
.qdev.props = (Property[]) { |
|
222 |
{ |
|
223 |
.name = "sys_id", |
|
224 |
.info = &qdev_prop_uint32, |
|
225 |
.offset = offsetof(arm_sysctl_state, sys_id), |
|
226 |
}, |
|
227 |
{/* end of list */} |
|
228 |
} |
|
229 |
}; |
|
230 |
|
|
218 | 231 |
static void arm_sysctl_register_devices(void) |
219 | 232 |
{ |
220 |
sysbus_register_dev("realview_sysctl", sizeof(arm_sysctl_state), |
|
221 |
arm_sysctl_init1); |
|
233 |
sysbus_register_withprop(&arm_sysctl_info); |
|
222 | 234 |
} |
223 | 235 |
|
224 | 236 |
device_init(arm_sysctl_register_devices) |
b/hw/armv7m.c | ||
---|---|---|
127 | 127 |
BitBandState *s = FROM_SYSBUS(BitBandState, dev); |
128 | 128 |
int iomemtype; |
129 | 129 |
|
130 |
s->base = qdev_get_prop_int(&dev->qdev, "base", 0); |
|
131 | 130 |
iomemtype = cpu_register_io_memory(bitband_readfn, bitband_writefn, |
132 | 131 |
&s->base); |
133 | 132 |
sysbus_init_mmio(dev, 0x02000000, iomemtype); |
... | ... | |
138 | 137 |
DeviceState *dev; |
139 | 138 |
|
140 | 139 |
dev = qdev_create(NULL, "ARM,bitband-memory"); |
141 |
qdev_set_prop_int(dev, "base", 0x20000000);
|
|
140 |
qdev_prop_set_uint32(dev, "base", 0x20000000);
|
|
142 | 141 |
qdev_init(dev); |
143 | 142 |
sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x22000000); |
144 | 143 |
|
145 | 144 |
dev = qdev_create(NULL, "ARM,bitband-memory"); |
146 |
qdev_set_prop_int(dev, "base", 0x40000000);
|
|
145 |
qdev_prop_set_uint32(dev, "base", 0x40000000);
|
|
147 | 146 |
qdev_init(dev); |
148 | 147 |
sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x42000000); |
149 | 148 |
} |
... | ... | |
238 | 237 |
return pic; |
239 | 238 |
} |
240 | 239 |
|
240 |
static SysBusDeviceInfo bitband_info = { |
|
241 |
.init = bitband_init, |
|
242 |
.qdev.name = "ARM,bitband-memory", |
|
243 |
.qdev.size = sizeof(BitBandState), |
|
244 |
.qdev.props = (Property[]) { |
|
245 |
{ |
|
246 |
.name = "base", |
|
247 |
.info = &qdev_prop_hex32, |
|
248 |
.offset = offsetof(BitBandState, base), |
|
249 |
}, |
|
250 |
{/* end of list */} |
|
251 |
} |
|
252 |
}; |
|
253 |
|
|
241 | 254 |
static void armv7m_register_devices(void) |
242 | 255 |
{ |
243 |
sysbus_register_dev("ARM,bitband-memory", sizeof(BitBandState), |
|
244 |
bitband_init); |
|
256 |
sysbus_register_withprop(&bitband_info); |
|
245 | 257 |
} |
246 | 258 |
|
247 | 259 |
device_init(armv7m_register_devices) |
b/hw/axis_dev88.c | ||
---|---|---|
297 | 297 |
cpu_irq = cris_pic_init_cpu(env); |
298 | 298 |
dev = qdev_create(NULL, "etraxfs,pic"); |
299 | 299 |
/* FIXME: Is there a proper way to signal vectors to the CPU core? */ |
300 |
qdev_set_prop_ptr(dev, "interrupt_vector", &env->interrupt_vector);
|
|
300 |
qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
|
|
301 | 301 |
qdev_init(dev); |
302 | 302 |
s = sysbus_from_qdev(dev); |
303 | 303 |
sysbus_mmio_map(s, 0, 0x3001c000); |
b/hw/cs4231.c | ||
---|---|---|
185 | 185 |
.init = cs4231_init1, |
186 | 186 |
.qdev.name = "SUNW,CS4231", |
187 | 187 |
.qdev.size = sizeof(CSState), |
188 |
.qdev.props = (DevicePropList[]) {
|
|
188 |
.qdev.props = (Property[]) {
|
|
189 | 189 |
{.name = NULL} |
190 | 190 |
} |
191 | 191 |
}; |
b/hw/eccmemctl.c | ||
---|---|---|
321 | 321 |
ECCState *s = FROM_SYSBUS(ECCState, dev); |
322 | 322 |
|
323 | 323 |
sysbus_init_irq(dev, &s->irq); |
324 |
s->version = qdev_get_prop_int(&dev->qdev, "version", -1); |
|
325 | 324 |
s->regs[0] = s->version; |
326 | 325 |
ecc_io_memory = cpu_register_io_memory(ecc_mem_read, ecc_mem_write, s); |
327 | 326 |
sysbus_init_mmio(dev, ECC_SIZE, ecc_io_memory); |
... | ... | |
342 | 341 |
SysBusDevice *s; |
343 | 342 |
|
344 | 343 |
dev = qdev_create(NULL, "eccmemctl"); |
345 |
qdev_set_prop_int(dev, "version", version);
|
|
344 |
qdev_prop_set_uint32(dev, "version", version);
|
|
346 | 345 |
qdev_init(dev); |
347 | 346 |
s = sysbus_from_qdev(dev); |
348 | 347 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
352 | 351 |
} |
353 | 352 |
} |
354 | 353 |
|
354 |
static SysBusDeviceInfo ecc_info = { |
|
355 |
.init = ecc_init1, |
|
356 |
.qdev.name = "eccmemctl", |
|
357 |
.qdev.size = sizeof(ECCState), |
|
358 |
.qdev.props = (Property[]) { |
|
359 |
{ |
|
360 |
.name = "version", |
|
361 |
.info = &qdev_prop_uint32, |
|
362 |
.offset = offsetof(ECCState, version), |
|
363 |
.defval = (uint32_t[]) { -1 }, |
|
364 |
}, |
|
365 |
{/* end of list */} |
|
366 |
} |
|
367 |
}; |
|
368 |
|
|
369 |
|
|
355 | 370 |
static void ecc_register_devices(void) |
356 | 371 |
{ |
357 |
sysbus_register_dev("eccmemctl", sizeof(ECCState), ecc_init1);
|
|
372 |
sysbus_register_withprop(&ecc_info);
|
|
358 | 373 |
} |
359 | 374 |
|
360 | 375 |
device_init(ecc_register_devices) |
b/hw/escc.c | ||
---|---|---|
120 | 120 |
struct ChannelState chn[2]; |
121 | 121 |
int it_shift; |
122 | 122 |
int mmio_index; |
123 |
uint32_t disabled; |
|
124 |
uint32_t frequency; |
|
123 | 125 |
}; |
124 | 126 |
|
125 | 127 |
#define SERIAL_CTRL 0 |
... | ... | |
732 | 734 |
SerialState *d; |
733 | 735 |
|
734 | 736 |
dev = qdev_create(NULL, "escc"); |
735 |
qdev_set_prop_int(dev, "disabled", 0);
|
|
736 |
qdev_set_prop_int(dev, "frequency", clock);
|
|
737 |
qdev_set_prop_int(dev, "it_shift", it_shift);
|
|
738 |
qdev_set_prop_ptr(dev, "chrB", chrB);
|
|
739 |
qdev_set_prop_ptr(dev, "chrA", chrA);
|
|
740 |
qdev_set_prop_int(dev, "chnBtype", ser);
|
|
741 |
qdev_set_prop_int(dev, "chnAtype", ser);
|
|
737 |
qdev_prop_set_uint32(dev, "disabled", 0);
|
|
738 |
qdev_prop_set_uint32(dev, "frequency", clock);
|
|
739 |
qdev_prop_set_uint32(dev, "it_shift", it_shift);
|
|
740 |
qdev_prop_set_ptr(dev, "chrB", chrB);
|
|
741 |
qdev_prop_set_ptr(dev, "chrA", chrA);
|
|
742 |
qdev_prop_set_uint32(dev, "chnBtype", ser);
|
|
743 |
qdev_prop_set_uint32(dev, "chnAtype", ser);
|
|
742 | 744 |
qdev_init(dev); |
743 | 745 |
s = sysbus_from_qdev(dev); |
744 | 746 |
sysbus_connect_irq(s, 0, irqA); |
... | ... | |
895 | 897 |
SysBusDevice *s; |
896 | 898 |
|
897 | 899 |
dev = qdev_create(NULL, "escc"); |
898 |
qdev_set_prop_int(dev, "disabled", disabled);
|
|
899 |
qdev_set_prop_int(dev, "frequency", clock);
|
|
900 |
qdev_set_prop_int(dev, "it_shift", it_shift);
|
|
901 |
qdev_set_prop_ptr(dev, "chrB", NULL);
|
|
902 |
qdev_set_prop_ptr(dev, "chrA", NULL);
|
|
903 |
qdev_set_prop_int(dev, "chnBtype", mouse);
|
|
904 |
qdev_set_prop_int(dev, "chnAtype", kbd);
|
|
900 |
qdev_prop_set_uint32(dev, "disabled", disabled);
|
|
901 |
qdev_prop_set_uint32(dev, "frequency", clock);
|
|
902 |
qdev_prop_set_uint32(dev, "it_shift", it_shift);
|
|
903 |
qdev_prop_set_ptr(dev, "chrB", NULL);
|
|
904 |
qdev_prop_set_ptr(dev, "chrA", NULL);
|
|
905 |
qdev_prop_set_uint32(dev, "chnBtype", mouse);
|
|
906 |
qdev_prop_set_uint32(dev, "chnAtype", kbd);
|
|
905 | 907 |
qdev_init(dev); |
906 | 908 |
s = sysbus_from_qdev(dev); |
907 | 909 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
914 | 916 |
SerialState *s = FROM_SYSBUS(SerialState, dev); |
915 | 917 |
int io; |
916 | 918 |
unsigned int i; |
917 |
uint32_t clock, disabled; |
|
918 |
|
|
919 |
s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0); |
|
920 |
clock = qdev_get_prop_int(&dev->qdev, "frequency", 0); |
|
921 |
s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB"); |
|
922 |
s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA"); |
|
923 |
disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0); |
|
924 |
s->chn[0].disabled = disabled; |
|
925 |
s->chn[1].disabled = disabled; |
|
919 |
|
|
920 |
s->chn[0].disabled = s->disabled; |
|
921 |
s->chn[1].disabled = s->disabled; |
|
926 | 922 |
for (i = 0; i < 2; i++) { |
927 | 923 |
sysbus_init_irq(dev, &s->chn[i].irq); |
928 | 924 |
s->chn[i].chn = 1 - i; |
929 |
s->chn[i].clock = clock / 2;
|
|
925 |
s->chn[i].clock = s->frequency / 2;
|
|
930 | 926 |
if (s->chn[i].chr) { |
931 | 927 |
qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, |
932 | 928 |
serial_receive1, serial_event, &s->chn[i]); |
... | ... | |
934 | 930 |
} |
935 | 931 |
s->chn[0].otherchn = &s->chn[1]; |
936 | 932 |
s->chn[1].otherchn = &s->chn[0]; |
937 |
s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0); |
|
938 |
s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0); |
|
939 | 933 |
|
940 | 934 |
io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); |
941 | 935 |
sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io); |
... | ... | |
957 | 951 |
.init = escc_init1, |
958 | 952 |
.qdev.name = "escc", |
959 | 953 |
.qdev.size = sizeof(SerialState), |
960 |
.qdev.props = (DevicePropList[]) { |
|
961 |
{.name = "frequency", .type = PROP_TYPE_INT}, |
|
962 |
{.name = "it_shift", .type = PROP_TYPE_INT}, |
|
963 |
{.name = "disabled", .type = PROP_TYPE_INT}, |
|
964 |
{.name = "chrB", .type = PROP_TYPE_PTR}, |
|
965 |
{.name = "chrA", .type = PROP_TYPE_PTR}, |
|
966 |
{.name = "chnBtype", .type = PROP_TYPE_INT}, |
|
967 |
{.name = "chnAtype", .type = PROP_TYPE_INT}, |
|
968 |
{.name = NULL} |
|
954 |
.qdev.props = (Property[]) { |
|
955 |
{ |
|
956 |
.name = "frequency", |
|
957 |
.info = &qdev_prop_uint32, |
|
958 |
.offset = offsetof(SerialState, frequency), |
|
959 |
}, |
|
960 |
{ |
|
961 |
.name = "it_shift", |
|
962 |
.info = &qdev_prop_uint32, |
|
963 |
.offset = offsetof(SerialState, it_shift), |
|
964 |
}, |
|
965 |
{ |
|
966 |
.name = "disabled", |
|
967 |
.info = &qdev_prop_uint32, |
|
968 |
.offset = offsetof(SerialState, disabled), |
|
969 |
}, |
|
970 |
{ |
|
971 |
.name = "chrB", |
|
972 |
.info = &qdev_prop_ptr, |
|
973 |
.offset = offsetof(SerialState, chn[1].chr), |
|
974 |
}, |
|
975 |
{ |
|
976 |
.name = "chrA", |
|
977 |
.info = &qdev_prop_ptr, |
|
978 |
.offset = offsetof(SerialState, chn[0].chr), |
|
979 |
}, |
|
980 |
{ |
|
981 |
.name = "chnBtype", |
|
982 |
.info = &qdev_prop_uint32, |
|
983 |
.offset = offsetof(SerialState, chn[1].type), |
|
984 |
}, |
|
985 |
{ |
|
986 |
.name = "chnAtype", |
|
987 |
.info = &qdev_prop_uint32, |
|
988 |
.offset = offsetof(SerialState, chn[0].type), |
|
989 |
}, |
|
990 |
{/* end of list */} |
|
969 | 991 |
} |
970 | 992 |
}; |
971 | 993 |
|
b/hw/esp.c | ||
---|---|---|
650 | 650 |
{ |
651 | 651 |
DeviceState *dev; |
652 | 652 |
SysBusDevice *s; |
653 |
ESPState *esp; |
|
653 | 654 |
|
654 | 655 |
dev = qdev_create(NULL, "esp"); |
655 |
qdev_set_prop_ptr(dev, "dma_memory_read", dma_memory_read); |
|
656 |
qdev_set_prop_ptr(dev, "dma_memory_write", dma_memory_write); |
|
657 |
qdev_set_prop_ptr(dev, "dma_opaque", dma_opaque); |
|
658 |
qdev_set_prop_int(dev, "it_shift", it_shift); |
|
656 |
esp = DO_UPCAST(ESPState, busdev.qdev, dev); |
|
657 |
esp->dma_memory_read = dma_memory_read; |
|
658 |
esp->dma_memory_write = dma_memory_write; |
|
659 |
esp->dma_opaque = dma_opaque; |
|
660 |
esp->it_shift = it_shift; |
|
659 | 661 |
qdev_init(dev); |
660 | 662 |
s = sysbus_from_qdev(dev); |
661 | 663 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
668 | 670 |
int esp_io_memory; |
669 | 671 |
|
670 | 672 |
sysbus_init_irq(dev, &s->irq); |
671 |
s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", -1); |
|
672 | 673 |
assert(s->it_shift != -1); |
673 |
s->dma_memory_read = qdev_get_prop_ptr(&dev->qdev, "dma_memory_read"); |
|
674 |
s->dma_memory_write = qdev_get_prop_ptr(&dev->qdev, "dma_memory_write"); |
|
675 |
s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma_opaque"); |
|
676 | 674 |
|
677 | 675 |
esp_io_memory = cpu_register_io_memory(esp_mem_read, esp_mem_write, s); |
678 | 676 |
sysbus_init_mmio(dev, ESP_REGS << s->it_shift, esp_io_memory); |
b/hw/etraxfs.c | ||
---|---|---|
88 | 88 |
cpu_irq = cris_pic_init_cpu(env); |
89 | 89 |
dev = qdev_create(NULL, "etraxfs,pic"); |
90 | 90 |
/* FIXME: Is there a proper way to signal vectors to the CPU core? */ |
91 |
qdev_set_prop_ptr(dev, "interrupt_vector", &env->interrupt_vector);
|
|
91 |
qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
|
|
92 | 92 |
qdev_init(dev); |
93 | 93 |
s = sysbus_from_qdev(dev); |
94 | 94 |
sysbus_mmio_map(s, 0, 0x3001c000); |
b/hw/etraxfs_pic.c | ||
---|---|---|
140 | 140 |
struct etrax_pic *s = FROM_SYSBUS(typeof (*s), dev); |
141 | 141 |
int intr_vect_regs; |
142 | 142 |
|
143 |
s->interrupt_vector = qdev_get_prop_ptr(&dev->qdev, "interrupt_vector"); |
|
144 | 143 |
qdev_init_gpio_in(&dev->qdev, irq_handler, 32); |
145 | 144 |
sysbus_init_irq(dev, &s->parent_irq); |
146 | 145 |
sysbus_init_irq(dev, &s->parent_nmi); |
... | ... | |
149 | 148 |
sysbus_init_mmio(dev, R_MAX * 4, intr_vect_regs); |
150 | 149 |
} |
151 | 150 |
|
151 |
static SysBusDeviceInfo etraxfs_pic_info = { |
|
152 |
.init = etraxfs_pic_init, |
|
153 |
.qdev.name = "etraxfs,pic", |
|
154 |
.qdev.size = sizeof(struct etrax_pic), |
|
155 |
.qdev.props = (Property[]) { |
|
156 |
{ |
|
157 |
.name = "interrupt_vector", |
|
158 |
.info = &qdev_prop_ptr, |
|
159 |
.offset = offsetof(struct etrax_pic, interrupt_vector), |
|
160 |
}, |
|
161 |
{/* end of list */} |
|
162 |
} |
|
163 |
}; |
|
164 |
|
|
152 | 165 |
static void etraxfs_pic_register(void) |
153 | 166 |
{ |
154 |
sysbus_register_dev("etraxfs,pic", sizeof (struct etrax_pic), |
|
155 |
etraxfs_pic_init); |
|
167 |
sysbus_register_withprop(&etraxfs_pic_info); |
|
156 | 168 |
} |
157 | 169 |
|
158 | 170 |
device_init(etraxfs_pic_register) |
b/hw/fdc.c | ||
---|---|---|
511 | 511 |
/* Floppy drives */ |
512 | 512 |
fdrive_t drives[MAX_FD]; |
513 | 513 |
int reset_sensei; |
514 |
uint32_t strict_io; |
|
515 |
uint32_t mem_mapped; |
|
514 | 516 |
}; |
515 | 517 |
|
516 | 518 |
static uint32_t fdctrl_read (void *opaque, uint32_t reg) |
... | ... | |
1898 | 1900 |
fdctrl_t *fdctrl; |
1899 | 1901 |
|
1900 | 1902 |
dev = qdev_create(NULL, "fdc"); |
1901 |
qdev_set_prop_int(dev, "strict_io", 0);
|
|
1902 |
qdev_set_prop_int(dev, "mem_mapped", mem_mapped);
|
|
1903 |
qdev_set_prop_int(dev, "sun4m", 0);
|
|
1903 |
qdev_prop_set_uint32(dev, "strict_io", 0);
|
|
1904 |
qdev_prop_set_uint32(dev, "mem_mapped", mem_mapped);
|
|
1905 |
qdev_prop_set_uint32(dev, "sun4m", 0);
|
|
1904 | 1906 |
qdev_init(dev); |
1905 | 1907 |
s = sysbus_from_qdev(dev); |
1906 | 1908 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
1931 | 1933 |
fdctrl_t *fdctrl; |
1932 | 1934 |
|
1933 | 1935 |
dev = qdev_create(NULL, "fdc"); |
1934 |
qdev_set_prop_int(dev, "strict_io", 1);
|
|
1935 |
qdev_set_prop_int(dev, "mem_mapped", 1);
|
|
1936 |
qdev_set_prop_int(dev, "sun4m", 1);
|
|
1936 |
qdev_prop_set_uint32(dev, "strict_io", 1);
|
|
1937 |
qdev_prop_set_uint32(dev, "mem_mapped", 1);
|
|
1938 |
qdev_prop_set_uint32(dev, "sun4m", 1);
|
|
1937 | 1939 |
qdev_init(dev); |
1938 | 1940 |
s = sysbus_from_qdev(dev); |
1939 | 1941 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
1953 | 1955 |
|
1954 | 1956 |
sysbus_init_irq(dev, &s->irq); |
1955 | 1957 |
qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); |
1956 |
if (qdev_get_prop_int(&dev->qdev, "strict_io", 0)) {
|
|
1958 |
if (s->strict_io) {
|
|
1957 | 1959 |
io = cpu_register_io_memory(fdctrl_mem_read_strict, |
1958 | 1960 |
fdctrl_mem_write_strict, s); |
1959 | 1961 |
} else { |
... | ... | |
1967 | 1969 |
.init = fdc_init1, |
1968 | 1970 |
.qdev.name = "fdc", |
1969 | 1971 |
.qdev.size = sizeof(fdctrl_t), |
1970 |
.qdev.props = (DevicePropList[]) { |
|
1971 |
{.name = "io_base", .type = PROP_TYPE_INT}, |
|
1972 |
{.name = "strict_io", .type = PROP_TYPE_INT}, |
|
1973 |
{.name = "mem_mapped", .type = PROP_TYPE_INT}, |
|
1974 |
{.name = "sun4m", .type = PROP_TYPE_INT}, |
|
1975 |
{.name = NULL} |
|
1972 |
.qdev.props = (Property[]) { |
|
1973 |
{ |
|
1974 |
.name = "io_base", |
|
1975 |
.info = &qdev_prop_uint32, |
|
1976 |
.offset = offsetof(fdctrl_t, io_base), |
|
1977 |
}, |
|
1978 |
{ |
|
1979 |
.name = "strict_io", |
|
1980 |
.info = &qdev_prop_uint32, |
|
1981 |
.offset = offsetof(fdctrl_t, strict_io), |
|
1982 |
}, |
|
1983 |
{ |
|
1984 |
.name = "mem_mapped", |
|
1985 |
.info = &qdev_prop_uint32, |
|
1986 |
.offset = offsetof(fdctrl_t, mem_mapped), |
|
1987 |
}, |
|
1988 |
{ |
|
1989 |
.name = "sun4m", |
|
1990 |
.info = &qdev_prop_uint32, |
|
1991 |
.offset = offsetof(fdctrl_t, sun4m), |
|
1992 |
}, |
|
1993 |
{/* end of properties */} |
|
1976 | 1994 |
} |
1977 | 1995 |
}; |
1978 | 1996 |
|
b/hw/i2c.c | ||
---|---|---|
20 | 20 |
static struct BusInfo i2c_bus_info = { |
21 | 21 |
.name = "I2C", |
22 | 22 |
.size = sizeof(i2c_bus), |
23 |
.props = (Property[]) { |
|
24 |
{ |
|
25 |
.name = "address", |
|
26 |
.info = &qdev_prop_uint32, |
|
27 |
.offset = offsetof(struct i2c_slave, address), |
|
28 |
}, |
|
29 |
{/* end of list */} |
|
30 |
} |
|
23 | 31 |
}; |
24 | 32 |
|
25 | 33 |
static void i2c_bus_save(QEMUFile *f, void *opaque) |
... | ... | |
151 | 159 |
i2c_slave *s = I2C_SLAVE_FROM_QDEV(dev); |
152 | 160 |
|
153 | 161 |
s->info = info; |
154 |
s->address = qdev_get_prop_int(dev, "address", 0); |
|
155 | 162 |
|
156 | 163 |
info->init(s); |
157 | 164 |
} |
... | ... | |
169 | 176 |
DeviceState *dev; |
170 | 177 |
|
171 | 178 |
dev = qdev_create(&bus->qbus, name); |
172 |
qdev_set_prop_int(dev, "address", addr);
|
|
179 |
qdev_prop_set_uint32(dev, "address", addr);
|
|
173 | 180 |
qdev_init(dev); |
174 | 181 |
return dev; |
175 | 182 |
} |
b/hw/i2c.h | ||
---|---|---|
40 | 40 |
I2CSlaveInfo *info; |
41 | 41 |
|
42 | 42 |
/* Remaining fields for internal use by the I2C code. */ |
43 |
int address;
|
|
43 |
uint32_t address;
|
|
44 | 44 |
}; |
45 | 45 |
|
46 | 46 |
i2c_bus *i2c_init_bus(DeviceState *parent, const char *name); |
b/hw/integratorcp.c | ||
---|---|---|
17 | 17 |
|
18 | 18 |
typedef struct { |
19 | 19 |
SysBusDevice busdev; |
20 |
uint32_t memsz; |
|
20 | 21 |
uint32_t flash_offset; |
21 | 22 |
uint32_t cm_osc; |
22 | 23 |
uint32_t cm_ctrl; |
... | ... | |
230 | 231 |
{ |
231 | 232 |
int iomemtype; |
232 | 233 |
integratorcm_state *s = FROM_SYSBUS(integratorcm_state, dev); |
233 |
int memsz; |
|
234 | 234 |
|
235 |
memsz = qdev_get_prop_int(&dev->qdev, "memsz", 0); |
|
236 | 235 |
s->cm_osc = 0x01000048; |
237 | 236 |
/* ??? What should the high bits of this value be? */ |
238 | 237 |
s->cm_auxosc = 0x0007feff; |
239 | 238 |
s->cm_sdram = 0x00011122; |
240 |
if (memsz >= 256) { |
|
239 |
if (s->memsz >= 256) {
|
|
241 | 240 |
integrator_spd[31] = 64; |
242 | 241 |
s->cm_sdram |= 0x10; |
243 |
} else if (memsz >= 128) { |
|
242 |
} else if (s->memsz >= 128) {
|
|
244 | 243 |
integrator_spd[31] = 32; |
245 | 244 |
s->cm_sdram |= 0x0c; |
246 |
} else if (memsz >= 64) { |
|
245 |
} else if (s->memsz >= 64) {
|
|
247 | 246 |
integrator_spd[31] = 16; |
248 | 247 |
s->cm_sdram |= 0x08; |
249 |
} else if (memsz >= 32) { |
|
248 |
} else if (s->memsz >= 32) {
|
|
250 | 249 |
integrator_spd[31] = 4; |
251 | 250 |
s->cm_sdram |= 0x04; |
252 | 251 |
} else { |
... | ... | |
475 | 474 |
cpu_register_physical_memory(0x80000000, ram_size, ram_offset | IO_MEM_RAM); |
476 | 475 |
|
477 | 476 |
dev = qdev_create(NULL, "integrator_core"); |
478 |
qdev_set_prop_int(dev, "memsz", ram_size >> 20);
|
|
477 |
qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
|
|
479 | 478 |
qdev_init(dev); |
480 | 479 |
sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000); |
481 | 480 |
|
... | ... | |
522 | 521 |
|
523 | 522 |
machine_init(integratorcp_machine_init); |
524 | 523 |
|
524 |
static SysBusDeviceInfo core_info = { |
|
525 |
.init = integratorcm_init, |
|
526 |
.qdev.name = "integrator_core", |
|
527 |
.qdev.size = sizeof(integratorcm_state), |
|
528 |
.qdev.props = (Property[]) { |
|
529 |
{ |
|
530 |
.name = "memsz", |
|
531 |
.info = &qdev_prop_uint32, |
|
532 |
.offset = offsetof(integratorcm_state, memsz), |
|
533 |
}, |
|
534 |
{/* end of list */} |
|
535 |
} |
|
536 |
}; |
|
537 |
|
|
525 | 538 |
static void integratorcp_register_devices(void) |
526 | 539 |
{ |
527 | 540 |
sysbus_register_dev("integrator_pic", sizeof(icp_pic_state), icp_pic_init); |
528 |
sysbus_register_dev("integrator_core", sizeof(integratorcm_state), |
|
529 |
integratorcm_init); |
|
541 |
sysbus_register_withprop(&core_info); |
|
530 | 542 |
} |
531 | 543 |
|
532 | 544 |
device_init(integratorcp_register_devices) |
b/hw/iommu.c | ||
---|---|---|
373 | 373 |
IOMMUState *d; |
374 | 374 |
|
375 | 375 |
dev = qdev_create(NULL, "iommu"); |
376 |
qdev_set_prop_int(dev, "version", version);
|
|
376 |
qdev_prop_set_uint32(dev, "version", version);
|
|
377 | 377 |
qdev_init(dev); |
378 | 378 |
s = sysbus_from_qdev(dev); |
379 | 379 |
sysbus_connect_irq(s, 0, irq); |
... | ... | |
391 | 391 |
|
392 | 392 |
sysbus_init_irq(dev, &s->irq); |
393 | 393 |
|
394 |
s->version = qdev_get_prop_int(&dev->qdev, "version", 0); |
|
395 |
|
|
396 | 394 |
io = cpu_register_io_memory(iommu_mem_read, iommu_mem_write, s); |
397 | 395 |
sysbus_init_mmio(dev, IOMMU_NREGS * sizeof(uint32_t), io); |
398 | 396 |
|
... | ... | |
405 | 403 |
.init = iommu_init1, |
406 | 404 |
.qdev.name = "iommu", |
407 | 405 |
.qdev.size = sizeof(IOMMUState), |
408 |
.qdev.props = (DevicePropList[]) { |
|
409 |
{.name = "version", .type = PROP_TYPE_INT}, |
|
410 |
{.name = NULL} |
|
406 |
.qdev.props = (Property[]) { |
|
407 |
{ |
|
408 |
.name = "version", |
|
409 |
.info = &qdev_prop_uint32, |
|
410 |
.offset = offsetof(IOMMUState, version), |
|
411 |
}, |
|
412 |
{/* end of property list */} |
|
411 | 413 |
} |
412 | 414 |
}; |
413 | 415 |
|
b/hw/m48t59.c | ||
---|---|---|
43 | 43 |
struct m48t59_t { |
44 | 44 |
SysBusDevice busdev; |
45 | 45 |
/* Model parameters */ |
46 |
int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59
|
|
46 |
uint32_t type; // 2 = m48t02, 8 = m48t08, 59 = m48t59
|
|
47 | 47 |
/* Hardware parameters */ |
48 | 48 |
qemu_irq IRQ; |
49 | 49 |
uint32_t io_base; |
50 |
uint16_t size;
|
|
50 |
uint32_t size;
|
|
51 | 51 |
/* RTC management */ |
52 | 52 |
time_t time_offset; |
53 | 53 |
time_t stop_time; |
... | ... | |
623 | 623 |
m48t59_t *d; |
624 | 624 |
|
625 | 625 |
dev = qdev_create(NULL, "m48t59"); |
626 |
qdev_set_prop_int(dev, "type", type);
|
|
627 |
qdev_set_prop_int(dev, "size", size);
|
|
628 |
qdev_set_prop_int(dev, "io_base", io_base);
|
|
626 |
qdev_prop_set_uint32(dev, "type", type);
|
|
627 |
qdev_prop_set_uint32(dev, "size", size);
|
|
628 |
qdev_prop_set_uint32(dev, "io_base", io_base);
|
|
629 | 629 |
qdev_init(dev); |
630 | 630 |
s = sysbus_from_qdev(dev); |
631 | 631 |
sysbus_connect_irq(s, 0, IRQ); |
... | ... | |
647 | 647 |
m48t59_t *s = FROM_SYSBUS(m48t59_t, dev); |
648 | 648 |
int mem_index; |
649 | 649 |
|
650 |
s->size = qdev_get_prop_int(&dev->qdev, "size", -1); |
|
651 | 650 |
s->buffer = qemu_mallocz(s->size); |
652 | 651 |
sysbus_init_irq(dev, &s->IRQ); |
653 |
s->io_base = qdev_get_prop_int(&dev->qdev, "io_base", 0); |
|
654 |
s->type = qdev_get_prop_int(&dev->qdev, "type", -1); |
|
655 | 652 |
|
656 | 653 |
mem_index = cpu_register_io_memory(nvram_read, nvram_write, s); |
657 | 654 |
sysbus_init_mmio(dev, s->size, mem_index); |
... | ... | |
666 | 663 |
register_savevm("m48t59", -1, 1, m48t59_save, m48t59_load, s); |
667 | 664 |
} |
668 | 665 |
|
666 |
static SysBusDeviceInfo m48t59_info = { |
|
667 |
.init = m48t59_init1, |
|
668 |
.qdev.name = "m48t59", |
|
669 |
.qdev.size = sizeof(m48t59_t), |
|
670 |
.qdev.props = (Property[]) { |
|
671 |
{ |
|
672 |
.name = "size", |
|
673 |
.info = &qdev_prop_uint32, |
|
674 |
.offset = offsetof(m48t59_t, size), |
|
675 |
.defval = (uint32_t[]) { -1 }, |
|
676 |
},{ |
|
677 |
.name = "type", |
|
678 |
.info = &qdev_prop_uint32, |
|
679 |
.offset = offsetof(m48t59_t, type), |
|
680 |
.defval = (uint32_t[]) { -1 }, |
|
681 |
},{ |
|
682 |
.name = "io_base", |
|
683 |
.info = &qdev_prop_hex32, |
|
684 |
.offset = offsetof(m48t59_t, io_base), |
|
685 |
}, |
|
686 |
{/* end of list */} |
|
687 |
} |
|
688 |
}; |
|
689 |
|
|
669 | 690 |
static void m48t59_register_devices(void) |
670 | 691 |
{ |
671 |
sysbus_register_dev("m48t59", sizeof(m48t59_t), m48t59_init1);
|
|
692 |
sysbus_register_withprop(&m48t59_info);
|
|
672 | 693 |
} |
673 | 694 |
|
674 | 695 |
device_init(m48t59_register_devices) |
b/hw/mips_malta.c | ||
---|---|---|
914 | 914 |
/* TODO: Populate SPD eeprom data. */ |
915 | 915 |
DeviceState *eeprom; |
916 | 916 |
eeprom = qdev_create((BusState *)smbus, "smbus-eeprom"); |
917 |
qdev_set_prop_int(eeprom, "address", 0x50 + i);
|
|
918 |
qdev_set_prop_ptr(eeprom, "data", eeprom_buf + (i * 256));
|
|
917 |
qdev_prop_set_uint32(eeprom, "address", 0x50 + i);
|
|
918 |
qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
|
|
919 | 919 |
qdev_init(eeprom); |
920 | 920 |
} |
921 | 921 |
pit = pit_init(0x40, i8259[0]); |
b/hw/musicpal.c | ||
---|---|---|
1578 | 1578 |
|
1579 | 1579 |
qemu_check_nic_model(&nd_table[0], "mv88w8618"); |
1580 | 1580 |
dev = qdev_create(NULL, "mv88w8618_eth"); |
1581 |
qdev_set_netdev(dev, &nd_table[0]);
|
|
1581 |
dev->nd = &nd_table[0];
|
|
1582 | 1582 |
qdev_init(dev); |
1583 | 1583 |
sysbus_mmio_map(sysbus_from_qdev(dev), 0, MP_ETH_BASE); |
1584 | 1584 |
sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[MP_ETH_IRQ]); |
b/hw/pc.c | ||
---|---|---|
1402 | 1402 |
for (i = 0; i < 8; i++) { |
1403 | 1403 |
DeviceState *eeprom; |
1404 | 1404 |
eeprom = qdev_create((BusState *)smbus, "smbus-eeprom"); |
1405 |
qdev_set_prop_int(eeprom, "address", 0x50 + i);
|
|
1406 |
qdev_set_prop_ptr(eeprom, "data", eeprom_buf + (i * 256));
|
|
1405 |
qdev_prop_set_uint32(eeprom, "address", 0x50 + i);
|
|
1406 |
qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
|
|
1407 | 1407 |
qdev_init(eeprom); |
1408 | 1408 |
} |
1409 | 1409 |
} |
b/hw/pci.c | ||
---|---|---|
59 | 59 |
.name = "PCI", |
60 | 60 |
.size = sizeof(PCIBus), |
61 | 61 |
.print_dev = pcibus_dev_print, |
62 |
.props = (Property[]) { |
|
63 |
{ |
|
64 |
.name = "devfn", |
|
65 |
.info = &qdev_prop_uint32, |
|
66 |
.offset = offsetof(PCIDevice, devfn), |
|
67 |
.defval = (uint32_t[]) { -1 }, |
|
68 |
}, |
|
69 |
{/* end of list */} |
|
70 |
} |
|
62 | 71 |
}; |
63 | 72 |
|
64 | 73 |
static void pci_update_mappings(PCIDevice *d); |
... | ... | |
770 | 779 |
} |
771 | 780 |
|
772 | 781 |
dev = qdev_create(&bus->qbus, name); |
773 |
qdev_set_prop_int(dev, "devfn", devfn);
|
|
782 |
qdev_prop_set_uint32(dev, "devfn", devfn);
|
|
774 | 783 |
return (PCIDevice *)dev; |
775 | 784 |
} |
776 | 785 |
|
... | ... | |
813 | 822 |
if (strcmp(nd->model, pci_nic_models[i]) == 0) { |
814 | 823 |
pci_dev = pci_create(pci_nic_names[i], devaddr); |
815 | 824 |
dev = &pci_dev->qdev; |
816 |
qdev_set_netdev(dev, nd);
|
|
825 |
dev->nd = nd;
|
|
817 | 826 |
qdev_init(dev); |
818 | 827 |
nd->private = dev; |
819 | 828 |
return pci_dev; |
... | ... | |
891 | 900 |
int devfn; |
892 | 901 |
|
893 | 902 |
bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev)); |
894 |
devfn = qdev_get_prop_int(qdev, "devfn", -1);
|
|
903 |
devfn = pci_dev->devfn;
|
|
895 | 904 |
pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn, |
896 | 905 |
info->config_read, info->config_write); |
897 | 906 |
assert(pci_dev); |
... | ... | |
918 | 927 |
DeviceState *dev; |
919 | 928 |
|
920 | 929 |
dev = qdev_create(&bus->qbus, name); |
921 |
qdev_set_prop_int(dev, "devfn", devfn);
|
|
930 |
qdev_prop_set_uint32(dev, "devfn", devfn);
|
|
922 | 931 |
qdev_init(dev); |
923 | 932 |
|
924 | 933 |
return (PCIDevice *)dev; |
b/hw/pcnet.c | ||
---|---|---|
2128 | 2128 |
s->mmio_index = |
2129 | 2129 |
cpu_register_io_memory(lance_mem_read, lance_mem_write, d); |
2130 | 2130 |
|
2131 |
s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma"); |
|
2132 |
|
|
2133 | 2131 |
qdev_init_gpio_in(&dev->qdev, parent_lance_reset, 1); |
2134 | 2132 |
|
2135 | 2133 |
sysbus_init_mmio(dev, 4, s->mmio_index); |
... | ... | |
2141 | 2139 |
|
2142 | 2140 |
pcnet_common_init(&dev->qdev, s, lance_cleanup); |
2143 | 2141 |
} |
2142 |
|
|
2143 |
static SysBusDeviceInfo lance_info = { |
|
2144 |
.init = lance_init, |
|
2145 |
.qdev.name = "lance", |
|
2146 |
.qdev.size = sizeof(SysBusPCNetState), |
|
2147 |
.qdev.props = (Property[]) { |
|
2148 |
{ |
|
2149 |
.name = "dma", |
|
2150 |
.info = &qdev_prop_ptr, |
|
2151 |
.offset = offsetof(SysBusPCNetState, state.dma_opaque), |
|
2152 |
}, |
|
2153 |
{/* end of list */} |
|
2154 |
} |
|
2155 |
}; |
|
2156 |
|
|
2144 | 2157 |
#endif /* TARGET_SPARC */ |
2145 | 2158 |
|
2146 | 2159 |
static PCIDeviceInfo pcnet_info = { |
... | ... | |
2153 | 2166 |
{ |
2154 | 2167 |
pci_qdev_register(&pcnet_info); |
2155 | 2168 |
#if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) |
2156 |
sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init);
|
|
2169 |
sysbus_register_withprop(&lance_info);
|
|
2157 | 2170 |
#endif |
2158 | 2171 |
} |
2159 | 2172 |
|
b/hw/qdev-addr.c | ||
---|---|---|
1 |
#include "qdev.h" |
|
2 |
#include "qdev-addr.h" |
|
3 |
#include "targphys.h" |
|
4 |
|
|
5 |
/* --- target physical address --- */ |
|
6 |
|
|
7 |
static int parse_taddr(DeviceState *dev, Property *prop, const char *str) |
|
8 |
{ |
|
9 |
target_phys_addr_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
10 |
|
|
11 |
*ptr = strtoull(str, NULL, 16); |
|
12 |
return 0; |
|
13 |
} |
|
14 |
|
|
15 |
static int print_taddr(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
16 |
{ |
|
17 |
target_phys_addr_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
18 |
return snprintf(dest, len, "0x" TARGET_FMT_plx, *ptr); |
|
19 |
} |
|
20 |
|
|
21 |
PropertyInfo qdev_prop_taddr = { |
|
22 |
.name = "taddr", |
|
23 |
.type = PROP_TYPE_TADDR, |
|
24 |
.size = sizeof(target_phys_addr_t), |
|
25 |
.parse = parse_taddr, |
|
26 |
.print = print_taddr, |
|
27 |
}; |
|
28 |
|
|
29 |
void qdev_prop_set_taddr(DeviceState *dev, const char *name, target_phys_addr_t value) |
|
30 |
{ |
|
31 |
qdev_prop_set(dev, name, &value, PROP_TYPE_TADDR); |
|
32 |
} |
b/hw/qdev-addr.h | ||
---|---|---|
1 |
extern PropertyInfo qdev_prop_taddr; |
|
2 |
void qdev_prop_set_taddr(DeviceState *dev, const char *name, target_phys_addr_t value); |
b/hw/qdev-properties.c | ||
---|---|---|
1 |
#include "qdev.h" |
|
2 |
|
|
3 |
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) |
|
4 |
{ |
|
5 |
void *ptr = dev; |
|
6 |
ptr += prop->offset; |
|
7 |
return ptr; |
|
8 |
} |
|
9 |
|
|
10 |
/* --- 16bit integer --- */ |
|
11 |
|
|
12 |
static int parse_uint16(DeviceState *dev, Property *prop, const char *str) |
|
13 |
{ |
|
14 |
uint16_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
15 |
const char *fmt; |
|
16 |
|
|
17 |
/* accept both hex and decimal */ |
|
18 |
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16; |
|
19 |
if (sscanf(str, fmt, ptr) != 1) |
|
20 |
return -1; |
|
21 |
return 0; |
|
22 |
} |
|
23 |
|
|
24 |
static int print_uint16(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
25 |
{ |
|
26 |
uint16_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
27 |
return snprintf(dest, len, "%" PRIu16, *ptr); |
|
28 |
} |
|
29 |
|
|
30 |
PropertyInfo qdev_prop_uint16 = { |
|
31 |
.name = "uint16", |
|
32 |
.type = PROP_TYPE_UINT16, |
|
33 |
.size = sizeof(uint16_t), |
|
34 |
.parse = parse_uint16, |
|
35 |
.print = print_uint16, |
|
36 |
}; |
|
37 |
|
|
38 |
/* --- 32bit integer --- */ |
|
39 |
|
|
40 |
static int parse_uint32(DeviceState *dev, Property *prop, const char *str) |
|
41 |
{ |
|
42 |
uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
43 |
const char *fmt; |
|
44 |
|
|
45 |
/* accept both hex and decimal */ |
|
46 |
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32; |
|
47 |
if (sscanf(str, fmt, ptr) != 1) |
|
48 |
return -1; |
|
49 |
return 0; |
|
50 |
} |
|
51 |
|
|
52 |
static int print_uint32(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
53 |
{ |
|
54 |
uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
55 |
return snprintf(dest, len, "%" PRIu32, *ptr); |
|
56 |
} |
|
57 |
|
|
58 |
PropertyInfo qdev_prop_uint32 = { |
|
59 |
.name = "uint32", |
|
60 |
.type = PROP_TYPE_UINT32, |
|
61 |
.size = sizeof(uint32_t), |
|
62 |
.parse = parse_uint32, |
|
63 |
.print = print_uint32, |
|
64 |
}; |
|
65 |
|
|
66 |
/* --- 32bit hex value --- */ |
|
67 |
|
|
68 |
static int parse_hex32(DeviceState *dev, Property *prop, const char *str) |
|
69 |
{ |
|
70 |
uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
71 |
|
|
72 |
if (sscanf(str, "%" PRIx32, ptr) != 1) |
|
73 |
return -1; |
|
74 |
return 0; |
|
75 |
} |
|
76 |
|
|
77 |
static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
78 |
{ |
|
79 |
uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
|
80 |
return snprintf(dest, len, "0x%" PRIx32, *ptr); |
|
81 |
} |
|
82 |
|
|
83 |
PropertyInfo qdev_prop_hex32 = { |
|
84 |
.name = "hex32", |
|
85 |
.type = PROP_TYPE_UINT32, |
|
86 |
.size = sizeof(uint32_t), |
|
87 |
.parse = parse_hex32, |
|
88 |
.print = print_hex32, |
|
89 |
}; |
|
90 |
|
|
91 |
/* --- pointer --- */ |
|
92 |
|
|
93 |
static int print_ptr(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
94 |
{ |
|
95 |
void **ptr = qdev_get_prop_ptr(dev, prop); |
|
96 |
return snprintf(dest, len, "<%p>", *ptr); |
|
97 |
} |
|
98 |
|
|
99 |
PropertyInfo qdev_prop_ptr = { |
|
100 |
.name = "ptr", |
|
101 |
.type = PROP_TYPE_PTR, |
|
102 |
.size = sizeof(void*), |
|
103 |
.print = print_ptr, |
|
104 |
}; |
|
105 |
|
|
106 |
/* --- mac address --- */ |
|
107 |
|
|
108 |
/* |
|
109 |
* accepted syntax versions: |
|
110 |
* 01:02:03:04:05:06 |
|
111 |
* 01-02-03-04-05-06 |
|
112 |
*/ |
|
113 |
static int parse_mac(DeviceState *dev, Property *prop, const char *str) |
|
114 |
{ |
|
115 |
uint8_t *mac = qdev_get_prop_ptr(dev, prop); |
|
116 |
int i, pos; |
|
117 |
char *p; |
|
118 |
|
|
119 |
for (i = 0, pos = 0; i < 6; i++, pos += 3) { |
|
120 |
if (!isxdigit(str[pos])) |
|
121 |
return -1; |
|
122 |
if (!isxdigit(str[pos+1])) |
|
123 |
return -1; |
|
124 |
if (i == 5 && str[pos+2] != '\0') |
|
125 |
return -1; |
|
126 |
if (str[pos+2] != ':' && str[pos+2] != '-') |
|
127 |
return -1; |
|
128 |
mac[i] = strtol(str+pos, &p, 16); |
|
129 |
} |
|
130 |
return 0; |
|
131 |
} |
|
132 |
|
|
133 |
static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t len) |
|
134 |
{ |
|
135 |
uint8_t *mac = qdev_get_prop_ptr(dev, prop); |
|
136 |
return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x", |
|
137 |
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
|
138 |
} |
|
139 |
|
|
140 |
PropertyInfo qdev_prop_macaddr = { |
|
141 |
.name = "mac-addr", |
|
142 |
.type = PROP_TYPE_MACADDR, |
|
143 |
.size = 6, |
|
144 |
.parse = parse_mac, |
|
145 |
.print = print_mac, |
|
146 |
}; |
|
147 |
|
|
148 |
/* --- public helpers --- */ |
|
149 |
|
|
150 |
static Property *qdev_prop_walk(Property *props, const char *name) |
|
151 |
{ |
|
152 |
if (!props) |
|
153 |
return NULL; |
|
154 |
while (props->name) { |
|
155 |
if (strcmp(props->name, name) == 0) |
|
156 |
return props; |
|
157 |
props++; |
|
158 |
} |
|
159 |
return NULL; |
|
160 |
} |
|
161 |
|
|
162 |
static Property *qdev_prop_find(DeviceState *dev, const char *name) |
|
163 |
{ |
|
164 |
Property *prop; |
|
165 |
|
|
166 |
/* device properties */ |
|
167 |
prop = qdev_prop_walk(dev->info->props, name); |
|
168 |
if (prop) |
|
169 |
return prop; |
|
170 |
|
|
171 |
/* bus properties */ |
|
172 |
prop = qdev_prop_walk(dev->parent_bus->info->props, name); |
|
173 |
if (prop) |
|
174 |
return prop; |
|
175 |
|
|
176 |
return NULL; |
|
177 |
} |
|
178 |
|
|
179 |
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value) |
|
180 |
{ |
|
181 |
Property *prop; |
|
182 |
|
|
183 |
prop = qdev_prop_find(dev, name); |
|
184 |
if (!prop) { |
|
185 |
fprintf(stderr, "property \"%s.%s\" not found\n", |
|
186 |
dev->info->name, name); |
|
187 |
return -1; |
|
188 |
} |
|
189 |
if (!prop->info->parse) { |
|
190 |
fprintf(stderr, "property \"%s.%s\" has no parser\n", |
|
191 |
dev->info->name, name); |
|
192 |
return -1; |
|
193 |
} |
|
194 |
return prop->info->parse(dev, prop, value); |
|
195 |
} |
|
196 |
|
|
197 |
void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type) |
|
198 |
{ |
|
199 |
Property *prop; |
|
200 |
void *dst; |
|
201 |
|
|
202 |
prop = qdev_prop_find(dev, name); |
|
203 |
if (!prop) { |
|
204 |
fprintf(stderr, "%s: property \"%s.%s\" not found\n", |
|
205 |
__FUNCTION__, dev->info->name, name); |
|
206 |
abort(); |
|
207 |
} |
|
208 |
if (prop->info->type != type) { |
|
209 |
fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n", |
|
210 |
__FUNCTION__, dev->info->name, name); |
|
211 |
abort(); |
|
212 |
} |
|
213 |
dst = qdev_get_prop_ptr(dev, prop); |
|
214 |
memcpy(dst, src, prop->info->size); |
|
215 |
} |
|
216 |
|
|
217 |
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value) |
|
218 |
{ |
|
219 |
qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16); |
|
220 |
} |
|
221 |
|
|
222 |
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value) |
|
223 |
{ |
|
224 |
qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32); |
|
225 |
} |
|
226 |
|
|
227 |
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value) |
|
228 |
{ |
|
229 |
qdev_prop_set(dev, name, &value, PROP_TYPE_PTR); |
|
230 |
} |
|
231 |
|
|
232 |
void qdev_prop_set_defaults(DeviceState *dev, Property *props) |
|
233 |
{ |
|
234 |
char *dst; |
|
235 |
|
|
236 |
if (!props) |
|
237 |
return; |
|
238 |
while (props->name) { |
|
239 |
if (props->defval) { |
|
240 |
dst = qdev_get_prop_ptr(dev, props); |
|
241 |
memcpy(dst, props->defval, props->info->size); |
|
242 |
} |
|
243 |
props++; |
|
244 |
} |
|
245 |
} |
|
246 |
|
b/hw/qdev.c | ||
---|---|---|
30 | 30 |
#include "sysemu.h" |
31 | 31 |
#include "monitor.h" |
32 | 32 |
|
33 |
struct DeviceProperty { |
|
34 |
const char *name; |
|
35 |
DevicePropType type; |
|
36 |
union { |
|
37 |
uint64_t i; |
|
38 |
void *ptr; |
|
39 |
} value; |
|
40 |
DeviceProperty *next; |
|
41 |
}; |
|
42 |
|
|
43 | 33 |
/* This is a nasty hack to allow passing a NULL bus to qdev_create. */ |
44 | 34 |
static BusState *main_system_bus; |
45 | 35 |
extern struct BusInfo system_bus_info; |
... | ... | |
85 | 75 |
dev = qemu_mallocz(info->size); |
86 | 76 |
dev->info = info; |
87 | 77 |
dev->parent_bus = bus; |
78 |
qdev_prop_set_defaults(dev, dev->info->props); |
|
79 |
qdev_prop_set_defaults(dev, dev->parent_bus->info->props); |
|
88 | 80 |
LIST_INSERT_HEAD(&bus->children, dev, sibling); |
89 | 81 |
return dev; |
90 | 82 |
} |
... | ... | |
104 | 96 |
free(dev); |
105 | 97 |
} |
106 | 98 |
|
107 |
static DeviceProperty *create_prop(DeviceState *dev, const char *name, |
|
108 |
DevicePropType type) |
|
109 |
{ |
|
110 |
DeviceProperty *prop; |
|
111 |
|
|
112 |
/* TODO: Check for duplicate properties. */ |
|
113 |
prop = qemu_mallocz(sizeof(*prop)); |
|
114 |
prop->name = qemu_strdup(name); |
|
115 |
prop->type = type; |
|
116 |
prop->next = dev->props; |
|
117 |
dev->props = prop; |
|
118 |
|
|
119 |
return prop; |
|
120 |
} |
|
121 |
|
|
122 |
void qdev_set_prop_int(DeviceState *dev, const char *name, uint64_t value) |
|
123 |
{ |
|
124 |
DeviceProperty *prop; |
|
125 |
|
|
126 |
prop = create_prop(dev, name, PROP_TYPE_INT); |
|
127 |
prop->value.i = value; |
|
128 |
} |
|
129 |
|
|
130 |
void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value) |
|
131 |
{ |
|
132 |
DeviceProperty *prop; |
|
133 |
|
|
134 |
prop = create_prop(dev, name, PROP_TYPE_DEV); |
|
135 |
prop->value.ptr = value; |
|
136 |
} |
|
137 |
|
|
138 |
void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value) |
|
139 |
{ |
|
140 |
DeviceProperty *prop; |
|
141 |
|
|
142 |
prop = create_prop(dev, name, PROP_TYPE_PTR); |
|
143 |
prop->value.ptr = value; |
|
144 |
} |
|
145 |
|
|
146 |
void qdev_set_netdev(DeviceState *dev, NICInfo *nd) |
|
147 |
{ |
|
148 |
assert(!dev->nd); |
|
149 |
dev->nd = nd; |
|
150 |
} |
|
151 |
|
|
152 |
|
|
153 | 99 |
/* Get a character (serial) device interface. */ |
154 | 100 |
CharDriverState *qdev_init_chardev(DeviceState *dev) |
155 | 101 |
{ |
... | ... | |
168 | 114 |
return dev->parent_bus; |
169 | 115 |
} |
170 | 116 |
|
171 |
static DeviceProperty *find_prop(DeviceState *dev, const char *name, |
|
172 |
DevicePropType type) |
|
173 |
{ |
|
174 |
DeviceProperty *prop; |
|
175 |
|
|
176 |
for (prop = dev->props; prop; prop = prop->next) { |
|
177 |
if (strcmp(prop->name, name) == 0) { |
|
178 |
assert (prop->type == type); |
|
179 |
return prop; |
|
180 |
} |
|
181 |
} |
|
182 |
return NULL; |
|
183 |
} |
|
184 |
|
|
185 |
uint64_t qdev_get_prop_int(DeviceState *dev, const char *name, uint64_t def) |
|
186 |
{ |
|
187 |
DeviceProperty *prop; |
|
188 |
|
|
189 |
prop = find_prop(dev, name, PROP_TYPE_INT); |
|
190 |
if (!prop) { |
|
191 |
return def; |
|
192 |
} |
|
193 |
|
|
194 |
return prop->value.i; |
|
195 |
} |
|
196 |
|
|
197 |
void *qdev_get_prop_ptr(DeviceState *dev, const char *name) |
|
198 |
{ |
|
199 |
DeviceProperty *prop; |
|
200 |
|
|
201 |
prop = find_prop(dev, name, PROP_TYPE_PTR); |
|
202 |
assert(prop); |
|
203 |
return prop->value.ptr; |
|
204 |
} |
|
205 |
|
|
206 |
DeviceState *qdev_get_prop_dev(DeviceState *dev, const char *name) |
|
207 |
{ |
|
208 |
DeviceProperty *prop; |
|
209 |
|
|
210 |
prop = find_prop(dev, name, PROP_TYPE_DEV); |
|
211 |
if (!prop) { |
|
212 |
return NULL; |
|
213 |
} |
|
214 |
return prop->value.ptr; |
|
215 |
} |
|
216 |
|
|
217 | 117 |
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) |
218 | 118 |
{ |
219 | 119 |
assert(dev->num_gpio_in == 0); |
... | ... | |
326 | 226 |
#define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__) |
327 | 227 |
static void qbus_print(Monitor *mon, BusState *bus, int indent); |
328 | 228 |
|
229 |
static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props, |
|
230 |
const char *prefix, int indent) |
|
231 |
{ |
|
232 |
char buf[64]; |
|
233 |
|
|
234 |
if (!props) |
|
235 |
return; |
|
236 |
while (props->name) { |
|
237 |
if (props->info->print) { |
|
238 |
props->info->print(dev, props, buf, sizeof(buf)); |
|
239 |
qdev_printf("%s-prop: %s = %s\n", prefix, props->name, buf); |
|
240 |
} |
|
241 |
props++; |
|
242 |
} |
|
243 |
} |
|
244 |
|
|
329 | 245 |
static void qdev_print(Monitor *mon, DeviceState *dev, int indent) |
330 | 246 |
{ |
331 |
DeviceProperty *prop; |
|
332 | 247 |
BusState *child; |
333 | 248 |
qdev_printf("dev: %s\n", dev->info->name); |
334 | 249 |
indent += 2; |
... | ... | |
338 | 253 |
if (dev->num_gpio_out) { |
339 | 254 |
qdev_printf("gpio-out %d\n", dev->num_gpio_out); |
340 | 255 |
} |
341 |
for (prop = dev->props; prop; prop = prop->next) { |
|
342 |
switch (prop->type) { |
|
343 |
case PROP_TYPE_INT: |
|
344 |
qdev_printf("prop-int %s 0x%" PRIx64 "\n", prop->name, |
|
345 |
prop->value.i); |
|
346 |
break; |
|
347 |
case PROP_TYPE_PTR: |
|
348 |
qdev_printf("prop-ptr %s\n", prop->name); |
|
349 |
break; |
|
350 |
case PROP_TYPE_DEV: |
|
351 |
qdev_printf("prop-dev %s %s\n", prop->name, |
|
352 |
((DeviceState *)prop->value.ptr)->info->name); |
|
353 |
break; |
|
354 |
default: |
|
355 |
qdev_printf("prop-unknown%d %s\n", prop->type, prop->name); |
|
356 |
break; |
|
357 |
} |
|
358 |
} |
|
256 |
qdev_print_props(mon, dev, dev->info->props, "dev", indent); |
|
257 |
qdev_print_props(mon, dev, dev->parent_bus->info->props, "bus", indent); |
|
359 | 258 |
if (dev->parent_bus->info->print_dev) |
360 | 259 |
dev->parent_bus->info->print_dev(mon, dev, indent); |
361 | 260 |
LIST_FOREACH(child, &dev->child_bus, sibling) { |
b/hw/qdev.h | ||
---|---|---|
4 | 4 |
#include "hw.h" |
5 | 5 |
#include "sys-queue.h" |
6 | 6 |
|
7 |
typedef struct DeviceInfo DeviceInfo; |
|
7 |
typedef struct Property Property; |
|
8 |
|
|
9 |
typedef struct PropertyInfo PropertyInfo; |
|
8 | 10 |
|
9 |
typedef struct DeviceProperty DeviceProperty;
|
|
11 |
typedef struct DeviceInfo DeviceInfo;
|
|
10 | 12 |
|
11 | 13 |
typedef struct BusState BusState; |
12 | 14 |
|
... | ... | |
17 | 19 |
struct DeviceState { |
18 | 20 |
DeviceInfo *info; |
19 | 21 |
BusState *parent_bus; |
20 |
DeviceProperty *props; |
|
21 | 22 |
int num_gpio_out; |
22 | 23 |
qemu_irq *gpio_out; |
23 | 24 |
int num_gpio_in; |
... | ... | |
32 | 33 |
const char *name; |
33 | 34 |
size_t size; |
34 | 35 |
bus_dev_printfn print_dev; |
36 |
Property *props; |
|
35 | 37 |
}; |
36 | 38 |
|
37 | 39 |
struct BusState { |
... | ... | |
42 | 44 |
LIST_ENTRY(BusState) sibling; |
43 | 45 |
}; |
44 | 46 |
|
47 |
struct Property { |
|
48 |
const char *name; |
|
49 |
PropertyInfo *info; |
|
50 |
int offset; |
|
51 |
void *defval; |
|
52 |
}; |
|
53 |
|
|
54 |
enum PropertyType { |
|
55 |
PROP_TYPE_UNSPEC = 0, |
|
56 |
PROP_TYPE_UINT16, |
|
57 |
PROP_TYPE_UINT32, |
|
58 |
PROP_TYPE_TADDR, |
|
59 |
PROP_TYPE_MACADDR, |
|
60 |
PROP_TYPE_PTR, |
|
61 |
}; |
|
62 |
|
|
63 |
struct PropertyInfo { |
|
64 |
const char *name; |
|
65 |
size_t size; |
|
66 |
enum PropertyType type; |
|
67 |
int (*parse)(DeviceState *dev, Property *prop, const char *str); |
|
68 |
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); |
|
69 |
}; |
|
70 |
|
|
45 | 71 |
/*** Board API. This should go away once we have a machine config file. ***/ |
46 | 72 |
|
47 | 73 |
DeviceState *qdev_create(BusState *bus, const char *name); |
48 | 74 |
void qdev_init(DeviceState *dev); |
49 | 75 |
void qdev_free(DeviceState *dev); |
50 | 76 |
|
51 |
/* Set properties between creation and init. */ |
|
52 |
void qdev_set_prop_int(DeviceState *dev, const char *name, uint64_t value); |
|
53 |
void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value); |
|
54 |
void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value); |
|
55 |
void qdev_set_netdev(DeviceState *dev, NICInfo *nd); |
|
56 |
|
|
57 | 77 |
qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); |
58 | 78 |
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); |
59 | 79 |
|
... | ... | |
61 | 81 |
|
62 | 82 |
/*** Device API. ***/ |
63 | 83 |
|
64 |
typedef enum { |
|
65 |
PROP_TYPE_INT, |
|
66 |
PROP_TYPE_PTR, |
|
67 |
PROP_TYPE_DEV |
|
68 |
} DevicePropType; |
|
69 |
|
|
70 |
typedef struct { |
|
71 |
const char *name; |
Also available in: Unified diff