#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];
};
#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;
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,
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]);
}
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);
#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;
drmModePropertyBlobPtr blob;
blob = drmModeGetPropertyBlob(fd, blob_id);
- if (!blob)
+ if (!blob) {
+ printf("\n");
return;
+ }
blob_data = blob->data;
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]);
}
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);
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 */