aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2012-09-12 23:22:31 -0400
committerDave Airlie <airlied@redhat.com>2014-06-03 23:23:11 -0400
commitebc44cf386734374983922c6fc1ae8ac47f88bef (patch)
tree84ce7743bac2ee1b2be5727792e65348a3499766
parent98f75de40e9d83c3a90d294b8fd25fa2874212a9 (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.c45
-rw-r--r--include/drm/drm_crtc.h12
-rw-r--r--include/uapi/drm/drm_mode.h1
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}
3214EXPORT_SYMBOL(drm_property_create_bitmask); 3214EXPORT_SYMBOL(drm_property_create_bitmask);
3215 3215
3216static 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}
3251EXPORT_SYMBOL(drm_property_create_range); 3257EXPORT_SYMBOL(drm_property_create_range);
3252 3258
3259struct 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}
3266EXPORT_SYMBOL(drm_property_create_signed_range);
3267
3253struct drm_property *drm_property_create_object(struct drm_device *dev, 3268struct 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
68static inline int64_t U642I64(uint64_t val)
69{
70 return (int64_t)*((int64_t *)&val);
71}
72static inline uint64_t I642U64(int64_t val)
73{
74 return (uint64_t)*((uint64_t *)&val);
75}
76
68enum drm_connector_force { 77enum 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,
982struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, 991struct 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);
994struct drm_property *drm_property_create_signed_range(struct drm_device *dev,
995 int flags, const char *name,
996 int64_t min, int64_t max);
985struct drm_property *drm_property_create_object(struct drm_device *dev, 997struct 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);
987extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); 999extern 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
269struct drm_mode_property_enum { 270struct drm_mode_property_enum {
270 __u64 value; 271 __u64 value;