Keep track of ISA ports ISA device is using in qdev.
Store all io ports used by device in ISADevice structure. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
		
							parent
							
								
									21150814d9
								
							
						
					
					
						commit
						dee41d58ef
					
				|  | @ -645,6 +645,7 @@ static int cs4231a_initfn (ISADevice *dev) | |||
|     isa_init_irq (dev, &s->pic, s->irq); | ||||
| 
 | ||||
|     for (i = 0; i < 4; i++) { | ||||
|         isa_init_ioport(dev, i); | ||||
|         register_ioport_write (s->port + i, 1, 1, cs_write, s); | ||||
|         register_ioport_read (s->port + i, 1, 1, cs_read, s); | ||||
|     } | ||||
|  |  | |||
							
								
								
									
										3
									
								
								hw/fdc.c
								
								
								
								
							
							
						
						
									
										3
									
								
								hw/fdc.c
								
								
								
								
							|  | @ -1983,6 +1983,9 @@ static int isabus_fdc_init1(ISADevice *dev) | |||
|                           &fdctrl_write_port, fdctrl); | ||||
|     register_ioport_write(iobase + 0x07, 1, 1, | ||||
|                           &fdctrl_write_port, fdctrl); | ||||
|     isa_init_ioport_range(dev, iobase, 6); | ||||
|     isa_init_ioport(dev, iobase + 7); | ||||
| 
 | ||||
|     isa_init_irq(&isa->busdev, &fdctrl->irq, isairq); | ||||
|     fdctrl->dma_chann = dma_chann; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										4
									
								
								hw/gus.c
								
								
								
								
							
							
						
						
									
										4
									
								
								hw/gus.c
								
								
								
								
							|  | @ -264,20 +264,24 @@ static int gus_initfn (ISADevice *dev) | |||
| 
 | ||||
|     register_ioport_write (s->port, 1, 1, gus_writeb, s); | ||||
|     register_ioport_write (s->port, 1, 2, gus_writew, s); | ||||
|     isa_init_ioport_range(dev, s->port, 2); | ||||
| 
 | ||||
|     register_ioport_read ((s->port + 0x100) & 0xf00, 1, 1, gus_readb, s); | ||||
|     register_ioport_read ((s->port + 0x100) & 0xf00, 1, 2, gus_readw, s); | ||||
|     isa_init_ioport_range(dev, (s->port + 0x100) & 0xf00, 2); | ||||
| 
 | ||||
|     register_ioport_write (s->port + 6, 10, 1, gus_writeb, s); | ||||
|     register_ioport_write (s->port + 6, 10, 2, gus_writew, s); | ||||
|     register_ioport_read (s->port + 6, 10, 1, gus_readb, s); | ||||
|     register_ioport_read (s->port + 6, 10, 2, gus_readw, s); | ||||
|     isa_init_ioport_range(dev, s->port + 6, 10); | ||||
| 
 | ||||
| 
 | ||||
|     register_ioport_write (s->port + 0x100, 8, 1, gus_writeb, s); | ||||
|     register_ioport_write (s->port + 0x100, 8, 2, gus_writew, s); | ||||
|     register_ioport_read (s->port + 0x100, 8, 1, gus_readb, s); | ||||
|     register_ioport_read (s->port + 0x100, 8, 2, gus_readw, s); | ||||
|     isa_init_ioport_range(dev, s->port + 0x100, 8); | ||||
| 
 | ||||
|     DMA_register_channel (s->emu.gusdma, GUS_read_DMA, s); | ||||
|     s->emu.himemaddr = s->himem; | ||||
|  |  | |||
|  | @ -70,6 +70,8 @@ static int isa_ide_initfn(ISADevice *dev) | |||
|     ide_bus_new(&s->bus, &s->dev.qdev); | ||||
|     ide_init_ioport(&s->bus, s->iobase, s->iobase2); | ||||
|     isa_init_irq(dev, &s->irq, s->isairq); | ||||
|     isa_init_ioport_range(dev, s->iobase, 8); | ||||
|     isa_init_ioport(dev, s->iobase2); | ||||
|     ide_init2(&s->bus, s->irq); | ||||
|     vmstate_register(&dev->qdev, 0, &vmstate_ide_isa, s); | ||||
|     return 0; | ||||
|  |  | |||
							
								
								
									
										25
									
								
								hw/isa-bus.c
								
								
								
								
							
							
						
						
									
										25
									
								
								hw/isa-bus.c
								
								
								
								
							|  | @ -89,6 +89,31 @@ void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq) | |||
|     dev->nirqs++; | ||||
| } | ||||
| 
 | ||||
| static void isa_init_ioport_one(ISADevice *dev, uint16_t ioport) | ||||
| { | ||||
|     assert(dev->nioports < ARRAY_SIZE(dev->ioports)); | ||||
|     dev->ioports[dev->nioports++] = ioport; | ||||
| } | ||||
| 
 | ||||
| static int isa_cmp_ports(const void *p1, const void *p2) | ||||
| { | ||||
|     return *(uint16_t*)p1 - *(uint16_t*)p2; | ||||
| } | ||||
| 
 | ||||
| void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length) | ||||
| { | ||||
|     int i; | ||||
|     for (i = start; i < start + length; i++) { | ||||
|         isa_init_ioport_one(dev, i); | ||||
|     } | ||||
|     qsort(dev->ioports, dev->nioports, sizeof(dev->ioports[0]), isa_cmp_ports); | ||||
| } | ||||
| 
 | ||||
| void isa_init_ioport(ISADevice *dev, uint16_t ioport) | ||||
| { | ||||
|     isa_init_ioport_range(dev, ioport, 1); | ||||
| } | ||||
| 
 | ||||
| static int isa_qdev_init(DeviceState *qdev, DeviceInfo *base) | ||||
| { | ||||
|     ISADevice *dev = DO_UPCAST(ISADevice, qdev, qdev); | ||||
|  |  | |||
							
								
								
									
										4
									
								
								hw/isa.h
								
								
								
								
							
							
						
						
									
										4
									
								
								hw/isa.h
								
								
								
								
							|  | @ -14,6 +14,8 @@ struct ISADevice { | |||
|     DeviceState qdev; | ||||
|     uint32_t isairq[2]; | ||||
|     int nirqs; | ||||
|     uint16_t ioports[32]; | ||||
|     int nioports; | ||||
| }; | ||||
| 
 | ||||
| typedef int (*isa_qdev_initfn)(ISADevice *dev); | ||||
|  | @ -26,6 +28,8 @@ ISABus *isa_bus_new(DeviceState *dev); | |||
| void isa_bus_irqs(qemu_irq *irqs); | ||||
| qemu_irq isa_reserve_irq(int isairq); | ||||
| void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq); | ||||
| void isa_init_ioport(ISADevice *dev, uint16_t ioport); | ||||
| void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length); | ||||
| void isa_qdev_register(ISADeviceInfo *info); | ||||
| ISADevice *isa_create(const char *name); | ||||
| ISADevice *isa_create_simple(const char *name); | ||||
|  |  | |||
|  | @ -680,6 +680,7 @@ M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type) | |||
|     if (io_base != 0) { | ||||
|         register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s); | ||||
|         register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s); | ||||
|         isa_init_ioport_range(dev, io_base, 4); | ||||
|     } | ||||
| 
 | ||||
|     return s; | ||||
|  |  | |||
|  | @ -605,6 +605,7 @@ static int rtc_initfn(ISADevice *dev) | |||
| 
 | ||||
|     register_ioport_write(base, 2, 1, cmos_ioport_write, s); | ||||
|     register_ioport_read(base, 2, 1, cmos_ioport_read, s); | ||||
|     isa_init_ioport_range(dev, base, 2); | ||||
| 
 | ||||
|     qdev_set_legacy_instance_id(&dev->qdev, base, 2); | ||||
|     qemu_register_reset(rtc_reset, s); | ||||
|  |  | |||
|  | @ -68,14 +68,17 @@ static int isa_ne2000_initfn(ISADevice *dev) | |||
| 
 | ||||
|     register_ioport_write(isa->iobase, 16, 1, ne2000_ioport_write, s); | ||||
|     register_ioport_read(isa->iobase, 16, 1, ne2000_ioport_read, s); | ||||
|     isa_init_ioport_range(dev, isa->iobase, 16); | ||||
| 
 | ||||
|     register_ioport_write(isa->iobase + 0x10, 1, 1, ne2000_asic_ioport_write, s); | ||||
|     register_ioport_read(isa->iobase + 0x10, 1, 1, ne2000_asic_ioport_read, s); | ||||
|     register_ioport_write(isa->iobase + 0x10, 2, 2, ne2000_asic_ioport_write, s); | ||||
|     register_ioport_read(isa->iobase + 0x10, 2, 2, ne2000_asic_ioport_read, s); | ||||
|     isa_init_ioport_range(dev, isa->iobase + 0x10, 2); | ||||
| 
 | ||||
|     register_ioport_write(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_write, s); | ||||
|     register_ioport_read(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_read, s); | ||||
|     isa_init_ioport(dev, isa->iobase + 0x1f); | ||||
| 
 | ||||
|     isa_init_irq(dev, &s->irq, isa->isairq); | ||||
| 
 | ||||
|  |  | |||
|  | @ -481,16 +481,21 @@ static int parallel_isa_initfn(ISADevice *dev) | |||
|     if (s->hw_driver) { | ||||
|         register_ioport_write(base, 8, 1, parallel_ioport_write_hw, s); | ||||
|         register_ioport_read(base, 8, 1, parallel_ioport_read_hw, s); | ||||
|         isa_init_ioport_range(dev, base, 8); | ||||
| 
 | ||||
|         register_ioport_write(base+4, 1, 2, parallel_ioport_eppdata_write_hw2, s); | ||||
|         register_ioport_read(base+4, 1, 2, parallel_ioport_eppdata_read_hw2, s); | ||||
|         register_ioport_write(base+4, 1, 4, parallel_ioport_eppdata_write_hw4, s); | ||||
|         register_ioport_read(base+4, 1, 4, parallel_ioport_eppdata_read_hw4, s); | ||||
|         isa_init_ioport(dev, base+4); | ||||
|         register_ioport_write(base+0x400, 8, 1, parallel_ioport_ecp_write, s); | ||||
|         register_ioport_read(base+0x400, 8, 1, parallel_ioport_ecp_read, s); | ||||
|         isa_init_ioport_range(dev, base+0x400, 8); | ||||
|     } | ||||
|     else { | ||||
|         register_ioport_write(base, 8, 1, parallel_ioport_write_sw, s); | ||||
|         register_ioport_read(base, 8, 1, parallel_ioport_read_sw, s); | ||||
|         isa_init_ioport_range(dev, base, 8); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -485,10 +485,13 @@ static int i8042_initfn(ISADevice *dev) | |||
| 
 | ||||
|     register_ioport_read(0x60, 1, 1, kbd_read_data, s); | ||||
|     register_ioport_write(0x60, 1, 1, kbd_write_data, s); | ||||
|     isa_init_ioport(dev, 0x60); | ||||
|     register_ioport_read(0x64, 1, 1, kbd_read_status, s); | ||||
|     register_ioport_write(0x64, 1, 1, kbd_write_command, s); | ||||
|     isa_init_ioport(dev, 0x64); | ||||
|     register_ioport_read(0x92, 1, 1, ioport92_read, s); | ||||
|     register_ioport_write(0x92, 1, 1, ioport92_write, s); | ||||
|     isa_init_ioport(dev, 0x92); | ||||
| 
 | ||||
|     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); | ||||
|     s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); | ||||
|  |  | |||
|  | @ -1368,16 +1368,20 @@ static int sb16_initfn (ISADevice *dev) | |||
| 
 | ||||
|     for (i = 0; i < ARRAY_SIZE (dsp_write_ports); i++) { | ||||
|         register_ioport_write (s->port + dsp_write_ports[i], 1, 1, dsp_write, s); | ||||
|         isa_init_ioport(dev, s->port + dsp_write_ports[i]); | ||||
|     } | ||||
| 
 | ||||
|     for (i = 0; i < ARRAY_SIZE (dsp_read_ports); i++) { | ||||
|         register_ioport_read (s->port + dsp_read_ports[i], 1, 1, dsp_read, s); | ||||
|         isa_init_ioport(dev, s->port + dsp_read_ports[i]); | ||||
|     } | ||||
| 
 | ||||
|     register_ioport_write (s->port + 0x4, 1, 1, mixer_write_indexb, s); | ||||
|     register_ioport_write (s->port + 0x4, 1, 2, mixer_write_indexw, s); | ||||
|     isa_init_ioport(dev, s->port + 0x4); | ||||
|     register_ioport_read (s->port + 0x5, 1, 1, mixer_read, s); | ||||
|     register_ioport_write (s->port + 0x5, 1, 1, mixer_write_datab, s); | ||||
|     isa_init_ioport(dev, s->port + 0x5); | ||||
| 
 | ||||
|     DMA_register_channel (s->hdma, SB_read_DMA, s); | ||||
|     DMA_register_channel (s->dma, SB_read_DMA, s); | ||||
|  |  | |||
|  | @ -778,6 +778,7 @@ static int serial_isa_initfn(ISADevice *dev) | |||
| 
 | ||||
|     register_ioport_write(isa->iobase, 8, 1, serial_ioport_write, s); | ||||
|     register_ioport_read(isa->iobase, 8, 1, serial_ioport_read, s); | ||||
|     isa_init_ioport_range(dev, isa->iobase, 8); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Gleb Natapov
						Gleb Natapov