diff --git a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.c b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.c index 5fbeabd9abc..6189022052d 100644 --- a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.c +++ b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.c @@ -306,6 +306,7 @@ static struct drm_xocl_bo *xocl_create_bo(struct drm_device *dev, struct drm_xocl_bo *xobj; struct xocl_drm *drm_p = dev->dev_private; struct xocl_dev *xdev = drm_p->xdev; + struct drm_gem_object *obj; unsigned memidx = xocl_bo_ddr_idx(user_flags); bool xobj_inited = false; int err = 0; @@ -355,12 +356,17 @@ static struct drm_xocl_bo *xocl_create_bo(struct drm_device *dev, if (xobj->flags == XOCL_BO_EXECBUF) xobj->metadata.state = DRM_XOCL_EXECBUF_STATE_ABORT; + obj = &xobj->base; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + obj->funcs = &xocl_gem_object_funcs; +#endif + if (xobj->flags & XOCL_DRM_SHMEM) { - err = drm_gem_object_init(dev, &xobj->base, size); + err = drm_gem_object_init(dev, obj, size); if (err) goto failed; } else - drm_gem_private_object_init(dev, &xobj->base, size); + drm_gem_private_object_init(dev, obj, size); xobj_inited = true; @@ -1191,6 +1197,7 @@ struct drm_gem_object *xocl_gem_prime_import_sg_table(struct drm_device *dev, return ERR_PTR(ret); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) void *xocl_gem_prime_vmap(struct drm_gem_object *obj) { struct drm_xocl_bo *xobj = to_xocl_bo(obj); @@ -1203,6 +1210,23 @@ void xocl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) { } +#else +int xocl_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map) +{ + struct drm_xocl_bo *xobj = to_xocl_bo(obj); + + BO_ENTER("xobj %p", xobj); + dma_buf_map_set_vaddr(map, xobj->vmapping); + + return 0; +} + +void xocl_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map) +{ + +} +#endif + int xocl_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) { @@ -1230,7 +1254,11 @@ int xocl_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) vma->vm_ops = xobj->dmabuf_vm_ops; } else if (!IS_ERR_OR_NULL(xobj->base.dma_buf) && !IS_ERR_OR_NULL(xobj->base.dma_buf->file)) { vma->vm_file = get_file(xobj->base.dma_buf->file); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + vma->vm_ops = xobj->base.funcs->vm_ops; +#else vma->vm_ops = xobj->base.dev->driver->gem_vm_ops; +#endif } vma->vm_private_data = obj; diff --git a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.h b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.h index ac3394c6950..eeabf900d96 100644 --- a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.h +++ b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.h @@ -178,8 +178,15 @@ int xocl_sync_bo_callback_ioctl(struct drm_device *dev, void *data, struct sg_table *xocl_gem_prime_get_sg_table(struct drm_gem_object *obj); struct drm_gem_object *xocl_gem_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sgt); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) void *xocl_gem_prime_vmap(struct drm_gem_object *obj); void xocl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); +#else +int xocl_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map); +void xocl_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map); +#endif + int xocl_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); int xocl_copy_import_bo(struct drm_device *dev, struct drm_file *filp, struct ert_start_copybo_cmd *cmd); diff --git a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_drm.c b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_drm.c index ddccfb503b7..6a1a2f7287d 100644 --- a/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_drm.c +++ b/src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_drm.c @@ -508,27 +508,32 @@ static struct drm_driver mm_drm_driver = { .postclose = xocl_client_release, .open = xocl_client_open, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) - .gem_free_object_unlocked = xocl_free_object, -#else - .gem_free_object = xocl_free_object, +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) + .gem_free_object_unlocked = xocl_free_object, + #else + .gem_free_object = xocl_free_object, + #endif +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + .gem_vm_ops = &xocl_vm_ops, + .gem_prime_get_sg_table = xocl_gem_prime_get_sg_table, + .gem_prime_vmap = xocl_gem_prime_vmap, + .gem_prime_vunmap = xocl_gem_prime_vunmap, + .gem_prime_export = drm_gem_prime_export, #endif - .gem_vm_ops = &xocl_vm_ops, .ioctls = xocl_ioctls, .num_ioctls = (ARRAY_SIZE(xocl_ioctls)-NUM_KERNEL_IOCTLS), .fops = &xocl_driver_fops, - .gem_prime_get_sg_table = xocl_gem_prime_get_sg_table, .gem_prime_import_sg_table = xocl_gem_prime_import_sg_table, - .gem_prime_vmap = xocl_gem_prime_vmap, - .gem_prime_vunmap = xocl_gem_prime_vunmap, .gem_prime_mmap = xocl_gem_prime_mmap, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, .gem_prime_import = drm_gem_prime_import, - .gem_prime_export = drm_gem_prime_export, #if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0))) .set_busid = drm_pci_set_busid, #endif @@ -537,6 +542,17 @@ static struct drm_driver mm_drm_driver = { .date = driver_date, }; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +const struct drm_gem_object_funcs xocl_gem_object_funcs = { + .free = xocl_free_object, + .vm_ops = &xocl_vm_ops, + .get_sg_table = xocl_gem_prime_get_sg_table, + .vmap = xocl_gem_prime_vmap, + .vunmap = xocl_gem_prime_vunmap, + .export = drm_gem_prime_export, +}; +#endif + void *xocl_drm_init(xdev_handle_t xdev_hdl) { struct xocl_drm *drm_p = NULL; diff --git a/src/runtime_src/core/pcie/driver/linux/xocl/xocl_drm.h b/src/runtime_src/core/pcie/driver/linux/xocl/xocl_drm.h index 7cbf15b9d43..add3d842c41 100644 --- a/src/runtime_src/core/pcie/driver/linux/xocl/xocl_drm.h +++ b/src/runtime_src/core/pcie/driver/linux/xocl/xocl_drm.h @@ -159,4 +159,8 @@ int xocl_init_unmgd(struct drm_xocl_unmgd *unmgd, uint64_t data_ptr, uint64_t size, u32 write); void xocl_finish_unmgd(struct drm_xocl_unmgd *unmgd); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +extern const struct drm_gem_object_funcs xocl_gem_object_funcs; +#endif + #endif