]> git.proxmox.com Git - mirror_qemu.git/commitdiff
hw/sd/sdhci: Yield if interrupt delivered during multiple transfer
authorPhilippe Mathieu-Daudé <f4bug@amsat.org>
Thu, 3 Sep 2020 15:31:04 +0000 (17:31 +0200)
committerPhilippe Mathieu-Daudé <f4bug@amsat.org>
Wed, 21 Oct 2020 11:19:02 +0000 (13:19 +0200)
The Descriptor Table has a bit to allow the DMA to generates
Interrupt when the operation of the descriptor line is completed
(see "1.13.4. Descriptor Table" of 'SD Host Controller Simplified
Specification Version 2.00').

If we have pending interrupt and the descriptor requires it
to be generated as soon as it is completed, reschedule pending
transfers and yield to the CPU.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Alexander Bulekov <alxndr@bu.edu>
Message-Id: <20200903172806.489710-5-f4bug@amsat.org>

hw/sd/sdhci.c

index b93ecefd20c8673957f91ef3f84b1904c84e9eff..2f8b74a84f75ae72153dbffab8c1d256a64c7c92 100644 (file)
@@ -837,7 +837,10 @@ static void sdhci_do_adma(SDHCIState *s)
                 s->norintsts |= SDHC_NIS_DMA;
             }
 
-            sdhci_update_irq(s);
+            if (sdhci_update_irq(s) && !(dscr.attr & SDHC_ADMA_ATTR_END)) {
+                /* IRQ delivered, reschedule current transfer */
+                break;
+            }
         }
 
         /* ADMA transfer terminates if blkcnt == 0 or by END attribute */