This event is specific to Exynos G2D DRM driver. Only
process it when Exynos support is enabled.

Signed-off-by: Tobias Jakobi <tjak...@math.uni-bielefeld.de>
---
 exynos/exynos_drm.h | 12 ++++++++++++
 xf86drm.h           |  7 ++++++-
 xf86drmMode.c       | 18 ++++++++++++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/exynos/exynos_drm.h b/exynos/exynos_drm.h
index 256c02f..c3af0ac 100644
--- a/exynos/exynos_drm.h
+++ b/exynos/exynos_drm.h
@@ -157,4 +157,16 @@ struct drm_exynos_g2d_exec {
 #define DRM_IOCTL_EXYNOS_G2D_EXEC              DRM_IOWR(DRM_COMMAND_BASE + \
                DRM_EXYNOS_G2D_EXEC, struct drm_exynos_g2d_exec)
 
+/* EXYNOS specific events */
+#define DRM_EXYNOS_G2D_EVENT           0x80000000
+
+struct drm_exynos_g2d_event {
+       struct drm_event        base;
+       __u64                           user_data;
+       __u32                           tv_sec;
+       __u32                           tv_usec;
+       __u32                           cmdlist_no;
+       __u32                           reserved;
+};
+
 #endif
diff --git a/xf86drm.h b/xf86drm.h
index 40c55c9..6b1c9b4 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -719,7 +719,7 @@ extern void drmMsg(const char *format, ...) 
DRM_PRINTFLIKE(1, 2);
 extern int drmSetMaster(int fd);
 extern int drmDropMaster(int fd);
 
-#define DRM_EVENT_CONTEXT_VERSION 2
+#define DRM_EVENT_CONTEXT_VERSION 3
 
 typedef struct _drmEventContext {
 
@@ -739,6 +739,11 @@ typedef struct _drmEventContext {
                                  unsigned int tv_usec,
                                  void *user_data);
 
+       void (*g2d_event_handler)(int fd,
+                                 unsigned int cmdlist_no,
+                                 unsigned int tv_sec,
+                                 unsigned int tv_usec,
+                                 void *user_data);
 } drmEventContext, *drmEventContextPtr;
 
 extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
diff --git a/xf86drmMode.c b/xf86drmMode.c
index 61d5e01..d9f2898 100644
--- a/xf86drmMode.c
+++ b/xf86drmMode.c
@@ -53,6 +53,10 @@
 #include <unistd.h>
 #include <errno.h>
 
+#ifdef HAVE_EXYNOS
+#include <exynos/exynos_drm.h>
+#endif
+
 #ifdef HAVE_VALGRIND
 #include <valgrind.h>
 #include <memcheck.h>
@@ -846,6 +850,7 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx)
        int len, i;
        struct drm_event *e;
        struct drm_event_vblank *vblank;
+       struct drm_exynos_g2d_event *g2d;
        
        /* The DRM read semantics guarantees that we always get only
         * complete events. */
@@ -882,6 +887,19 @@ int drmHandleEvent(int fd, drmEventContextPtr evctx)
                                                 vblank->tv_usec,
                                                 U642VOID (vblank->user_data));
                        break;
+#ifdef HAVE_EXYNOS
+               case DRM_EXYNOS_G2D_EVENT:
+                       if (evctx->version < 3 ||
+                           evctx->g2d_event_handler == NULL)
+                               break;
+                       g2d = (struct drm_exynos_g2d_event *) e;
+                       evctx->g2d_event_handler(fd,
+                                                g2d->cmdlist_no,
+                                                g2d->tv_sec,
+                                                g2d->tv_usec,
+                                                U642VOID (g2d->user_data));
+                       break;
+#endif
                default:
                        break;
                }
-- 
2.0.5

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to