On 16 February 2011 14:22, Dmitry Eremin-Solenikov <dbarysh...@gmail.com> wrote: > Final corrections for IRQ levels that are set by mst_fpga: > > * Don't retranslate IRQ if previously IRQ was masked. > * After setting or clearing IRQs through register, apply mask > before setting parent IRQ level.
Thanks, applied this change. However now to have a completely correct behaviour, I think we need something like the following, what do you think? (prev_level is now unused, but the main change is not masking 1u << irq) diff --git a/hw/mst_fpga.c b/hw/mst_fpga.c index 407bac9..f66de69 100644 --- a/hw/mst_fpga.c +++ b/hw/mst_fpga.c @@ -31,7 +31,6 @@ typedef struct mst_irq_state{ qemu_irq parent; - uint32_t prev_level; uint32_t leddat1; uint32_t leddat2; uint32_t ledctrl; @@ -53,11 +52,6 @@ mst_fpga_set_irq(void *opaque, int irq, int level) uint32_t oldint = s->intsetclr & s->intmskena; if (level) - s->prev_level |= 1u << irq; - else - s->prev_level &= ~(1u << irq); - - if ((s->intmskena & (1u << irq)) && level) s->intsetclr |= 1u << irq; if (oldint != (s->intsetclr & s->intmskena)) @@ -193,12 +187,11 @@ static int mst_fpga_init(SysBusDevice *dev) static VMStateDescription vmstate_mst_fpga_regs = { .name = "mainstone_fpga", - .version_id = 0, - .minimum_version_id = 0, - .minimum_version_id_old = 0, + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, .post_load = mst_fpga_post_load, .fields = (VMStateField []) { - VMSTATE_UINT32(prev_level, mst_irq_state), VMSTATE_UINT32(leddat1, mst_irq_state), VMSTATE_UINT32(leddat2, mst_irq_state), VMSTATE_UINT32(ledctrl, mst_irq_state), Cheers