From: Thomas Zimmermann <tzimmermann@suse.de>
To: boris.brezillon@collabora.com, simona@ffwll.ch,
airlied@gmail.com, mripard@kernel.org,
maarten.lankhorst@linux.intel.com, ogabbay@kernel.org,
mamin506@gmail.com, lizhi.hou@amd.com,
maciej.falkowski@linux.intel.com,
karol.wachowski@linux.intel.com, tomeu@tomeuvizoso.net,
frank.binns@imgtec.com, matt.coster@imgtec.com, yuq825@gmail.com,
robh@kernel.org, steven.price@arm.com,
adrian.larumbe@collabora.com, liviu.dudau@arm.com,
mwen@igalia.com, kraxel@redhat.com,
dmitry.osipenko@collabora.com, gurchetansingh@chromium.org,
olvaffe@gmail.com, corbet@lwn.net
Cc: dri-devel@lists.freedesktop.org, lima@lists.freedesktop.org,
virtualization@lists.linux.dev, linux-doc@vger.kernel.org,
Thomas Zimmermann <tzimmermann@suse.de>
Subject: [PATCH 05/13] drm/imagination: Use GEM-UMA helpers for memory management
Date: Tue, 9 Dec 2025 14:42:02 +0100 [thread overview]
Message-ID: <20251209140141.94407-6-tzimmermann@suse.de> (raw)
In-Reply-To: <20251209140141.94407-1-tzimmermann@suse.de>
Convert imagination from GEM-SHMEM to GEM-UMA. The latter is just a
copy, so this change it merely renaming symbols. No functional changes.
GEM-SHMEM will become more self-contained for drivers without specific
memory management. GEM-UMA's interfaces will remain flexible for drivers
with UMA hardware, such as imagination.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/imagination/Kconfig | 4 +-
drivers/gpu/drm/imagination/pvr_drv.c | 2 +-
drivers/gpu/drm/imagination/pvr_free_list.c | 2 +-
drivers/gpu/drm/imagination/pvr_gem.c | 74 ++++++++++-----------
drivers/gpu/drm/imagination/pvr_gem.h | 12 ++--
5 files changed, 47 insertions(+), 47 deletions(-)
diff --git a/drivers/gpu/drm/imagination/Kconfig b/drivers/gpu/drm/imagination/Kconfig
index 0482bfcefdde..ee796c9cfdf2 100644
--- a/drivers/gpu/drm/imagination/Kconfig
+++ b/drivers/gpu/drm/imagination/Kconfig
@@ -9,9 +9,9 @@ config DRM_POWERVR
depends on PM
depends on POWER_SEQUENCING || !POWER_SEQUENCING
select DRM_EXEC
- select DRM_GEM_SHMEM_HELPER
- select DRM_SCHED
+ select DRM_GEM_UMA_HELPER
select DRM_GPUVM
+ select DRM_SCHED
select FW_LOADER
help
Choose this option if you have a system that has an Imagination
diff --git a/drivers/gpu/drm/imagination/pvr_drv.c b/drivers/gpu/drm/imagination/pvr_drv.c
index 916b40ced7eb..61bcbbef208c 100644
--- a/drivers/gpu/drm/imagination/pvr_drv.c
+++ b/drivers/gpu/drm/imagination/pvr_drv.c
@@ -1392,7 +1392,7 @@ static struct drm_driver pvr_drm_driver = {
.minor = PVR_DRIVER_MINOR,
.patchlevel = PVR_DRIVER_PATCHLEVEL,
- .gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table,
+ .gem_prime_import_sg_table = drm_gem_uma_prime_import_sg_table,
.gem_create_object = pvr_gem_create_object,
};
diff --git a/drivers/gpu/drm/imagination/pvr_free_list.c b/drivers/gpu/drm/imagination/pvr_free_list.c
index 5228e214491c..5b43f7ca2a6c 100644
--- a/drivers/gpu/drm/imagination/pvr_free_list.c
+++ b/drivers/gpu/drm/imagination/pvr_free_list.c
@@ -281,7 +281,7 @@ pvr_free_list_insert_node_locked(struct pvr_free_list_node *free_list_node)
offset = (start_page * FREE_LIST_ENTRY_SIZE) &
~((u64)ROGUE_BIF_PM_FREELIST_BASE_ADDR_ALIGNSIZE - 1);
- sgt = drm_gem_shmem_get_pages_sgt(&free_list_node->mem_obj->base);
+ sgt = drm_gem_uma_get_pages_sgt(&free_list_node->mem_obj->base);
if (WARN_ON(IS_ERR(sgt)))
return PTR_ERR(sgt);
diff --git a/drivers/gpu/drm/imagination/pvr_gem.c b/drivers/gpu/drm/imagination/pvr_gem.c
index a66cf082af24..f29c9808f4e2 100644
--- a/drivers/gpu/drm/imagination/pvr_gem.c
+++ b/drivers/gpu/drm/imagination/pvr_gem.c
@@ -25,30 +25,30 @@
static void pvr_gem_object_free(struct drm_gem_object *obj)
{
- drm_gem_shmem_object_free(obj);
+ drm_gem_uma_object_free(obj);
}
static int pvr_gem_mmap(struct drm_gem_object *gem_obj, struct vm_area_struct *vma)
{
struct pvr_gem_object *pvr_obj = gem_to_pvr_gem(gem_obj);
- struct drm_gem_shmem_object *shmem_obj = shmem_gem_from_pvr_gem(pvr_obj);
+ struct drm_gem_uma_object *uma_obj = uma_gem_from_pvr_gem(pvr_obj);
if (!(pvr_obj->flags & DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS))
return -EINVAL;
- return drm_gem_shmem_mmap(shmem_obj, vma);
+ return drm_gem_uma_mmap(uma_obj, vma);
}
static const struct drm_gem_object_funcs pvr_gem_object_funcs = {
.free = pvr_gem_object_free,
- .print_info = drm_gem_shmem_object_print_info,
- .pin = drm_gem_shmem_object_pin,
- .unpin = drm_gem_shmem_object_unpin,
- .get_sg_table = drm_gem_shmem_object_get_sg_table,
- .vmap = drm_gem_shmem_object_vmap,
- .vunmap = drm_gem_shmem_object_vunmap,
+ .print_info = drm_gem_uma_object_print_info,
+ .pin = drm_gem_uma_object_pin,
+ .unpin = drm_gem_uma_object_unpin,
+ .get_sg_table = drm_gem_uma_object_get_sg_table,
+ .vmap = drm_gem_uma_object_vmap,
+ .vunmap = drm_gem_uma_object_vunmap,
.mmap = pvr_gem_mmap,
- .vm_ops = &drm_gem_shmem_vm_ops,
+ .vm_ops = &drm_gem_uma_vm_ops,
};
/**
@@ -195,25 +195,25 @@ pvr_gem_object_from_handle(struct pvr_file *pvr_file, u32 handle)
void *
pvr_gem_object_vmap(struct pvr_gem_object *pvr_obj)
{
- struct drm_gem_shmem_object *shmem_obj = shmem_gem_from_pvr_gem(pvr_obj);
+ struct drm_gem_uma_object *uma_obj = uma_gem_from_pvr_gem(pvr_obj);
struct drm_gem_object *obj = gem_from_pvr_gem(pvr_obj);
struct iosys_map map;
int err;
dma_resv_lock(obj->resv, NULL);
- err = drm_gem_shmem_vmap_locked(shmem_obj, &map);
+ err = drm_gem_uma_vmap_locked(uma_obj, &map);
if (err)
goto err_unlock;
if (pvr_obj->flags & PVR_BO_CPU_CACHED) {
- struct device *dev = shmem_obj->base.dev->dev;
+ struct device *dev = uma_obj->base.dev->dev;
- /* If shmem_obj->sgt is NULL, that means the buffer hasn't been mapped
+ /* If uma_obj->sgt is NULL, that means the buffer hasn't been mapped
* in GPU space yet.
*/
- if (shmem_obj->sgt)
- dma_sync_sgtable_for_cpu(dev, shmem_obj->sgt, DMA_BIDIRECTIONAL);
+ if (uma_obj->sgt)
+ dma_sync_sgtable_for_cpu(dev, uma_obj->sgt, DMA_BIDIRECTIONAL);
}
dma_resv_unlock(obj->resv);
@@ -237,8 +237,8 @@ pvr_gem_object_vmap(struct pvr_gem_object *pvr_obj)
void
pvr_gem_object_vunmap(struct pvr_gem_object *pvr_obj)
{
- struct drm_gem_shmem_object *shmem_obj = shmem_gem_from_pvr_gem(pvr_obj);
- struct iosys_map map = IOSYS_MAP_INIT_VADDR(shmem_obj->vaddr);
+ struct drm_gem_uma_object *uma_obj = uma_gem_from_pvr_gem(pvr_obj);
+ struct iosys_map map = IOSYS_MAP_INIT_VADDR(uma_obj->vaddr);
struct drm_gem_object *obj = gem_from_pvr_gem(pvr_obj);
if (WARN_ON(!map.vaddr))
@@ -247,16 +247,16 @@ pvr_gem_object_vunmap(struct pvr_gem_object *pvr_obj)
dma_resv_lock(obj->resv, NULL);
if (pvr_obj->flags & PVR_BO_CPU_CACHED) {
- struct device *dev = shmem_obj->base.dev->dev;
+ struct device *dev = uma_obj->base.dev->dev;
- /* If shmem_obj->sgt is NULL, that means the buffer hasn't been mapped
+ /* If uma_obj->sgt is NULL, that means the buffer hasn't been mapped
* in GPU space yet.
*/
- if (shmem_obj->sgt)
- dma_sync_sgtable_for_device(dev, shmem_obj->sgt, DMA_BIDIRECTIONAL);
+ if (uma_obj->sgt)
+ dma_sync_sgtable_for_device(dev, uma_obj->sgt, DMA_BIDIRECTIONAL);
}
- drm_gem_shmem_vunmap_locked(shmem_obj, &map);
+ drm_gem_uma_vunmap_locked(uma_obj, &map);
dma_resv_unlock(obj->resv);
}
@@ -336,7 +336,7 @@ struct pvr_gem_object *
pvr_gem_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags)
{
struct drm_device *drm_dev = from_pvr_device(pvr_dev);
- struct drm_gem_shmem_object *shmem_obj;
+ struct drm_gem_uma_object *uma_obj;
struct pvr_gem_object *pvr_obj;
struct sg_table *sgt;
int err;
@@ -348,19 +348,19 @@ pvr_gem_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags)
if (device_get_dma_attr(drm_dev->dev) == DEV_DMA_COHERENT)
flags |= PVR_BO_CPU_CACHED;
- shmem_obj = drm_gem_shmem_create(drm_dev, size);
- if (IS_ERR(shmem_obj))
- return ERR_CAST(shmem_obj);
+ uma_obj = drm_gem_uma_create(drm_dev, size);
+ if (IS_ERR(uma_obj))
+ return ERR_CAST(uma_obj);
- shmem_obj->pages_mark_dirty_on_put = true;
- shmem_obj->map_wc = !(flags & PVR_BO_CPU_CACHED);
- pvr_obj = shmem_gem_to_pvr_gem(shmem_obj);
+ uma_obj->pages_mark_dirty_on_put = true;
+ uma_obj->map_wc = !(flags & PVR_BO_CPU_CACHED);
+ pvr_obj = uma_gem_to_pvr_gem(uma_obj);
pvr_obj->flags = flags;
- sgt = drm_gem_shmem_get_pages_sgt(shmem_obj);
+ sgt = drm_gem_uma_get_pages_sgt(uma_obj);
if (IS_ERR(sgt)) {
err = PTR_ERR(sgt);
- goto err_shmem_object_free;
+ goto err_uma_object_free;
}
dma_sync_sgtable_for_device(drm_dev->dev, sgt, DMA_BIDIRECTIONAL);
@@ -373,8 +373,8 @@ pvr_gem_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags)
return pvr_obj;
-err_shmem_object_free:
- drm_gem_shmem_free(shmem_obj);
+err_uma_object_free:
+ drm_gem_uma_free(uma_obj);
return ERR_PTR(err);
}
@@ -394,13 +394,13 @@ int
pvr_gem_get_dma_addr(struct pvr_gem_object *pvr_obj, u32 offset,
dma_addr_t *dma_addr_out)
{
- struct drm_gem_shmem_object *shmem_obj = shmem_gem_from_pvr_gem(pvr_obj);
+ struct drm_gem_uma_object *uma_obj = uma_gem_from_pvr_gem(pvr_obj);
u32 accumulated_offset = 0;
struct scatterlist *sgl;
unsigned int sgt_idx;
- WARN_ON(!shmem_obj->sgt);
- for_each_sgtable_dma_sg(shmem_obj->sgt, sgl, sgt_idx) {
+ WARN_ON(!uma_obj->sgt);
+ for_each_sgtable_dma_sg(uma_obj->sgt, sgl, sgt_idx) {
u32 new_offset = accumulated_offset + sg_dma_len(sgl);
if (offset >= accumulated_offset && offset < new_offset) {
diff --git a/drivers/gpu/drm/imagination/pvr_gem.h b/drivers/gpu/drm/imagination/pvr_gem.h
index c99f30cc6208..59223876b3f7 100644
--- a/drivers/gpu/drm/imagination/pvr_gem.h
+++ b/drivers/gpu/drm/imagination/pvr_gem.h
@@ -10,7 +10,7 @@
#include <uapi/drm/pvr_drm.h>
#include <drm/drm_gem.h>
-#include <drm/drm_gem_shmem_helper.h>
+#include <drm/drm_gem_uma_helper.h>
#include <drm/drm_mm.h>
#include <linux/bitfield.h>
@@ -82,12 +82,12 @@ struct pvr_file;
*/
struct pvr_gem_object {
/**
- * @base: The underlying &struct drm_gem_shmem_object.
+ * @base: The underlying &struct drm_gem_uma_object.
*
* Do not access this member directly, instead call
* shem_gem_from_pvr_gem().
*/
- struct drm_gem_shmem_object base;
+ struct drm_gem_uma_object base;
/**
* @flags: Options set at creation-time. Some of these options apply to
@@ -111,9 +111,9 @@ struct pvr_gem_object {
static_assert(offsetof(struct pvr_gem_object, base) == 0,
"offsetof(struct pvr_gem_object, base) not zero");
-#define shmem_gem_from_pvr_gem(pvr_obj) (&(pvr_obj)->base)
+#define uma_gem_from_pvr_gem(pvr_obj) (&(pvr_obj)->base)
-#define shmem_gem_to_pvr_gem(shmem_obj) container_of_const(shmem_obj, struct pvr_gem_object, base)
+#define uma_gem_to_pvr_gem(uma_obj) container_of_const(uma_obj, struct pvr_gem_object, base)
#define gem_from_pvr_gem(pvr_obj) (&(pvr_obj)->base.base)
@@ -134,7 +134,7 @@ struct pvr_gem_object *pvr_gem_object_from_handle(struct pvr_file *pvr_file,
static __always_inline struct sg_table *
pvr_gem_object_get_pages_sgt(struct pvr_gem_object *pvr_obj)
{
- return drm_gem_shmem_get_pages_sgt(shmem_gem_from_pvr_gem(pvr_obj));
+ return drm_gem_uma_get_pages_sgt(uma_gem_from_pvr_gem(pvr_obj));
}
void *pvr_gem_object_vmap(struct pvr_gem_object *pvr_obj);
--
2.52.0
next prev parent reply other threads:[~2025-12-09 14:02 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-09 13:41 [RFC][PATCH 00/13] drm: Introduce GEM-UMA memory management Thomas Zimmermann
2025-12-09 13:41 ` [PATCH 01/13] drm/gem-shmem: Fix typos in documentation Thomas Zimmermann
2025-12-11 10:00 ` Boris Brezillon
2025-12-11 12:03 ` Thomas Zimmermann
2025-12-09 13:41 ` [PATCH 02/13] drm/gem-shmem: Fix the MODULE_LICENSE() string Thomas Zimmermann
2025-12-11 10:01 ` Boris Brezillon
2025-12-11 12:04 ` Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 03/13] drm: Add GEM-UMA helpers for memory management Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 04/13] drm/gem-uma: Remove unused interfaces Thomas Zimmermann
2025-12-09 13:42 ` Thomas Zimmermann [this message]
2025-12-09 13:42 ` [PATCH 06/13] drm/lima: Use GEM-UMA helpers for memory management Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 07/13] drm/panfrost: " Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 08/13] drm/panthor: " Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 09/13] drm/v3d: " Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 10/13] drm/virtgpu: " Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 11/13] accel/amdxdna: " Thomas Zimmermann
2025-12-09 13:42 ` [PATCH 12/13] accel/ivpu: " Thomas Zimmermann
2025-12-09 14:24 ` Karol Wachowski
2025-12-09 14:25 ` Karol Wachowski
2025-12-09 13:42 ` [PATCH 13/13] accel/rocket: " Thomas Zimmermann
2025-12-09 14:27 ` [RFC][PATCH 00/13] drm: Introduce GEM-UMA " Boris Brezillon
2025-12-09 14:51 ` Thomas Zimmermann
2025-12-09 15:30 ` Boris Brezillon
2025-12-10 7:34 ` Thomas Zimmermann
2025-12-10 9:21 ` Boris Brezillon
2025-12-10 9:57 ` Thomas Zimmermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251209140141.94407-6-tzimmermann@suse.de \
--to=tzimmermann@suse.de \
--cc=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=boris.brezillon@collabora.com \
--cc=corbet@lwn.net \
--cc=dmitry.osipenko@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=frank.binns@imgtec.com \
--cc=gurchetansingh@chromium.org \
--cc=karol.wachowski@linux.intel.com \
--cc=kraxel@redhat.com \
--cc=lima@lists.freedesktop.org \
--cc=linux-doc@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=lizhi.hou@amd.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=maciej.falkowski@linux.intel.com \
--cc=mamin506@gmail.com \
--cc=matt.coster@imgtec.com \
--cc=mripard@kernel.org \
--cc=mwen@igalia.com \
--cc=ogabbay@kernel.org \
--cc=olvaffe@gmail.com \
--cc=robh@kernel.org \
--cc=simona@ffwll.ch \
--cc=steven.price@arm.com \
--cc=tomeu@tomeuvizoso.net \
--cc=virtualization@lists.linux.dev \
--cc=yuq825@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).