OSDN Git Service

modetest: remove cursor/page_flipping_supported stubs
[android-x86/external-libdrm.git] / exynos / exynos_drm.c
index 5d07ea7..b008ad7 100644 (file)
  *    Inki Dae <inki.dae@samsung.com>
  */
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <unistd.h>
 
 #include <sys/mman.h>
 #include <linux/stddef.h>
@@ -42,6 +39,8 @@
 #include "exynos_drm.h"
 #include "exynos_drmif.h"
 
+#define U642VOID(x) ((void *)(unsigned long)(x))
+
 /*
  * Create exynos drm device object.
  *
@@ -89,7 +88,7 @@ drm_public void exynos_device_destroy(struct exynos_device *dev)
  * if true, return a exynos buffer object else NULL.
  */
 drm_public struct exynos_bo * exynos_bo_create(struct exynos_device *dev,
-                                              size_t size, uint32_t flags)
+                                               size_t size, uint32_t flags)
 {
        struct exynos_bo *bo;
        struct drm_exynos_gem_create req = {
@@ -143,7 +142,7 @@ fail:
  * if true, return 0 else negative.
  */
 drm_public int exynos_bo_get_info(struct exynos_device *dev, uint32_t handle,
-                                 size_t *size, uint32_t *flags)
+                                  size_t *size, uint32_t *flags)
 {
        int ret;
        struct drm_exynos_gem_info req = {
@@ -277,7 +276,7 @@ drm_public uint32_t exynos_bo_handle(struct exynos_bo *bo)
  * @bo: a exynos buffer object including a gem object handle to be mmapped
  *     to user space.
  *
- * if true, user pointer mmaped else NULL.
+ * if true, user pointer mmapped else NULL.
  */
 drm_public void *exynos_bo_map(struct exynos_bo *bo)
 {
@@ -344,7 +343,7 @@ exynos_prime_fd_to_handle(struct exynos_device *dev, int fd, uint32_t *handle)
  *
  * @dev: a exynos device object.
  * @connect: indicate whether connectoin or disconnection request.
- * @ext: indicate whether edid data includes extentions data or not.
+ * @ext: indicate whether edid data includes extensions data or not.
  * @edid: a pointer to edid data from Wireless Display device.
  *
  * this interface is used to request Virtual Display driver connection or
@@ -374,3 +373,76 @@ exynos_vidi_connection(struct exynos_device *dev, uint32_t connect,
 
        return 0;
 }
+
+static void
+exynos_handle_vendor(int fd, struct drm_event *e, void *ctx)
+{
+       struct drm_exynos_g2d_event *g2d;
+       struct exynos_event_context *ectx = ctx;
+
+       switch (e->type) {
+               case DRM_EXYNOS_G2D_EVENT:
+                       if (ectx->version < 1 || ectx->g2d_event_handler == NULL)
+                               break;
+                       g2d = (struct drm_exynos_g2d_event *)e;
+                       ectx->g2d_event_handler(fd, g2d->cmdlist_no, g2d->tv_sec,
+                                               g2d->tv_usec, U642VOID(g2d->user_data));
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+drm_public int
+exynos_handle_event(struct exynos_device *dev, struct exynos_event_context *ctx)
+{
+       char buffer[1024];
+       int len, i;
+       struct drm_event *e;
+       struct drm_event_vblank *vblank;
+       drmEventContextPtr evctx = &ctx->base;
+
+       /* The DRM read semantics guarantees that we always get only
+        * complete events. */
+       len = read(dev->fd, buffer, sizeof buffer);
+       if (len == 0)
+               return 0;
+       if (len < (int)sizeof *e)
+               return -1;
+
+       i = 0;
+       while (i < len) {
+               e = (struct drm_event *)(buffer + i);
+               switch (e->type) {
+               case DRM_EVENT_VBLANK:
+                       if (evctx->version < 1 ||
+                           evctx->vblank_handler == NULL)
+                               break;
+                       vblank = (struct drm_event_vblank *) e;
+                       evctx->vblank_handler(dev->fd,
+                                             vblank->sequence,
+                                             vblank->tv_sec,
+                                             vblank->tv_usec,
+                                             U642VOID (vblank->user_data));
+                       break;
+               case DRM_EVENT_FLIP_COMPLETE:
+                       if (evctx->version < 2 ||
+                           evctx->page_flip_handler == NULL)
+                               break;
+                       vblank = (struct drm_event_vblank *) e;
+                       evctx->page_flip_handler(dev->fd,
+                                                vblank->sequence,
+                                                vblank->tv_sec,
+                                                vblank->tv_usec,
+                                                U642VOID (vblank->user_data));
+                       break;
+               default:
+                       exynos_handle_vendor(dev->fd, e, evctx);
+                       break;
+               }
+               i += e->length;
+       }
+
+       return 0;
+}