packaging: set pc file name for devel package explicitly
[platform/upstream/libdrm.git] / xf86drmMode.c
index 2399e8e..bca5a91 100644 (file)
@@ -683,6 +683,7 @@ drm_public void drmModeFreeProperty(drmModePropertyPtr ptr)
 
        drmFree(ptr->values);
        drmFree(ptr->enums);
+       drmFree(ptr->blob_ids);
        drmFree(ptr);
 }
 
@@ -800,21 +801,13 @@ drm_public int drmCheckModesettingSupported(const char *busid)
        if (found)
                return 0;
 #elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
-       char kbusid[1024], sbusid[1024];
+       char sbusid[1024];
        char oid[128];
-       int domain, bus, dev, func;
        int i, modesetting, ret;
        size_t len;
 
-       ret = sscanf(busid, "pci:%04x:%02x:%02x.%d", &domain, &bus, &dev,
-           &func);
-       if (ret != 4)
-               return -EINVAL;
-       snprintf(kbusid, sizeof(kbusid), "pci:%04x:%02x:%02x.%d", domain, bus,
-           dev, func);
-
        /* How many GPUs do we expect in the machine ? */
-       for (i = 0; i < 16; i++) {
+       for (i = 0; i < 10; i++) {
                snprintf(oid, sizeof(oid), "hw.dri.%d.busid", i);
                len = sizeof(sbusid);
                ret = sysctlbyname(oid, sbusid, &len, NULL, 0);
@@ -823,7 +816,7 @@ drm_public int drmCheckModesettingSupported(const char *busid)
                                continue;
                        return -EINVAL;
                }
-               if (strcmp(sbusid, kbusid) != 0)
+               if (strcmp(sbusid, busid) != 0)
                        continue;
                snprintf(oid, sizeof(oid), "hw.dri.%d.modesetting", i);
                len = sizeof(modesetting);
@@ -887,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];
@@ -947,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;