From: Rob Clark <robin.clark@oss.qualcomm.com>
To: dri-devel@lists.freedesktop.org
Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org,
Connor Abbott <cwabbott0@gmail.com>,
Antonino Maniscalco <antomani103@gmail.com>,
Danilo Krummrich <dakr@redhat.com>,
Rob Clark <robdclark@chromium.org>,
Rob Clark <robin.clark@oss.qualcomm.com>,
Sean Paul <sean@poorly.run>,
Konrad Dybcio <konradybcio@kernel.org>,
Dmitry Baryshkov <lumag@kernel.org>,
Abhinav Kumar <abhinav.kumar@linux.dev>,
Jessica Zhang <jessica.zhang@oss.qualcomm.com>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
linux-kernel@vger.kernel.org (open list)
Subject: [PATCH v9 17/42] drm/msm: Add mmu support for non-zero offset
Date: Sun, 29 Jun 2025 13:13:00 -0700 [thread overview]
Message-ID: <20250629201530.25775-18-robin.clark@oss.qualcomm.com> (raw)
In-Reply-To: <20250629201530.25775-1-robin.clark@oss.qualcomm.com>
From: Rob Clark <robdclark@chromium.org>
Only needs to be supported for iopgtables mmu, the other cases are
either only used for kernel managed mappings (where offset is always
zero) or devices which do not support sparse bindings.
Signed-off-by: Rob Clark <robdclark@chromium.org>
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Tested-by: Antonino Maniscalco <antomani103@gmail.com>
Reviewed-by: Antonino Maniscalco <antomani103@gmail.com>
---
drivers/gpu/drm/msm/adreno/a2xx_gpummu.c | 5 ++++-
drivers/gpu/drm/msm/msm_gem.c | 4 ++--
drivers/gpu/drm/msm/msm_gem.h | 4 ++--
drivers/gpu/drm/msm/msm_gem_vma.c | 13 +++++++------
drivers/gpu/drm/msm/msm_iommu.c | 22 ++++++++++++++++++++--
drivers/gpu/drm/msm/msm_mmu.h | 2 +-
6 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpummu.c b/drivers/gpu/drm/msm/adreno/a2xx_gpummu.c
index 4280f71e472a..0407c9bc8c1b 100644
--- a/drivers/gpu/drm/msm/adreno/a2xx_gpummu.c
+++ b/drivers/gpu/drm/msm/adreno/a2xx_gpummu.c
@@ -29,13 +29,16 @@ static void a2xx_gpummu_detach(struct msm_mmu *mmu)
}
static int a2xx_gpummu_map(struct msm_mmu *mmu, uint64_t iova,
- struct sg_table *sgt, size_t len, int prot)
+ struct sg_table *sgt, size_t off, size_t len,
+ int prot)
{
struct a2xx_gpummu *gpummu = to_a2xx_gpummu(mmu);
unsigned idx = (iova - GPUMMU_VA_START) / GPUMMU_PAGE_SIZE;
struct sg_dma_page_iter dma_iter;
unsigned prot_bits = 0;
+ WARN_ON(off != 0);
+
if (prot & IOMMU_WRITE)
prot_bits |= 1;
if (prot & IOMMU_READ)
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 20d5e4b4d057..5c71a4be0dfa 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -453,7 +453,7 @@ static struct drm_gpuva *get_vma_locked(struct drm_gem_object *obj,
vma = lookup_vma(obj, vm);
if (!vma) {
- vma = msm_gem_vma_new(vm, obj, range_start, range_end);
+ vma = msm_gem_vma_new(vm, obj, 0, range_start, range_end);
} else {
GEM_WARN_ON(vma->va.addr < range_start);
GEM_WARN_ON((vma->va.addr + obj->size) > range_end);
@@ -491,7 +491,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct drm_gpuva *vma)
if (IS_ERR(pages))
return PTR_ERR(pages);
- return msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
+ return msm_gem_vma_map(vma, prot, msm_obj->sgt);
}
void msm_gem_unpin_locked(struct drm_gem_object *obj)
diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h
index a18872ab1393..0e7b17b2093b 100644
--- a/drivers/gpu/drm/msm/msm_gem.h
+++ b/drivers/gpu/drm/msm/msm_gem.h
@@ -110,9 +110,9 @@ struct msm_gem_vma {
struct drm_gpuva *
msm_gem_vma_new(struct drm_gpuvm *vm, struct drm_gem_object *obj,
- u64 range_start, u64 range_end);
+ u64 offset, u64 range_start, u64 range_end);
void msm_gem_vma_purge(struct drm_gpuva *vma);
-int msm_gem_vma_map(struct drm_gpuva *vma, int prot, struct sg_table *sgt, int size);
+int msm_gem_vma_map(struct drm_gpuva *vma, int prot, struct sg_table *sgt);
void msm_gem_vma_close(struct drm_gpuva *vma);
struct msm_gem_object {
diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c
index df8eb910ca31..ef0efd87e4a6 100644
--- a/drivers/gpu/drm/msm/msm_gem_vma.c
+++ b/drivers/gpu/drm/msm/msm_gem_vma.c
@@ -38,8 +38,7 @@ void msm_gem_vma_purge(struct drm_gpuva *vma)
/* Map and pin vma: */
int
-msm_gem_vma_map(struct drm_gpuva *vma, int prot,
- struct sg_table *sgt, int size)
+msm_gem_vma_map(struct drm_gpuva *vma, int prot, struct sg_table *sgt)
{
struct msm_gem_vma *msm_vma = to_msm_vma(vma);
struct msm_gem_vm *vm = to_msm_vm(vma->vm);
@@ -62,8 +61,9 @@ msm_gem_vma_map(struct drm_gpuva *vma, int prot,
* Revisit this if we can come up with a scheme to pre-alloc pages
* for the pgtable in map/unmap ops.
*/
- ret = vm->mmu->funcs->map(vm->mmu, vma->va.addr, sgt, size, prot);
-
+ ret = vm->mmu->funcs->map(vm->mmu, vma->va.addr, sgt,
+ vma->gem.offset, vma->va.range,
+ prot);
if (ret) {
msm_vma->mapped = false;
}
@@ -93,7 +93,7 @@ void msm_gem_vma_close(struct drm_gpuva *vma)
/* Create a new vma and allocate an iova for it */
struct drm_gpuva *
msm_gem_vma_new(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj,
- u64 range_start, u64 range_end)
+ u64 offset, u64 range_start, u64 range_end)
{
struct msm_gem_vm *vm = to_msm_vm(gpuvm);
struct drm_gpuvm_bo *vm_bo;
@@ -107,6 +107,7 @@ msm_gem_vma_new(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj,
return ERR_PTR(-ENOMEM);
if (vm->managed) {
+ BUG_ON(offset != 0);
ret = drm_mm_insert_node_in_range(&vm->mm, &vma->node,
obj->size, PAGE_SIZE, 0,
range_start, range_end, 0);
@@ -120,7 +121,7 @@ msm_gem_vma_new(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj,
GEM_WARN_ON((range_end - range_start) > obj->size);
- drm_gpuva_init(&vma->base, range_start, range_end - range_start, obj, 0);
+ drm_gpuva_init(&vma->base, range_start, range_end - range_start, obj, offset);
vma->mapped = false;
ret = drm_gpuva_insert(&vm->base, &vma->base);
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
index 739ce2c283a4..3c2eb59bfd49 100644
--- a/drivers/gpu/drm/msm/msm_iommu.c
+++ b/drivers/gpu/drm/msm/msm_iommu.c
@@ -113,7 +113,8 @@ static int msm_iommu_pagetable_unmap(struct msm_mmu *mmu, u64 iova,
}
static int msm_iommu_pagetable_map(struct msm_mmu *mmu, u64 iova,
- struct sg_table *sgt, size_t len, int prot)
+ struct sg_table *sgt, size_t off, size_t len,
+ int prot)
{
struct msm_iommu_pagetable *pagetable = to_pagetable(mmu);
struct io_pgtable_ops *ops = pagetable->pgtbl_ops;
@@ -125,6 +126,19 @@ static int msm_iommu_pagetable_map(struct msm_mmu *mmu, u64 iova,
size_t size = sg->length;
phys_addr_t phys = sg_phys(sg);
+ if (!len)
+ break;
+
+ if (size <= off) {
+ off -= size;
+ continue;
+ }
+
+ phys += off;
+ size -= off;
+ size = min_t(size_t, size, len);
+ off = 0;
+
while (size) {
size_t pgsize, count, mapped = 0;
int ret;
@@ -140,6 +154,7 @@ static int msm_iommu_pagetable_map(struct msm_mmu *mmu, u64 iova,
phys += mapped;
addr += mapped;
size -= mapped;
+ len -= mapped;
if (ret) {
msm_iommu_pagetable_unmap(mmu, iova, addr - iova);
@@ -388,11 +403,14 @@ static void msm_iommu_detach(struct msm_mmu *mmu)
}
static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
- struct sg_table *sgt, size_t len, int prot)
+ struct sg_table *sgt, size_t off, size_t len,
+ int prot)
{
struct msm_iommu *iommu = to_msm_iommu(mmu);
size_t ret;
+ WARN_ON(off != 0);
+
/* The arm-smmu driver expects the addresses to be sign extended */
if (iova & BIT_ULL(48))
iova |= GENMASK_ULL(63, 49);
diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h
index 0c694907140d..9d61999f4d42 100644
--- a/drivers/gpu/drm/msm/msm_mmu.h
+++ b/drivers/gpu/drm/msm/msm_mmu.h
@@ -12,7 +12,7 @@
struct msm_mmu_funcs {
void (*detach)(struct msm_mmu *mmu);
int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
- size_t len, int prot);
+ size_t off, size_t len, int prot);
int (*unmap)(struct msm_mmu *mmu, uint64_t iova, size_t len);
void (*destroy)(struct msm_mmu *mmu);
void (*set_stall)(struct msm_mmu *mmu, bool enable);
--
2.50.0
next prev parent reply other threads:[~2025-06-29 20:16 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-29 20:12 [PATCH v9 00/42] drm/msm: sparse / "VM_BIND" support Rob Clark
2025-06-29 20:12 ` [PATCH v9 01/42] drm/gpuvm: Fix doc comments Rob Clark
2025-06-29 20:12 ` [PATCH v9 02/42] drm/gpuvm: Add locking helpers Rob Clark
2025-06-29 20:12 ` [PATCH v9 03/42] drm/gem: Add ww_acquire_ctx support to drm_gem_lru_scan() Rob Clark
2025-06-29 20:12 ` [PATCH v9 04/42] drm/msm: Rename msm_file_private -> msm_context Rob Clark
2025-06-29 20:12 ` [PATCH v9 05/42] drm/msm: Improve msm_context comments Rob Clark
2025-06-29 20:12 ` [PATCH v9 06/42] drm/msm: Rename msm_gem_address_space -> msm_gem_vm Rob Clark
2025-06-29 20:12 ` [PATCH v9 07/42] drm/msm: Remove vram carveout support Rob Clark
2025-06-29 20:12 ` [PATCH v9 08/42] drm/msm: Collapse vma allocation and initialization Rob Clark
2025-06-29 20:12 ` [PATCH v9 09/42] drm/msm: Collapse vma close and delete Rob Clark
2025-06-29 20:12 ` [PATCH v9 10/42] drm/msm: Don't close VMAs on purge Rob Clark
2025-06-29 20:12 ` [PATCH v9 11/42] drm/msm: Stop passing vm to msm_framebuffer Rob Clark
2025-06-29 20:12 ` [PATCH v9 12/42] drm/msm: Refcount framebuffer pins Rob Clark
2025-06-29 20:12 ` [PATCH v9 13/42] drm/msm: drm_gpuvm conversion Rob Clark
2025-06-29 20:12 ` [PATCH v9 14/42] drm/msm: Convert vm locking Rob Clark
2025-08-12 8:58 ` Danilo Krummrich
2025-08-13 1:52 ` Rob Clark
2025-06-29 20:12 ` [PATCH v9 15/42] drm/msm: Use drm_gpuvm types more Rob Clark
2025-06-29 20:12 ` [PATCH v9 16/42] drm/msm: Split out helper to get iommu prot flags Rob Clark
2025-06-29 20:13 ` Rob Clark [this message]
2025-06-29 20:13 ` [PATCH v9 18/42] drm/msm: Add PRR support Rob Clark
2025-06-29 20:13 ` [PATCH v9 19/42] drm/msm: Rename msm_gem_vma_purge() -> _unmap() Rob Clark
2025-06-29 20:13 ` [PATCH v9 20/42] drm/msm: Drop queued submits on lastclose() Rob Clark
2025-06-29 20:13 ` [PATCH v9 21/42] drm/msm: Lazily create context VM Rob Clark
2025-06-29 20:13 ` [PATCH v9 22/42] drm/msm: Add opt-in for VM_BIND Rob Clark
2025-06-29 20:13 ` [PATCH v9 23/42] drm/msm: Mark VM as unusable on GPU hangs Rob Clark
2025-06-29 20:13 ` [PATCH v9 24/42] drm/msm: Add _NO_SHARE flag Rob Clark
2025-06-29 20:13 ` [PATCH v9 25/42] drm/msm: Crashdump prep for sparse mappings Rob Clark
2025-06-29 20:13 ` [PATCH v9 26/42] drm/msm: rd dumping " Rob Clark
2025-06-29 20:13 ` [PATCH v9 27/42] drm/msm: Crashdump support for sparse Rob Clark
2025-06-29 20:13 ` [PATCH v9 28/42] drm/msm: rd dumping " Rob Clark
2025-06-29 20:13 ` [PATCH v9 29/42] drm/msm: Extract out syncobj helpers Rob Clark
2025-06-29 20:13 ` [PATCH v9 30/42] drm/msm: Use DMA_RESV_USAGE_BOOKKEEP/KERNEL Rob Clark
2025-06-29 20:13 ` [PATCH v9 31/42] drm/msm: Add VM_BIND submitqueue Rob Clark
2025-06-29 20:13 ` [PATCH v9 32/42] drm/msm: Support IO_PGTABLE_QUIRK_NO_WARN_ON Rob Clark
2025-06-29 20:13 ` [PATCH v9 33/42] drm/msm: Support pgtable preallocation Rob Clark
2025-06-29 20:13 ` [PATCH v9 34/42] drm/msm: Split out map/unmap ops Rob Clark
2025-06-29 20:13 ` [PATCH v9 35/42] drm/msm: Add VM_BIND ioctl Rob Clark
2025-06-29 20:13 ` [PATCH v9 36/42] drm/msm: Add VM logging for VM_BIND updates Rob Clark
2025-06-29 20:13 ` [PATCH v9 37/42] drm/msm: Add VMA unmap reason Rob Clark
2025-06-29 20:13 ` [PATCH v9 38/42] drm/msm: Add mmu prealloc tracepoint Rob Clark
2025-06-29 20:13 ` [PATCH v9 39/42] drm/msm: use trylock for debugfs Rob Clark
2025-06-29 20:13 ` [PATCH v9 40/42] drm/msm: Bump UAPI version Rob Clark
2025-06-29 20:13 ` [PATCH v9 41/42] drm/msm: Defer VMA unmap for fb unpins Rob Clark
2025-06-29 20:13 ` [PATCH v9 42/42] drm/msm: Add VM_BIND throttling Rob Clark
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=20250629201530.25775-18-robin.clark@oss.qualcomm.com \
--to=robin.clark@oss.qualcomm.com \
--cc=abhinav.kumar@linux.dev \
--cc=airlied@gmail.com \
--cc=antomani103@gmail.com \
--cc=cwabbott0@gmail.com \
--cc=dakr@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=jessica.zhang@oss.qualcomm.com \
--cc=konradybcio@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lumag@kernel.org \
--cc=marijn.suijten@somainline.org \
--cc=robdclark@chromium.org \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
/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
all inboxes | Powered by JetHome®