diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2020-01-23 06:52:12 +0100 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2020-01-29 06:49:56 +0100 |
commit | 0352029ed83ff4d3f99e6bcf31bed5a97b07e3cf (patch) | |
tree | 051cf54e843705ac873926047dce32dcadabaeb8 | |
parent | drm/nouveau: signal pending fences when channel has been killed (diff) | |
download | linux-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.c | 11 | ||||
-rw-r--r-- | include/uapi/drm/nouveau_drm.h | 1 |
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; }; |