]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/panthor: Kill lock_region()
authorBoris Brezillon <boris.brezillon@collabora.com>
Fri, 28 Nov 2025 08:48:36 +0000 (09:48 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Fri, 28 Nov 2025 09:17:44 +0000 (10:17 +0100)
The meat in lock_region() is about packing a region range into a
single u64. The rest is just a regular reg write plus a
as_send_cmd_and_wait() call that can easily be inlined in
mmu_hw_do_operation_locked().

v2:
- New patch

v3:
- Don't LOCK is the region has a zero size

v4:
- Collect R-b

Reviewed-by: Steven Price <steven.price@arm.com>
Link: https://patch.msgid.link/20251128084841.3804658-3-boris.brezillon@collabora.com
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/gpu/drm/panthor/panthor_mmu.c

index f59331f89b33ca2fe5c8a2f08f2ea356b32924b8..b88a6d3096a0ce6e43363ccd10ea286f6722eef2 100644 (file)
@@ -538,14 +538,12 @@ static int as_send_cmd_and_wait(struct panthor_device *ptdev, u32 as_nr, u32 cmd
        return status;
 }
 
-static int lock_region(struct panthor_device *ptdev, u32 as_nr,
-                      u64 region_start, u64 size)
+static u64 pack_region_range(struct panthor_device *ptdev, u64 region_start, u64 size)
 {
        u8 region_width;
-       u64 region;
        u64 region_end = region_start + size;
 
-       if (!size)
+       if (drm_WARN_ON_ONCE(&ptdev->base, !size))
                return 0;
 
        /*
@@ -565,11 +563,7 @@ static int lock_region(struct panthor_device *ptdev, u32 as_nr,
         */
        region_start &= GENMASK_ULL(63, region_width);
 
-       region = region_width | region_start;
-
-       /* Lock the region that needs to be updated */
-       gpu_write64(ptdev, AS_LOCKADDR(as_nr), region);
-       return as_send_cmd_and_wait(ptdev, as_nr, AS_COMMAND_LOCK);
+       return region_width | region_start;
 }
 
 static int mmu_hw_do_operation_locked(struct panthor_device *ptdev, int as_nr,
@@ -581,6 +575,9 @@ static int mmu_hw_do_operation_locked(struct panthor_device *ptdev, int as_nr,
 
        lockdep_assert_held(&ptdev->mmu->as.slots_lock);
 
+       if (!size)
+               return 0;
+
        switch (op) {
        case AS_COMMAND_FLUSH_MEM:
                lsc_flush_op = CACHE_CLEAN | CACHE_INV;
@@ -602,7 +599,10 @@ static int mmu_hw_do_operation_locked(struct panthor_device *ptdev, int as_nr,
         * power it up
         */
 
-       ret = lock_region(ptdev, as_nr, iova, size);
+       /* Lock the region that needs to be updated */
+       gpu_write64(ptdev, AS_LOCKADDR(as_nr),
+                   pack_region_range(ptdev, iova, size));
+       ret = as_send_cmd_and_wait(ptdev, as_nr, AS_COMMAND_LOCK);
        if (ret)
                return ret;