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 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qdev.h" 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QDEV_MAX_MMIO 5 95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QDEV_MAX_IRQ 32 105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct SysBusDevice SysBusDevice; 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (*mmio_mapfunc)(SysBusDevice *dev, target_phys_addr_t addr); 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct SysBusDevice { 155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DeviceState qdev; 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int num_irq; 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_irq irqs[QDEV_MAX_IRQ]; 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_irq *irqp[QDEV_MAX_IRQ]; 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int num_mmio; 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct { 215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t addr; 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t size; 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner mmio_mapfunc cb; 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int iofunc; 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } mmio[QDEV_MAX_MMIO]; 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (*sysbus_initfn)(SysBusDevice *dev); 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Macros to compensate for lack of type inheritance in C. */ 315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define sysbus_from_qdev(dev) ((SysBusDevice *)(dev)) 325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define FROM_SYSBUS(type, dev) DO_UPCAST(type, busdev, dev) 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct { 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner DeviceInfo qdev; 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner sysbus_initfn init; 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} SysBusDeviceInfo; 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_register_dev(const char *name, size_t size, sysbus_initfn init); 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_register_withprop(SysBusDeviceInfo *info); 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid *sysbus_new(void); 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_init_mmio(SysBusDevice *dev, target_phys_addr_t size, int iofunc); 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size, 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner mmio_mapfunc cb); 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_init_irq(SysBusDevice *dev, qemu_irq *p); 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target); 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq); 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr); 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Legacy helper function for creating devices. */ 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDeviceState *sysbus_create_varargs(const char *name, 545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t addr, ...); 555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline DeviceState *sysbus_create_simple(const char *name, 565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t addr, 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_irq irq) 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return sysbus_create_varargs(name, addr, irq, NULL); 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* !HW_SYSBUS_H */ 63