If vmsvga supports interrupts (SVGA_CAP_IRQMASK), some guests wait for FIFO to become not full by sleeping until FIFO_PROGRESS interrupt occurs. This is the most efficient thing to do when the FIFO fills up.
To support these guests, add support for SVGA_IRQFLAG_FIFO_PROGRESS. See usage example by guest in VMware SVGA development kit SVGAFIFOFull(). Reviewed-by: Darren Kenny <darren.ke...@oracle.com> Signed-off-by: Liran Alon <liran.a...@oracle.com> --- hw/display/vmware_vga.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c index 597051ec5c92..dc5f4681f0d3 100644 --- a/hw/display/vmware_vga.c +++ b/hw/display/vmware_vga.c @@ -731,6 +731,7 @@ static void vmsvga_fifo_run(struct vmsvga_state_s *s) uint32_t cmd_start; bool cmd_ignored; bool irq_pending = false; + bool fifo_progress = false; len = vmsvga_fifo_length(s); while (len > 0 && --maxloop > 0) { @@ -930,6 +931,15 @@ static void vmsvga_fifo_run(struct vmsvga_state_s *s) s->fifo[SVGA_FIFO_STOP] = cpu_to_le32(s->fifo_stop); break; } + + if (s->fifo_stop != cmd_start) + fifo_progress = true; + } + + if ((s->irq_mask & SVGA_IRQFLAG_FIFO_PROGRESS) && + fifo_progress) { + s->irq_status |= SVGA_IRQFLAG_FIFO_PROGRESS; + irq_pending = true; } s->syncing = 0; -- 1.9.1