]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/etnaviv: Improve VA, PA, SIZE alignment checking
authorSui Jingfeng <sui.jingfeng@linux.dev>
Fri, 15 Nov 2024 12:32:46 +0000 (20:32 +0800)
committerLucas Stach <l.stach@pengutronix.de>
Tue, 3 Dec 2024 17:30:32 +0000 (18:30 +0100)
Alignment checking is only needed to be done in the upper caller function.
If those address and sizes are able to pass the check, it will certainly
pass the same test in the etnaviv_context_unmap() function. We don't need
examine it more than once.

Remove redundant alignment tests, move the those useless to upper caller
function.

Signed-off-by: Sui Jingfeng <sui.jingfeng@linux.dev>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_mmu.c

index ff90bf85c156bb0ace2684339a041980be54c176..df5192083b201907afd0e725562ec671617a1ea2 100644 (file)
@@ -19,12 +19,6 @@ static void etnaviv_context_unmap(struct etnaviv_iommu_context *context,
        size_t unmapped_page, unmapped = 0;
        size_t pgsize = SZ_4K;
 
-       if (!IS_ALIGNED(iova | size, pgsize)) {
-               pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%zx\n",
-                      iova, size, pgsize);
-               return;
-       }
-
        while (unmapped < size) {
                unmapped_page = context->global->ops->unmap(context, iova,
                                                            pgsize);
@@ -45,12 +39,6 @@ static int etnaviv_context_map(struct etnaviv_iommu_context *context,
        size_t orig_size = size;
        int ret = 0;
 
-       if (!IS_ALIGNED(iova | paddr | size, pgsize)) {
-               pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%zx\n",
-                      iova, &paddr, size, pgsize);
-               return -EINVAL;
-       }
-
        while (size) {
                ret = context->global->ops->map(context, iova, paddr, pgsize,
                                                prot);
@@ -88,6 +76,14 @@ static int etnaviv_iommu_map(struct etnaviv_iommu_context *context,
 
                VERB("map[%d]: %08x %pap(%x)", i, da, &pa, bytes);
 
+               if (!IS_ALIGNED(iova | pa | bytes, SZ_4K)) {
+                       dev_err(context->global->dev,
+                               "unaligned: iova 0x%x pa %pa size 0x%x\n",
+                               iova, &pa, bytes);
+                       ret = -EINVAL;
+                       goto fail;
+               }
+
                ret = etnaviv_context_map(context, da, pa, bytes, prot);
                if (ret)
                        goto fail;