[RFT 2/5] drm/msm/gem: dma_map/unmap_sgtable()
From: Rob Clark
Date: Tue Oct 06 2026 - 09:11:44 EST
This should functionally be a no-op for us, since we are managing our
SMMU directly (dma_map_ops is NULL), but it populates the dma_len/
dma_address's so that we can use them for setting up pgtable mappings.
Signed-off-by: Rob Clark <robin.clark@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/msm/msm_gem.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 181b9ad32672..72e3cd8bb1e7 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -219,6 +219,15 @@ static struct page **get_pages(struct drm_gem_object *obj)
goto error;
}
+ ret = dma_map_sgtable(drm_dev_dma_dev(obj->dev),
+ msm_obj->sgt,
+ DMA_BIDIRECTIONAL,
+ DMA_ATTR_SKIP_CPU_SYNC);
+ if (ret) {
+ DRM_DEV_ERROR(dev->dev, "could not map sgtable: %d\n", ret);
+ goto error;
+ }
+
update_device_mem(dev->dev_private, obj->size);
/* For non-cached buffers, ensure the new pages are clean
@@ -233,6 +242,8 @@ static struct page **get_pages(struct drm_gem_object *obj)
return msm_obj->pages;
error:
+ if (!IS_ERR(msm_obj->sgt))
+ drm_prime_gem_destroy(obj, msm_obj->sgt);
msm_obj->sgt = NULL;
drm_gem_put_pages(obj, msm_obj->pages, false, false);
@@ -260,6 +271,11 @@ static void put_pages(struct drm_gem_object *obj)
if (msm_obj->flags & MSM_BO_WC)
sync_for_cpu(msm_obj);
+ dma_unmap_sgtable(drm_dev_dma_dev(obj->dev),
+ msm_obj->sgt,
+ DMA_BIDIRECTIONAL,
+ DMA_ATTR_SKIP_CPU_SYNC);
+
sg_free_table(msm_obj->sgt);
kfree(msm_obj->sgt);
msm_obj->sgt = NULL;
--
2.55.0