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
