[PATCH] drm/nouveau: allow allocating NVDEC channels via abi16

From: Daniel Almeida

Date: Sat Jul 25 2026 - 00:00:09 EST


From: Dave Airlie <airlied@xxxxxxxxxx>

Add NOUVEAU_FIFO_ENGINE_NVDEC to the abi16 uAPI and accept it in
channel allocation, mapping it to the NVDEC engine runlist.

Skip the Turing copy-engine workaround object for NVDEC channels: the
copy engines are not part of the NVDEC runlist, so the workaround
object cannot be instantiated on such channels (and is not needed
there).

This is required for NVK to implement Vulkan Video H.264 decode on top
of the NVDEC engine:

https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31867

Signed-off-by: Dave Airlie <airlied@xxxxxxxxxx>
Signed-off-by: Daniel Almeida <daniel.almeida@xxxxxxxxxxxxx>
---
drivers/gpu/drm/nouveau/nouveau_abi16.c | 14 ++++++++++----
include/uapi/drm/nouveau_drm.h | 1 +
2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index 291203121f0c..4542d5f4ded8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -408,6 +408,9 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
case NOUVEAU_FIFO_ENGINE_CE:
engine = NV_DEVICE_HOST_RUNLIST_ENGINES_CE;
break;
+ case NOUVEAU_FIFO_ENGINE_NVDEC:
+ engine = NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC;
+ break;
default:
return nouveau_abi16_put(abi16, -ENOSYS);
}
@@ -485,10 +488,13 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
goto done;
break;
case NV_DEVICE_INFO_V0_TURING:
- ret = nvif_object_ctor(&chan->chan->user, "abi16CeWar", 0, TURING_DMA_COPY_A,
- NULL, 0, &chan->ce);
- if (ret)
- goto done;
+ if (engine != NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC) {
+ ret = nvif_object_ctor(&chan->chan->user, "abi16CeWar",
+ 0, TURING_DMA_COPY_A, NULL, 0,
+ &chan->ce);
+ if (ret)
+ goto done;
+ }
break;
default:
break;
diff --git a/include/uapi/drm/nouveau_drm.h b/include/uapi/drm/nouveau_drm.h
index 1fa82fa6af38..c4905b3e4e91 100644
--- a/include/uapi/drm/nouveau_drm.h
+++ b/include/uapi/drm/nouveau_drm.h
@@ -89,6 +89,7 @@ struct drm_nouveau_getparam {
#define NOUVEAU_FIFO_ENGINE_PPP 0x04
#define NOUVEAU_FIFO_ENGINE_BSP 0x08
#define NOUVEAU_FIFO_ENGINE_CE 0x30
+#define NOUVEAU_FIFO_ENGINE_NVDEC 0x300

struct drm_nouveau_channel_alloc {
__u32 fb_ctxdma_handle;

base-commit: 1590cf0329716306e948a8fc29f1d3ee87d3989f
--
2.55.0