update signed/object prop types
authorRob Clark <robclark@freedesktop.org>
Sat, 12 Oct 2013 16:16:44 +0000 (12:16 -0400)
committerRob Clark <robclark@freedesktop.org>
Tue, 25 Nov 2014 00:56:50 +0000 (19:56 -0500)
Signed-off-by: Rob Clark <robclark@freedesktop.org>
include/drm/drm_mode.h
tests/modetest/modetest.c
tests/proptest/proptest.c
xf86drmMode.h

index 76fd76b..476e704 100644 (file)
@@ -239,6 +239,21 @@ struct drm_mode_get_connector {
 #define DRM_MODE_PROP_BLOB     (1<<4)
 #define DRM_MODE_PROP_BITMASK  (1<<5) /* bitmask of enumerated types */
 
+/* non-extended types: legacy bitmask, one bit per type: */
+#define DRM_MODE_PROP_LEGACY_TYPE  ( \
+               DRM_MODE_PROP_RANGE | \
+               DRM_MODE_PROP_ENUM | \
+               DRM_MODE_PROP_BLOB | \
+               DRM_MODE_PROP_BITMASK)
+
+/* extended-types: rather than continue to consume a bit per type,
+ * grab a chunk of the bits to use as integer type id.
+ */
+#define DRM_MODE_PROP_EXTENDED_TYPE    0x0000ffc0
+#define DRM_MODE_PROP_TYPE(n)          ((n) << 6)
+#define DRM_MODE_PROP_OBJECT           DRM_MODE_PROP_TYPE(1)
+#define DRM_MODE_PROP_SIGNED_RANGE     DRM_MODE_PROP_TYPE(2)
+
 struct drm_mode_property_enum {
        __u64 value;
        char name[DRM_PROP_NAME_LEN];
index bee1a36..d3252b6 100644 (file)
@@ -116,6 +116,10 @@ struct device {
 };
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+static inline int64_t U642I64(uint64_t val)
+{
+       return (int64_t)*((int64_t *)&val);
+}
 
 struct type_name {
        int type;
@@ -296,32 +300,43 @@ static void dump_prop(struct device *dev, drmModePropertyPtr prop,
        printf("\t\tflags:");
        if (prop->flags & DRM_MODE_PROP_PENDING)
                printf(" pending");
-       if (prop->flags & DRM_MODE_PROP_RANGE)
-               printf(" range");
        if (prop->flags & DRM_MODE_PROP_IMMUTABLE)
                printf(" immutable");
-       if (prop->flags & DRM_MODE_PROP_ENUM)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE))
+               printf(" signed range");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE))
+               printf(" range");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM))
                printf(" enum");
-       if (prop->flags & DRM_MODE_PROP_BITMASK)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK))
                printf(" bitmask");
-       if (prop->flags & DRM_MODE_PROP_BLOB)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
                printf(" blob");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_OBJECT))
+               printf(" object");
        printf("\n");
 
-       if (prop->flags & DRM_MODE_PROP_RANGE) {
+       if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE)) {
+               printf("\t\tvalues:");
+               for (i = 0; i < prop->count_values; i++)
+                       printf(" %"PRId64, U642I64(prop->values[i]));
+               printf("\n");
+       }
+
+       if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE)) {
                printf("\t\tvalues:");
                for (i = 0; i < prop->count_values; i++)
                        printf(" %"PRIu64, prop->values[i]);
                printf("\n");
        }
 
-       if (prop->flags & DRM_MODE_PROP_ENUM) {
+       if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM)) {
                printf("\t\tenums:");
                for (i = 0; i < prop->count_enums; i++)
                        printf(" %s=%llu", prop->enums[i].name,
                               prop->enums[i].value);
                printf("\n");
-       } else if (prop->flags & DRM_MODE_PROP_BITMASK) {
+       } else if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK)) {
                printf("\t\tvalues:");
                for (i = 0; i < prop->count_enums; i++)
                        printf(" %s=0x%llx", prop->enums[i].name,
@@ -331,7 +346,7 @@ static void dump_prop(struct device *dev, drmModePropertyPtr prop,
                assert(prop->count_enums == 0);
        }
 
-       if (prop->flags & DRM_MODE_PROP_BLOB) {
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB)) {
                printf("\t\tblobs:\n");
                for (i = 0; i < prop->count_blobs; i++)
                        dump_blob(dev, prop->blob_ids[i]);
@@ -341,7 +356,7 @@ static void dump_prop(struct device *dev, drmModePropertyPtr prop,
        }
 
        printf("\t\tvalue:");
-       if (prop->flags & DRM_MODE_PROP_BLOB)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
                dump_blob(dev, value);
        else
                printf(" %"PRIu64"\n", value);
index 4a56921..7618f63 100644 (file)
 #include "xf86drmMode.h"
 
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+static inline int64_t U642I64(uint64_t val)
+{
+       return (int64_t)*((int64_t *)&val);
+}
 
 int fd;
 drmModeResPtr res = NULL;
@@ -87,8 +91,10 @@ dump_blob(uint32_t blob_id)
        drmModePropertyBlobPtr blob;
 
        blob = drmModeGetPropertyBlob(fd, blob_id);
-       if (!blob)
+       if (!blob) {
+               printf("\n");
                return;
+       }
 
        blob_data = blob->data;
 
@@ -121,34 +127,54 @@ dump_prop(uint32_t prop_id, uint64_t value)
        printf("\t\tflags:");
        if (prop->flags & DRM_MODE_PROP_PENDING)
                printf(" pending");
-       if (prop->flags & DRM_MODE_PROP_RANGE)
-               printf(" range");
        if (prop->flags & DRM_MODE_PROP_IMMUTABLE)
                printf(" immutable");
-       if (prop->flags & DRM_MODE_PROP_ENUM)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE))
+               printf(" signed range");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE))
+               printf(" range");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM))
                printf(" enum");
-       if (prop->flags & DRM_MODE_PROP_BLOB)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK))
+               printf(" bitmask");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
                printf(" blob");
+       if (drm_property_type_is(prop, DRM_MODE_PROP_OBJECT))
+               printf(" object");
        printf("\n");
 
-       if (prop->flags & DRM_MODE_PROP_RANGE) {
+
+       if (drm_property_type_is(prop, DRM_MODE_PROP_SIGNED_RANGE)) {
+               printf("\t\tvalues:");
+               for (i = 0; i < prop->count_values; i++)
+                       printf(" %"PRId64, U642I64(prop->values[i]));
+               printf("\n");
+       }
+
+       if (drm_property_type_is(prop, DRM_MODE_PROP_RANGE)) {
                printf("\t\tvalues:");
                for (i = 0; i < prop->count_values; i++)
                        printf(" %"PRIu64, prop->values[i]);
                printf("\n");
        }
 
-       if (prop->flags & DRM_MODE_PROP_ENUM) {
+       if (drm_property_type_is(prop, DRM_MODE_PROP_ENUM)) {
                printf("\t\tenums:");
                for (i = 0; i < prop->count_enums; i++)
                        printf(" %s=%llu", prop->enums[i].name,
                               prop->enums[i].value);
                printf("\n");
+       } else if (drm_property_type_is(prop, DRM_MODE_PROP_BITMASK)) {
+               printf("\t\tvalues:");
+               for (i = 0; i < prop->count_enums; i++)
+                       printf(" %s=0x%llx", prop->enums[i].name,
+                              (1LL << prop->enums[i].value));
+               printf("\n");
        } else {
                assert(prop->count_enums == 0);
        }
 
-       if (prop->flags & DRM_MODE_PROP_BLOB) {
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB)) {
                printf("\t\tblobs:\n");
                for (i = 0; i < prop->count_blobs; i++)
                        dump_blob(prop->blob_ids[i]);
@@ -158,7 +184,7 @@ dump_prop(uint32_t prop_id, uint64_t value)
        }
 
        printf("\t\tvalue:");
-       if (prop->flags & DRM_MODE_PROP_BLOB)
+       if (drm_property_type_is(prop, DRM_MODE_PROP_BLOB))
                dump_blob(value);
        else
                printf(" %"PRIu64"\n", value);
index b260af7..856a6bb 100644 (file)
@@ -240,6 +240,15 @@ typedef struct _drmModeProperty {
        uint32_t *blob_ids; /* store the blob IDs */
 } drmModePropertyRes, *drmModePropertyPtr;
 
+static inline int drm_property_type_is(drmModePropertyPtr property,
+               uint32_t type)
+{
+       /* instanceof for props.. handles extended type vs original types: */
+       if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
+               return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type;
+       return property->flags & type;
+}
+
 typedef struct _drmModeCrtc {
        uint32_t crtc_id;
        uint32_t buffer_id; /**< FB id to connect to 0 = disconnect */