isa bus irq changes and fixes.
PATCH 1/3 isa bus irq changes and fixes.
Changes:
(1) make isa-bus maintain isa irqs, complain when allocating already taken irqs.
(2) note that (1) works only for isa devices converted to qdev already (floppy and ps2/kbd/mouse right now), so more work is needed to make this really useful.
(3) split floppy init into isa and sysbus versions.
(4) add sysbus->isa bridge & fix -M isapc breakage.
--- hw/fdc.c | 47 ++++++++++++++++++++++--------------- hw/fdc.h | 9 ++++-- hw/isa-bus.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++----- hw/isa.h | 4 ++- hw/mips_jazz.c | 2 +- hw/mips_malta.c | 2 +- hw/pc.c | 8 ++++-- hw/ppc_prep.c | 2 +- hw/sun4u.c | 2 +- 9 files changed, 109 insertions(+), 37 deletions(-)
hw/fdc.c +28 -19
@@ -1871,33 +1871,42 @@ static void fdctrl_connect_drives(fdctrl_t *fdctrl, BlockDriverState **fds) } } -fdctrl_t *fdctrl_init (qemu_irq irq,int dma_chann,int mem_mapped, -target_phys_addr_t io_base, -BlockDriverState **fds) +fdctrl_t *fdctrl_init_isa (int isairq,int dma_chann, +uint32_t io_base, +BlockDriverState **fds) {fdctrl_t *fdctrl; +ISADevice *dev; -if (mem_mapped) { -DeviceState *dev; -fdctrl_sysbus_t *sys; + dev =isa_create_simple ("isa-fdc" , io_base,0 ); + fdctrl = &(DO_UPCAST (fdctrl_isabus_t, busdev, dev)->state); +isa_connect_irq (dev,0 , isairq); - dev =qdev_create (NULL ,"sysbus-fdc" ); -qdev_init (dev); - sys =DO_UPCAST (fdctrl_sysbus_t, busdev.qdev, dev); - fdctrl = &sys->state; -sysbus_connect_irq (&sys->busdev,0 , irq); -sysbus_mmio_map (&sys->busdev,0 , io_base); - }else { -ISADevice *dev; + fdctrl->dma_chann = dma_chann; +DMA_register_channel (dma_chann, &fdctrl_transfer_handler, fdctrl); - dev =isa_create_simple ("isa-fdc" , io_base,0 ); - fdctrl = &(DO_UPCAST (fdctrl_isabus_t, busdev, dev)->state); -isa_connect_irq (dev,0 , irq); - } +fdctrl_connect_drives (fdctrl, fds); + +return fdctrl; +} + +fdctrl_t *fdctrl_init_sysbus (qemu_irq irq,int dma_chann, +target_phys_addr_t mmio_base, +BlockDriverState **fds) +{ +fdctrl_t *fdctrl; +DeviceState *dev; +fdctrl_sysbus_t *sys; + + dev =qdev_create (NULL ,"sysbus-fdc" ); +qdev_init (dev); + sys =DO_UPCAST (fdctrl_sysbus_t, busdev.qdev, dev); + fdctrl = &sys->state; +sysbus_connect_irq (&sys->busdev,0 , irq); +sysbus_mmio_map (&sys->busdev,0 , mmio_base); fdctrl->dma_chann = dma_chann;DMA_register_channel (dma_chann, &fdctrl_transfer_handler, fdctrl); -fdctrl_connect_drives (fdctrl, fds);return fdctrl;
hw/fdc.h +6 -3
@@ -3,9 +3,12 @@typedef struct fdctrl_t fdctrl_t ; -fdctrl_t *fdctrl_init (qemu_irq irq,int dma_chann,int mem_mapped, -target_phys_addr_t io_base, -BlockDriverState **fds); +fdctrl_t *fdctrl_init_isa (int isairq,int dma_chann, +uint32_t io_base, +BlockDriverState **fds); +fdctrl_t *fdctrl_init_sysbus (qemu_irq irq,int dma_chann, +target_phys_addr_t mmio_base, +BlockDriverState **fds);fdctrl_t *sun4m_fdctrl_init (qemu_irq irq,target_phys_addr_t io_base,BlockDriverState **fds,qemu_irq *fdc_tc);int fdctrl_get_drive_type (fdctrl_t *fdctrl,int drive_num);
hw/isa-bus.c +63 -7
105 lines not on this page · raw message
hw/isa.h +3 -1
@@ -13,6 +13,7 @@ typedef struct ISADeviceInfo ISADeviceInfo;struct ISADevice {DeviceState qdev;uint32_t iobase[2 ]; +uint32_t isairq[2 ];qemu_irq *irqs[2 ];int nirqs; };
@@ -24,7 +25,8 @@ struct ISADeviceInfo { };ISABus *isa_bus_new (DeviceState *dev); -void isa_connect_irq (ISADevice *dev,int n,qemu_irq irq); +void isa_bus_irqs (qemu_irq *irqs); +void isa_connect_irq (ISADevice *dev,int devirq,int isairq);void isa_init_irq (ISADevice *dev,qemu_irq *p);void isa_qdev_register (ISADeviceInfo *info);ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2);
hw/mips_jazz.c +1 -1
@@ -238,7 +238,7 @@ void mips_jazz_init (ram_addr_t ram_size,DriveInfo *dinfo =drive_get (IF_FLOPPY ,0 , n); fds[n] = dinfo ? dinfo->bdrv :NULL ; } -fdctrl_init (rc4030[1 ],0 ,1 ,0x80003000 , fds); +fdctrl_init_sysbus (rc4030[1 ],0 ,0x80003000 , fds);/* Real time clock */ rtc_init (0x70 , i8259[8 ],1980 );
hw/mips_malta.c +1 -1
@@ -929,7 +929,7 @@ void mips_malta_init (ram_addr_t ram_size, dinfo =drive_get (IF_FLOPPY ,0 , i); fd[i] = dinfo ? dinfo->bdrv :NULL ; } - floppy_controller =fdctrl_init (i8259[6 ],2 ,0 ,0x3f0 , fd); + floppy_controller =fdctrl_init_isa (6 ,2 ,0x3f0 , fd);/* Sound card */ #ifdef HAS_AUDIO
hw/pc.c +5 -3
@@ -1272,7 +1272,9 @@ static void pc_init1(ram_addr_t ram_size, piix3_devfn =piix3_init (pci_bus,-1 ); }else { pci_bus =NULL ; +isa_bus_new (NULL ); } +isa_bus_irqs (i8259);/* init basic PC hardware */ register_ioport_write (0x80 ,1 ,1 , ioport80_write,NULL );
@@ -1364,8 +1366,8 @@ static void pc_init1(ram_addr_t ram_size, } isa_dev =isa_create_simple ("i8042" ,0x60 ,0x64 ); -isa_connect_irq (isa_dev,0 , i8259[1 ]); -isa_connect_irq (isa_dev,1 , i8259[12 ]); +isa_connect_irq (isa_dev,0 ,1 ); +isa_connect_irq (isa_dev,1 ,12 );DMA_init (0 );#ifdef HAS_AUDIO audio_init (pci_enabled ? pci_bus :NULL , i8259);
@@ -1375,7 +1377,7 @@ static void pc_init1(ram_addr_t ram_size, dinfo =drive_get (IF_FLOPPY ,0 , i); fd[i] = dinfo ? dinfo->bdrv :NULL ; } - floppy_controller =fdctrl_init (i8259[6 ],2 ,0 ,0x3f0 , fd); + floppy_controller =fdctrl_init_isa (6 ,2 ,0x3f0 , fd);cmos_init (below_4g_mem_size, above_4g_mem_size, boot_device, hd);
hw/ppc_prep.c +1 -1
@@ -708,7 +708,7 @@ static void ppc_prep_init (ram_addr_t ram_size, dinfo =drive_get (IF_FLOPPY ,0 , i); fd[i] = dinfo ? dinfo->bdrv :NULL ; } -fdctrl_init (i8259[6 ],2 ,0 ,0x3f0 , fd); +fdctrl_init_isa (6 ,2 ,0x3f0 , fd);/* Register speaker port */ register_ioport_read (0x61 ,1 ,1 , speaker_ioport_read,NULL );
hw/sun4u.c +1 -1
@@ -618,7 +618,7 @@ static void sun4uv_init(ram_addr_t RAM_size, dinfo =drive_get (IF_FLOPPY ,0 , i); fd[i] = dinfo ? dinfo->bdrv :NULL ; } - floppy_controller =fdctrl_init (NULL /*6*/ ,2 ,0 ,0x3f0 , fd); + floppy_controller =fdctrl_init_isa (6 ,2 ,0x3f0 , fd); nvram =m48t59_init (NULL /*8*/ ,0 ,0x0074 ,NVRAM_SIZE ,59 ); initrd_size =0 ;
Signature · 1 line
1.6.2.5
PATCH 2/3 Add isa_reserve_irq().
From: Jes Sorensen <[email protected]>
Introduce isa_reserve_irq() which marks an irq reserved and returns the appropriate qemu_irq entry from the i8259 table.
isa_reserve_irq() is a temporary interface to be used to allocate ISA IRQs for devices which have not yet been converted to qdev, and for special cases which are not suited for qdev conversions, such as the 'ferr'.
This patch goes on top of Gerd Hoffmann's which makes isa-bus.c own the ISA irq table.
[ added isa-bus.o to some targets to fix build failures -- kraxel ]
--- Makefile.target | 4 ++-- hw/cs4231a.c | 12 +++++------- hw/ide.c | 7 +++++-- hw/isa-bus.c | 21 +++++++++++++++++++++ hw/isa.h | 1 + hw/pc.c | 23 +++++++++++++---------- hw/sb16.c | 25 ++++++++++++------------- 7 files changed, 59 insertions(+), 34 deletions(-)
Makefile.target +2 -2
@@ -261,7 +261,7 @@ obj-arm-y += arm-semi.o obj-arm-y += pxa2xx.o pxa2xx_pic.o pxa2xx_gpio.o pxa2xx_timer.o pxa2xx_dma.o obj-arm-y += pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o obj-arm-y += pflash_cfi01.o gumstix.o -obj-arm-y += zaurus.o ide.o serial.o spitz.o tosa.o tc6393xb.o +obj-arm-y += zaurus.o ide.o isa-bus.o serial.o spitz.o tosa.o tc6393xb.o obj-arm-y += omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o obj-arm-y += omap2.o omap_dss.o soc_dma.o obj-arm-y += omap_sx1.o palm.o tsc210x.o
@@ -275,7 +275,7 @@ obj-arm-y += syborg_virtio.o obj-sh4-y = shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o obj-sh4-y += sh_timer.o sh_serial.o sh_intc.o sh_pci.o sm501.o serial.o -obj-sh4-y += ide.o +obj-sh4-y += ide.o isa-bus.o obj-m68k-y = an5206.o mcf5206.o mcf_uart.o mcf_intc.o mcf5208.o mcf_fec.o obj-m68k-y += m68k-semi.o dummy_m68k.o
hw/cs4231a.c +5 -7
@@ -60,10 +60,9 @@ static struct { typedef struct CSState { QEMUSoundCard card; - qemu_irq *pic; + qemu_irq pic; uint32_t regs[CS_REGS]; uint8_t dregs[CS_DREGS]; - int irq; int dma; int port; int shift;
@@ -483,7 +482,7 @@ IO_WRITE_PROTO (cs_write)case Alternate_Feature_Status:if ((s->dregs[iaddr] &PI ) && !(val &PI )) {/* XXX: TI CI */ -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic); s->regs[Status] &= ~INT ; } s->dregs[iaddr] = val;
@@ -503,7 +502,7 @@ IO_WRITE_PROTO (cs_write)case Status:if (s->regs[Status] &INT ) { -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic); } s->regs[Status] &= ~INT ; s->dregs[Alternate_Feature_Status] &= ~(PI |CI |TI );
@@ -588,7 +587,7 @@ static int cs_dma_read (void *opaque, int nchan, int dma_pos, int dma_len) s->regs[Status] |=INT ; s->dregs[Alternate_Feature_Status] |=PI ; s->transferred =0 ; -qemu_irq_raise (s->pic[s->irq]); +qemu_irq_raise (s->pic); }else { s->transferred += written;
@@ -643,8 +642,7 @@ int cs4231a_init (qemu_irq *pic) s =qemu_mallocz (sizeof (*s)); - s->pic = pic; - s->irq = conf.irq; + s->pic =isa_reserve_irq (conf.irq); s->dma = conf.dma; s->port = conf.port;
hw/ide.c +5 -2
@@ -3415,8 +3415,8 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn,pci_register_bar ((PCIDevice *)d,4 ,0x10 ,PCI_ADDRESS_SPACE_IO , bmdma_map); -ide_init2 (&d->ide_if[0 ], hd_table[0 ], hd_table[1 ], pic[14 ]); -ide_init2 (&d->ide_if[2 ], hd_table[2 ], hd_table[3 ], pic[15 ]); +ide_init2 (&d->ide_if[0 ], hd_table[0 ], hd_table[1 ],isa_reserve_irq (14 )); +ide_init2 (&d->ide_if[2 ], hd_table[2 ], hd_table[3 ],isa_reserve_irq (15 ));ide_init_ioport (&d->ide_if[0 ],0x1f0 ,0x3f6 );ide_init_ioport (&d->ide_if[2 ],0x170 ,0x376 );
@@ -3455,6 +3455,9 @@ void pci_piix4_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn,pci_register_bar ((PCIDevice *)d,4 ,0x10 ,PCI_ADDRESS_SPACE_IO , bmdma_map); +/* +* These should call isa_reserve_irq() instead when MIPS supports it +*/ ide_init2 (&d->ide_if[0 ], hd_table[0 ], hd_table[1 ], pic[14 ]);ide_init2 (&d->ide_if[2 ], hd_table[2 ], hd_table[3 ], pic[15 ]);ide_init_ioport (&d->ide_if[0 ],0x1f0 ,0x3f6 );
hw/isa-bus.c +21 -0
@@ -85,6 +85,27 @@ void isa_connect_irq(ISADevice *dev, int devnr, int isairq) } } +/* +* isa_reserve_irq() reserves the ISA irq and returns the corresponding +* qemu_irq entry for the i8259. +* +* This function is only for special cases such as the 'ferr', and +* temporary use for normal devices until they are converted to qdev. +*/ +qemu_irq isa_reserve_irq (int isairq) +{ +if (isairq <0 || isairq >15 ) { +fprintf (stderr,"isa irq %d invalid\n" , isairq); +exit (1 ); + } +if (isabus->assigned & (1 << isairq)) { +fprintf (stderr,"isa irq %d already assigned\n" , isairq); +exit (1 ); + } + isabus->assigned |= (1 << isairq); +return isabus->irqs[isairq]; +} +void isa_init_irq (ISADevice *dev,qemu_irq *p) {assert (dev->nirqs <ARRAY_SIZE (dev->irqs));
hw/isa.h +1 -0
@@ -27,6 +27,7 @@ struct ISADeviceInfo {ISABus *isa_bus_new (DeviceState *dev);void isa_bus_irqs (qemu_irq *irqs);void isa_connect_irq (ISADevice *dev,int devirq,int isairq); +qemu_irq isa_reserve_irq (int isairq);void isa_init_irq (ISADevice *dev,qemu_irq *p);void isa_qdev_register (ISADeviceInfo *info);ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2);
hw/pc.c +13 -10
@@ -1037,13 +1037,14 @@ static void audio_init (PCIBus *pci_bus, qemu_irq *pic) }#endif -static void pc_init_ne2k_isa (NICInfo *nd,qemu_irq *pic) +static void pc_init_ne2k_isa (NICInfo *nd) {static int nb_ne2k =0 ;if (nb_ne2k ==NE2000_NB_MAX )return ; -isa_ne2000_init (ne2000_io[nb_ne2k], pic[ne2000_irq[nb_ne2k]], nd); +isa_ne2000_init (ne2000_io[nb_ne2k], +isa_reserve_irq (ne2000_irq[nb_ne2k]), nd); nb_ne2k++; }
@@ -1265,7 +1266,6 @@ static void pc_init1(ram_addr_t ram_size, cpu_irq =qemu_allocate_irqs (pic_irq_request,NULL ,1 ); i8259 =i8259_init (cpu_irq[0 ]); - ferr_irq = i8259[13 ];if (pci_enabled) { pci_bus =i440fx_init (&i440fx_state, i8259);
@@ -1275,6 +1275,7 @@ static void pc_init1(ram_addr_t ram_size,isa_bus_new (NULL ); }isa_bus_irqs (i8259); + ferr_irq =isa_reserve_irq (13 );/* init basic PC hardware */ register_ioport_write (0x80 ,1 ,1 , ioport80_write,NULL );
@@ -1300,7 +1301,7 @@ static void pc_init1(ram_addr_t ram_size, } } - rtc_state =rtc_init (0x70 , i8259[8 ],2000 ); + rtc_state =rtc_init (0x70 ,isa_reserve_irq (8 ),2000 );qemu_register_boot_set (pc_boot_set, rtc_state);
@@ -1310,7 +1311,7 @@ static void pc_init1(ram_addr_t ram_size,if (pci_enabled) { ioapic =ioapic_init (); } - pit =pit_init (0x40 , i8259[0 ]); + pit =pit_init (0x40 ,isa_reserve_irq (0 ));pcspk_init (pit);if (!no_hpet) {hpet_init (i8259);
@@ -1321,14 +1322,14 @@ static void pc_init1(ram_addr_t ram_size,for (i =0 ; i <MAX_SERIAL_PORTS ; i++) {if (serial_hds[i]) { -serial_init (serial_io[i], i8259[serial_irq[i]],115200 , +serial_init (serial_io[i],isa_reserve_irq (serial_irq[i]),115200 , serial_hds[i]); } }for (i =0 ; i <MAX_PARALLEL_PORTS ; i++) {if (parallel_hds[i]) { -parallel_init (parallel_io[i], i8259[parallel_irq[i]], +parallel_init (parallel_io[i],isa_reserve_irq (parallel_irq[i]), parallel_hds[i]); } }
@@ -1339,7 +1340,7 @@ static void pc_init1(ram_addr_t ram_size,NICInfo *nd = &nd_table[i];if (!pci_enabled || (nd->model &&strcmp (nd->model,"ne2k_isa" ) ==0 )) -pc_init_ne2k_isa (nd, i8259); +pc_init_ne2k_isa (nd);else pci_nic_init (nd,"ne2k_pci" ,NULL ); }
@@ -1360,7 +1361,8 @@ static void pc_init1(ram_addr_t ram_size,pci_piix3_ide_init (pci_bus, hd, piix3_devfn +1 , i8259); }else {for (i =0 ; i <MAX_IDE_BUS ; i++) { -isa_ide_init (ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], +isa_ide_init (ide_iobase[i], ide_iobase2[i], +isa_reserve_irq (ide_irq[i]), hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i +1 ]); } }
@@ -1390,7 +1392,8 @@ static void pc_init1(ram_addr_t ram_size,i2c_bus *smbus;/* TODO: Populate SPD eeprom data. */ - smbus =piix4_pm_init (pci_bus, piix3_devfn +3 ,0xb100 , i8259[9 ]); + smbus =piix4_pm_init (pci_bus, piix3_devfn +3 ,0xb100 , +isa_reserve_irq (9 ));for (i =0 ; i <8 ; i++) {DeviceState *eeprom; eeprom =qdev_create ((BusState *)smbus,"smbus-eeprom" );
hw/sb16.c +12 -13
@@ -56,7 +56,7 @@ static struct { typedef struct SB16State { QEMUSoundCard card; - qemu_irq *pic; + qemu_irq pic; int irq; int dma; int hdma;
@@ -190,7 +190,7 @@ static void aux_timer (void *opaque) {SB16State *s = opaque; s->can_write =1 ; -qemu_irq_raise (s->pic[s->irq]); +qemu_irq_raise (s->pic); }#define DMA8_AUTO 1
@@ -598,7 +598,7 @@ static void command (SB16State *s, uint8_t cmd)case 0xf3 :dsp_out_data (s,0xaa ); s->mixer_regs[0x82 ] |= (cmd ==0xf2 ) ?1 :2 ; -qemu_irq_raise (s->pic[s->irq]); +qemu_irq_raise (s->pic);break ;case 0xf9 :
@@ -766,7 +766,7 @@ static void complete (SB16State *s) bytes = samples << s->fmt_stereo << (s->fmt_bits ==16 ); ticks = (bytes * ticks_per_sec) / freq;if (ticks < ticks_per_sec /1024 ) { -qemu_irq_raise (s->pic[s->irq]); +qemu_irq_raise (s->pic); }else {if (s->aux_ts) {
@@ -858,10 +858,10 @@ static void legacy_reset (SB16State *s)static void reset (SB16State *s) { -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic);if (s->dma_auto) { -qemu_irq_raise (s->pic[s->irq]); -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_raise (s->pic); +qemu_irq_lower (s->pic); } s->mixer_regs[0x82 ] =0 ;
@@ -897,7 +897,7 @@ static IO_WRITE_PROTO (dsp_write)if (s->v2x6 ==1 ) {if (0 && s->highspeed) { s->highspeed =0 ; -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic);control (s,0 ); }else {
@@ -1008,7 +1008,7 @@ static IO_READ_PROTO (dsp_read)if (s->mixer_regs[0x82 ] &1 ) { ack =1 ; s->mixer_regs[0x82 ] &=1 ; -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic); }break ;
@@ -1017,7 +1017,7 @@ static IO_READ_PROTO (dsp_read)if (s->mixer_regs[0x82 ] &2 ) { ack =1 ; s->mixer_regs[0x82 ] &=2 ; -qemu_irq_lower (s->pic[s->irq]); +qemu_irq_lower (s->pic); }break ;
@@ -1231,7 +1231,7 @@ static int SB_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)if (s->left_till_irq <=0 ) { s->mixer_regs[0x82 ] |= (nchan &4 ) ?2 :1 ; -qemu_irq_raise (s->pic[s->irq]); +qemu_irq_raise (s->pic);if (0 == s->dma_auto) {control (s,0 );speaker (s,0 );
@@ -1408,8 +1408,7 @@ int SB16_init (qemu_irq *pic) s =qemu_mallocz (sizeof (*s)); s->cmd =-1 ; - s->pic = pic; - s->irq = conf.irq; + s->pic =isa_reserve_irq (conf.irq); s->dma = conf.dma; s->hdma = conf.hdma; s->port = conf.port;
Signature · 1 line
1.6.2.5
PATCH 3/3 Move isa_connect_irq calls into isa_create_simple
In reply to Gerd HoffmannNow with isa-bus maintaining the isa irqs we can move the isa_connect_irq() calls into isa_create_simple().
--- hw/fdc.c | 3 +-- hw/isa-bus.c | 7 ++++++- hw/isa.h | 3 ++- hw/pc.c | 4 +--- 4 files changed, 10 insertions(+), 7 deletions(-)
hw/fdc.c +1 -2
@@ -1878,9 +1878,8 @@ fdctrl_t *fdctrl_init_isa(int isairq, int dma_chann,fdctrl_t *fdctrl;ISADevice *dev; - dev =isa_create_simple ("isa-fdc" , io_base,0 ); + dev =isa_create_simple ("isa-fdc" , io_base,0 , isairq,-1 ); fdctrl = &(DO_UPCAST (fdctrl_isabus_t, busdev, dev)->state); -isa_connect_irq (dev,0 , isairq); fdctrl->dma_chann = dma_chann;DMA_register_channel (dma_chann, &fdctrl_transfer_handler, fdctrl);
hw/isa-bus.c +6 -1
@@ -130,7 +130,8 @@ void isa_qdev_register(ISADeviceInfo *info)qdev_register (&info->qdev); } -ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2) +ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2, +uint32_t irq,uint32 irq2) {DeviceState *dev;ISADevice *isa;
@@ -144,6 +145,10 @@ ISADevice *isa_create_simple(const char *name, uint32_t iobase, uint32_t iobase2 isa->iobase[0 ] = iobase; isa->iobase[1 ] = iobase2;qdev_init (dev); +if (-1 != irq) +isa_connect_irq (isa,0 , irq); +if (-1 != irq2) +isa_connect_irq (isa,1 , irq2);return isa; }
hw/isa.h +2 -1
@@ -30,7 +30,8 @@ void isa_connect_irq(ISADevice *dev, int devirq, int isairq);qemu_irq isa_reserve_irq (int isairq);void isa_init_irq (ISADevice *dev,qemu_irq *p);void isa_qdev_register (ISADeviceInfo *info); -ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2); +ISADevice *isa_create_simple (const char *name,uint32_t iobase,uint32_t iobase2, +uint32_t irq,uint32_t irq2);extern target_phys_addr_t isa_mem_base;
hw/pc.c +1 -3
@@ -1367,9 +1367,7 @@ static void pc_init1(ram_addr_t ram_size, } } - isa_dev =isa_create_simple ("i8042" ,0x60 ,0x64 ); -isa_connect_irq (isa_dev,0 ,1 ); -isa_connect_irq (isa_dev,1 ,12 ); + isa_dev =isa_create_simple ("i8042" ,0x60 ,0x64 ,1 ,12 );DMA_init (0 );#ifdef HAS_AUDIO audio_init (pci_enabled ? pci_bus :NULL , i8259);
Signature · 1 line
1.6.2.5