diff --git a/projects/ROCKNIX/packages/debug/apitrace/package.mk b/projects/ROCKNIX/packages/debug/apitrace/package.mk new file mode 100644 index 0000000000..5c27d518d1 --- /dev/null +++ b/projects/ROCKNIX/packages/debug/apitrace/package.mk @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +PKG_NAME="apitrace" +PKG_VERSION="45a005875d348b055d5b88dca285c109dee90457" +PKG_LICENSE="GPL" +PKG_SITE="https://github.com/apitrace/apitrace" +PKG_URL="${PKG_SITE}.git" +PKG_DEPENDS_TARGET="toolchain waffle Python3:host" +PKG_LONGDESC="A set of tools to trace, replay, and inspect OpenGL calls" +GET_HANDLER_SUPPORT="git" + +PKG_CMAKE_OPTS_TARGET=" -DENABLE_GUI=OFF -DENABLE_EGL=ON -DENABLE_WAFFLE=ON " diff --git a/projects/ROCKNIX/packages/graphics/mesa/package.mk b/projects/ROCKNIX/packages/graphics/mesa/package.mk index 7aac64662f..ae5193e236 100644 --- a/projects/ROCKNIX/packages/graphics/mesa/package.mk +++ b/projects/ROCKNIX/packages/graphics/mesa/package.mk @@ -12,33 +12,29 @@ PKG_DEPENDS_TARGET="toolchain expat libdrm Mako:host pyyaml:host" PKG_LONGDESC="Mesa is a 3-D graphics library with an API." PKG_TOOLCHAIN="meson" PKG_PATCH_DIRS+=" ${DEVICE}" - -case ${DEVICE} in - H700|RK3326|RK3399|RK3566|RK3588|S922X) - PKG_VERSION="24.3.4" - ;; - *) - PKG_VERSION="25.1.6" - if [ "${GRAPHIC_DRIVERS}" = "panfrost" ]; then - PKG_DEPENDS_TARGET+=" mesa:host" - fi - ;; -esac +PKG_VERSION="25.1.7" PKG_URL="https://gitlab.freedesktop.org/mesa/mesa/-/archive/mesa-${PKG_VERSION}/mesa-mesa-${PKG_VERSION}.tar.gz" +if listcontains "${GRAPHIC_DRIVERS}" "panfrost"; then + PKG_DEPENDS_TARGET+=" mesa:host" +fi + get_graphicdrivers pre_configure_host() { +# Host only gets built for panfrost. PKG_MESON_OPTS_HOST+=" ${MESA_LIBS_PATH_OPTS} \ -Dgallium-drivers=${GALLIUM_DRIVERS// /,} \ - -Dvulkan-drivers=${VULKAN_DRIVERS_MESA// /,} " + -Dvulkan-drivers=${VULKAN_DRIVERS_MESA// /,} \ + -Dmesa-clc=enabled \ + -Dinstall-mesa-clc=true \ + -Dprecomp-compiler=enabled \ + -Dinstall-precomp-compiler=true" } PKG_MESON_OPTS_TARGET=" ${MESA_LIBS_PATH_OPTS} \ -Dgallium-drivers=${GALLIUM_DRIVERS// /,} \ -Dgallium-extra-hud=false \ - -Dgallium-opencl=disabled \ - -Dgallium-xa=disabled \ -Dshader-cache=enabled \ -Dshared-glapi=enabled \ -Dopengl=true \ @@ -46,20 +42,23 @@ PKG_MESON_OPTS_TARGET=" ${MESA_LIBS_PATH_OPTS} \ -Degl=enabled \ -Dlibunwind=disabled \ -Dlmsensors=disabled \ - -Dbuild-tests=false \ - -Dosmesa=false" + -Dbuild-tests=false" + +if listcontains "${GRAPHIC_DRIVERS}" "panfrost"; then + # These options require that we have built mesa host as specified above + PKG_MESON_OPTS_TARGET+=" -Dmesa-clc=system \ + -Dprecomp-compiler=system" +fi if [ "${DISPLAYSERVER}" = "x11" ]; then PKG_DEPENDS_TARGET+=" xorgproto libXext libXdamage libXfixes libXxf86vm libxcb libX11 libxshmfence libXrandr libglvnd glfw" export X11_INCLUDES= PKG_MESON_OPTS_TARGET+=" -Dplatforms=x11 \ - -Dgallium-nine=true \ -Dglx=dri \ -Dglvnd=enabled" elif [ "${DISPLAYSERVER}" = "wl" ]; then PKG_DEPENDS_TARGET+=" wayland wayland-protocols libglvnd glfw" PKG_MESON_OPTS_TARGET+=" -Dplatforms=wayland,x11 \ - -Dgallium-nine=true \ -Dglx=dri \ -Dglvnd=enabled" PKG_DEPENDS_TARGET+=" xorgproto libXext libXdamage libXfixes libXxf86vm libxcb libX11 libxshmfence libXrandr libglvnd" diff --git a/projects/ROCKNIX/packages/graphics/mesa/patches/RK3399/000-midgard-max-invocations.patch b/projects/ROCKNIX/packages/graphics/mesa/patches/RK3399/000-midgard-max-invocations.patch deleted file mode 100644 index 3ba80b8958..0000000000 --- a/projects/ROCKNIX/packages/graphics/mesa/patches/RK3399/000-midgard-max-invocations.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff -rupN mesa.orig/src/gallium/drivers/panfrost/pan_screen.c mesa/src/gallium/drivers/panfrost/pan_screen.c ---- mesa.orig/src/gallium/drivers/panfrost/pan_screen.c 2024-06-20 16:15:06.902881289 +0000 -+++ mesa/src/gallium/drivers/panfrost/pan_screen.c 2024-06-20 16:19:33.693560497 +0000 -@@ -723,7 +723,7 @@ panfrost_get_compute_param(struct pipe_s - * the GLES3.1 spec minimum is 128, so we report 128 and limit - * the register allocation of affected compute kernels. - */ -- RET((uint64_t[]){dev->arch >= 6 ? 256 : 128}); -+ RET((uint64_t []) { 64 }); - - case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE: - RET((uint64_t[]){1024 * 1024 * 512 /* Maybe get memory */}); -diff -rupN mesa.orig/src/mesa/main/version.c mesa/src/mesa/main/version.c ---- mesa.orig/src/mesa/main/version.c 2024-06-20 16:15:07.002883799 +0000 -+++ mesa/src/mesa/main/version.c 2024-06-20 16:16:29.676956893 +0000 -@@ -511,7 +511,7 @@ compute_version_es2(const struct gl_exte - extensions->EXT_texture_type_2_10_10_10_REV && - consts->MaxColorAttachments >= 4); - const bool es31_compute_shader = -- consts->MaxComputeWorkGroupInvocations >= 128 && -+ consts->MaxComputeWorkGroupInvocations >= 64 && - consts->Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks && - consts->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers && - consts->Program[MESA_SHADER_COMPUTE].MaxImageUniforms; diff --git a/projects/ROCKNIX/packages/graphics/waffle/package.mk b/projects/ROCKNIX/packages/graphics/waffle/package.mk new file mode 100644 index 0000000000..6ae11962c7 --- /dev/null +++ b/projects/ROCKNIX/packages/graphics/waffle/package.mk @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2024-present ROCKNIX (https://rocknix.org) +PKG_NAME="waffle" +PKG_LICENSE="BSD" +PKG_VERSION="5f1f48287e806544d745e9a8f5aed47234c61292" +PKG_SITE="https://waffle.freedesktop.org/" +PKG_URL="https://gitlab.freedesktop.org/mesa/waffle/-/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain wayland mesa Python3" +PKG_LONGDESC="Waffle - a library for selecting an OpenGL API and window system at runtime" +PKG_TOOLCHAIN="meson" + +PKG_MESON_OPTS_TARGET+=" -Dwayland=enabled \ + -Dgbm=enabled \ + -Dx11_egl=enabled \ + -Dsurfaceless_egl=enabled \ + -Dglx=enabled \ + -Dbuild-examples=false" diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0007-drm-panfrost-Add-BO-labelling-to-Panfrost.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0007-drm-panfrost-Add-BO-labelling-to-Panfrost.patch new file mode 100644 index 0000000000..3b845041f1 --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0007-drm-panfrost-Add-BO-labelling-to-Panfrost.patch @@ -0,0 +1,131 @@ +From 23703a8b6430d1570bf761a5a2a38479a8c2cceb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= +Date: Tue, 20 May 2025 18:43:58 +0100 +Subject: [PATCH 3/7] drm/panfrost: Add BO labelling to Panfrost +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Functions for labelling UM-exposed an internal BOs are provided. An +example of the latter would be the Perfcnt sample buffer. + +This commit is done in preparation of a following one that will allow +UM to set BO labels through a new ioctl(). + +Signed-off-by: Adrián Larumbe +Reviewed-by: Steven Price +Reviewed-by: Boris Brezillon +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250520174634.353267-2-adrian.larumbe@collabora.com +--- + drivers/gpu/drm/panfrost/panfrost_gem.c | 42 +++++++++++++++++++++++++ + drivers/gpu/drm/panfrost/panfrost_gem.h | 17 ++++++++++ + 2 files changed, 59 insertions(+) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c +index 8e0ff3efe..a2caa6ad9 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.c ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.c +@@ -1,6 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 + /* Copyright 2019 Linaro, Ltd, Rob Herring */ + ++#include + #include + #include + #include +@@ -35,6 +36,9 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj) + */ + WARN_ON_ONCE(!list_empty(&bo->mappings.list)); + ++ kfree_const(bo->label.str); ++ mutex_destroy(&bo->label.lock); ++ + if (bo->sgts) { + int i; + int n_sgt = bo->base.base.size / SZ_2M; +@@ -260,6 +264,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t + mutex_init(&obj->mappings.lock); + obj->base.base.funcs = &panfrost_gem_funcs; + obj->base.map_wc = !pfdev->coherent; ++ mutex_init(&obj->label.lock); + + return &obj->base.base; + } +@@ -302,3 +307,40 @@ panfrost_gem_prime_import_sg_table(struct drm_device *dev, + + return obj; + } ++ ++void ++panfrost_gem_set_label(struct drm_gem_object *obj, const char *label) ++{ ++ struct panfrost_gem_object *bo = to_panfrost_bo(obj); ++ const char *old_label; ++ ++ scoped_guard(mutex, &bo->label.lock) { ++ old_label = bo->label.str; ++ bo->label.str = label; ++ } ++ ++ kfree_const(old_label); ++} ++ ++void ++panfrost_gem_internal_set_label(struct drm_gem_object *obj, const char *label) ++{ ++ struct panfrost_gem_object *bo = to_panfrost_bo(obj); ++ const char *str; ++ ++ /* We should never attempt labelling a UM-exposed GEM object */ ++ if (drm_WARN_ON(bo->base.base.dev, bo->base.base.handle_count > 0)) ++ return; ++ ++ if (!label) ++ return; ++ ++ str = kstrdup_const(label, GFP_KERNEL); ++ if (!str) { ++ /* Failing to allocate memory for a label isn't a fatal condition */ ++ drm_warn(bo->base.base.dev, "Not enough memory to allocate BO label"); ++ return; ++ } ++ ++ panfrost_gem_set_label(obj, str); ++} +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h +index 7516b7ecf..6c187b9b6 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.h ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.h +@@ -41,6 +41,20 @@ struct panfrost_gem_object { + */ + size_t heap_rss_size; + ++ /** ++ * @label: BO tagging fields. The label can be assigned within the ++ * driver itself or through a specific IOCTL. ++ */ ++ struct { ++ /** ++ * @label.str: Pointer to NULL-terminated string, ++ */ ++ const char *str; ++ ++ /** @lock.str: Protects access to the @label.str field. */ ++ struct mutex lock; ++ } label; ++ + bool noexec :1; + bool is_heap :1; + }; +@@ -89,4 +103,7 @@ void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo); + int panfrost_gem_shrinker_init(struct drm_device *dev); + void panfrost_gem_shrinker_cleanup(struct drm_device *dev); + ++void panfrost_gem_set_label(struct drm_gem_object *obj, const char *label); ++void panfrost_gem_internal_set_label(struct drm_gem_object *obj, const char *label); ++ + #endif /* __PANFROST_GEM_H__ */ +-- +2.50.1 + diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0008-drm-panfrost-Internally-label-some-BOs.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0008-drm-panfrost-Internally-label-some-BOs.patch new file mode 100644 index 0000000000..350599f156 --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0008-drm-panfrost-Internally-label-some-BOs.patch @@ -0,0 +1,64 @@ +From 75692eeac1a4d3549d6ee821cd847a707f4f856d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= +Date: Tue, 20 May 2025 18:43:59 +0100 +Subject: [PATCH 4/7] drm/panfrost: Internally label some BOs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Perfcnt samples buffer is not exposed to UM, but we would like to keep +a tag on it as a potential debug aid. + +PRIME imported GEM buffers are UM exposed, but since the usual Panfrost +UM driver code path is not followed in their creation, they might remain +unlabelled for their entire lifetime, so a generic tag was deemed +preferable. The tag is assigned before a UM handle is created so it +doesn't contradict the logic about labelling internal BOs. + +Signed-off-by: Adrián Larumbe +Reviewed-by: Boris Brezillon +Reviewed-by: Steven Price +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250520174634.353267-3-adrian.larumbe@collabora.com +--- + drivers/gpu/drm/panfrost/panfrost_gem.c | 10 ++++++++++ + drivers/gpu/drm/panfrost/panfrost_perfcnt.c | 2 ++ + 2 files changed, 12 insertions(+) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c +index a2caa6ad9..32e5c8076 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.c ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.c +@@ -305,6 +305,16 @@ panfrost_gem_prime_import_sg_table(struct drm_device *dev, + bo = to_panfrost_bo(obj); + bo->noexec = true; + ++ /* ++ * We assign this generic label because this function cannot ++ * be reached through any of the Panfrost UM driver-specific ++ * code paths, unless one is given by explicitly calling the ++ * SET_LABEL_BO ioctl. It is therefore preferable to have a ++ * blanket BO tag that tells us the object was imported from ++ * another driver than nothing at all. ++ */ ++ panfrost_gem_internal_set_label(obj, "GEM PRIME buffer"); ++ + return obj; + } + +diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c +index ba9b6e2b2..124885503 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c ++++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c +@@ -111,6 +111,8 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev, + goto err_put_mapping; + perfcnt->buf = map.vaddr; + ++ panfrost_gem_internal_set_label(&bo->base, "Perfcnt sample buffer"); ++ + /* + * Invalidate the cache and clear the counters to start from a fresh + * state. +-- +2.50.1 + diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0009-drm-panfrost-Add-driver-IOCTL-for-setting-BO-labels.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0009-drm-panfrost-Add-driver-IOCTL-for-setting-BO-labels.patch new file mode 100644 index 0000000000..30baf51d0c --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0009-drm-panfrost-Add-driver-IOCTL-for-setting-BO-labels.patch @@ -0,0 +1,159 @@ +From 94c4a3ce8f7457242377c4ae3a1881905a802ac8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= +Date: Tue, 20 May 2025 18:44:00 +0100 +Subject: [PATCH 5/7] drm/panfrost: Add driver IOCTL for setting BO labels +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Allow UM to label a BO for which it possesses a DRM handle. + +Signed-off-by: Adrián Larumbe +Reviewed-by: Steven Price +Reviewed-by: Boris Brezillon +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250520174634.353267-4-adrian.larumbe@collabora.com +--- + drivers/gpu/drm/panfrost/panfrost_drv.c | 44 ++++++++++++++++++++++++- + drivers/gpu/drm/panfrost/panfrost_gem.h | 2 ++ + include/uapi/drm/panfrost_drm.h | 21 ++++++++++++ + 3 files changed, 66 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c +index 04d615df5..8972d5985 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_drv.c ++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c +@@ -495,6 +495,46 @@ static int panfrost_ioctl_madvise(struct drm_device *dev, void *data, + return ret; + } + ++static int panfrost_ioctl_set_label_bo(struct drm_device *ddev, void *data, ++ struct drm_file *file) ++{ ++ struct drm_panfrost_set_label_bo *args = data; ++ struct drm_gem_object *obj; ++ const char *label = NULL; ++ int ret = 0; ++ ++ if (args->pad) ++ return -EINVAL; ++ ++ obj = drm_gem_object_lookup(file, args->handle); ++ if (!obj) ++ return -ENOENT; ++ ++ if (args->label) { ++ label = strndup_user(u64_to_user_ptr(args->label), ++ PANFROST_BO_LABEL_MAXLEN); ++ if (IS_ERR(label)) { ++ ret = PTR_ERR(label); ++ if (ret == -EINVAL) ++ ret = -E2BIG; ++ goto err_put_obj; ++ } ++ } ++ ++ /* ++ * We treat passing a label of length 0 and passing a NULL label ++ * differently, because even though they might seem conceptually ++ * similar, future uses of the BO label might expect a different ++ * behaviour in each case. ++ */ ++ panfrost_gem_set_label(obj, label); ++ ++err_put_obj: ++ drm_gem_object_put(obj); ++ ++ return ret; ++} ++ + int panfrost_unstable_ioctl_check(void) + { + if (!unstable_ioctls) +@@ -561,6 +601,7 @@ static const struct drm_ioctl_desc panfrost_drm_driver_ioctls[] = { + PANFROST_IOCTL(PERFCNT_ENABLE, perfcnt_enable, DRM_RENDER_ALLOW), + PANFROST_IOCTL(PERFCNT_DUMP, perfcnt_dump, DRM_RENDER_ALLOW), + PANFROST_IOCTL(MADVISE, madvise, DRM_RENDER_ALLOW), ++ PANFROST_IOCTL(SET_LABEL_BO, set_label_bo, DRM_RENDER_ALLOW), + }; + + static void panfrost_gpu_show_fdinfo(struct panfrost_device *pfdev, +@@ -625,6 +666,7 @@ static const struct file_operations panfrost_drm_driver_fops = { + * - 1.2 - adds AFBC_FEATURES query + * - 1.3 - adds JD_REQ_CYCLE_COUNT job requirement for SUBMIT + * - adds SYSTEM_TIMESTAMP and SYSTEM_TIMESTAMP_FREQUENCY queries ++ * - 1.4 - adds SET_LABEL_BO + */ + static const struct drm_driver panfrost_drm_driver = { + .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ, +@@ -638,7 +680,7 @@ static const struct drm_driver panfrost_drm_driver = { + .desc = "panfrost DRM", + .date = "20180908", + .major = 1, +- .minor = 3, ++ .minor = 4, + + .gem_create_object = panfrost_gem_create_object, + .gem_prime_import_sg_table = panfrost_gem_prime_import_sg_table, +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h +index 6c187b9b6..3d87c41ad 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.h ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.h +@@ -9,6 +9,8 @@ + + struct panfrost_mmu; + ++#define PANFROST_BO_LABEL_MAXLEN 4096 ++ + struct panfrost_gem_object { + struct drm_gem_shmem_object base; + struct sg_table *sgts; +diff --git a/include/uapi/drm/panfrost_drm.h b/include/uapi/drm/panfrost_drm.h +index 568724be6..ed6751039 100644 +--- a/include/uapi/drm/panfrost_drm.h ++++ b/include/uapi/drm/panfrost_drm.h +@@ -21,6 +21,7 @@ extern "C" { + #define DRM_PANFROST_PERFCNT_ENABLE 0x06 + #define DRM_PANFROST_PERFCNT_DUMP 0x07 + #define DRM_PANFROST_MADVISE 0x08 ++#define DRM_PANFROST_SET_LABEL_BO 0x09 + + #define DRM_IOCTL_PANFROST_SUBMIT DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_SUBMIT, struct drm_panfrost_submit) + #define DRM_IOCTL_PANFROST_WAIT_BO DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_WAIT_BO, struct drm_panfrost_wait_bo) +@@ -29,6 +30,7 @@ extern "C" { + #define DRM_IOCTL_PANFROST_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_PARAM, struct drm_panfrost_get_param) + #define DRM_IOCTL_PANFROST_GET_BO_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_BO_OFFSET, struct drm_panfrost_get_bo_offset) + #define DRM_IOCTL_PANFROST_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_MADVISE, struct drm_panfrost_madvise) ++#define DRM_IOCTL_PANFROST_SET_LABEL_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_SET_LABEL_BO, struct drm_panfrost_set_label_bo) + + /* + * Unstable ioctl(s): only exposed when the unsafe unstable_ioctls module +@@ -227,6 +229,25 @@ struct drm_panfrost_madvise { + __u32 retained; /* out, whether backing store still exists */ + }; + ++/** ++ * struct drm_panfrost_set_label_bo - ioctl argument for labelling Panfrost BOs. ++ */ ++struct drm_panfrost_set_label_bo { ++ /** @handle: Handle of the buffer object to label. */ ++ __u32 handle; ++ ++ /** @pad: MBZ. */ ++ __u32 pad; ++ ++ /** ++ * @label: User pointer to a NUL-terminated string ++ * ++ * Length cannot be greater than 4096. ++ * NULL is permitted and means clear the label. ++ */ ++ __u64 label; ++}; ++ + /* Definitions for coredump decoding in user space */ + #define PANFROSTDUMP_MAJOR 1 + #define PANFROSTDUMP_MINOR 0 +-- +2.50.1 + diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0010-drm-panfrost-show-device-wide-list-of-DRM-GEM-object.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0010-drm-panfrost-show-device-wide-list-of-DRM-GEM-object.patch new file mode 100644 index 0000000000..3a98d6386e --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0010-drm-panfrost-show-device-wide-list-of-DRM-GEM-object.patch @@ -0,0 +1,380 @@ +From ce7291e87d4534b5231e2e4a6d09a7cb4cf0c0dc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= +Date: Tue, 20 May 2025 18:44:01 +0100 +Subject: [PATCH 6/7] drm/panfrost: show device-wide list of DRM GEM objects + over DebugFS +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This change is essentially a Panfrost port of commit a3707f53eb3f +("drm/panthor: show device-wide list of DRM GEM objects over DebugFS"). + +The DebugFS file is almost the same as in Panthor, minus the GEM object +usage flags, since Panfrost has no kernel-only BO's. + +Two additional GEM state flags which are displayed but aren't relevant +to Panthor are 'Purged' and 'Purgeable', since Panfrost implements an +explicit shrinker and a madvise ioctl to flag objects as reclaimable. + +Signed-off-by: Adrián Larumbe +Reviewed-by: Boris Brezillon +Reviewed-by: Steven Price +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250520174634.353267-5-adrian.larumbe@collabora.com +--- + drivers/gpu/drm/panfrost/panfrost_device.c | 5 + + drivers/gpu/drm/panfrost/panfrost_device.h | 15 +++ + drivers/gpu/drm/panfrost/panfrost_drv.c | 35 ++++++ + drivers/gpu/drm/panfrost/panfrost_gem.c | 134 +++++++++++++++++++++ + drivers/gpu/drm/panfrost/panfrost_gem.h | 47 ++++++++ + 5 files changed, 236 insertions(+) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c +index a45e4addc..74f9f2a75 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_device.c ++++ b/drivers/gpu/drm/panfrost/panfrost_device.c +@@ -235,6 +235,11 @@ int panfrost_device_init(struct panfrost_device *pfdev) + goto out_regulator; + } + ++#ifdef CONFIG_DEBUG_FS ++ mutex_init(&pfdev->debugfs.gems_lock); ++ INIT_LIST_HEAD(&pfdev->debugfs.gems_list); ++#endif ++ + err = panfrost_pm_domain_init(pfdev); + if (err) + goto out_reset; +diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h +index cffcb0ac7..bd20a5702 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_device.h ++++ b/drivers/gpu/drm/panfrost/panfrost_device.h +@@ -97,6 +97,17 @@ struct panfrost_compatible { + u8 pm_features; + }; + ++/** ++ * struct panfrost_device_debugfs - Device-wide DebugFS tracking structures ++ */ ++struct panfrost_device_debugfs { ++ /** @gems_list: Device-wide list of GEM objects owned by at least one file. */ ++ struct list_head gems_list; ++ ++ /** @gems_lock: Serializes access to the device-wide list of GEM objects. */ ++ struct mutex gems_lock; ++}; ++ + struct panfrost_device { + struct device *dev; + struct drm_device *ddev; +@@ -150,6 +161,10 @@ struct panfrost_device { + atomic_t use_count; + spinlock_t lock; + } cycle_counter; ++ ++#ifdef CONFIG_DEBUG_FS ++ struct panfrost_device_debugfs debugfs; ++#endif + }; + + struct panfrost_mmu { +diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c +index 8972d5985..594293914 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_drv.c ++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -659,6 +660,37 @@ static const struct file_operations panfrost_drm_driver_fops = { + .show_fdinfo = drm_show_fdinfo, + }; + ++#ifdef CONFIG_DEBUG_FS ++static int panthor_gems_show(struct seq_file *m, void *data) ++{ ++ struct drm_info_node *node = m->private; ++ struct drm_device *dev = node->minor->dev; ++ struct panfrost_device *pfdev = dev->dev_private; ++ ++ panfrost_gem_debugfs_print_bos(pfdev, m); ++ ++ return 0; ++} ++ ++static struct drm_info_list panthor_debugfs_list[] = { ++ {"gems", panthor_gems_show, 0, NULL}, ++}; ++ ++static int panthor_gems_debugfs_init(struct drm_minor *minor) ++{ ++ drm_debugfs_create_files(panthor_debugfs_list, ++ ARRAY_SIZE(panthor_debugfs_list), ++ minor->debugfs_root, minor); ++ ++ return 0; ++} ++ ++static void panfrost_debugfs_init(struct drm_minor *minor) ++{ ++ panthor_gems_debugfs_init(minor); ++} ++#endif ++ + /* + * Panfrost driver version: + * - 1.0 - initial interface +@@ -684,6 +716,9 @@ static const struct drm_driver panfrost_drm_driver = { + + .gem_create_object = panfrost_gem_create_object, + .gem_prime_import_sg_table = panfrost_gem_prime_import_sg_table, ++#ifdef CONFIG_DEBUG_FS ++ .debugfs_init = panfrost_debugfs_init, ++#endif + }; + + static int panfrost_probe(struct platform_device *pdev) +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c +index 32e5c8076..fc26eae6f 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.c ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.c +@@ -12,6 +12,36 @@ + #include "panfrost_gem.h" + #include "panfrost_mmu.h" + ++#ifdef CONFIG_DEBUG_FS ++static void panfrost_gem_debugfs_bo_add(struct panfrost_device *pfdev, ++ struct panfrost_gem_object *bo) ++{ ++ bo->debugfs.creator.tgid = current->group_leader->pid; ++ get_task_comm(bo->debugfs.creator.process_name, current->group_leader); ++ ++ mutex_lock(&pfdev->debugfs.gems_lock); ++ list_add_tail(&bo->debugfs.node, &pfdev->debugfs.gems_list); ++ mutex_unlock(&pfdev->debugfs.gems_lock); ++} ++ ++static void panfrost_gem_debugfs_bo_rm(struct panfrost_gem_object *bo) ++{ ++ struct panfrost_device *pfdev = bo->base.base.dev->dev_private; ++ ++ if (list_empty(&bo->debugfs.node)) ++ return; ++ ++ mutex_lock(&pfdev->debugfs.gems_lock); ++ list_del_init(&bo->debugfs.node); ++ mutex_unlock(&pfdev->debugfs.gems_lock); ++} ++#else ++static void panfrost_gem_debugfs_bo_add(struct panfrost_device *pfdev, ++ struct panfrost_gem_object *bo) ++{} ++static void panfrost_gem_debugfs_bo_rm(struct panfrost_gem_object *bo) {} ++#endif ++ + /* Called DRM core on the last userspace/kernel unreference of the + * BO. + */ +@@ -37,6 +67,7 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj) + WARN_ON_ONCE(!list_empty(&bo->mappings.list)); + + kfree_const(bo->label.str); ++ panfrost_gem_debugfs_bo_rm(bo); + mutex_destroy(&bo->label.lock); + + if (bo->sgts) { +@@ -266,6 +297,8 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t + obj->base.map_wc = !pfdev->coherent; + mutex_init(&obj->label.lock); + ++ panfrost_gem_debugfs_bo_add(pfdev, obj); ++ + return &obj->base.base; + } + +@@ -354,3 +387,104 @@ panfrost_gem_internal_set_label(struct drm_gem_object *obj, const char *label) + + panfrost_gem_set_label(obj, str); + } ++ ++#ifdef CONFIG_DEBUG_FS ++struct gem_size_totals { ++ size_t size; ++ size_t resident; ++ size_t reclaimable; ++}; ++ ++struct flag_def { ++ u32 flag; ++ const char *name; ++}; ++ ++static void panfrost_gem_debugfs_print_flag_names(struct seq_file *m) ++{ ++ int len; ++ int i; ++ ++ static const struct flag_def gem_state_flags_names[] = { ++ {PANFROST_DEBUGFS_GEM_STATE_FLAG_IMPORTED, "imported"}, ++ {PANFROST_DEBUGFS_GEM_STATE_FLAG_EXPORTED, "exported"}, ++ {PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGED, "purged"}, ++ {PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGEABLE, "purgeable"}, ++ }; ++ ++ seq_puts(m, "GEM state flags: "); ++ for (i = 0, len = ARRAY_SIZE(gem_state_flags_names); i < len; i++) { ++ seq_printf(m, "%s (0x%x)%s", gem_state_flags_names[i].name, ++ gem_state_flags_names[i].flag, (i < len - 1) ? ", " : "\n\n"); ++ } ++} ++ ++static void panfrost_gem_debugfs_bo_print(struct panfrost_gem_object *bo, ++ struct seq_file *m, ++ struct gem_size_totals *totals) ++{ ++ unsigned int refcount = kref_read(&bo->base.base.refcount); ++ char creator_info[32] = {}; ++ size_t resident_size; ++ u32 gem_state_flags = 0; ++ ++ /* Skip BOs being destroyed. */ ++ if (!refcount) ++ return; ++ ++ resident_size = bo->base.pages ? bo->base.base.size : 0; ++ ++ snprintf(creator_info, sizeof(creator_info), ++ "%s/%d", bo->debugfs.creator.process_name, bo->debugfs.creator.tgid); ++ seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd0x%-16lx", ++ creator_info, ++ bo->base.base.name, ++ refcount, ++ bo->base.base.size, ++ resident_size, ++ drm_vma_node_start(&bo->base.base.vma_node)); ++ ++ if (bo->base.base.import_attach) ++ gem_state_flags |= PANFROST_DEBUGFS_GEM_STATE_FLAG_IMPORTED; ++ if (bo->base.base.dma_buf) ++ gem_state_flags |= PANFROST_DEBUGFS_GEM_STATE_FLAG_EXPORTED; ++ ++ if (bo->base.madv < 0) ++ gem_state_flags |= PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGED; ++ else if (bo->base.madv > 0) ++ gem_state_flags |= PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGEABLE; ++ ++ seq_printf(m, "0x%-10x", gem_state_flags); ++ ++ scoped_guard(mutex, &bo->label.lock) { ++ seq_printf(m, "%s\n", bo->label.str ? : ""); ++ } ++ ++ totals->size += bo->base.base.size; ++ totals->resident += resident_size; ++ if (bo->base.madv > 0) ++ totals->reclaimable += resident_size; ++} ++ ++void panfrost_gem_debugfs_print_bos(struct panfrost_device *pfdev, ++ struct seq_file *m) ++{ ++ struct gem_size_totals totals = {0}; ++ struct panfrost_gem_object *bo; ++ ++ panfrost_gem_debugfs_print_flag_names(m); ++ ++ seq_puts(m, "created-by global-name refcount size resident-size file-offset state label\n"); ++ seq_puts(m, "-----------------------------------------------------------------------------------------------------------------------------------\n"); ++ ++ scoped_guard(mutex, &pfdev->debugfs.gems_lock) { ++ list_for_each_entry(bo, &pfdev->debugfs.gems_list, debugfs.node) { ++ panfrost_gem_debugfs_bo_print(bo, m, &totals); ++ } ++ } ++ ++ seq_puts(m, "===================================================================================================================================\n"); ++ seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n", ++ totals.size, totals.resident, totals.reclaimable); ++} ++#endif +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h +index 3d87c41ad..8de3e76f2 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.h ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.h +@@ -8,9 +8,47 @@ + #include + + struct panfrost_mmu; ++struct panfrost_device; + + #define PANFROST_BO_LABEL_MAXLEN 4096 + ++enum panfrost_debugfs_gem_state_flags { ++ /** @PANFROST_DEBUGFS_GEM_STATE_FLAG_IMPORTED: GEM BO is PRIME imported. */ ++ PANFROST_DEBUGFS_GEM_STATE_FLAG_IMPORTED = BIT(0), ++ ++ /** @PANFROST_DEBUGFS_GEM_STATE_FLAG_EXPORTED: GEM BO is PRIME exported. */ ++ PANFROST_DEBUGFS_GEM_STATE_FLAG_EXPORTED = BIT(1), ++ ++ /** @PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGED: GEM BO was reclaimed by the shrinker. */ ++ PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGED = BIT(2), ++ ++ /** ++ * @PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGEABLE: GEM BO pages were marked as no longer ++ * needed by UM and can be reclaimed by the shrinker. ++ */ ++ PANFROST_DEBUGFS_GEM_STATE_FLAG_PURGEABLE = BIT(3), ++}; ++ ++/** ++ * struct panfrost_gem_debugfs - GEM object's DebugFS list information ++ */ ++struct panfrost_gem_debugfs { ++ /** ++ * @node: Node used to insert the object in the device-wide list of ++ * GEM objects, to display information about it through a DebugFS file. ++ */ ++ struct list_head node; ++ ++ /** @creator: Information about the UM process which created the GEM. */ ++ struct { ++ /** @creator.process_name: Group leader name in owning thread's process */ ++ char process_name[TASK_COMM_LEN]; ++ ++ /** @creator.tgid: PID of the thread's group leader within its process */ ++ pid_t tgid; ++ } creator; ++}; ++ + struct panfrost_gem_object { + struct drm_gem_shmem_object base; + struct sg_table *sgts; +@@ -59,6 +97,10 @@ struct panfrost_gem_object { + + bool noexec :1; + bool is_heap :1; ++ ++#ifdef CONFIG_DEBUG_FS ++ struct panfrost_gem_debugfs debugfs; ++#endif + }; + + struct panfrost_gem_mapping { +@@ -108,4 +150,9 @@ void panfrost_gem_shrinker_cleanup(struct drm_device *dev); + void panfrost_gem_set_label(struct drm_gem_object *obj, const char *label); + void panfrost_gem_internal_set_label(struct drm_gem_object *obj, const char *label); + ++#ifdef CONFIG_DEBUG_FS ++void panfrost_gem_debugfs_print_bos(struct panfrost_device *pfdev, ++ struct seq_file *m); ++#endif ++ + #endif /* __PANFROST_GEM_H__ */ +-- +2.50.1 + diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0011-drm-panfrost-Fix-panfrost-device-variable-name-in-de.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0011-drm-panfrost-Fix-panfrost-device-variable-name-in-de.patch new file mode 100644 index 0000000000..5309807bf9 --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0011-drm-panfrost-Fix-panfrost-device-variable-name-in-de.patch @@ -0,0 +1,50 @@ +From e8402371da709df40c20ec2a5c1916357fa69064 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= +Date: Tue, 20 May 2025 18:44:02 +0100 +Subject: [PATCH 7/7] drm/panfrost: Fix panfrost device variable name in + devfreq +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit 64111a0e22a9 ("drm/panfrost: Fix incorrect updating of current +device frequency") was a Panfrost port of a similar fix in Panthor. + +Fix the Panfrost device pointer variable name so that it follows +Panfrost naming conventions. + +Signed-off-by: Adrián Larumbe +Fixes: 64111a0e22a9 ("drm/panfrost: Fix incorrect updating of current device frequency") +Reviewed-by: Boris Brezillon +Reviewed-by: Steven Price +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250520174634.353267-6-adrian.larumbe@collabora.com +--- + drivers/gpu/drm/panfrost/panfrost_devfreq.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c +index 3385fd3ef..5d0dce103 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c ++++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c +@@ -29,7 +29,7 @@ static void panfrost_devfreq_update_utilization(struct panfrost_devfreq *pfdevfr + static int panfrost_devfreq_target(struct device *dev, unsigned long *freq, + u32 flags) + { +- struct panfrost_device *ptdev = dev_get_drvdata(dev); ++ struct panfrost_device *pfdev = dev_get_drvdata(dev); + struct dev_pm_opp *opp; + int err; + +@@ -40,7 +40,7 @@ static int panfrost_devfreq_target(struct device *dev, unsigned long *freq, + + err = dev_pm_opp_set_rate(dev, *freq); + if (!err) +- ptdev->pfdevfreq.current_frequency = *freq; ++ pfdev->pfdevfreq.current_frequency = *freq; + + return err; + } +-- +2.50.1 + diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0012-panfrost-fix-tiler-heap-reporting.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0012-panfrost-fix-tiler-heap-reporting.patch new file mode 100644 index 0000000000..2c39ad9244 --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0012-panfrost-fix-tiler-heap-reporting.patch @@ -0,0 +1,23 @@ +Otherwise it would display the virtual allocation size, which is often +much bigger than the RSS. + +Signed-off-by: Adrián Larumbe +Fixes: e48ade5e23ba ("drm/panfrost: show device-wide list of DRM GEM objects over DebugFS") +--- + drivers/gpu/drm/panfrost/panfrost_gem.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c +index fc26eae..a61b542 100644 +--- a/drivers/gpu/drm/panfrost/panfrost_gem.c ++++ b/drivers/gpu/drm/panfrost/panfrost_gem.c +@@ -432,7 +432,8 @@ static void panfrost_gem_debugfs_bo_print(struct panfrost_gem_object *bo, + if (!refcount) + return; + +- resident_size = bo->base.pages ? bo->base.base.size : 0; ++ resident_size = bo->base.pages ? ++ (bo->is_heap ? bo->heap_rss_size : bo->base.base.size) : 0; + + snprintf(creator_info, sizeof(creator_info), + "%s/%d", bo->debugfs.creator.process_name, bo->debugfs.creator.tgid); diff --git a/projects/ROCKNIX/packages/virtual/debug/package.mk b/projects/ROCKNIX/packages/virtual/debug/package.mk index 5ff06203ce..fa87480fe8 100644 --- a/projects/ROCKNIX/packages/virtual/debug/package.mk +++ b/projects/ROCKNIX/packages/virtual/debug/package.mk @@ -3,4 +3,4 @@ . ${ROOT}/packages/virtual/debug/package.mk -PKG_DEPENDS_TARGET+=" nvtop" +PKG_DEPENDS_TARGET+=" nvtop apitrace"