diff --git a/backend/drm/properties.c b/backend/drm/properties.c index 75881f69b..9b69530d8 100644 --- a/backend/drm/properties.c +++ b/backend/drm/properties.c @@ -234,3 +234,25 @@ bool introspect_drm_prop_range(int fd, uint32_t prop_id, drmModeFreeProperty(prop); return true; } + +bool introspect_drm_prop_enum(int fd, uint32_t prop_id, uint64_t *bitmask) { + drmModePropertyRes *prop = drmModeGetProperty(fd, prop_id); + if (!prop) { + return false; + } + + if (drmModeGetPropertyType(prop) != DRM_MODE_PROP_ENUM) { + drmModeFreeProperty(prop); + return false; + } + + *bitmask = 0; + for (int i = 0; i < prop->count_enums; i++) { + uint64_t value = prop->enums[i].value; + assert(value < 64); + *bitmask |= 1 << value; + } + + drmModeFreeProperty(prop); + return true; +} diff --git a/include/backend/drm/properties.h b/include/backend/drm/properties.h index 09fb00881..e18f87cf3 100644 --- a/include/backend/drm/properties.h +++ b/include/backend/drm/properties.h @@ -106,5 +106,6 @@ char *get_drm_prop_enum(int fd, uint32_t obj, uint32_t prop); bool introspect_drm_prop_range(int fd, uint32_t prop_id, uint64_t *min, uint64_t *max); +bool introspect_drm_prop_enum(int fd, uint32_t prop_id, uint64_t *bitmask); #endif