A cleanup of nouveau_dma_wait(): extract a sub-function and eliminate two variables to improve readability.
No functional changes. Signed-off-by: Pekka Paalanen <[email protected]> --- drivers/gpu/drm/nouveau/nouveau_dma.c | 72 ++++++++++++++++++--------------- 1 files changed, 39 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index b1f3a71..b787651 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c @@ -115,14 +115,43 @@ READ_GET(struct nouveau_channel *chan, uint32_t *get) return true; } +static int +dma_wait_ring_wrap(struct nouveau_channel *chan, int size, uint32_t get, + int *timeout) +{ + /* Emit jump to the start of the ring buffer. */ + OUT_RING(chan, 0x20000000 | chan->pushbuf_base); + + if (get <= NOUVEAU_DMA_SKIPS) { + /* corner case - will be idle */ + if (chan->dma.put <= NOUVEAU_DMA_SKIPS) + WRITE_PUT(NOUVEAU_DMA_SKIPS + 1); + + for (; *timeout; (*timeout)--) { + if (READ_GET(chan, &get) && get > NOUVEAU_DMA_SKIPS) + break; + + DRM_UDELAY(1); + } + + if (*timeout == 0) + return -EBUSY; + } + + WRITE_PUT(NOUVEAU_DMA_SKIPS); + chan->dma.cur = NOUVEAU_DMA_SKIPS; + chan->dma.put = NOUVEAU_DMA_SKIPS; + chan->dma.free = get - (NOUVEAU_DMA_SKIPS + 1); + return 0; +} + int nouveau_dma_wait(struct nouveau_channel *chan, int size) { - const int us_timeout = 100000; + int us_timeout = 100000; uint32_t get; - int ret = -EBUSY, i; - for (i = 0; i < us_timeout; i++) { + for (; us_timeout; us_timeout--) { if (!READ_GET(chan, &get)) { DRM_UDELAY(1); continue; @@ -131,41 +160,18 @@ nouveau_dma_wait(struct nouveau_channel *chan, int size) if (chan->dma.put >= get) { chan->dma.free = chan->dma.max - chan->dma.cur; - if (chan->dma.free < size) { - OUT_RING(chan, 0x20000000|chan->pushbuf_base); - if (get <= NOUVEAU_DMA_SKIPS) { - /*corner case - will be idle*/ - if (chan->dma.put <= NOUVEAU_DMA_SKIPS) - WRITE_PUT(NOUVEAU_DMA_SKIPS + 1); - - for (; i < us_timeout; i++) { - if (READ_GET(chan, &get) && - get > NOUVEAU_DMA_SKIPS) - break; - - DRM_UDELAY(1); - } - - if (i >= us_timeout) - break; - } - - WRITE_PUT(NOUVEAU_DMA_SKIPS); - chan->dma.cur = - chan->dma.put = NOUVEAU_DMA_SKIPS; - chan->dma.free = get - (NOUVEAU_DMA_SKIPS + 1); - } + if (chan->dma.free < size) + if (dma_wait_ring_wrap(chan, size, get, + &us_timeout)) + return -EBUSY; } else { chan->dma.free = get - chan->dma.cur - 1; } - if (chan->dma.free >= size) { - ret = 0; - break; - } + if (chan->dma.free >= size) + return 0; DRM_UDELAY(1); } - - return ret; + return -EBUSY; } -- 1.6.3.3 _______________________________________________ Nouveau mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/nouveau
