drm/rockchip: avoid duplicate mappings for IOMMU devices
authorJohn Keeping <john@metanate.com>
Thu, 10 Nov 2022 17:24:14 +0000 (17:24 +0000)
committerHeiko Stuebner <heiko@sntech.de>
Sun, 5 Feb 2023 14:27:54 +0000 (15:27 +0100)
If a buffer is allocated with alloc_kmap, then it is vmap'd on creation
and there is no reason to map it again in rockchip_gem_prime_vmap() when
the existing mapping can be used.

Signed-off-by: John Keeping <john@metanate.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20221110172415.2853420-1-john@metanate.com
drivers/gpu/drm/rockchip/rockchip_drm_gem.c

index 6edb7c5..c9507d2 100644 (file)
@@ -519,8 +519,14 @@ int rockchip_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
        struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
 
        if (rk_obj->pages) {
-               void *vaddr = vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP,
-                                 pgprot_writecombine(PAGE_KERNEL));
+               void *vaddr;
+
+               if (rk_obj->kvaddr)
+                       vaddr = rk_obj->kvaddr;
+               else
+                       vaddr = vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP,
+                                    pgprot_writecombine(PAGE_KERNEL));
+
                if (!vaddr)
                        return -ENOMEM;
                iosys_map_set_vaddr(map, vaddr);
@@ -540,7 +546,8 @@ void rockchip_gem_prime_vunmap(struct drm_gem_object *obj,
        struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
 
        if (rk_obj->pages) {
-               vunmap(map->vaddr);
+               if (map->vaddr != rk_obj->kvaddr)
+                       vunmap(map->vaddr);
                return;
        }