| From 1cad629257e76025bcbf490c58de550fb67d4d0e Mon Sep 17 00:00:00 2001 |
| From: Gerd Hoffmann <kraxel@redhat.com> |
| Date: Wed, 26 Feb 2020 16:47:50 +0100 |
| Subject: drm/shmem: add support for per object caching flags. |
| |
| From: Gerd Hoffmann <kraxel@redhat.com> |
| |
| commit 1cad629257e76025bcbf490c58de550fb67d4d0e upstream. |
| |
| Add map_cached bool to drm_gem_shmem_object, to request cached mappings |
| on a per-object base. Check the flag before adding writecombine to |
| pgprot bits. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> |
| Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org> |
| Tested-by: Guillaume Gardet <Guillaume.Gardet@arm.com> |
| Link: http://patchwork.freedesktop.org/patch/msgid/20200226154752.24328-2-kraxel@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/drm_gem_shmem_helper.c | 15 +++++++++++---- |
| include/drm/drm_gem_shmem_helper.h | 5 +++++ |
| 2 files changed, 16 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/drm_gem_shmem_helper.c |
| +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c |
| @@ -254,11 +254,16 @@ static void *drm_gem_shmem_vmap_locked(s |
| if (ret) |
| goto err_zero_use; |
| |
| - if (obj->import_attach) |
| + if (obj->import_attach) { |
| shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); |
| - else |
| + } else { |
| + pgprot_t prot = PAGE_KERNEL; |
| + |
| + if (!shmem->map_cached) |
| + prot = pgprot_writecombine(prot); |
| shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, |
| - VM_MAP, pgprot_writecombine(PAGE_KERNEL)); |
| + VM_MAP, prot); |
| + } |
| |
| if (!shmem->vaddr) { |
| DRM_DEBUG_KMS("Failed to vmap pages\n"); |
| @@ -537,7 +542,9 @@ int drm_gem_shmem_mmap(struct drm_gem_ob |
| } |
| |
| vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND; |
| - vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); |
| + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); |
| + if (!shmem->map_cached) |
| + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); |
| vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); |
| vma->vm_ops = &drm_gem_shmem_vm_ops; |
| |
| --- a/include/drm/drm_gem_shmem_helper.h |
| +++ b/include/drm/drm_gem_shmem_helper.h |
| @@ -96,6 +96,11 @@ struct drm_gem_shmem_object { |
| * The address are un-mapped when the count reaches zero. |
| */ |
| unsigned int vmap_use_count; |
| + |
| + /** |
| + * @map_cached: map object cached (instead of using writecombine). |
| + */ |
| + bool map_cached; |
| }; |
| |
| #define to_drm_gem_shmem_obj(obj) \ |