The upcoming per-connector LUMINANCE range property needs to accept the
value 0 (to turn the display off on DPMS-off) even when its advertised
minimum is 1. The existing check special-cased a single device-wide
property object, which does not work once every connector owns its own
LUMINANCE property.

Add a kernel-internal is_luminance flag on struct drm_property and key
the value-0 exception off it instead of a pointer comparison. The flag
is not exposed to userspace.

Signed-off-by: Mario Limonciello (AMD) <[email protected]>
---
 drivers/gpu/drm/drm_property.c |  6 ++++++
 include/drm/drm_property.h     | 10 ++++++++++
 2 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
index f38f2c5437e68..adccee10cfde4 100644
--- a/drivers/gpu/drm/drm_property.c
+++ b/drivers/gpu/drm/drm_property.c
@@ -952,6 +952,12 @@ bool drm_property_change_valid_get(struct drm_property 
*property,
        *ref = NULL;
 
        if (drm_property_type_is(property, DRM_MODE_PROP_RANGE)) {
+               /*
+                * Special case for the luminance property: allow 0 to turn the
+                * display off even when the normal range starts at 1.
+                */
+               if (property->is_luminance && value == 0 && property->values[1] 
> 0)
+                       return true;
                if (value < property->values[0] || value > property->values[1])
                        return false;
                return true;
diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h
index aa49b5a42bb56..8bb568a4cd485 100644
--- a/include/drm/drm_property.h
+++ b/include/drm/drm_property.h
@@ -188,6 +188,16 @@ struct drm_property {
         */
        struct drm_device *dev;
 
+       /**
+        * @is_luminance:
+        *
+        * True for the per-connector LUMINANCE range property. Such a property
+        * additionally accepts the value 0 (to turn the display off) even when
+        * its minimum is 1. This is a kernel-internal flag and is not exposed
+        * to userspace.
+        */
+       bool is_luminance;
+
        /**
         * @enum_list:
         *
-- 
2.43.0

Reply via email to