summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2020-01-23 06:52:12 +0100
committerBen Skeggs <bskeggs@redhat.com>2020-01-29 06:49:56 +0100
commit0352029ed83ff4d3f99e6bcf31bed5a97b07e3cf (patch)
tree051cf54e843705ac873926047dce32dcadabaeb8
parentdrm/nouveau: signal pending fences when channel has been killed (diff)
downloadlinux-0352029ed83ff4d3f99e6bcf31bed5a97b07e3cf.tar.xz
linux-0352029ed83ff4d3f99e6bcf31bed5a97b07e3cf.zip
drm/nouveau: support synchronous pushbuf submission
This is useful for debugging GPU hangs. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c11
-rw-r--r--include/uapi/drm/nouveau_drm.h1
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 8f97534e996c..f5ece1f94973 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -688,7 +688,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
struct validate_op op;
struct nouveau_fence *fence = NULL;
int i, j, ret = 0;
- bool do_reloc = false;
+ bool do_reloc = false, sync = false;
if (unlikely(!abi16))
return -ENOMEM;
@@ -705,6 +705,8 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
if (unlikely(atomic_read(&chan->killed)))
return nouveau_abi16_put(abi16, -ENODEV);
+ sync = req->vram_available & NOUVEAU_GEM_PUSHBUF_SYNC;
+
req->vram_available = drm->gem.vram_available;
req->gart_available = drm->gem.gart_available;
if (unlikely(req->nr_push == 0))
@@ -852,6 +854,13 @@ revalidate:
goto out;
}
+ if (sync) {
+ if (!(ret = nouveau_fence_wait(fence, false, false))) {
+ if ((ret = dma_fence_get_status(&fence->base)) == 1)
+ ret = 0;
+ }
+ }
+
out:
validate_fini(&op, chan, fence, bo);
nouveau_fence_unref(&fence);
diff --git a/include/uapi/drm/nouveau_drm.h b/include/uapi/drm/nouveau_drm.h
index 9459a6e3bc1f..853a327433d3 100644
--- a/include/uapi/drm/nouveau_drm.h
+++ b/include/uapi/drm/nouveau_drm.h
@@ -110,6 +110,7 @@ struct drm_nouveau_gem_pushbuf {
__u64 push;
__u32 suffix0;
__u32 suffix1;
+#define NOUVEAU_GEM_PUSHBUF_SYNC (1ULL << 0)
__u64 vram_available;
__u64 gart_available;
};