sysbus.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #ifndef HW_SYSBUS_H
  2. #define HW_SYSBUS_H 1
  3. /* Devices attached directly to the main system bus. */
  4. #include "qdev.h"
  5. #define QDEV_MAX_MMIO 32
  6. #define QDEV_MAX_PIO 32
  7. #define QDEV_MAX_IRQ 256
  8. typedef struct SysBusDevice SysBusDevice;
  9. typedef void (*mmio_mapfunc)(SysBusDevice *dev, target_phys_addr_t addr);
  10. struct SysBusDevice {
  11. DeviceState qdev;
  12. int num_irq;
  13. qemu_irq irqs[QDEV_MAX_IRQ];
  14. qemu_irq *irqp[QDEV_MAX_IRQ];
  15. int num_mmio;
  16. struct {
  17. target_phys_addr_t addr;
  18. target_phys_addr_t size;
  19. mmio_mapfunc cb;
  20. ram_addr_t iofunc;
  21. } mmio[QDEV_MAX_MMIO];
  22. int num_pio;
  23. pio_addr_t pio[QDEV_MAX_PIO];
  24. };
  25. typedef int (*sysbus_initfn)(SysBusDevice *dev);
  26. /* Macros to compensate for lack of type inheritance in C. */
  27. #define sysbus_from_qdev(dev) ((SysBusDevice *)(dev))
  28. #define FROM_SYSBUS(type, dev) DO_UPCAST(type, busdev, dev)
  29. typedef struct {
  30. DeviceInfo qdev;
  31. sysbus_initfn init;
  32. } SysBusDeviceInfo;
  33. void sysbus_register_dev(const char *name, size_t size, sysbus_initfn init);
  34. void sysbus_register_withprop(SysBusDeviceInfo *info);
  35. void *sysbus_new(void);
  36. void sysbus_init_mmio(SysBusDevice *dev, target_phys_addr_t size,
  37. ram_addr_t iofunc);
  38. void sysbus_init_mmio_cb(SysBusDevice *dev, target_phys_addr_t size,
  39. mmio_mapfunc cb);
  40. void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
  41. void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
  42. void sysbus_init_ioports(SysBusDevice *dev, pio_addr_t ioport, pio_addr_t size);
  43. void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq);
  44. void sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr);
  45. /* Legacy helper function for creating devices. */
  46. DeviceState *sysbus_create_varargs(const char *name,
  47. target_phys_addr_t addr, ...);
  48. DeviceState *sysbus_try_create_varargs(const char *name,
  49. target_phys_addr_t addr, ...);
  50. static inline DeviceState *sysbus_create_simple(const char *name,
  51. target_phys_addr_t addr,
  52. qemu_irq irq)
  53. {
  54. return sysbus_create_varargs(name, addr, irq, NULL);
  55. }
  56. static inline DeviceState *sysbus_try_create_simple(const char *name,
  57. target_phys_addr_t addr,
  58. qemu_irq irq)
  59. {
  60. return sysbus_try_create_varargs(name, addr, irq, NULL);
  61. }
  62. #endif /* !HW_SYSBUS_H */