support drm_user_handler to handle vendor events
authorBoram Park <boram1288.park@samsung.com>
Sun, 22 Nov 2015 04:06:49 +0000 (13:06 +0900)
committerHoegeun Kwon <hoegeun.kwon@samsung.com>
Tue, 8 Dec 2020 08:41:51 +0000 (17:41 +0900)
Add drm_user_hander to handle vendor drm events like ipp events.

Note: From tizen, this is used from libtdm vendor layer.

Change-Id: I23149a08d9f9f66f9929d95dcfe6a96c1c897404
Signed-off-by: Boram Park <boram1288.park@samsung.com>
check if user_handler_list inited

Change-Id: I95abd7e8cc8d0485a7cc06dca54bfa46775eb8aa
Signed-off-by: Boram Park <boram1288.park@samsung.com>
[inki.dae: add omitted patch from tizen libdrm-2.4.75]
Signed-off-by: Inki Dae <inki.dae@samsung.com>
[sw0312.kim: squash user_handler patches]
Signed-off-by: Seung-Woo Kim <sw0312.kim>
xf86drm.h
xf86drmMode.c

index 7b85079..0357d78 100644 (file)
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -805,6 +805,13 @@ typedef struct _drmEventContext {
 
 extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
 
+#define TIZEN_USE_USER_HANDLER
+#ifdef TIZEN_USE_USER_HANDLER
+typedef int (*drm_user_handler)(struct drm_event *event);
+extern int drmAddUserHandler(int fd, drm_user_handler handler);
+extern void drmRemoveUserHandler(int fd, drm_user_handler handler);
+#endif
+
 extern char *drmGetDeviceNameFromFd(int fd);
 
 /* Improved version of drmGetDeviceNameFromFd which attributes for any type of
index 5af27c4..bca5a91 100644 (file)
@@ -880,6 +880,63 @@ drm_public int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size,
        return DRM_IOCTL(fd, DRM_IOCTL_MODE_SETGAMMA, &l);
 }
 
+#ifdef TIZEN_USE_USER_HANDLER
+#include "libdrm_lists.h"
+#include <stdlib.h>
+
+struct drm_user_handler_data {
+       int fd;
+       drm_user_handler handler;
+       drmMMListHead link;
+};
+
+static drmMMListHead user_handler_list;
+static int user_handler_list_init = 0;
+
+drm_public int
+drmAddUserHandler(int fd, drm_user_handler handler)
+{
+       struct drm_user_handler_data *data = malloc(sizeof(struct drm_user_handler_data));
+
+       if (!data)
+               return -1;
+
+       data->fd = fd;
+       data->handler = handler;
+
+       if (!user_handler_list_init)
+       {
+               user_handler_list_init = 1;
+               DRMINITLISTHEAD(&user_handler_list);
+       }
+
+       DRMLISTADDTAIL(&data->link, &user_handler_list);
+
+       return 0;
+}
+
+drm_public void
+drmRemoveUserHandler(int fd, drm_user_handler handler)
+{
+       struct drm_user_handler_data *data;
+
+       if (!user_handler_list_init)
+       {
+               user_handler_list_init = 1;
+               DRMINITLISTHEAD(&user_handler_list);
+       }
+
+       DRMLISTFOREACHENTRY(data, &user_handler_list, link) {
+               if (data->fd == fd && data->handler == handler)
+               {
+                       DRMLISTDEL(&data->link);
+                       free(data);
+                       return;
+               }
+       }
+}
+#endif
+
 drm_public int drmHandleEvent(int fd, drmEventContextPtr evctx)
 {
        char buffer[1024];
@@ -940,6 +997,22 @@ drm_public int drmHandleEvent(int fd, drmEventContextPtr evctx)
                                                        seq->user_data);
                        break;
                default:
+#ifdef TIZEN_USE_USER_HANDLER
+                       {
+                               struct drm_user_handler_data *data;
+                               int ret = -1;
+                               if (!user_handler_list_init)
+                                       break;
+                               DRMLISTFOREACHENTRY(data, &user_handler_list, link) {
+                                       if (data->handler)
+                                       {
+                                               ret = data->handler(e);
+                                               if (ret == 0)
+                                                       break;
+                                       }
+                               }
+                       }
+#endif
                        break;
                }
                i += e->length;