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 <[email protected]>
---
 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

Reply via email to