From fb4177046de19730a784c3c16e4b73aab0ec6e41 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 12 Oct 2013 12:16:44 -0400 Subject: update signed/object prop types Signed-off-by: Rob Clark --- include/drm/drm_mode.h | 15 +++++++++++++++ tests/modetest/modetest.c | 35 +++++++++++++++++++++++++---------- tests/proptest/proptest.c | 44 +++++++++++++++++++++++++++++++++++--------- xf86drmMode.h | 9 +++++++++ 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h index 76fd76bf..476e7049 100644 --- a/include/drm/drm_mode.h +++ b/include/drm/drm_mode.h @@ -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]; diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index bee1a36b..d3252b64 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -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); diff --git a/tests/proptest/proptest.c b/tests/proptest/proptest.c index 4a569211..7618f63d 100644 --- a/tests/proptest/proptest.c +++ b/tests/proptest/proptest.c @@ -36,6 +36,10 @@ #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); diff --git a/xf86drmMode.h b/xf86drmMode.h index b260af7c..856a6bb0 100644 --- a/xf86drmMode.h +++ b/xf86drmMode.h @@ -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 */ -- cgit v1.2.3