diff --git a/msm/msm_atomic.c b/msm/msm_atomic.c index 24c9b1b0e5..72bc3bd23e 100644 --- a/msm/msm_atomic.c +++ b/msm/msm_atomic.c @@ -537,7 +537,11 @@ int msm_atomic_prepare_fb(struct drm_plane *plane, obj = msm_framebuffer_bo(new_state->fb, 0); msm_obj = to_msm_bo(obj); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) fence = dma_resv_get_excl_unlocked(msm_obj->resv); +#else + fence = dma_resv_get_excl_rcu(msm_obj->resv); +#endif drm_atomic_set_fence_for_plane(new_state, fence); @@ -745,7 +749,11 @@ int msm_atomic_commit(struct drm_device *dev, msm_framebuffer_bo(new_plane_state->fb, 0); struct msm_gem_object *msm_obj = to_msm_bo(obj); struct dma_fence *fence = +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) dma_resv_get_excl_unlocked(msm_obj->resv); +#else + dma_resv_get_excl_rcu(msm_obj->resv); +#endif drm_atomic_set_fence_for_plane(new_plane_state, fence); } diff --git a/msm/msm_drv.c b/msm/msm_drv.c index c7560b5580..52359f50c7 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -46,6 +46,7 @@ #include #include #include +#include #include "msm_drv.h" #include "msm_gem.h" @@ -1715,6 +1716,14 @@ static const struct drm_ioctl_desc msm_ioctls[] = { DRM_UNLOCKED), }; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) +static const struct vm_operations_struct vm_ops = { + .fault = msm_gem_fault, + .open = drm_gem_vm_open, + .close = drm_gem_vm_close, +}; +#endif + static const struct file_operations fops = { .owner = THIS_MODULE, .open = drm_open, @@ -1735,6 +1744,16 @@ static struct drm_driver msm_driver = { .open = msm_open, .postclose = msm_postclose, .lastclose = msm_lastclose, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) + .gem_free_object_unlocked = msm_gem_free_object, + .gem_vm_ops = &vm_ops, + .gem_prime_export = drm_gem_prime_export, + .gem_prime_pin = msm_gem_prime_pin, + .gem_prime_unpin = msm_gem_prime_unpin, + .gem_prime_get_sg_table = msm_gem_prime_get_sg_table, + .gem_prime_vmap = msm_gem_prime_vmap, + .gem_prime_vunmap = msm_gem_prime_vunmap, +#endif .dumb_create = msm_gem_dumb_create, .dumb_map_offset = msm_gem_dumb_map_offset, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, diff --git a/msm/msm_drv.h b/msm/msm_drv.h index ef4583bb4d..ad6bfa57db 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -1159,8 +1160,14 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, uint32_t handle, uint64_t *offset); struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) int msm_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map); void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map); +#else +void *msm_gem_prime_vmap(struct drm_gem_object *obj); +void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); +vm_fault_t msm_gem_fault(struct vm_fault *vmf); +#endif int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sg); diff --git a/msm/msm_gem.c b/msm/msm_gem.c index a5699f83aa..bdecfe9143 100644 --- a/msm/msm_gem.c +++ b/msm/msm_gem.c @@ -21,6 +21,10 @@ #include #include #include +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) +#include +#endif #include "msm_drv.h" #include "msm_gem.h" @@ -255,7 +259,11 @@ int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma) return msm_gem_mmap_obj(vma->vm_private_data, vma); } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) static vm_fault_t msm_gem_fault(struct vm_fault *vmf) +#else +vm_fault_t msm_gem_fault(struct vm_fault *vmf) +#endif { struct vm_area_struct *vma = vmf->vma; struct drm_gem_object *obj = vma->vm_private_data; @@ -651,7 +659,9 @@ fail: static void *get_vaddr(struct drm_gem_object *obj, unsigned madv) { struct msm_gem_object *msm_obj = to_msm_bo(obj); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) struct dma_buf_map map; +#endif int ret = 0; mutex_lock(&msm_obj->lock); @@ -686,10 +696,14 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv) goto fail; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) ret = dma_buf_vmap(obj->import_attach->dmabuf, &map); if (ret) - return ERR_PTR(ret); + goto fail; msm_obj->vaddr = map.vaddr; +#else + msm_obj->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); +#endif } else { msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, VM_MAP, PAGE_KERNEL); @@ -749,7 +763,9 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv) static void msm_gem_vunmap_locked(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj = to_msm_bo(obj); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(msm_obj->vaddr); +#endif WARN_ON(!mutex_is_locked(&msm_obj->lock)); @@ -757,8 +773,14 @@ static void msm_gem_vunmap_locked(struct drm_gem_object *obj) return; if (obj->import_attach) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) dma_buf_vunmap(obj->import_attach->dmabuf, &map); dma_buf_end_cpu_access(obj->import_attach->dmabuf, DMA_BIDIRECTIONAL); +#else + dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr); + if (obj->dev && obj->dev->dev && !dev_is_dma_coherent(obj->dev->dev)) + dma_buf_end_cpu_access(obj->import_attach->dmabuf, DMA_BIDIRECTIONAL); +#endif } else { vunmap(msm_obj->vaddr); } @@ -783,8 +805,11 @@ int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout) op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout); long ret; - ret = dma_resv_wait_timeout(msm_obj->resv, write, - true, remain); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) + ret = dma_resv_wait_timeout(msm_obj->resv, write, true, remain); +#else + ret = dma_resv_wait_timeout_rcu(msm_obj->resv, write, true, remain); +#endif if (ret == 0) return remain == 0 ? -EBUSY : -ETIMEDOUT; else if (ret < 0) @@ -807,7 +832,9 @@ void msm_gem_free_object(struct drm_gem_object *obj) struct msm_gem_object *msm_obj = to_msm_bo(obj); struct drm_device *dev = obj->dev; struct msm_drm_private *priv = dev->dev_private; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(msm_obj->vaddr); +#endif /* object should not be on active list: */ WARN_ON(is_active(msm_obj)); @@ -828,7 +855,11 @@ void msm_gem_free_object(struct drm_gem_object *obj) if (obj->import_attach) { if (msm_obj->vaddr) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) dma_buf_vunmap(obj->import_attach->dmabuf, &map); +#else + dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr); +#endif /* Don't drop the pages for imported dmabuf, as they are not * ours, just free the array we allocated: @@ -875,6 +906,7 @@ int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file, return ret; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) static const struct vm_operations_struct vm_ops = { .fault = msm_gem_fault, .open = drm_gem_vm_open, @@ -890,6 +922,7 @@ static const struct drm_gem_object_funcs msm_gem_object_funcs = { .vunmap = msm_gem_prime_vunmap, .vm_ops = &vm_ops, }; +#endif static int msm_gem_new_impl(struct drm_device *dev, uint32_t size, uint32_t flags, @@ -936,7 +969,9 @@ static int msm_gem_new_impl(struct drm_device *dev, msm_obj->obj_dirty = false; *obj = &msm_obj->base; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) (*obj)->funcs = &msm_gem_object_funcs; +#endif return 0; } diff --git a/msm/msm_gem_prime.c b/msm/msm_gem_prime.c index 8619c08f79..afa26f2765 100644 --- a/msm/msm_gem_prime.c +++ b/msm/msm_gem_prime.c @@ -25,6 +25,11 @@ #include #include +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)) +#include +#include +#endif struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) { @@ -37,13 +42,24 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages); } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) int msm_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map) { map->vaddr = msm_gem_get_vaddr(obj); return IS_ERR_OR_NULL(map->vaddr); } +#else +void *msm_gem_prime_vmap(struct drm_gem_object *obj) +{ + return msm_gem_get_vaddr(obj); +} +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)) void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map) +#else +void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) +#endif { msm_gem_put_vaddr(obj); }