xref: /openbmc/qemu/include/hw/isa/isa.h (revision 526947e496e4447d74b8d42415e2847481c5043d)
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