Skip to content

Commit

Permalink
Fix driver compilation for 5.11 kernel (#5867) (#5875)
Browse files Browse the repository at this point in the history
* Fix driver compilation for 5.11 kernel

> Made changes to fix compilation issues of driver with 5.11 kernel version.
> In 5.11 kernel drm_driver structure is changed, added changes in drm framework accordingly.
> Features missing : p2p support changes are missing.

* Fix comments on PR
  • Loading branch information
rbramand-xilinx authored Sep 30, 2021
1 parent 47ba9cb commit 3550085
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 11 deletions.
32 changes: 30 additions & 2 deletions src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_bo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
34 changes: 25 additions & 9 deletions src/runtime_src/core/pcie/driver/linux/xocl/userpf/xocl_drm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions src/runtime_src/core/pcie/driver/linux/xocl/xocl_drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,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

0 comments on commit 3550085

Please sign in to comment.