diff options
| -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; |
