build/patch/kernel/sunxi-dev/0073-drm-lima-add-DRM_LIMA_GEM_MOD-ioctl.patch

172 lines
5.8 KiB
Diff

From e0cc638d05b59eb60cd268106d883e1913c62de5 Mon Sep 17 00:00:00 2001
From: Qiang Yu <yuq825@gmail.com>
Date: Tue, 19 Jun 2018 22:22:09 +0800
Subject: [PATCH 073/146] drm/lima: add DRM_LIMA_GEM_MOD ioctl
Used to share buffer format across processes.
Signed-off-by: Qiang Yu <yuq825@gmail.com>
---
drivers/gpu/drm/lima/lima_drv.c | 13 ++++++++++++
drivers/gpu/drm/lima/lima_gem.c | 32 ++++++++++++++++++++++++++++++
drivers/gpu/drm/lima/lima_gem.h | 2 ++
drivers/gpu/drm/lima/lima_object.c | 2 ++
drivers/gpu/drm/lima/lima_object.h | 2 ++
include/uapi/drm/lima_drm.h | 11 ++++++++++
6 files changed, 62 insertions(+)
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
index e7004e4e1853..536d0d442970 100644
--- a/drivers/gpu/drm/lima/lima_drv.c
+++ b/drivers/gpu/drm/lima/lima_drv.c
@@ -243,6 +243,18 @@ static int lima_ioctl_ctx(struct drm_device *dev, void *data, struct drm_file *f
return -EINVAL;
}
+static int lima_ioctl_gem_mod(struct drm_device *dev, void *data, struct drm_file *file)
+{
+ struct drm_lima_gem_mod *args = data;
+
+ if (args->op == LIMA_GEM_MOD_OP_GET)
+ return lima_gem_get_modifier(file, args->handle, &args->modifier);
+ else if (args->op == LIMA_GEM_MOD_OP_SET)
+ return lima_gem_set_modifier(file, args->handle, args->modifier);
+
+ return -EINVAL;
+}
+
static int lima_drm_driver_open(struct drm_device *dev, struct drm_file *file)
{
int err;
@@ -287,6 +299,7 @@ static const struct drm_ioctl_desc lima_drm_driver_ioctls[] = {
DRM_IOCTL_DEF_DRV(LIMA_WAIT_FENCE, lima_ioctl_wait_fence, DRM_AUTH|DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(LIMA_GEM_WAIT, lima_ioctl_gem_wait, DRM_AUTH|DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(LIMA_CTX, lima_ioctl_ctx, DRM_AUTH|DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(LIMA_GEM_MOD, lima_ioctl_gem_mod, DRM_AUTH|DRM_RENDER_ALLOW),
};
static const struct file_operations lima_drm_driver_fops = {
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
index ee903ce17494..02bf76113a66 100644
--- a/drivers/gpu/drm/lima/lima_gem.c
+++ b/drivers/gpu/drm/lima/lima_gem.c
@@ -444,3 +444,35 @@ int lima_gem_wait(struct drm_file *file, u32 handle, u32 op, u64 timeout_ns)
drm_gem_object_put_unlocked(obj);
return ret;
}
+
+int lima_gem_get_modifier(struct drm_file *file, u32 handle, u64 *modifier)
+{
+ struct drm_gem_object *obj;
+ struct lima_bo *bo;
+
+ obj = drm_gem_object_lookup(file, handle);
+ if (!obj)
+ return -ENOENT;
+
+ bo = to_lima_bo(obj);
+ *modifier = bo->modifier;
+
+ drm_gem_object_put_unlocked(obj);
+ return 0;
+}
+
+int lima_gem_set_modifier(struct drm_file *file, u32 handle, u64 modifier)
+{
+ struct drm_gem_object *obj;
+ struct lima_bo *bo;
+
+ obj = drm_gem_object_lookup(file, handle);
+ if (!obj)
+ return -ENOENT;
+
+ bo = to_lima_bo(obj);
+ bo->modifier = modifier;
+
+ drm_gem_object_put_unlocked(obj);
+ return 0;
+}
diff --git a/drivers/gpu/drm/lima/lima_gem.h b/drivers/gpu/drm/lima/lima_gem.h
index 03daad9a85af..da6968fab6bb 100644
--- a/drivers/gpu/drm/lima/lima_gem.h
+++ b/drivers/gpu/drm/lima/lima_gem.h
@@ -19,5 +19,7 @@ int lima_gem_va_map(struct drm_file *file, u32 handle, u32 flags, u32 va);
int lima_gem_va_unmap(struct drm_file *file, u32 handle, u32 va);
int lima_gem_submit(struct drm_file *file, struct lima_submit *submit);
int lima_gem_wait(struct drm_file *file, u32 handle, u32 op, u64 timeout_ns);
+int lima_gem_get_modifier(struct drm_file *file, u32 handle, u64 *modifier);
+int lima_gem_set_modifier(struct drm_file *file, u32 handle, u64 modifier);
#endif
diff --git a/drivers/gpu/drm/lima/lima_object.c b/drivers/gpu/drm/lima/lima_object.c
index c44e1f81abf8..34d9b4dc2df6 100644
--- a/drivers/gpu/drm/lima/lima_object.c
+++ b/drivers/gpu/drm/lima/lima_object.c
@@ -2,6 +2,7 @@
/* Copyright 2018 Qiang Yu <yuq825@gmail.com> */
#include <drm/drm_prime.h>
+#include <drm/drm_fourcc.h>
#include "lima_object.h"
@@ -70,6 +71,7 @@ struct lima_bo *lima_bo_create(struct lima_device *dev, u64 size,
if (err)
goto err_out;
+ bo->modifier = DRM_FORMAT_MOD_INVALID;
return bo;
err_out:
diff --git a/drivers/gpu/drm/lima/lima_object.h b/drivers/gpu/drm/lima/lima_object.h
index 7286514c0f07..f854a25637f2 100644
--- a/drivers/gpu/drm/lima/lima_object.h
+++ b/drivers/gpu/drm/lima/lima_object.h
@@ -19,6 +19,8 @@ struct lima_bo {
struct ttm_bo_kmap_obj kmap;
struct list_head va;
+
+ u64 modifier;
};
static inline struct lima_bo *
diff --git a/include/uapi/drm/lima_drm.h b/include/uapi/drm/lima_drm.h
index e453bc4f0de4..77cb39af1a45 100644
--- a/include/uapi/drm/lima_drm.h
+++ b/include/uapi/drm/lima_drm.h
@@ -152,6 +152,15 @@ struct drm_lima_ctx {
__u32 id; /* in/out */
};
+#define LIMA_GEM_MOD_OP_GET 0
+#define LIMA_GEM_MOD_OP_SET 1
+
+struct drm_lima_gem_mod {
+ __u32 handle; /* in */
+ __u32 op; /* in */
+ __u64 modifier; /* in/out */
+};
+
#define DRM_LIMA_INFO 0x00
#define DRM_LIMA_GEM_CREATE 0x01
#define DRM_LIMA_GEM_INFO 0x02
@@ -160,6 +169,7 @@ struct drm_lima_ctx {
#define DRM_LIMA_WAIT_FENCE 0x05
#define DRM_LIMA_GEM_WAIT 0x06
#define DRM_LIMA_CTX 0x07
+#define DRM_LIMA_GEM_MOD 0x08
#define DRM_IOCTL_LIMA_INFO DRM_IOR(DRM_COMMAND_BASE + DRM_LIMA_INFO, struct drm_lima_info)
#define DRM_IOCTL_LIMA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_GEM_CREATE, struct drm_lima_gem_create)
@@ -169,6 +179,7 @@ struct drm_lima_ctx {
#define DRM_IOCTL_LIMA_WAIT_FENCE DRM_IOW(DRM_COMMAND_BASE + DRM_LIMA_WAIT_FENCE, struct drm_lima_wait_fence)
#define DRM_IOCTL_LIMA_GEM_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_LIMA_GEM_WAIT, struct drm_lima_gem_wait)
#define DRM_IOCTL_LIMA_CTX DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_CTX, struct drm_lima_ctx)
+#define DRM_IOCTL_LIMA_GEM_MOD DRM_IOWR(DRM_COMMAND_BASE + DRM_LIMA_GEM_MOD, struct drm_lima_gem_mod)
#if defined(__cplusplus)
}
--
2.17.1