Il 23/10/23 06:45, Jason-JH.Lin ha scritto:
From: CK Hu ck.hu@mediatek.com
Add an interface to allocate MediaTek GEM buffers, allow the IOCTLs to be used by render nodes. This patch also sets the RENDER driver feature.
Signed-off-by: CK Hu ck.hu@mediatek.com Signed-off-by: Nicolas Boichat drinkcat@chromium.org Signed-off-by: Philipp Zabel p.zabel@pengutronix.de Signed-off-by: Jason-JH.Lin jason-jh.lin@mediatek.com Reviewed-by: Daniel Kurtz djkurtz@chromium.org Reviewed-by: Nicolas Boichat drinkcat@chromium.org Tested-by: Daniel Kurtz djkurtz@chromium.org Tested-by: Pi-Hsun Shih pihsun@chromium.org
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 13 ++++++ drivers/gpu/drm/mediatek/mtk_drm_gem.c | 39 +++++++++++++++++ drivers/gpu/drm/mediatek/mtk_drm_gem.h | 12 ++++++ include/uapi/drm/mediatek_drm.h | 58 ++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 include/uapi/drm/mediatek_drm.h
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 93552d76b6e7..e3e9dbdf265b 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -24,6 +24,7 @@ #include <drm/drm_of.h> #include <drm/drm_probe_helper.h> #include <drm/drm_vblank.h> +#include <drm/mediatek_drm.h> #include "mtk_drm_crtc.h" #include "mtk_drm_ddp_comp.h" @@ -541,6 +542,14 @@ static void mtk_drm_kms_deinit(struct drm_device *drm) component_unbind_all(drm->dev, drm); } +static const struct drm_ioctl_desc mtk_ioctls[] = {
- DRM_IOCTL_DEF_DRV(MTK_GEM_CREATE, mtk_gem_create_ioctl,
DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW),
- DRM_IOCTL_DEF_DRV(MTK_GEM_MAP_OFFSET,
mtk_gem_map_offset_ioctl,
DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW),
+};
- DEFINE_DRM_GEM_FOPS(mtk_drm_fops);
/* @@ -562,6 +571,10 @@ static const struct drm_driver mtk_drm_driver = { .gem_prime_import = mtk_drm_gem_prime_import, .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
- .ioctls = mtk_ioctls,
- .num_ioctls = ARRAY_SIZE(mtk_ioctls),
- .fops = &mtk_drm_fops,
.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c b/drivers/gpu/drm/mediatek/mtk_drm_gem.c index 9f364df52478..bcce723f257d 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c @@ -4,6 +4,7 @@ */ #include <linux/dma-buf.h> +#include <drm/mediatek_drm.h> #include <drm/drm.h> #include <drm/drm_device.h> @@ -272,3 +273,41 @@ void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj, mtk_gem->kvaddr = NULL; kfree(mtk_gem->pages); }
+int mtk_gem_map_offset_ioctl(struct drm_device *drm, void *data,
struct drm_file *file_priv)
+{
- struct drm_mtk_gem_map_off *args = data;
- return drm_gem_dumb_map_offset(file_priv, drm, args->handle,
&args->offset);
+}
+int mtk_gem_create_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
+{
- struct mtk_drm_gem_obj *mtk_gem;
- struct drm_mtk_gem_create *args = data;
- int ret;
- mtk_gem = mtk_drm_gem_create(dev, args->size, false);
- if (IS_ERR(mtk_gem))
return PTR_ERR(mtk_gem);
- /*
* allocate a id of idr table where the obj is registered
* and handle has the id what user can see.
*/
- ret = drm_gem_handle_create(file_priv, &mtk_gem->base, &args->handle);
- if (ret)
goto err_handle_create;
- /* drop reference from allocate - handle holds it now. */
- drm_gem_object_put(&mtk_gem->base);
- return 0;
+err_handle_create:
- mtk_drm_gem_free_object(&mtk_gem->base);
- return ret;
+} diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.h b/drivers/gpu/drm/mediatek/mtk_drm_gem.h index 78f23b07a02e..90f3d2916ec5 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.h @@ -46,4 +46,16 @@ int mtk_drm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map); void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map); +/*
- request gem object creation and buffer allocation as the size
- that it is calculated with framebuffer information such as width,
- height and bpp.
- */
+int mtk_gem_create_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
+/* get buffer offset to map to user space. */ +int mtk_gem_map_offset_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
- #endif
diff --git a/include/uapi/drm/mediatek_drm.h b/include/uapi/drm/mediatek_drm.h new file mode 100644 index 000000000000..c050de320a84 --- /dev/null +++ b/include/uapi/drm/mediatek_drm.h @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/*
- Copyright (c) 2015 MediaTek Inc.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- */
+#ifndef _UAPI_MEDIATEK_DRM_H +#define _UAPI_MEDIATEK_DRM_H
+#include <drm/drm.h>
+/**
- User-desired buffer creation information structure.
You're almost there.... Read:
https://docs.kernel.org/doc-guide/kernel-doc.html#structure-union-and-enumer...
Regards, Angelo