10d09e41aSPaolo Bonzini #ifndef HW_ISA_H 20d09e41aSPaolo Bonzini #define HW_ISA_H 30d09e41aSPaolo Bonzini 40d09e41aSPaolo Bonzini /* ISA bus */ 50d09e41aSPaolo Bonzini 60d09e41aSPaolo Bonzini #include "exec/memory.h" 7df43d49cSPaolo Bonzini #include "exec/ioport.h" 8a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 9db1015e9SEduardo Habkost #include "qom/object.h" 100d09e41aSPaolo Bonzini 110d09e41aSPaolo Bonzini #define ISA_NUM_IRQS 16 120d09e41aSPaolo Bonzini 130d09e41aSPaolo Bonzini #define TYPE_ISA_DEVICE "isa-device" 1497cfb5e4SPhilippe Mathieu-Daudé OBJECT_DECLARE_SIMPLE_TYPE(ISADevice, ISA_DEVICE) 150d09e41aSPaolo Bonzini 160d09e41aSPaolo Bonzini #define TYPE_ISA_BUS "ISA" 178063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(ISABus, ISA_BUS) 180d09e41aSPaolo Bonzini 195484f30bSHervé Poussineau #define TYPE_ISADMA "isa-dma" 205484f30bSHervé Poussineau 21db1015e9SEduardo Habkost typedef struct IsaDmaClass IsaDmaClass; 228110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(IsaDmaClass, ISADMA, 238110fa1dSEduardo Habkost TYPE_ISADMA) 245484f30bSHervé Poussineau #define ISADMA(obj) \ 255484f30bSHervé Poussineau INTERFACE_CHECK(IsaDma, (obj), TYPE_ISADMA) 265484f30bSHervé Poussineau 275484f30bSHervé Poussineau typedef enum { 285484f30bSHervé Poussineau ISADMA_TRANSFER_VERIFY, 295484f30bSHervé Poussineau ISADMA_TRANSFER_READ, 305484f30bSHervé Poussineau ISADMA_TRANSFER_WRITE, 315484f30bSHervé Poussineau ISADMA_TRANSFER_ILLEGAL, 325484f30bSHervé Poussineau } IsaDmaTransferMode; 335484f30bSHervé Poussineau 34bd36a618SMarkus Armbruster typedef int (*IsaDmaTransferHandler)(void *opaque, int nchan, int pos, 35bd36a618SMarkus Armbruster int size); 36bd36a618SMarkus Armbruster 37db1015e9SEduardo Habkost struct IsaDmaClass { 385484f30bSHervé Poussineau InterfaceClass parent; 395484f30bSHervé Poussineau 405484f30bSHervé Poussineau bool (*has_autoinitialization)(IsaDma *obj, int nchan); 415484f30bSHervé Poussineau int (*read_memory)(IsaDma *obj, int nchan, void *buf, int pos, int len); 425484f30bSHervé Poussineau int (*write_memory)(IsaDma *obj, int nchan, void *buf, int pos, int len); 435484f30bSHervé Poussineau void (*hold_DREQ)(IsaDma *obj, int nchan); 445484f30bSHervé Poussineau void (*release_DREQ)(IsaDma *obj, int nchan); 455484f30bSHervé Poussineau void (*schedule)(IsaDma *obj); 465484f30bSHervé Poussineau void (*register_channel)(IsaDma *obj, int nchan, 47bd36a618SMarkus Armbruster IsaDmaTransferHandler transfer_handler, 485484f30bSHervé Poussineau void *opaque); 49db1015e9SEduardo Habkost }; 505484f30bSHervé Poussineau 510d09e41aSPaolo Bonzini struct ISABus { 522ae0e48dSAndreas Färber /*< private >*/ 532ae0e48dSAndreas Färber BusState parent_obj; 542ae0e48dSAndreas Färber /*< public >*/ 552ae0e48dSAndreas Färber 56bb2ed009SHervé Poussineau MemoryRegion *address_space; 570d09e41aSPaolo Bonzini MemoryRegion *address_space_io; 587067887eSPhilippe Mathieu-Daudé qemu_irq *irqs_in; 595484f30bSHervé Poussineau IsaDma *dma[2]; 600d09e41aSPaolo Bonzini }; 610d09e41aSPaolo Bonzini 620d09e41aSPaolo Bonzini struct ISADevice { 634a17cc4fSAndreas Färber /*< private >*/ 644a17cc4fSAndreas Färber DeviceState parent_obj; 654a17cc4fSAndreas Färber /*< public >*/ 664a17cc4fSAndreas Färber 670d09e41aSPaolo Bonzini int ioport_id; 680d09e41aSPaolo Bonzini }; 690d09e41aSPaolo Bonzini 70bb2ed009SHervé Poussineau ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space, 71d10e5432SMarkus Armbruster MemoryRegion *address_space_io, Error **errp); 727067887eSPhilippe Mathieu-Daudé void isa_bus_register_input_irqs(ISABus *bus, qemu_irq *irqs_in); 735484f30bSHervé Poussineau void isa_bus_dma(ISABus *bus, IsaDma *dma8, IsaDma *dma16); 74dc8d6cf2SPhilippe Mathieu-Daudé IsaDma *isa_bus_get_dma(ISABus *bus, int nchan); 75*d2fbec57SPhilippe Mathieu-Daudé /** 76*d2fbec57SPhilippe Mathieu-Daudé * isa_bus_get_irq: Return input IRQ on ISA bus. 77*d2fbec57SPhilippe Mathieu-Daudé * @bus: the #ISABus to plug ISA devices on. 78*d2fbec57SPhilippe Mathieu-Daudé * @irqnum: the ISA IRQ number. 79*d2fbec57SPhilippe Mathieu-Daudé * 80*d2fbec57SPhilippe Mathieu-Daudé * Return IRQ @irqnum from the PIC associated on ISA @bus. 81*d2fbec57SPhilippe Mathieu-Daudé */ 82*d2fbec57SPhilippe Mathieu-Daudé qemu_irq isa_bus_get_irq(ISABus *bus, unsigned irqnum); 830fe9d901SMarkus Armbruster ISADevice *isa_new(const char *name); 840fe9d901SMarkus Armbruster ISADevice *isa_try_new(const char *name); 850fe9d901SMarkus Armbruster bool isa_realize_and_unref(ISADevice *dev, ISABus *bus, Error **errp); 860d09e41aSPaolo Bonzini ISADevice *isa_create_simple(ISABus *bus, const char *name); 870d09e41aSPaolo Bonzini 880d09e41aSPaolo Bonzini ISADevice *isa_vga_init(ISABus *bus); 890d09e41aSPaolo Bonzini 9088b58777SPhilippe Mathieu-Daudé qemu_irq isa_get_irq(ISADevice *dev, unsigned isairq); 9188b58777SPhilippe Mathieu-Daudé void isa_connect_gpio_out(ISADevice *isadev, int gpioirq, unsigned isairq); 9288b58777SPhilippe Mathieu-Daudé MemoryRegion *isa_address_space(ISADevice *dev); 9388b58777SPhilippe Mathieu-Daudé MemoryRegion *isa_address_space_io(ISADevice *dev); 9423c69bb8SPhilippe Mathieu-Daudé ISABus *isa_bus_from_device(ISADevice *dev); 9588b58777SPhilippe Mathieu-Daudé 960d09e41aSPaolo Bonzini /** 970d09e41aSPaolo Bonzini * isa_register_ioport: Install an I/O port region on the ISA bus. 980d09e41aSPaolo Bonzini * 990d09e41aSPaolo Bonzini * Register an I/O port region via memory_region_add_subregion 1000d09e41aSPaolo Bonzini * inside the ISA I/O address space. 1010d09e41aSPaolo Bonzini * 1020d09e41aSPaolo Bonzini * @dev: the ISADevice against which these are registered; may be NULL. 1030d09e41aSPaolo Bonzini * @io: the #MemoryRegion being registered. 1040d09e41aSPaolo Bonzini * @start: the base I/O port. 1050d09e41aSPaolo Bonzini */ 1060d09e41aSPaolo Bonzini void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start); 1070d09e41aSPaolo Bonzini 1080d09e41aSPaolo Bonzini /** 1090d09e41aSPaolo Bonzini * isa_register_portio_list: Initialize a set of ISA io ports 1100d09e41aSPaolo Bonzini * 1110d09e41aSPaolo Bonzini * Several ISA devices have many dis-joint I/O ports. Worse, these I/O 1120d09e41aSPaolo Bonzini * ports can be interleaved with I/O ports from other devices. This 1130d09e41aSPaolo Bonzini * function makes it easy to create multiple MemoryRegions for a single 1140d09e41aSPaolo Bonzini * device and use the legacy portio routines. 1150d09e41aSPaolo Bonzini * 1160d09e41aSPaolo Bonzini * @dev: the ISADevice against which these are registered; may be NULL. 117e305a165SMarc-André Lureau * @piolist: the PortioList associated with the io ports 1180d09e41aSPaolo Bonzini * @start: the base I/O port against which the portio->offset is applied. 1190d09e41aSPaolo Bonzini * @portio: the ports, sorted by offset. 120520902a6SHervé Poussineau * @opaque: passed into the portio callbacks. 1210d09e41aSPaolo Bonzini * @name: passed into memory_region_init_io. 1229405d87bSThomas Huth * 1239405d87bSThomas Huth * Returns: 0 on success, negative error code otherwise (e.g. if the 1249405d87bSThomas Huth * ISA bus is not available) 1250d09e41aSPaolo Bonzini */ 1269405d87bSThomas Huth int isa_register_portio_list(ISADevice *dev, 127e305a165SMarc-André Lureau PortioList *piolist, 128e305a165SMarc-André Lureau uint16_t start, 1290d09e41aSPaolo Bonzini const MemoryRegionPortio *portio, 1300d09e41aSPaolo Bonzini void *opaque, const char *name); 1310d09e41aSPaolo Bonzini 1320d09e41aSPaolo Bonzini #endif 133