---
drm_prime_pages_to_sg() has no real dependency on PRIME/dma-buf interfaces.
It is a generic helper that converts a page array into a scatter/gather
table via dma_map_sg_attrs. Nothing in its implementation touches struct
dma_buf or import/export logic.
---
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 6 ++---
drivers/gpu/drm/drm_gem.c | 35 ++++++++++++++++++++++++++
drivers/gpu/drm/drm_gem_shmem_helper.c | 2 +-
drivers/gpu/drm/drm_prime.c | 38 -----------------------------
drivers/gpu/drm/etnaviv/etnaviv_gem.c | 3 +--
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 3 ++-
drivers/gpu/drm/loongson/lsdc_gem.c | 3 +--
drivers/gpu/drm/msm/msm_gem.c | 2 +-
drivers/gpu/drm/msm/msm_gem_prime.c | 2 +-
drivers/gpu/drm/nouveau/nouveau_prime.c | 4 +--
drivers/gpu/drm/panthor/panthor_gem.c | 6 ++---
drivers/gpu/drm/radeon/radeon_prime.c | 5 ++--
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 6 ++---
drivers/gpu/drm/tegra/gem.c | 4 +--
drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 4 +--
drivers/gpu/drm/xe/xe_dma_buf.c | 6 ++---
drivers/gpu/drm/xen/xen_drm_front_gem.c | 2 +-
include/drm/drm_gem.h | 5 +++-
include/drm/drm_prime.h | 2 --
19 files changed, 68 insertions(+), 70 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
index b33c300e26e2..c9a98aec7eb6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
@@ -203,9 +203,9 @@ static struct sg_table *amdgpu_dma_buf_map(struct
dma_buf_attachment *attach,
switch (bo->tbo.resource->mem_type) {
case TTM_PL_TT:
- sgt = drm_prime_pages_to_sg(obj->dev,
- bo->tbo.ttm->pages,
- bo->tbo.ttm->num_pages);
+ sgt = drm_pages_to_sg(obj->dev,
+ bo->tbo.ttm->pages,
+ bo->tbo.ttm->num_pages);
if (IS_ERR(sgt))
return sgt;
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 018df97d590d..22c8a3b5f667 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -780,6 +780,41 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct
page **pages,
}
EXPORT_SYMBOL(drm_gem_put_pages);
+/**
+ * drm_pages_to_sg - converts a page array into an sg list
+ * @dev: DRM device
+ * @pages: pointer to the array of page pointers to convert
+ * @nr_pages: length of the page vector
+ *
+ * This helper creates an sg table object from a set of pages.
+ * This is useful for implementing &drm_gem_object_funcs.get_sg_table.
+ */
+struct sg_table *drm_pages_to_sg(struct drm_device *dev,
+ struct page **pages, unsigned int nr_pages)
+{
+ struct sg_table *sg;
+ size_t max_segment = 0;
+ int err;
+
+ sg = kmalloc_obj(struct sg_table);
+ if (!sg)
+ return ERR_PTR(-ENOMEM);
+
+ if (dev)
+ max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev));
+ if (max_segment == 0)
+ max_segment = UINT_MAX;
+ err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0,
+ (unsigned long)nr_pages <<
PAGE_SHIFT,
+ max_segment, GFP_KERNEL);
+ if (err) {
+ kfree(sg);
+ sg = ERR_PTR(err);
+ }
+ return sg;
+}
+EXPORT_SYMBOL(drm_pages_to_sg);
+
static int objects_lookup(struct drm_file *filp, u32 *handle, int count,
struct drm_gem_object **objs)
{
diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c
b/drivers/gpu/drm/drm_gem_shmem_helper.c
index 22ec52e2ffb8..144d088a477f 100644
--- a/drivers/gpu/drm/drm_gem_shmem_helper.c
+++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
@@ -825,7 +825,7 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct
drm_gem_shmem_object *shmem)
drm_WARN_ON(obj->dev, drm_gem_is_imported(obj));
- return drm_prime_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT);
+ return drm_pages_to_sg(obj->dev, shmem->pages, obj->size >> PAGE_SHIFT);
}
EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table);
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 9b44c78cd77f..54539a8929c1 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -835,44 +835,6 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =
{
.vunmap = drm_gem_dmabuf_vunmap,
};
-/**
- * drm_prime_pages_to_sg - converts a page array into an sg list
- * @dev: DRM device
- * @pages: pointer to the array of page pointers to convert
- * @nr_pages: length of the page vector
- *
- * This helper creates an sg table object from a set of pages
- * the driver is responsible for mapping the pages into the
- * importers address space for use with dma_buf itself.
- *
- * This is useful for implementing &drm_gem_object_funcs.get_sg_table.
- */
-struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev,
- struct page **pages, unsigned int
nr_pages)
-{
- struct sg_table *sg;
- size_t max_segment = 0;
- int err;
-
- sg = kmalloc_obj(struct sg_table);
- if (!sg)
- return ERR_PTR(-ENOMEM);
-
- if (dev)
- max_segment = dma_max_mapping_size(drm_dev_dma_dev(dev));
- if (max_segment == 0)
- max_segment = UINT_MAX;
- err = sg_alloc_table_from_pages_segment(sg, pages, nr_pages, 0,
- (unsigned long)nr_pages <<
PAGE_SHIFT,
- max_segment, GFP_KERNEL);
- if (err) {
- kfree(sg);
- sg = ERR_PTR(err);
- }
- return sg;
-}
-EXPORT_SYMBOL(drm_prime_pages_to_sg);
-
/**
* drm_prime_get_contiguous_size - returns the contiguous size of the buffer
* @sgt: sg_table describing the buffer to check
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index b0436a1e103f..a8e8614f8210 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -3,7 +3,6 @@
* Copyright (C) 2015-2018 Etnaviv Project
*/
-#include <drm/drm_prime.h>
#include <drm/drm_print.h>
#include <linux/dma-mapping.h>
#include <linux/shmem_fs.h>
@@ -104,7 +103,7 @@ struct page **etnaviv_gem_get_pages(struct
etnaviv_gem_object *etnaviv_obj)
unsigned int npages = etnaviv_obj->base.size >> PAGE_SHIFT;
struct sg_table *sgt;
- sgt = drm_prime_pages_to_sg(dev, etnaviv_obj->pages, npages);
+ sgt = drm_pages_to_sg(dev, etnaviv_obj->pages, npages);
if (IS_ERR(sgt)) {
dev_err(dev->dev, "failed to allocate sgt: %ld\n",
PTR_ERR(sgt));
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
index 6757ae6ec304..f44484325ddb 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
@@ -3,6 +3,7 @@
* Copyright (C) 2014-2018 Etnaviv Project
*/
+#include <drm/drm_gem.h>
#include <drm/drm_prime.h>
#include <linux/dma-buf.h>
#include <linux/module.h>
@@ -22,7 +23,7 @@ struct sg_table *etnaviv_gem_prime_get_sg_table(struct
drm_gem_object *obj)
if (WARN_ON(!etnaviv_obj->pages)) /* should have already pinned! */
return ERR_PTR(-EINVAL);
- return drm_prime_pages_to_sg(obj->dev, etnaviv_obj->pages, npages);
+ return drm_pages_to_sg(obj->dev, etnaviv_obj->pages, npages);
}
int etnaviv_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
diff --git a/drivers/gpu/drm/loongson/lsdc_gem.c
b/drivers/gpu/drm/loongson/lsdc_gem.c
index 2fb03487c983..37160228244c 100644
--- a/drivers/gpu/drm/loongson/lsdc_gem.c
+++ b/drivers/gpu/drm/loongson/lsdc_gem.c
@@ -9,7 +9,6 @@
#include <drm/drm_dumb_buffers.h>
#include <drm/drm_file.h>
#include <drm/drm_gem.h>
-#include <drm/drm_prime.h>
#include <drm/drm_print.h>
#include "lsdc_drv.h"
@@ -51,7 +50,7 @@ static struct sg_table *lsdc_gem_prime_get_sg_table(struct
drm_gem_object *obj)
return ERR_PTR(-ENOMEM);
}
- return drm_prime_pages_to_sg(obj->dev, tt->pages, tt->num_pages);
+ return drm_pages_to_sg(obj->dev, tt->pages, tt->num_pages);
}
static void lsdc_gem_object_free(struct drm_gem_object *obj)
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index efd3d3c9a449..7e3418290c22 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -207,7 +207,7 @@ static struct page **get_pages(struct drm_gem_object *obj)
msm_obj->pages = p;
- msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages);
+ msm_obj->sgt = drm_pages_to_sg(obj->dev, p, npages);
if (IS_ERR(msm_obj->sgt)) {
void *ptr = ERR_CAST(msm_obj->sgt);
diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c
index 036d34c674d9..d25393a9e549 100644
--- a/drivers/gpu/drm/msm/msm_gem_prime.c
+++ b/drivers/gpu/drm/msm/msm_gem_prime.c
@@ -23,7 +23,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct
drm_gem_object *obj)
if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */
return ERR_PTR(-ENOMEM);
- return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages);
+ return drm_pages_to_sg(obj->dev, msm_obj->pages, npages);
}
int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c
b/drivers/gpu/drm/nouveau/nouveau_prime.c
index caab60fc62f6..b95f2f07df74 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -32,8 +32,8 @@ struct sg_table *nouveau_gem_prime_get_sg_table(struct
drm_gem_object *obj)
{
struct nouveau_bo *nvbo = nouveau_gem_object(obj);
- return drm_prime_pages_to_sg(obj->dev, nvbo->bo.ttm->pages,
- nvbo->bo.ttm->num_pages);
+ return drm_pages_to_sg(obj->dev, nvbo->bo.ttm->pages,
+ nvbo->bo.ttm->num_pages);
}
struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c
b/drivers/gpu/drm/panthor/panthor_gem.c
index 9855df738194..ec530d254fa4 100644
--- a/drivers/gpu/drm/panthor/panthor_gem.c
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
@@ -321,8 +321,8 @@ panthor_gem_dev_map_get_sgt_locked(struct
panthor_gem_object *bo)
if (ret)
return ERR_PTR(ret);
- sgt = drm_prime_pages_to_sg(bo->base.dev, bo->backing.pages,
- bo->base.size >> PAGE_SHIFT);
+ sgt = drm_pages_to_sg(bo->base.dev, bo->backing.pages,
+ bo->base.size >> PAGE_SHIFT);
if (IS_ERR(sgt))
return sgt;
@@ -702,7 +702,7 @@ static struct sg_table *panthor_gem_get_sg_table(struct drm_gem_object *obj)
drm_WARN_ON_ONCE(obj->dev, !bo->backing.pages);
drm_WARN_ON_ONCE(obj->dev, !refcount_read(&bo->backing.pin_count));
- return drm_prime_pages_to_sg(obj->dev, bo->backing.pages, obj->size >> PAGE_SHIFT);
+ return drm_pages_to_sg(obj->dev, bo->backing.pages, obj->size >>
PAGE_SHIFT);
}
static int panthor_gem_vmap_locked(struct drm_gem_object *obj,
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c
b/drivers/gpu/drm/radeon/radeon_prime.c
index a77881f035e7..4cfc4282a59c 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -26,6 +26,7 @@
#include <linux/dma-buf.h>
+#include <drm/drm_gem.h>
#include <drm/drm_prime.h>
#include <drm/radeon_drm.h>
@@ -38,8 +39,8 @@ struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj)
{
struct radeon_bo *bo = gem_to_radeon_bo(obj);
- return drm_prime_pages_to_sg(obj->dev, bo->tbo.ttm->pages,
- bo->tbo.ttm->num_pages);
+ return drm_pages_to_sg(obj->dev, bo->tbo.ttm->pages,
+ bo->tbo.ttm->num_pages);
}
struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index b188539dca0b..7897da0becf4 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -89,8 +89,8 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object
*rk_obj)
rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT;
- rk_obj->sgt = drm_prime_pages_to_sg(rk_obj->base.dev,
- rk_obj->pages, rk_obj->num_pages);
+ rk_obj->sgt = drm_pages_to_sg(rk_obj->base.dev,
+ rk_obj->pages, rk_obj->num_pages);
if (IS_ERR(rk_obj->sgt)) {
ret = PTR_ERR(rk_obj->sgt);
goto err_put_pages;
@@ -432,7 +432,7 @@ struct sg_table *rockchip_gem_prime_get_sg_table(struct
drm_gem_object *obj)
int ret;
if (rk_obj->pages)
- return drm_prime_pages_to_sg(obj->dev, rk_obj->pages,
rk_obj->num_pages);
+ return drm_pages_to_sg(obj->dev, rk_obj->pages,
rk_obj->num_pages);
sgt = kzalloc_obj(*sgt);
if (!sgt)
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 436394e04812..701af672b4e5 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -17,7 +17,7 @@
#include <drm/drm_drv.h>
#include <drm/drm_dumb_buffers.h>
-#include <drm/drm_prime.h>
+#include <drm/drm_gem.h>
#include "drm.h"
#include "gem.h"
@@ -352,7 +352,7 @@ static int tegra_bo_get_pages(struct drm_device *drm,
struct tegra_bo *bo)
bo->num_pages = bo->gem.size >> PAGE_SHIFT;
- bo->sgt = drm_prime_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages);
+ bo->sgt = drm_pages_to_sg(bo->gem.dev, bo->pages, bo->num_pages);
if (IS_ERR(bo->sgt)) {
err = PTR_ERR(bo->sgt);
goto put_pages;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
index 39f8c46550c2..c9e7f2e3668c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c
@@ -28,7 +28,7 @@
#include "vmwgfx_bo.h"
#include "vmwgfx_drv.h"
-#include "drm/drm_prime.h"
+#include "drm/drm_gem.h"
#include "drm/drm_gem_ttm_helper.h"
#include <linux/debugfs.h>
@@ -76,7 +76,7 @@ static struct sg_table *vmw_gem_object_get_sg_table(struct
drm_gem_object *obj)
if (vmw_tt->vsgt.sgt)
return vmw_tt->vsgt.sgt;
- return drm_prime_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages, vmw_tt->dma_ttm.num_pages);
+ return drm_pages_to_sg(obj->dev, vmw_tt->dma_ttm.pages,
vmw_tt->dma_ttm.num_pages);
}
static int vmw_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map)
diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c
index 8a920e58245c..f0fe80706b79 100644
--- a/drivers/gpu/drm/xe/xe_dma_buf.c
+++ b/drivers/gpu/drm/xe/xe_dma_buf.c
@@ -118,9 +118,9 @@ static struct sg_table *xe_dma_buf_map(struct
dma_buf_attachment *attach,
switch (bo->ttm.resource->mem_type) {
case XE_PL_TT:
- sgt = drm_prime_pages_to_sg(obj->dev,
- bo->ttm.ttm->pages,
- obj->size >> PAGE_SHIFT);
+ sgt = drm_pages_to_sg(obj->dev,
+ bo->ttm.ttm->pages,
+ obj->size >> PAGE_SHIFT);
if (IS_ERR(sgt))
return sgt;
diff --git a/drivers/gpu/drm/xen/xen_drm_front_gem.c b/drivers/gpu/drm/xen/xen_drm_front_gem.c
index eec4c1da3f9e..a4a7c7f2c91c 100644
--- a/drivers/gpu/drm/xen/xen_drm_front_gem.c
+++ b/drivers/gpu/drm/xen/xen_drm_front_gem.c
@@ -236,7 +236,7 @@ struct sg_table *xen_drm_front_gem_get_sg_table(struct
drm_gem_object *gem_obj)
if (!xen_obj->pages)
return ERR_PTR(-ENOMEM);
- return drm_prime_pages_to_sg(gem_obj->dev,
+ return drm_pages_to_sg(gem_obj->dev,
xen_obj->pages, xen_obj->num_pages);
}
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index 885244e375d3..7b9cc6335689 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -155,7 +155,7 @@ struct drm_gem_object_funcs {
* here cannot be used for sg tables pointing at driver private memory
* ranges.
*
- * See also drm_prime_pages_to_sg().
+ * See also drm_pages_to_sg().
*/
struct sg_table *(*get_sg_table)(struct drm_gem_object *obj);
@@ -589,6 +589,9 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj);
void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
bool dirty, bool accessed);
+struct sg_table *drm_pages_to_sg(struct drm_device *dev,
+ struct page **pages, unsigned int nr_pages);
+
void drm_gem_lock(struct drm_gem_object *obj);
void drm_gem_unlock(struct drm_gem_object *obj);
diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h
index f50f862f0d8b..603e16a40ae7 100644
--- a/include/drm/drm_prime.h
+++ b/include/drm/drm_prime.h
@@ -92,8 +92,6 @@ void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, struct
iosys_map *map);
int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct
*vma);
int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma);
-struct sg_table *drm_prime_pages_to_sg(struct drm_device *dev,
- struct page **pages, unsigned int
nr_pages);
struct dma_buf *drm_gem_prime_export(struct drm_gem_object *obj,
int flags);
---
base-commit: 48dd37d1fef33fbf42f1d6887c61e242fd21d00d
change-id: 20260724-get_pages-e2e91c53eaa3
Best regards,
--
Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx>