Module Name: src Committed By: riastradh Date: Sat Feb 28 03:23:32 UTC 2015
Modified Files: src/sys/external/bsd/drm2/dist/drm/via: via_dmablit.c via_irq.c via_video.c Log Message: Fix these drm waits too, in case anyone tries to use this via code. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c \ src/sys/external/bsd/drm2/dist/drm/via/via_irq.c \ src/sys/external/bsd/drm2/dist/drm/via/via_video.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c diff -u src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c:1.2 Tue Aug 26 17:28:14 2014 +++ src/sys/external/bsd/drm2/dist/drm/via/via_dmablit.c Sat Feb 28 03:23:32 2015 @@ -600,6 +600,12 @@ via_dmablit_sync(struct drm_device *dev, DRM_SPIN_TIMED_WAIT_UNTIL(ret, queue, &blitq->blit_lock, 3*DRM_HZ, !via_dmablit_active(blitq, engine, handle, NULL)); + if (ret < 0) /* Failure: return negative error as is. */ + ; + else if (ret == 0) /* Timed out: return -EBUSY like Linux. */ + ret = -EBUSY; + else /* Succeeded (ret > 0): return 0. */ + ret = 0; } spin_unlock(&blitq->blit_lock); #else @@ -878,9 +884,18 @@ via_dmablit_grab_slot(drm_via_blitq_t *b DRM_SPIN_TIMED_WAIT_UNTIL(ret, &blitq->busy_queue, &blitq->blit_lock, DRM_HZ, blitq->num_free > 0); + if (ret < 0) /* Failure: return negative error as is. */ + ; + else if (ret == 0) /* Timed out: return -EBUSY like Linux. */ + ret = -EBUSY; + else /* Success (ret > 0): return 0. */ + ret = 0; + /* Map -EINTR to -EAGAIN. */ + if (ret == -EINTR) + ret = -EAGAIN; + /* Bail on failure. */ if (ret) { - if (ret == -EINTR) - ret = -EAGAIN; + spin_unlock_irqrestore(&blitq->blit_lock, irqsave); return ret; } #else Index: src/sys/external/bsd/drm2/dist/drm/via/via_irq.c diff -u src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/via/via_irq.c:1.2 Tue Aug 26 17:28:14 2014 +++ src/sys/external/bsd/drm2/dist/drm/via/via_irq.c Sat Feb 28 03:23:32 2015 @@ -260,6 +260,12 @@ via_driver_irq_wait(struct drm_device *d (((cur_irq_sequence = cur_irq->irq_received) - *sequence) <= (1 << 23))); } + if (ret < 0) /* Failure: return negative error as is. */ + ; + else if (ret == 0) /* Timed out: return -EBUSY like Linux. */ + ret = -EBUSY; + else /* Success (ret > 0): return 0. */ + ret = 0; spin_unlock(&cur_irq->irq_lock); #else if (masks[real_irq][2] && !force_sequence) { Index: src/sys/external/bsd/drm2/dist/drm/via/via_video.c diff -u src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.2 src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/via/via_video.c:1.2 Tue Aug 26 17:28:14 2014 +++ src/sys/external/bsd/drm2/dist/drm/via/via_video.c Sat Feb 28 03:23:32 2015 @@ -108,6 +108,12 @@ int via_decoder_futex(struct drm_device &dev_priv->decoder_lock[fx->lock], (fx->ms / 10) * (DRM_HZ / 100), *lock != fx->val); + if (ret < 0) /* Failure: return negative error as is. */ + ; + else if (ret == 0) /* Timed out: return -EBUSY like Linux. */ + ret = -EBUSY; + else /* Success (ret > 0): return 0. */ + ret = 0; mutex_unlock(&dev_priv->decoder_lock[fx->lock]); #else DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx->lock],