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