]> git.proxmox.com Git - mirror_qemu.git/blame - hw/sysbus.h
hw/9pfs: replace iovec manipulation with QEMUIOVector
[mirror_qemu.git] / hw / sysbus.h
CommitLineData
aae9460e
PB
1#ifndef HW_SYSBUS_H
2#define HW_SYSBUS_H 1
3
4/* Devices attached directly to the main system bus. */
5
6#include "qdev.h"
ec3bb837 7#include "memory.h"
aae9460e 8
f40070c3 9#define QDEV_MAX_MMIO 32
c646f74f 10#define QDEV_MAX_PIO 32
a1961a4b 11#define QDEV_MAX_IRQ 256
aae9460e
PB
12
13typedef struct SysBusDevice SysBusDevice;
aae9460e
PB
14
15struct SysBusDevice {
16 DeviceState qdev;
17 int num_irq;
18 qemu_irq irqs[QDEV_MAX_IRQ];
19 qemu_irq *irqp[QDEV_MAX_IRQ];
20 int num_mmio;
21 struct {
c227f099 22 target_phys_addr_t addr;
ec3bb837 23 MemoryRegion *memory;
aae9460e 24 } mmio[QDEV_MAX_MMIO];
c646f74f
GN
25 int num_pio;
26 pio_addr_t pio[QDEV_MAX_PIO];
aae9460e
PB
27};
28
81a322d4 29typedef int (*sysbus_initfn)(SysBusDevice *dev);
aae9460e
PB
30
31/* Macros to compensate for lack of type inheritance in C. */
32#define sysbus_from_qdev(dev) ((SysBusDevice *)(dev))
33#define FROM_SYSBUS(type, dev) DO_UPCAST(type, busdev, dev)
34
1431b6a1
PB
35typedef struct {
36 DeviceInfo qdev;
37 sysbus_initfn init;
38} SysBusDeviceInfo;
39
aae9460e 40void sysbus_register_dev(const char *name, size_t size, sysbus_initfn init);
074f2fff 41void sysbus_register_withprop(SysBusDeviceInfo *info);
aae9460e 42void *sysbus_new(void);
750ecd44 43void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory);
46c305ef 44MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n);
aae9460e
PB
45void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
46void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
c646f74f 47void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);
aae9460e
PB
48
49
50void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
c227f099 51void sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr);
2b985d9c
AK
52void sysbus_add_memory(SysBusDevice *dev, target_phys_addr_t addr,
53 MemoryRegion *mem);
d40b2af8
AK
54void sysbus_add_memory_overlap(SysBusDevice *dev, target_phys_addr_t addr,
55 MemoryRegion *mem, unsigned priority);
2b985d9c
AK
56void sysbus_del_memory(SysBusDevice *dev, MemoryRegion *mem);
57void sysbus_add_io(SysBusDevice *dev, target_phys_addr_t addr,
58 MemoryRegion *mem);
59void sysbus_del_io(SysBusDevice *dev, MemoryRegion *mem);
aae9460e
PB
60
61/* Legacy helper function for creating devices. */
62DeviceState *sysbus_create_varargs(const char *name,
c227f099 63 target_phys_addr_t addr, ...);
4912371f
BS
64DeviceState *sysbus_try_create_varargs(const char *name,
65 target_phys_addr_t addr, ...);
aae9460e 66static inline DeviceState *sysbus_create_simple(const char *name,
c227f099 67 target_phys_addr_t addr,
aae9460e
PB
68 qemu_irq irq)
69{
70 return sysbus_create_varargs(name, addr, irq, NULL);
71}
72
4912371f
BS
73static inline DeviceState *sysbus_try_create_simple(const char *name,
74 target_phys_addr_t addr,
75 qemu_irq irq)
76{
77 return sysbus_try_create_varargs(name, addr, irq, NULL);
78}
79
aae9460e 80#endif /* !HW_SYSBUS_H */