[PATCH v3 04/32] iommu/io-pgtable-dart: introduce iova_to_phys_length in io_pgtable_ops

From: Guanghui Feng

Date: Wed Jun 03 2026 - 11:43:05 EST


Implement iova_to_phys_length in DART backend: returns pgsize from
cfg.pgsize_bitmap (single fixed page size). The old iova_to_phys is kept
as a thin wrapper.

Signed-off-by: Guanghui Feng <guanghuifeng@xxxxxxxxxxxxxxxxx>
---
drivers/iommu/io-pgtable-dart.c | 32 +++++++++++++++++++++++++-------
1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c
index cbc5d6aa2daa..2dac21a578a7 100644
--- a/drivers/iommu/io-pgtable-dart.c
+++ b/drivers/iommu/io-pgtable-dart.c
@@ -333,29 +333,46 @@ static size_t dart_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova,
return i * pgsize;
}

+static phys_addr_t dart_iova_to_phys_length(struct io_pgtable_ops *ops,
+ unsigned long iova,
+ size_t *mapped_length);
+
static phys_addr_t dart_iova_to_phys(struct io_pgtable_ops *ops,
- unsigned long iova)
+ unsigned long iova)
+{
+ phys_addr_t phys = dart_iova_to_phys_length(ops, iova, NULL);
+
+ return (phys == PHYS_ADDR_MAX) ? 0 : phys;
+}
+
+static phys_addr_t dart_iova_to_phys_length(struct io_pgtable_ops *ops,
+ unsigned long iova,
+ size_t *mapped_length)
{
struct dart_io_pgtable *data = io_pgtable_ops_to_data(ops);
dart_iopte pte, *ptep;
+ size_t pgsize;

ptep = dart_get_last(data, iova);

/* Valid L2 IOPTE pointer? */
if (!ptep)
- return 0;
+ return PHYS_ADDR_MAX;

ptep += dart_get_last_index(data, iova);

pte = READ_ONCE(*ptep);
/* Found translation */
if (pte) {
- iova &= (data->iop.cfg.pgsize_bitmap - 1);
+ pgsize = data->iop.cfg.pgsize_bitmap;
+ if (mapped_length)
+ *mapped_length = pgsize;
+ iova &= (pgsize - 1);
return iopte_to_paddr(pte, data) | iova;
}

/* Ran out of page tables to walk */
- return 0;
+ return PHYS_ADDR_MAX;
}

static struct dart_io_pgtable *
@@ -397,9 +414,10 @@ dart_alloc_pgtable(struct io_pgtable_cfg *cfg)
data->bits_per_level = bits_per_level;

data->iop.ops = (struct io_pgtable_ops) {
- .map_pages = dart_map_pages,
- .unmap_pages = dart_unmap_pages,
- .iova_to_phys = dart_iova_to_phys,
+ .map_pages = dart_map_pages,
+ .unmap_pages = dart_unmap_pages,
+ .iova_to_phys = dart_iova_to_phys,
+ .iova_to_phys_length = dart_iova_to_phys_length,
};

return data;
--
2.43.7