blueswir1 | 79383c9 | 2008-08-30 09:51:20 +0000 | [diff] [blame] | 1 | #ifndef HW_ISA_H |
| 2 | #define HW_ISA_H |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 3 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 4 | /* ISA bus */ |
| 5 | |
Isaku Yamahata | 3299397 | 2009-07-02 19:32:06 +0900 | [diff] [blame] | 6 | #include "ioport.h" |
Avi Kivity | af956ca | 2011-08-08 16:09:21 +0300 | [diff] [blame] | 7 | #include "memory.h" |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 8 | #include "qdev.h" |
| 9 | |
Jan Kiszka | b881fbe | 2011-10-07 09:19:35 +0200 | [diff] [blame] | 10 | #define ISA_NUM_IRQS 16 |
| 11 | |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 12 | typedef struct ISADevice ISADevice; |
Anthony Liguori | 8f04ee0 | 2011-12-04 11:52:49 -0600 | [diff] [blame] | 13 | |
| 14 | #define TYPE_ISA_DEVICE "isa-device" |
| 15 | #define ISA_DEVICE(obj) \ |
| 16 | OBJECT_CHECK(ISADevice, (obj), TYPE_ISA_DEVICE) |
| 17 | #define ISA_DEVICE_CLASS(klass) \ |
| 18 | OBJECT_CLASS_CHECK(ISADeviceClass, (klass), TYPE_ISA_DEVICE) |
| 19 | #define ISA_DEVICE_GET_CLASS(obj) \ |
| 20 | OBJECT_GET_CLASS(ISADeviceClass, (obj), TYPE_ISA_DEVICE) |
| 21 | |
| 22 | typedef struct ISADeviceClass { |
| 23 | DeviceClass parent_class; |
| 24 | int (*init)(ISADevice *dev); |
| 25 | } ISADeviceClass; |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 26 | |
Hervé Poussineau | d1a1be1 | 2011-12-15 22:09:52 +0100 | [diff] [blame] | 27 | struct ISABus { |
| 28 | BusState qbus; |
| 29 | MemoryRegion *address_space_io; |
| 30 | qemu_irq *irqs; |
| 31 | }; |
| 32 | |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 33 | struct ISADevice { |
| 34 | DeviceState qdev; |
Gerd Hoffmann | 2091ba2 | 2009-08-14 11:36:14 +0200 | [diff] [blame] | 35 | uint32_t isairq[2]; |
Richard Henderson | 78e2059 | 2011-08-10 15:28:12 -0700 | [diff] [blame] | 36 | int nirqs; |
Richard Henderson | ebf47c2 | 2011-08-15 11:59:09 -0700 | [diff] [blame] | 37 | int ioport_id; |
Gerd Hoffmann | f915a11 | 2009-07-31 12:30:14 +0200 | [diff] [blame] | 38 | }; |
| 39 | |
Richard Henderson | c2d0d01 | 2011-08-10 15:28:11 -0700 | [diff] [blame] | 40 | ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io); |
Hervé Poussineau | 48a18b3 | 2011-12-15 22:09:51 +0100 | [diff] [blame] | 41 | void isa_bus_irqs(ISABus *bus, qemu_irq *irqs); |
| 42 | qemu_irq isa_get_irq(ISADevice *dev, int isairq); |
Gerd Hoffmann | 2e15e23 | 2009-09-10 11:43:27 +0200 | [diff] [blame] | 43 | void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq); |
Avi Kivity | c839ade | 2011-08-15 17:17:35 +0300 | [diff] [blame] | 44 | MemoryRegion *isa_address_space(ISADevice *dev); |
Hervé Poussineau | 48a18b3 | 2011-12-15 22:09:51 +0100 | [diff] [blame] | 45 | ISADevice *isa_create(ISABus *bus, const char *name); |
| 46 | ISADevice *isa_try_create(ISABus *bus, const char *name); |
| 47 | ISADevice *isa_create_simple(ISABus *bus, const char *name); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 48 | |
Avi Kivity | d750073 | 2011-09-26 14:52:44 +0300 | [diff] [blame] | 49 | /** |
| 50 | * isa_register_ioport: Install an I/O port region on the ISA bus. |
| 51 | * |
| 52 | * Register an I/O port region via memory_region_add_subregion |
| 53 | * inside the ISA I/O address space. |
| 54 | * |
| 55 | * @dev: the ISADevice against which these are registered; may be NULL. |
| 56 | * @io: the #MemoryRegion being registered. |
| 57 | * @start: the base I/O port. |
| 58 | */ |
| 59 | void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start); |
| 60 | |
| 61 | /** |
| 62 | * isa_register_portio_list: Initialize a set of ISA io ports |
| 63 | * |
| 64 | * Several ISA devices have many dis-joint I/O ports. Worse, these I/O |
| 65 | * ports can be interleaved with I/O ports from other devices. This |
| 66 | * function makes it easy to create multiple MemoryRegions for a single |
| 67 | * device and use the legacy portio routines. |
| 68 | * |
| 69 | * @dev: the ISADevice against which these are registered; may be NULL. |
| 70 | * @start: the base I/O port against which the portio->offset is applied. |
| 71 | * @portio: the ports, sorted by offset. |
| 72 | * @opaque: passed into the old_portio callbacks. |
| 73 | * @name: passed into memory_region_init_io. |
| 74 | */ |
| 75 | void isa_register_portio_list(ISADevice *dev, uint16_t start, |
| 76 | const MemoryRegionPortio *portio, |
| 77 | void *opaque, const char *name); |
| 78 | |
Anthony Liguori | c227f09 | 2009-10-01 16:12:16 -0500 | [diff] [blame] | 79 | extern target_phys_addr_t isa_mem_base; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 80 | |
Avi Kivity | af956ca | 2011-08-08 16:09:21 +0300 | [diff] [blame] | 81 | void isa_mmio_setup(MemoryRegion *mr, target_phys_addr_t size); |
Alexander Graf | 968d683 | 2010-12-08 12:05:49 +0100 | [diff] [blame] | 82 | void isa_mmio_init(target_phys_addr_t base, target_phys_addr_t size); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 83 | |
| 84 | /* dma.c */ |
| 85 | int DMA_get_channel_mode (int nchan); |
| 86 | int DMA_read_memory (int nchan, void *buf, int pos, int size); |
| 87 | int DMA_write_memory (int nchan, void *buf, int pos, int size); |
| 88 | void DMA_hold_DREQ (int nchan); |
| 89 | void DMA_release_DREQ (int nchan); |
| 90 | void DMA_schedule(int nchan); |
Blue Swirl | 4556bd8 | 2010-05-22 08:00:52 +0000 | [diff] [blame] | 91 | void DMA_init(int high_page_enable, qemu_irq *cpu_request_exit); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 92 | void DMA_register_channel (int nchan, |
| 93 | DMA_transfer_handler transfer_handler, |
| 94 | void *opaque); |
blueswir1 | 79383c9 | 2008-08-30 09:51:20 +0000 | [diff] [blame] | 95 | #endif |