summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMel Henning <mhenning@darkrefraction.com>2026-02-19 15:05:54 -0500
committerDanilo Krummrich <dakr@kernel.org>2026-02-24 15:04:55 +0100
commit196b2b95fec447c2c4460f753b277d840633fbef (patch)
tree60eab05ef026516a6992de80e0eff3c3659e8825 /drivers/gpu
parent27e125e5568ae4185ffd97abe5b7851ce4f67fe5 (diff)
downloadlinux-196b2b95fec447c2c4460f753b277d840633fbef.tar.gz
linux-196b2b95fec447c2c4460f753b277d840633fbef.zip
drm/nouveau: Add DRM_IOCTL_NOUVEAU_GET_ZCULL_INFO
Add kernel-side support for using the zcull hardware in nvidia gpus. zcull aims to improve memory bandwidth by using an early approximate depth test, similar to hierarchical Z on an AMD card. Add a new ioctl that exposes zcull information that has been read from the hardware. Userspace uses each of these parameters either in a heuristic for determining zcull region parameters or in the calculation of a buffer size. It appears the hardware hasn't changed its structure for these values since FERMI_C (circa 2011), so the assumption is that it won't change on us too quickly, and is therefore reasonable to include in UAPI. This bypasses the nvif layer and instead accesses nvkm_gr directly, which mirrors existing usage of nvkm_gr_units(). There is no nvif object for nvkm_gr yet, and adding one is not trivial. Signed-off-by: Mel Henning <mhenning@darkrefraction.com> Link: https://patch.msgid.link/20260219-zcull3-v3-2-dbe6a716f104@darkrefraction.com Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_abi16.c29
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_abi16.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c1
3 files changed, 31 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index f9201f2e73a3..7860877d909b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -334,6 +334,35 @@ nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS)
}
int
+nouveau_abi16_ioctl_get_zcull_info(ABI16_IOCTL_ARGS)
+{
+ struct nouveau_drm *drm = nouveau_drm(dev);
+ struct nvkm_gr *gr = nvxx_gr(drm);
+ struct drm_nouveau_get_zcull_info *out = data;
+
+ if (gr->has_zcull_info) {
+ const struct nvkm_gr_zcull_info *i = &gr->zcull_info;
+
+ out->width_align_pixels = i->width_align_pixels;
+ out->height_align_pixels = i->height_align_pixels;
+ out->pixel_squares_by_aliquots = i->pixel_squares_by_aliquots;
+ out->aliquot_total = i->aliquot_total;
+ out->zcull_region_byte_multiplier = i->zcull_region_byte_multiplier;
+ out->zcull_region_header_size = i->zcull_region_header_size;
+ out->zcull_subregion_header_size = i->zcull_subregion_header_size;
+ out->subregion_count = i->subregion_count;
+ out->subregion_width_align_pixels = i->subregion_width_align_pixels;
+ out->subregion_height_align_pixels = i->subregion_height_align_pixels;
+ out->ctxsw_size = i->ctxsw_size;
+ out->ctxsw_align = i->ctxsw_align;
+
+ return 0;
+ } else {
+ return -ENOTTY;
+ }
+}
+
+int
nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
{
struct drm_nouveau_channel_alloc *init = data;
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.h b/drivers/gpu/drm/nouveau/nouveau_abi16.h
index af6b4e1cefd2..134b3ab58719 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.h
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.h
@@ -6,6 +6,7 @@
struct drm_device *dev, void *data, struct drm_file *file_priv
int nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS);
+int nouveau_abi16_ioctl_get_zcull_info(ABI16_IOCTL_ARGS);
int nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS);
int nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS);
int nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 17c114645d9f..5d8475e4895e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -1304,6 +1304,7 @@ nouveau_ioctls[] = {
DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(NOUVEAU_GET_ZCULL_INFO, nouveau_abi16_ioctl_get_zcull_info, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_INIT, nouveau_svmm_init, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(NOUVEAU_SVM_BIND, nouveau_svmm_bind, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_RENDER_ALLOW),