| From 4a325d0ebd8f0a4018b9fc2d5c9caa6f1ee6a81e Mon Sep 17 00:00:00 2001 |
| From: CK Hu <ck.hu@mediatek.com> |
| Date: Tue, 12 Jan 2016 16:15:50 +0100 |
| Subject: [PATCH] CHROMIUM: drm/mediatek: Add interface to allocate Mediatek |
| GEM buffer. |
| |
| 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> |
| |
| BUG=chromium:1021640 |
| BUG=b:109911488 |
| TEST=build and boot kukui to UI |
| |
| Reviewed-on: https://chromium-review.googlesource.com/327581 |
| Commit-Ready: Daniel Kurtz <djkurtz@chromium.org> |
| Tested-by: Daniel Kurtz <djkurtz@chromium.org> |
| Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> |
| Reviewed-on: https://chromium-review.googlesource.com/423687 |
| Reviewed-by: Nicolas Boichat <drinkcat@chromium.org> |
| Reviewed-on: https://chromium-review.googlesource.com/1186281 |
| Commit-Ready: Nicolas Boichat <drinkcat@chromium.org> |
| Tested-by: Pi-Hsun Shih <pihsun@chromium.org> |
| Conflicts: |
| drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| drivers/gpu/drm/mediatek/mtk_drm_gem.c |
| |
| [rebase54(groeck): |
| Fixed conflicts: |
| - drm_gem_object_unreference_unlocked -> drm_gem_object_put_unlocked |
| - Added missing include files |
| - Addressed context conflicts |
| Squashed: |
| FIXUP: CHROMIUM: drm/mediatek: Add interface to allocate Mediatek GEM buffer |
| ] |
| Signed-off-by: Guenter Roeck <groeck@chromium.org> |
| [rebase510(eizan) |
| Fixed conflicts: |
| - drm_gem_object_put_unlocked -> drm_gem_object_put |
| ] |
| Signed-off-by: Eizan Miyamoto <groeck@chromium.org> |
| |
| Change-Id: Ice3ed33b3f41e5c02c39d77a8f9e6775448a41bb |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/1955361 |
| Tested-by: Nicolas Boichat <drinkcat@chromium.org> |
| Commit-Queue: Nicolas Boichat <drinkcat@chromium.org> |
| Reviewed-by: Nicolas Boichat <drinkcat@chromium.org> |
| --- |
| drivers/gpu/drm/mediatek/mtk_drm_drv.c | 17 ++++++- |
| drivers/gpu/drm/mediatek/mtk_drm_gem.c | 40 ++++++++++++++++ |
| drivers/gpu/drm/mediatek/mtk_drm_gem.h | 12 +++++ |
| include/uapi/drm/mediatek_drm.h | 65 ++++++++++++++++++++++++++ |
| 4 files changed, 133 insertions(+), 1 deletion(-) |
| 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 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| @@ -24,6 +24,8 @@ |
| #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" |
| #include "mtk_drm_drv.h" |
| @@ -310,6 +312,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); |
| |
| /* |
| @@ -325,7 +335,8 @@ static struct drm_gem_object *mtk_drm_gem_prime_import(struct drm_device *dev, |
| } |
| |
| static const struct drm_driver mtk_drm_driver = { |
| - .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, |
| + .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC | |
| + DRIVER_RENDER, |
| |
| .dumb_create = mtk_drm_gem_dumb_create, |
| |
| @@ -334,6 +345,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, |
| .gem_prime_mmap = drm_gem_prime_mmap, |
| + |
| + .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 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c |
| @@ -4,9 +4,11 @@ |
| */ |
| |
| #include <linux/dma-buf.h> |
| +#include <drm/mediatek_drm.h> |
| |
| #include <drm/drm.h> |
| #include <drm/drm_device.h> |
| +#include <drm/drm_drv.h> |
| #include <drm/drm_gem.h> |
| #include <drm/drm_gem_cma_helper.h> |
| #include <drm/drm_prime.h> |
| @@ -264,3 +266,41 @@ void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *ma |
| mtk_gem->kvaddr = 0; |
| 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 |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.h |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.h |
| @@ -45,4 +45,16 @@ struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev, |
| int mtk_drm_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map); |
| void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_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 |
| --- /dev/null |
| +++ b/include/uapi/drm/mediatek_drm.h |
| @@ -0,0 +1,65 @@ |
| +/* |
| + * 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> |
| + |
| +#ifdef __KERNEL__ |
| +#include <linux/types.h> |
| +#else |
| +#include <stdint.h> |
| +#endif |
| + |
| +/** |
| + * User-desired buffer creation information structure. |
| + * |
| + * @size: user-desired memory allocation size. |
| + * - this size value would be page-aligned internally. |
| + * @flags: user request for setting memory type or cache attributes. |
| + * @handle: returned a handle to created gem object. |
| + * - this handle will be set by gem module of kernel side. |
| + */ |
| +struct drm_mtk_gem_create { |
| + uint64_t size; |
| + uint32_t flags; |
| + uint32_t handle; |
| +}; |
| + |
| +/** |
| + * A structure for getting buffer offset. |
| + * |
| + * @handle: a pointer to gem object created. |
| + * @pad: just padding to be 64-bit aligned. |
| + * @offset: relatived offset value of the memory region allocated. |
| + * - this value should be set by user. |
| + */ |
| +struct drm_mtk_gem_map_off { |
| + uint32_t handle; |
| + uint32_t pad; |
| + uint64_t offset; |
| +}; |
| + |
| +#define DRM_MTK_GEM_CREATE 0x00 |
| +#define DRM_MTK_GEM_MAP_OFFSET 0x01 |
| + |
| +#define DRM_IOCTL_MTK_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + \ |
| + DRM_MTK_GEM_CREATE, struct drm_mtk_gem_create) |
| + |
| +#define DRM_IOCTL_MTK_GEM_MAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + \ |
| + DRM_MTK_GEM_MAP_OFFSET, struct drm_mtk_gem_map_off) |
| + |
| + |
| +#endif /* _UAPI_MEDIATEK_DRM_H */ |
| -- |
| 2.33.0.464.g1972c5931b-goog |
| |