* [PATCH v8 00/14] Add support for a DRM backlight capability
@ 2026-09-08 4:40 Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
` (15 more replies)
0 siblings, 16 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello
At Display Next Hackfest 2026 we reviewed progress moving brightness
control into the DRM connector properties.
There is a range LUMINANCE property that will default to 0->0.
Once a driver attaches a backlight it will be updated to 1->max.
If the panel supports the minimum backlight turning off the display
the range can later be updated to 0->max instead of 1->max.
The legacy sysfs interface is synchronized with the DRM connector.
When a compositor using this feature is loaded, sysfs writes are disabled
to prevent legacy tools from going out of sync with the compositor.
This has an implementation initially for amdgpu, i915, and Xe with eDP
connectors. It can be extended to other connectors like DP for displays
that can be controlled via DDC as well later.
The following compositors have implemented matching support:
* Kwin: https://invent.kde.org/plasma/kwin/-/merge_requests/9298
* Mutter: https://gitlab.gnome.org/swick/mutter/-/commits/wip/kms-luminance-prop
* Wlroots: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5384
v7->v8:
- Rebase on v7.3-rc2
- backlight: add kernel-internal backlight API:
- Inhibit legacy "bl_power" sysfs writes during a DRM takeover, not
just "brightness", so the takeover is fully exclusive.
- backlight_set_brightness() now returns -ENXIO (and skips the uevent)
instead of reporting a false success when the device has no ops.
- Release ops_lock before emitting the change uevent.
- drm: add connector backlight (LUMINANCE) infrastructure:
- Take a reference in drm_backlight_get_device() and drop it in the
sysfs-link callers to close a use-after-free.
- Unlink any still-linked backend in drm_backlight_connector_cleanup()
instead of only WARN()ing, so a connector torn down on a probe-error
path no longer leaks a global-list entry / pending work item (also
removes an unconditional lockdep assertion).
- Guard the backend pointer against a concurrent re-link while
unlinking.
- Drop the redundant luminance restore in the bridge-enable path that
dereferenced the live connector state; the commit tail already
applies it from the new state.
- drm: add DRM_CLIENT_CAP_LUMINANCE:
- Serialize the capability change so concurrent ioctls on a shared fd
cannot unbalance the inhibit count.
- Track the legacy-inhibit device-wide so connectors hotplugged (e.g.
DP MST) while the capability is active inherit it, and no longer
trigger warnings when the client exits.
- drm/amd/display: Pass up errors reading actual brightness:
- Also return -EINVAL from the legacy PWM read error path (previously
returned the cached value), matching the KUnit test.
- drm/amd/display: use drm backlight:
- Apply the LUMINANCE property on modeset commits too, and avoid a NULL
CRTC-state dereference on brightness-only commits.
- drm/xe: Indicate support for luminance on the connector:
- Drop an unrelated DRIVER_GEM_GPUVA change squashed in by mistake.
- drm/i915/display: use drm backlight:
- Remove an unused <drm/drm_backlight.h> include from intel_dp.c.
Mario Limonciello (12):
Revert "backlight: Remove notifier"
backlight: add kernel-internal backlight API
drm/property: add a per-connector luminance flag
drm: add connector backlight (LUMINANCE) infrastructure
drm: add DRM_CLIENT_CAP_LUMINANCE
drm/amd/display: Pass up errors reading actual brightness
drm/amd: Indicate driver supports luminance
drm/amd/display: use drm backlight
drm/bridge: auto-link panel backlight in bridge connector
drm/xe: Indicate support for luminance on the connector
drm/i915: Indicate support for luminance on the connector
drm/i915/display: use drm backlight
Mario Limonciello (AMD) (2):
drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper
drm/amd/display: Update KUnit backlight tests for luminance property
and fixtures
drivers/gpu/drm/Kconfig | 18 +
drivers/gpu/drm/Makefile | 2 +
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 7 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 +
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 15 +-
.../display/amdgpu_dm/amdgpu_dm_backlight.c | 36 +-
.../display/amdgpu_dm/amdgpu_dm_backlight.h | 2 +-
.../display/amdgpu_dm/amdgpu_dm_connector.c | 2 +
.../tests/amdgpu_dm_backlight_test.c | 18 +-
.../amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c | 8 +-
drivers/gpu/drm/bridge/panel.c | 15 +
.../gpu/drm/display/drm_bridge_connector.c | 11 +-
drivers/gpu/drm/drm_atomic_helper.c | 35 ++
drivers/gpu/drm/drm_atomic_uapi.c | 49 +-
drivers/gpu/drm/drm_backlight.c | 550 ++++++++++++++++++
drivers/gpu/drm/drm_connector.c | 56 ++
drivers/gpu/drm/drm_drv.c | 8 +
drivers/gpu/drm/drm_file.c | 5 +
drivers/gpu/drm/drm_ioctl.c | 24 +
drivers/gpu/drm/drm_mode_config.c | 1 +
drivers/gpu/drm/drm_property.c | 6 +
drivers/gpu/drm/drm_sysfs.c | 32 +-
.../gpu/drm/i915/display/intel_backlight.c | 6 +
drivers/gpu/drm/i915/display/intel_display.c | 7 +-
drivers/gpu/drm/i915/i915_driver.c | 1 +
drivers/gpu/drm/xe/xe_device.c | 1 +
drivers/video/backlight/backlight.c | 108 ++++
include/drm/drm_atomic_helper.h | 2 +
include/drm/drm_backlight.h | 166 ++++++
include/drm/drm_bridge.h | 1 +
include/drm/drm_connector.h | 20 +
include/drm/drm_drv.h | 7 +
include/drm/drm_file.h | 8 +
include/drm/drm_mode_config.h | 11 +
include/drm/drm_property.h | 10 +
include/linux/backlight.h | 67 +++
include/uapi/drm/drm.h | 22 +
37 files changed, 1313 insertions(+), 25 deletions(-)
create mode 100644 drivers/gpu/drm/drm_backlight.c
create mode 100644 include/drm/drm_backlight.h
--
2.43.0
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH v8 01/14] Revert "backlight: Remove notifier"
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:51 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
` (14 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
This reverts commit 5461f3fd74a89757f95f351eb0bc26aafc2a2e91.
The backlight notifier support is needed in order to add backlight
control support into DRM connectors.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/video/backlight/backlight.c | 42 +++++++++++++++++++++++++++++
include/linux/backlight.h | 22 +++++++++++++++
2 files changed, 64 insertions(+)
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index fc9bb303e8c5f..4401f6294ccc8 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -65,6 +65,7 @@
static struct list_head backlight_dev_list;
static struct mutex backlight_dev_list_mutex;
+static struct blocking_notifier_head backlight_notifier;
static const char *const backlight_types[] = {
[BACKLIGHT_RAW] = "raw",
@@ -415,6 +416,9 @@ struct backlight_device *backlight_device_register(const char *name,
list_add(&new_bd->entry, &backlight_dev_list);
mutex_unlock(&backlight_dev_list_mutex);
+ blocking_notifier_call_chain(&backlight_notifier,
+ BACKLIGHT_REGISTERED, new_bd);
+
return new_bd;
}
EXPORT_SYMBOL(backlight_device_register);
@@ -484,6 +488,9 @@ void backlight_device_unregister(struct backlight_device *bd)
mutex_unlock(&pmac_backlight_mutex);
#endif
+ blocking_notifier_call_chain(&backlight_notifier,
+ BACKLIGHT_UNREGISTERED, bd);
+
mutex_lock(&bd->ops_lock);
bd->ops = NULL;
mutex_unlock(&bd->ops_lock);
@@ -507,6 +514,40 @@ static int devm_backlight_device_match(struct device *dev, void *res,
return *r == data;
}
+/**
+ * backlight_register_notifier - get notified of backlight (un)registration
+ * @nb: notifier block with the notifier to call on backlight (un)registration
+ *
+ * Register a notifier to get notified when backlight devices get registered
+ * or unregistered.
+ *
+ * RETURNS:
+ *
+ * 0 on success, otherwise a negative error code
+ */
+int backlight_register_notifier(struct notifier_block *nb)
+{
+ return blocking_notifier_chain_register(&backlight_notifier, nb);
+}
+EXPORT_SYMBOL(backlight_register_notifier);
+
+/**
+ * backlight_unregister_notifier - unregister a backlight notifier
+ * @nb: notifier block to unregister
+ *
+ * Unregister a notifier previously registered with
+ * backlight_register_notifier().
+ *
+ * RETURNS:
+ *
+ * 0 on success, otherwise a negative error code
+ */
+int backlight_unregister_notifier(struct notifier_block *nb)
+{
+ return blocking_notifier_chain_unregister(&backlight_notifier, nb);
+}
+EXPORT_SYMBOL(backlight_unregister_notifier);
+
/**
* devm_backlight_device_register - register a new backlight device
* @dev: the device to register
@@ -674,6 +715,7 @@ static int __init backlight_class_init(void)
INIT_LIST_HEAD(&backlight_dev_list);
mutex_init(&backlight_dev_list_mutex);
+ BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier);
return 0;
}
diff --git a/include/linux/backlight.h b/include/linux/backlight.h
index f29a9ef1052e7..015183d129f96 100644
--- a/include/linux/backlight.h
+++ b/include/linux/backlight.h
@@ -13,6 +13,8 @@
#include <linux/mutex.h>
#include <linux/types.h>
+struct notifier_block;
+
/**
* enum backlight_update_reason - what method was used to update backlight
*
@@ -64,6 +66,24 @@ enum backlight_type {
BACKLIGHT_TYPE_MAX,
};
+/**
+ * enum backlight_notification - the type of notification
+ *
+ * The notifications that is used for notification sent to the receiver
+ * that registered notifications using backlight_register_notifier().
+ */
+enum backlight_notification {
+ /**
+ * @BACKLIGHT_REGISTERED: The backlight device is registered.
+ */
+ BACKLIGHT_REGISTERED,
+
+ /**
+ * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
+ */
+ BACKLIGHT_UNREGISTERED,
+};
+
/** enum backlight_scale - the type of scale used for brightness values
*
* The type of scale used for brightness values.
@@ -388,6 +408,8 @@ void devm_backlight_device_unregister(struct device *dev,
struct backlight_device *bd);
void backlight_force_update(struct backlight_device *bd,
enum backlight_update_reason reason);
+int backlight_register_notifier(struct notifier_block *nb);
+int backlight_unregister_notifier(struct notifier_block *nb);
struct backlight_device *backlight_device_get_by_name(const char *name);
struct backlight_device *backlight_device_get_by_type(enum backlight_type type);
int backlight_device_set_brightness(struct backlight_device *bd,
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 02/14] backlight: add kernel-internal backlight API
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:52 ` sashiko-bot
2026-09-08 15:45 ` Jani Nikula
2026-09-08 4:40 ` [PATCH v8 03/14] drm/property: add a per-connector luminance flag Mario Limonciello
` (13 subsequent siblings)
15 siblings, 2 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, David Herrmann, Marta Lofstedt,
Mario Limonciello
So far backlights have only been controlled via sysfs. However, sysfs is
not a proper user-space API for runtime modifications, and never was
intended to provide such. The DRM drivers are now prepared to provide
such a backlight link so user-space can control backlight via DRM
connector properties. This allows us to employ the same access-management
we use for mode-setting.
This patch adds a few kernel-internal backlight helpers so we can modify
backlights from within DRM, a brightness-changed notification, and a
per-device takeover count so that legacy sysfs writes can be inhibited
(-EBUSY) while a luminance-aware DRM client is in control.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
V2: Marta Lofstedt <marta.lofstedt@intel.com>
- rebase
- minor edit for checkpatch warning
Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
V3: Mario Limonciello (AMD) <superm1@kernel.org>
- rebase
- Use guard(mutex)
V4: Mario Limonciello (AMD) <superm1@kernel.org>
- Adjust return type for backlight_set_brightness() to return errors
- Stop clamping in backlight_set_brightness()
- Drop backlight_device_lookup()
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/video/backlight/backlight.c | 66 +++++++++++++++++++++++++++++
include/linux/backlight.h | 45 ++++++++++++++++++++
2 files changed, 111 insertions(+)
diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index 4401f6294ccc8..1c700c1e77c3f 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -126,6 +126,9 @@ static void backlight_generate_event(struct backlight_device *bd,
case BACKLIGHT_UPDATE_HOTKEY:
envp[0] = "SOURCE=hotkey";
break;
+ case BACKLIGHT_UPDATE_DRM:
+ envp[0] = "SOURCE=drm";
+ break;
default:
envp[0] = "SOURCE=unknown";
break;
@@ -150,6 +153,13 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
struct backlight_device *bd = to_backlight_device(dev);
unsigned long power, old_power;
+ /* A luminance-aware DRM client has taken over this backlight; the
+ * legacy sysfs interface is disabled until the last such client
+ * goes away.
+ */
+ if (atomic_read(&bd->drm_takeover) > 0)
+ return -EBUSY;
+
rc = kstrtoul(buf, 0, &power);
if (rc)
return rc;
@@ -214,6 +224,13 @@ static ssize_t brightness_store(struct device *dev,
struct backlight_device *bd = to_backlight_device(dev);
unsigned long brightness;
+ /* A luminance-aware DRM client has taken over this backlight; the
+ * legacy sysfs interface is disabled until the last such client
+ * goes away.
+ */
+ if (atomic_read(&bd->drm_takeover) > 0)
+ return -EBUSY;
+
rc = kstrtoul(buf, 0, &brightness);
if (rc)
return rc;
@@ -514,6 +531,41 @@ static int devm_backlight_device_match(struct device *dev, void *res,
return *r == data;
}
+/**
+ * backlight_set_brightness - set brightness on a backlight device
+ * @bd: backlight device to operate on
+ * @value: brightness value to set on the device
+ * @reason: backlight-change reason to use for notifications
+ *
+ * This is the in-kernel API equivalent of writing into the 'brightness' sysfs
+ * file. It calls into the underlying backlight driver to change the brightness
+ * value.
+ * A uevent notification is sent with the reason set to @reason.
+ * Return: 0 if successfully notified, -EINVAL for invalid values, -ENXIO if the
+ * device has no ops (e.g. it is being unregistered)
+ */
+int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
+ enum backlight_update_reason reason)
+{
+ int rc = -ENXIO;
+
+ scoped_guard(mutex, &bd->ops_lock) {
+ if (bd->ops) {
+ if (value > bd->props.max_brightness)
+ return -EINVAL;
+
+ dev_dbg(&bd->dev, "set brightness to %u\n", value);
+ bd->props.brightness = value;
+ rc = backlight_update_status(bd);
+ }
+ }
+ if (rc == 0)
+ backlight_generate_event(bd, reason);
+
+ return rc;
+}
+EXPORT_SYMBOL_GPL(backlight_set_brightness);
+
/**
* backlight_register_notifier - get notified of backlight (un)registration
* @nb: notifier block with the notifier to call on backlight (un)registration
@@ -548,6 +600,20 @@ int backlight_unregister_notifier(struct notifier_block *nb)
}
EXPORT_SYMBOL(backlight_unregister_notifier);
+/**
+ * backlight_notify_brightness - notify brightness change to listeners
+ * @bd: backlight device that changed
+ *
+ * Notify registered listeners that the backlight brightness has changed.
+ * This is called automatically after successful brightness updates.
+ */
+void backlight_notify_brightness(struct backlight_device *bd)
+{
+ blocking_notifier_call_chain(&backlight_notifier,
+ BACKLIGHT_BRIGHTNESS_CHANGED, bd);
+}
+EXPORT_SYMBOL(backlight_notify_brightness);
+
/**
* devm_backlight_device_register - register a new backlight device
* @dev: the device to register
diff --git a/include/linux/backlight.h b/include/linux/backlight.h
index 015183d129f96..fac1acbc698a1 100644
--- a/include/linux/backlight.h
+++ b/include/linux/backlight.h
@@ -31,6 +31,12 @@ enum backlight_update_reason {
* @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
*/
BACKLIGHT_UPDATE_SYSFS,
+
+ /**
+ * @BACKLIGHT_UPDATE_DRM: The backlight was updated from DRM, i.e. through
+ * a connector LUMINANCE property rather than the legacy sysfs interface.
+ */
+ BACKLIGHT_UPDATE_DRM,
};
/**
@@ -82,6 +88,11 @@ enum backlight_notification {
* @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
*/
BACKLIGHT_UNREGISTERED,
+
+ /**
+ * @BACKLIGHT_BRIGHTNESS_CHANGED: The backlight brightness has changed.
+ */
+ BACKLIGHT_BRIGHTNESS_CHANGED,
};
/** enum backlight_scale - the type of scale used for brightness values
@@ -310,8 +321,23 @@ struct backlight_device {
* @use_count: The number of unblanked displays.
*/
int use_count;
+
+ /**
+ * @drm_takeover: Number of luminance-aware DRM clients that have
+ * taken over brightness control of this device. When non-zero,
+ * writes to the legacy sysfs ``brightness`` attribute return
+ * ``-EBUSY``. Managed by the DRM backlight helpers.
+ */
+ atomic_t drm_takeover;
};
+/* Forward declaration for backlight_update_status */
+#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
+void backlight_notify_brightness(struct backlight_device *bd);
+#else
+static inline void backlight_notify_brightness(struct backlight_device *bd) {}
+#endif
+
/**
* backlight_update_status - force an update of the backlight device status
* @bd: the backlight device
@@ -325,6 +351,10 @@ static inline int backlight_update_status(struct backlight_device *bd)
ret = bd->ops->update_status(bd);
mutex_unlock(&bd->update_lock);
+ /* Notify DRM and other listeners that brightness changed */
+ if (ret == 0)
+ backlight_notify_brightness(bd);
+
return ret;
}
@@ -431,6 +461,21 @@ static inline void backlight_notify_blank_all(struct device *display_dev,
{ }
#endif
+int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
+ enum backlight_update_reason reason);
+
+static inline void backlight_device_ref(struct backlight_device *bd)
+{
+ if (bd)
+ get_device(&bd->dev);
+}
+
+static inline void backlight_device_unref(struct backlight_device *bd)
+{
+ if (bd)
+ put_device(&bd->dev);
+}
+
#define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
/**
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 03/14] drm/property: add a per-connector luminance flag
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
` (12 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
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) <superm1@kernel.org>
---
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
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (2 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 03/14] drm/property: add a per-connector luminance flag Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 15:48 ` Jani Nikula
2026-09-08 4:40 ` [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE Mario Limonciello
` (11 subsequent siblings)
15 siblings, 2 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, David Herrmann,
Mario Limonciello
Backlight brightness is a property of a display, and thus of a DRM
connector, yet it has historically only been controllable through the
separate backlight sysfs interface. Add a generic, backend-agnostic
per-connector LUMINANCE range property so brightness can be driven
through the atomic modeset path like any other connector state.
A struct drm_backlight is embedded in every connector and initialized by
the core; drivers do not allocate it. A driver links a backend (today a
backlight_device, in the future DDC/CI, MIPI-DCS, ...) with
drm_backlight_link(), which creates the connector's LUMINANCE property
with the backend's range. The property value is staged into the atomic
connector state and only pushed to the hardware from the commit/enable
path, via a workqueue so that slow backends never stall a commit. DPMS
off drives the backlight to 0 and DPMS on restores the committed value.
The property range is per-connector (created from the backend's
max_brightness), so multiple panels no longer share and corrupt a single
device-wide range. drm_backlight_link() also carries the legacy-sysfs
takeover accounting used by the client capability added in a later patch.
The whole feature is guarded by CONFIG_DRM_BACKLIGHT (which depends on,
rather than selects, BACKLIGHT_CLASS_DEVICE) so DRM does not pull the
backlight subsystem into the kernel when it is not wanted.
Co-developed-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/Kconfig | 18 +
drivers/gpu/drm/Makefile | 2 +
drivers/gpu/drm/drm_atomic_helper.c | 35 ++
drivers/gpu/drm/drm_atomic_uapi.c | 49 ++-
drivers/gpu/drm/drm_backlight.c | 550 ++++++++++++++++++++++++++++
drivers/gpu/drm/drm_connector.c | 56 +++
drivers/gpu/drm/drm_drv.c | 8 +
drivers/gpu/drm/drm_mode_config.c | 1 +
drivers/gpu/drm/drm_sysfs.c | 32 +-
include/drm/drm_atomic_helper.h | 2 +
include/drm/drm_backlight.h | 166 +++++++++
include/drm/drm_connector.h | 20 +
include/drm/drm_mode_config.h | 11 +
13 files changed, 945 insertions(+), 5 deletions(-)
create mode 100644 drivers/gpu/drm/drm_backlight.c
create mode 100644 include/drm/drm_backlight.h
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 323422861e8f6..ddb6827d613f8 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -33,6 +33,24 @@ endmenu
if DRM
+config DRM_BACKLIGHT
+ bool "DRM connector backlight (luminance) support"
+ depends on DRM
+ depends on BACKLIGHT_CLASS_DEVICE
+ default DRM
+ help
+ Expose per-connector backlight brightness control through the DRM
+ connector LUMINANCE property, backed by the backlight subsystem (and,
+ in the future, other backends such as DDC/CI). This lets luminance
+ changes go through the same atomic modeset path as the rest of the
+ display state.
+
+ This depends on BACKLIGHT_CLASS_DEVICE. When that is disabled, DRM is
+ built without this support and does not pull the backlight subsystem
+ into the kernel.
+
+ If in doubt, say Y.
+
config DRM_MIPI_DBI
tristate
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index e635fcffd3790..bcb06dbb71343 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -78,6 +78,8 @@ drm-$(CONFIG_DRM_CLIENT) += \
drm_client_event.o \
drm_client_modeset.o \
drm_client_sysrq.o
+drm-$(CONFIG_DRM_BACKLIGHT) += drm_backlight.o
+drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
drm-$(CONFIG_COMPAT) += drm_ioc32.o
drm-$(CONFIG_DRM_PANEL) += drm_panel.o
drm-$(CONFIG_OF) += drm_of.o
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 285aac3554dfd..110cd81e5d6db 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -33,6 +33,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_atomic_uapi.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_blend.h>
#include <drm/drm_bridge.h>
#include <drm/drm_colorop.h>
@@ -1230,6 +1231,10 @@ drm_atomic_helper_commit_encoder_bridge_disable(struct drm_device *dev,
* it away), so we won't call disable hooks twice.
*/
bridge = drm_bridge_chain_get_first_bridge(encoder);
+
+ /* Turn the backlight off before disabling the pipeline. */
+ drm_backlight_set_luminance(connector, 0);
+
drm_atomic_bridge_chain_disable(bridge, state);
drm_bridge_put(bridge);
@@ -1775,6 +1780,24 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
}
EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
+/**
+ * drm_atomic_helper_connector_apply_luminance - apply connector luminance from atomic state
+ * @conn_state: atomic connector state to apply luminance for
+ *
+ * Updates the backlight luminance from the atomic connector state. If the
+ * connector has a linked backlight and is associated with an active CRTC,
+ * push the luminance value to hardware.
+ */
+void drm_atomic_helper_connector_apply_luminance(const struct drm_connector_state *conn_state)
+{
+ struct drm_connector *connector = conn_state->connector;
+
+ if (conn_state->crtc && conn_state->crtc->state &&
+ conn_state->crtc->state->active)
+ drm_backlight_set_luminance(connector, conn_state->luminance);
+}
+EXPORT_SYMBOL(drm_atomic_helper_connector_apply_luminance);
+
/*
* For atomic updates which touch just a single CRTC, calculate the time of the
* next vblank, and inform all the fences of the deadline.
@@ -1989,6 +2012,9 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
void drm_atomic_helper_commit_tail(struct drm_atomic_commit *state)
{
struct drm_device *dev = state->dev;
+ struct drm_connector *connector;
+ struct drm_connector_state *new_conn_state;
+ int i;
drm_atomic_helper_commit_modeset_disables(dev, state);
@@ -1996,6 +2022,9 @@ void drm_atomic_helper_commit_tail(struct drm_atomic_commit *state)
drm_atomic_helper_commit_modeset_enables(dev, state);
+ for_each_new_connector_in_state(state, connector, new_conn_state, i)
+ drm_atomic_helper_connector_apply_luminance(new_conn_state);
+
drm_atomic_helper_fake_vblank(state);
drm_atomic_helper_commit_hw_done(state);
@@ -2019,11 +2048,17 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_commit *state)
{
struct drm_device *dev = state->dev;
+ struct drm_connector *connector;
+ struct drm_connector_state *new_conn_state;
+ int i;
drm_atomic_helper_commit_modeset_disables(dev, state);
drm_atomic_helper_commit_modeset_enables(dev, state);
+ for_each_new_connector_in_state(state, connector, new_conn_state, i)
+ drm_atomic_helper_connector_apply_luminance(new_conn_state);
+
drm_atomic_helper_commit_planes(dev, state,
DRM_PLANE_COMMIT_ACTIVE_ONLY);
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 5ea593b3a98ec..07d4bcb16cd23 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -30,6 +30,8 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_atomic_uapi.h>
+#include <drm/drm_backlight.h>
+#include <drm/drm_connector.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_print.h>
#include <drm/drm_drv.h>
@@ -962,6 +964,13 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
state->hdmi.broadcast_rgb = val;
} else if (property == connector->color_format_property) {
state->color_format = val;
+ } else if (property == connector->luminance_property) {
+ /*
+ * Only stage the value into the atomic state; the hardware is
+ * updated from the commit path (see
+ * drm_atomic_helper_connector_apply_luminance()).
+ */
+ state->luminance = val;
} else if (connector->funcs->atomic_set_property) {
return connector->funcs->atomic_set_property(connector,
state, property, val);
@@ -1049,6 +1058,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
*val = state->hdmi.broadcast_rgb;
} else if (property == connector->color_format_property) {
*val = state->color_format;
+ } else if (property == connector->luminance_property) {
+ *val = state->luminance;
} else if (connector->funcs->atomic_get_property) {
return connector->funcs->atomic_get_property(connector,
state, property, val);
@@ -1133,6 +1144,22 @@ static struct drm_pending_vblank_event *create_vblank_event(
return e;
}
+static void drm_atomic_crtc_set_backlight(struct drm_crtc *crtc, bool active)
+{
+ struct drm_connector_list_iter conn_iter;
+ struct drm_connector *connector;
+
+ drm_connector_list_iter_begin(crtc->dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ if (!connector->state || connector->state->crtc != crtc)
+ continue;
+
+ drm_backlight_set_luminance(connector,
+ active ? connector->state->luminance : 0);
+ }
+ drm_connector_list_iter_end(&conn_iter);
+}
+
int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
struct drm_connector *connector,
int mode)
@@ -1155,9 +1182,29 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
if (connector->dpms == mode)
goto out;
+ crtc = connector->state ? connector->state->crtc : NULL;
+
+ /* Handle backlight brightness coordination with DPMS state changes */
+ if (old_mode != DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_OFF) {
+ /* DPMS ON -> OFF: dim all connectors driven by this CRTC. */
+ if (crtc)
+ drm_atomic_crtc_set_backlight(crtc, false);
+ else
+ drm_backlight_set_luminance(connector, 0);
+ }
+
connector->dpms = mode;
- crtc = connector->state->crtc;
+ /* DPMS OFF -> ON: restore brightness to property value */
+ if (old_mode == DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_ON &&
+ connector->state) {
+ if (crtc)
+ drm_atomic_crtc_set_backlight(crtc, true);
+ else
+ drm_backlight_set_luminance(connector,
+ connector->state->luminance);
+ }
+
if (!crtc)
goto out;
ret = drm_atomic_add_affected_connectors(state, crtc);
diff --git a/drivers/gpu/drm/drm_backlight.c b/drivers/gpu/drm/drm_backlight.c
new file mode 100644
index 0000000000000..dd02d1878727e
--- /dev/null
+++ b/drivers/gpu/drm/drm_backlight.c
@@ -0,0 +1,550 @@
+// SPDX-License-Identifier: MIT
+/*
+ * DRM Backlight Helpers
+ * Copyright (c) 2014 David Herrmann
+ * Copyright (c) 2026 Advanced Micro Devices, Inc.
+ */
+
+#include <linux/backlight.h>
+#include <linux/list.h>
+#include <linux/notifier.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+
+#include <drm/drm_backlight.h>
+#include <drm/drm_connector.h>
+#include <drm/drm_device.h>
+#include <drm/drm_property.h>
+
+/**
+ * DOC: Backlight Devices
+ *
+ * Backlight devices have always been managed as a separate subsystem,
+ * independent of DRM. They are usually controlled via separate hardware
+ * interfaces than the display controller, so the split works out fine.
+ * However, backlight brightness is a property of a display, and thus a
+ * property of a DRM connector. We already manage DPMS states via connector
+ * properties, so it is natural to keep brightness control at the same place.
+ *
+ * This DRM backlight interface implements a generic per-connector LUMINANCE
+ * property. The core is backend-agnostic: it does not talk to any hardware
+ * itself, it only forwards luminance requests to a backend that a driver has
+ * linked. The backend is described by a &struct drm_backlight_funcs. Today the
+ * only backend is the backlight subsystem (&struct backlight_device), linked
+ * with drm_backlight_link(), but other backends (DDC/CI, MIPI-DCS, ...) can be
+ * added by providing a different set of operations without changing the core.
+ *
+ * A &struct drm_backlight is embedded in every &struct drm_connector and
+ * initialized by the DRM core (drm_backlight_connector_init()); drivers do not
+ * allocate it. Drivers link a backend once it is available by calling
+ * drm_backlight_link(); this creates the connector's LUMINANCE property with
+ * the backend's range. Passing NULL unlinks the backend. Hardware is only ever
+ * touched from a workqueue, so slow backends never stall an atomic commit.
+ */
+
+static LIST_HEAD(drm_backlight_list);
+static DEFINE_SPINLOCK(drm_backlight_lock);
+
+/* caller must hold @drm_backlight_lock */
+static bool __drm_backlight_is_linked(struct drm_backlight *b)
+{
+ lockdep_assert_held(&drm_backlight_lock);
+ /* a backlight is live while it is on @drm_backlight_list */
+ return !list_empty(&b->list);
+}
+
+/*
+ * Return the linked &backlight_device if the current backend is the backlight
+ * subsystem, or NULL otherwise. The legacy-sysfs takeover accounting only
+ * applies to that backend.
+ */
+static const struct drm_backlight_funcs drm_backlight_bd_funcs;
+
+static struct backlight_device *drm_backlight_bd(struct drm_backlight *b)
+{
+ if (b->funcs != &drm_backlight_bd_funcs)
+ return NULL;
+ return b->backend;
+}
+
+/* caller must hold @drm_backlight_lock */
+static void __drm_backlight_schedule(struct drm_backlight *b)
+{
+ lockdep_assert_held(&drm_backlight_lock);
+ if (__drm_backlight_is_linked(b))
+ schedule_work(&b->work);
+}
+
+static void __drm_backlight_worker(struct work_struct *w)
+{
+ struct drm_backlight *b = container_of(w, struct drm_backlight, work);
+ static char *ep[] = { "BACKLIGHT=1", NULL };
+ const struct drm_backlight_funcs *funcs;
+ bool send_uevent;
+ unsigned int v;
+
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ send_uevent = b->changed;
+ b->changed = false;
+ v = b->set_value;
+ funcs = b->funcs;
+ }
+
+ /*
+ * The backend stays valid here: drm_backlight_do_unlink() clears
+ * @backend and drops its reference only after cancel_work_sync(), so an
+ * in-flight worker always sees a live backend.
+ */
+ if (funcs && funcs->set_luminance)
+ WARN_ON(funcs->set_luminance(b, v));
+
+ if (send_uevent && b->connector->kdev)
+ kobject_uevent_env(&b->connector->kdev->kobj, KOBJ_CHANGE, ep);
+}
+
+/* caller must hold @drm_backlight_lock */
+static void __drm_backlight_set(struct drm_backlight *b, unsigned int v)
+{
+ unsigned int max = 0;
+ bool can_disable = false;
+
+ lockdep_assert_held(&drm_backlight_lock);
+
+ if (!b->funcs || !b->funcs->get_range)
+ return;
+
+ b->funcs->get_range(b, &max, &can_disable);
+ if (!max)
+ return;
+
+ /* clamp to the backend maximum */
+ b->set_value = min(v, max);
+ __drm_backlight_schedule(b);
+}
+
+/* caller must hold @drm_backlight_lock */
+static void __drm_backlight_readback(struct drm_backlight *b, unsigned int v)
+{
+ struct drm_connector *connector = b->connector;
+ unsigned int max = 0;
+ bool can_disable = false;
+
+ lockdep_assert_held(&drm_backlight_lock);
+
+ if (!b->funcs || !b->funcs->get_range)
+ return;
+
+ b->funcs->get_range(b, &max, &can_disable);
+ if (!max)
+ return;
+
+ /*
+ * Reflect a hardware-side brightness change (firmware hotkeys, or a
+ * legacy sysfs write while not inhibited) back into the connector's
+ * committed luminance so a read-back returns the real value.
+ */
+ if (connector->state)
+ connector->state->luminance = min(v, max);
+}
+
+/**
+ * drm_backlight_create_property - create and attach a connector's LUMINANCE property
+ * @connector: connector to modify
+ * @max: maximum luminance value
+ * @can_disable: true if luminance 0 disables the backlight
+ *
+ * Create and attach the per-connector LUMINANCE property. Must be called during
+ * connector initialization before the DRM device is registered.
+ *
+ * Returns: 0 on success, or a negative error code.
+ */
+int drm_backlight_create_property(struct drm_connector *connector,
+ unsigned int max, bool can_disable)
+{
+ struct drm_device *dev = connector->dev;
+ struct drm_property *prop;
+ unsigned int min = can_disable ? 0 : 1;
+
+ if (!dev || !connector->base.properties || connector->luminance_property)
+ return 0;
+
+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
+ "LUMINANCE", min, max);
+ if (!prop)
+ return -ENOMEM;
+
+ prop->is_luminance = true;
+ connector->luminance_property = prop;
+ drm_object_attach_property(&connector->base, prop, min);
+ if (connector->state)
+ connector->state->luminance = min;
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_backlight_create_property);
+
+static void drm_backlight_do_unlink(struct drm_backlight *b)
+{
+ struct backlight_device *bd;
+ unsigned int clients;
+
+ /*
+ * Stop new work first, but leave @backend in place so an in-flight
+ * worker keeps a valid backend to operate on. Capture the linked
+ * backlight_device (if any) while @funcs is still set.
+ */
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ if (!b->funcs)
+ return;
+ bd = drm_backlight_bd(b);
+ clients = b->luminance_clients;
+ b->funcs = NULL;
+ list_del_init(&b->list);
+ }
+
+ cancel_work_sync(&b->work);
+
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ if (clients && bd)
+ atomic_sub(clients, &bd->drm_takeover);
+ /*
+ * Only clear @backend if no concurrent drm_backlight_link()
+ * re-linked a new backend after we dropped the lock for
+ * cancel_work_sync(); otherwise we would clobber it.
+ */
+ if (!b->funcs)
+ b->backend = NULL;
+ }
+
+ backlight_device_unref(bd);
+}
+
+/**
+ * drm_backlight_connector_init - initialize a connector's embedded backlight
+ * @connector: connector to initialize
+ *
+ * Called by the DRM core from drm_connector_init(). Drivers never call this.
+ */
+void drm_backlight_connector_init(struct drm_connector *connector)
+{
+ struct drm_backlight *b = &connector->backlight;
+
+ b->connector = connector;
+ INIT_LIST_HEAD(&b->list);
+ INIT_WORK(&b->work, __drm_backlight_worker);
+}
+
+/**
+ * drm_backlight_connector_cleanup - tear down a connector's embedded backlight
+ * @connector: connector being cleaned up
+ *
+ * Called by the DRM core from drm_connector_cleanup(). Any still-linked backend
+ * is unlinked here as a safety net for connectors that are torn down on a probe
+ * error path before drm_connector_unregister() ever runs, so no stale entry is
+ * left on the global list. The LUMINANCE property itself is freed by
+ * drm_mode_config_cleanup().
+ */
+void drm_backlight_connector_cleanup(struct drm_connector *connector)
+{
+ drm_backlight_do_unlink(&connector->backlight);
+}
+
+/**
+ * drm_backlight_unregister - unlink a connector's backlight on unregister
+ * @connector: connector being unregistered
+ *
+ * Called by the DRM core from drm_connector_unregister() as a safety net in
+ * case a driver did not unlink its backend itself.
+ */
+void drm_backlight_unregister(struct drm_connector *connector)
+{
+ drm_backlight_do_unlink(&connector->backlight);
+}
+
+/**
+ * drm_backlight_link - link a backlight device to a connector
+ * @connector: connector to modify
+ * @bd: backlight device to link, or NULL to unlink
+ *
+ * Establish the link between a connector's LUMINANCE property and a registered
+ * backlight_device. On the first link the connector's LUMINANCE property is
+ * created with the backend's range. Passing NULL unlinks any linked device.
+ *
+ * User-space cannot create or modify this link.
+ *
+ * Returns: 0 on success, or a negative error code if the property could not be
+ * created (in which case no backend is linked).
+ */
+int drm_backlight_link(struct drm_connector *connector,
+ struct backlight_device *bd)
+{
+ struct drm_backlight *b = &connector->backlight;
+ unsigned int max;
+ int ret;
+
+ if (!bd) {
+ drm_backlight_do_unlink(b);
+ return 0;
+ }
+
+ /* Retarget: drop any previously linked backend first. */
+ if (b->funcs)
+ drm_backlight_do_unlink(b);
+
+ max = bd->props.max_brightness;
+ if (max && !connector->luminance_property) {
+ ret = drm_backlight_create_property(connector, max, false);
+ if (ret)
+ return ret;
+ }
+
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ b->funcs = &drm_backlight_bd_funcs;
+ b->backend = bd;
+ backlight_device_ref(bd);
+ list_add(&b->list, &drm_backlight_list);
+ /*
+ * Inherit the device-wide inhibit level so a connector linked
+ * (or hotplugged) while luminance-aware clients are active also
+ * has its legacy sysfs control inhibited.
+ */
+ b->luminance_clients = connector->dev->mode_config.luminance_clients;
+ if (b->luminance_clients)
+ atomic_add(b->luminance_clients, &bd->drm_takeover);
+ __drm_backlight_readback(b, bd->props.brightness);
+ b->changed = true;
+ __drm_backlight_set(b, bd->props.brightness);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_backlight_link);
+
+/**
+ * drm_backlight_get_device - get the backlight_device linked to a connector
+ * @connector: connector to query
+ *
+ * Returns the &backlight_device linked to @connector with an additional
+ * reference taken, or NULL if no backlight subsystem device is linked. The
+ * caller must drop the reference with backlight_device_unref() when done.
+ */
+struct backlight_device *drm_backlight_get_device(struct drm_connector *connector)
+{
+ struct backlight_device *bd;
+
+ guard(spinlock)(&drm_backlight_lock);
+ bd = drm_backlight_bd(&connector->backlight);
+ backlight_device_ref(bd);
+
+ return bd;
+}
+EXPORT_SYMBOL(drm_backlight_get_device);
+
+/**
+ * drm_backlight_inhibit_legacy - disable legacy sysfs control of the backend
+ * @connector: connector whose backlight should be inhibited
+ *
+ * Record that one more luminance-aware DRM client has taken over this
+ * connector's backlight. While any clients are recorded, writes to the linked
+ * backlight_device's legacy ``brightness`` sysfs attribute return ``-EBUSY``.
+ * The takeover follows the linked device if the link changes.
+ *
+ * Calls must be balanced with drm_backlight_uninhibit_legacy().
+ */
+void drm_backlight_inhibit_legacy(struct drm_connector *connector)
+{
+ struct drm_backlight *b = &connector->backlight;
+ struct backlight_device *bd;
+
+ guard(spinlock)(&drm_backlight_lock);
+ b->luminance_clients++;
+ bd = drm_backlight_bd(b);
+ if (bd)
+ atomic_inc(&bd->drm_takeover);
+}
+EXPORT_SYMBOL(drm_backlight_inhibit_legacy);
+
+/**
+ * drm_backlight_uninhibit_legacy - re-enable legacy sysfs control
+ * @connector: connector to uninhibit
+ *
+ * Balances a previous drm_backlight_inhibit_legacy() call.
+ */
+void drm_backlight_uninhibit_legacy(struct drm_connector *connector)
+{
+ struct drm_backlight *b = &connector->backlight;
+ struct backlight_device *bd;
+
+ guard(spinlock)(&drm_backlight_lock);
+ if (WARN_ON(b->luminance_clients == 0))
+ return;
+ b->luminance_clients--;
+ bd = drm_backlight_bd(b);
+ if (bd)
+ atomic_dec(&bd->drm_takeover);
+}
+EXPORT_SYMBOL(drm_backlight_uninhibit_legacy);
+
+/**
+ * drm_backlight_inhibit_legacy_all - inhibit legacy sysfs on every connector
+ * @dev: DRM device whose connectors should be inhibited
+ *
+ * Used when a client declares it is luminance-aware via
+ * DRM_CLIENT_CAP_LUMINANCE. The device-wide count is bumped so connectors
+ * hotplugged later inherit the inhibit in drm_backlight_link().
+ */
+void drm_backlight_inhibit_legacy_all(struct drm_device *dev)
+{
+ struct drm_connector_list_iter iter;
+ struct drm_connector *connector;
+
+ scoped_guard(spinlock, &drm_backlight_lock)
+ dev->mode_config.luminance_clients++;
+
+ drm_connector_list_iter_begin(dev, &iter);
+ drm_for_each_connector_iter(connector, &iter)
+ drm_backlight_inhibit_legacy(connector);
+ drm_connector_list_iter_end(&iter);
+}
+EXPORT_SYMBOL(drm_backlight_inhibit_legacy_all);
+
+/**
+ * drm_backlight_uninhibit_legacy_all - reverse drm_backlight_inhibit_legacy_all()
+ * @dev: DRM device whose connectors should be uninhibited
+ */
+void drm_backlight_uninhibit_legacy_all(struct drm_device *dev)
+{
+ struct drm_connector_list_iter iter;
+ struct drm_connector *connector;
+
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ if (WARN_ON(dev->mode_config.luminance_clients == 0))
+ return;
+ dev->mode_config.luminance_clients--;
+ }
+
+ drm_connector_list_iter_begin(dev, &iter);
+ drm_for_each_connector_iter(connector, &iter)
+ drm_backlight_uninhibit_legacy(connector);
+ drm_connector_list_iter_end(&iter);
+}
+EXPORT_SYMBOL(drm_backlight_uninhibit_legacy_all);
+
+/**
+ * drm_backlight_set_luminance - request a luminance change on a connector
+ * @connector: connector to update
+ * @value: luminance value to apply
+ *
+ * Clamp @value to the backend range and schedule the hardware update. Safe to
+ * call from an atomic commit tail: the actual hardware access happens later
+ * from a workqueue.
+ */
+void drm_backlight_set_luminance(struct drm_connector *connector,
+ unsigned int value)
+{
+ guard(spinlock)(&drm_backlight_lock);
+ __drm_backlight_set(&connector->backlight, value);
+}
+EXPORT_SYMBOL(drm_backlight_set_luminance);
+
+/* backlight_device backend ------------------------------------------------- */
+
+static int drm_backlight_bd_set_luminance(struct drm_backlight *b,
+ unsigned int value)
+{
+ struct backlight_device *bd = b->backend;
+ int rc;
+
+ rc = backlight_set_brightness(bd, value, BACKLIGHT_UPDATE_DRM);
+ if (rc)
+ backlight_set_brightness(bd, U16_MAX, BACKLIGHT_UPDATE_DRM);
+
+ return rc;
+}
+
+static int drm_backlight_bd_get_luminance(struct drm_backlight *b,
+ unsigned int *value)
+{
+ struct backlight_device *bd = b->backend;
+
+ if (!bd)
+ return -ENODEV;
+ *value = bd->props.brightness;
+
+ return 0;
+}
+
+static void drm_backlight_bd_get_range(struct drm_backlight *b,
+ unsigned int *max, bool *can_disable)
+{
+ struct backlight_device *bd = b->backend;
+
+ *max = bd ? bd->props.max_brightness : 0;
+ /*
+ * A generic backlight_device gives no guarantee that a value of 0 turns
+ * the panel fully off, so keep 0 reserved for the DPMS-off sentinel and
+ * expose a 1..max range.
+ */
+ *can_disable = false;
+}
+
+static const struct drm_backlight_funcs drm_backlight_bd_funcs = {
+ .set_luminance = drm_backlight_bd_set_luminance,
+ .get_luminance = drm_backlight_bd_get_luminance,
+ .get_range = drm_backlight_bd_get_range,
+};
+
+static int drm_backlight_notify(struct notifier_block *self,
+ unsigned long event, void *data)
+{
+ struct backlight_device *bd = data;
+ struct drm_backlight *b;
+
+ switch (event) {
+ case BACKLIGHT_UNREGISTERED:
+ /*
+ * Unlink every connector using @bd. drm_backlight_do_unlink()
+ * sleeps (cancel_work_sync()), so it cannot run under the list
+ * spinlock; re-scan for the next match after each unlink.
+ */
+ for (;;) {
+ struct drm_backlight *found = NULL;
+
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ list_for_each_entry(b, &drm_backlight_list, list) {
+ if (drm_backlight_bd(b) == bd) {
+ found = b;
+ break;
+ }
+ }
+ }
+ if (!found)
+ break;
+ drm_backlight_do_unlink(found);
+ }
+ break;
+ case BACKLIGHT_BRIGHTNESS_CHANGED:
+ scoped_guard(spinlock, &drm_backlight_lock) {
+ list_for_each_entry(b, &drm_backlight_list, list)
+ if (drm_backlight_bd(b) == bd)
+ __drm_backlight_readback(b, bd->props.brightness);
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static struct notifier_block drm_backlight_notifier = {
+ .notifier_call = drm_backlight_notify,
+};
+
+int drm_backlight_init(void)
+{
+ return backlight_register_notifier(&drm_backlight_notifier);
+}
+
+void drm_backlight_exit(void)
+{
+ backlight_unregister_notifier(&drm_backlight_notifier);
+}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 8b4baed060f3a..92ed0c1879d53 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -21,6 +21,7 @@
*/
#include <drm/drm_auth.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_connector.h>
#include <drm/drm_drv.h>
#include <drm/drm_edid.h>
@@ -316,6 +317,8 @@ static int drm_connector_init_only(struct drm_device *dev,
drm_object_attach_property(&connector->base, config->prop_crtc_id, 0);
}
+ drm_backlight_connector_init(connector);
+
connector->debugfs_entry = NULL;
out_put_type_id:
if (ret)
@@ -773,6 +776,7 @@ void drm_connector_cleanup(struct drm_connector *connector)
struct drm_device *dev = connector->dev;
struct drm_display_mode *mode, *t;
+ drm_backlight_connector_cleanup(connector);
/* The connector should have been removed from userspace long before
* it is finally destroyed.
*/
@@ -944,6 +948,8 @@ EXPORT_SYMBOL(drm_connector_dynamic_register);
void drm_connector_unregister(struct drm_connector *connector)
{
mutex_lock(&connector->mutex);
+ drm_backlight_unregister(connector);
+
if (connector->registration_state != DRM_CONNECTOR_REGISTERED) {
mutex_unlock(&connector->mutex);
return;
@@ -1532,6 +1538,56 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
* Summarizing: Only set "DPMS" when the connector is known to be enabled,
* assume that a successful SETCONFIG call also sets "DPMS" to on, and
* never read back the value of "DPMS" because it can be incorrect.
+ * LUMINANCE:
+ * Atomic, per-connector range property for controlling the backlight
+ * brightness level of the connector's display. It provides unified access
+ * to the display backlight through the atomic modeset path, replacing the
+ * legacy sysfs interface for brightness control.
+ *
+ * The property value is an unsigned integer. Its valid range is baked in
+ * when a backlight backend is linked to the connector and reflects the
+ * backend's capabilities:
+ *
+ * - Range 1-N: Normal operation for a backend that cannot guarantee a full
+ * off state. 1 is the minimum *visible* brightness and N is the backend
+ * maximum. Drivers are expected never to program a duty cycle of 0 for a
+ * value of 1.
+ * - Range 0-N: Used when the backend can also fully turn the panel off, so
+ * 0 is a normal in-range value.
+ *
+ * Value 0 is always accepted, even when the advertised range starts at 1:
+ * it is the sentinel used to turn the backlight off when the connector is
+ * powered down (DPMS off). Turning the backlight off this way may power the
+ * panel down entirely; unlike programming a legacy sysfs duty cycle of 0,
+ * this can stop vblank/pageflip events until the connector is enabled
+ * again, so luminance-aware clients must not rely on such events while the
+ * connector is off.
+ *
+ * Connectors without a linked backend do not expose this property at all.
+ *
+ * For atomic drivers the value is stored in &drm_connector_state.luminance
+ * and applied to the hardware from the atomic commit path once the
+ * connector is enabled. When DPMS transitions to OFF the backlight is set
+ * to 0; when it transitions back to ON the committed luminance is restored.
+ * Reading the property returns the last committed value (or the hardware's
+ * current state for backends that support reading brightness back).
+ *
+ * The property is created by the DRM core when a driver links a backlight
+ * backend with drm_backlight_link(); drivers do not create it directly.
+ *
+ * Client Capability:
+ * User-space must set the DRM_CLIENT_CAP_LUMINANCE client capability
+ * to 1 before using this property. When this capability is enabled,
+ * the legacy sysfs backlight interface is inhibited to prevent
+ * conflicts between multiple clients trying to control the same
+ * backlight. This ensures that only luminance-aware clients control
+ * the backlight through the DRM atomic interface.
+ *
+ * Legacy clients that do not set this capability should continue
+ * using the sysfs interface (if available).
+ *
+ * Note: This property can be set through the MODE_ATOMIC ioctl as part of
+ * the atomic state.
* panel_type:
* Immutable enum property to indicate the type of connected panel.
* Possible values are "unknown" (default), "OLED", and "LCD".
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index c808958a2188e..c8aa6834c1f4e 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -42,6 +42,7 @@
#include <linux/xarray.h>
#include <drm/drm_accel.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_bridge.h>
#include <drm/drm_cache.h>
#include <drm/drm_client_event.h>
@@ -1250,6 +1251,7 @@ static void drm_core_exit(void)
drm_privacy_screen_lookup_exit();
drm_panic_exit();
accel_core_exit();
+ drm_backlight_exit();
unregister_chrdev(DRM_MAJOR, "drm");
drm_debugfs_remove_root();
drm_sysfs_destroy();
@@ -1273,6 +1275,12 @@ static int __init drm_core_init(void)
drm_debugfs_init_root();
drm_debugfs_bridge_params();
+ ret = drm_backlight_init();
+ if (ret < 0) {
+ DRM_ERROR("Cannot initialize backlight interface\n");
+ goto error;
+ }
+
ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
if (ret < 0)
goto error;
diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
index 366f6d8212425..36579e8a7c0e5 100644
--- a/drivers/gpu/drm/drm_mode_config.c
+++ b/drivers/gpu/drm/drm_mode_config.c
@@ -33,6 +33,7 @@
#include <drm/drm_print.h>
#include <drm/drm_colorop.h>
#include <linux/dma-resv.h>
+#include <drm/drm_backlight.h>
#include "drm_crtc_internal.h"
#include "drm_internal.h"
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index ef4e923a87284..2f4ce7d040f9d 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -11,6 +11,7 @@
*/
#include <linux/acpi.h>
+#include <linux/backlight.h>
#include <linux/component.h>
#include <linux/device.h>
#include <linux/err.h>
@@ -27,6 +28,7 @@
#include <drm/drm_device.h>
#include <drm/drm_file.h>
#include <drm/drm_modes.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_print.h>
#include <drm/drm_property.h>
#include <drm/drm_sysfs.h>
@@ -391,15 +393,37 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
int drm_sysfs_connector_add_late(struct drm_connector *connector)
{
- if (connector->ddc)
- return sysfs_create_link(&connector->kdev->kobj,
- &connector->ddc->dev.kobj, "ddc");
+ struct backlight_device *bd = drm_backlight_get_device(connector);
+ int ret = 0;
+
+ if (connector->ddc) {
+ ret = sysfs_create_link(&connector->kdev->kobj,
+ &connector->ddc->dev.kobj, "ddc");
+ if (ret)
+ goto out;
+ }
- return 0;
+ if (bd) {
+ ret = sysfs_create_link(&connector->kdev->kobj,
+ &bd->dev.kobj, "backlight");
+ if (ret && connector->ddc)
+ sysfs_remove_link(&connector->kdev->kobj, "ddc");
+ }
+
+out:
+ backlight_device_unref(bd);
+ return ret;
}
void drm_sysfs_connector_remove_early(struct drm_connector *connector)
{
+ struct backlight_device *bd = drm_backlight_get_device(connector);
+
+ if (bd) {
+ sysfs_remove_link(&connector->kdev->kobj, "backlight");
+ backlight_device_unref(bd);
+ }
+
if (connector->ddc)
sysfs_remove_link(&connector->kdev->kobj, "ddc");
}
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index 4cfeec70d648a..8a166ead13c55 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -116,6 +116,8 @@ void drm_atomic_helper_commit_encoder_bridge_enable(struct drm_device *dev,
void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
struct drm_atomic_commit *old_state);
+void drm_atomic_helper_connector_apply_luminance(const struct drm_connector_state *conn_state);
+
int drm_atomic_helper_prepare_planes(struct drm_device *dev,
struct drm_atomic_commit *state);
void drm_atomic_helper_unprepare_planes(struct drm_device *dev,
diff --git a/include/drm/drm_backlight.h b/include/drm/drm_backlight.h
new file mode 100644
index 0000000000000..417ca4ecbf15b
--- /dev/null
+++ b/include/drm/drm_backlight.h
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: MIT */
+#ifndef __DRM_BACKLIGHT_H__
+#define __DRM_BACKLIGHT_H__
+
+/*
+ * Copyright (c) 2014 David Herrmann <dh.herrmann at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <linux/list.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
+struct backlight_device;
+struct drm_backlight;
+struct drm_connector;
+struct drm_device;
+
+/**
+ * struct drm_backlight_funcs - backend operations for a DRM backlight
+ *
+ * A DRM backlight is backend-agnostic: the core forwards luminance requests to
+ * whatever backend a driver has linked. Today the only backend is the backlight
+ * subsystem (&struct backlight_device), but the same core can drive other
+ * backends (DDC/CI, MIPI-DCS, ...) by providing a different set of these
+ * operations without any change to the core.
+ *
+ * All callbacks are invoked from process context (a workqueue), never from an
+ * atomic commit tail or while holding a spinlock, so they are allowed to sleep.
+ */
+struct drm_backlight_funcs {
+ /**
+ * @set_luminance:
+ *
+ * Push @value (already clamped to the backend range) to the hardware.
+ * Returns 0 on success or a negative error code.
+ */
+ int (*set_luminance)(struct drm_backlight *b, unsigned int value);
+
+ /**
+ * @get_luminance:
+ *
+ * Read the current hardware luminance into @value. Returns 0 on success
+ * or a negative error code. May be NULL if the backend cannot be read
+ * back.
+ */
+ int (*get_luminance)(struct drm_backlight *b, unsigned int *value);
+
+ /**
+ * @get_range:
+ *
+ * Report the backend's maximum luminance in @max and whether the
+ * backend can turn the panel off at luminance 0 in @can_disable.
+ */
+ void (*get_range)(struct drm_backlight *b, unsigned int *max,
+ bool *can_disable);
+};
+
+/**
+ * struct drm_backlight - per-connector backlight state
+ *
+ * This structure is embedded in &struct drm_connector and initialized by the
+ * DRM core; drivers never allocate it. It becomes active once a driver links a
+ * backend with drm_backlight_link().
+ */
+struct drm_backlight {
+ /** @connector: connector this backlight belongs to */
+ struct drm_connector *connector;
+ /** @funcs: backend operations, or NULL while no backend is linked */
+ const struct drm_backlight_funcs *funcs;
+ /** @backend: backend private pointer (e.g. the &backlight_device) */
+ void *backend;
+ /** @list: entry on the global list of linked DRM backlights */
+ struct list_head list;
+ /** @work: deferred hardware update and uevent */
+ struct work_struct work;
+ /** @set_value: luminance value pending application by @work */
+ unsigned int set_value;
+ /**
+ * @luminance_clients: number of luminance-aware DRM clients that have
+ * taken this backlight over. While > 0, legacy sysfs writes to the
+ * linked backend return -EBUSY.
+ */
+ unsigned int luminance_clients;
+ /** @changed: a uevent is pending for @work to emit */
+ bool changed : 1;
+};
+
+#if IS_ENABLED(CONFIG_DRM_BACKLIGHT)
+
+int drm_backlight_init(void);
+void drm_backlight_exit(void);
+
+void drm_backlight_connector_init(struct drm_connector *connector);
+void drm_backlight_connector_cleanup(struct drm_connector *connector);
+void drm_backlight_unregister(struct drm_connector *connector);
+
+int drm_backlight_create_property(struct drm_connector *connector,
+ unsigned int max, bool can_disable);
+int drm_backlight_link(struct drm_connector *connector,
+ struct backlight_device *bd);
+struct backlight_device *drm_backlight_get_device(struct drm_connector *connector);
+
+void drm_backlight_inhibit_legacy(struct drm_connector *connector);
+void drm_backlight_uninhibit_legacy(struct drm_connector *connector);
+void drm_backlight_inhibit_legacy_all(struct drm_device *dev);
+void drm_backlight_uninhibit_legacy_all(struct drm_device *dev);
+
+void drm_backlight_set_luminance(struct drm_connector *connector,
+ unsigned int value);
+
+#else /* CONFIG_DRM_BACKLIGHT */
+
+static inline int drm_backlight_init(void) { return 0; }
+static inline void drm_backlight_exit(void) {}
+
+static inline void drm_backlight_connector_init(struct drm_connector *connector) {}
+static inline void drm_backlight_connector_cleanup(struct drm_connector *connector) {}
+static inline void drm_backlight_unregister(struct drm_connector *connector) {}
+
+static inline int drm_backlight_create_property(struct drm_connector *connector,
+ unsigned int max, bool can_disable)
+{
+ return 0;
+}
+
+static inline int drm_backlight_link(struct drm_connector *connector,
+ struct backlight_device *bd)
+{
+ return 0;
+}
+
+static inline struct backlight_device *
+drm_backlight_get_device(struct drm_connector *connector)
+{
+ return NULL;
+}
+
+static inline void drm_backlight_inhibit_legacy(struct drm_connector *connector) {}
+static inline void drm_backlight_uninhibit_legacy(struct drm_connector *connector) {}
+static inline void drm_backlight_inhibit_legacy_all(struct drm_device *dev) {}
+static inline void drm_backlight_uninhibit_legacy_all(struct drm_device *dev) {}
+
+static inline void drm_backlight_set_luminance(struct drm_connector *connector,
+ unsigned int value) {}
+
+#endif /* CONFIG_DRM_BACKLIGHT */
+
+#endif /* __DRM_BACKLIGHT_H__ */
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index a0cf0268de483..0535f20e7dba5 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -28,6 +28,7 @@
#include <linux/ctype.h>
#include <linux/hdmi.h>
#include <linux/notifier.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_mode_object.h>
#include <drm/drm_util.h>
#include <drm/drm_property.h>
@@ -1290,6 +1291,11 @@ struct drm_connector_state {
* @drm_atomic_helper_connector_hdmi_check().
*/
struct drm_connector_hdmi_state hdmi;
+
+ /**
+ * @luminance: Luminance for the connector
+ */
+ unsigned int luminance;
};
struct drm_connector_hdmi_audio_funcs {
@@ -2526,6 +2532,20 @@ struct drm_connector {
* @cec: CEC-related data.
*/
struct drm_connector_cec cec;
+
+ /**
+ * @backlight: DRM backlight state, embedded and initialized by the DRM
+ * core. Becomes active once a driver links a backend with
+ * drm_backlight_link().
+ */
+ struct drm_backlight backlight;
+
+ /**
+ * @luminance_property: Per-connector range property controlling the
+ * connector's backlight luminance. Created with the backend's range
+ * when a backlight is linked; NULL while no backlight is linked.
+ */
+ struct drm_property *luminance_property;
};
#define obj_to_connector(x) container_of(x, struct drm_connector, base)
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index d8f5b7e9673ee..4ab45bd4edf7e 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -390,6 +390,17 @@ struct drm_mode_config {
*/
struct drm_modeset_acquire_ctx *acquire_ctx;
+ /**
+ * @luminance_clients:
+ *
+ * Number of open DRM clients that have enabled
+ * &DRM_CLIENT_CAP_LUMINANCE and thereby inhibited legacy sysfs
+ * backlight control device-wide. Connectors linked while this is
+ * non-zero inherit the inhibit so hotplugged outputs stay consistent.
+ * Managed and serialized by the DRM backlight helpers.
+ */
+ unsigned int luminance_clients;
+
/**
* @idr_mutex:
*
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (3 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:55 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 06/14] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello
` (10 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
The legacy backlight control interface can only be disabled when both the
client and the driver agree that luminance can be set during a modeset.
Add a DRIVER_CONNECTOR_LUMINANCE driver feature for the driver to
advertise support, and a DRM_CLIENT_CAP_LUMINANCE client capability for
a luminance-aware client to opt in.
When a client sets DRM_CLIENT_CAP_LUMINANCE, every DRM-connected
backlight on the device is marked as taken over; writes to the legacy
/sys/class/backlight/<dev>/brightness attribute then return -EBUSY until
the last luminance-aware client clears the capability or closes its DRM
file. The takeover follows the active backlight_device when
drm_backlight_link() retargets the link.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/drm_file.c | 5 +++++
drivers/gpu/drm/drm_ioctl.c | 24 ++++++++++++++++++++++++
include/drm/drm_drv.h | 7 +++++++
include/drm/drm_file.h | 8 ++++++++
include/uapi/drm/drm.h | 22 ++++++++++++++++++++++
5 files changed, 66 insertions(+)
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index ec820686b3021..4d2520de7614c 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -41,6 +41,7 @@
#include <linux/slab.h>
#include <linux/vga_switcheroo.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_client_event.h>
#include <drm/drm_drv.h>
#include <drm/drm_file.h>
@@ -252,6 +253,10 @@ void drm_file_free(struct drm_file *file)
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
drm_fb_release(file);
drm_property_destroy_user_blobs(dev, file);
+ if (file->supports_luminance_control) {
+ drm_backlight_uninhibit_legacy_all(dev);
+ file->supports_luminance_control = false;
+ }
}
if (drm_core_check_feature(dev, DRIVER_SYNCOBJ))
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 9039a39c43243..de2c9d9ab5285 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -28,12 +28,14 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
+#include "drm/drm.h"
#include <linux/export.h>
#include <linux/nospec.h>
#include <linux/pci.h>
#include <linux/uaccess.h>
#include <drm/drm_auth.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_crtc.h>
#include <drm/drm_drv.h>
#include <drm/drm_file.h>
@@ -392,6 +394,28 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
file_priv->plane_color_pipeline = req->value;
break;
}
+ case DRM_CLIENT_CAP_LUMINANCE:
+ if (!drm_core_check_feature(dev, DRIVER_CONNECTOR_LUMINANCE))
+ return -EOPNOTSUPP;
+ if (!file_priv->atomic)
+ return -EINVAL;
+ if (req->value > 1)
+ return -EINVAL;
+
+ /*
+ * Serialize the compare-and-act so concurrent ioctls on a shared
+ * fd cannot unbalance the device-wide inhibit count.
+ */
+ mutex_lock(&dev->mode_config.mutex);
+ if (req->value != file_priv->supports_luminance_control) {
+ if (req->value)
+ drm_backlight_inhibit_legacy_all(dev);
+ else
+ drm_backlight_uninhibit_legacy_all(dev);
+ file_priv->supports_luminance_control = req->value;
+ }
+ mutex_unlock(&dev->mode_config.mutex);
+ break;
default:
return -EINVAL;
}
diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
index b23830494ed41..449160b9863f6 100644
--- a/include/drm/drm_drv.h
+++ b/include/drm/drm_drv.h
@@ -118,6 +118,13 @@ enum drm_driver_feature {
*/
DRIVER_CURSOR_HOTSPOT = BIT(9),
+ /**
+ * @DRIVER_CONNECTOR_LUMINANCE:
+ *
+ * Driver supports luminance control on a per connector basis.
+ */
+ DRIVER_CONNECTOR_LUMINANCE = BIT(10),
+
/* IMPORTANT: Below are all the legacy flags, add new ones above. */
/**
diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
index 6ee70ad65e1fd..0bb1e53f36bec 100644
--- a/include/drm/drm_file.h
+++ b/include/drm/drm_file.h
@@ -248,6 +248,14 @@ struct drm_file {
*/
bool supports_virtualized_cursor_plane;
+ /**
+ * @supports_luminance_control:
+ *
+ * This client is capable of setting the luminance for connectors.
+ *
+ */
+ bool supports_luminance_control;
+
/**
* @master:
*
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index bc7ef7684099b..a3141d46d7d66 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -903,6 +903,28 @@ struct drm_get_cap {
*/
#define DRM_CLIENT_CAP_PLANE_COLOR_PIPELINE 7
+/**
+ * DRM_CLIENT_CAP_LUMINANCE
+ *
+ * If set to 1, the client declares support for the LUMINANCE connector property
+ * and will control backlight brightness through the DRM atomic interface. This
+ * enables the kernel to expose the LUMINANCE property on connectors that have
+ * an associated backlight device.
+ *
+ * When this capability is enabled:
+ * - The LUMINANCE property becomes visible on supported connectors
+ * - Legacy sysfs writes to /sys/class/backlight/{*}/brightness will return
+ * -EBUSY to prevent conflicts with DRM-based brightness control
+ * - The client should include luminance values as part of atomic commits
+ * - Brightness changes are synchronized with display power state (DPMS)
+ *
+ * The LUMINANCE property accepts values from 0 to max_brightness, where 0 turns
+ * off the backlight, and 1 to max_brightness control the brightness level.
+ *
+ * This capability is supported starting in kernel 7.2.
+ */
+#define DRM_CLIENT_CAP_LUMINANCE 8
+
/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
struct drm_set_client_cap {
__u64 capability;
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 06/14] drm/amd/display: Pass up errors reading actual brightness
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (4 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 07/14] drm/amd: Indicate driver supports luminance Mario Limonciello
` (9 subsequent siblings)
15 siblings, 0 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
[Why]
If the DC API fails to return actual brightness when backlight control
API requests it, then the wrong value may be returned.
[How]
Change return type of amdgpu_dm_backlight_get_level() to an integer
and pass an error code up to the caller.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
.../drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c | 13 +++++++++----
.../drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 4 ++--
3 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
index b9e90ea449ca3..406a821d03cd6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
@@ -363,7 +363,7 @@ int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
EXPORT_IF_KUNIT(amdgpu_dm_backlight_update_status);
STATIC_IFN_KUNIT
-u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx)
+int amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx)
{
int ret;
struct amdgpu_dm_backlight_caps caps;
@@ -376,14 +376,14 @@ u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx)
u32 avg, peak;
if (!dc_link_get_backlight_level_nits(link, &avg, &peak))
- return dm->brightness[bl_idx];
+ return -EINVAL;
return convert_brightness_to_user(&caps, avg);
}
ret = dc_link_get_backlight_level(link);
if (ret == DC_ERROR_UNEXPECTED)
- return dm->brightness[bl_idx];
+ return -EINVAL;
return convert_brightness_to_user(&caps, ret);
}
@@ -394,8 +394,13 @@ int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
{
struct amdgpu_display_manager *dm = bl_get_data(bd);
int i = amdgpu_dm_backlight_get_device_index(dm, bd);
+ int ret;
+
+ ret = amdgpu_dm_backlight_get_level(dm, i);
+ if (ret < 0)
+ return dm->brightness[i];
- return amdgpu_dm_backlight_get_level(dm, i);
+ return ret;
}
EXPORT_IF_KUNIT(amdgpu_dm_backlight_get_brightness);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h
index 07b75064847c7..72f1c8d861c8c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h
@@ -56,7 +56,7 @@ extern const struct attribute_group amdgpu_group;
struct dc_stream_state *dm_find_stream_with_link(struct amdgpu_display_manager *dm,
struct dc_link *link);
int amdgpu_dm_backlight_update_status(struct backlight_device *bd);
-u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx);
+int amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm, int bl_idx);
int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd);
ssize_t panel_power_savings_show(struct device *device,
struct device_attribute *attr,
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
index 7ca17f803f9d7..e03173d4e5bd8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
@@ -382,7 +382,7 @@ static void dm_test_backlight_get_level_pwm_error(struct kunit *test)
dm->brightness[0] = 4321;
dm->backlight_link[0] = link;
- KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), 4321U);
+ KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), -EINVAL);
}
/**
@@ -424,7 +424,7 @@ static void dm_test_backlight_get_level_aux_error(struct kunit *test)
caps->caps_valid = true;
caps->aux_support = true;
- KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), 6789U);
+ KUNIT_EXPECT_EQ(test, amdgpu_dm_backlight_get_level(dm, 0), -EINVAL);
}
/**
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 07/14] drm/amd: Indicate driver supports luminance
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (5 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 06/14] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 08/14] drm/amd/display: use drm backlight Mario Limonciello
` (8 subsequent siblings)
15 siblings, 0 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
This will allow the connector to show luminance information for
eDP panels.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 3ca98091ce487..7b54ca8beeb4c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -3124,6 +3124,7 @@ static const struct drm_driver amdgpu_kms_driver = {
DRIVER_ATOMIC |
DRIVER_GEM |
DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |
+ DRIVER_CONNECTOR_LUMINANCE |
DRIVER_SYNCOBJ_TIMELINE,
.open = amdgpu_driver_open_kms,
.postclose = amdgpu_driver_postclose_kms,
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 08/14] drm/amd/display: use drm backlight
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (6 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 07/14] drm/amd: Indicate driver supports luminance Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:57 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello
` (7 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
Convert the AMD display driver to the DRM backlight infrastructure so
brightness can be controlled through the connector LUMINANCE property.
Link the registered backlight_device to the eDP connector and unlink it
on teardown; the DRM core owns the embedded backlight state and its
property, so no explicit allocation or failure handling is needed.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 15 +++++++++---
.../display/amdgpu_dm/amdgpu_dm_backlight.c | 23 ++++++++++++++++---
.../display/amdgpu_dm/amdgpu_dm_connector.c | 2 ++
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 2fe934036e363..f7b1eaf34b59d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5050,10 +5050,21 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state)
old_crtc_state = drm_atomic_get_old_crtc_state(state, &acrtc->base);
}
+ /*
+ * Apply the LUMINANCE property first: a brightness-only commit
+ * does not pull the CRTC into the atomic state (so new_crtc_state
+ * is NULL), and a modeset is skipped below - in both cases the
+ * backlight must still follow the requested luminance.
+ */
+ drm_atomic_helper_connector_apply_luminance(new_con_state);
+
/* Skip any modesets/resets */
- if (!acrtc || drm_atomic_crtc_needs_modeset(new_crtc_state))
+ if (!acrtc || !new_crtc_state ||
+ drm_atomic_crtc_needs_modeset(new_crtc_state))
continue;
+ drm_connector_update_privacy_screen(new_con_state);
+
dm_new_crtc_state = to_dm_crtc_state(new_crtc_state);
dm_old_crtc_state = to_dm_crtc_state(old_crtc_state);
@@ -5133,8 +5144,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state)
&stream_update);
mutex_unlock(&dm->dc_lock);
kfree(dummy_updates);
-
- drm_connector_update_privacy_screen(new_con_state);
}
/**
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
index 406a821d03cd6..1fefe3837e4cf 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
@@ -40,6 +40,7 @@
#include <linux/backlight.h>
#include <linux/power_supply.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_edid.h>
#include <drm/drm_utils.h>
@@ -224,13 +225,17 @@ struct dc_stream_state *dm_find_stream_with_link(
struct amdgpu_display_manager *dm,
struct dc_link *link)
{
- struct dc_state *cur_dc_state = dm->dc->current_state;
+ struct dc_state *cur_dc_state;
struct dc_stream_state *stream = NULL;
int i;
+ if (!dm || !dm->dc || !dm->dc->current_state || !link)
+ return NULL;
+
+ cur_dc_state = dm->dc->current_state;
for (i = 0; i < cur_dc_state->stream_count; i++) {
stream = cur_dc_state->streams[i];
- if (stream->link == link)
+ if (stream && stream->link == link)
return stream;
}
@@ -284,7 +289,7 @@ void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
dm->brightness[bl_idx] = user_brightness;
/* update scratch register */
- if (bl_idx == 0)
+ if (bl_idx == 0 && dm->adev && dm->adev->rmmio && dm->adev->bios_scratch_reg_offset)
amdgpu_atombios_scratch_regs_set_backlight_level(dm->adev, dm->brightness[bl_idx]);
brightness = convert_brightness_from_user(caps, dm->brightness[bl_idx]);
link = (struct dc_link *)dm->backlight_link[bl_idx];
@@ -496,6 +501,9 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
dm->actual_brightness[aconnector->bl_idx] = real_brightness;
dm->brightness[aconnector->bl_idx] = real_brightness;
}
+ /* Link the registered backlight device to the DRM connector. */
+ drm_backlight_link(&aconnector->base, dm->backlight_dev[aconnector->bl_idx]);
+
drm_dbg_driver(drm, "DM: Registered Backlight device: %s\n", bl_name);
}
}
@@ -582,6 +590,8 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
{
struct dc_link *link = aconnector->dc_link;
int bl_idx = dm->num_of_edps;
+ struct backlight_properties props = { 0 };
+ struct amdgpu_dm_backlight_caps *caps;
if (!(link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) ||
link->type == dc_connection_none)
@@ -600,6 +610,13 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
amdgpu_dm_update_connector_ext_caps(aconnector);
+ caps = &dm->backlight_caps[bl_idx];
+ amdgpu_dm_backlight_fill_props(caps, power_supply_is_system_supplied() > 0,
+ !(amdgpu_dc_debug_mask &
+ DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE),
+ &props);
+ drm_backlight_create_property(&aconnector->base, props.max_brightness, false);
+
/* Offer ABM property when user didn't turn off by module parameter.
* OLED panels are included to support CACP (Content Adaptive
* Contrast and Power) feature via set_abm_level.
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index c8a1ab8c3b169..fe4ab55f5130f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -58,6 +58,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_uapi.h>
#include <drm/drm_atomic_helper.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_edid.h>
#include <drm/drm_eld.h>
#include <drm/drm_fixed.h>
@@ -1911,6 +1912,7 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_destroy(struct drm_connector *connecto
}
if (aconnector->bl_idx != -1) {
+ drm_backlight_link(&aconnector->base, NULL);
backlight_device_unregister(dm->backlight_dev[aconnector->bl_idx]);
dm->backlight_dev[aconnector->bl_idx] = NULL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (7 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 08/14] drm/amd/display: use drm backlight Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:51 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures Mario Limonciello
` (6 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello (AMD)
From: "Mario Limonciello (AMD)" <superm1@kernel.org>
Ensure adev->bios_scratch_reg_offset is non-zero before accessing
scratch registers in amdgpu_atombios_scratch_regs_set_backlight_level()
to avoid dereferencing unmapped MMIO offsets.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
index 27c0dc8f6137a..2d8c2ba04e670 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
@@ -1622,7 +1622,12 @@ void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
void amdgpu_atombios_scratch_regs_set_backlight_level(struct amdgpu_device *adev,
u32 backlight_level)
{
- u32 tmp = RREG32(adev->bios_scratch_reg_offset + 2);
+ u32 tmp;
+
+ if (!adev->bios_scratch_reg_offset)
+ return;
+
+ tmp = RREG32(adev->bios_scratch_reg_offset + 2);
tmp &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
tmp |= (backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) &
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (8 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 11/14] drm/bridge: auto-link panel backlight in bridge connector Mario Limonciello
` (5 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello (AMD)
From: "Mario Limonciello (AMD)" <superm1@kernel.org>
Initialize backlight connector state and display manager dc_lock in
KUnit connector and adev allocators, and update property count
expectations in tests to account for the newly attached LUMINANCE property.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
.../amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 14 +++++++++++---
.../amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c | 8 +++++++-
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
index e03173d4e5bd8..c5f65e9a90ca8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
@@ -52,6 +52,7 @@ static void setup_test_connector(struct kunit *test,
fixture->aconnector->dc_link = fixture->link;
fixture->aconnector->base.dev = &fixture->adev->ddev;
fixture->link->connector_signal = signal;
+ drm_backlight_connector_init(&fixture->aconnector->base);
}
static void setup_test_dm_ddev(struct kunit *test, struct amdgpu_display_manager *dm)
@@ -483,12 +484,17 @@ static void dm_test_register_backlight_device_success(struct kunit *test)
struct dc_link *link = dm_kunit_alloc_link(test);
struct drm_minor *primary;
unsigned int max;
+ int ret;
+
+ ret = drmm_mode_config_init(&adev->ddev);
+ KUNIT_ASSERT_EQ(test, ret, 0);
setup_test_link_service(test, link);
link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_error;
primary = kunit_kzalloc(test, sizeof(*primary), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, primary);
adev->ddev.primary = primary;
+ adev->dm.ddev = &adev->ddev;
adev->dm.backlight_link[0] = link;
aconnector = dm_kunit_alloc_connector(test, adev, link);
@@ -1884,9 +1890,11 @@ static void dm_test_setup_backlight_device_attaches_abm_property(struct kunit *t
KUNIT_EXPECT_EQ(test, dm->num_of_edps, 1);
KUNIT_EXPECT_EQ(test, aconnector->bl_idx, 0);
- KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->count, old_count + 1);
- KUNIT_EXPECT_PTR_EQ(test, aconnector->base.base.properties->properties[old_count], prop);
- KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->values[old_count],
+ KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->count, old_count + 2);
+ KUNIT_EXPECT_PTR_EQ(test,
+ aconnector->base.base.properties->properties[old_count + 1],
+ prop);
+ KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->values[old_count + 1],
(uint64_t)ABM_SYSFS_CONTROL);
amdgpu_dm_set_backlight_param(saved_backlight);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
index aad122c7229f5..ed5045c948fe9 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
@@ -7,6 +7,7 @@
#include <kunit/test.h>
#include <linux/module.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_kunit_helpers.h>
#include <drm/drm_managed.h>
@@ -32,7 +33,11 @@ struct amdgpu_device *dm_kunit_alloc_adev(struct kunit *test)
DRIVER_MODESET | DRIVER_ATOMIC);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
- return drm_to_adev(drm);
+ struct amdgpu_device *adev = drm_to_adev(drm);
+
+ mutex_init(&adev->dm.dc_lock);
+
+ return adev;
}
EXPORT_SYMBOL(dm_kunit_alloc_adev);
@@ -172,6 +177,7 @@ struct amdgpu_dm_connector *dm_kunit_alloc_connector(struct kunit *test,
if (adev)
aconnector->base.dev = &adev->ddev;
aconnector->dc_link = link;
+ drm_backlight_connector_init(&aconnector->base);
return aconnector;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 11/14] drm/bridge: auto-link panel backlight in bridge connector
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (9 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector Mario Limonciello
` (4 subsequent siblings)
15 siblings, 0 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, Mario Limonciello
Link a panel's backlight_device to the bridge connector so
luminance-aware clients can drive it through the LUMINANCE property.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/bridge/panel.c | 15 +++++++++++++++
drivers/gpu/drm/display/drm_bridge_connector.c | 11 ++++++++++-
include/drm/drm_bridge.h | 1 +
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index 02388a3de626e..36005e10494d3 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -233,6 +233,21 @@ bool drm_bridge_is_panel(const struct drm_bridge *bridge)
}
EXPORT_SYMBOL(drm_bridge_is_panel);
+/**
+ * drm_panel_bridge_to_panel - get the drm_panel wrapped by a panel bridge
+ * @bridge: the panel bridge
+ *
+ * Returns the &drm_panel wrapped by @bridge, or NULL if @bridge is not a
+ * panel bridge.
+ */
+struct drm_panel *drm_panel_bridge_to_panel(struct drm_bridge *bridge)
+{
+ if (!drm_bridge_is_panel(bridge))
+ return NULL;
+ return drm_bridge_to_panel_bridge(bridge)->panel;
+}
+EXPORT_SYMBOL(drm_panel_bridge_to_panel);
+
/**
* drm_panel_bridge_add - Creates a &drm_bridge and &drm_connector that
* just calls the appropriate functions from &drm_panel.
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
index 8b54069fa53a4..d4b4e59cea51c 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -11,7 +11,9 @@
#include <linux/slab.h>
#include <drm/drm_atomic_state_helper.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_bridge.h>
+#include <drm/drm_panel.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_connector.h>
#include <drm/drm_device.h>
@@ -1082,9 +1084,16 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
connector->polled = DRM_CONNECTOR_POLL_CONNECT
| DRM_CONNECTOR_POLL_DISCONNECT;
- if (panel_bridge)
+ if (panel_bridge) {
+ struct drm_panel *panel;
+
drm_panel_bridge_set_orientation(connector, panel_bridge);
+ panel = drm_panel_bridge_to_panel(panel_bridge);
+ if (panel && panel->backlight)
+ drm_backlight_link(connector, panel->backlight);
+ }
+
if (support_hdcp && IS_REACHABLE(CONFIG_DRM_DISPLAY_HELPER) &&
IS_ENABLED(CONFIG_DRM_DISPLAY_HDCP_HELPER))
drm_connector_attach_content_protection_property(connector, true);
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 58fff047f43b6..ce1fc8695b455 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -1475,6 +1475,7 @@ void drm_bridge_hpd_notify(struct drm_bridge *bridge,
#ifdef CONFIG_DRM_PANEL_BRIDGE
bool drm_bridge_is_panel(const struct drm_bridge *bridge);
+struct drm_panel *drm_panel_bridge_to_panel(struct drm_bridge *bridge);
struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel);
struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
u32 connector_type);
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (10 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 11/14] drm/bridge: auto-link panel backlight in bridge connector Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:57 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 13/14] drm/i915: " Mario Limonciello
` (3 subsequent siblings)
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello
This will allow the connector to show luminance information for
eDP panels.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/gpu/drm/xe/xe_device.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index ee732e5495f7d..b74afe1594842 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -397,6 +397,7 @@ static const struct drm_driver regular_driver = {
XE_DISPLAY_DRIVER_FEATURES |
DRIVER_GEM |
DRIVER_RENDER | DRIVER_SYNCOBJ |
+ DRIVER_CONNECTOR_LUMINANCE |
DRIVER_SYNCOBJ_TIMELINE,
.open = xe_file_open,
.postclose = xe_file_close,
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 13/14] drm/i915: Indicate support for luminance on the connector
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (11 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 14/14] drm/i915/display: use drm backlight Mario Limonciello
` (2 subsequent siblings)
15 siblings, 0 replies; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello
This will allow the connector to show luminance information for
eDP panels.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/gpu/drm/i915/i915_driver.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index ce6d20958320c..83cff711d28df 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1768,6 +1768,7 @@ static const struct drm_driver i915_drm_driver = {
.driver_features =
DRIVER_GEM |
DRIVER_RENDER | DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_SYNCOBJ |
+ DRIVER_CONNECTOR_LUMINANCE |
DRIVER_SYNCOBJ_TIMELINE,
.release = i915_driver_release,
.open = i915_driver_open,
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH v8 14/14] drm/i915/display: use drm backlight
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (12 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 13/14] drm/i915: " Mario Limonciello
@ 2026-09-08 4:40 ` Mario Limonciello
2026-09-08 5:03 ` sashiko-bot
2026-09-08 9:32 ` ✓ i915.CI.BAT: success for Add support for a DRM backlight capability (rev3) Patchwork
2026-09-08 18:45 ` ✗ i915.CI.Full: failure " Patchwork
15 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 4:40 UTC (permalink / raw)
To: dri-devel, harry.wentland, Simona Vetter, Alex Deucher,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello
Convert the Intel display drivers (i915 and xe) to the DRM backlight
infrastructure so brightness can be controlled through the connector
LUMINANCE property. Link the backlight device to the eDP connector on
registration and unlink it on unregistration; the DRM core owns the
embedded backlight state and its property.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
drivers/gpu/drm/i915/display/intel_backlight.c | 6 ++++++
drivers/gpu/drm/i915/display/intel_display.c | 7 ++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c
index b128896cb1c2d..3ed8c4f7af425 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_backlight.c
@@ -9,6 +9,7 @@
#include <linux/string_helpers.h>
#include <acpi/video.h>
+#include <drm/drm_backlight.h>
#include <drm/drm_file.h>
#include <drm/drm_print.h>
#include <drm/intel/pci_config.h>
@@ -1004,6 +1005,8 @@ int intel_backlight_device_register(struct intel_connector *connector)
"[CONNECTOR:%d:%s] backlight device %s registered\n",
connector->base.base.id, connector->base.name, name);
+ drm_backlight_link(&connector->base, bd);
+
out:
kfree(name);
@@ -1015,6 +1018,7 @@ void intel_backlight_device_unregister(struct intel_connector *connector)
struct intel_panel *panel = &connector->panel;
if (panel->backlight.device) {
+ drm_backlight_link(&connector->base, NULL);
backlight_device_unregister(panel->backlight.device);
panel->backlight.device = NULL;
}
@@ -1703,6 +1707,8 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
panel->backlight.present = true;
+ drm_backlight_create_property(&connector->base, panel->backlight.max, false);
+
drm_dbg_kms(display->drm,
"[CONNECTOR:%d:%s] backlight initialized, %s, brightness %u/%u\n",
connector->base.base.id, connector->base.name,
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 9dfd095f325f7..d53e5f4bdf57d 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7496,10 +7496,12 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
struct intel_display *display = to_intel_display(state);
struct intel_uncore *uncore = to_intel_uncore(display->drm);
struct intel_crtc_state *new_crtc_state, *old_crtc_state;
+ struct drm_connector_state *new_conn_state;
+ struct drm_connector *connector;
struct intel_crtc *crtc;
struct intel_power_domain_mask put_domains[I915_MAX_PIPES] = {};
struct ref_tracker *wakeref = NULL;
- int power_async_delay;
+ int power_async_delay, i;
for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state)
intel_atomic_dsb_prepare(state, crtc);
@@ -7608,6 +7610,9 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
/* Now enable the clocks, plane, pipe, and connectors that we set up. */
display->modeset.funcs->commit_modeset_enables(state);
+ for_each_new_connector_in_state(&state->base, connector, new_conn_state, i)
+ drm_atomic_helper_connector_apply_luminance(new_conn_state);
+
intel_display_power_dc3co_compute(state);
/* FIXME probably need to sequence this properly */
--
2.43.0
^ permalink raw reply related [flat|nested] 31+ messages in thread
* Re: [PATCH v8 01/14] Revert "backlight: Remove notifier"
2026-09-08 4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
@ 2026-09-08 4:51 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:51 UTC (permalink / raw)
To: Mario Limonciello; +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Uninitialized `backlight_notifier` rwsem leads to kernel panic on registration if `backlight_class_init()` fails.
--
commit d337f12d53eda5facdddbe940d5c74c91750178b
Author: Mario Limonciello <mario.limonciello@amd.com>
Revert "backlight: Remove notifier"
This commit reverts the removal of the backlight notifier support, as it
is needed to add backlight control support into DRM connectors.
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index fc9bb303e8c5f..4401f6294ccc8 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -65,6 +65,7 @@
>
> static struct list_head backlight_dev_list;
> static struct mutex backlight_dev_list_mutex;
> +static struct blocking_notifier_head backlight_notifier;
[Severity: High]
Does this zero-initialized notifier head lead to a kernel panic if
backlight_class_init() in drivers/video/backlight/backlight.c fails?
If class_register() fails in backlight_class_init() due to memory pressure
or sysfs issues, the function will return early and skip the dynamic
initialization via BLOCKING_INIT_NOTIFIER_HEAD().
When a subsequent caller calls backlight_register_notifier(), it will pass
this zero-initialized notifier to blocking_notifier_chain_register(), which
will attempt to lock the uninitialized rw_semaphore and cause an oops.
Could this be prevented by using the static initialization macro instead?
static BLOCKING_NOTIFIER_HEAD(backlight_notifier);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=1
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper
2026-09-08 4:40 ` [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello
@ 2026-09-08 4:51 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:51 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx, dri-devel, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] This problem wasn't introduced by this patch, but this patch provides an incomplete fix. It adds a check for `!adev->bios_scratch_reg_offset` in the backlight helper to prevent unmapped MMIO accesses, but fails to add this necessary safety check to several other functions that unconditionally access scratch registers using the identical offset.
--
commit 23cd4f591b277fb308823be50c628e3526a8743e
Author: Mario Limonciello (AMD) <superm1@kernel.org>
drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper
Ensure adev->bios_scratch_reg_offset is non-zero before accessing
scratch registers in amdgpu_atombios_scratch_regs_set_backlight_level()
to avoid dereferencing unmapped MMIO offsets.
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> index 27c0dc8f6137a..2d8c2ba04e670 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> @@ -1622,7 +1622,12 @@ void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
> void amdgpu_atombios_scratch_regs_set_backlight_level(struct amdgpu_device *adev,
> u32 backlight_level)
> {
> - u32 tmp = RREG32(adev->bios_scratch_reg_offset + 2);
> + u32 tmp;
> +
> + if (!adev->bios_scratch_reg_offset)
> + return;
> +
[Severity: High]
This is a pre-existing issue, but while this patch adds a safety check here,
should we also add similar checks to other functions that access scratch
registers using the identical offset?
If the firmware info table is missing or fails to parse properly, leaving the
offset at 0, these other paths are exposed to arbitrary MMIO writes:
In amdgpu_atombios_scratch_regs_engine_hung()
(drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c):
u32 tmp = RREG32(adev->bios_scratch_reg_offset + 3);
In amdgpu_atombios_scratch_need_asic_init()
(drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c):
u32 tmp = RREG32(adev->bios_scratch_reg_offset + 7);
In smu_v11_0_baco_set_state()
(drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c):
WREG32(adev->bios_scratch_reg_offset + 6, 0);
Could this missing coverage lead to corrupting hardware state or triggering
machine check exceptions during GPU initialization, GPU reset, and BACO state
transitions if the offset is 0?
> + tmp = RREG32(adev->bios_scratch_reg_offset + 2);
>
> tmp &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=9
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 02/14] backlight: add kernel-internal backlight API
2026-09-08 4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
@ 2026-09-08 4:52 ` sashiko-bot
2026-09-08 15:45 ` Jani Nikula
1 sibling, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:52 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx, dri-devel, intel-xe
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] backlight_notify_brightness() is called inside backlight_update_status() while bd->ops_lock is held, creating an AB-BA deadlock risk with DRM listeners.
- [Medium] Hardware/hotkey-driven brightness changes reported via backlight_force_update() bypass backlight_notify_brightness(), causing in-kernel listeners to lose sync with the actual state.
--
commit 56d45c464432e9b84ad73dff6ec5f6ddda9af544
Author: Mario Limonciello <mario.limonciello@amd.com>
backlight: add kernel-internal backlight API
This commit adds internal backlight helpers allowing DRM drivers to provide
an interface for user-space to control the backlight via DRM connector
properties. It introduces a brightness-changed notification and a per-device
takeover count to inhibit legacy sysfs writes while a luminance-aware DRM
client is in control.
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 4401f6294ccc8..1c700c1e77c3f 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
[ ... ]
> @@ -548,6 +600,20 @@ int backlight_unregister_notifier(struct notifier_block *nb)
> }
> EXPORT_SYMBOL(backlight_unregister_notifier);
>
> +/**
> + * backlight_notify_brightness - notify brightness change to listeners
> + * @bd: backlight device that changed
> + *
> + * Notify registered listeners that the backlight brightness has changed.
> + * This is called automatically after successful brightness updates.
> + */
> +void backlight_notify_brightness(struct backlight_device *bd)
> +{
> + blocking_notifier_call_chain(&backlight_notifier,
> + BACKLIGHT_BRIGHTNESS_CHANGED, bd);
> +}
> +EXPORT_SYMBOL(backlight_notify_brightness);
[Severity: Medium]
Will in-kernel listeners lose sync with the actual hardware backlight state
when brightness is changed via a hardware hotkey or ACPI event?
When physical hotkey presses trigger platform drivers to invoke
backlight_force_update():
drivers/video/backlight/backlight.c:backlight_force_update() {
...
mutex_unlock(&bd->ops_lock);
backlight_generate_event(bd, reason);
}
It emits a user-space uevent via backlight_generate_event(), but it doesn't
call the newly added backlight_notify_brightness() helper. Should it also
notify in-kernel DRM connector luminance properties here?
> diff --git a/include/linux/backlight.h b/include/linux/backlight.h
> index 015183d129f96..fac1acbc698a1 100644
> --- a/include/linux/backlight.h
> +++ b/include/linux/backlight.h
[ ... ]
> @@ -325,6 +351,10 @@ static inline int backlight_update_status(struct backlight_device *bd)
> ret = bd->ops->update_status(bd);
> mutex_unlock(&bd->update_lock);
>
> + /* Notify DRM and other listeners that brightness changed */
> + if (ret == 0)
> + backlight_notify_brightness(bd);
[Severity: High]
Does calling backlight_notify_brightness() here create an AB-BA deadlock risk
with DRM listeners?
The caller of backlight_update_status() often holds bd->ops_lock (for example,
in backlight_set_brightness() or legacy sysfs writes). This means the blocking
notifier chain is fired synchronously under ops_lock.
If a DRM listener acquires a DRM lock during the notification callback, it
establishes an ops_lock -> drm_lock dependency.
Conversely, if a DRM driver calls backlight_set_brightness() while holding
DRM locks, it will attempt to acquire ops_lock, resulting in a drm_lock ->
ops_lock dependency.
Should the notification be deferred until after ops_lock is released, just
as backlight_generate_event() is handled?
> +
> return ret;
> }
>
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=2
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures
2026-09-08 4:40 ` [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures Mario Limonciello
@ 2026-09-08 4:54 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:54 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx, intel-xe, dri-devel
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Mock connectors bypass standard DRM initialization, leading to missing cleanup and leaving dangling pointers on the global `drm_backlight_list`.
- [Medium] Double initialization of `mode_config` via `drmm_mode_config_init()` overwrites lists, leaks DRM standard properties, and double-registers cleanup actions.
--
commit a56dca4aad815c6c0a1a6a861da4fc03fba94e83
Author: Mario Limonciello (AMD) <superm1@kernel.org>
drm/amd/display: Update KUnit backlight tests for luminance property and fixtures
Initialize backlight connector state and display manager dc_lock in
KUnit connector and adev allocators, and update property count
expectations in tests to account for the newly attached LUMINANCE property.
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> index e03173d4e5bd8..c5f65e9a90ca8 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_backlight_test.c
> @@ -52,6 +52,7 @@ static void setup_test_connector(struct kunit *test,
> fixture->aconnector->dc_link = fixture->link;
> fixture->aconnector->base.dev = &fixture->adev->ddev;
> fixture->link->connector_signal = signal;
> + drm_backlight_connector_init(&fixture->aconnector->base);
> }
[Severity: High]
Does this bypass standard DRM initialization? By manually initializing the
backlight fields here (and in dm_kunit_alloc_connector()) without registering
a standard DRM lifecycle cleanup action, the mock connector avoids
drm_connector_cleanup().
When tests like dm_test_register_backlight_device_success() later call
amdgpu_dm_register_backlight_device() and link it into drm_backlight_list, does
the lack of cleanup leave a dangling pointer on the global list after the KUnit
test finishes and frees the mock connector?
[ ... ]
> @@ -483,12 +484,17 @@ static void dm_test_register_backlight_device_success(struct kunit *test)
> struct dc_link *link = dm_kunit_alloc_link(test);
> struct drm_minor *primary;
> unsigned int max;
> + int ret;
> +
> + ret = drmm_mode_config_init(&adev->ddev);
> + KUNIT_ASSERT_EQ(test, ret, 0);
[Severity: Medium]
Is this call to drmm_mode_config_init() redundant and potentially harmful?
The DRM device adev is allocated via dm_kunit_alloc_adev(), which uses
__drm_kunit_helper_alloc_drm_device() with DRIVER_MODESET. This implies
the mode config is already initialized. Calling it again zeroes out lists
like property_list (using INIT_LIST_HEAD) without freeing previously
allocated standard properties, which leads to a memory leak.
Furthermore, does it register a duplicate drm_mode_config_init_release action,
leading to double teardown attempts on the same structures?
A similarly problematic duplicate call also appears to be present in
dm_test_setup_backlight_device_attaches_abm_property().
[ ... ]
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
> index aad122c7229f5..ed5045c948fe9 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c
[ ... ]
> @@ -172,6 +177,7 @@ struct amdgpu_dm_connector *dm_kunit_alloc_connector(struct kunit *test,
> if (adev)
> aconnector->base.dev = &adev->ddev;
> aconnector->dc_link = link;
> + drm_backlight_connector_init(&aconnector->base);
>
> return aconnector;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=10
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure
2026-09-08 4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
@ 2026-09-08 4:54 ` sashiko-bot
2026-09-08 15:48 ` Jani Nikula
1 sibling, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:54 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-xe, intel-gfx, dri-devel
Thank you for your contribution! Sashiko AI review found 13 potential issue(s) to consider:
- [Critical] Concurrent backlight unlinking and connector teardown causes a Use-After-Free due to missing references and early return bypassing `cancel_work_sync`.
- [High] Turning off the backlight asynchronously during pipeline disable breaks hardware shutdown sequencing, risking screen corruption.
- [High] Backlight hardware state is mutated asynchronously before atomic commit validation, failing to roll back on commit failure.
- [High] Lockless, in-place modification of `connector->state->luminance` from asynchronous notifier context causes Write-After-Free.
- [High] Lockless read of `crtc->state` in `drm_atomic_helper_connector_apply_luminance` causes a Use-After-Free.
- [High] Lockless read of `connector->state` of unrelated connectors in `drm_atomic_crtc_set_backlight` causes a Use-After-Free.
- [Medium] Concurrency between `drm_backlight_inhibit_legacy_all` and `drm_backlight_link` leads to double-counted or overwritten `luminance_clients`.
- [Medium] Triggering a `WARN_ON` for routine hardware communication failures allows trivial kernel log spam and potential system panics.
- [Medium] Legacy DPMS changes incorrectly dim all connectors on shared CRTCs, and conflict with the atomic commit tail logic.
- [Medium] Backlight is enabled on disconnected/un-driven panels during DPMS ON.
- [Low] The fallback brightness assignment in `drm_backlight_bd_set_luminance` is mathematically guaranteed to fail due to a hardcoded `U16_MAX`.
- [Low] Property bounds are not updated when dynamically linking a backend with a different brightness range.
- [Low] Broken teardown symmetry leaves the backlight sysfs symlink unremoved, resulting in dead code.
--
commit 4014f9d380d34194182229a03855db38075d5806
Author: Mario Limonciello <mario.limonciello@amd.com>
Subject: drm: add connector backlight (LUMINANCE) infrastructure
This commit introduces a per-connector LUMINANCE range property to control
backlight brightness through the DRM atomic modeset path. It embeds a
backlight state in each connector and synchronizes brightness changes
asynchronously via a workqueue.
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index 285aac3554dfd..110cd81e5d6db 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
[ ... ]
> @@ -1230,6 +1231,10 @@ drm_atomic_helper_commit_encoder_bridge_disable(struct drm_device *dev,
> * it away), so we won't call disable hooks twice.
> */
> bridge = drm_bridge_chain_get_first_bridge(encoder);
> +
> + /* Turn the backlight off before disabling the pipeline. */
> + drm_backlight_set_luminance(connector, 0);
> +
> drm_atomic_bridge_chain_disable(bridge, state);
> drm_bridge_put(bridge);
[Severity: High]
Does this sequence break the display hardware shutdown requirements?
By queuing the backlight off operation asynchronously via
drm_backlight_set_luminance() and immediately disabling the bridge chain,
the pipeline might be shut down before the backlight actually turns off.
Could this lead to screen corruption or panel damage?
[ ... ]
> @@ -1775,6 +1780,24 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
> }
> EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
>
> +/**
> + * drm_atomic_helper_connector_apply_luminance - apply connector luminance from atomic state
> + * @conn_state: atomic connector state to apply luminance for
> + *
> + * Updates the backlight luminance from the atomic connector state. If the
> + * connector has a linked backlight and is associated with an active CRTC,
> + * push the luminance value to hardware.
> + */
> +void drm_atomic_helper_connector_apply_luminance(const struct drm_connector_state *conn_state)
> +{
> + struct drm_connector *connector = conn_state->connector;
> +
> + if (conn_state->crtc && conn_state->crtc->state &&
> + conn_state->crtc->state->active)
[Severity: High]
Can a concurrent CRTC modeset free the CRTC state while it is being accessed
here?
Since the CRTC lock might not be held during pure connector property
commits, reading conn_state->crtc->state->active could result in a
use-after-free if the CRTC state is swapped and freed simultaneously.
> + drm_backlight_set_luminance(connector, conn_state->luminance);
> +}
> +EXPORT_SYMBOL(drm_atomic_helper_connector_apply_luminance);
> +
[ ... ]
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 5ea593b3a98ec..07d4bcb16cd23 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
[ ... ]
> @@ -1133,6 +1144,22 @@ static struct drm_pending_vblank_event *create_vblank_event(
> return e;
> }
>
> +static void drm_atomic_crtc_set_backlight(struct drm_crtc *crtc, bool active)
> +{
> + struct drm_connector_list_iter conn_iter;
> + struct drm_connector *connector;
> +
> + drm_connector_list_iter_begin(crtc->dev, &conn_iter);
> + drm_for_each_connector_iter(connector, &conn_iter) {
> + if (!connector->state || connector->state->crtc != crtc)
> + continue;
[Severity: High]
Could this lockless read of connector->state trigger a use-after-free?
This function iterates all connectors and reads their states while holding
only the connection_mutex. If another connector receives a concurrent
property update, its state could be swapped and freed while being read here.
> +
> + drm_backlight_set_luminance(connector,
> + active ? connector->state->luminance : 0);
> + }
> + drm_connector_list_iter_end(&conn_iter);
> +}
> +
> int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
> struct drm_connector *connector,
> int mode)
> @@ -1155,9 +1182,29 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
> if (connector->dpms == mode)
> goto out;
>
> + crtc = connector->state ? connector->state->crtc : NULL;
> +
> + /* Handle backlight brightness coordination with DPMS state changes */
> + if (old_mode != DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_OFF) {
> + /* DPMS ON -> OFF: dim all connectors driven by this CRTC. */
> + if (crtc)
> + drm_atomic_crtc_set_backlight(crtc, false);
[Severity: Medium]
Will this cause unintended dimming or flickering on cloned displays?
When one connector on a shared CRTC transitions to DPMS OFF, calling
drm_atomic_crtc_set_backlight() queues an OFF request for all connectors
driven by that CRTC, even if the other connectors are still supposed to
remain active.
> + else
> + drm_backlight_set_luminance(connector, 0);
> + }
> +
> connector->dpms = mode;
>
> - crtc = connector->state->crtc;
> + /* DPMS OFF -> ON: restore brightness to property value */
> + if (old_mode == DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_ON &&
> + connector->state) {
> + if (crtc)
> + drm_atomic_crtc_set_backlight(crtc, true);
> + else
> + drm_backlight_set_luminance(connector,
> + connector->state->luminance);
[Severity: Medium]
Is it safe to turn on the backlight for a disconnected panel?
If a connector is turned on (DPMS ON) but has no active CRTC (crtc is NULL),
this branch restores the committed luminance. Illuminating a panel that isn't
receiving a video signal could violate hardware sequencing constraints and
stress the panel.
[Severity: High]
Does this rollback path properly revert the physical backlight changes?
The physical backlight state is mutated asynchronously before calling
drm_atomic_commit(state). If the commit fails (for example, due to
validation failure), the software DPMS state is rolled back at the out
label:
out:
if (ret != 0)
connector->dpms = old_mode;
However, the physical backlight might remain turned off since the
asynchronous work was already dispatched and cannot be rolled back here.
> + }
> +
> if (!crtc)
> goto out;
> ret = drm_atomic_add_affected_connectors(state, crtc);
[ ... ]
> diff --git a/drivers/gpu/drm/drm_backlight.c b/drivers/gpu/drm/drm_backlight.c
> new file mode 100644
> index 0000000000000..dd02d1878727e
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_backlight.c
[ ... ]
> +static void __drm_backlight_worker(struct work_struct *w)
> +{
> + struct drm_backlight *b = container_of(w, struct drm_backlight, work);
[ ... ]
> + /*
> + * The backend stays valid here: drm_backlight_do_unlink() clears
> + * @backend and drops its reference only after cancel_work_sync(), so an
> + * in-flight worker always sees a live backend.
> + */
> + if (funcs && funcs->set_luminance)
> + WARN_ON(funcs->set_luminance(b, v));
[Severity: Medium]
Could this WARN_ON() be triggered by routine hardware communication failures?
If the backend communicates over I2C or similar buses, transient timeouts
or disconnections might routinely return error codes. Using WARN_ON() could
allow local userspace to spam the kernel log or cause a system panic if
panic_on_warn is enabled.
[ ... ]
> +/* caller must hold @drm_backlight_lock */
> +static void __drm_backlight_readback(struct drm_backlight *b, unsigned int v)
> +{
[ ... ]
> + /*
> + * Reflect a hardware-side brightness change (firmware hotkeys, or a
> + * legacy sysfs write while not inhibited) back into the connector's
> + * committed luminance so a read-back returns the real value.
> + */
> + if (connector->state)
> + connector->state->luminance = min(v, max);
[Severity: High]
Can this in-place modification of connector->state cause a write-after-free?
Since this function is called asynchronously from a sysfs handler holding
only drm_backlight_lock, a concurrent atomic commit could duplicate, commit,
and free the connector->state object, causing this write to corrupt memory.
> +}
[ ... ]
> +static void drm_backlight_do_unlink(struct drm_backlight *b)
> +{
> + struct backlight_device *bd;
> + unsigned int clients;
> +
> + /*
> + * Stop new work first, but leave @backend in place so an in-flight
> + * worker keeps a valid backend to operate on. Capture the linked
> + * backlight_device (if any) while @funcs is still set.
> + */
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + if (!b->funcs)
> + return;
[Severity: Critical]
Does this early return leak a pending or running worker?
If b->funcs is NULL, the function returns immediately without calling
cancel_work_sync(&b->work). This could leave the worker operating on
memory that might be subsequently freed.
> + bd = drm_backlight_bd(b);
> + clients = b->luminance_clients;
> + b->funcs = NULL;
> + list_del_init(&b->list);
> + }
[ ... ]
> +int drm_backlight_link(struct drm_connector *connector,
> + struct backlight_device *bd)
> +{
[ ... ]
> + max = bd->props.max_brightness;
> + if (max && !connector->luminance_property) {
> + ret = drm_backlight_create_property(connector, max, false);
[Severity: Low]
Will the LUMINANCE property bounds remain stale if a new backend is linked?
If a backend is unlinked and a new one is linked with a different
max_brightness range, the property is not recreated because
connector->luminance_property already exists. This might artificially
clamp the new backend to the old backend's maximum brightness.
> + if (ret)
> + return ret;
> + }
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + b->funcs = &drm_backlight_bd_funcs;
> + b->backend = bd;
> + backlight_device_ref(bd);
> + list_add(&b->list, &drm_backlight_list);
> + /*
> + * Inherit the device-wide inhibit level so a connector linked
> + * (or hotplugged) while luminance-aware clients are active also
> + * has its legacy sysfs control inhibited.
> + */
> + b->luminance_clients = connector->dev->mode_config.luminance_clients;
[Severity: Medium]
Is there a race condition here that could double-count luminance_clients?
If a new connector is linked concurrently with drm_backlight_inhibit_legacy_all(),
it might inherit the already-incremented global dev->mode_config.luminance_clients
count here.
> + if (b->luminance_clients)
> + atomic_add(b->luminance_clients, &bd->drm_takeover);
[ ... ]
> +void drm_backlight_inhibit_legacy_all(struct drm_device *dev)
> +{
> + struct drm_connector_list_iter iter;
> + struct drm_connector *connector;
> +
> + scoped_guard(spinlock, &drm_backlight_lock)
> + dev->mode_config.luminance_clients++;
> +
> + drm_connector_list_iter_begin(dev, &iter);
> + drm_for_each_connector_iter(connector, &iter)
> + drm_backlight_inhibit_legacy(connector);
[Severity: Medium]
Since the lock is dropped between incrementing the global luminance_clients
count and iterating the connectors, the iterator could hit the newly linked
connector and increment its count a second time. This double-count would
prevent the legacy sysfs interface from ever being uninhibited.
> + drm_connector_list_iter_end(&iter);
> +}
[ ... ]
> +static int drm_backlight_bd_set_luminance(struct drm_backlight *b,
> + unsigned int value)
> +{
> + struct backlight_device *bd = b->backend;
> + int rc;
> +
> + rc = backlight_set_brightness(bd, value, BACKLIGHT_UPDATE_DRM);
> + if (rc)
> + backlight_set_brightness(bd, U16_MAX, BACKLIGHT_UPDATE_DRM);
[Severity: Low]
Is this fallback brightness assignment guaranteed to fail?
Because backlight_set_brightness() strictly bounds-checks the requested
value against bd->props.max_brightness (which is typically around 255),
passing U16_MAX (65535) will mathematically guarantee an -EINVAL failure,
making this error recovery path ineffective.
> +
> + return rc;
> +}
[ ... ]
> +static int drm_backlight_notify(struct notifier_block *self,
> + unsigned long event, void *data)
> +{
[ ... ]
> + for (;;) {
> + struct drm_backlight *found = NULL;
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + list_for_each_entry(b, &drm_backlight_list, list) {
> + if (drm_backlight_bd(b) == bd) {
> + found = b;
> + break;
> + }
> + }
> + }
> + if (!found)
> + break;
> + drm_backlight_do_unlink(found);
[Severity: Critical]
Is there a risk of the connector being freed concurrently here?
The notifier iterates the list under the lock, finds a match, drops the
lock, and then calls drm_backlight_do_unlink(found). Without holding a
reference to the connector, a concurrent teardown (like a hardware hotplug)
could free the connector memory, resulting in a use-after-free when
drm_backlight_do_unlink accesses found->funcs.
> + }
> + break;
[ ... ]
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 8b4baed060f3a..92ed0c1879d53 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
[ ... ]
> @@ -944,6 +948,8 @@ EXPORT_SYMBOL(drm_connector_dynamic_register);
> void drm_connector_unregister(struct drm_connector *connector)
> {
> mutex_lock(&connector->mutex);
> + drm_backlight_unregister(connector);
> +
> if (connector->registration_state != DRM_CONNECTOR_REGISTERED) {
[Severity: Low]
Does unregistering the backlight here break the sysfs teardown symmetry?
Because this clears the backend link before drm_sysfs_connector_remove_early()
is called, the latter will fail to fetch the backlight device and miss
calling sysfs_remove_link(&connector->kdev->kobj, "backlight").
[ ... ]
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index ef4e923a87284..2f4ce7d040f9d 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
[ ... ]
> void drm_sysfs_connector_remove_early(struct drm_connector *connector)
> {
> + struct backlight_device *bd = drm_backlight_get_device(connector);
> +
> + if (bd) {
> + sysfs_remove_link(&connector->kdev->kobj, "backlight");
[Severity: Low]
Because drm_backlight_unregister() has already been called in
drm_connector_unregister(), drm_backlight_get_device() will return NULL,
leaving this cleanup path unreachable.
> + backlight_device_unref(bd);
> + }
> +
> if (connector->ddc)
> sysfs_remove_link(&connector->kdev->kobj, "ddc");
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=4
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 03/14] drm/property: add a per-connector luminance flag
2026-09-08 4:40 ` [PATCH v8 03/14] drm/property: add a per-connector luminance flag Mario Limonciello
@ 2026-09-08 4:54 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:54 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx, intel-xe, dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Meaningful code and commit message mismatch regarding the removal of a legacy pointer comparison.
--
commit 80b70d62f813789e09813bc2993a201bc254a202
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/property: add a per-connector luminance flag
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.
> 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;
[Severity: Medium]
Does the commit message need to be updated, or was a code removal missed?
The commit message mentions replacing an existing check and keying the
exception off the new flag "instead of a pointer comparison."
However, this patch only adds the new check using the is_luminance flag in
drm_property_change_valid_get(), but it does not remove any existing legacy
pointer comparison from the function.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=3
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE
2026-09-08 4:40 ` [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE Mario Limonciello
@ 2026-09-08 4:55 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:55 UTC (permalink / raw)
To: Mario Limonciello; +Cc: dri-devel, intel-xe, intel-gfx
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] TOCTOU race between `drm_backlight_link()` and device-wide backlight inhibit/uninhibit iterations causes permanent count corruption.
- [High] The LUMINANCE property is unconditionally exposed to all atomic clients, violating the DRM_CLIENT_CAP_LUMINANCE capability contract.
- [Low] Clients cannot cleanly unset DRM_CLIENT_CAP_LUMINANCE if they have previously unset DRM_CLIENT_CAP_ATOMIC.
--
commit 3e9d95a8d4fc1bbb26ab6124a33c012ee7b1f848
Author: Mario Limonciello <mario.limonciello@amd.com>
drm: add DRM_CLIENT_CAP_LUMINANCE
This patch adds a DRIVER_CONNECTOR_LUMINANCE driver feature and a
DRM_CLIENT_CAP_LUMINANCE client capability. When a client sets this
capability, every DRM-connected backlight is marked as taken over, and
legacy sysfs writes return -EBUSY.
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 9039a39c43243..de2c9d9ab5285 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
[ ... ]
> @@ -392,6 +394,28 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
> file_priv->plane_color_pipeline = req->value;
> break;
> }
> + case DRM_CLIENT_CAP_LUMINANCE:
> + if (!drm_core_check_feature(dev, DRIVER_CONNECTOR_LUMINANCE))
> + return -EOPNOTSUPP;
> + if (!file_priv->atomic)
> + return -EINVAL;
[Severity: Low]
Can this prevent clients from cleanly unsetting DRM_CLIENT_CAP_LUMINANCE if
they have previously unset DRM_CLIENT_CAP_ATOMIC?
If a client sets ATOMIC=1, LUMINANCE=1, ATOMIC=0, and then tries to unset
LUMINANCE=0, this unconditional atomic check will cause the last call to
return -EINVAL.
> + if (req->value > 1)
> + return -EINVAL;
> +
> + /*
> + * Serialize the compare-and-act so concurrent ioctls on a shared
> + * fd cannot unbalance the device-wide inhibit count.
> + */
> + mutex_lock(&dev->mode_config.mutex);
> + if (req->value != file_priv->supports_luminance_control) {
> + if (req->value)
> + drm_backlight_inhibit_legacy_all(dev);
[Severity: High]
Does this call introduce a TOCTOU race between drm_backlight_link() and the
device-wide backlight inhibit iteration?
Looking at drm_backlight_inhibit_legacy_all() in
drivers/gpu/drm/drm_backlight.c, it drops drm_backlight_lock before
iterating connectors:
scoped_guard(spinlock, &drm_backlight_lock)
dev->mode_config.luminance_clients++;
drm_connector_list_iter_begin(dev, &iter);
If a concurrent hotplug/probe thread calls drm_backlight_link(), it reads
the already-incremented dev->mode_config.luminance_clients and assigns it to
the new connector's b->luminance_clients.
Then the ioctl thread resumes, iterates the connector list, reaches this
newly linked connector, and calls drm_backlight_inhibit_legacy(), which
increments b->luminance_clients again. This causes the connector's count to
get permanently stuck at a non-zero value, locking out legacy sysfs backlight
control for the rest of the system uptime.
> + else
> + drm_backlight_uninhibit_legacy_all(dev);
> + file_priv->supports_luminance_control = req->value;
[Severity: High]
Is the LUMINANCE property being unconditionally exposed to all atomic clients,
violating the DRM_CLIENT_CAP_LUMINANCE capability contract?
The UAPI behavior documented in include/uapi/drm/drm.h states: "The LUMINANCE
property becomes visible on supported connectors".
However, the capability tracked here (file_priv->supports_luminance_control)
is never utilized by the DRM core (e.g., in drm_mode_object_get_properties)
to filter property visibility. drm_mode_object_get_properties() only checks
if the client is atomic, but fails to check if the property is luminance and
if the client supports it:
if ((prop->flags & DRM_MODE_PROP_ATOMIC) && !atomic)
continue;
As a result, any generic atomic client (like a compositor restoring state)
will see and restore the LUMINANCE property without setting
DRM_CLIENT_CAP_LUMINANCE, bypassing the sysfs inhibition.
> + }
> + mutex_unlock(&dev->mode_config.mutex);
> + break;
> default:
> return -EINVAL;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=5
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector
2026-09-08 4:40 ` [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector Mario Limonciello
@ 2026-09-08 4:57 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:57 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-xe, dri-devel, intel-gfx
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The DRIVER_CONNECTOR_LUMINANCE feature flag is placed unconditionally in the general driver features mask instead of inside the display-specific XE_DISPLAY_DRIVER_FEATURES macro.
--
commit 15b98d1b5f359c6f4e02b8f0bf3cb53a02d509bd
Author: Mario Limonciello <mario.limonciello@amd.com>
Subject: drm/xe: Indicate support for luminance on the connector
This commit enables luminance support on connectors for the xe driver,
allowing eDP panels to report luminance information to userspace.
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index ee732e5495f7d..b74afe1594842 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -397,6 +397,7 @@ static const struct drm_driver regular_driver = {
> XE_DISPLAY_DRIVER_FEATURES |
> DRIVER_GEM |
> DRIVER_RENDER | DRIVER_SYNCOBJ |
> + DRIVER_CONNECTOR_LUMINANCE |
[Severity: Low]
Should DRIVER_CONNECTOR_LUMINANCE be included inside the
XE_DISPLAY_DRIVER_FEATURES macro rather than added unconditionally here?
When the xe driver is compiled without display support (CONFIG_DRM_XE_DISPLAY
is disabled), XE_DISPLAY_DRIVER_FEATURES correctly evaluates to 0, which omits
DRIVER_MODESET and DRIVER_ATOMIC.
Because DRIVER_CONNECTOR_LUMINANCE is placed outside of that macro, it appears
the driver will unconditionally advertise this display capability to userspace
via the DRM_IOCTL_SET_CLIENT_CAP mask, even when the display components are
compiled out.
> DRIVER_SYNCOBJ_TIMELINE,
> .open = xe_file_open,
> .postclose = xe_file_close,
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=12
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 08/14] drm/amd/display: use drm backlight
2026-09-08 4:40 ` [PATCH v8 08/14] drm/amd/display: use drm backlight Mario Limonciello
@ 2026-09-08 4:57 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 4:57 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-xe, intel-gfx, dri-devel
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] Unconditional creation of the DRM LUMINANCE property breaks brightness control on systems relying on ACPI video backlight.
- [High] Lockless access to the global `crtc->state` pointer during brightness-only commits leads to a Use-After-Free (UAF) and race condition.
- [High] TOCTOU race when accessing `dm->dc->current_state` leads to a potential NULL pointer dereference or Use-After-Free.
--
commit 2a535fc7f658113715bee173a4202a46e91b7048
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/amd/display: use drm backlight
This commit converts the AMD display driver to use the DRM backlight
infrastructure, exposing brightness control through the connector LUMINANCE
property.
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 2fe934036e363..f7b1eaf34b59d 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
[ ... ]
> @@ -5050,10 +5050,21 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state)
> old_crtc_state = drm_atomic_get_old_crtc_state(state, &acrtc->base);
> }
>
> + /*
> + * Apply the LUMINANCE property first: a brightness-only commit
> + * does not pull the CRTC into the atomic state (so new_crtc_state
> + * is NULL), and a modeset is skipped below - in both cases the
> + * backlight must still follow the requested luminance.
> + */
> + drm_atomic_helper_connector_apply_luminance(new_con_state);
[Severity: High]
Does this introduce a race condition leading to a use-after-free?
Since the CRTC is intentionally not pulled into the atomic state during a
brightness-only commit, the CRTC lock is not held in this path. However,
drm_atomic_helper_connector_apply_luminance() dereferences the global
conn_state->crtc->state->active property locklessly.
If a concurrent modeset or display disable commit acquires the lock,
swaps the state, and frees the old one, this non-blocking brightness commit
could end up reading freed memory. Is it safe to call this helper without
ensuring the CRTC lock is held?
[ ... ]
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
> index 406a821d03cd6..1fefe3837e4cf 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c
[ ... ]
> @@ -224,13 +225,17 @@ struct dc_stream_state *dm_find_stream_with_link(
> struct amdgpu_display_manager *dm,
> struct dc_link *link)
> {
> - struct dc_state *cur_dc_state = dm->dc->current_state;
> struct dc_stream_state *stream = NULL;
> int i;
>
> + if (!dm || !dm->dc || !dm->dc->current_state || !link)
> + return NULL;
> +
> + cur_dc_state = dm->dc->current_state;
[Severity: High]
Can this result in a double-fetch/TOCTOU race?
This code checks that dm->dc->current_state is not NULL, but then immediately
re-reads the pointer from dm->dc->current_state.
If a concurrent modeset or teardown updates the state between the check and
the assignment, cur_dc_state could be NULL or point to freed memory when it
is subsequently dereferenced in the loop below.
Should this be changed to read the state pointer once into cur_dc_state,
and then perform the NULL check on the local variable?
[ ... ]
> @@ -600,6 +610,13 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
>
> amdgpu_dm_update_connector_ext_caps(aconnector);
>
> + caps = &dm->backlight_caps[bl_idx];
> + amdgpu_dm_backlight_fill_props(caps, power_supply_is_system_supplied() > 0,
> + !(amdgpu_dc_debug_mask &
> + DC_DISABLE_CUSTOM_BRIGHTNESS_CURVE),
> + &props);
> + drm_backlight_create_property(&aconnector->base, props.max_brightness, false);
[Severity: High]
Does unconditionally creating this property break brightness control on
systems relying on ACPI video backlight?
By creating the LUMINANCE property here, we expose it to userspace before
verifying if the native backlight backend will actually be used.
During later registration in amdgpu_dm_register_backlight_device(), if
acpi_video_backlight_use_native() is false, the driver exits early and never
links a backend to this property.
Will modern userspace compositors attempt to use this exposed but
non-functional LUMINANCE property and silently fail to adjust brightness,
ignoring the working ACPI sysfs interface entirely?
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=8
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 14/14] drm/i915/display: use drm backlight
2026-09-08 4:40 ` [PATCH v8 14/14] drm/i915/display: use drm backlight Mario Limonciello
@ 2026-09-08 5:03 ` sashiko-bot
0 siblings, 0 replies; 31+ messages in thread
From: sashiko-bot @ 2026-09-08 5:03 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx, dri-devel, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Unprotected access to `crtc->state` in `drm_atomic_helper_connector_apply_luminance` leading to Use-After-Free.
--
commit 4d692fcf914aa54e6baac83f8855bd80382896c8
Author: Mario Limonciello <mario.limonciello@amd.com>
Subject: drm/i915/display: use drm backlight
Convert the Intel display drivers to the DRM backlight infrastructure so
brightness can be controlled through the connector LUMINANCE property. The
DRM core owns the embedded backlight state and its property.
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 9dfd095f325f7..d53e5f4bdf57d 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
[ ... ]
> @@ -7608,6 +7610,9 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
> /* Now enable the clocks, plane, pipe, and connectors that we set up. */
> display->modeset.funcs->commit_modeset_enables(state);
>
> + for_each_new_connector_in_state(&state->base, connector, new_conn_state, i)
> + drm_atomic_helper_connector_apply_luminance(new_conn_state);
> +
[Severity: High]
Could this lead to a Use-After-Free of the CRTC state?
When userspace updates only the LUMINANCE property, the CRTC is not pulled
into the atomic state, meaning crtc->mutex is never locked and no
serialization dependencies are established.
In intel_atomic_commit_tail(), we call
drm_atomic_helper_connector_apply_luminance() which dereferences the
global CRTC state:
drivers/gpu/drm/drm_atomic_helper.c:drm_atomic_helper_connector_apply_luminance() {
struct drm_connector *connector = conn_state->connector;
if (conn_state->crtc && conn_state->crtc->state &&
conn_state->crtc->state->active)
drm_backlight_set_luminance(connector, conn_state->luminance);
}
Since the LUMINANCE commit executes concurrently with no CRTC
synchronization, another thread performing a modeset or DPMS update could
simultaneously acquire crtc->mutex, call drm_atomic_helper_swap_state(),
and free the old CRTC state while this code evaluates ->active.
Is this safe without acquiring the CRTC lock or pulling the CRTC into the
atomic transaction?
> intel_display_power_dc3co_compute(state);
>
> /* FIXME probably need to sequence this properly */
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260908044035.62093-1-mario.limonciello@amd.com?part=14
^ permalink raw reply [flat|nested] 31+ messages in thread
* ✓ i915.CI.BAT: success for Add support for a DRM backlight capability (rev3)
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (13 preceding siblings ...)
2026-09-08 4:40 ` [PATCH v8 14/14] drm/i915/display: use drm backlight Mario Limonciello
@ 2026-09-08 9:32 ` Patchwork
2026-09-08 18:45 ` ✗ i915.CI.Full: failure " Patchwork
15 siblings, 0 replies; 31+ messages in thread
From: Patchwork @ 2026-09-08 9:32 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 1006 bytes --]
== Series Details ==
Series: Add support for a DRM backlight capability (rev3)
URL : https://patchwork.freedesktop.org/series/169109/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_19102 -> Patchwork_169109v3
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/index.html
Participating hosts (39 -> 37)
------------------------------
Missing (2): bat-dg2-13 bat-adls-6
Changes
-------
No changes found
Build changes
-------------
* Linux: CI_DRM_19102 -> Patchwork_169109v3
CI-20190529: 20190529
CI_DRM_19102: 06602b51786b6c2a0f97e58f0e0f168be1ada27e @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_9085: 9085
Patchwork_169109v3: 06602b51786b6c2a0f97e58f0e0f168be1ada27e @ git://anongit.freedesktop.org/gfx-ci/linux
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/index.html
[-- Attachment #2: Type: text/html, Size: 1571 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 02/14] backlight: add kernel-internal backlight API
2026-09-08 4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
2026-09-08 4:52 ` sashiko-bot
@ 2026-09-08 15:45 ` Jani Nikula
2026-09-08 16:00 ` Mario Limonciello
1 sibling, 1 reply; 31+ messages in thread
From: Jani Nikula @ 2026-09-08 15:45 UTC (permalink / raw)
To: Mario Limonciello, dri-devel, harry.wentland, Simona Vetter,
Alex Deucher, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, David Herrmann, Marta Lofstedt,
Mario Limonciello
On Mon, 07 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
> So far backlights have only been controlled via sysfs. However, sysfs is
> not a proper user-space API for runtime modifications, and never was
> intended to provide such. The DRM drivers are now prepared to provide
> such a backlight link so user-space can control backlight via DRM
> connector properties. This allows us to employ the same access-management
> we use for mode-setting.
>
> This patch adds a few kernel-internal backlight helpers so we can modify
> backlights from within DRM, a brightness-changed notification, and a
> per-device takeover count so that legacy sysfs writes can be inhibited
> (-EBUSY) while a luminance-aware DRM client is in control.
>
> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
>
> V2: Marta Lofstedt <marta.lofstedt@intel.com>
> - rebase
> - minor edit for checkpatch warning
>
> Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
>
> V3: Mario Limonciello (AMD) <superm1@kernel.org>
> - rebase
> - Use guard(mutex)
>
> V4: Mario Limonciello (AMD) <superm1@kernel.org>
> - Adjust return type for backlight_set_brightness() to return errors
> - Stop clamping in backlight_set_brightness()
> - Drop backlight_device_lookup()
>
> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
> ---
> drivers/video/backlight/backlight.c | 66 +++++++++++++++++++++++++++++
> include/linux/backlight.h | 45 ++++++++++++++++++++
> 2 files changed, 111 insertions(+)
>
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 4401f6294ccc8..1c700c1e77c3f 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -126,6 +126,9 @@ static void backlight_generate_event(struct backlight_device *bd,
> case BACKLIGHT_UPDATE_HOTKEY:
> envp[0] = "SOURCE=hotkey";
> break;
> + case BACKLIGHT_UPDATE_DRM:
> + envp[0] = "SOURCE=drm";
> + break;
> default:
> envp[0] = "SOURCE=unknown";
> break;
> @@ -150,6 +153,13 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
> struct backlight_device *bd = to_backlight_device(dev);
> unsigned long power, old_power;
>
> + /* A luminance-aware DRM client has taken over this backlight; the
> + * legacy sysfs interface is disabled until the last such client
> + * goes away.
> + */
> + if (atomic_read(&bd->drm_takeover) > 0)
> + return -EBUSY;
> +
> rc = kstrtoul(buf, 0, &power);
> if (rc)
> return rc;
> @@ -214,6 +224,13 @@ static ssize_t brightness_store(struct device *dev,
> struct backlight_device *bd = to_backlight_device(dev);
> unsigned long brightness;
>
> + /* A luminance-aware DRM client has taken over this backlight; the
> + * legacy sysfs interface is disabled until the last such client
> + * goes away.
> + */
> + if (atomic_read(&bd->drm_takeover) > 0)
> + return -EBUSY;
> +
> rc = kstrtoul(buf, 0, &brightness);
> if (rc)
> return rc;
> @@ -514,6 +531,41 @@ static int devm_backlight_device_match(struct device *dev, void *res,
> return *r == data;
> }
>
> +/**
> + * backlight_set_brightness - set brightness on a backlight device
> + * @bd: backlight device to operate on
> + * @value: brightness value to set on the device
> + * @reason: backlight-change reason to use for notifications
> + *
> + * This is the in-kernel API equivalent of writing into the 'brightness' sysfs
> + * file. It calls into the underlying backlight driver to change the brightness
> + * value.
> + * A uevent notification is sent with the reason set to @reason.
> + * Return: 0 if successfully notified, -EINVAL for invalid values, -ENXIO if the
> + * device has no ops (e.g. it is being unregistered)
> + */
> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
> + enum backlight_update_reason reason)
> +{
> + int rc = -ENXIO;
> +
> + scoped_guard(mutex, &bd->ops_lock) {
> + if (bd->ops) {
> + if (value > bd->props.max_brightness)
> + return -EINVAL;
> +
> + dev_dbg(&bd->dev, "set brightness to %u\n", value);
> + bd->props.brightness = value;
> + rc = backlight_update_status(bd);
> + }
> + }
> + if (rc == 0)
> + backlight_generate_event(bd, reason);
> +
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(backlight_set_brightness);
> +
> /**
> * backlight_register_notifier - get notified of backlight (un)registration
> * @nb: notifier block with the notifier to call on backlight (un)registration
> @@ -548,6 +600,20 @@ int backlight_unregister_notifier(struct notifier_block *nb)
> }
> EXPORT_SYMBOL(backlight_unregister_notifier);
>
> +/**
> + * backlight_notify_brightness - notify brightness change to listeners
> + * @bd: backlight device that changed
> + *
> + * Notify registered listeners that the backlight brightness has changed.
> + * This is called automatically after successful brightness updates.
> + */
> +void backlight_notify_brightness(struct backlight_device *bd)
> +{
> + blocking_notifier_call_chain(&backlight_notifier,
> + BACKLIGHT_BRIGHTNESS_CHANGED, bd);
> +}
> +EXPORT_SYMBOL(backlight_notify_brightness);
> +
> /**
> * devm_backlight_device_register - register a new backlight device
> * @dev: the device to register
> diff --git a/include/linux/backlight.h b/include/linux/backlight.h
> index 015183d129f96..fac1acbc698a1 100644
> --- a/include/linux/backlight.h
> +++ b/include/linux/backlight.h
> @@ -31,6 +31,12 @@ enum backlight_update_reason {
> * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
> */
> BACKLIGHT_UPDATE_SYSFS,
> +
> + /**
> + * @BACKLIGHT_UPDATE_DRM: The backlight was updated from DRM, i.e. through
> + * a connector LUMINANCE property rather than the legacy sysfs interface.
> + */
> + BACKLIGHT_UPDATE_DRM,
> };
>
> /**
> @@ -82,6 +88,11 @@ enum backlight_notification {
> * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
> */
> BACKLIGHT_UNREGISTERED,
> +
> + /**
> + * @BACKLIGHT_BRIGHTNESS_CHANGED: The backlight brightness has changed.
> + */
> + BACKLIGHT_BRIGHTNESS_CHANGED,
> };
>
> /** enum backlight_scale - the type of scale used for brightness values
> @@ -310,8 +321,23 @@ struct backlight_device {
> * @use_count: The number of unblanked displays.
> */
> int use_count;
> +
> + /**
> + * @drm_takeover: Number of luminance-aware DRM clients that have
> + * taken over brightness control of this device. When non-zero,
> + * writes to the legacy sysfs ``brightness`` attribute return
> + * ``-EBUSY``. Managed by the DRM backlight helpers.
> + */
> + atomic_t drm_takeover;
> };
>
> +/* Forward declaration for backlight_update_status */
> +#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
I think IS_REACHABLE() is almost always a mistake. It's a hack to avoid
link errors when something in a module needs something that is
built-in. It's a combo that should be handled at Kconfig level, not at
build level.
BR,
Jani.
> +void backlight_notify_brightness(struct backlight_device *bd);
> +#else
> +static inline void backlight_notify_brightness(struct backlight_device *bd) {}
> +#endif
> +
> /**
> * backlight_update_status - force an update of the backlight device status
> * @bd: the backlight device
> @@ -325,6 +351,10 @@ static inline int backlight_update_status(struct backlight_device *bd)
> ret = bd->ops->update_status(bd);
> mutex_unlock(&bd->update_lock);
>
> + /* Notify DRM and other listeners that brightness changed */
> + if (ret == 0)
> + backlight_notify_brightness(bd);
> +
> return ret;
> }
>
> @@ -431,6 +461,21 @@ static inline void backlight_notify_blank_all(struct device *display_dev,
> { }
> #endif
>
> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
> + enum backlight_update_reason reason);
> +
> +static inline void backlight_device_ref(struct backlight_device *bd)
> +{
> + if (bd)
> + get_device(&bd->dev);
> +}
> +
> +static inline void backlight_device_unref(struct backlight_device *bd)
> +{
> + if (bd)
> + put_device(&bd->dev);
> +}
> +
> #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
>
> /**
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure
2026-09-08 4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
@ 2026-09-08 15:48 ` Jani Nikula
1 sibling, 0 replies; 31+ messages in thread
From: Jani Nikula @ 2026-09-08 15:48 UTC (permalink / raw)
To: Mario Limonciello, dri-devel, harry.wentland, Simona Vetter,
Alex Deucher, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, Mario Limonciello, David Herrmann,
Mario Limonciello
On Mon, 07 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
> Backlight brightness is a property of a display, and thus of a DRM
> connector, yet it has historically only been controllable through the
> separate backlight sysfs interface. Add a generic, backend-agnostic
> per-connector LUMINANCE range property so brightness can be driven
> through the atomic modeset path like any other connector state.
This might be a good opportunity to call it "drm brightness" and hide
the "backlight" implementation detail.
BR,
Jani.
>
> A struct drm_backlight is embedded in every connector and initialized by
> the core; drivers do not allocate it. A driver links a backend (today a
> backlight_device, in the future DDC/CI, MIPI-DCS, ...) with
> drm_backlight_link(), which creates the connector's LUMINANCE property
> with the backend's range. The property value is staged into the atomic
> connector state and only pushed to the hardware from the commit/enable
> path, via a workqueue so that slow backends never stall a commit. DPMS
> off drives the backlight to 0 and DPMS on restores the committed value.
>
> The property range is per-connector (created from the backend's
> max_brightness), so multiple panels no longer share and corrupt a single
> device-wide range. drm_backlight_link() also carries the legacy-sysfs
> takeover accounting used by the client capability added in a later patch.
>
> The whole feature is guarded by CONFIG_DRM_BACKLIGHT (which depends on,
> rather than selects, BACKLIGHT_CLASS_DEVICE) so DRM does not pull the
> backlight subsystem into the kernel when it is not wanted.
>
> Co-developed-by: David Herrmann <dh.herrmann@gmail.com>
> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
> ---
> drivers/gpu/drm/Kconfig | 18 +
> drivers/gpu/drm/Makefile | 2 +
> drivers/gpu/drm/drm_atomic_helper.c | 35 ++
> drivers/gpu/drm/drm_atomic_uapi.c | 49 ++-
> drivers/gpu/drm/drm_backlight.c | 550 ++++++++++++++++++++++++++++
> drivers/gpu/drm/drm_connector.c | 56 +++
> drivers/gpu/drm/drm_drv.c | 8 +
> drivers/gpu/drm/drm_mode_config.c | 1 +
> drivers/gpu/drm/drm_sysfs.c | 32 +-
> include/drm/drm_atomic_helper.h | 2 +
> include/drm/drm_backlight.h | 166 +++++++++
> include/drm/drm_connector.h | 20 +
> include/drm/drm_mode_config.h | 11 +
> 13 files changed, 945 insertions(+), 5 deletions(-)
> create mode 100644 drivers/gpu/drm/drm_backlight.c
> create mode 100644 include/drm/drm_backlight.h
>
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index 323422861e8f6..ddb6827d613f8 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -33,6 +33,24 @@ endmenu
>
> if DRM
>
> +config DRM_BACKLIGHT
> + bool "DRM connector backlight (luminance) support"
> + depends on DRM
> + depends on BACKLIGHT_CLASS_DEVICE
> + default DRM
> + help
> + Expose per-connector backlight brightness control through the DRM
> + connector LUMINANCE property, backed by the backlight subsystem (and,
> + in the future, other backends such as DDC/CI). This lets luminance
> + changes go through the same atomic modeset path as the rest of the
> + display state.
> +
> + This depends on BACKLIGHT_CLASS_DEVICE. When that is disabled, DRM is
> + built without this support and does not pull the backlight subsystem
> + into the kernel.
> +
> + If in doubt, say Y.
> +
> config DRM_MIPI_DBI
> tristate
> depends on DRM
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index e635fcffd3790..bcb06dbb71343 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -78,6 +78,8 @@ drm-$(CONFIG_DRM_CLIENT) += \
> drm_client_event.o \
> drm_client_modeset.o \
> drm_client_sysrq.o
> +drm-$(CONFIG_DRM_BACKLIGHT) += drm_backlight.o
> +drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
> drm-$(CONFIG_COMPAT) += drm_ioc32.o
> drm-$(CONFIG_DRM_PANEL) += drm_panel.o
> drm-$(CONFIG_OF) += drm_of.o
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index 285aac3554dfd..110cd81e5d6db 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -33,6 +33,7 @@
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_atomic_uapi.h>
> +#include <drm/drm_backlight.h>
> #include <drm/drm_blend.h>
> #include <drm/drm_bridge.h>
> #include <drm/drm_colorop.h>
> @@ -1230,6 +1231,10 @@ drm_atomic_helper_commit_encoder_bridge_disable(struct drm_device *dev,
> * it away), so we won't call disable hooks twice.
> */
> bridge = drm_bridge_chain_get_first_bridge(encoder);
> +
> + /* Turn the backlight off before disabling the pipeline. */
> + drm_backlight_set_luminance(connector, 0);
> +
> drm_atomic_bridge_chain_disable(bridge, state);
> drm_bridge_put(bridge);
>
> @@ -1775,6 +1780,24 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
> }
> EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
>
> +/**
> + * drm_atomic_helper_connector_apply_luminance - apply connector luminance from atomic state
> + * @conn_state: atomic connector state to apply luminance for
> + *
> + * Updates the backlight luminance from the atomic connector state. If the
> + * connector has a linked backlight and is associated with an active CRTC,
> + * push the luminance value to hardware.
> + */
> +void drm_atomic_helper_connector_apply_luminance(const struct drm_connector_state *conn_state)
> +{
> + struct drm_connector *connector = conn_state->connector;
> +
> + if (conn_state->crtc && conn_state->crtc->state &&
> + conn_state->crtc->state->active)
> + drm_backlight_set_luminance(connector, conn_state->luminance);
> +}
> +EXPORT_SYMBOL(drm_atomic_helper_connector_apply_luminance);
> +
> /*
> * For atomic updates which touch just a single CRTC, calculate the time of the
> * next vblank, and inform all the fences of the deadline.
> @@ -1989,6 +2012,9 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
> void drm_atomic_helper_commit_tail(struct drm_atomic_commit *state)
> {
> struct drm_device *dev = state->dev;
> + struct drm_connector *connector;
> + struct drm_connector_state *new_conn_state;
> + int i;
>
> drm_atomic_helper_commit_modeset_disables(dev, state);
>
> @@ -1996,6 +2022,9 @@ void drm_atomic_helper_commit_tail(struct drm_atomic_commit *state)
>
> drm_atomic_helper_commit_modeset_enables(dev, state);
>
> + for_each_new_connector_in_state(state, connector, new_conn_state, i)
> + drm_atomic_helper_connector_apply_luminance(new_conn_state);
> +
> drm_atomic_helper_fake_vblank(state);
>
> drm_atomic_helper_commit_hw_done(state);
> @@ -2019,11 +2048,17 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
> void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_commit *state)
> {
> struct drm_device *dev = state->dev;
> + struct drm_connector *connector;
> + struct drm_connector_state *new_conn_state;
> + int i;
>
> drm_atomic_helper_commit_modeset_disables(dev, state);
>
> drm_atomic_helper_commit_modeset_enables(dev, state);
>
> + for_each_new_connector_in_state(state, connector, new_conn_state, i)
> + drm_atomic_helper_connector_apply_luminance(new_conn_state);
> +
> drm_atomic_helper_commit_planes(dev, state,
> DRM_PLANE_COMMIT_ACTIVE_ONLY);
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 5ea593b3a98ec..07d4bcb16cd23 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -30,6 +30,8 @@
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_atomic_uapi.h>
> +#include <drm/drm_backlight.h>
> +#include <drm/drm_connector.h>
> #include <drm/drm_framebuffer.h>
> #include <drm/drm_print.h>
> #include <drm/drm_drv.h>
> @@ -962,6 +964,13 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
> state->hdmi.broadcast_rgb = val;
> } else if (property == connector->color_format_property) {
> state->color_format = val;
> + } else if (property == connector->luminance_property) {
> + /*
> + * Only stage the value into the atomic state; the hardware is
> + * updated from the commit path (see
> + * drm_atomic_helper_connector_apply_luminance()).
> + */
> + state->luminance = val;
> } else if (connector->funcs->atomic_set_property) {
> return connector->funcs->atomic_set_property(connector,
> state, property, val);
> @@ -1049,6 +1058,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
> *val = state->hdmi.broadcast_rgb;
> } else if (property == connector->color_format_property) {
> *val = state->color_format;
> + } else if (property == connector->luminance_property) {
> + *val = state->luminance;
> } else if (connector->funcs->atomic_get_property) {
> return connector->funcs->atomic_get_property(connector,
> state, property, val);
> @@ -1133,6 +1144,22 @@ static struct drm_pending_vblank_event *create_vblank_event(
> return e;
> }
>
> +static void drm_atomic_crtc_set_backlight(struct drm_crtc *crtc, bool active)
> +{
> + struct drm_connector_list_iter conn_iter;
> + struct drm_connector *connector;
> +
> + drm_connector_list_iter_begin(crtc->dev, &conn_iter);
> + drm_for_each_connector_iter(connector, &conn_iter) {
> + if (!connector->state || connector->state->crtc != crtc)
> + continue;
> +
> + drm_backlight_set_luminance(connector,
> + active ? connector->state->luminance : 0);
> + }
> + drm_connector_list_iter_end(&conn_iter);
> +}
> +
> int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
> struct drm_connector *connector,
> int mode)
> @@ -1155,9 +1182,29 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_commit *state,
> if (connector->dpms == mode)
> goto out;
>
> + crtc = connector->state ? connector->state->crtc : NULL;
> +
> + /* Handle backlight brightness coordination with DPMS state changes */
> + if (old_mode != DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_OFF) {
> + /* DPMS ON -> OFF: dim all connectors driven by this CRTC. */
> + if (crtc)
> + drm_atomic_crtc_set_backlight(crtc, false);
> + else
> + drm_backlight_set_luminance(connector, 0);
> + }
> +
> connector->dpms = mode;
>
> - crtc = connector->state->crtc;
> + /* DPMS OFF -> ON: restore brightness to property value */
> + if (old_mode == DRM_MODE_DPMS_OFF && mode == DRM_MODE_DPMS_ON &&
> + connector->state) {
> + if (crtc)
> + drm_atomic_crtc_set_backlight(crtc, true);
> + else
> + drm_backlight_set_luminance(connector,
> + connector->state->luminance);
> + }
> +
> if (!crtc)
> goto out;
> ret = drm_atomic_add_affected_connectors(state, crtc);
> diff --git a/drivers/gpu/drm/drm_backlight.c b/drivers/gpu/drm/drm_backlight.c
> new file mode 100644
> index 0000000000000..dd02d1878727e
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_backlight.c
> @@ -0,0 +1,550 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * DRM Backlight Helpers
> + * Copyright (c) 2014 David Herrmann
> + * Copyright (c) 2026 Advanced Micro Devices, Inc.
> + */
> +
> +#include <linux/backlight.h>
> +#include <linux/list.h>
> +#include <linux/notifier.h>
> +#include <linux/spinlock.h>
> +#include <linux/workqueue.h>
> +
> +#include <drm/drm_backlight.h>
> +#include <drm/drm_connector.h>
> +#include <drm/drm_device.h>
> +#include <drm/drm_property.h>
> +
> +/**
> + * DOC: Backlight Devices
> + *
> + * Backlight devices have always been managed as a separate subsystem,
> + * independent of DRM. They are usually controlled via separate hardware
> + * interfaces than the display controller, so the split works out fine.
> + * However, backlight brightness is a property of a display, and thus a
> + * property of a DRM connector. We already manage DPMS states via connector
> + * properties, so it is natural to keep brightness control at the same place.
> + *
> + * This DRM backlight interface implements a generic per-connector LUMINANCE
> + * property. The core is backend-agnostic: it does not talk to any hardware
> + * itself, it only forwards luminance requests to a backend that a driver has
> + * linked. The backend is described by a &struct drm_backlight_funcs. Today the
> + * only backend is the backlight subsystem (&struct backlight_device), linked
> + * with drm_backlight_link(), but other backends (DDC/CI, MIPI-DCS, ...) can be
> + * added by providing a different set of operations without changing the core.
> + *
> + * A &struct drm_backlight is embedded in every &struct drm_connector and
> + * initialized by the DRM core (drm_backlight_connector_init()); drivers do not
> + * allocate it. Drivers link a backend once it is available by calling
> + * drm_backlight_link(); this creates the connector's LUMINANCE property with
> + * the backend's range. Passing NULL unlinks the backend. Hardware is only ever
> + * touched from a workqueue, so slow backends never stall an atomic commit.
> + */
> +
> +static LIST_HEAD(drm_backlight_list);
> +static DEFINE_SPINLOCK(drm_backlight_lock);
> +
> +/* caller must hold @drm_backlight_lock */
> +static bool __drm_backlight_is_linked(struct drm_backlight *b)
> +{
> + lockdep_assert_held(&drm_backlight_lock);
> + /* a backlight is live while it is on @drm_backlight_list */
> + return !list_empty(&b->list);
> +}
> +
> +/*
> + * Return the linked &backlight_device if the current backend is the backlight
> + * subsystem, or NULL otherwise. The legacy-sysfs takeover accounting only
> + * applies to that backend.
> + */
> +static const struct drm_backlight_funcs drm_backlight_bd_funcs;
> +
> +static struct backlight_device *drm_backlight_bd(struct drm_backlight *b)
> +{
> + if (b->funcs != &drm_backlight_bd_funcs)
> + return NULL;
> + return b->backend;
> +}
> +
> +/* caller must hold @drm_backlight_lock */
> +static void __drm_backlight_schedule(struct drm_backlight *b)
> +{
> + lockdep_assert_held(&drm_backlight_lock);
> + if (__drm_backlight_is_linked(b))
> + schedule_work(&b->work);
> +}
> +
> +static void __drm_backlight_worker(struct work_struct *w)
> +{
> + struct drm_backlight *b = container_of(w, struct drm_backlight, work);
> + static char *ep[] = { "BACKLIGHT=1", NULL };
> + const struct drm_backlight_funcs *funcs;
> + bool send_uevent;
> + unsigned int v;
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + send_uevent = b->changed;
> + b->changed = false;
> + v = b->set_value;
> + funcs = b->funcs;
> + }
> +
> + /*
> + * The backend stays valid here: drm_backlight_do_unlink() clears
> + * @backend and drops its reference only after cancel_work_sync(), so an
> + * in-flight worker always sees a live backend.
> + */
> + if (funcs && funcs->set_luminance)
> + WARN_ON(funcs->set_luminance(b, v));
> +
> + if (send_uevent && b->connector->kdev)
> + kobject_uevent_env(&b->connector->kdev->kobj, KOBJ_CHANGE, ep);
> +}
> +
> +/* caller must hold @drm_backlight_lock */
> +static void __drm_backlight_set(struct drm_backlight *b, unsigned int v)
> +{
> + unsigned int max = 0;
> + bool can_disable = false;
> +
> + lockdep_assert_held(&drm_backlight_lock);
> +
> + if (!b->funcs || !b->funcs->get_range)
> + return;
> +
> + b->funcs->get_range(b, &max, &can_disable);
> + if (!max)
> + return;
> +
> + /* clamp to the backend maximum */
> + b->set_value = min(v, max);
> + __drm_backlight_schedule(b);
> +}
> +
> +/* caller must hold @drm_backlight_lock */
> +static void __drm_backlight_readback(struct drm_backlight *b, unsigned int v)
> +{
> + struct drm_connector *connector = b->connector;
> + unsigned int max = 0;
> + bool can_disable = false;
> +
> + lockdep_assert_held(&drm_backlight_lock);
> +
> + if (!b->funcs || !b->funcs->get_range)
> + return;
> +
> + b->funcs->get_range(b, &max, &can_disable);
> + if (!max)
> + return;
> +
> + /*
> + * Reflect a hardware-side brightness change (firmware hotkeys, or a
> + * legacy sysfs write while not inhibited) back into the connector's
> + * committed luminance so a read-back returns the real value.
> + */
> + if (connector->state)
> + connector->state->luminance = min(v, max);
> +}
> +
> +/**
> + * drm_backlight_create_property - create and attach a connector's LUMINANCE property
> + * @connector: connector to modify
> + * @max: maximum luminance value
> + * @can_disable: true if luminance 0 disables the backlight
> + *
> + * Create and attach the per-connector LUMINANCE property. Must be called during
> + * connector initialization before the DRM device is registered.
> + *
> + * Returns: 0 on success, or a negative error code.
> + */
> +int drm_backlight_create_property(struct drm_connector *connector,
> + unsigned int max, bool can_disable)
> +{
> + struct drm_device *dev = connector->dev;
> + struct drm_property *prop;
> + unsigned int min = can_disable ? 0 : 1;
> +
> + if (!dev || !connector->base.properties || connector->luminance_property)
> + return 0;
> +
> + prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
> + "LUMINANCE", min, max);
> + if (!prop)
> + return -ENOMEM;
> +
> + prop->is_luminance = true;
> + connector->luminance_property = prop;
> + drm_object_attach_property(&connector->base, prop, min);
> + if (connector->state)
> + connector->state->luminance = min;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(drm_backlight_create_property);
> +
> +static void drm_backlight_do_unlink(struct drm_backlight *b)
> +{
> + struct backlight_device *bd;
> + unsigned int clients;
> +
> + /*
> + * Stop new work first, but leave @backend in place so an in-flight
> + * worker keeps a valid backend to operate on. Capture the linked
> + * backlight_device (if any) while @funcs is still set.
> + */
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + if (!b->funcs)
> + return;
> + bd = drm_backlight_bd(b);
> + clients = b->luminance_clients;
> + b->funcs = NULL;
> + list_del_init(&b->list);
> + }
> +
> + cancel_work_sync(&b->work);
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + if (clients && bd)
> + atomic_sub(clients, &bd->drm_takeover);
> + /*
> + * Only clear @backend if no concurrent drm_backlight_link()
> + * re-linked a new backend after we dropped the lock for
> + * cancel_work_sync(); otherwise we would clobber it.
> + */
> + if (!b->funcs)
> + b->backend = NULL;
> + }
> +
> + backlight_device_unref(bd);
> +}
> +
> +/**
> + * drm_backlight_connector_init - initialize a connector's embedded backlight
> + * @connector: connector to initialize
> + *
> + * Called by the DRM core from drm_connector_init(). Drivers never call this.
> + */
> +void drm_backlight_connector_init(struct drm_connector *connector)
> +{
> + struct drm_backlight *b = &connector->backlight;
> +
> + b->connector = connector;
> + INIT_LIST_HEAD(&b->list);
> + INIT_WORK(&b->work, __drm_backlight_worker);
> +}
> +
> +/**
> + * drm_backlight_connector_cleanup - tear down a connector's embedded backlight
> + * @connector: connector being cleaned up
> + *
> + * Called by the DRM core from drm_connector_cleanup(). Any still-linked backend
> + * is unlinked here as a safety net for connectors that are torn down on a probe
> + * error path before drm_connector_unregister() ever runs, so no stale entry is
> + * left on the global list. The LUMINANCE property itself is freed by
> + * drm_mode_config_cleanup().
> + */
> +void drm_backlight_connector_cleanup(struct drm_connector *connector)
> +{
> + drm_backlight_do_unlink(&connector->backlight);
> +}
> +
> +/**
> + * drm_backlight_unregister - unlink a connector's backlight on unregister
> + * @connector: connector being unregistered
> + *
> + * Called by the DRM core from drm_connector_unregister() as a safety net in
> + * case a driver did not unlink its backend itself.
> + */
> +void drm_backlight_unregister(struct drm_connector *connector)
> +{
> + drm_backlight_do_unlink(&connector->backlight);
> +}
> +
> +/**
> + * drm_backlight_link - link a backlight device to a connector
> + * @connector: connector to modify
> + * @bd: backlight device to link, or NULL to unlink
> + *
> + * Establish the link between a connector's LUMINANCE property and a registered
> + * backlight_device. On the first link the connector's LUMINANCE property is
> + * created with the backend's range. Passing NULL unlinks any linked device.
> + *
> + * User-space cannot create or modify this link.
> + *
> + * Returns: 0 on success, or a negative error code if the property could not be
> + * created (in which case no backend is linked).
> + */
> +int drm_backlight_link(struct drm_connector *connector,
> + struct backlight_device *bd)
> +{
> + struct drm_backlight *b = &connector->backlight;
> + unsigned int max;
> + int ret;
> +
> + if (!bd) {
> + drm_backlight_do_unlink(b);
> + return 0;
> + }
> +
> + /* Retarget: drop any previously linked backend first. */
> + if (b->funcs)
> + drm_backlight_do_unlink(b);
> +
> + max = bd->props.max_brightness;
> + if (max && !connector->luminance_property) {
> + ret = drm_backlight_create_property(connector, max, false);
> + if (ret)
> + return ret;
> + }
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + b->funcs = &drm_backlight_bd_funcs;
> + b->backend = bd;
> + backlight_device_ref(bd);
> + list_add(&b->list, &drm_backlight_list);
> + /*
> + * Inherit the device-wide inhibit level so a connector linked
> + * (or hotplugged) while luminance-aware clients are active also
> + * has its legacy sysfs control inhibited.
> + */
> + b->luminance_clients = connector->dev->mode_config.luminance_clients;
> + if (b->luminance_clients)
> + atomic_add(b->luminance_clients, &bd->drm_takeover);
> + __drm_backlight_readback(b, bd->props.brightness);
> + b->changed = true;
> + __drm_backlight_set(b, bd->props.brightness);
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(drm_backlight_link);
> +
> +/**
> + * drm_backlight_get_device - get the backlight_device linked to a connector
> + * @connector: connector to query
> + *
> + * Returns the &backlight_device linked to @connector with an additional
> + * reference taken, or NULL if no backlight subsystem device is linked. The
> + * caller must drop the reference with backlight_device_unref() when done.
> + */
> +struct backlight_device *drm_backlight_get_device(struct drm_connector *connector)
> +{
> + struct backlight_device *bd;
> +
> + guard(spinlock)(&drm_backlight_lock);
> + bd = drm_backlight_bd(&connector->backlight);
> + backlight_device_ref(bd);
> +
> + return bd;
> +}
> +EXPORT_SYMBOL(drm_backlight_get_device);
> +
> +/**
> + * drm_backlight_inhibit_legacy - disable legacy sysfs control of the backend
> + * @connector: connector whose backlight should be inhibited
> + *
> + * Record that one more luminance-aware DRM client has taken over this
> + * connector's backlight. While any clients are recorded, writes to the linked
> + * backlight_device's legacy ``brightness`` sysfs attribute return ``-EBUSY``.
> + * The takeover follows the linked device if the link changes.
> + *
> + * Calls must be balanced with drm_backlight_uninhibit_legacy().
> + */
> +void drm_backlight_inhibit_legacy(struct drm_connector *connector)
> +{
> + struct drm_backlight *b = &connector->backlight;
> + struct backlight_device *bd;
> +
> + guard(spinlock)(&drm_backlight_lock);
> + b->luminance_clients++;
> + bd = drm_backlight_bd(b);
> + if (bd)
> + atomic_inc(&bd->drm_takeover);
> +}
> +EXPORT_SYMBOL(drm_backlight_inhibit_legacy);
> +
> +/**
> + * drm_backlight_uninhibit_legacy - re-enable legacy sysfs control
> + * @connector: connector to uninhibit
> + *
> + * Balances a previous drm_backlight_inhibit_legacy() call.
> + */
> +void drm_backlight_uninhibit_legacy(struct drm_connector *connector)
> +{
> + struct drm_backlight *b = &connector->backlight;
> + struct backlight_device *bd;
> +
> + guard(spinlock)(&drm_backlight_lock);
> + if (WARN_ON(b->luminance_clients == 0))
> + return;
> + b->luminance_clients--;
> + bd = drm_backlight_bd(b);
> + if (bd)
> + atomic_dec(&bd->drm_takeover);
> +}
> +EXPORT_SYMBOL(drm_backlight_uninhibit_legacy);
> +
> +/**
> + * drm_backlight_inhibit_legacy_all - inhibit legacy sysfs on every connector
> + * @dev: DRM device whose connectors should be inhibited
> + *
> + * Used when a client declares it is luminance-aware via
> + * DRM_CLIENT_CAP_LUMINANCE. The device-wide count is bumped so connectors
> + * hotplugged later inherit the inhibit in drm_backlight_link().
> + */
> +void drm_backlight_inhibit_legacy_all(struct drm_device *dev)
> +{
> + struct drm_connector_list_iter iter;
> + struct drm_connector *connector;
> +
> + scoped_guard(spinlock, &drm_backlight_lock)
> + dev->mode_config.luminance_clients++;
> +
> + drm_connector_list_iter_begin(dev, &iter);
> + drm_for_each_connector_iter(connector, &iter)
> + drm_backlight_inhibit_legacy(connector);
> + drm_connector_list_iter_end(&iter);
> +}
> +EXPORT_SYMBOL(drm_backlight_inhibit_legacy_all);
> +
> +/**
> + * drm_backlight_uninhibit_legacy_all - reverse drm_backlight_inhibit_legacy_all()
> + * @dev: DRM device whose connectors should be uninhibited
> + */
> +void drm_backlight_uninhibit_legacy_all(struct drm_device *dev)
> +{
> + struct drm_connector_list_iter iter;
> + struct drm_connector *connector;
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + if (WARN_ON(dev->mode_config.luminance_clients == 0))
> + return;
> + dev->mode_config.luminance_clients--;
> + }
> +
> + drm_connector_list_iter_begin(dev, &iter);
> + drm_for_each_connector_iter(connector, &iter)
> + drm_backlight_uninhibit_legacy(connector);
> + drm_connector_list_iter_end(&iter);
> +}
> +EXPORT_SYMBOL(drm_backlight_uninhibit_legacy_all);
> +
> +/**
> + * drm_backlight_set_luminance - request a luminance change on a connector
> + * @connector: connector to update
> + * @value: luminance value to apply
> + *
> + * Clamp @value to the backend range and schedule the hardware update. Safe to
> + * call from an atomic commit tail: the actual hardware access happens later
> + * from a workqueue.
> + */
> +void drm_backlight_set_luminance(struct drm_connector *connector,
> + unsigned int value)
> +{
> + guard(spinlock)(&drm_backlight_lock);
> + __drm_backlight_set(&connector->backlight, value);
> +}
> +EXPORT_SYMBOL(drm_backlight_set_luminance);
> +
> +/* backlight_device backend ------------------------------------------------- */
> +
> +static int drm_backlight_bd_set_luminance(struct drm_backlight *b,
> + unsigned int value)
> +{
> + struct backlight_device *bd = b->backend;
> + int rc;
> +
> + rc = backlight_set_brightness(bd, value, BACKLIGHT_UPDATE_DRM);
> + if (rc)
> + backlight_set_brightness(bd, U16_MAX, BACKLIGHT_UPDATE_DRM);
> +
> + return rc;
> +}
> +
> +static int drm_backlight_bd_get_luminance(struct drm_backlight *b,
> + unsigned int *value)
> +{
> + struct backlight_device *bd = b->backend;
> +
> + if (!bd)
> + return -ENODEV;
> + *value = bd->props.brightness;
> +
> + return 0;
> +}
> +
> +static void drm_backlight_bd_get_range(struct drm_backlight *b,
> + unsigned int *max, bool *can_disable)
> +{
> + struct backlight_device *bd = b->backend;
> +
> + *max = bd ? bd->props.max_brightness : 0;
> + /*
> + * A generic backlight_device gives no guarantee that a value of 0 turns
> + * the panel fully off, so keep 0 reserved for the DPMS-off sentinel and
> + * expose a 1..max range.
> + */
> + *can_disable = false;
> +}
> +
> +static const struct drm_backlight_funcs drm_backlight_bd_funcs = {
> + .set_luminance = drm_backlight_bd_set_luminance,
> + .get_luminance = drm_backlight_bd_get_luminance,
> + .get_range = drm_backlight_bd_get_range,
> +};
> +
> +static int drm_backlight_notify(struct notifier_block *self,
> + unsigned long event, void *data)
> +{
> + struct backlight_device *bd = data;
> + struct drm_backlight *b;
> +
> + switch (event) {
> + case BACKLIGHT_UNREGISTERED:
> + /*
> + * Unlink every connector using @bd. drm_backlight_do_unlink()
> + * sleeps (cancel_work_sync()), so it cannot run under the list
> + * spinlock; re-scan for the next match after each unlink.
> + */
> + for (;;) {
> + struct drm_backlight *found = NULL;
> +
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + list_for_each_entry(b, &drm_backlight_list, list) {
> + if (drm_backlight_bd(b) == bd) {
> + found = b;
> + break;
> + }
> + }
> + }
> + if (!found)
> + break;
> + drm_backlight_do_unlink(found);
> + }
> + break;
> + case BACKLIGHT_BRIGHTNESS_CHANGED:
> + scoped_guard(spinlock, &drm_backlight_lock) {
> + list_for_each_entry(b, &drm_backlight_list, list)
> + if (drm_backlight_bd(b) == bd)
> + __drm_backlight_readback(b, bd->props.brightness);
> + }
> + break;
> + }
> +
> + return 0;
> +}
> +
> +static struct notifier_block drm_backlight_notifier = {
> + .notifier_call = drm_backlight_notify,
> +};
> +
> +int drm_backlight_init(void)
> +{
> + return backlight_register_notifier(&drm_backlight_notifier);
> +}
> +
> +void drm_backlight_exit(void)
> +{
> + backlight_unregister_notifier(&drm_backlight_notifier);
> +}
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 8b4baed060f3a..92ed0c1879d53 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -21,6 +21,7 @@
> */
>
> #include <drm/drm_auth.h>
> +#include <drm/drm_backlight.h>
> #include <drm/drm_connector.h>
> #include <drm/drm_drv.h>
> #include <drm/drm_edid.h>
> @@ -316,6 +317,8 @@ static int drm_connector_init_only(struct drm_device *dev,
> drm_object_attach_property(&connector->base, config->prop_crtc_id, 0);
> }
>
> + drm_backlight_connector_init(connector);
> +
> connector->debugfs_entry = NULL;
> out_put_type_id:
> if (ret)
> @@ -773,6 +776,7 @@ void drm_connector_cleanup(struct drm_connector *connector)
> struct drm_device *dev = connector->dev;
> struct drm_display_mode *mode, *t;
>
> + drm_backlight_connector_cleanup(connector);
> /* The connector should have been removed from userspace long before
> * it is finally destroyed.
> */
> @@ -944,6 +948,8 @@ EXPORT_SYMBOL(drm_connector_dynamic_register);
> void drm_connector_unregister(struct drm_connector *connector)
> {
> mutex_lock(&connector->mutex);
> + drm_backlight_unregister(connector);
> +
> if (connector->registration_state != DRM_CONNECTOR_REGISTERED) {
> mutex_unlock(&connector->mutex);
> return;
> @@ -1532,6 +1538,56 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
> * Summarizing: Only set "DPMS" when the connector is known to be enabled,
> * assume that a successful SETCONFIG call also sets "DPMS" to on, and
> * never read back the value of "DPMS" because it can be incorrect.
> + * LUMINANCE:
> + * Atomic, per-connector range property for controlling the backlight
> + * brightness level of the connector's display. It provides unified access
> + * to the display backlight through the atomic modeset path, replacing the
> + * legacy sysfs interface for brightness control.
> + *
> + * The property value is an unsigned integer. Its valid range is baked in
> + * when a backlight backend is linked to the connector and reflects the
> + * backend's capabilities:
> + *
> + * - Range 1-N: Normal operation for a backend that cannot guarantee a full
> + * off state. 1 is the minimum *visible* brightness and N is the backend
> + * maximum. Drivers are expected never to program a duty cycle of 0 for a
> + * value of 1.
> + * - Range 0-N: Used when the backend can also fully turn the panel off, so
> + * 0 is a normal in-range value.
> + *
> + * Value 0 is always accepted, even when the advertised range starts at 1:
> + * it is the sentinel used to turn the backlight off when the connector is
> + * powered down (DPMS off). Turning the backlight off this way may power the
> + * panel down entirely; unlike programming a legacy sysfs duty cycle of 0,
> + * this can stop vblank/pageflip events until the connector is enabled
> + * again, so luminance-aware clients must not rely on such events while the
> + * connector is off.
> + *
> + * Connectors without a linked backend do not expose this property at all.
> + *
> + * For atomic drivers the value is stored in &drm_connector_state.luminance
> + * and applied to the hardware from the atomic commit path once the
> + * connector is enabled. When DPMS transitions to OFF the backlight is set
> + * to 0; when it transitions back to ON the committed luminance is restored.
> + * Reading the property returns the last committed value (or the hardware's
> + * current state for backends that support reading brightness back).
> + *
> + * The property is created by the DRM core when a driver links a backlight
> + * backend with drm_backlight_link(); drivers do not create it directly.
> + *
> + * Client Capability:
> + * User-space must set the DRM_CLIENT_CAP_LUMINANCE client capability
> + * to 1 before using this property. When this capability is enabled,
> + * the legacy sysfs backlight interface is inhibited to prevent
> + * conflicts between multiple clients trying to control the same
> + * backlight. This ensures that only luminance-aware clients control
> + * the backlight through the DRM atomic interface.
> + *
> + * Legacy clients that do not set this capability should continue
> + * using the sysfs interface (if available).
> + *
> + * Note: This property can be set through the MODE_ATOMIC ioctl as part of
> + * the atomic state.
> * panel_type:
> * Immutable enum property to indicate the type of connected panel.
> * Possible values are "unknown" (default), "OLED", and "LCD".
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index c808958a2188e..c8aa6834c1f4e 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -42,6 +42,7 @@
> #include <linux/xarray.h>
>
> #include <drm/drm_accel.h>
> +#include <drm/drm_backlight.h>
> #include <drm/drm_bridge.h>
> #include <drm/drm_cache.h>
> #include <drm/drm_client_event.h>
> @@ -1250,6 +1251,7 @@ static void drm_core_exit(void)
> drm_privacy_screen_lookup_exit();
> drm_panic_exit();
> accel_core_exit();
> + drm_backlight_exit();
> unregister_chrdev(DRM_MAJOR, "drm");
> drm_debugfs_remove_root();
> drm_sysfs_destroy();
> @@ -1273,6 +1275,12 @@ static int __init drm_core_init(void)
> drm_debugfs_init_root();
> drm_debugfs_bridge_params();
>
> + ret = drm_backlight_init();
> + if (ret < 0) {
> + DRM_ERROR("Cannot initialize backlight interface\n");
> + goto error;
> + }
> +
> ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
> if (ret < 0)
> goto error;
> diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
> index 366f6d8212425..36579e8a7c0e5 100644
> --- a/drivers/gpu/drm/drm_mode_config.c
> +++ b/drivers/gpu/drm/drm_mode_config.c
> @@ -33,6 +33,7 @@
> #include <drm/drm_print.h>
> #include <drm/drm_colorop.h>
> #include <linux/dma-resv.h>
> +#include <drm/drm_backlight.h>
>
> #include "drm_crtc_internal.h"
> #include "drm_internal.h"
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index ef4e923a87284..2f4ce7d040f9d 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
> @@ -11,6 +11,7 @@
> */
>
> #include <linux/acpi.h>
> +#include <linux/backlight.h>
> #include <linux/component.h>
> #include <linux/device.h>
> #include <linux/err.h>
> @@ -27,6 +28,7 @@
> #include <drm/drm_device.h>
> #include <drm/drm_file.h>
> #include <drm/drm_modes.h>
> +#include <drm/drm_backlight.h>
> #include <drm/drm_print.h>
> #include <drm/drm_property.h>
> #include <drm/drm_sysfs.h>
> @@ -391,15 +393,37 @@ int drm_sysfs_connector_add(struct drm_connector *connector)
>
> int drm_sysfs_connector_add_late(struct drm_connector *connector)
> {
> - if (connector->ddc)
> - return sysfs_create_link(&connector->kdev->kobj,
> - &connector->ddc->dev.kobj, "ddc");
> + struct backlight_device *bd = drm_backlight_get_device(connector);
> + int ret = 0;
> +
> + if (connector->ddc) {
> + ret = sysfs_create_link(&connector->kdev->kobj,
> + &connector->ddc->dev.kobj, "ddc");
> + if (ret)
> + goto out;
> + }
>
> - return 0;
> + if (bd) {
> + ret = sysfs_create_link(&connector->kdev->kobj,
> + &bd->dev.kobj, "backlight");
> + if (ret && connector->ddc)
> + sysfs_remove_link(&connector->kdev->kobj, "ddc");
> + }
> +
> +out:
> + backlight_device_unref(bd);
> + return ret;
> }
>
> void drm_sysfs_connector_remove_early(struct drm_connector *connector)
> {
> + struct backlight_device *bd = drm_backlight_get_device(connector);
> +
> + if (bd) {
> + sysfs_remove_link(&connector->kdev->kobj, "backlight");
> + backlight_device_unref(bd);
> + }
> +
> if (connector->ddc)
> sysfs_remove_link(&connector->kdev->kobj, "ddc");
> }
> diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
> index 4cfeec70d648a..8a166ead13c55 100644
> --- a/include/drm/drm_atomic_helper.h
> +++ b/include/drm/drm_atomic_helper.h
> @@ -116,6 +116,8 @@ void drm_atomic_helper_commit_encoder_bridge_enable(struct drm_device *dev,
> void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
> struct drm_atomic_commit *old_state);
>
> +void drm_atomic_helper_connector_apply_luminance(const struct drm_connector_state *conn_state);
> +
> int drm_atomic_helper_prepare_planes(struct drm_device *dev,
> struct drm_atomic_commit *state);
> void drm_atomic_helper_unprepare_planes(struct drm_device *dev,
> diff --git a/include/drm/drm_backlight.h b/include/drm/drm_backlight.h
> new file mode 100644
> index 0000000000000..417ca4ecbf15b
> --- /dev/null
> +++ b/include/drm/drm_backlight.h
> @@ -0,0 +1,166 @@
> +/* SPDX-License-Identifier: MIT */
> +#ifndef __DRM_BACKLIGHT_H__
> +#define __DRM_BACKLIGHT_H__
> +
> +/*
> + * Copyright (c) 2014 David Herrmann <dh.herrmann at gmail.com>
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include <linux/list.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +
> +struct backlight_device;
> +struct drm_backlight;
> +struct drm_connector;
> +struct drm_device;
> +
> +/**
> + * struct drm_backlight_funcs - backend operations for a DRM backlight
> + *
> + * A DRM backlight is backend-agnostic: the core forwards luminance requests to
> + * whatever backend a driver has linked. Today the only backend is the backlight
> + * subsystem (&struct backlight_device), but the same core can drive other
> + * backends (DDC/CI, MIPI-DCS, ...) by providing a different set of these
> + * operations without any change to the core.
> + *
> + * All callbacks are invoked from process context (a workqueue), never from an
> + * atomic commit tail or while holding a spinlock, so they are allowed to sleep.
> + */
> +struct drm_backlight_funcs {
> + /**
> + * @set_luminance:
> + *
> + * Push @value (already clamped to the backend range) to the hardware.
> + * Returns 0 on success or a negative error code.
> + */
> + int (*set_luminance)(struct drm_backlight *b, unsigned int value);
> +
> + /**
> + * @get_luminance:
> + *
> + * Read the current hardware luminance into @value. Returns 0 on success
> + * or a negative error code. May be NULL if the backend cannot be read
> + * back.
> + */
> + int (*get_luminance)(struct drm_backlight *b, unsigned int *value);
> +
> + /**
> + * @get_range:
> + *
> + * Report the backend's maximum luminance in @max and whether the
> + * backend can turn the panel off at luminance 0 in @can_disable.
> + */
> + void (*get_range)(struct drm_backlight *b, unsigned int *max,
> + bool *can_disable);
> +};
> +
> +/**
> + * struct drm_backlight - per-connector backlight state
> + *
> + * This structure is embedded in &struct drm_connector and initialized by the
> + * DRM core; drivers never allocate it. It becomes active once a driver links a
> + * backend with drm_backlight_link().
> + */
> +struct drm_backlight {
> + /** @connector: connector this backlight belongs to */
> + struct drm_connector *connector;
> + /** @funcs: backend operations, or NULL while no backend is linked */
> + const struct drm_backlight_funcs *funcs;
> + /** @backend: backend private pointer (e.g. the &backlight_device) */
> + void *backend;
> + /** @list: entry on the global list of linked DRM backlights */
> + struct list_head list;
> + /** @work: deferred hardware update and uevent */
> + struct work_struct work;
> + /** @set_value: luminance value pending application by @work */
> + unsigned int set_value;
> + /**
> + * @luminance_clients: number of luminance-aware DRM clients that have
> + * taken this backlight over. While > 0, legacy sysfs writes to the
> + * linked backend return -EBUSY.
> + */
> + unsigned int luminance_clients;
> + /** @changed: a uevent is pending for @work to emit */
> + bool changed : 1;
> +};
> +
> +#if IS_ENABLED(CONFIG_DRM_BACKLIGHT)
> +
> +int drm_backlight_init(void);
> +void drm_backlight_exit(void);
> +
> +void drm_backlight_connector_init(struct drm_connector *connector);
> +void drm_backlight_connector_cleanup(struct drm_connector *connector);
> +void drm_backlight_unregister(struct drm_connector *connector);
> +
> +int drm_backlight_create_property(struct drm_connector *connector,
> + unsigned int max, bool can_disable);
> +int drm_backlight_link(struct drm_connector *connector,
> + struct backlight_device *bd);
> +struct backlight_device *drm_backlight_get_device(struct drm_connector *connector);
> +
> +void drm_backlight_inhibit_legacy(struct drm_connector *connector);
> +void drm_backlight_uninhibit_legacy(struct drm_connector *connector);
> +void drm_backlight_inhibit_legacy_all(struct drm_device *dev);
> +void drm_backlight_uninhibit_legacy_all(struct drm_device *dev);
> +
> +void drm_backlight_set_luminance(struct drm_connector *connector,
> + unsigned int value);
> +
> +#else /* CONFIG_DRM_BACKLIGHT */
> +
> +static inline int drm_backlight_init(void) { return 0; }
> +static inline void drm_backlight_exit(void) {}
> +
> +static inline void drm_backlight_connector_init(struct drm_connector *connector) {}
> +static inline void drm_backlight_connector_cleanup(struct drm_connector *connector) {}
> +static inline void drm_backlight_unregister(struct drm_connector *connector) {}
> +
> +static inline int drm_backlight_create_property(struct drm_connector *connector,
> + unsigned int max, bool can_disable)
> +{
> + return 0;
> +}
> +
> +static inline int drm_backlight_link(struct drm_connector *connector,
> + struct backlight_device *bd)
> +{
> + return 0;
> +}
> +
> +static inline struct backlight_device *
> +drm_backlight_get_device(struct drm_connector *connector)
> +{
> + return NULL;
> +}
> +
> +static inline void drm_backlight_inhibit_legacy(struct drm_connector *connector) {}
> +static inline void drm_backlight_uninhibit_legacy(struct drm_connector *connector) {}
> +static inline void drm_backlight_inhibit_legacy_all(struct drm_device *dev) {}
> +static inline void drm_backlight_uninhibit_legacy_all(struct drm_device *dev) {}
> +
> +static inline void drm_backlight_set_luminance(struct drm_connector *connector,
> + unsigned int value) {}
> +
> +#endif /* CONFIG_DRM_BACKLIGHT */
> +
> +#endif /* __DRM_BACKLIGHT_H__ */
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index a0cf0268de483..0535f20e7dba5 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -28,6 +28,7 @@
> #include <linux/ctype.h>
> #include <linux/hdmi.h>
> #include <linux/notifier.h>
> +#include <drm/drm_backlight.h>
> #include <drm/drm_mode_object.h>
> #include <drm/drm_util.h>
> #include <drm/drm_property.h>
> @@ -1290,6 +1291,11 @@ struct drm_connector_state {
> * @drm_atomic_helper_connector_hdmi_check().
> */
> struct drm_connector_hdmi_state hdmi;
> +
> + /**
> + * @luminance: Luminance for the connector
> + */
> + unsigned int luminance;
> };
>
> struct drm_connector_hdmi_audio_funcs {
> @@ -2526,6 +2532,20 @@ struct drm_connector {
> * @cec: CEC-related data.
> */
> struct drm_connector_cec cec;
> +
> + /**
> + * @backlight: DRM backlight state, embedded and initialized by the DRM
> + * core. Becomes active once a driver links a backend with
> + * drm_backlight_link().
> + */
> + struct drm_backlight backlight;
> +
> + /**
> + * @luminance_property: Per-connector range property controlling the
> + * connector's backlight luminance. Created with the backend's range
> + * when a backlight is linked; NULL while no backlight is linked.
> + */
> + struct drm_property *luminance_property;
> };
>
> #define obj_to_connector(x) container_of(x, struct drm_connector, base)
> diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
> index d8f5b7e9673ee..4ab45bd4edf7e 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -390,6 +390,17 @@ struct drm_mode_config {
> */
> struct drm_modeset_acquire_ctx *acquire_ctx;
>
> + /**
> + * @luminance_clients:
> + *
> + * Number of open DRM clients that have enabled
> + * &DRM_CLIENT_CAP_LUMINANCE and thereby inhibited legacy sysfs
> + * backlight control device-wide. Connectors linked while this is
> + * non-zero inherit the inhibit so hotplugged outputs stay consistent.
> + * Managed and serialized by the DRM backlight helpers.
> + */
> + unsigned int luminance_clients;
> +
> /**
> * @idr_mutex:
> *
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 02/14] backlight: add kernel-internal backlight API
2026-09-08 15:45 ` Jani Nikula
@ 2026-09-08 16:00 ` Mario Limonciello
2026-09-08 16:33 ` Jani Nikula
0 siblings, 1 reply; 31+ messages in thread
From: Mario Limonciello @ 2026-09-08 16:00 UTC (permalink / raw)
To: Jani Nikula, dri-devel, harry.wentland, Simona Vetter,
Alex Deucher, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, David Herrmann, Marta Lofstedt, Mario Limonciello
On 9/8/26 10:45, Jani Nikula wrote:
> On Mon, 07 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
>> So far backlights have only been controlled via sysfs. However, sysfs is
>> not a proper user-space API for runtime modifications, and never was
>> intended to provide such. The DRM drivers are now prepared to provide
>> such a backlight link so user-space can control backlight via DRM
>> connector properties. This allows us to employ the same access-management
>> we use for mode-setting.
>>
>> This patch adds a few kernel-internal backlight helpers so we can modify
>> backlights from within DRM, a brightness-changed notification, and a
>> per-device takeover count so that legacy sysfs writes can be inhibited
>> (-EBUSY) while a luminance-aware DRM client is in control.
>>
>> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
>>
>> V2: Marta Lofstedt <marta.lofstedt@intel.com>
>> - rebase
>> - minor edit for checkpatch warning
>>
>> Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
>>
>> V3: Mario Limonciello (AMD) <superm1@kernel.org>
>> - rebase
>> - Use guard(mutex)
>>
>> V4: Mario Limonciello (AMD) <superm1@kernel.org>
>> - Adjust return type for backlight_set_brightness() to return errors
>> - Stop clamping in backlight_set_brightness()
>> - Drop backlight_device_lookup()
>>
>> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
>> ---
>> drivers/video/backlight/backlight.c | 66 +++++++++++++++++++++++++++++
>> include/linux/backlight.h | 45 ++++++++++++++++++++
>> 2 files changed, 111 insertions(+)
>>
>> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
>> index 4401f6294ccc8..1c700c1e77c3f 100644
>> --- a/drivers/video/backlight/backlight.c
>> +++ b/drivers/video/backlight/backlight.c
>> @@ -126,6 +126,9 @@ static void backlight_generate_event(struct backlight_device *bd,
>> case BACKLIGHT_UPDATE_HOTKEY:
>> envp[0] = "SOURCE=hotkey";
>> break;
>> + case BACKLIGHT_UPDATE_DRM:
>> + envp[0] = "SOURCE=drm";
>> + break;
>> default:
>> envp[0] = "SOURCE=unknown";
>> break;
>> @@ -150,6 +153,13 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
>> struct backlight_device *bd = to_backlight_device(dev);
>> unsigned long power, old_power;
>>
>> + /* A luminance-aware DRM client has taken over this backlight; the
>> + * legacy sysfs interface is disabled until the last such client
>> + * goes away.
>> + */
>> + if (atomic_read(&bd->drm_takeover) > 0)
>> + return -EBUSY;
>> +
>> rc = kstrtoul(buf, 0, &power);
>> if (rc)
>> return rc;
>> @@ -214,6 +224,13 @@ static ssize_t brightness_store(struct device *dev,
>> struct backlight_device *bd = to_backlight_device(dev);
>> unsigned long brightness;
>>
>> + /* A luminance-aware DRM client has taken over this backlight; the
>> + * legacy sysfs interface is disabled until the last such client
>> + * goes away.
>> + */
>> + if (atomic_read(&bd->drm_takeover) > 0)
>> + return -EBUSY;
>> +
>> rc = kstrtoul(buf, 0, &brightness);
>> if (rc)
>> return rc;
>> @@ -514,6 +531,41 @@ static int devm_backlight_device_match(struct device *dev, void *res,
>> return *r == data;
>> }
>>
>> +/**
>> + * backlight_set_brightness - set brightness on a backlight device
>> + * @bd: backlight device to operate on
>> + * @value: brightness value to set on the device
>> + * @reason: backlight-change reason to use for notifications
>> + *
>> + * This is the in-kernel API equivalent of writing into the 'brightness' sysfs
>> + * file. It calls into the underlying backlight driver to change the brightness
>> + * value.
>> + * A uevent notification is sent with the reason set to @reason.
>> + * Return: 0 if successfully notified, -EINVAL for invalid values, -ENXIO if the
>> + * device has no ops (e.g. it is being unregistered)
>> + */
>> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
>> + enum backlight_update_reason reason)
>> +{
>> + int rc = -ENXIO;
>> +
>> + scoped_guard(mutex, &bd->ops_lock) {
>> + if (bd->ops) {
>> + if (value > bd->props.max_brightness)
>> + return -EINVAL;
>> +
>> + dev_dbg(&bd->dev, "set brightness to %u\n", value);
>> + bd->props.brightness = value;
>> + rc = backlight_update_status(bd);
>> + }
>> + }
>> + if (rc == 0)
>> + backlight_generate_event(bd, reason);
>> +
>> + return rc;
>> +}
>> +EXPORT_SYMBOL_GPL(backlight_set_brightness);
>> +
>> /**
>> * backlight_register_notifier - get notified of backlight (un)registration
>> * @nb: notifier block with the notifier to call on backlight (un)registration
>> @@ -548,6 +600,20 @@ int backlight_unregister_notifier(struct notifier_block *nb)
>> }
>> EXPORT_SYMBOL(backlight_unregister_notifier);
>>
>> +/**
>> + * backlight_notify_brightness - notify brightness change to listeners
>> + * @bd: backlight device that changed
>> + *
>> + * Notify registered listeners that the backlight brightness has changed.
>> + * This is called automatically after successful brightness updates.
>> + */
>> +void backlight_notify_brightness(struct backlight_device *bd)
>> +{
>> + blocking_notifier_call_chain(&backlight_notifier,
>> + BACKLIGHT_BRIGHTNESS_CHANGED, bd);
>> +}
>> +EXPORT_SYMBOL(backlight_notify_brightness);
>> +
>> /**
>> * devm_backlight_device_register - register a new backlight device
>> * @dev: the device to register
>> diff --git a/include/linux/backlight.h b/include/linux/backlight.h
>> index 015183d129f96..fac1acbc698a1 100644
>> --- a/include/linux/backlight.h
>> +++ b/include/linux/backlight.h
>> @@ -31,6 +31,12 @@ enum backlight_update_reason {
>> * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
>> */
>> BACKLIGHT_UPDATE_SYSFS,
>> +
>> + /**
>> + * @BACKLIGHT_UPDATE_DRM: The backlight was updated from DRM, i.e. through
>> + * a connector LUMINANCE property rather than the legacy sysfs interface.
>> + */
>> + BACKLIGHT_UPDATE_DRM,
>> };
>>
>> /**
>> @@ -82,6 +88,11 @@ enum backlight_notification {
>> * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
>> */
>> BACKLIGHT_UNREGISTERED,
>> +
>> + /**
>> + * @BACKLIGHT_BRIGHTNESS_CHANGED: The backlight brightness has changed.
>> + */
>> + BACKLIGHT_BRIGHTNESS_CHANGED,
>> };
>>
>> /** enum backlight_scale - the type of scale used for brightness values
>> @@ -310,8 +321,23 @@ struct backlight_device {
>> * @use_count: The number of unblanked displays.
>> */
>> int use_count;
>> +
>> + /**
>> + * @drm_takeover: Number of luminance-aware DRM clients that have
>> + * taken over brightness control of this device. When non-zero,
>> + * writes to the legacy sysfs ``brightness`` attribute return
>> + * ``-EBUSY``. Managed by the DRM backlight helpers.
>> + */
>> + atomic_t drm_takeover;
>> };
>>
>> +/* Forward declaration for backlight_update_status */
>> +#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
>
> I think IS_REACHABLE() is almost always a mistake. It's a hack to avoid
> link errors when something in a module needs something that is
> built-in. It's a combo that should be handled at Kconfig level, not at
> build level.
>
> BR,
> Jani.
That came from this feedback from Thomas Zimmerman (I originally had it
as select:
https://lore.kernel.org/dri-devel/8224920a-3a10-4400-9503-f014b7059329@suse.de/
I was trying to use IS_REACHABLE to make it optional, but it sounds like
that's not the right direction then?
>
>
>> +void backlight_notify_brightness(struct backlight_device *bd);
>> +#else
>> +static inline void backlight_notify_brightness(struct backlight_device *bd) {}
>> +#endif
>> +
>> /**
>> * backlight_update_status - force an update of the backlight device status
>> * @bd: the backlight device
>> @@ -325,6 +351,10 @@ static inline int backlight_update_status(struct backlight_device *bd)
>> ret = bd->ops->update_status(bd);
>> mutex_unlock(&bd->update_lock);
>>
>> + /* Notify DRM and other listeners that brightness changed */
>> + if (ret == 0)
>> + backlight_notify_brightness(bd);
>> +
>> return ret;
>> }
>>
>> @@ -431,6 +461,21 @@ static inline void backlight_notify_blank_all(struct device *display_dev,
>> { }
>> #endif
>>
>> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
>> + enum backlight_update_reason reason);
>> +
>> +static inline void backlight_device_ref(struct backlight_device *bd)
>> +{
>> + if (bd)
>> + get_device(&bd->dev);
>> +}
>> +
>> +static inline void backlight_device_unref(struct backlight_device *bd)
>> +{
>> + if (bd)
>> + put_device(&bd->dev);
>> +}
>> +
>> #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
>>
>> /**
>
^ permalink raw reply [flat|nested] 31+ messages in thread
* Re: [PATCH v8 02/14] backlight: add kernel-internal backlight API
2026-09-08 16:00 ` Mario Limonciello
@ 2026-09-08 16:33 ` Jani Nikula
0 siblings, 0 replies; 31+ messages in thread
From: Jani Nikula @ 2026-09-08 16:33 UTC (permalink / raw)
To: Mario Limonciello, dri-devel, harry.wentland, Simona Vetter,
Alex Deucher, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie
Cc: Xaver Hugl, amd-gfx,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS,
Hans de Goede, David Herrmann, Marta Lofstedt, Mario Limonciello
On Tue, 08 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
> On 9/8/26 10:45, Jani Nikula wrote:
>> On Mon, 07 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
>>> +/* Forward declaration for backlight_update_status */
>>> +#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)
>>
>> I think IS_REACHABLE() is almost always a mistake. It's a hack to avoid
>> link errors when something in a module needs something that is
>> built-in. It's a combo that should be handled at Kconfig level, not at
>> build level.
>>
>> BR,
>> Jani.
>
> That came from this feedback from Thomas Zimmerman (I originally had it
> as select:
>
> https://lore.kernel.org/dri-devel/8224920a-3a10-4400-9503-f014b7059329@suse.de/
>
> I was trying to use IS_REACHABLE to make it optional, but it sounds like
> that's not the right direction then?
I agree with Thomas, but he's also not suggesting to use IS_REACHABLE()!
The point is, if you express the dependencies properly with "depends on"
in Kconfig, you won't need IS_REACHABLE(). It's the "select" that can
lead to incorrect configurations, and IS_REACHABLE() is band-aid to work
around this.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 31+ messages in thread
* ✗ i915.CI.Full: failure for Add support for a DRM backlight capability (rev3)
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
` (14 preceding siblings ...)
2026-09-08 9:32 ` ✓ i915.CI.BAT: success for Add support for a DRM backlight capability (rev3) Patchwork
@ 2026-09-08 18:45 ` Patchwork
15 siblings, 0 replies; 31+ messages in thread
From: Patchwork @ 2026-09-08 18:45 UTC (permalink / raw)
To: Mario Limonciello; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 122699 bytes --]
== Series Details ==
Series: Add support for a DRM backlight capability (rev3)
URL : https://patchwork.freedesktop.org/series/169109/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_19102_full -> Patchwork_169109v3_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with Patchwork_169109v3_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in Patchwork_169109v3_full, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (10 -> 10)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in Patchwork_169109v3_full:
### IGT changes ###
#### Possible regressions ####
* igt@i915_selftest@live@late_gt_pm:
- shard-tglu: NOTRUN -> [ABORT][1] +1 other test abort
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@i915_selftest@live@late_gt_pm.html
* igt@kms_cursor_edge_walk@256x256-left-edge@pipe-d-hdmi-a-1:
- shard-dg1: NOTRUN -> [DMESG-WARN][2]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-14/igt@kms_cursor_edge_walk@256x256-left-edge@pipe-d-hdmi-a-1.html
* igt@kms_cursor_edge_walk@64x64-right-edge@pipe-d-hdmi-a-4:
- shard-dg1: [PASS][3] -> [DMESG-WARN][4] +2 other tests dmesg-warn
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-16/igt@kms_cursor_edge_walk@64x64-right-edge@pipe-d-hdmi-a-4.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-16/igt@kms_cursor_edge_walk@64x64-right-edge@pipe-d-hdmi-a-4.html
* igt@kms_flip@flip-vs-blocking-wf-vblank@d-hdmi-a1:
- shard-dg1: NOTRUN -> [FAIL][5]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-14/igt@kms_flip@flip-vs-blocking-wf-vblank@d-hdmi-a1.html
* igt@kms_pm_backlight@brightness-with-dpms@edp-1:
- shard-mtlp: [PASS][6] -> [FAIL][7] +4 other tests fail
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-mtlp-5/igt@kms_pm_backlight@brightness-with-dpms@edp-1.html
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-mtlp-3/igt@kms_pm_backlight@brightness-with-dpms@edp-1.html
#### Warnings ####
* igt@kms_flip@flip-vs-blocking-wf-vblank:
- shard-dg1: [FAIL][8] ([i915#14600]) -> [FAIL][9]
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-19/igt@kms_flip@flip-vs-blocking-wf-vblank.html
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-14/igt@kms_flip@flip-vs-blocking-wf-vblank.html
New tests
---------
New tests have been introduced between CI_DRM_19102_full and Patchwork_169109v3_full:
### New IGT tests (3) ###
* igt@kms_cursor_crc@cursor-sliding-256x85@pipe-a-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [4.44] s
* igt@kms_cursor_crc@cursor-sliding-256x85@pipe-c-hdmi-a-1:
- Statuses : 1 pass(s)
- Exec time: [4.14] s
* igt@kms_cursor_crc@cursor-sliding-256x85@pipe-d-hdmi-a-3:
- Statuses : 1 pass(s)
- Exec time: [4.37] s
Known issues
------------
Here are the changes found in Patchwork_169109v3_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@api_intel_bb@crc32:
- shard-rkl: NOTRUN -> [SKIP][10] ([i915#6230])
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@api_intel_bb@crc32.html
* igt@api_intel_bb@object-reloc-keep-cache:
- shard-dg1: NOTRUN -> [SKIP][11] ([i915#8411])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@api_intel_bb@object-reloc-keep-cache.html
* igt@device_reset@unbind-cold-reset-rebind:
- shard-rkl: NOTRUN -> [SKIP][12] ([i915#11078])
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@device_reset@unbind-cold-reset-rebind.html
- shard-tglu: NOTRUN -> [SKIP][13] ([i915#11078])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@device_reset@unbind-cold-reset-rebind.html
* igt@gem_busy@semaphore:
- shard-dg2: NOTRUN -> [SKIP][14] ([i915#3936])
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_busy@semaphore.html
* igt@gem_ccs@ctrl-surf-copy:
- shard-rkl: NOTRUN -> [SKIP][15] ([i915#3555] / [i915#9323])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@gem_ccs@ctrl-surf-copy.html
* igt@gem_ccs@large-ctrl-surf-copy:
- shard-rkl: NOTRUN -> [SKIP][16] ([i915#13008])
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@gem_ccs@large-ctrl-surf-copy.html
- shard-tglu: NOTRUN -> [SKIP][17] ([i915#13008])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@gem_ccs@large-ctrl-surf-copy.html
* igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0:
- shard-dg2: [PASS][18] -> [INCOMPLETE][19] ([i915#13356] / [i915#16348])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg2-1/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0.html
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-3/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-smem-lmem0.html
* igt@gem_close_race@multigpu-basic-process:
- shard-tglu-1: NOTRUN -> [SKIP][20] ([i915#7697])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@gem_close_race@multigpu-basic-process.html
* igt@gem_close_race@multigpu-basic-threads:
- shard-dg1: NOTRUN -> [SKIP][21] ([i915#7697])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@gem_close_race@multigpu-basic-threads.html
* igt@gem_create@create-ext-cpu-access-sanity-check:
- shard-tglu-1: NOTRUN -> [SKIP][22] ([i915#6335])
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@gem_create@create-ext-cpu-access-sanity-check.html
* igt@gem_create@create-ext-set-pat:
- shard-rkl: NOTRUN -> [SKIP][23] ([i915#8562])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@gem_create@create-ext-set-pat.html
* igt@gem_ctx_persistence@heartbeat-many:
- shard-dg2: NOTRUN -> [SKIP][24] ([i915#8555])
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_ctx_persistence@heartbeat-many.html
* igt@gem_ctx_sseu@invalid-args:
- shard-rkl: NOTRUN -> [SKIP][25] ([i915#280]) +1 other test skip
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@gem_ctx_sseu@invalid-args.html
- shard-tglu: NOTRUN -> [SKIP][26] ([i915#280])
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@gem_ctx_sseu@invalid-args.html
* igt@gem_exec_balancer@parallel-ordering:
- shard-rkl: NOTRUN -> [SKIP][27] ([i915#4525])
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@gem_exec_balancer@parallel-ordering.html
* igt@gem_exec_flush@basic-uc-ro-default:
- shard-dg1: NOTRUN -> [SKIP][28] ([i915#3539] / [i915#4852])
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@gem_exec_flush@basic-uc-ro-default.html
* igt@gem_exec_reloc@basic-wc:
- shard-rkl: NOTRUN -> [SKIP][29] ([i915#3281]) +12 other tests skip
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@gem_exec_reloc@basic-wc.html
* igt@gem_exec_reloc@basic-write-cpu-noreloc:
- shard-dg2: NOTRUN -> [SKIP][30] ([i915#3281]) +1 other test skip
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_exec_reloc@basic-write-cpu-noreloc.html
* igt@gem_exec_suspend@basic-s0:
- shard-dg2: [PASS][31] -> [INCOMPLETE][32] ([i915#13356]) +1 other test incomplete
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg2-4/igt@gem_exec_suspend@basic-s0.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-4/igt@gem_exec_suspend@basic-s0.html
* igt@gem_huc_copy@huc-copy:
- shard-rkl: NOTRUN -> [SKIP][33] ([i915#2190])
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@gem_huc_copy@huc-copy.html
* igt@gem_lmem_evict@dontneed-evict-race:
- shard-tglu: NOTRUN -> [SKIP][34] ([i915#4613] / [i915#7582])
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@gem_lmem_evict@dontneed-evict-race.html
* igt@gem_lmem_swapping@heavy-random:
- shard-rkl: NOTRUN -> [SKIP][35] ([i915#4613]) +3 other tests skip
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@gem_lmem_swapping@heavy-random.html
* igt@gem_lmem_swapping@parallel-random-verify-ccs:
- shard-tglu: NOTRUN -> [SKIP][36] ([i915#4613]) +3 other tests skip
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@gem_lmem_swapping@parallel-random-verify-ccs.html
* igt@gem_lmem_swapping@verify:
- shard-glk: NOTRUN -> [SKIP][37] ([i915#4613])
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@gem_lmem_swapping@verify.html
- shard-tglu-1: NOTRUN -> [SKIP][38] ([i915#4613]) +1 other test skip
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@gem_lmem_swapping@verify.html
* igt@gem_mmap_gtt@cpuset-basic-small-copy-xy:
- shard-dg2: NOTRUN -> [SKIP][39] ([i915#4077]) +2 other tests skip
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_mmap_gtt@cpuset-basic-small-copy-xy.html
* igt@gem_mmap_offset@clear-via-pagefault:
- shard-mtlp: [PASS][40] -> [TIMEOUT][41] ([i915#16021] / [i915#16168] / [i915#16349]) +1 other test timeout
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-mtlp-3/igt@gem_mmap_offset@clear-via-pagefault.html
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-mtlp-4/igt@gem_mmap_offset@clear-via-pagefault.html
* igt@gem_mmap_wc@write-prefaulted:
- shard-dg2: NOTRUN -> [SKIP][42] ([i915#4083]) +1 other test skip
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_mmap_wc@write-prefaulted.html
* igt@gem_partial_pwrite_pread@writes-after-reads-snoop:
- shard-dg2: NOTRUN -> [SKIP][43] ([i915#3282]) +2 other tests skip
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_partial_pwrite_pread@writes-after-reads-snoop.html
* igt@gem_pwrite_snooped:
- shard-dg1: NOTRUN -> [SKIP][44] ([i915#3282])
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@gem_pwrite_snooped.html
* igt@gem_render_copy@y-tiled-ccs-to-y-tiled-ccs:
- shard-dg2: NOTRUN -> [SKIP][45] ([i915#5190] / [i915#8428]) +1 other test skip
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_render_copy@y-tiled-ccs-to-y-tiled-ccs.html
* igt@gem_set_tiling_vs_blt@untiled-to-tiled:
- shard-rkl: NOTRUN -> [SKIP][46] ([i915#8411])
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@gem_set_tiling_vs_blt@untiled-to-tiled.html
* igt@gem_set_tiling_vs_pwrite:
- shard-rkl: NOTRUN -> [SKIP][47] ([i915#3282]) +6 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@gem_set_tiling_vs_pwrite.html
* igt@gem_userptr_blits@access-control:
- shard-dg2: NOTRUN -> [SKIP][48] ([i915#3297])
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_userptr_blits@access-control.html
* igt@gem_userptr_blits@coherency-sync:
- shard-tglu: NOTRUN -> [SKIP][49] ([i915#3297]) +2 other tests skip
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@gem_userptr_blits@coherency-sync.html
* igt@gem_userptr_blits@coherency-unsync:
- shard-rkl: NOTRUN -> [SKIP][50] ([i915#3297]) +1 other test skip
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@gem_userptr_blits@coherency-unsync.html
* igt@gem_userptr_blits@forbidden-operations:
- shard-rkl: NOTRUN -> [SKIP][51] ([i915#3282] / [i915#3297])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@gem_userptr_blits@forbidden-operations.html
* igt@gem_userptr_blits@map-fixed-invalidate-busy:
- shard-dg2: NOTRUN -> [SKIP][52] ([i915#3297] / [i915#4880])
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_userptr_blits@map-fixed-invalidate-busy.html
* igt@gem_userptr_blits@readonly-pwrite-unsync:
- shard-dg1: NOTRUN -> [SKIP][53] ([i915#3297])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@gem_userptr_blits@readonly-pwrite-unsync.html
* igt@gem_userptr_blits@unsync-unmap:
- shard-tglu-1: NOTRUN -> [SKIP][54] ([i915#3297])
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@gem_userptr_blits@unsync-unmap.html
* igt@gen9_exec_parse@batch-without-end:
- shard-rkl: NOTRUN -> [SKIP][55] ([i915#2527]) +1 other test skip
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@gen9_exec_parse@batch-without-end.html
* igt@gen9_exec_parse@bb-start-cmd:
- shard-tglu: NOTRUN -> [SKIP][56] ([i915#2527] / [i915#2856]) +1 other test skip
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@gen9_exec_parse@bb-start-cmd.html
* igt@gen9_exec_parse@bb-start-param:
- shard-tglu-1: NOTRUN -> [SKIP][57] ([i915#2527] / [i915#2856]) +2 other tests skip
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@gen9_exec_parse@bb-start-param.html
* igt@i915_drm_fdinfo@all-busy-idle-check-all:
- shard-dg2: NOTRUN -> [SKIP][58] ([i915#14123])
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@i915_drm_fdinfo@all-busy-idle-check-all.html
* igt@i915_drm_fdinfo@virtual-busy-idle:
- shard-dg2: NOTRUN -> [SKIP][59] ([i915#14118])
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@i915_drm_fdinfo@virtual-busy-idle.html
* igt@i915_module_load@fault-injection@__uc_init:
- shard-tglu-1: NOTRUN -> [SKIP][60] ([i915#15479]) +4 other tests skip
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@i915_module_load@fault-injection@__uc_init.html
* igt@i915_module_load@fault-injection@intel_connector_register:
- shard-tglu-1: NOTRUN -> [ABORT][61] ([i915#15342]) +1 other test abort
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@i915_module_load@fault-injection@intel_connector_register.html
* igt@i915_pm_freq_api@freq-reset-multiple:
- shard-tglu: NOTRUN -> [SKIP][62] ([i915#8399])
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@i915_pm_freq_api@freq-reset-multiple.html
* igt@i915_pm_rc6_residency@media-rc6-accuracy:
- shard-dg2: NOTRUN -> [SKIP][63] ([i915#16080] / [i915#16166])
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@i915_pm_rc6_residency@media-rc6-accuracy.html
* igt@i915_query@test-query-geometry-subslices:
- shard-rkl: NOTRUN -> [SKIP][64] ([i915#5723])
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@i915_query@test-query-geometry-subslices.html
* igt@i915_suspend@fence-restore-untiled:
- shard-rkl: [PASS][65] -> [INCOMPLETE][66] ([i915#4817])
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@i915_suspend@fence-restore-untiled.html
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@i915_suspend@fence-restore-untiled.html
* igt@intel_hwmon@hwmon-write:
- shard-rkl: NOTRUN -> [SKIP][67] ([i915#7707])
[67]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@intel_hwmon@hwmon-write.html
- shard-tglu-1: NOTRUN -> [SKIP][68] ([i915#7707])
[68]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@intel_hwmon@hwmon-write.html
* igt@kms_addfb_basic@clobberred-modifier:
- shard-dg1: NOTRUN -> [SKIP][69] ([i915#4212])
[69]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_addfb_basic@clobberred-modifier.html
* igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
- shard-rkl: NOTRUN -> [SKIP][70] ([i915#12454] / [i915#12712])
[70]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html
- shard-tglu: NOTRUN -> [SKIP][71] ([i915#12454] / [i915#12712])
[71]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html
* igt@kms_async_flips@async-flip-suspend-resume:
- shard-rkl: [PASS][72] -> [INCOMPLETE][73] ([i915#12761])
[72]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-2/igt@kms_async_flips@async-flip-suspend-resume.html
[73]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_async_flips@async-flip-suspend-resume.html
- shard-glk11: NOTRUN -> [INCOMPLETE][74] ([i915#12761]) +1 other test incomplete
[74]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk11/igt@kms_async_flips@async-flip-suspend-resume.html
* igt@kms_async_flips@async-flip-suspend-resume@pipe-b-hdmi-a-2:
- shard-rkl: NOTRUN -> [INCOMPLETE][75] ([i915#12761])
[75]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_async_flips@async-flip-suspend-resume@pipe-b-hdmi-a-2.html
* igt@kms_atomic@plane-primary-overlay-mutable-zpos:
- shard-rkl: NOTRUN -> [SKIP][76] ([i915#9531])
[76]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html
* igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
- shard-tglu: NOTRUN -> [SKIP][77] ([i915#1769] / [i915#3555])
[77]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html
* igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip:
- shard-tglu: NOTRUN -> [SKIP][78] ([i915#5286]) +6 other tests skip
[78]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-async-flip.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip:
- shard-rkl: NOTRUN -> [SKIP][79] ([i915#5286]) +5 other tests skip
[79]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
- shard-dg1: NOTRUN -> [SKIP][80] ([i915#4538] / [i915#5286]) +1 other test skip
[80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
- shard-tglu-1: NOTRUN -> [SKIP][81] ([i915#5286]) +1 other test skip
[81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-mtlp: [PASS][82] -> [FAIL][83] ([i915#15733] / [i915#5138])
[82]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-mtlp-4/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
[83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-mtlp-2/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
* igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip:
- shard-rkl: NOTRUN -> [SKIP][84] ([i915#3828])
[84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip.html
* igt@kms_big_fb@y-tiled-64bpp-rotate-90:
- shard-rkl: NOTRUN -> [SKIP][85] ([i915#3638]) +1 other test skip
[85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_big_fb@y-tiled-64bpp-rotate-90.html
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- shard-dg1: NOTRUN -> [SKIP][86] ([i915#3638]) +1 other test skip
[86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html
* igt@kms_big_fb@yf-tiled-8bpp-rotate-0:
- shard-dg2: NOTRUN -> [SKIP][87] ([i915#4538] / [i915#5190]) +3 other tests skip
[87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_big_fb@yf-tiled-8bpp-rotate-0.html
* igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
- shard-dg1: NOTRUN -> [SKIP][88] ([i915#4538])
[88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
* igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs:
- shard-tglu: NOTRUN -> [SKIP][89] ([i915#12313]) +3 other tests skip
[89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs.html
* igt@kms_ccs@bad-rotation-90-y-tiled-ccs:
- shard-dg2: NOTRUN -> [SKIP][90] ([i915#10307] / [i915#6095]) +4 other tests skip
[90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_ccs@bad-rotation-90-y-tiled-ccs.html
* igt@kms_ccs@crc-primary-basic-4-tiled-lnl-ccs:
- shard-dg1: NOTRUN -> [SKIP][91] ([i915#12313])
[91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_ccs@crc-primary-basic-4-tiled-lnl-ccs.html
* igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc@pipe-b-hdmi-a-1:
- shard-tglu-1: NOTRUN -> [SKIP][92] ([i915#6095]) +14 other tests skip
[92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs-cc@pipe-b-hdmi-a-1.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs:
- shard-tglu: NOTRUN -> [SKIP][93] ([i915#12805])
[93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_ccs@crc-primary-suspend-4-tiled-lnl-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-3:
- shard-dg2: NOTRUN -> [SKIP][94] ([i915#6095]) +4 other tests skip
[94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-3.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-1:
- shard-tglu: NOTRUN -> [SKIP][95] ([i915#6095]) +69 other tests skip
[95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-1.html
* igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc:
- shard-rkl: [PASS][96] -> [ABORT][97] ([i915#15132])
[96]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-5/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html
[97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-1/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html
* igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-c-hdmi-a-2:
- shard-rkl: NOTRUN -> [ABORT][98] ([i915#15132])
[98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-1/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc@pipe-c-hdmi-a-2.html
* igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs@pipe-c-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][99] ([i915#14098] / [i915#6095]) +52 other tests skip
[99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs@pipe-c-hdmi-a-2.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs:
- shard-rkl: NOTRUN -> [SKIP][100] ([i915#12313]) +3 other tests skip
[100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-lnl-ccs.html
* igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs@pipe-b-hdmi-a-1:
- shard-dg1: NOTRUN -> [SKIP][101] ([i915#6095]) +134 other tests skip
[101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-14/igt@kms_ccs@missing-ccs-buffer-yf-tiled-ccs@pipe-b-hdmi-a-1.html
* igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
- shard-tglu-1: NOTRUN -> [SKIP][102] ([i915#12313]) +1 other test skip
[102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html
* igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2:
- shard-rkl: NOTRUN -> [SKIP][103] ([i915#6095]) +77 other tests skip
[103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html
* igt@kms_cdclk@mode-transition:
- shard-rkl: NOTRUN -> [SKIP][104] ([i915#3742])
[104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_cdclk@mode-transition.html
* igt@kms_chamelium_audio@dp-audio-edid:
- shard-dg2: NOTRUN -> [SKIP][105] ([i915#11151] / [i915#7828]) +1 other test skip
[105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_chamelium_audio@dp-audio-edid.html
* igt@kms_chamelium_audio@hdmi-audio-after-suspend:
- shard-rkl: NOTRUN -> [SKIP][106] ([i915#11151])
[106]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_chamelium_audio@hdmi-audio-after-suspend.html
* igt@kms_chamelium_color@ctm-green-to-red:
- shard-dg2: NOTRUN -> [SKIP][107] +2 other tests skip
[107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_chamelium_color@ctm-green-to-red.html
* igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4-lut1d:
- shard-dg1: NOTRUN -> [SKIP][108] ([i915#16471])
[108]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4-lut1d.html
* igt@kms_chamelium_color_pipeline@plane-lut1d-post-ctm3x4:
- shard-tglu-1: NOTRUN -> [SKIP][109] ([i915#16471])
[109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_chamelium_color_pipeline@plane-lut1d-post-ctm3x4.html
* igt@kms_chamelium_color_pipeline@plane-lut1d-pre-ctm3x4:
- shard-rkl: NOTRUN -> [SKIP][110] ([i915#16471]) +1 other test skip
[110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_chamelium_color_pipeline@plane-lut1d-pre-ctm3x4.html
- shard-tglu: NOTRUN -> [SKIP][111] ([i915#16471])
[111]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_chamelium_color_pipeline@plane-lut1d-pre-ctm3x4.html
* igt@kms_chamelium_frames@hdmi-crc-fast:
- shard-tglu-1: NOTRUN -> [SKIP][112] ([i915#11151] / [i915#7828]) +3 other tests skip
[112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_chamelium_frames@hdmi-crc-fast.html
* igt@kms_chamelium_hpd@vga-hpd-fast:
- shard-rkl: NOTRUN -> [SKIP][113] ([i915#11151] / [i915#7828]) +7 other tests skip
[113]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_chamelium_hpd@vga-hpd-fast.html
- shard-dg1: NOTRUN -> [SKIP][114] ([i915#11151] / [i915#7828]) +1 other test skip
[114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_chamelium_hpd@vga-hpd-fast.html
- shard-tglu: NOTRUN -> [SKIP][115] ([i915#11151] / [i915#7828]) +11 other tests skip
[115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-10/igt@kms_chamelium_hpd@vga-hpd-fast.html
* igt@kms_color@deep-color:
- shard-dg2: NOTRUN -> [SKIP][116] ([i915#12655] / [i915#3555])
[116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_color@deep-color.html
- shard-tglu: NOTRUN -> [SKIP][117] ([i915#3555] / [i915#9979])
[117]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_color@deep-color.html
* igt@kms_content_protection@atomic-hdcp14:
- shard-tglu-1: NOTRUN -> [SKIP][118] ([i915#15865]) +1 other test skip
[118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_content_protection@atomic-hdcp14.html
* igt@kms_content_protection@dp-mst-lic-type-0:
- shard-tglu: NOTRUN -> [SKIP][119] ([i915#15330] / [i915#3116] / [i915#3299]) +2 other tests skip
[119]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_content_protection@dp-mst-lic-type-0.html
* igt@kms_content_protection@dp-mst-lic-type-1:
- shard-rkl: NOTRUN -> [SKIP][120] ([i915#15330] / [i915#3116]) +1 other test skip
[120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_content_protection@dp-mst-lic-type-1.html
- shard-dg1: NOTRUN -> [SKIP][121] ([i915#15330] / [i915#3299])
[121]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_content_protection@dp-mst-lic-type-1.html
* igt@kms_content_protection@dp-mst-type-0:
- shard-dg2: NOTRUN -> [SKIP][122] ([i915#15330] / [i915#3299])
[122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_content_protection@dp-mst-type-0.html
* igt@kms_content_protection@dp-mst-type-1-suspend-resume:
- shard-tglu: NOTRUN -> [SKIP][123] ([i915#15330])
[123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_content_protection@dp-mst-type-1-suspend-resume.html
- shard-dg2: NOTRUN -> [SKIP][124] ([i915#15330])
[124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_content_protection@dp-mst-type-1-suspend-resume.html
* igt@kms_content_protection@legacy-hdcp14:
- shard-tglu: NOTRUN -> [SKIP][125] ([i915#15865]) +3 other tests skip
[125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_content_protection@legacy-hdcp14.html
* igt@kms_content_protection@srm:
- shard-rkl: NOTRUN -> [SKIP][126] ([i915#15865]) +2 other tests skip
[126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_content_protection@srm.html
* igt@kms_cursor_crc@cursor-onscreen-128x42:
- shard-tglu: NOTRUN -> [FAIL][127] ([i915#13566]) +1 other test fail
[127]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_cursor_crc@cursor-onscreen-128x42.html
* igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1:
- shard-rkl: NOTRUN -> [FAIL][128] ([i915#13566]) +4 other tests fail
[128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html
- shard-tglu-1: NOTRUN -> [FAIL][129] ([i915#13566]) +1 other test fail
[129]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html
* igt@kms_cursor_crc@cursor-random-256x85:
- shard-rkl: [PASS][130] -> [FAIL][131] ([i915#13566])
[130]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-3/igt@kms_cursor_crc@cursor-random-256x85.html
[131]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_cursor_crc@cursor-random-256x85.html
* igt@kms_cursor_crc@cursor-random-512x170:
- shard-rkl: NOTRUN -> [SKIP][132] ([i915#13049]) +1 other test skip
[132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_cursor_crc@cursor-random-512x170.html
* igt@kms_cursor_crc@cursor-random-max-size:
- shard-rkl: NOTRUN -> [SKIP][133] ([i915#3555]) +1 other test skip
[133]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_cursor_crc@cursor-random-max-size.html
* igt@kms_cursor_crc@cursor-rapid-movement-32x10:
- shard-tglu: NOTRUN -> [SKIP][134] ([i915#3555]) +3 other tests skip
[134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html
* igt@kms_cursor_crc@cursor-rapid-movement-512x512:
- shard-tglu: NOTRUN -> [SKIP][135] ([i915#13049])
[135]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_cursor_crc@cursor-rapid-movement-512x512.html
* igt@kms_cursor_crc@cursor-sliding-512x170:
- shard-tglu-1: NOTRUN -> [SKIP][136] ([i915#13049])
[136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_cursor_crc@cursor-sliding-512x170.html
* igt@kms_cursor_crc@cursor-suspend:
- shard-glk: NOTRUN -> [INCOMPLETE][137] ([i915#12358] / [i915#14152] / [i915#7882])
[137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk3/igt@kms_cursor_crc@cursor-suspend.html
* igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-1:
- shard-glk: NOTRUN -> [INCOMPLETE][138] ([i915#12358] / [i915#14152])
[138]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk3/igt@kms_cursor_crc@cursor-suspend@pipe-a-hdmi-a-1.html
* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size:
- shard-tglu-1: NOTRUN -> [SKIP][139] ([i915#4103]) +1 other test skip
[139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
- shard-dg1: NOTRUN -> [SKIP][140] ([i915#4103])
[140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html
* igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
- shard-tglu-1: NOTRUN -> [SKIP][141] ([i915#9723])
[141]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html
* igt@kms_dp_aux_dev@basic:
- shard-tglu-1: NOTRUN -> [SKIP][142] ([i915#1257])
[142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_dp_aux_dev@basic.html
* igt@kms_dp_link_training@non-uhbr-sst:
- shard-rkl: NOTRUN -> [SKIP][143] ([i915#13749])
[143]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_dp_link_training@non-uhbr-sst.html
* igt@kms_dp_link_training@uhbr-sst:
- shard-dg1: NOTRUN -> [SKIP][144] ([i915#13748])
[144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_dp_link_training@uhbr-sst.html
* igt@kms_dp_linktrain_fallback@uhbr-to-hbr-fallback:
- shard-rkl: NOTRUN -> [SKIP][145] ([i915#16867])
[145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_dp_linktrain_fallback@uhbr-to-hbr-fallback.html
- shard-tglu: NOTRUN -> [SKIP][146] ([i915#16870])
[146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_dp_linktrain_fallback@uhbr-to-hbr-fallback.html
* igt@kms_draw_crc@draw-method-mmap-gtt:
- shard-dg2: NOTRUN -> [SKIP][147] ([i915#8812])
[147]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_draw_crc@draw-method-mmap-gtt.html
* igt@kms_dsc@dsc-basic:
- shard-rkl: NOTRUN -> [SKIP][148] ([i915#16361]) +4 other tests skip
[148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_dsc@dsc-basic.html
* igt@kms_dsc@dsc-basic-ultrajoiner:
- shard-tglu: NOTRUN -> [SKIP][149] ([i915#16361]) +2 other tests skip
[149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_dsc@dsc-basic-ultrajoiner.html
* igt@kms_dsc@dsc-fractional-bpp-with-bpc:
- shard-tglu-1: NOTRUN -> [SKIP][150] ([i915#16361])
[150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html
* igt@kms_dsc@dsc-with-bpc-bigjoiner:
- shard-dg1: NOTRUN -> [SKIP][151] ([i915#16361])
[151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_dsc@dsc-with-bpc-bigjoiner.html
* igt@kms_dsc@dsc-with-formats-ultrajoiner:
- shard-dg2: NOTRUN -> [SKIP][152] ([i915#16361])
[152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_dsc@dsc-with-formats-ultrajoiner.html
* igt@kms_fbcon_fbt@psr:
- shard-rkl: NOTRUN -> [SKIP][153] ([i915#16680])
[153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_fbcon_fbt@psr.html
* igt@kms_feature_discovery@display-3x:
- shard-rkl: NOTRUN -> [SKIP][154] ([i915#16081])
[154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_feature_discovery@display-3x.html
- shard-tglu: NOTRUN -> [SKIP][155] ([i915#16081])
[155]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_feature_discovery@display-3x.html
* igt@kms_feature_discovery@psr1:
- shard-dg2: NOTRUN -> [SKIP][156] ([i915#658])
[156]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_feature_discovery@psr1.html
* igt@kms_fence_pin_leak:
- shard-dg2: NOTRUN -> [SKIP][157] ([i915#4881])
[157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_fence_pin_leak.html
* igt@kms_flip@2x-absolute-wf_vblank-interruptible:
- shard-dg2: NOTRUN -> [SKIP][158] ([i915#9934]) +1 other test skip
[158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html
* igt@kms_flip@2x-blocking-wf_vblank:
- shard-tglu-1: NOTRUN -> [SKIP][159] ([i915#3637] / [i915#9934]) +2 other tests skip
[159]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_flip@2x-blocking-wf_vblank.html
* igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
- shard-tglu-1: NOTRUN -> [SKIP][160] ([i915#9934])
[160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
* igt@kms_flip@2x-flip-vs-expired-vblank:
- shard-glk11: NOTRUN -> [FAIL][161] ([i915#13027]) +1 other test fail
[161]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk11/igt@kms_flip@2x-flip-vs-expired-vblank.html
* igt@kms_flip@2x-plain-flip:
- shard-tglu: NOTRUN -> [SKIP][162] ([i915#3637] / [i915#9934]) +9 other tests skip
[162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_flip@2x-plain-flip.html
* igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
- shard-dg1: NOTRUN -> [SKIP][163] ([i915#9934]) +1 other test skip
[163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
* igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible:
- shard-rkl: NOTRUN -> [SKIP][164] ([i915#9934]) +5 other tests skip
[164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-tglu-1: NOTRUN -> [FAIL][165] ([i915#13027]) +1 other test fail
[165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
* igt@kms_flip@flip-vs-fences:
- shard-dg1: NOTRUN -> [SKIP][166] ([i915#8381])
[166]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_flip@flip-vs-fences.html
* igt@kms_flip@flip-vs-suspend:
- shard-rkl: [PASS][167] -> [INCOMPLETE][168] ([i915#16276] / [i915#6113])
[167]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-8/igt@kms_flip@flip-vs-suspend.html
[168]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_flip@flip-vs-suspend.html
- shard-glk: NOTRUN -> [INCOMPLETE][169] ([i915#12314] / [i915#12745] / [i915#4839])
[169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk8/igt@kms_flip@flip-vs-suspend.html
* igt@kms_flip@flip-vs-suspend@a-hdmi-a1:
- shard-glk: NOTRUN -> [INCOMPLETE][170] ([i915#12314] / [i915#12745])
[170]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk8/igt@kms_flip@flip-vs-suspend@a-hdmi-a1.html
* igt@kms_flip@flip-vs-suspend@a-hdmi-a2:
- shard-rkl: NOTRUN -> [INCOMPLETE][171] ([i915#16276] / [i915#6113])
[171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_flip@flip-vs-suspend@a-hdmi-a2.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling:
- shard-dg1: NOTRUN -> [SKIP][172] ([i915#15643]) +2 other tests skip
[172]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-upscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling:
- shard-dg2: NOTRUN -> [SKIP][173] ([i915#15643])
[173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-upscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling:
- shard-tglu-1: NOTRUN -> [SKIP][174] ([i915#15643])
[174]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling:
- shard-tglu: NOTRUN -> [SKIP][175] ([i915#15643]) +4 other tests skip
[175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-downscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling:
- shard-rkl: NOTRUN -> [SKIP][176] ([i915#15643]) +5 other tests skip
[176]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-dg2: NOTRUN -> [SKIP][177] ([i915#15990] / [i915#8708]) +3 other tests skip
[177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbc-suspend:
- shard-rkl: [PASS][178] -> [INCOMPLETE][179] ([i915#10056])
[178]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_frontbuffer_tracking@fbc-suspend.html
[179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-suspend.html
* igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-spr-indfb-draw-render:
- shard-dg2: NOTRUN -> [SKIP][180] ([i915#15989]) +6 other tests skip
[180]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-spr-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-spr-indfb-onoff:
- shard-rkl: NOTRUN -> [SKIP][181] ([i915#15989]) +22 other tests skip
[181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-spr-indfb-onoff.html
* igt@kms_frontbuffer_tracking@fbchdr-2p-primscrn-spr-indfb-draw-mmap-cpu:
- shard-glk: [PASS][182] -> [SKIP][183] +2 other tests skip
[182]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-glk8/igt@kms_frontbuffer_tracking@fbchdr-2p-primscrn-spr-indfb-draw-mmap-cpu.html
[183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@kms_frontbuffer_tracking@fbchdr-2p-primscrn-spr-indfb-draw-mmap-cpu.html
* igt@kms_frontbuffer_tracking@fbchdr-2p-scndscrn-shrfb-plflip-blt:
- shard-tglu: NOTRUN -> [SKIP][184] +118 other tests skip
[184]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_frontbuffer_tracking@fbchdr-2p-scndscrn-shrfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@fbchdr-rgb565-draw-mmap-wc:
- shard-dg1: NOTRUN -> [SKIP][185] ([i915#15990]) +8 other tests skip
[185]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@fbchdr-rgb565-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite:
- shard-dg2: NOTRUN -> [SKIP][186] ([i915#15102]) +13 other tests skip
[186]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc:
- shard-rkl: NOTRUN -> [SKIP][187] ([i915#1825]) +5 other tests skip
[187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc.html
- shard-dg1: NOTRUN -> [SKIP][188] ([i915#15990] / [i915#8708]) +6 other tests skip
[188]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
- shard-rkl: NOTRUN -> [SKIP][189] ([i915#5439])
[189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-pri-indfb-multidraw:
- shard-tglu-1: NOTRUN -> [SKIP][190] ([i915#15102]) +15 other tests skip
[190]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-pri-indfb-multidraw.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-pri-indfb-draw-mmap-wc:
- shard-dg2: NOTRUN -> [SKIP][191] ([i915#15990]) +4 other tests skip
[191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-scndscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@hdr-farfromfence-mmap-gtt:
- shard-rkl: [PASS][192] -> [SKIP][193] ([i915#15989]) +17 other tests skip
[192]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_frontbuffer_tracking@hdr-farfromfence-mmap-gtt.html
[193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_frontbuffer_tracking@hdr-farfromfence-mmap-gtt.html
* igt@kms_frontbuffer_tracking@hdr-indfb-scaledprimary:
- shard-tglu: NOTRUN -> [SKIP][194] ([i915#15989]) +29 other tests skip
[194]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_frontbuffer_tracking@hdr-indfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@hdr-modesetfrombusy:
- shard-dg1: NOTRUN -> [SKIP][195] ([i915#15989]) +1 other test skip
[195]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@hdr-modesetfrombusy.html
* igt@kms_frontbuffer_tracking@hdr-shrfb-scaledprimary:
- shard-tglu-1: NOTRUN -> [SKIP][196] ([i915#15989]) +10 other tests skip
[196]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_frontbuffer_tracking@hdr-shrfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-mmap-gtt:
- shard-dg1: NOTRUN -> [SKIP][197] ([i915#15104] / [i915#15990]) +1 other test skip
[197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff:
- shard-glk11: NOTRUN -> [SKIP][198] +184 other tests skip
[198]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk11/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt:
- shard-dg2: NOTRUN -> [SKIP][199] ([i915#15991] / [i915#5354]) +3 other tests skip
[199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-cpu:
- shard-glk: NOTRUN -> [SKIP][200] +127 other tests skip
[200]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk8/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-cpu.html
* igt@kms_frontbuffer_tracking@psr-shrfb-scaledprimary:
- shard-tglu: NOTRUN -> [SKIP][201] ([i915#15102]) +51 other tests skip
[201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_frontbuffer_tracking@psr-shrfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-spr-indfb-move:
- shard-rkl: NOTRUN -> [SKIP][202] ([i915#15102]) +55 other tests skip
[202]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-spr-indfb-move.html
* igt@kms_frontbuffer_tracking@psrhdr-2p-primscrn-spr-indfb-onoff:
- shard-dg1: NOTRUN -> [SKIP][203] +14 other tests skip
[203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@psrhdr-2p-primscrn-spr-indfb-onoff.html
* igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-cur-indfb-move:
- shard-rkl: NOTRUN -> [SKIP][204] +108 other tests skip
[204]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-cur-indfb-move.html
- shard-tglu-1: NOTRUN -> [SKIP][205] +38 other tests skip
[205]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-cur-indfb-move.html
* igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-shrfb-plflip-blt:
- shard-dg2: NOTRUN -> [SKIP][206] ([i915#15991]) +4 other tests skip
[206]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_frontbuffer_tracking@psrhdr-2p-scndscrn-shrfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@psrhdr-rgb565-draw-render:
- shard-dg1: NOTRUN -> [SKIP][207] ([i915#15102]) +9 other tests skip
[207]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_frontbuffer_tracking@psrhdr-rgb565-draw-render.html
* igt@kms_hdr@bpc-switch:
- shard-rkl: [PASS][208] -> [SKIP][209] ([i915#16644] / [i915#3555] / [i915#8228])
[208]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_hdr@bpc-switch.html
[209]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_hdr@bpc-switch.html
- shard-tglu: NOTRUN -> [SKIP][210] ([i915#3555] / [i915#8228])
[210]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_hdr@bpc-switch.html
* igt@kms_hdr@bpc-switch-dpms:
- shard-tglu-1: NOTRUN -> [SKIP][211] ([i915#3555] / [i915#8228])
[211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_hdr@bpc-switch-dpms.html
* igt@kms_hdr@brightness-with-hdr:
- shard-rkl: NOTRUN -> [SKIP][212] ([i915#12713] / [i915#16644])
[212]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_hdr@brightness-with-hdr.html
* igt@kms_hdr@static-toggle:
- shard-rkl: NOTRUN -> [SKIP][213] ([i915#16644] / [i915#3555] / [i915#8228]) +1 other test skip
[213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_hdr@static-toggle.html
* igt@kms_joiner@basic-big-joiner:
- shard-rkl: NOTRUN -> [SKIP][214] ([i915#15460])
[214]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_joiner@basic-big-joiner.html
- shard-dg1: NOTRUN -> [SKIP][215] ([i915#15460])
[215]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_joiner@basic-big-joiner.html
- shard-tglu: NOTRUN -> [SKIP][216] ([i915#15460])
[216]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-10/igt@kms_joiner@basic-big-joiner.html
* igt@kms_joiner@invalid-modeset-force-big-joiner:
- shard-tglu-1: NOTRUN -> [SKIP][217] ([i915#15459])
[217]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_joiner@invalid-modeset-force-big-joiner.html
* igt@kms_joiner@invalid-modeset-ultra-joiner:
- shard-tglu: NOTRUN -> [SKIP][218] ([i915#15458])
[218]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_joiner@invalid-modeset-ultra-joiner.html
- shard-dg2: NOTRUN -> [SKIP][219] ([i915#15458])
[219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_joiner@invalid-modeset-ultra-joiner.html
* igt@kms_panel_fitting@legacy:
- shard-rkl: NOTRUN -> [SKIP][220] ([i915#6301])
[220]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_panel_fitting@legacy.html
* igt@kms_pipe_stress@stress-xrgb8888-4tiled:
- shard-tglu: NOTRUN -> [SKIP][221] ([i915#14712])
[221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_pipe_stress@stress-xrgb8888-4tiled.html
* igt@kms_plane@pixel-format-4-tiled-dg2-mc-ccs-modifier-source-clamping:
- shard-dg1: NOTRUN -> [SKIP][222] ([i915#15709])
[222]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_plane@pixel-format-4-tiled-dg2-mc-ccs-modifier-source-clamping.html
* igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier-source-clamping:
- shard-tglu: NOTRUN -> [SKIP][223] ([i915#15709]) +2 other tests skip
[223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier-source-clamping.html
* igt@kms_plane@pixel-format-y-tiled-modifier@pipe-b-plane-7:
- shard-dg1: NOTRUN -> [SKIP][224] ([i915#16386]) +1 other test skip
[224]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_plane@pixel-format-y-tiled-modifier@pipe-b-plane-7.html
* igt@kms_plane@pixel-format-yf-tiled-ccs-modifier-source-clamping:
- shard-dg2: NOTRUN -> [SKIP][225] ([i915#15709])
[225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_plane@pixel-format-yf-tiled-ccs-modifier-source-clamping.html
* igt@kms_plane@pixel-format-yf-tiled-modifier:
- shard-rkl: NOTRUN -> [SKIP][226] ([i915#15709]) +5 other tests skip
[226]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_plane@pixel-format-yf-tiled-modifier.html
* igt@kms_plane@pixel-format-yf-tiled-modifier-source-clamping:
- shard-tglu-1: NOTRUN -> [SKIP][227] ([i915#15709]) +2 other tests skip
[227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_plane@pixel-format-yf-tiled-modifier-source-clamping.html
* igt@kms_plane_cursor@viewport@pipe-a-hdmi-a-1-size-128:
- shard-rkl: NOTRUN -> [FAIL][228] ([i915#15913]) +1 other test fail
[228]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_plane_cursor@viewport@pipe-a-hdmi-a-1-size-128.html
* igt@kms_plane_cursor@viewport@pipe-a-hdmi-a-1-size-64:
- shard-rkl: NOTRUN -> [FAIL][229] ([i915#15912])
[229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_plane_cursor@viewport@pipe-a-hdmi-a-1-size-64.html
* igt@kms_plane_multiple@2x-tiling-4:
- shard-rkl: NOTRUN -> [SKIP][230] ([i915#13958]) +1 other test skip
[230]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_plane_multiple@2x-tiling-4.html
* igt@kms_plane_multiple@2x-tiling-none:
- shard-tglu-1: NOTRUN -> [SKIP][231] ([i915#13958])
[231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_plane_multiple@2x-tiling-none.html
* igt@kms_plane_multiple@2x-tiling-x:
- shard-dg2: NOTRUN -> [SKIP][232] ([i915#13958])
[232]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_plane_multiple@2x-tiling-x.html
* igt@kms_plane_multiple@tiling-yf:
- shard-tglu: NOTRUN -> [SKIP][233] ([i915#14259])
[233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_plane_multiple@tiling-yf.html
* igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a:
- shard-tglu: NOTRUN -> [SKIP][234] ([i915#15329]) +4 other tests skip
[234]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a.html
* igt@kms_pm_backlight@brightness-with-dpms:
- shard-dg2: NOTRUN -> [SKIP][235] ([i915#12343])
[235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_pm_backlight@brightness-with-dpms.html
- shard-tglu: NOTRUN -> [SKIP][236] ([i915#12343])
[236]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_pm_backlight@brightness-with-dpms.html
* igt@kms_pm_backlight@fade-with-dpms:
- shard-tglu: NOTRUN -> [SKIP][237] ([i915#12343] / [i915#9812]) +1 other test skip
[237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_pm_backlight@fade-with-dpms.html
* igt@kms_pm_backlight@fade-with-suspend:
- shard-rkl: NOTRUN -> [SKIP][238] ([i915#12343] / [i915#5354]) +1 other test skip
[238]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_pm_backlight@fade-with-suspend.html
* igt@kms_pm_dc@dc5-retention-flops:
- shard-tglu-1: NOTRUN -> [SKIP][239] ([i915#3828])
[239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_pm_dc@dc5-retention-flops.html
* igt@kms_pm_dc@dc6-dpms:
- shard-rkl: NOTRUN -> [FAIL][240] ([i915#16479])
[240]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_pm_dc@dc6-dpms.html
- shard-tglu: NOTRUN -> [FAIL][241] ([i915#16479])
[241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_pm_dc@dc6-dpms.html
* igt@kms_pm_lpsp@kms-lpsp:
- shard-dg1: NOTRUN -> [SKIP][242] ([i915#9340])
[242]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_pm_lpsp@kms-lpsp.html
* igt@kms_pm_rpm@dpms-mode-unset-lpsp:
- shard-rkl: [PASS][243] -> [SKIP][244] ([i915#15073])
[243]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-2/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html
[244]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html
* igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
- shard-dg1: [PASS][245] -> [SKIP][246] ([i915#15073])
[245]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-19/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
[246]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-14/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
* igt@kms_pm_rpm@dpms-non-lpsp:
- shard-tglu: NOTRUN -> [SKIP][247] ([i915#15073]) +1 other test skip
[247]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_pm_rpm@dpms-non-lpsp.html
* igt@kms_pm_rpm@fences:
- shard-dg1: NOTRUN -> [SKIP][248] ([i915#4077]) +3 other tests skip
[248]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_pm_rpm@fences.html
* igt@kms_pm_rpm@modeset-non-lpsp-stress:
- shard-rkl: NOTRUN -> [SKIP][249] ([i915#15073]) +1 other test skip
[249]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_pm_rpm@modeset-non-lpsp-stress.html
* igt@kms_pm_rpm@system-suspend-idle:
- shard-rkl: [PASS][250] -> [INCOMPLETE][251] ([i915#14419])
[250]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-8/igt@kms_pm_rpm@system-suspend-idle.html
[251]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-4/igt@kms_pm_rpm@system-suspend-idle.html
* igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-sf:
- shard-dg2: NOTRUN -> [SKIP][252] ([i915#11520]) +1 other test skip
[252]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-sf.html
* igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf:
- shard-tglu: NOTRUN -> [SKIP][253] ([i915#11520]) +9 other tests skip
[253]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_psr2_sf@fbc-pr-cursor-plane-update-sf.html
* igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area:
- shard-tglu-1: NOTRUN -> [SKIP][254] ([i915#11520]) +1 other test skip
[254]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html
* igt@kms_psr2_sf@fbc-pr-primary-plane-update-sf-dmg-area:
- shard-rkl: NOTRUN -> [SKIP][255] ([i915#11520]) +9 other tests skip
[255]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_psr2_sf@fbc-pr-primary-plane-update-sf-dmg-area.html
* igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
- shard-dg1: NOTRUN -> [SKIP][256] ([i915#11520]) +2 other tests skip
[256]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf.html
* igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf:
- shard-glk: NOTRUN -> [SKIP][257] ([i915#11520]) +1 other test skip
[257]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-sf.html
* igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-exceed-fully-sf:
- shard-glk11: NOTRUN -> [SKIP][258] ([i915#11520]) +3 other tests skip
[258]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk11/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-exceed-fully-sf.html
* igt@kms_psr2_su@page_flip-xrgb8888:
- shard-tglu: NOTRUN -> [SKIP][259] ([i915#9683])
[259]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_psr2_su@page_flip-xrgb8888.html
* igt@kms_psr@pr-primary-blt:
- shard-dg2: NOTRUN -> [SKIP][260] ([i915#1072] / [i915#9732]) +5 other tests skip
[260]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_psr@pr-primary-blt.html
* igt@kms_psr@psr-cursor-mmap-cpu:
- shard-dg1: NOTRUN -> [SKIP][261] ([i915#1072] / [i915#9732]) +4 other tests skip
[261]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_psr@psr-cursor-mmap-cpu.html
* igt@kms_psr@psr2-cursor-mmap-gtt:
- shard-rkl: NOTRUN -> [SKIP][262] ([i915#1072] / [i915#9732]) +28 other tests skip
[262]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_psr@psr2-cursor-mmap-gtt.html
* igt@kms_psr@psr2-cursor-plane-onoff:
- shard-tglu: NOTRUN -> [SKIP][263] ([i915#9732]) +21 other tests skip
[263]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@kms_psr@psr2-cursor-plane-onoff.html
* igt@kms_psr@psr2-sprite-mmap-gtt:
- shard-tglu-1: NOTRUN -> [SKIP][264] ([i915#9732]) +7 other tests skip
[264]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_psr@psr2-sprite-mmap-gtt.html
* igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
- shard-tglu: NOTRUN -> [SKIP][265] ([i915#15949])
[265]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
* igt@kms_rotation_crc@multiplane-rotation:
- shard-glk: NOTRUN -> [INCOMPLETE][266] ([i915#15492] / [i915#16184])
[266]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@kms_rotation_crc@multiplane-rotation.html
* igt@kms_rotation_crc@primary-4-tiled-reflect-x-180:
- shard-tglu: NOTRUN -> [SKIP][267] ([i915#5289]) +1 other test skip
[267]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-7/igt@kms_rotation_crc@primary-4-tiled-reflect-x-180.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-tglu-1: NOTRUN -> [SKIP][268] ([i915#5289]) +1 other test skip
[268]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html
* igt@kms_setmode@clone-exclusive-crtc:
- shard-tglu-1: NOTRUN -> [SKIP][269] ([i915#3555])
[269]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_setmode@clone-exclusive-crtc.html
* igt@kms_setmode@invalid-clone-exclusive-crtc:
- shard-dg1: NOTRUN -> [SKIP][270] ([i915#3555]) +1 other test skip
[270]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-18/igt@kms_setmode@invalid-clone-exclusive-crtc.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-glk11: NOTRUN -> [FAIL][271] ([i915#10959])
[271]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk11/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-tglu-1: NOTRUN -> [SKIP][272] ([i915#8623])
[272]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
* igt@kms_vrr@max-min:
- shard-dg2: NOTRUN -> [SKIP][273] ([i915#9906])
[273]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_vrr@max-min.html
- shard-tglu: NOTRUN -> [SKIP][274] ([i915#9906]) +1 other test skip
[274]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-3/igt@kms_vrr@max-min.html
* igt@kms_vrr@seamless-rr-switch-vrr:
- shard-rkl: NOTRUN -> [SKIP][275] ([i915#9906])
[275]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@kms_vrr@seamless-rr-switch-vrr.html
* igt@perf@per-context-mode-unprivileged:
- shard-rkl: NOTRUN -> [SKIP][276] ([i915#2435])
[276]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@perf@per-context-mode-unprivileged.html
* igt@perf_pmu@busy-double-start:
- shard-mtlp: [PASS][277] -> [FAIL][278] ([i915#4349]) +2 other tests fail
[277]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-mtlp-3/igt@perf_pmu@busy-double-start.html
[278]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-mtlp-5/igt@perf_pmu@busy-double-start.html
* igt@perf_pmu@module-unload:
- shard-glk: NOTRUN -> [ABORT][279] ([i915#15778])
[279]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@perf_pmu@module-unload.html
- shard-tglu-1: NOTRUN -> [ABORT][280] ([i915#13029] / [i915#15778])
[280]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@perf_pmu@module-unload.html
* igt@perf_pmu@rc6@other-idle-gt0:
- shard-tglu-1: NOTRUN -> [SKIP][281] ([i915#8516])
[281]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-1/igt@perf_pmu@rc6@other-idle-gt0.html
* igt@prime_udl@share-import:
- shard-rkl: NOTRUN -> [SKIP][282] ([i915#16420])
[282]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@prime_udl@share-import.html
- shard-tglu: NOTRUN -> [SKIP][283] ([i915#16420]) +1 other test skip
[283]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-5/igt@prime_udl@share-import.html
* igt@prime_vgem@basic-write:
- shard-rkl: NOTRUN -> [SKIP][284] ([i915#3291] / [i915#3708])
[284]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@prime_vgem@basic-write.html
#### Possible fixes ####
* igt@gem_eio@hibernate:
- shard-rkl: [ABORT][285] ([i915#7975]) -> [PASS][286]
[285]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-1/igt@gem_eio@hibernate.html
[286]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@gem_eio@hibernate.html
* igt@gem_eio@in-flight-suspend:
- shard-dg2: [ABORT][287] ([i915#16784]) -> [PASS][288]
[287]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg2-8/igt@gem_eio@in-flight-suspend.html
[288]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@gem_eio@in-flight-suspend.html
* igt@gem_workarounds@suspend-resume-fd:
- shard-rkl: [INCOMPLETE][289] ([i915#13356]) -> [PASS][290] +1 other test pass
[289]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@gem_workarounds@suspend-resume-fd.html
[290]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@gem_workarounds@suspend-resume-fd.html
* igt@i915_suspend@fence-restore-untiled:
- shard-glk: [INCOMPLETE][291] ([i915#16182] / [i915#4817]) -> [PASS][292]
[291]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-glk8/igt@i915_suspend@fence-restore-untiled.html
[292]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk2/igt@i915_suspend@fence-restore-untiled.html
* igt@i915_suspend@sysfs-reader:
- shard-rkl: [INCOMPLETE][293] ([i915#4817]) -> [PASS][294]
[293]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@i915_suspend@sysfs-reader.html
[294]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-2/igt@i915_suspend@sysfs-reader.html
* igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1:
- shard-glk: [FAIL][295] ([i915#14888]) -> [PASS][296] +1 other test pass
[295]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-glk3/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1.html
[296]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk5/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-1.html
* igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-4:
- shard-dg1: [FAIL][297] ([i915#14888]) -> [PASS][298] +1 other test pass
[297]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-17/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-4.html
[298]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-19/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-4.html
* igt@kms_cursor_crc@cursor-onscreen-64x21@pipe-a-hdmi-a-1:
- shard-tglu: [FAIL][299] ([i915#13566]) -> [PASS][300] +1 other test pass
[299]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-tglu-5/igt@kms_cursor_crc@cursor-onscreen-64x21@pipe-a-hdmi-a-1.html
[300]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_cursor_crc@cursor-onscreen-64x21@pipe-a-hdmi-a-1.html
* igt@kms_flip@dpms-vs-vblank-race-interruptible@d-hdmi-a1:
- shard-tglu: [ABORT][301] ([i915#16866] / [i915#16876]) -> [PASS][302]
[301]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-tglu-5/igt@kms_flip@dpms-vs-vblank-race-interruptible@d-hdmi-a1.html
[302]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_flip@dpms-vs-vblank-race-interruptible@d-hdmi-a1.html
* igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a3:
- shard-dg2: [FAIL][303] ([i915#10826]) -> [PASS][304] +1 other test pass
[303]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg2-1/igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a3.html
[304]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-6/igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a3.html
* igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@d-hdmi-a1:
- shard-tglu: [ABORT][305] ([i915#16876]) -> [PASS][306] +2 other tests pass
[305]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-tglu-8/igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@d-hdmi-a1.html
[306]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-10/igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible@d-hdmi-a1.html
* igt@kms_flip@flip-vs-expired-vblank:
- shard-glk: [FAIL][307] ([i915#13027]) -> [PASS][308] +1 other test pass
[307]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-glk9/igt@kms_flip@flip-vs-expired-vblank.html
[308]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk4/igt@kms_flip@flip-vs-expired-vblank.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-rkl: [INCOMPLETE][309] ([i915#16276] / [i915#6113]) -> [PASS][310]
[309]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-3/igt@kms_flip@flip-vs-suspend-interruptible.html
[310]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_flip@wf_vblank-ts-check:
- shard-tglu: [FAIL][311] ([i915#14600]) -> [PASS][312] +1 other test pass
[311]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-tglu-5/igt@kms_flip@wf_vblank-ts-check.html
[312]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-tglu-8/igt@kms_flip@wf_vblank-ts-check.html
* igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-indfb-draw-mmap-gtt:
- shard-rkl: [SKIP][313] ([i915#15989]) -> [PASS][314] +12 other tests pass
[313]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-indfb-draw-mmap-gtt.html
[314]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-1/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-indfb-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-shrfb-draw-mmap-cpu:
- shard-glk: [SKIP][315] -> [PASS][316] +3 other tests pass
[315]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-glk2/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-shrfb-draw-mmap-cpu.html
[316]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-glk8/igt@kms_frontbuffer_tracking@fbchdr-1p-primscrn-pri-shrfb-draw-mmap-cpu.html
* igt@kms_hdr@invalid-metadata-sizes:
- shard-rkl: [SKIP][317] ([i915#16644] / [i915#3555] / [i915#8228]) -> [PASS][318]
[317]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_hdr@invalid-metadata-sizes.html
[318]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_hdr@invalid-metadata-sizes.html
* igt@kms_pipe_crc_basic@suspend-read-crc:
- shard-rkl: [INCOMPLETE][319] ([i915#12756] / [i915#13476]) -> [PASS][320]
[319]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_pipe_crc_basic@suspend-read-crc.html
[320]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_pipe_crc_basic@suspend-read-crc.html
* igt@kms_pm_rpm@modeset-lpsp-stress:
- shard-rkl: [SKIP][321] ([i915#15073]) -> [PASS][322] +1 other test pass
[321]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-3/igt@kms_pm_rpm@modeset-lpsp-stress.html
[322]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_pm_rpm@modeset-lpsp-stress.html
* igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
- shard-dg1: [SKIP][323] ([i915#15073]) -> [PASS][324]
[323]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-14/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html
[324]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-12/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html
* igt@kms_pm_rpm@system-suspend-idle:
- shard-dg2: [INCOMPLETE][325] ([i915#14419]) -> [PASS][326]
[325]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg2-7/igt@kms_pm_rpm@system-suspend-idle.html
[326]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg2-7/igt@kms_pm_rpm@system-suspend-idle.html
#### Warnings ####
* igt@gem_eio@kms:
- shard-rkl: [ABORT][327] ([i915#16837]) -> [ABORT][328] ([i915#16837] / [i915#16931])
[327]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-3/igt@gem_eio@kms.html
[328]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-8/igt@gem_eio@kms.html
- shard-dg1: [ABORT][329] ([i915#16837] / [i915#16912] / [i915#16931]) -> [ABORT][330] ([i915#16837] / [i915#16931])
[329]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-17/igt@gem_eio@kms.html
[330]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-19/igt@gem_eio@kms.html
* igt@gem_exec_balancer@parallel-balancer:
- shard-rkl: [SKIP][331] ([i915#4525]) -> [SKIP][332] ([i915#14544] / [i915#4525])
[331]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gem_exec_balancer@parallel-balancer.html
[332]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_exec_balancer@parallel-balancer.html
* igt@gem_exec_capture@capture-invisible@smem0:
- shard-rkl: [SKIP][333] ([i915#6334]) -> [SKIP][334] ([i915#14544] / [i915#6334]) +1 other test skip
[333]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gem_exec_capture@capture-invisible@smem0.html
[334]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_exec_capture@capture-invisible@smem0.html
* igt@gem_exec_capture@capture-recoverable:
- shard-rkl: [SKIP][335] ([i915#14544] / [i915#6344]) -> [SKIP][336] ([i915#6344])
[335]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@gem_exec_capture@capture-recoverable.html
[336]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@gem_exec_capture@capture-recoverable.html
* igt@gem_exec_reloc@basic-gtt-wc-noreloc:
- shard-rkl: [SKIP][337] ([i915#3281]) -> [SKIP][338] ([i915#14544] / [i915#3281]) +5 other tests skip
[337]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html
[338]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html
* igt@gem_exec_reloc@basic-write-read-active:
- shard-rkl: [SKIP][339] ([i915#14544] / [i915#3281]) -> [SKIP][340] ([i915#3281])
[339]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@gem_exec_reloc@basic-write-read-active.html
[340]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@gem_exec_reloc@basic-write-read-active.html
* igt@gem_exec_schedule@semaphore-power:
- shard-rkl: [SKIP][341] ([i915#7276]) -> [SKIP][342] ([i915#14544] / [i915#7276])
[341]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@gem_exec_schedule@semaphore-power.html
[342]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_exec_schedule@semaphore-power.html
* igt@gem_lmem_swapping@parallel-random-verify:
- shard-rkl: [SKIP][343] ([i915#14544] / [i915#4613]) -> [SKIP][344] ([i915#4613]) +1 other test skip
[343]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@gem_lmem_swapping@parallel-random-verify.html
[344]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@gem_lmem_swapping@parallel-random-verify.html
* igt@gem_set_tiling_vs_blt@tiled-to-untiled:
- shard-rkl: [SKIP][345] ([i915#8411]) -> [SKIP][346] ([i915#14544] / [i915#8411])
[345]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html
[346]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html
* igt@gem_tiled_partial_pwrite_pread@reads:
- shard-rkl: [SKIP][347] ([i915#3282]) -> [SKIP][348] ([i915#14544] / [i915#3282]) +2 other tests skip
[347]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@gem_tiled_partial_pwrite_pread@reads.html
[348]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_tiled_partial_pwrite_pread@reads.html
* igt@gem_userptr_blits@unsync-unmap-after-close:
- shard-rkl: [SKIP][349] ([i915#3297]) -> [SKIP][350] ([i915#14544] / [i915#3297])
[349]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gem_userptr_blits@unsync-unmap-after-close.html
[350]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gem_userptr_blits@unsync-unmap-after-close.html
* igt@gen9_exec_parse@bb-start-far:
- shard-rkl: [SKIP][351] ([i915#2527]) -> [SKIP][352] ([i915#14544] / [i915#2527]) +1 other test skip
[351]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gen9_exec_parse@bb-start-far.html
[352]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gen9_exec_parse@bb-start-far.html
* igt@gen9_exec_parse@unaligned-jump:
- shard-rkl: [SKIP][353] ([i915#14544] / [i915#2527]) -> [SKIP][354] ([i915#2527]) +1 other test skip
[353]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@gen9_exec_parse@unaligned-jump.html
[354]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@gen9_exec_parse@unaligned-jump.html
* igt@gpu_buddy@gpu_buddy:
- shard-rkl: [SKIP][355] ([i915#15678]) -> [SKIP][356] ([i915#14544] / [i915#15678])
[355]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@gpu_buddy@gpu_buddy.html
[356]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@gpu_buddy@gpu_buddy.html
* igt@i915_pm_freq_api@freq-reset:
- shard-rkl: [SKIP][357] ([i915#8399]) -> [SKIP][358] ([i915#14544] / [i915#8399])
[357]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@i915_pm_freq_api@freq-reset.html
[358]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@i915_pm_freq_api@freq-reset.html
* igt@i915_query@query-topology-unsupported:
- shard-rkl: [SKIP][359] ([i915#16079]) -> [SKIP][360] ([i915#14544] / [i915#16079])
[359]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@i915_query@query-topology-unsupported.html
[360]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@i915_query@query-topology-unsupported.html
* igt@intel_hwmon@hwmon-read:
- shard-rkl: [SKIP][361] ([i915#7707]) -> [SKIP][362] ([i915#14544] / [i915#7707])
[361]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@intel_hwmon@hwmon-read.html
[362]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@intel_hwmon@hwmon-read.html
* igt@kms_big_fb@4-tiled-addfb:
- shard-rkl: [SKIP][363] ([i915#5286]) -> [SKIP][364] ([i915#14544] / [i915#5286]) +2 other tests skip
[363]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_big_fb@4-tiled-addfb.html
[364]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_big_fb@4-tiled-addfb.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-rkl: [SKIP][365] ([i915#14544] / [i915#5286]) -> [SKIP][366] ([i915#5286]) +1 other test skip
[365]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
[366]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-5/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
* igt@kms_big_fb@x-tiled-32bpp-rotate-270:
- shard-rkl: [SKIP][367] ([i915#3638]) -> [SKIP][368] ([i915#14544] / [i915#3638]) +1 other test skip
[367]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html
[368]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html
* igt@kms_big_fb@y-tiled-8bpp-rotate-90:
- shard-rkl: [SKIP][369] ([i915#14544] / [i915#3638]) -> [SKIP][370] ([i915#3638]) +1 other test skip
[369]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_big_fb@y-tiled-8bpp-rotate-90.html
[370]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_big_fb@y-tiled-8bpp-rotate-90.html
* igt@kms_big_fb@yf-tiled-16bpp-rotate-270:
- shard-rkl: [SKIP][371] ([i915#14544]) -> [SKIP][372] +31 other tests skip
[371]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_big_fb@yf-tiled-16bpp-rotate-270.html
[372]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_big_fb@yf-tiled-16bpp-rotate-270.html
* igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
- shard-rkl: [SKIP][373] ([i915#12313]) -> [SKIP][374] ([i915#12313] / [i915#14544])
[373]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
[374]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
* igt@kms_ccs@bad-rotation-90-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2:
- shard-rkl: [SKIP][375] ([i915#14544] / [i915#6095]) -> [SKIP][376] ([i915#6095]) +6 other tests skip
[375]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2.html
[376]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2.html
* igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2:
- shard-rkl: [SKIP][377] ([i915#14098] / [i915#6095]) -> [SKIP][378] ([i915#14098] / [i915#14544] / [i915#6095]) +13 other tests skip
[377]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2.html
[378]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2:
- shard-rkl: [SKIP][379] ([i915#14098] / [i915#14544] / [i915#6095]) -> [SKIP][380] ([i915#14098] / [i915#6095]) +7 other tests skip
[379]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2.html
[380]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs@pipe-c-hdmi-a-2.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-2:
- shard-rkl: [SKIP][381] ([i915#6095]) -> [SKIP][382] ([i915#14544] / [i915#6095]) +13 other tests skip
[381]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-2.html
[382]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-a-hdmi-a-2.html
* igt@kms_cdclk@mode-transition-all-outputs:
- shard-rkl: [SKIP][383] ([i915#3742]) -> [SKIP][384] ([i915#14544] / [i915#3742])
[383]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_cdclk@mode-transition-all-outputs.html
[384]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_cdclk@mode-transition-all-outputs.html
* igt@kms_chamelium_audio@dp-audio-after-suspend:
- shard-rkl: [SKIP][385] ([i915#11151]) -> [SKIP][386] ([i915#11151] / [i915#14544])
[385]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_chamelium_audio@dp-audio-after-suspend.html
[386]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_chamelium_audio@dp-audio-after-suspend.html
* igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4:
- shard-rkl: [SKIP][387] ([i915#16471]) -> [SKIP][388] ([i915#14544] / [i915#16471]) +1 other test skip
[387]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4.html
[388]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4.html
* igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k:
- shard-rkl: [SKIP][389] ([i915#11151] / [i915#14544] / [i915#7828]) -> [SKIP][390] ([i915#11151] / [i915#7828]) +2 other tests skip
[389]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k.html
[390]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-non-4k.html
* igt@kms_chamelium_hpd@dp-hpd-fast:
- shard-rkl: [SKIP][391] ([i915#11151] / [i915#7828]) -> [SKIP][392] ([i915#11151] / [i915#14544] / [i915#7828])
[391]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_chamelium_hpd@dp-hpd-fast.html
[392]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_chamelium_hpd@dp-hpd-fast.html
* igt@kms_content_protection@dp-mst-type-0-suspend-resume:
- shard-rkl: [SKIP][393] ([i915#15330]) -> [SKIP][394] ([i915#14544] / [i915#15330])
[393]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_content_protection@dp-mst-type-0-suspend-resume.html
[394]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_content_protection@dp-mst-type-0-suspend-resume.html
* igt@kms_content_protection@mei-interface:
- shard-rkl: [SKIP][395] ([i915#15865]) -> [SKIP][396] ([i915#14544] / [i915#15865]) +1 other test skip
[395]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_content_protection@mei-interface.html
[396]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_content_protection@mei-interface.html
- shard-dg1: [SKIP][397] ([i915#15865]) -> [SKIP][398] ([i915#9433])
[397]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-14/igt@kms_content_protection@mei-interface.html
[398]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-12/igt@kms_content_protection@mei-interface.html
* igt@kms_cursor_crc@cursor-offscreen-512x170:
- shard-rkl: [SKIP][399] ([i915#13049] / [i915#14544]) -> [SKIP][400] ([i915#13049])
[399]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_cursor_crc@cursor-offscreen-512x170.html
[400]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_cursor_crc@cursor-offscreen-512x170.html
* igt@kms_cursor_crc@cursor-onscreen-32x32:
- shard-rkl: [SKIP][401] ([i915#3555]) -> [SKIP][402] ([i915#14544] / [i915#3555]) +3 other tests skip
[401]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_cursor_crc@cursor-onscreen-32x32.html
[402]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_cursor_crc@cursor-onscreen-32x32.html
* igt@kms_cursor_crc@cursor-random-32x32:
- shard-rkl: [SKIP][403] ([i915#14544] / [i915#3555]) -> [SKIP][404] ([i915#3555])
[403]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_cursor_crc@cursor-random-32x32.html
[404]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_cursor_crc@cursor-random-32x32.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
- shard-dg1: [SKIP][405] -> [SKIP][406] ([i915#4423])
[405]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-18/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
[406]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-17/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
* igt@kms_dp_linktrain_fallback@dp-fallback:
- shard-rkl: [SKIP][407] ([i915#16867]) -> [SKIP][408] ([i915#14544] / [i915#16867])
[407]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_dp_linktrain_fallback@dp-fallback.html
[408]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_dp_linktrain_fallback@dp-fallback.html
* igt@kms_dp_linktrain_fallback@dsc-fallback:
- shard-rkl: [SKIP][409] ([i915#13707]) -> [SKIP][410] ([i915#13707] / [i915#14544])
[409]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_dp_linktrain_fallback@dsc-fallback.html
[410]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_dp_linktrain_fallback@dsc-fallback.html
* igt@kms_dsc@dsc-with-bpc:
- shard-rkl: [SKIP][411] ([i915#14544] / [i915#16361]) -> [SKIP][412] ([i915#16361])
[411]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_dsc@dsc-with-bpc.html
[412]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_dsc@dsc-with-bpc.html
* igt@kms_dsc@dsc-with-output-formats-bigjoiner:
- shard-rkl: [SKIP][413] ([i915#16361]) -> [SKIP][414] ([i915#14544] / [i915#16361])
[413]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_dsc@dsc-with-output-formats-bigjoiner.html
[414]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_dsc@dsc-with-output-formats-bigjoiner.html
* igt@kms_flip@2x-flip-vs-fences-interruptible:
- shard-rkl: [SKIP][415] ([i915#14544] / [i915#9934]) -> [SKIP][416] ([i915#9934])
[415]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_flip@2x-flip-vs-fences-interruptible.html
[416]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_flip@2x-flip-vs-fences-interruptible.html
* igt@kms_flip@2x-flip-vs-panning:
- shard-rkl: [SKIP][417] ([i915#9934]) -> [SKIP][418] ([i915#14544] / [i915#9934]) +4 other tests skip
[417]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_flip@2x-flip-vs-panning.html
[418]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_flip@2x-flip-vs-panning.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
- shard-rkl: [SKIP][419] ([i915#15643]) -> [SKIP][420] ([i915#14544] / [i915#15643]) +3 other tests skip
[419]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html
[420]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
- shard-rkl: [SKIP][421] ([i915#14544] / [i915#15643]) -> [SKIP][422] ([i915#15643]) +2 other tests skip
[421]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html
[422]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html
* igt@kms_frontbuffer_tracking@fbchdr-2p-scndscrn-spr-indfb-draw-render:
- shard-rkl: [SKIP][423] -> [SKIP][424] ([i915#14544]) +39 other tests skip
[423]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_frontbuffer_tracking@fbchdr-2p-scndscrn-spr-indfb-draw-render.html
[424]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_frontbuffer_tracking@fbchdr-2p-scndscrn-spr-indfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-wc:
- shard-rkl: [SKIP][425] ([i915#14544] / [i915#1825]) -> [SKIP][426] ([i915#1825]) +2 other tests skip
[425]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-wc.html
[426]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc:
- shard-dg1: [SKIP][427] ([i915#15990] / [i915#4423] / [i915#8708]) -> [SKIP][428] ([i915#15990] / [i915#8708])
[427]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-dg1-19/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html
[428]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-dg1-12/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt:
- shard-rkl: [SKIP][429] ([i915#15102]) -> [SKIP][430] ([i915#14544] / [i915#15102]) +23 other tests skip
[429]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt.html
[430]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-spr-indfb-draw-blt:
- shard-rkl: [SKIP][431] ([i915#14544] / [i915#15102]) -> [SKIP][432] ([i915#15102]) +13 other tests skip
[431]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-spr-indfb-draw-blt.html
[432]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-3/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-spr-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-wc:
- shard-rkl: [SKIP][433] ([i915#1825]) -> [SKIP][434] ([i915#14544] / [i915#1825]) +2 other tests skip
[433]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-wc.html
[434]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_joiner@basic-force-big-joiner:
- shard-rkl: [SKIP][435] ([i915#14544] / [i915#15459]) -> [SKIP][436] ([i915#15459])
[435]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_joiner@basic-force-big-joiner.html
[436]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_joiner@basic-force-big-joiner.html
* igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier:
- shard-rkl: [SKIP][437] ([i915#15709]) -> [SKIP][438] ([i915#14544] / [i915#15709]) +2 other tests skip
[437]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier.html
[438]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_plane@pixel-format-4-tiled-mtl-mc-ccs-modifier.html
* igt@kms_plane@pixel-format-y-tiled-ccs-modifier:
- shard-rkl: [SKIP][439] ([i915#14544] / [i915#15709]) -> [SKIP][440] ([i915#15709]) +1 other test skip
[439]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_plane@pixel-format-y-tiled-ccs-modifier.html
[440]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_plane@pixel-format-y-tiled-ccs-modifier.html
* igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-b:
- shard-rkl: [SKIP][441] ([i915#15329]) -> [SKIP][442] ([i915#14544] / [i915#15329]) +3 other tests skip
[441]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-b.html
[442]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-rotation@pipe-b.html
* igt@kms_pm_backlight@bad-brightness:
- shard-rkl: [SKIP][443] ([i915#12343] / [i915#5354]) -> [SKIP][444] ([i915#12343] / [i915#14544] / [i915#5354])
[443]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_pm_backlight@bad-brightness.html
[444]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_pm_backlight@bad-brightness.html
* igt@kms_pm_dc@dc5-psr-suspend-resume:
- shard-rkl: [SKIP][445] ([i915#16914]) -> [SKIP][446] ([i915#14544] / [i915#16914])
[445]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_pm_dc@dc5-psr-suspend-resume.html
[446]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_pm_dc@dc5-psr-suspend-resume.html
* igt@kms_pm_dc@dc6-psr:
- shard-rkl: [SKIP][447] ([i915#14544] / [i915#15948]) -> [SKIP][448] ([i915#15948])
[447]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_pm_dc@dc6-psr.html
[448]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_pm_dc@dc6-psr.html
* igt@kms_prime@d3hot:
- shard-rkl: [SKIP][449] ([i915#6524]) -> [SKIP][450] ([i915#14544] / [i915#6524])
[449]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-4/igt@kms_prime@d3hot.html
[450]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_prime@d3hot.html
* igt@kms_psr2_sf@pr-overlay-plane-move-continuous-exceed-sf:
- shard-rkl: [SKIP][451] ([i915#11520]) -> [SKIP][452] ([i915#11520] / [i915#14544]) +2 other tests skip
[451]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_psr2_sf@pr-overlay-plane-move-continuous-exceed-sf.html
[452]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_psr2_sf@pr-overlay-plane-move-continuous-exceed-sf.html
* igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-exceed-sf:
- shard-rkl: [SKIP][453] ([i915#11520] / [i915#14544]) -> [SKIP][454] ([i915#11520]) +1 other test skip
[453]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-exceed-sf.html
[454]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-exceed-sf.html
* igt@kms_psr@fbc-psr-cursor-plane-move:
- shard-rkl: [SKIP][455] ([i915#1072] / [i915#9732]) -> [SKIP][456] ([i915#1072] / [i915#14544] / [i915#9732]) +8 other tests skip
[455]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_psr@fbc-psr-cursor-plane-move.html
[456]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_psr@fbc-psr-cursor-plane-move.html
* igt@kms_psr@pr-no-drrs:
- shard-rkl: [SKIP][457] ([i915#1072] / [i915#14544] / [i915#9732]) -> [SKIP][458] ([i915#1072] / [i915#9732]) +5 other tests skip
[457]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_psr@pr-no-drrs.html
[458]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_psr@pr-no-drrs.html
* igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
- shard-rkl: [SKIP][459] ([i915#15949]) -> [SKIP][460] ([i915#14544] / [i915#15949])
[459]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
[460]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
- shard-rkl: [SKIP][461] ([i915#5289]) -> [SKIP][462] ([i915#14544] / [i915#5289])
[461]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
[462]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
- shard-rkl: [SKIP][463] ([i915#14544] / [i915#5289]) -> [SKIP][464] ([i915#5289]) +1 other test skip
[463]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
[464]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-7/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
* igt@kms_vrr@flip-suspend:
- shard-rkl: [SKIP][465] ([i915#15243] / [i915#3555]) -> [SKIP][466] ([i915#14544] / [i915#15243] / [i915#3555])
[465]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19102/shard-rkl-7/igt@kms_vrr@flip-suspend.html
[466]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/shard-rkl-6/igt@kms_vrr@flip-suspend.html
[i915#10056]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10056
[i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
[i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
[i915#10826]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10826
[i915#10959]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10959
[i915#11078]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11078
[i915#11151]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11151
[i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
[i915#12313]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12313
[i915#12314]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12314
[i915#12343]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12343
[i915#12358]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12358
[i915#12454]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12454
[i915#1257]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1257
[i915#12655]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12655
[i915#12712]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12712
[i915#12713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12713
[i915#12745]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12745
[i915#12756]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12756
[i915#12761]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12761
[i915#12805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12805
[i915#13008]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13008
[i915#13027]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13027
[i915#13029]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13029
[i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
[i915#13356]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13356
[i915#13476]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13476
[i915#13566]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13566
[i915#13707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13707
[i915#13748]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13748
[i915#13749]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13749
[i915#13958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13958
[i915#14098]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14098
[i915#14118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14118
[i915#14123]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14123
[i915#14152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14152
[i915#14259]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14259
[i915#14419]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14419
[i915#14544]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14544
[i915#14600]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14600
[i915#14712]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14712
[i915#14888]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14888
[i915#15073]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15073
[i915#15102]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15102
[i915#15104]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15104
[i915#15132]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15132
[i915#15243]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15243
[i915#15329]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15329
[i915#15330]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15330
[i915#15342]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15342
[i915#15458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15458
[i915#15459]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15459
[i915#15460]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15460
[i915#15479]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15479
[i915#15492]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15492
[i915#15643]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15643
[i915#15678]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15678
[i915#15709]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15709
[i915#15733]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15733
[i915#15778]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15778
[i915#15865]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15865
[i915#15912]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15912
[i915#15913]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15913
[i915#15948]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15948
[i915#15949]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15949
[i915#15989]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15989
[i915#15990]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15990
[i915#15991]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15991
[i915#16021]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16021
[i915#16079]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16079
[i915#16080]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16080
[i915#16081]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16081
[i915#16166]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16166
[i915#16168]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16168
[i915#16182]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16182
[i915#16184]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16184
[i915#16276]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16276
[i915#16348]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16348
[i915#16349]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16349
[i915#16361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16361
[i915#16386]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16386
[i915#16420]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16420
[i915#16471]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16471
[i915#16479]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16479
[i915#16644]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16644
[i915#16680]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16680
[i915#16784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16784
[i915#16837]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16837
[i915#16866]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16866
[i915#16867]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16867
[i915#16870]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16870
[i915#16876]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16876
[i915#16912]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16912
[i915#16914]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16914
[i915#16931]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16931
[i915#1769]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1769
[i915#1825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1825
[i915#2190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2190
[i915#2435]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2435
[i915#2527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2527
[i915#280]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/280
[i915#2856]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2856
[i915#3116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3116
[i915#3281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3282
[i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
[i915#3297]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3297
[i915#3299]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3299
[i915#3539]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3539
[i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
[i915#3637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3637
[i915#3638]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3638
[i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
[i915#3742]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3742
[i915#3828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3828
[i915#3936]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3936
[i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
[i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
[i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
[i915#4212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4212
[i915#4349]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4349
[i915#4423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4423
[i915#4525]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4525
[i915#4538]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4538
[i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
[i915#4817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4817
[i915#4839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4839
[i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
[i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
[i915#4881]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4881
[i915#5138]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5138
[i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
[i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
[i915#5289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5289
[i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
[i915#5439]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5439
[i915#5723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5723
[i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
[i915#6113]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6113
[i915#6230]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6230
[i915#6301]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6301
[i915#6334]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6334
[i915#6335]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6335
[i915#6344]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6344
[i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
[i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
[i915#7276]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7276
[i915#7582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7582
[i915#7697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7697
[i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
[i915#7828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7828
[i915#7882]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7882
[i915#7975]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7975
[i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
[i915#8381]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8381
[i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
[i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
[i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
[i915#8516]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8516
[i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
[i915#8562]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8562
[i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
[i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
[i915#8812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8812
[i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
[i915#9340]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9340
[i915#9433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9433
[i915#9531]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9531
[i915#9683]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9683
[i915#9723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9723
[i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
[i915#9812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9812
[i915#9906]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9906
[i915#9934]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9934
[i915#9979]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9979
Build changes
-------------
* Linux: CI_DRM_19102 -> Patchwork_169109v3
CI-20190529: 20190529
CI_DRM_19102: 06602b51786b6c2a0f97e58f0e0f168be1ada27e @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_9085: 9085
Patchwork_169109v3: 06602b51786b6c2a0f97e58f0e0f168be1ada27e @ git://anongit.freedesktop.org/gfx-ci/linux
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_169109v3/index.html
[-- Attachment #2: Type: text/html, Size: 159900 bytes --]
^ permalink raw reply [flat|nested] 31+ messages in thread
end of thread, other threads:[~2026-09-08 18:45 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-08 4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
2026-09-08 4:51 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
2026-09-08 4:52 ` sashiko-bot
2026-09-08 15:45 ` Jani Nikula
2026-09-08 16:00 ` Mario Limonciello
2026-09-08 16:33 ` Jani Nikula
2026-09-08 4:40 ` [PATCH v8 03/14] drm/property: add a per-connector luminance flag Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 15:48 ` Jani Nikula
2026-09-08 4:40 ` [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE Mario Limonciello
2026-09-08 4:55 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 06/14] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 07/14] drm/amd: Indicate driver supports luminance Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 08/14] drm/amd/display: use drm backlight Mario Limonciello
2026-09-08 4:57 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello
2026-09-08 4:51 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures Mario Limonciello
2026-09-08 4:54 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 11/14] drm/bridge: auto-link panel backlight in bridge connector Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector Mario Limonciello
2026-09-08 4:57 ` sashiko-bot
2026-09-08 4:40 ` [PATCH v8 13/14] drm/i915: " Mario Limonciello
2026-09-08 4:40 ` [PATCH v8 14/14] drm/i915/display: use drm backlight Mario Limonciello
2026-09-08 5:03 ` sashiko-bot
2026-09-08 9:32 ` ✓ i915.CI.BAT: success for Add support for a DRM backlight capability (rev3) Patchwork
2026-09-08 18:45 ` ✗ i915.CI.Full: failure " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox