15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef HW_SYSBUS_H
25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define HW_SYSBUS_H 1
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Devices attached directly to the main system bus.  */
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
69b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner#include "exec/hwaddr.h"
72ec695af7284adbedcdbc08a22d818b6bdd8990cDavid 'Digit' Turner#include "hw/qdev.h"
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QDEV_MAX_MMIO 5
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QDEV_MAX_IRQ 32
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct SysBusDevice SysBusDevice;
13bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnertypedef void (*mmio_mapfunc)(SysBusDevice *dev, hwaddr addr);
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct SysBusDevice {
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DeviceState qdev;
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int num_irq;
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_irq irqs[QDEV_MAX_IRQ];
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_irq *irqp[QDEV_MAX_IRQ];
205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int num_mmio;
215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct {
22bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner        hwaddr addr;
23bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner        hwaddr size;
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        mmio_mapfunc cb;
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        int iofunc;
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } mmio[QDEV_MAX_MMIO];
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (*sysbus_initfn)(SysBusDevice *dev);
305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Macros to compensate for lack of type inheritance in C.  */
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define sysbus_from_qdev(dev) ((SysBusDevice *)(dev))
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define FROM_SYSBUS(type, dev) DO_UPCAST(type, busdev, dev)
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct {
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DeviceInfo qdev;
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    sysbus_initfn init;
385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} SysBusDeviceInfo;
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_register_dev(const char *name, size_t size, sysbus_initfn init);
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_register_withprop(SysBusDeviceInfo *info);
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid *sysbus_new(void);
43bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnervoid sysbus_init_mmio(SysBusDevice *dev, hwaddr size, int iofunc);
44bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnervoid sysbus_init_mmio_cb(SysBusDevice *dev, hwaddr size,
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                            mmio_mapfunc cb);
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
51bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnervoid sysbus_mmio_map(SysBusDevice *dev, int n, hwaddr addr);
525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Legacy helper function for creating devices.  */
545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDeviceState *sysbus_create_varargs(const char *name,
55bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner                                 hwaddr addr, ...);
565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline DeviceState *sysbus_create_simple(const char *name,
57bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner                                              hwaddr addr,
585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                              qemu_irq irq)
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return sysbus_create_varargs(name, addr, irq, NULL);
615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* !HW_SYSBUS_H */
64