diff options
author | Max Krummenacher <max.krummenacher@toradex.com> | 2024-02-29 21:24:13 +0100 |
---|---|---|
committer | Max Krummenacher <max.krummenacher@toradex.com> | 2024-02-29 21:24:26 +0100 |
commit | 99e9ab88844a2a2e1c048264315eb0d72eb0bf88 (patch) | |
tree | 0d89b05b1816b8cac1be77ac9b3c297762502e67 /drivers/gpu/drm/imx/dpu/dpu-blit.c | |
parent | 756e3199ba82d68ba07e5acf555d13aaa1da3da1 (diff) | |
parent | d761b18f6bc83bce94251467e3c0974243318456 (diff) |
Merge remote-tracking branch 'fslc/5.15-2.2.x-imx' into toradex_5.15-2.2.x-imx
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
Conflicts:
drivers/gpu/drm/bridge/lontium-lt8912b.c
drivers/usb/dwc3/drd.c
Diffstat (limited to 'drivers/gpu/drm/imx/dpu/dpu-blit.c')
-rw-r--r-- | drivers/gpu/drm/imx/dpu/dpu-blit.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/drivers/gpu/drm/imx/dpu/dpu-blit.c b/drivers/gpu/drm/imx/dpu/dpu-blit.c index 35d8429a400f..deb88c2d7234 100644 --- a/drivers/gpu/drm/imx/dpu/dpu-blit.c +++ b/drivers/gpu/drm/imx/dpu/dpu-blit.c @@ -1,5 +1,5 @@ /* - * Copyright 2017,2021-2022 NXP + * Copyright 2017,2021-2023 NXP * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -19,6 +19,7 @@ #include <drm/imx_drm.h> #include <linux/component.h> #include <linux/device.h> +#include <linux/dma-buf.h> #include <linux/errno.h> #include <linux/export.h> #include <linux/module.h> @@ -215,13 +216,60 @@ static int imx_drm_dpu_get_param_ioctl(struct drm_device *drm_dev, void *data, return ret; } -const struct drm_ioctl_desc imx_drm_dpu_ioctls[3] = { +static int imx_drm_dpu_sync_dmabuf_ioctl(struct drm_device *drm_dev, void *data, + struct drm_file *file) +{ + struct drm_imx_dpu_sync_dmabuf *flush = data; + struct dma_buf *dmabuf; + struct dma_buf_attachment *attachment; + struct sg_table *sgt; + int direction; + int ret = 0; + + if (flush->direction == IMX_DPU_SYNC_TO_BOTH) + direction = DMA_BIDIRECTIONAL; + else if (flush->direction == IMX_DPU_SYNC_TO_DEVICE) + direction = DMA_TO_DEVICE; + else if (flush->direction == IMX_DPU_SYNC_TO_CPU) + direction = DMA_FROM_DEVICE; + else + direction = DMA_NONE; + + dmabuf = dma_buf_get(flush->dmabuf_fd); + if (IS_ERR(dmabuf)) { + drm_err(drm_dev, "failed to get dmabuf\n"); + return PTR_ERR(dmabuf); + } + attachment = dma_buf_attach(dmabuf, drm_dev->dev); + if (IS_ERR(attachment)) { + ret = PTR_ERR(attachment); + drm_err(drm_dev, "failed to attach dmabuf\n"); + goto err_put; + } + sgt = dma_buf_map_attachment(attachment, direction); + if (IS_ERR(sgt)) { + ret = PTR_ERR(sgt); + drm_err(drm_dev, "failed to get dmabuf sg_table\n"); + goto err_detach; + } + dma_buf_unmap_attachment(attachment, sgt, direction); +err_detach: + dma_buf_detach(dmabuf, attachment); +err_put: + dma_buf_put(dmabuf); + + return ret; +} + +const struct drm_ioctl_desc imx_drm_dpu_ioctls[4] = { DRM_IOCTL_DEF_DRV(IMX_DPU_SET_CMDLIST, imx_drm_dpu_set_cmdlist_ioctl, DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(IMX_DPU_WAIT, imx_drm_dpu_wait_ioctl, DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(IMX_DPU_GET_PARAM, imx_drm_dpu_get_param_ioctl, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(IMX_DPU_SYNC_DMABUF, imx_drm_dpu_sync_dmabuf_ioctl, + DRM_RENDER_ALLOW), }; static int dpu_bliteng_bind(struct device *dev, struct device *master, @@ -344,3 +392,4 @@ module_platform_driver(dpu_bliteng_driver); MODULE_LICENSE("GPL"); MODULE_AUTHOR("NXP Semiconductor"); MODULE_DESCRIPTION("i.MX DRM DPU BLITENG"); +MODULE_IMPORT_NS(DMA_BUF); |