From: Rene Stange Date: Fri, 7 Feb 2020 14:04:28 +0000 (+0000) Subject: bcm2835_dma: Re-initialize xlen in TD mode X-Git-Tag: v5.0.0-rc0~102^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=25437c09d7c46dea4a87dcff6642ce786fe14d28;p=thirdparty%2Fqemu.git bcm2835_dma: Re-initialize xlen in TD mode TD (two dimensions) DMA mode did not work, because the xlen variable has not been re-initialized before each additional ylen run through in bcm2835_dma_update(). Fix it. Signed-off-by: Rene Stange Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Peter Maydell --- diff --git a/hw/dma/bcm2835_dma.c b/hw/dma/bcm2835_dma.c index 667d951a6f7..ccff5ed55b2 100644 --- a/hw/dma/bcm2835_dma.c +++ b/hw/dma/bcm2835_dma.c @@ -54,7 +54,7 @@ static void bcm2835_dma_update(BCM2835DMAState *s, unsigned c) { BCM2835DMAChan *ch = &s->chan[c]; - uint32_t data, xlen, ylen; + uint32_t data, xlen, xlen_td, ylen; int16_t dst_stride, src_stride; if (!(s->enable & (1 << c))) { @@ -82,6 +82,7 @@ static void bcm2835_dma_update(BCM2835DMAState *s, unsigned c) dst_stride = 0; src_stride = 0; } + xlen_td = xlen; while (ylen != 0) { /* Normal transfer mode */ @@ -117,6 +118,7 @@ static void bcm2835_dma_update(BCM2835DMAState *s, unsigned c) if (--ylen != 0) { ch->source_ad += src_stride; ch->dest_ad += dst_stride; + xlen = xlen_td; } } ch->cs |= BCM2708_DMA_END;