| From 604c97ddb977f02daef65591a862f70752b5d9d0 Mon Sep 17 00:00:00 2001 |
| From: Mark Yao <yzq@rock-chips.com> |
| Date: Wed, 8 Oct 2014 17:11:15 +0800 |
| Subject: [PATCH] CHROMIUM: drm/rockchip: Add GEM create ioctl support |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Rockchip Socs have GPU, we need allocate GPU accelerated buffers. |
| So add special ioctls GEM_CREATE/GEM_MAP_OFFSET to support |
| accelerated buffers. |
| |
| Signed-off-by: Mark Yao <mark.yao@rock-chips.com> |
| |
| BUG=chromium:941638 |
| TEST=With rest of patch set, can boot to UI on eDP |
| |
| Reviewed-on: https://chromium-review.googlesource.com/222153 |
| Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> |
| Tested-by: Daniel Kurtz <djkurtz@chromium.org> |
| Commit-Queue: Daniel Kurtz <djkurtz@chromium.org> |
| Conflicts: |
| drivers/gpu/drm/rockchip/rockchip_drm_drv.c |
| (cherry picked from cros/chromeos-3.14 commit c29c5a3037e18815937d8af664738e499ada94d1) |
| Signed-off-by: ZhengShunQian <zhengsq@rock-chips.com> |
| |
| Reviewed-on: https://chromium-review.googlesource.com/346321 |
| Commit-Ready: Yakir Yang <ykk@rock-chips.com> |
| Tested-by: Yakir Yang <ykk@rock-chips.com> |
| Reviewed-by: Tomasz Figa <tfiga@chromium.org> |
| |
| Change-Id: I2fb5a2011c973bbab16b47713754de44cfa0252f |
| Conflicts: |
| drivers/gpu/drm/rockchip/rockchip_drm_gem.h |
| [dianders: Fixed to account for commit 8cfd4f5de496 ("drm/rockchip: |
| Use .dumb_map_offset and .dumb_destroy defaults") upstream]; also |
| removed 2nd copy of rockchip_gem_map_offset_ioctl prototype; use SPDX |
| header now too] |
| (cherry picked from commit a6c56450f406dc75a3be59724cefd6075244fb15) |
| Signed-off-by: Douglas Anderson <dianders@chromium.org> |
| Reviewed-on: https://chromium-review.googlesource.com/1538897 |
| Reviewed-by: Stéphane Marchesin <marcheu@chromium.org> |
| |
| Conflicts: |
| drivers/gpu/drm/rockchip/rockchip_drm_drv.c |
| |
| [rebase54(mka): added 'WITH Linux-syscall-note' to SPDX license identifer |
| fixed context delta in includes] |
| [rebase54(groeck): Added missing include files to |
| include/uapi/drm/rockchip_drm.h; do not rely on drm.h] |
| Signed-off-by: Matthias Kaehlcke <mka@chromium.org> |
| [rebase510(groeck): Squashed: |
| CHROMIUM: drm/rockchip: Enable render node |
| ] |
| Signed-off-by: Guenter Roeck <groeck@chromium.org> |
| |
| Change-Id: I0261e4980c178876e84dd5049b9ea49657b13bf9 |
| --- |
| drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 14 ++++- |
| drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 21 ++++++++ |
| drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 13 +++++ |
| include/uapi/drm/rockchip_drm.h | 58 +++++++++++++++++++++ |
| 4 files changed, 105 insertions(+), 1 deletion(-) |
| create mode 100644 include/uapi/drm/rockchip_drm.h |
| |
| diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c |
| index 212bd87c0c4a..6b1f53cc8ec6 100644 |
| --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c |
| +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c |
| @@ -22,6 +22,7 @@ |
| #include <drm/drm_of.h> |
| #include <drm/drm_probe_helper.h> |
| #include <drm/drm_vblank.h> |
| +#include <drm/rockchip_drm.h> |
| |
| #include "rockchip_drm_drv.h" |
| #include "rockchip_drm_fb.h" |
| @@ -198,6 +199,14 @@ static void rockchip_drm_unbind(struct device *dev) |
| drm_dev_put(drm_dev); |
| } |
| |
| +static const struct drm_ioctl_desc rockchip_ioctls[] = { |
| + DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_CREATE, rockchip_gem_create_ioctl, |
| + DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW), |
| + DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_MAP_OFFSET, |
| + rockchip_gem_map_offset_ioctl, |
| + DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW), |
| +}; |
| + |
| static const struct file_operations rockchip_drm_driver_fops = { |
| .owner = THIS_MODULE, |
| .open = drm_open, |
| @@ -210,13 +219,16 @@ static const struct file_operations rockchip_drm_driver_fops = { |
| }; |
| |
| static const struct drm_driver rockchip_drm_driver = { |
| - .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, |
| + .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC | |
| + DRIVER_RENDER, |
| .lastclose = drm_fb_helper_lastclose, |
| .dumb_create = rockchip_gem_dumb_create, |
| .prime_handle_to_fd = drm_gem_prime_handle_to_fd, |
| .prime_fd_to_handle = drm_gem_prime_fd_to_handle, |
| .gem_prime_import_sg_table = rockchip_gem_prime_import_sg_table, |
| .gem_prime_mmap = rockchip_gem_mmap_buf, |
| + .ioctls = rockchip_ioctls, |
| + .num_ioctls = ARRAY_SIZE(rockchip_ioctls), |
| .fops = &rockchip_drm_driver_fops, |
| .name = DRIVER_NAME, |
| .desc = DRIVER_DESC, |
| diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c |
| index 7971f57436dd..6b205b42c5cd 100644 |
| --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c |
| +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c |
| @@ -13,6 +13,7 @@ |
| #include <drm/drm_gem_cma_helper.h> |
| #include <drm/drm_prime.h> |
| #include <drm/drm_vma_manager.h> |
| +#include <drm/rockchip_drm.h> |
| |
| #include "rockchip_drm_drv.h" |
| #include "rockchip_drm_gem.h" |
| @@ -439,6 +440,26 @@ int rockchip_gem_dumb_create(struct drm_file *file_priv, |
| return PTR_ERR_OR_ZERO(rk_obj); |
| } |
| |
| +int rockchip_gem_map_offset_ioctl(struct drm_device *drm, void *data, |
| + struct drm_file *file_priv) |
| +{ |
| + struct drm_rockchip_gem_map_off *args = data; |
| + |
| + return drm_gem_dumb_map_offset(file_priv, drm, args->handle, |
| + &args->offset); |
| +} |
| + |
| +int rockchip_gem_create_ioctl(struct drm_device *dev, void *data, |
| + struct drm_file *file_priv) |
| +{ |
| + struct drm_rockchip_gem_create *args = data; |
| + struct rockchip_gem_object *rk_obj; |
| + |
| + rk_obj = rockchip_gem_create_with_handle(file_priv, dev, args->size, |
| + &args->handle); |
| + return PTR_ERR_OR_ZERO(rk_obj); |
| +} |
| + |
| /* |
| * Allocate a sg_table for this GEM object. |
| * Note: Both the table's contents, and the sg_table itself must be freed by |
| diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h |
| index 5a70a56cd406..a7d5c2596eb2 100644 |
| --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h |
| +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h |
| @@ -50,4 +50,17 @@ void rockchip_gem_free_object(struct drm_gem_object *obj); |
| int rockchip_gem_dumb_create(struct drm_file *file_priv, |
| struct drm_device *dev, |
| struct drm_mode_create_dumb *args); |
| + |
| +/* |
| + * request gem object creation and buffer allocation as the size |
| + * that it is calculated with framebuffer information such as width, |
| + * height and bpp. |
| + */ |
| +int rockchip_gem_create_ioctl(struct drm_device *dev, void *data, |
| + struct drm_file *file_priv); |
| + |
| +/* get buffer offset to map to user space. */ |
| +int rockchip_gem_map_offset_ioctl(struct drm_device *dev, void *data, |
| + struct drm_file *file_priv); |
| + |
| #endif /* _ROCKCHIP_DRM_GEM_H */ |
| diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h |
| new file mode 100644 |
| index 000000000000..d6e0fb5ae4bb |
| --- /dev/null |
| +++ b/include/uapi/drm/rockchip_drm.h |
| @@ -0,0 +1,58 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| + |
| +/* |
| + * Copyright (c) Fuzhou Rockchip Electronics Co.Ltd |
| + * Authors: |
| + * Mark Yao <yzq@rock-chips.com> |
| + * |
| + * base on exynos_drm.h |
| + */ |
| + |
| +#ifndef _UAPI_ROCKCHIP_DRM_H |
| +#define _UAPI_ROCKCHIP_DRM_H |
| + |
| +#ifndef __KERNEL__ |
| +#include <stdint.h> |
| +#endif |
| + |
| +#include <drm/drm.h> |
| +#include <linux/types.h> |
| + |
| +/** |
| + * User-desired buffer creation information structure. |
| + * |
| + * @size: user-desired memory allocation size. |
| + * @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_rockchip_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_rockchip_gem_map_off { |
| + uint32_t handle; |
| + uint32_t pad; |
| + uint64_t offset; |
| +}; |
| + |
| +#define DRM_ROCKCHIP_GEM_CREATE 0x00 |
| +#define DRM_ROCKCHIP_GEM_MAP_OFFSET 0x01 |
| + |
| +#define DRM_IOCTL_ROCKCHIP_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + \ |
| + DRM_ROCKCHIP_GEM_CREATE, struct drm_rockchip_gem_create) |
| + |
| +#define DRM_IOCTL_ROCKCHIP_GEM_MAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + \ |
| + DRM_ROCKCHIP_GEM_MAP_OFFSET, struct drm_rockchip_gem_map_off) |
| + |
| +#endif /* _UAPI_ROCKCHIP_DRM_H */ |
| -- |
| 2.17.1 |
| |