summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2013-10-12 12:16:44 -0400
committerRob Clark <robclark@freedesktop.org>2014-11-24 19:56:50 -0500
commitfb4177046de19730a784c3c16e4b73aab0ec6e41 (patch)
tree7801e10d14aa85d38b94fd868b7124587f22ad28
parentc2c0346e1f5ddec4f6497d7c6359157c5f32d442 (diff)
update signed/object prop types
Signed-off-by: Rob Clark <robclark@freedesktop.org>
-rw-r--r--include/drm/drm_mode.h15
-rw-r--r--tests/modetest/modetest.c35
-rw-r--r--tests/proptest/proptest.c44
-rw-r--r--xf86drmMode.h9
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 */