packaging: set pc file name for devel package explicitly
[platform/upstream/libdrm.git] / xf86drmMode.c
index c878d9e..bca5a91 100644 (file)
@@ -42,7 +42,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <sys/ioctl.h>
-#ifdef HAVE_SYS_SYSCTL_H
+#if HAVE_SYS_SYSCTL_H
 #include <sys/sysctl.h>
 #endif
 #include <stdio.h>
@@ -650,7 +650,7 @@ drm_public drmModePropertyPtr drmModeGetProperty(int fd, uint32_t property_id)
        }
 
        if (!(r = drmMalloc(sizeof(*r))))
-               return NULL;
+               goto err_allocs;
 
        r->prop_id = prop.prop_id;
        r->count_values = prop.count_values;
@@ -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;
@@ -1594,3 +1660,38 @@ drmModeRevokeLease(int fd, uint32_t lessee_id)
                return 0;
        return -errno;
 }
+
+drm_public drmModeFB2Ptr
+drmModeGetFB2(int fd, uint32_t fb_id)
+{
+       struct drm_mode_fb_cmd2 get = {
+               .fb_id = fb_id,
+       };
+       drmModeFB2Ptr ret;
+       int err;
+
+       err = DRM_IOCTL(fd, DRM_IOCTL_MODE_GETFB2, &get);
+       if (err != 0)
+               return NULL;
+
+       ret = drmMalloc(sizeof(drmModeFB2));
+       if (!ret)
+               return NULL;
+
+       ret->fb_id = fb_id;
+       ret->width = get.width;
+       ret->height = get.height;
+       ret->pixel_format = get.pixel_format;
+       ret->flags = get.flags;
+       ret->modifier = get.modifier[0];
+       memcpy(ret->handles, get.handles, sizeof(uint32_t) * 4);
+       memcpy(ret->pitches, get.pitches, sizeof(uint32_t) * 4);
+       memcpy(ret->offsets, get.offsets, sizeof(uint32_t) * 4);
+
+       return ret;
+}
+
+drm_public void drmModeFreeFB2(drmModeFB2Ptr ptr)
+{
+       drmFree(ptr);
+}