diff options
author | Rob Clark <robdclark@gmail.com> | 2012-09-12 23:22:31 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-06-03 23:23:11 -0400 |
commit | ebc44cf386734374983922c6fc1ae8ac47f88bef (patch) | |
tree | 84ce7743bac2ee1b2be5727792e65348a3499766 | |
parent | 98f75de40e9d83c3a90d294b8fd25fa2874212a9 (diff) |
drm: add signed-range property type
Like range, but values are signed.
Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 45 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 12 | ||||
-rw-r--r-- | include/uapi/drm/drm_mode.h | 1 |
3 files changed, 46 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index f990d9f180f0..6127073407e0 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -3213,6 +3213,22 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev, | |||
3213 | } | 3213 | } |
3214 | EXPORT_SYMBOL(drm_property_create_bitmask); | 3214 | EXPORT_SYMBOL(drm_property_create_bitmask); |
3215 | 3215 | ||
3216 | static struct drm_property *property_create_range(struct drm_device *dev, | ||
3217 | int flags, const char *name, | ||
3218 | uint64_t min, uint64_t max) | ||
3219 | { | ||
3220 | struct drm_property *property; | ||
3221 | |||
3222 | property = drm_property_create(dev, flags, name, 2); | ||
3223 | if (!property) | ||
3224 | return NULL; | ||
3225 | |||
3226 | property->values[0] = min; | ||
3227 | property->values[1] = max; | ||
3228 | |||
3229 | return property; | ||
3230 | } | ||
3231 | |||
3216 | /** | 3232 | /** |
3217 | * drm_property_create - create a new ranged property type | 3233 | * drm_property_create - create a new ranged property type |
3218 | * @dev: drm device | 3234 | * @dev: drm device |
@@ -3235,21 +3251,20 @@ struct drm_property *drm_property_create_range(struct drm_device *dev, int flags | |||
3235 | const char *name, | 3251 | const char *name, |
3236 | uint64_t min, uint64_t max) | 3252 | uint64_t min, uint64_t max) |
3237 | { | 3253 | { |
3238 | struct drm_property *property; | 3254 | return property_create_range(dev, DRM_MODE_PROP_RANGE | flags, |
3239 | 3255 | name, min, max); | |
3240 | flags |= DRM_MODE_PROP_RANGE; | ||
3241 | |||
3242 | property = drm_property_create(dev, flags, name, 2); | ||
3243 | if (!property) | ||
3244 | return NULL; | ||
3245 | |||
3246 | property->values[0] = min; | ||
3247 | property->values[1] = max; | ||
3248 | |||
3249 | return property; | ||
3250 | } | 3256 | } |
3251 | EXPORT_SYMBOL(drm_property_create_range); | 3257 | EXPORT_SYMBOL(drm_property_create_range); |
3252 | 3258 | ||
3259 | struct drm_property *drm_property_create_signed_range(struct drm_device *dev, | ||
3260 | int flags, const char *name, | ||
3261 | int64_t min, int64_t max) | ||
3262 | { | ||
3263 | return property_create_range(dev, DRM_MODE_PROP_SIGNED_RANGE | flags, | ||
3264 | name, I642U64(min), I642U64(max)); | ||
3265 | } | ||
3266 | EXPORT_SYMBOL(drm_property_create_signed_range); | ||
3267 | |||
3253 | struct drm_property *drm_property_create_object(struct drm_device *dev, | 3268 | struct drm_property *drm_property_create_object(struct drm_device *dev, |
3254 | int flags, const char *name, uint32_t type) | 3269 | int flags, const char *name, uint32_t type) |
3255 | { | 3270 | { |
@@ -3685,6 +3700,12 @@ static bool drm_property_change_is_valid(struct drm_property *property, | |||
3685 | if (value < property->values[0] || value > property->values[1]) | 3700 | if (value < property->values[0] || value > property->values[1]) |
3686 | return false; | 3701 | return false; |
3687 | return true; | 3702 | return true; |
3703 | } else if (drm_property_type_is(property, DRM_MODE_PROP_SIGNED_RANGE)) { | ||
3704 | int64_t svalue = U642I64(value); | ||
3705 | if (svalue < U642I64(property->values[0]) || | ||
3706 | svalue > U642I64(property->values[1])) | ||
3707 | return false; | ||
3708 | return true; | ||
3688 | } else if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) { | 3709 | } else if (drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) { |
3689 | int i; | 3710 | int i; |
3690 | uint64_t valid_mask = 0; | 3711 | uint64_t valid_mask = 0; |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index cb2e599f769f..849cfdccff09 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -65,6 +65,15 @@ struct drm_object_properties { | |||
65 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; | 65 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | static inline int64_t U642I64(uint64_t val) | ||
69 | { | ||
70 | return (int64_t)*((int64_t *)&val); | ||
71 | } | ||
72 | static inline uint64_t I642U64(int64_t val) | ||
73 | { | ||
74 | return (uint64_t)*((uint64_t *)&val); | ||
75 | } | ||
76 | |||
68 | enum drm_connector_force { | 77 | enum drm_connector_force { |
69 | DRM_FORCE_UNSPECIFIED, | 78 | DRM_FORCE_UNSPECIFIED, |
70 | DRM_FORCE_OFF, | 79 | DRM_FORCE_OFF, |
@@ -982,6 +991,9 @@ struct drm_property *drm_property_create_bitmask(struct drm_device *dev, | |||
982 | struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, | 991 | struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, |
983 | const char *name, | 992 | const char *name, |
984 | uint64_t min, uint64_t max); | 993 | uint64_t min, uint64_t max); |
994 | struct drm_property *drm_property_create_signed_range(struct drm_device *dev, | ||
995 | int flags, const char *name, | ||
996 | int64_t min, int64_t max); | ||
985 | struct drm_property *drm_property_create_object(struct drm_device *dev, | 997 | struct drm_property *drm_property_create_object(struct drm_device *dev, |
986 | int flags, const char *name, uint32_t type); | 998 | int flags, const char *name, uint32_t type); |
987 | extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); | 999 | extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); |
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h index 57f46348befe..def54f9e07ca 100644 --- a/include/uapi/drm/drm_mode.h +++ b/include/uapi/drm/drm_mode.h | |||
@@ -265,6 +265,7 @@ struct drm_mode_get_connector { | |||
265 | #define DRM_MODE_PROP_EXTENDED_TYPE 0x0000ffc0 | 265 | #define DRM_MODE_PROP_EXTENDED_TYPE 0x0000ffc0 |
266 | #define DRM_MODE_PROP_TYPE(n) ((n) << 6) | 266 | #define DRM_MODE_PROP_TYPE(n) ((n) << 6) |
267 | #define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_TYPE(1) | 267 | #define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_TYPE(1) |
268 | #define DRM_MODE_PROP_SIGNED_RANGE DRM_MODE_PROP_TYPE(2) | ||
268 | 269 | ||
269 | struct drm_mode_property_enum { | 270 | struct drm_mode_property_enum { |
270 | __u64 value; | 271 | __u64 value; |