* [PATCH v11 01/12] drm: add connector LUMINANCE property
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 02/12] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello (AMD)
` (13 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Panel brightness is a property of a display, and thus of a DRM
connector. Add an atomic per-connector LUMINANCE range property so
compositors can manage relative panel luminance together with the rest
of the display state.
Keep the core backend-agnostic. Drivers create the property with their
hardware range and implement connector helper callbacks to set luminance
or disable panel emission. The atomic helpers sequence those callbacks
around pipeline enable and disable, including luminance-only commits.
The panel is left lit when the pipeline enters self refresh, and the
luminance is only reprogrammed when it changes or a modeset enables the
pipeline.
The stored property value is independent of display power. A commit made
while the connector is inactive is retained and applied on the next
enable; disabling the pipeline does not overwrite it.
LUMINANCE values are relative, driver-defined levels rather than
absolute luminance in cd/m^2. The interface supports emissive panels as
well as panels with a separate backlight.
Keep the interface behind a default-off DRM_LUMINANCE option. Migrated
drivers retain their legacy backlight class ABI unless the new interface
is explicitly selected, allowing the DRM UAPI and legacy compatibility
policy to remain separate.
Acked-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Don't call .disable_luminance when the CRTC enters self refresh (Sashiko)
* Only call .set_luminance when the luminance changes or on a modeset
that isn't a self refresh exit (Leo Li, Sashiko)
* Fix the .set_luminance self refresh documentation
v10:
* Add tag
---
drivers/gpu/drm/Kconfig | 14 +++++
drivers/gpu/drm/drm_atomic_helper.c | 98 +++++++++++++++++++++++++++++-
drivers/gpu/drm/drm_atomic_state_helper.c | 7 +++
drivers/gpu/drm/drm_atomic_uapi.c | 5 ++
drivers/gpu/drm/drm_connector.c | 57 +++++++++++++++++
drivers/gpu/drm/tests/drm_connector_test.c | 28 +++++++++
include/drm/drm_atomic_helper.h | 3 +
include/drm/drm_connector.h | 16 +++++
include/drm/drm_modeset_helper_vtables.h | 28 +++++++++
9 files changed, 255 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 61111d50b1c65..1bbe2c2d7c76f 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -33,6 +33,20 @@ endmenu
if DRM
+config DRM_LUMINANCE
+ bool "DRM connector luminance support"
+ help
+ Expose relative luminance as an atomic DRM connector property. Values
+ are driver-defined levels rather than absolute luminance in cd/m^2.
+ Drivers provide connector helper callbacks to program their hardware;
+ the DRM core does not depend on a particular backend.
+
+ Drivers migrated to this interface will use it instead of registering
+ a legacy backlight class device. Leave this disabled to preserve the
+ de-facto userspace ABI in /sys/class/backlight.
+
+ If in doubt, say N.
+
config DRM_MIPI_DBI
tristate
depends on DRM
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 9d006f98413a5..856abc91ec53d 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -1375,6 +1375,8 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_encoder_bridge_post_disable);
static void
disable_outputs(struct drm_device *dev, struct drm_atomic_commit *state)
{
+ drm_atomic_helper_commit_luminance_disables(state);
+
drm_atomic_helper_commit_encoder_bridge_disable(dev, state);
drm_atomic_helper_commit_encoder_bridge_post_disable(dev, state);
@@ -1382,6 +1384,54 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_commit *state)
drm_atomic_helper_commit_crtc_disable(dev, state);
}
+/**
+ * drm_atomic_helper_commit_luminance_disables - disable panel emission
+ * @state: atomic state object being committed
+ *
+ * Invokes each connector driver's luminance disable callback before a
+ * display pipeline is disabled. The callback is not invoked when the pipeline
+ * enters self refresh, since the panel keeps displaying the last frame. The
+ * connector property's stored value is left untouched so it can be restored
+ * when the pipeline is enabled again.
+ */
+void drm_atomic_helper_commit_luminance_disables(struct drm_atomic_commit *state)
+{
+ struct drm_connector_state *old_conn_state, *new_conn_state;
+ struct drm_connector *connector;
+ int i;
+
+ for_each_oldnew_connector_in_state(state, connector, old_conn_state,
+ new_conn_state, i) {
+ const struct drm_connector_helper_funcs *funcs;
+ struct drm_crtc_state *old_crtc_state, *new_crtc_state = NULL;
+
+ if (!connector->luminance_property || !old_conn_state->crtc)
+ continue;
+
+ old_crtc_state =
+ drm_atomic_get_old_crtc_state(state, old_conn_state->crtc);
+ if (new_conn_state->crtc)
+ new_crtc_state =
+ drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
+
+ if (!crtc_needs_disable(old_crtc_state, new_crtc_state) ||
+ !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
+ continue;
+
+ /*
+ * Keep the panel lit while entering self refresh, matching the
+ * panel bridge which also leaves the panel enabled.
+ */
+ if (new_crtc_state && new_crtc_state->self_refresh_active)
+ continue;
+
+ funcs = connector->helper_private;
+ if (funcs && funcs->disable_luminance)
+ funcs->disable_luminance(old_conn_state);
+ }
+}
+EXPORT_SYMBOL(drm_atomic_helper_commit_luminance_disables);
+
/**
* drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
* @dev: DRM device
@@ -1771,10 +1821,57 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
drm_atomic_helper_commit_encoder_bridge_enable(dev, state);
+ drm_atomic_helper_commit_luminance_enables(state);
+
drm_atomic_helper_commit_writebacks(dev, state);
}
EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
+/**
+ * drm_atomic_helper_commit_luminance_enables - apply luminance
+ * @state: atomic state object being committed
+ *
+ * Invokes each connector driver's luminance callback after the display
+ * pipeline has been enabled by a modeset, and for commits changing the
+ * luminance while the connector remains active. Commits that don't change
+ * the luminance only invoke the callback for a modeset other than a self
+ * refresh exit, since the panel is kept lit during self refresh. Changes
+ * committed while the connector is inactive remain stored in atomic state
+ * until a later enable.
+ */
+void drm_atomic_helper_commit_luminance_enables(struct drm_atomic_commit *state)
+{
+ struct drm_connector_state *old_conn_state, *new_conn_state;
+ struct drm_connector *connector;
+ int i;
+
+ for_each_oldnew_connector_in_state(state, connector, old_conn_state,
+ new_conn_state, i) {
+ const struct drm_connector_helper_funcs *funcs;
+ struct drm_crtc_state *old_crtc_state, *new_crtc_state;
+
+ if (!connector->luminance_property || !new_conn_state->crtc)
+ continue;
+
+ old_crtc_state =
+ drm_atomic_get_old_crtc_state(state, new_conn_state->crtc);
+ new_crtc_state =
+ drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
+ if (!new_crtc_state->active)
+ continue;
+
+ if (old_conn_state->luminance == new_conn_state->luminance &&
+ (!drm_atomic_crtc_needs_modeset(new_crtc_state) ||
+ old_crtc_state->self_refresh_active))
+ continue;
+
+ funcs = connector->helper_private;
+ if (funcs && funcs->set_luminance)
+ funcs->set_luminance(new_conn_state);
+ }
+}
+EXPORT_SYMBOL(drm_atomic_helper_commit_luminance_enables);
+
/*
* For atomic updates which touch just a single CRTC, calculate the time of the
* next vblank, and inform all the fences of the deadline.
@@ -4187,4 +4284,3 @@ drm_atomic_helper_bridge_get_hdmi_output_bus_fmts(struct drm_bridge *bridge,
return out_fmts;
}
EXPORT_SYMBOL(drm_atomic_helper_bridge_get_hdmi_output_bus_fmts);
-
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index 3534925636d54..bc26683db52c3 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -408,7 +408,14 @@ void
__drm_atomic_helper_connector_state_init(struct drm_connector_state *conn_state,
struct drm_connector *connector)
{
+ u64 value;
+
conn_state->connector = connector;
+ if (connector->luminance_property &&
+ !drm_object_property_get_default_value(&connector->base,
+ connector->luminance_property,
+ &value))
+ conn_state->luminance = value;
}
EXPORT_SYMBOL(__drm_atomic_helper_connector_state_init);
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 1eebcf6f5e05b..dffc51cd8d13c 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -30,6 +30,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_atomic_uapi.h>
+#include <drm/drm_connector.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_print.h>
#include <drm/drm_drv.h>
@@ -969,6 +970,8 @@ 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) {
+ state->luminance = val;
} else if (connector->funcs->atomic_set_property) {
return connector->funcs->atomic_set_property(connector,
state, property, val);
@@ -1056,6 +1059,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);
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 893716a9e4895..ab75e8bd9991a 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -810,6 +810,47 @@ void drm_connector_attach_edid_property(struct drm_connector *connector)
}
EXPORT_SYMBOL(drm_connector_attach_edid_property);
+/**
+ * drm_connector_attach_luminance_property - attach luminance property
+ * @connector: connector to attach the property to
+ * @min: minimum supported relative brightness
+ * @max: maximum supported relative brightness
+ * @value: initial relative brightness
+ *
+ * Creates the atomic ``LUMINANCE`` range property for @connector.
+ * Drivers should call this during connector initialization. The property's
+ * units are driver-defined; they do not represent absolute luminance.
+ *
+ * Returns:
+ * Zero on success, a negative errno otherwise.
+ */
+int drm_connector_attach_luminance_property(struct drm_connector *connector,
+ unsigned int min,
+ unsigned int max,
+ unsigned int value)
+{
+ struct drm_property *property;
+
+ if (drm_WARN_ON(connector->dev, min > max || value < min || value > max))
+ return -EINVAL;
+
+ if (connector->luminance_property)
+ return 0;
+
+ property = drm_property_create_range(connector->dev, DRM_MODE_PROP_ATOMIC,
+ "LUMINANCE", min, max);
+ if (!property)
+ return -ENOMEM;
+
+ connector->luminance_property = property;
+ drm_object_attach_property(&connector->base, property, value);
+ if (connector->state)
+ connector->state->luminance = value;
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_connector_attach_luminance_property);
+
/**
* drm_connector_attach_encoder - attach a connector to an encoder
* @connector: connector to attach
@@ -1681,6 +1722,22 @@ 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 range property for controlling a panel's relative luminance.
+ * The unit and range are driver-defined and do not represent an absolute
+ * luminance in cd/m^2. This name therefore also applies to emissive panels
+ * that do not contain a separate backlight.
+ *
+ * The property is independent of the connector's display-power state.
+ * Changing it while the connector is inactive stores the new value without
+ * turning the display on. The atomic helpers apply the stored value after
+ * the display pipeline is enabled and invoke a separate driver callback
+ * before disabling the pipeline; neither action changes the property value.
+ *
+ * Drivers create the property with
+ * drm_connector_attach_luminance_property() and implement the
+ * corresponding &drm_connector_helper_funcs callbacks. Connectors that do
+ * not support luminance control do not expose the property.
* 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/tests/drm_connector_test.c b/drivers/gpu/drm/tests/drm_connector_test.c
index 3368aedd4e669..e43692d38ebb8 100644
--- a/drivers/gpu/drm/tests/drm_connector_test.c
+++ b/drivers/gpu/drm/tests/drm_connector_test.c
@@ -137,6 +137,33 @@ static void drm_test_drmm_connector_init_null_ddc(struct kunit *test)
KUNIT_EXPECT_EQ(test, ret, 0);
}
+static void drm_test_connector_attach_luminance_property(struct kunit *test)
+{
+ struct drm_connector_init_priv *priv = test->priv;
+ struct drm_connector *connector = &priv->connector;
+ struct drm_property *property;
+ u64 value;
+ int ret;
+
+ ret = drmm_connector_init(&priv->drm, connector, &dummy_funcs,
+ DRM_MODE_CONNECTOR_eDP, NULL);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+ KUNIT_ASSERT_NULL(test, connector->state);
+
+ ret = drm_connector_attach_luminance_property(connector, 10, 100, 50);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+ property = connector->luminance_property;
+ KUNIT_ASSERT_NOT_NULL(test, property);
+
+ ret = drm_object_property_get_default_value(&connector->base, property, &value);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+ KUNIT_EXPECT_EQ(test, value, (u64)50);
+
+ drm_atomic_helper_connector_reset(connector);
+ KUNIT_ASSERT_NOT_NULL(test, connector->state);
+ KUNIT_EXPECT_EQ(test, connector->state->luminance, 50u);
+}
+
/*
* Test that the registration of a connector succeeds for all possible
* connector types.
@@ -190,6 +217,7 @@ KUNIT_ARRAY_PARAM(drm_connector_init_type_valid,
static struct kunit_case drmm_connector_init_tests[] = {
KUNIT_CASE(drm_test_drmm_connector_init),
KUNIT_CASE(drm_test_drmm_connector_init_null_ddc),
+ KUNIT_CASE(drm_test_connector_attach_luminance_property),
KUNIT_CASE_PARAM(drm_test_drmm_connector_init_type_valid,
drm_connector_init_type_valid_gen_params),
{ }
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index 4cfeec70d648a..3084dd5cd6a1f 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -116,6 +116,9 @@ 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_commit_luminance_disables(struct drm_atomic_commit *state);
+void drm_atomic_helper_commit_luminance_enables(struct drm_atomic_commit *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_connector.h b/include/drm/drm_connector.h
index 2ee7c59329aae..7f7d115b65f9f 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1369,6 +1369,11 @@ struct drm_connector_state {
* @drm_atomic_helper_connector_hdmi_check().
*/
struct drm_connector_hdmi_state hdmi;
+
+ /**
+ * @luminance: Relative panel luminance requested by userspace.
+ */
+ unsigned int luminance;
};
struct drm_connector_hdmi_audio_funcs {
@@ -2714,6 +2719,13 @@ struct drm_connector {
* @cec: CEC-related data.
*/
struct drm_connector_cec cec;
+
+ /**
+ * @luminance_property: Optional atomic range property for relative panel
+ * luminance. Drivers create it with
+ * drm_connector_attach_luminance_property().
+ */
+ struct drm_property *luminance_property;
};
#define obj_to_connector(x) container_of(x, struct drm_connector, base)
@@ -2980,6 +2992,10 @@ const char *drm_get_colorspace_name(enum drm_colorspace colorspace);
int drm_connector_attach_color_format_property(struct drm_connector *connector,
unsigned long supported_color_formats);
+int drm_connector_attach_luminance_property(struct drm_connector *connector,
+ unsigned int min,
+ unsigned int max,
+ unsigned int value);
/**
* drm_for_each_connector_iter - connector_list iterator macro
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index 60b30cc269404..1c614f44de7ca 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1147,6 +1147,34 @@ struct drm_connector_helper_funcs {
void (*atomic_commit)(struct drm_connector *connector,
struct drm_atomic_commit *state);
+ /**
+ * @set_luminance:
+ *
+ * Apply &drm_connector_state.luminance to an active panel. The
+ * atomic helpers call this after a modeset enabled the display
+ * pipeline, and for commits changing the luminance while the connector
+ * remains active. It is not called when the luminance is unchanged,
+ * unless a modeset other than a self refresh exit happened.
+ *
+ * This callback is optional and is only used by connectors exposing the
+ * ``LUMINANCE`` property.
+ */
+ void (*set_luminance)(const struct drm_connector_state *new_state);
+
+ /**
+ * @disable_luminance:
+ *
+ * Turn panel light emission off before disabling the display pipeline.
+ * It is not called when the pipeline enters self refresh.
+ * This callback does not change the ``LUMINANCE`` property; the
+ * stored value is restored through @set_luminance when the panel
+ * is enabled again.
+ *
+ * This callback is optional and is only used by connectors exposing the
+ * ``LUMINANCE`` property.
+ */
+ void (*disable_luminance)(const struct drm_connector_state *old_state);
+
/**
* @prepare_writeback_job:
*
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 02/12] drm/amd/display: Pass up errors reading actual brightness
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 01/12] drm: add connector LUMINANCE property Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 03/12] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello (AMD)
` (12 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
[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 <mario.limonciello@amd.com>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.c | 13 +++++++++----
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_backlight.h | 2 +-
.../amd/display/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 cb74b00723fda..0f664c658a127 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
@@ -438,7 +438,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;
@@ -451,14 +451,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);
}
@@ -469,8 +469,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 9ad888d3ae7b2..891749322191c 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
@@ -57,7 +57,7 @@ void amdgpu_dm_validate_backlight_caps(struct amdgpu_display_manager *dm, int bl
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 28dda5324dfa7..8fc1c2f997688 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.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 03/12] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 01/12] drm: add connector LUMINANCE property Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 02/12] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 04/12] drm/amd: add luminance property support Mario Limonciello (AMD)
` (11 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau
Ensure adev->bios_scratch_reg_offset is non-zero before accessing
scratch registers in amdgpu_atombios_scratch_regs_set_backlight_level(),
so they are not accessed when they were never set up, such as in KUnit
tests.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v11:
* Clarify the commit message
---
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.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 04/12] drm/amd: add luminance property support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (2 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 03/12] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 23:13 ` sashiko-bot
2026-11-03 22:42 ` [PATCH v11 05/12] drm/i915/display: " Mario Limonciello (AMD)
` (10 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose the DRM LUMINANCE connector property for internal panels when
CONFIG_DRM_LUMINANCE is enabled. Keep registering the existing backlight
class device otherwise, preserving its userspace ABI.
Use the existing brightness scaling and programming paths from Display
Core connector helper callbacks. Apply atomic luminance after the display
pipeline is enabled so changes made while a connector is inactive take
effect on the next enable.
The legacy non-DC display path is not atomic, so it keeps registering the
backlight class device. Only attach LUMINANCE when ACPI video selects
native backlight control, otherwise keep the existing acpi_video fallback.
Reapply the cached level after modesets and GPU resets for both
interfaces.
With LUMINANCE, ATIF panel brightness change requests from firmware are
not forwarded, since there is no backlight device to update.
Update the backlight KUnit fixtures to initialise DRM mode configuration,
connector state and link service mocks needed by the LUMINANCE path.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Drop the legacy (non-DC) changes; that path is not atomic and keeps the
backlight class device (Sashiko)
* Only attach LUMINANCE when acpi_video_backlight_use_native() allows it,
otherwise register the class device or acpi_video fallback (Sashiko)
* Restore brightness after GPU reset and modesets for LUMINANCE panels
too, seeding dm->brightness[] with the initial value (Leo Li, Sashiko)
* Skip programming an unchanged luminance to avoid PSR/Replay/IPS exits
(Leo Li, Sashiko)
* Keep selecting BACKLIGHT_CLASS_DEVICE (Sashiko)
* Seed the property from the hardware level rather than the default
* Leave the privacy screen update in commit_tail unchanged
* Squash in "drm/amd/display: update KUnit luminance fixtures" so every
commit passes KUnit, rebased on drm-tip fixture changes (Intel CI)
* Initialise the KUnit test connector with the type matching the link
signal to avoid freeing the ID into the wrong IDA (Sashiko)
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 16 ++---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 7 ++
.../amd/display/amdgpu_dm/amdgpu_dm_backlight.c | 78 +++++++++++++++++++++-
.../amd/display/amdgpu_dm/amdgpu_dm_backlight.h | 3 +
.../amd/display/amdgpu_dm/amdgpu_dm_connector.c | 5 +-
.../amdgpu_dm/tests/amdgpu_dm_backlight_test.c | 68 ++++++++++++++++---
.../amdgpu_dm/tests/amdgpu_dm_kunit_helpers.c | 7 +-
7 files changed, 160 insertions(+), 24 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 56fca4e22df8d..2a9ddd1dc6f70 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1976,10 +1976,7 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
mutex_unlock(&dm->dc_lock);
/* set the backlight after a reset */
- for (i = 0; i < dm->num_of_edps; i++) {
- if (dm->backlight_dev[i])
- amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
- }
+ amdgpu_dm_backlight_restore(dm);
return 0;
}
@@ -4802,12 +4799,8 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_commit *state,
* level. (the dm->brightness is the correct panel level)
* So we set the backlight level with dm->brightness value after set mode
*/
- if (set_backlight_level) {
- for (i = 0; i < dm->num_of_edps; i++) {
- if (dm->backlight_dev[i])
- amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
- }
- }
+ if (set_backlight_level)
+ amdgpu_dm_backlight_restore(dm);
}
STATIC_IFN_KUNIT void
@@ -5413,6 +5406,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state)
/* Update audio instances for each connector. */
amdgpu_dm_commit_audio(dev, state);
+ /* Apply connector luminance after the display pipeline is enabled. */
+ drm_atomic_helper_commit_luminance_enables(state);
+
/* restore the backlight level */
for (i = 0; i < dm->num_of_edps; i++) {
if (dm->backlight_dev[i] &&
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index e4fed8c855abe..2e700cae52b67 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -682,6 +682,13 @@ struct amdgpu_display_manager {
* last successfully applied backlight values.
*/
u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
+ /**
+ * @luminance:
+ *
+ * backlight is controlled through the connector LUMINANCE property
+ * instead of a backlight class device.
+ */
+ bool luminance[AMDGPU_DM_MAX_NUM_EDP];
/**
* @aux_hpd_discon_quirk:
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 0f664c658a127..f61e69bbdf69f 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
@@ -41,6 +41,7 @@
#include <linux/backlight.h>
#include <linux/minmax.h>
#include <linux/power_supply.h>
+#include <drm/drm_connector.h>
#include <drm/drm_edid.h>
#include <drm/drm_panel_quirks.h>
@@ -296,13 +297,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;
}
@@ -356,7 +361,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]);
link = (struct dc_link *)dm->backlight_link[bl_idx];
@@ -657,6 +662,10 @@ 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;
+ struct drm_connector *connector = &aconnector->base;
+ int ret;
if (!(link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) ||
link->type == dc_connection_none)
@@ -675,6 +684,30 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
amdgpu_dm_update_connector_ext_caps(aconnector);
+ /*
+ * The property must exist before the device is registered. If ACPI
+ * video should handle the backlight, leave it to
+ * amdgpu_dm_register_backlight_device() to register the fallback.
+ */
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE) && acpi_video_backlight_use_native()) {
+ 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);
+ /* Start from the level the hardware is actually at */
+ ret = amdgpu_dm_backlight_get_level(dm, bl_idx);
+ if (ret >= 0 && ret <= props.max_brightness)
+ props.brightness = ret;
+ ret = drm_connector_attach_luminance_property(connector, 0,
+ props.max_brightness,
+ props.brightness);
+ if (!drm_WARN_ON(adev_to_drm(dm->adev), ret)) {
+ dm->brightness[bl_idx] = props.brightness;
+ dm->luminance[bl_idx] = true;
+ }
+ }
+
/* 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.
@@ -686,6 +719,45 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
}
EXPORT_IF_KUNIT(amdgpu_dm_setup_backlight_device);
+void amdgpu_dm_set_luminance(const struct drm_connector_state *state)
+{
+ struct amdgpu_dm_connector *aconnector =
+ to_amdgpu_dm_connector(state->connector);
+ struct amdgpu_display_manager *dm =
+ &drm_to_adev(state->connector->dev)->dm;
+
+ int bl_idx = aconnector->bl_idx;
+
+ if (bl_idx < 0)
+ return;
+
+ /* Skip if already applied, e.g. by amdgpu_dm_backlight_restore(). */
+ if (dm->brightness[bl_idx] == state->luminance &&
+ dm->actual_brightness[bl_idx] == state->luminance)
+ return;
+
+ amdgpu_dm_backlight_set_level(dm, bl_idx, state->luminance);
+}
+
+/**
+ * amdgpu_dm_backlight_restore - reprogram the cached backlight levels
+ * @dm: display manager
+ *
+ * Display Core may reset the panel brightness when committing streams, so
+ * reapply the cached level of every panel whose backlight is controlled by
+ * the driver, either through a backlight class device or through the
+ * connector LUMINANCE property.
+ */
+void amdgpu_dm_backlight_restore(struct amdgpu_display_manager *dm)
+{
+ int i;
+
+ for (i = 0; i < dm->num_of_edps; i++) {
+ if (dm->backlight_dev[i] || dm->luminance[i])
+ amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
+ }
+}
+
/**
* DOC: panel power savings
*
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 891749322191c..69704e0ff5b25 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
@@ -33,6 +33,7 @@ struct dc_stream_state;
struct device;
struct device_attribute;
struct drm_connector;
+struct drm_connector_state;
struct attribute_group;
#define AMDGPU_DM_DEFAULT_MIN_BACKLIGHT 12
@@ -47,6 +48,8 @@ void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
void amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector);
void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
struct amdgpu_dm_connector *aconnector);
+void amdgpu_dm_set_luminance(const struct drm_connector_state *state);
+void amdgpu_dm_backlight_restore(struct amdgpu_display_manager *dm);
void amdgpu_dm_update_connector_ext_caps(struct amdgpu_dm_connector *aconnector);
bool amdgpu_dm_should_create_sysfs(struct amdgpu_dm_connector *aconnector);
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 8db7956c01d32..71f7111dfb268 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
@@ -1969,6 +1969,7 @@ STATIC_IFN_KUNIT void amdgpu_dm_connector_destroy(struct drm_connector *connecto
if (aconnector->bl_idx != -1) {
backlight_device_unregister(dm->backlight_dev[aconnector->bl_idx]);
dm->backlight_dev[aconnector->bl_idx] = NULL;
+ dm->luminance[aconnector->bl_idx] = false;
}
if (aconnector->dc_em_sink)
@@ -2061,7 +2062,8 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)
return r;
}
- amdgpu_dm_register_backlight_device(amdgpu_dm_connector);
+ if (!connector->luminance_property)
+ amdgpu_dm_register_backlight_device(amdgpu_dm_connector);
if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
(connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
@@ -2724,6 +2726,7 @@ amdgpu_dm_connector_helper_funcs = {
.get_modes = get_modes,
.mode_valid = amdgpu_dm_connector_mode_valid,
.atomic_check = amdgpu_dm_connector_atomic_check,
+ .set_luminance = amdgpu_dm_set_luminance,
};
int amdgpu_dm_convert_dc_color_depth_into_bpc(enum dc_color_depth display_color_depth)
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 8fc1c2f997688..c33c121a19b25 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
@@ -37,16 +37,39 @@ static const struct drm_connector_funcs dm_backlight_test_connector_funcs = {
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
+static int dm_test_signal_to_connector_type(enum signal_type signal)
+{
+ switch (signal) {
+ case SIGNAL_TYPE_EDP:
+ return DRM_MODE_CONNECTOR_eDP;
+ case SIGNAL_TYPE_LVDS:
+ return DRM_MODE_CONNECTOR_LVDS;
+ case SIGNAL_TYPE_HDMI_TYPE_A:
+ return DRM_MODE_CONNECTOR_HDMIA;
+ default:
+ return DRM_MODE_CONNECTOR_Unknown;
+ }
+}
+
static void setup_test_connector(struct kunit *test,
struct dm_backlight_connector_fixture *fixture,
int bl_idx, enum signal_type signal)
{
- fixture->adev = kunit_kzalloc(test, sizeof(*fixture->adev), GFP_KERNEL);
- fixture->aconnector = kunit_kzalloc(test, sizeof(*fixture->aconnector), GFP_KERNEL);
+ int ret;
+
+ fixture->adev = dm_kunit_alloc_adev(test);
+ ret = drmm_mode_config_init(&fixture->adev->ddev);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
+ fixture->aconnector = dm_kunit_alloc_connector(test, fixture->adev, NULL);
fixture->link = kunit_kzalloc(test, sizeof(*fixture->link), GFP_KERNEL);
- KUNIT_ASSERT_NOT_NULL(test, fixture->adev);
- KUNIT_ASSERT_NOT_NULL(test, fixture->aconnector);
KUNIT_ASSERT_NOT_NULL(test, fixture->link);
+ ret = drmm_connector_init(&fixture->adev->ddev,
+ &fixture->aconnector->base,
+ &dm_backlight_test_connector_funcs,
+ dm_test_signal_to_connector_type(signal), NULL);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+ drm_atomic_helper_connector_reset(&fixture->aconnector->base);
fixture->aconnector->bl_idx = bl_idx;
fixture->aconnector->dc_link = fixture->link;
@@ -483,12 +506,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_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);
@@ -1667,7 +1695,6 @@ static void dm_test_should_create_sysfs_non_edp(struct kunit *test)
amdgpu_dm_set_abm_level_param(-1);
setup_test_connector(test, &fixture, 0, SIGNAL_TYPE_HDMI_TYPE_A);
- fixture.aconnector->base.connector_type = DRM_MODE_CONNECTOR_HDMIA;
KUNIT_EXPECT_FALSE(test, amdgpu_dm_should_create_sysfs(fixture.aconnector));
@@ -1843,6 +1870,9 @@ static void dm_test_setup_backlight_device_oled_success(struct kunit *test)
setup_test_connector(test, &fixture, -1, SIGNAL_TYPE_EDP);
fixture.link->type = dc_connection_single;
fixture.link->dpcd_sink_ext_caps.bits.oled = 1;
+ setup_test_link_service(test, fixture.link);
+ fixture.link->dc->link_srv->edp_get_backlight_level_nits =
+ dm_test_get_backlight_level_nits;
dm = &fixture.adev->dm;
dm->adev = fixture.adev;
dm->num_of_edps = 0;
@@ -1872,6 +1902,7 @@ static void dm_test_setup_backlight_device_attaches_abm_property(struct kunit *t
struct dc_link *link;
int saved_abm_level = amdgpu_dm_get_abm_level_param();
int saved_backlight = amdgpu_dm_get_backlight_param();
+ int abm_index;
int old_count;
int ret;
@@ -1890,25 +1921,44 @@ static void dm_test_setup_backlight_device_attaches_abm_property(struct kunit *t
&dm_backlight_test_connector_funcs,
DRM_MODE_CONNECTOR_eDP, NULL);
KUNIT_ASSERT_EQ(test, ret, 0);
+ drm_atomic_helper_connector_reset(&aconnector->base);
link = dm_kunit_alloc_link(test);
link->connector_signal = SIGNAL_TYPE_EDP;
link->type = dc_connection_single;
+ setup_test_link_service(test, link);
+ link->dc->link_srv->edp_get_backlight_level = dm_test_get_backlight_level_mid;
aconnector->dc_link = link;
aconnector->bl_idx = -1;
dm = &adev->dm;
dm->adev = adev;
dm->ddev = &adev->ddev;
old_count = aconnector->base.base.properties->count;
+ abm_index = old_count + IS_ENABLED(CONFIG_DRM_LUMINANCE);
amdgpu_dm_setup_backlight_device(dm, aconnector);
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],
- (uint64_t)ABM_SYSFS_CONTROL);
+ KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->count,
+ old_count + 1 + IS_ENABLED(CONFIG_DRM_LUMINANCE));
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE)) {
+ KUNIT_EXPECT_NOT_NULL(test,
+ aconnector->base.luminance_property);
+ KUNIT_EXPECT_LE(test,
+ aconnector->base.state->luminance,
+ (uint64_t)MAX_BACKLIGHT_LEVEL);
+ /* Restores after reset/modeset must use the initial value */
+ KUNIT_EXPECT_EQ(test, dm->brightness[0],
+ aconnector->base.state->luminance);
+ }
+ KUNIT_EXPECT_EQ(test, dm->luminance[0],
+ IS_ENABLED(CONFIG_DRM_LUMINANCE));
+ KUNIT_EXPECT_PTR_EQ(test,
+ aconnector->base.base.properties->properties[abm_index],
+ prop);
+ KUNIT_EXPECT_EQ(test, aconnector->base.base.properties->values[abm_index],
+ (uint64_t)ABM_SYSFS_CONTROL);
amdgpu_dm_set_backlight_param(saved_backlight);
amdgpu_dm_set_abm_level_param(saved_abm_level);
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 f844b644bb776..7e9e8b1d0b10d 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
@@ -20,6 +20,7 @@
struct amdgpu_device *dm_kunit_alloc_adev(struct kunit *test)
{
+ struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
@@ -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);
+ adev = drm_to_adev(drm);
+
+ mutex_init(&adev->dm.dc_lock);
+
+ return adev;
}
EXPORT_SYMBOL(dm_kunit_alloc_adev);
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v11 04/12] drm/amd: add luminance property support
2026-11-03 22:42 ` [PATCH v11 04/12] drm/amd: add luminance property support Mario Limonciello (AMD)
@ 2026-11-03 23:13 ` sashiko-bot
0 siblings, 0 replies; 21+ messages in thread
From: sashiko-bot @ 2026-11-03 23:13 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Medium] drm/amd/display: stale brightness restored in amdgpu_dm_commit_streams()
- [Medium] drm/amd/display: race and PSR exit in amdgpu_dm_backlight_restore()
- [Medium] drm/amd/display: zero actual_brightness collision in amdgpu_dm_set_luminance()
--
commit 1f2beac3090b1487d1ed83a29307a7bc88af9241
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/amd: add luminance property support
This commit exposes the DRM LUMINANCE connector property for internal panels
when CONFIG_DRM_LUMINANCE is enabled and applies connector luminance updates
through Display Core backlight helpers and atomic commit callbacks.
> 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 56fca4e22df8d..2a9ddd1dc6f70 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
[ ... ]
> @@ -4802,12 +4799,8 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_commit *state,
> * level. (the dm->brightness is the correct panel level)
> * So we set the backlight level with dm->brightness value after set mode
> */
> - if (set_backlight_level) {
> - for (i = 0; i < dm->num_of_edps; i++) {
> - if (dm->backlight_dev[i])
> - amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
> - }
> - }
> + if (set_backlight_level)
> + amdgpu_dm_backlight_restore(dm);
> }
>
> STATIC_IFN_KUNIT void
> @@ -5413,6 +5406,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_commit *state)
> /* Update audio instances for each connector. */
> amdgpu_dm_commit_audio(dev, state);
>
> + /* Apply connector luminance after the display pipeline is enabled. */
> + drm_atomic_helper_commit_luminance_enables(state);
> +
> /* restore the backlight level */
> for (i = 0; i < dm->num_of_edps; i++) {
> if (dm->backlight_dev[i] &&
[Severity: Medium]
When a connector is controlled via the LUMINANCE property, dm->brightness[] is
only updated when drm_atomic_helper_commit_luminance_enables() calls
amdgpu_dm_set_luminance() near the end of amdgpu_dm_atomic_commit_tail().
If userspace updates LUMINANCE while the connector is inactive
(!new_conn_state->crtc or !new_crtc_state->active), or updates LUMINANCE in
the same atomic commit as a modeset, dm->brightness[bl_idx] still holds the
previous level when amdgpu_dm_commit_streams() runs earlier in
amdgpu_dm_atomic_commit_tail():
amdgpu_dm_atomic_commit_tail()
amdgpu_dm_commit_streams()
amdgpu_dm_backlight_restore()
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i])
amdgpu_dm_mod_power_setup_streams()
amdgpu_dm_commit_planes()
...
drm_atomic_helper_commit_luminance_enables()
amdgpu_dm_set_luminance()
amdgpu_dm_backlight_set_level(dm, bl_idx, state->luminance)
Because drm_atomic_helper_update_legacy_modeset_state() has already set
aconnector->base.encoder and dc_commit_streams() has committed the stream,
amdgpu_dm_backlight_restore() programs the panel hardware,
dm->power_module->bl_state, and the ATOMBIOS scratch register with the stale
dm->brightness[i] value before planes are committed, and then
drm_atomic_helper_commit_luminance_enables() reprograms the hardware a second
time with state->luminance.
Furthermore, if a LUMINANCE change was committed while the connector was
inactive and a later modeset exits self-refresh
(old_crtc_state->self_refresh_active is true while old_conn_state->luminance ==
new_conn_state->luminance), drm_atomic_helper_commit_luminance_enables() skips
calling set_luminance, leaving the panel permanently at the stale
dm->brightness[i] level applied by amdgpu_dm_backlight_restore().
Should amdgpu_dm_commit_streams() avoid restoring stale dm->brightness[] for
luminance-controlled connectors, or should dm->brightness[] be synced from the
connector state before amdgpu_dm_backlight_restore() runs?
> 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 0f664c658a127..f61e69bbdf69f 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
[ ... ]
> @@ -675,6 +684,30 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
>
> amdgpu_dm_update_connector_ext_caps(aconnector);
>
> + /*
> + * The property must exist before the device is registered. If ACPI
> + * video should handle the backlight, leave it to
> + * amdgpu_dm_register_backlight_device() to register the fallback.
> + */
> + if (IS_ENABLED(CONFIG_DRM_LUMINANCE) && acpi_video_backlight_use_native()) {
> + 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);
> + /* Start from the level the hardware is actually at */
> + ret = amdgpu_dm_backlight_get_level(dm, bl_idx);
> + if (ret >= 0 && ret <= props.max_brightness)
> + props.brightness = ret;
> + ret = drm_connector_attach_luminance_property(connector, 0,
> + props.max_brightness,
> + props.brightness);
> + if (!drm_WARN_ON(adev_to_drm(dm->adev), ret)) {
> + dm->brightness[bl_idx] = props.brightness;
> + dm->luminance[bl_idx] = true;
> + }
> + }
> +
> /* 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.
> @@ -686,6 +719,45 @@ void amdgpu_dm_setup_backlight_device(struct amdgpu_display_manager *dm,
> }
> EXPORT_IF_KUNIT(amdgpu_dm_setup_backlight_device);
>
> +void amdgpu_dm_set_luminance(const struct drm_connector_state *state)
> +{
> + struct amdgpu_dm_connector *aconnector =
> + to_amdgpu_dm_connector(state->connector);
> + struct amdgpu_display_manager *dm =
> + &drm_to_adev(state->connector->dev)->dm;
> +
> + int bl_idx = aconnector->bl_idx;
> +
> + if (bl_idx < 0)
> + return;
> +
> + /* Skip if already applied, e.g. by amdgpu_dm_backlight_restore(). */
> + if (dm->brightness[bl_idx] == state->luminance &&
> + dm->actual_brightness[bl_idx] == state->luminance)
> + return;
> +
> + amdgpu_dm_backlight_set_level(dm, bl_idx, state->luminance);
> +}
[Severity: Medium]
Can amdgpu_dm_set_luminance() silently skip programming the hardware when
state->luminance is 0?
In amdgpu_dm_setup_backlight_device(), drm_connector_attach_luminance_property()
registers 0 as the minimum valid luminance level, and dm->actual_brightness[]
starts at 0 (unlike amdgpu_dm_register_backlight_device(), which seeds
dm->actual_brightness[bl_idx] from the hardware level). In addition,
amdgpu_dm_backlight_set_level() uses dm->actual_brightness[bl_idx] = 0 as the
sentinel indicating that brightness was not applied while the connector had no
encoder:
/* if connector is off, save the brightness for next time it's on */
if (!aconnector->base.encoder) {
dm->brightness[bl_idx] = user_brightness;
dm->actual_brightness[bl_idx] = 0;
return;
}
If dm->brightness[bl_idx] is 0 and dm->actual_brightness[bl_idx] is 0 (for
instance, after saving brightness 0 while the connector was disabled, or if a
prior amdgpu_dm_backlight_set_level(dm, bl_idx, 0) returned early or failed
with rc == false), then calling amdgpu_dm_set_luminance() with
state->luminance == 0 sees:
if (dm->brightness[bl_idx] == state->luminance &&
dm->actual_brightness[bl_idx] == state->luminance)
return;
and returns early without applying minimum brightness to the panel.
Also, in amdgpu_dm_atomic_commit_tail(), the fallback loop that retries
unapplied brightness levels only checks dm->backlight_dev[i]:
/* restore the backlight level */
for (i = 0; i < dm->num_of_edps; i++) {
if (dm->backlight_dev[i] &&
(dm->actual_brightness[i] != dm->brightness[i]))
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
}
Should dm->actual_brightness[] track whether a level has been applied without
colliding with valid luminance 0, and should the retry loop in
amdgpu_dm_atomic_commit_tail() also cover dm->luminance[i]?
> +
> +/**
> + * amdgpu_dm_backlight_restore - reprogram the cached backlight levels
> + * @dm: display manager
> + *
> + * Display Core may reset the panel brightness when committing streams, so
> + * reapply the cached level of every panel whose backlight is controlled by
> + * the driver, either through a backlight class device or through the
> + * connector LUMINANCE property.
> + */
> +void amdgpu_dm_backlight_restore(struct amdgpu_display_manager *dm)
> +{
> + int i;
> +
> + for (i = 0; i < dm->num_of_edps; i++) {
> + if (dm->backlight_dev[i] || dm->luminance[i])
> + amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
> + }
> +}
[Severity: Medium]
Could calling amdgpu_dm_backlight_restore() from amdgpu_dm_commit_streams() on
every stream commit cause a race with concurrent luminance updates and trigger
unnecessary PSR/Replay/IPS exits on unaffected eDP panels?
First, when a non-blocking modeset commit runs on an external display CRTC,
do_aquire_global_lock() locks all modeset locks during atomic_check but does
not add unmodified CRTCs (such as an active eDP CRTC) to the atomic state.
Once drm_atomic_helper_swap_state() finishes and locks are dropped, a subsequent
fast atomic commit updating LUMINANCE on the eDP connector drops
dm->atomic_obj in amdgpu_dm_atomic_check() and runs amdgpu_dm_atomic_commit_tail()
concurrently:
CPU 0 (external CRTC modeset) CPU 1 (eDP fast luminance commit)
amdgpu_dm_commit_streams() drm_atomic_helper_commit_luminance_enables()
amdgpu_dm_backlight_restore() amdgpu_dm_set_luminance()
reads old dm->brightness[0] amdgpu_dm_backlight_set_level(new)
amdgpu_dm_backlight_set_level(old) dm->brightness[0] = new
dm->brightness[0] = old dm->actual_brightness[0] = new
overwrites hw & actual_brightness
Because nothing serializes dm->brightness[] and dm->actual_brightness[] across
these two commits, CPU 0 can overwrite the panel brightness back to the old
level after CPU 1 has programmed the new luminance, leaving hardware brightness
out of sync with connector->state->luminance.
Second, whenever an external monitor undergoes a modeset while the eDP panel is
idle in PSR, Replay, or IPS with unchanged luminance,
amdgpu_dm_commit_streams() sets set_backlight_level = true and calls
amdgpu_dm_backlight_restore(), which unconditionally calls
amdgpu_dm_backlight_set_level() on all eDP panels. That exits IPS and latches
psr_event_hw_programming and replay_event_hw_programming on the eDP stream,
which is not cleared because the eDP CRTC has no plane commit in the state to
run amdgpu_dm_enable_self_refresh().
Could amdgpu_dm_commit_streams() only restore backlight for eDP streams that
actually underwent a modeset in that commit, or let
drm_atomic_helper_commit_luminance_enables() handle luminance-controlled
connectors?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103-superm1-backlight-property-v11-0-00cce7b2ba22@kernel.org?part=4
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v11 05/12] drm/i915/display: add luminance property support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (3 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 04/12] drm/amd: add luminance property support Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 06/12] drm/bridge: add connector luminance operations Mario Limonciello (AMD)
` (9 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose the DRM LUMINANCE connector property for eDP, LVDS, and DSI panels
when CONFIG_DRM_LUMINANCE is enabled. Keep registering the existing
backlight class device otherwise, preserving its userspace ABI.
Use the existing Intel brightness scaling and programming path from
connector helper callbacks. Apply atomic luminance after modeset enables
so updates made while a panel is inactive take effect when it is enabled
again. The shared display code provides the same behavior to i915 and Xe.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Call acpi_video_backlight_use_native() before attaching LUMINANCE and
leave the panel to acpi_video otherwise (Sashiko)
* Enable the backlight at the committed LUMINANCE level (Sashiko)
* Fix build with CONFIG_BACKLIGHT_CLASS_DEVICE=n (Sashiko)
* Keep selecting BACKLIGHT_CLASS_DEVICE if ACPI (Sashiko)
* Fall back to the backlight class device if attaching LUMINANCE fails
---
drivers/gpu/drm/i915/display/icl_dsi.c | 1 +
drivers/gpu/drm/i915/display/intel_backlight.c | 74 ++++++++++++++++++++++----
drivers/gpu/drm/i915/display/intel_backlight.h | 1 +
drivers/gpu/drm/i915/display/intel_display.c | 2 +
drivers/gpu/drm/i915/display/intel_dp.c | 1 +
drivers/gpu/drm/i915/display/intel_lvds.c | 1 +
drivers/gpu/drm/i915/display/intel_panel.c | 8 +--
drivers/gpu/drm/i915/display/vlv_dsi.c | 1 +
8 files changed, 76 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index ea0cdb7822f39..37ff84c03ce05 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -1801,6 +1801,7 @@ static const struct drm_connector_helper_funcs gen11_dsi_connector_helper_funcs
.get_modes = intel_dsi_get_modes,
.mode_valid = gen11_dsi_mode_valid,
.atomic_check = intel_digital_connector_atomic_check,
+ .set_luminance = intel_backlight_set_luminance,
};
static int gen11_dsi_host_attach(struct mipi_dsi_host *host,
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.c b/drivers/gpu/drm/i915/display/intel_backlight.c
index b128896cb1c2d..f9e84d17d3fb0 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_connector.h>
#include <drm/drm_file.h>
#include <drm/drm_print.h>
#include <drm/intel/pci_config.h>
@@ -76,6 +77,16 @@ static u32 clamp_user_to_hw(struct intel_connector *connector,
return hw_level;
}
+/* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
+static u32 scale_user_to_hw(struct intel_connector *connector,
+ u32 user_level, u32 user_max)
+{
+ struct intel_panel *panel = &connector->panel;
+
+ return scale(user_level, 0, user_max,
+ panel->backlight.min, panel->backlight.max);
+}
+
/* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
static u32 scale_hw_to_user(struct intel_connector *connector,
u32 hw_level, u32 user_max)
@@ -778,6 +789,16 @@ static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state,
WARN_ON(panel->backlight.max == 0);
+ /*
+ * Enable at the luminance committed in this atomic state, rather than
+ * at a stale level which would only be corrected afterwards by
+ * drm_atomic_helper_commit_luminance_enables().
+ */
+ if (connector->base.luminance_property)
+ panel->backlight.level =
+ scale_user_to_hw(connector, conn_state->luminance,
+ panel->backlight.max);
+
if (panel->backlight.level < panel->backlight.min) {
panel->backlight.level = panel->backlight.min;
if (panel->backlight.device)
@@ -831,16 +852,6 @@ static u32 intel_panel_get_backlight(struct intel_connector *connector)
return val;
}
-/* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
-static u32 scale_user_to_hw(struct intel_connector *connector,
- u32 user_level, u32 user_max)
-{
- struct intel_panel *panel = &connector->panel;
-
- return scale(user_level, 0, user_max,
- panel->backlight.min, panel->backlight.max);
-}
-
/* set backlight brightness to level in range [0..max], scaling wrt hw min */
static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
u32 user_level, u32 user_max)
@@ -1670,6 +1681,9 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
{
struct intel_display *display = to_intel_display(connector);
struct intel_panel *panel = &connector->panel;
+ struct drm_connector *base = &connector->base;
+ u32 brightness;
+ u32 max;
int ret;
if (!connector->panel.vbt.backlight.present) {
@@ -1703,6 +1717,19 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
panel->backlight.present = true;
+ /*
+ * acpi_video_backlight_use_native() also tells the ACPI video code that
+ * a native backlight is available. If native control should not be
+ * used, leave the backlight to acpi_video, which is registered later
+ * from intel_acpi_video_register().
+ */
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE) && acpi_video_backlight_use_native()) {
+ max = panel->backlight.max;
+ brightness = scale_hw_to_user(connector, panel->backlight.level, max);
+ ret = drm_connector_attach_luminance_property(base, 0, max, brightness);
+ drm_WARN_ON(display->drm, ret);
+ }
+
drm_dbg_kms(display->drm,
"[CONNECTOR:%d:%s] backlight initialized, %s, brightness %u/%u\n",
connector->base.base.id, connector->base.name,
@@ -1712,6 +1739,33 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
return 0;
}
+void intel_backlight_set_luminance(const struct drm_connector_state *conn_state)
+{
+ struct intel_connector *connector =
+ to_intel_connector(conn_state->connector);
+ struct intel_display *display = to_intel_display(connector);
+ struct intel_panel *panel = &connector->panel;
+ u32 hw_level;
+
+ if (!panel->backlight.present)
+ return;
+
+ guard(mutex)(&display->backlight.lock);
+
+ /*
+ * Nothing to do if __intel_backlight_enable() already programmed this
+ * level as part of a modeset enable.
+ */
+ hw_level = scale_user_to_hw(connector, conn_state->luminance,
+ panel->backlight.max);
+ if (hw_level == panel->backlight.level)
+ return;
+
+ panel->backlight.level = hw_level;
+ if (panel->backlight.enabled)
+ intel_panel_actually_set_backlight(conn_state, hw_level);
+}
+
void intel_backlight_destroy(struct intel_panel *panel)
{
/* dispose of the pwm */
diff --git a/drivers/gpu/drm/i915/display/intel_backlight.h b/drivers/gpu/drm/i915/display/intel_backlight.h
index 339643f638978..1634ce414695a 100644
--- a/drivers/gpu/drm/i915/display/intel_backlight.h
+++ b/drivers/gpu/drm/i915/display/intel_backlight.h
@@ -32,6 +32,7 @@ void intel_backlight_set_acpi(const struct drm_connector_state *conn_state,
u32 level, u32 max);
void intel_backlight_set_pwm_level(const struct drm_connector_state *conn_state,
u32 level);
+void intel_backlight_set_luminance(const struct drm_connector_state *conn_state);
u32 intel_backlight_invert_pwm_level(struct intel_connector *connector, u32 level);
u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 level);
u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val);
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index c1c2b99cfb53b..f87c78e316a5d 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7845,6 +7845,8 @@ 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);
+ drm_atomic_helper_commit_luminance_enables(&state->base);
+
intel_display_power_dc3co_compute(state);
/* FIXME probably need to sequence this properly */
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index ef164a7976187..905c8743a2a2b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -7060,6 +7060,7 @@ static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs =
.get_modes = intel_dp_get_modes,
.mode_valid = intel_dp_mode_valid,
.atomic_check = intel_dp_connector_atomic_check,
+ .set_luminance = intel_backlight_set_luminance,
};
enum irqreturn
diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
index 872753478cf21..fa668b1debb21 100644
--- a/drivers/gpu/drm/i915/display/intel_lvds.c
+++ b/drivers/gpu/drm/i915/display/intel_lvds.c
@@ -502,6 +502,7 @@ static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs
.get_modes = intel_lvds_get_modes,
.mode_valid = intel_lvds_mode_valid,
.atomic_check = intel_digital_connector_atomic_check,
+ .set_luminance = intel_backlight_set_luminance,
};
static const struct drm_connector_funcs intel_lvds_connector_funcs = {
diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
index 81e638d0c7b33..9e2a53f300d39 100644
--- a/drivers/gpu/drm/i915/display/intel_panel.c
+++ b/drivers/gpu/drm/i915/display/intel_panel.c
@@ -610,9 +610,11 @@ int intel_panel_register(struct intel_connector *connector)
struct intel_panel *panel = &connector->panel;
int ret;
- ret = intel_backlight_device_register(connector);
- if (ret)
- return ret;
+ if (!connector->base.luminance_property) {
+ ret = intel_backlight_device_register(connector);
+ if (ret)
+ return ret;
+ }
if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI ||
connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) {
diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c
index 8829f365592ef..7e60407e0af4a 100644
--- a/drivers/gpu/drm/i915/display/vlv_dsi.c
+++ b/drivers/gpu/drm/i915/display/vlv_dsi.c
@@ -1555,6 +1555,7 @@ static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs
.get_modes = intel_dsi_get_modes,
.mode_valid = vlv_dsi_mode_valid,
.atomic_check = intel_digital_connector_atomic_check,
+ .set_luminance = intel_backlight_set_luminance,
};
static const struct drm_connector_funcs intel_dsi_connector_funcs = {
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 06/12] drm/bridge: add connector luminance operations
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (4 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 05/12] drm/i915/display: " Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 07/12] drm/panel: add connector luminance forwarding Mario Limonciello (AMD)
` (8 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Allow bridges that own brightness control to advertise a luminance
operation and its supported relative range.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Drop panel bridge declarations re-added by a bad rebase (Sashiko)
* Document @luminance as the initial level
v10:
* Split bridge operations out of the combined panel and bridge patch
---
include/drm/drm_bridge.h | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 1981d24a700d2..240a69c1233e7 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -62,6 +62,15 @@ enum drm_bridge_attach_flags {
* struct drm_bridge_funcs - drm_bridge control functions
*/
struct drm_bridge_funcs {
+ /**
+ * @set_luminance:
+ *
+ * Apply a relative luminance level to a bridge that controls panel
+ * emission. Bridges implementing this callback shall set
+ * @DRM_BRIDGE_OP_LUMINANCE.
+ */
+ void (*set_luminance)(struct drm_bridge *bridge, unsigned int luminance);
+
/**
* @attach:
*
@@ -1021,6 +1030,11 @@ enum drm_bridge_ops {
* &drm_bridge_funcs->hdmi_clear_spd_infoframe callbacks.
*/
DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME = BIT(10),
+
+ /**
+ * @DRM_BRIDGE_OP_LUMINANCE: The bridge controls panel luminance.
+ */
+ DRM_BRIDGE_OP_LUMINANCE = BIT(11),
};
/**
@@ -1071,6 +1085,12 @@ struct drm_bridge {
void *driver_private;
/** @ops: bitmask of operations supported by the bridge */
enum drm_bridge_ops ops;
+
+ /** @luminance_max: Maximum relative luminance level. */
+ unsigned int luminance_max;
+
+ /** @luminance: Initial relative luminance level. */
+ unsigned int luminance;
/**
* @type: Type of the connection at the bridge output
* (DRM_MODE_CONNECTOR_*). For bridges at the end of this chain this
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 07/12] drm/panel: add connector luminance forwarding
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (5 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 06/12] drm/bridge: add connector luminance operations Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:55 ` sashiko-bot
2026-11-03 22:42 ` [PATCH v11 08/12] drm/bridge_connector: add luminance support Mario Limonciello (AMD)
` (7 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Add helpers that expose a panel backlight through the connector
LUMINANCE property and forward connector updates to the backlight
backend.
Hook the helpers into panel bridges that create their own connector.
Panels consumed directly, or by a panel bridge attached with
DRM_BRIDGE_ATTACH_NO_CONNECTOR, remain unchanged. Turning the backlight
on and off is left to drm_panel_enable() and drm_panel_disable(), which
already honour self refresh.
The panel backlight remains the hardware backend and keeps its
/sys/class/backlight device, which is owned by the backlight driver.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Don't remove drm_panel.h stubs (rebase artifact, Sashiko)
* Use drm_connector_to_panel() rather than an invalid panel_bridge
container_of() (Sashiko)
* Clean up the connector if attaching the property fails (Sashiko)
* Drop .disable_luminance and program the committed level before
drm_panel_enable() (Sashiko)
* Don't attach the property when the panel bridge is attached after the
device is registered, which would WARN
* Update brightness under the backlight ops_lock
v10:
* Split panel support out of the combined panel and bridge patch
* Limit integration to panel bridges that own their connector
---
drivers/gpu/drm/drm_panel.c | 93 +++++++++++++++++++++++++++++++++++++++++++++
include/drm/drm_panel.h | 4 ++
2 files changed, 97 insertions(+)
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index 74c96da45b7a5..bbd0e14401c18 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -64,9 +64,18 @@ static int panel_bridge_connector_get_modes(struct drm_connector *connector)
return drm_panel_get_modes(panel, connector);
}
+static void
+panel_bridge_connector_set_luminance(const struct drm_connector_state *conn_state)
+{
+ struct drm_panel *panel = drm_connector_to_panel(conn_state->connector);
+
+ drm_panel_set_luminance(panel, conn_state->luminance);
+}
+
static const struct drm_connector_helper_funcs
panel_bridge_connector_helper_funcs = {
.get_modes = panel_bridge_connector_get_modes,
+ .set_luminance = panel_bridge_connector_set_luminance,
};
static const struct drm_connector_funcs panel_bridge_connector_funcs = {
@@ -101,6 +110,12 @@ static int panel_bridge_attach(struct drm_bridge *bridge,
drm_panel_bridge_set_orientation(connector, bridge);
+ ret = drm_panel_attach_luminance_property(panel, connector);
+ if (ret) {
+ drm_connector_cleanup(connector);
+ return ret;
+ }
+
drm_connector_attach_encoder(connector, encoder);
if (bridge->dev->registered) {
@@ -169,6 +184,19 @@ static void panel_bridge_atomic_enable(struct drm_bridge *bridge,
if (old_crtc_state && old_crtc_state->self_refresh_active)
return;
+ /*
+ * Program the committed luminance before drm_panel_enable() turns the
+ * backlight on, so the panel does not light up at a stale level.
+ */
+ if (panel->connector.luminance_property) {
+ const struct drm_connector_state *conn_state =
+ drm_atomic_get_new_connector_state(atomic_state,
+ &panel->connector);
+
+ if (conn_state)
+ drm_panel_set_luminance(panel, conn_state->luminance);
+ }
+
drm_panel_enable(panel);
}
@@ -873,6 +901,71 @@ void drm_panel_disable(struct drm_panel *panel)
}
EXPORT_SYMBOL(drm_panel_disable);
+/**
+ * drm_panel_attach_luminance_property - expose a panel backlight through DRM
+ * @panel: panel whose backlight is controlled
+ * @connector: connector on which to expose the property
+ *
+ * The backlight class device remains the internal hardware backend. When the
+ * luminance UAPI is enabled, userspace controls that backend through the DRM
+ * connector property instead.
+ *
+ * Return: 0 on success or a negative error code
+ */
+int drm_panel_attach_luminance_property(struct drm_panel *panel,
+ struct drm_connector *connector)
+{
+ struct backlight_device *backlight;
+
+ if (!IS_ENABLED(CONFIG_DRM_LUMINANCE) || !panel)
+ return 0;
+
+ backlight = panel->backlight;
+ if (!backlight)
+ return 0;
+
+ /* Properties can't be created once the device is visible to userspace */
+ if (connector->dev->registered) {
+ drm_dbg_kms(connector->dev,
+ "[CONNECTOR:%d:%s] registered, not exposing luminance\n",
+ connector->base.id, connector->name);
+ return 0;
+ }
+
+ return drm_connector_attach_luminance_property(connector, 0,
+ backlight->props.max_brightness,
+ backlight->props.brightness);
+}
+EXPORT_SYMBOL(drm_panel_attach_luminance_property);
+
+/**
+ * drm_panel_set_luminance - set a panel backlight's relative luminance
+ * @panel: panel whose backlight is controlled
+ * @luminance: relative luminance level
+ *
+ * Updates the backlight brightness without changing its power state, under
+ * the same lock as brightness changes made through sysfs. Turning
+ * the backlight on and off is left to drm_panel_enable() and
+ * drm_panel_disable(), so a level set while the panel is disabled is applied
+ * when the panel is enabled again.
+ */
+void drm_panel_set_luminance(struct drm_panel *panel, unsigned int luminance)
+{
+ struct backlight_device *backlight;
+
+ if (!panel || !panel->backlight)
+ return;
+
+ backlight = panel->backlight;
+ guard(mutex)(&backlight->ops_lock);
+ if (!backlight->ops || luminance > backlight->props.max_brightness)
+ return;
+
+ backlight->props.brightness = luminance;
+ backlight_update_status(backlight);
+}
+EXPORT_SYMBOL(drm_panel_set_luminance);
+
/**
* drm_panel_get_modes - probe the available display modes of a panel
* @panel: DRM panel
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index 58113ea7d63a0..233d30dd2e182 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -342,6 +342,10 @@ void drm_panel_unprepare(struct drm_panel *panel);
void drm_panel_enable(struct drm_panel *panel);
void drm_panel_disable(struct drm_panel *panel);
+int drm_panel_attach_luminance_property(struct drm_panel *panel,
+ struct drm_connector *connector);
+void drm_panel_set_luminance(struct drm_panel *panel, unsigned int luminance);
+
int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector);
#if defined(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL)
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v11 07/12] drm/panel: add connector luminance forwarding
2026-11-03 22:42 ` [PATCH v11 07/12] drm/panel: add connector luminance forwarding Mario Limonciello (AMD)
@ 2026-11-03 22:55 ` sashiko-bot
0 siblings, 0 replies; 21+ messages in thread
From: sashiko-bot @ 2026-11-03 22:55 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/panel: premature and redundant backlight update in drm_panel_set_luminance()
--
commit 7712bf002ce98036567ec37ca544f1c1930a93be
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/panel: add connector luminance forwarding
This commit adds helpers to expose a panel backlight via the connector
LUMINANCE property and forward connector updates to the backlight backend.
It hooks these helpers into panel bridges that create their own connector.
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index 74c96da45b7a5..bbd0e14401c18 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
[ ... ]
> @@ -169,6 +184,19 @@ static void panel_bridge_atomic_enable(struct drm_bridge *bridge,
> if (old_crtc_state && old_crtc_state->self_refresh_active)
> return;
>
> + /*
> + * Program the committed luminance before drm_panel_enable() turns the
> + * backlight on, so the panel does not light up at a stale level.
> + */
> + if (panel->connector.luminance_property) {
> + const struct drm_connector_state *conn_state =
> + drm_atomic_get_new_connector_state(atomic_state,
> + &panel->connector);
> +
> + if (conn_state)
> + drm_panel_set_luminance(panel, conn_state->luminance);
> + }
> +
> drm_panel_enable(panel);
> }
>
> @@ -873,6 +901,71 @@ void drm_panel_disable(struct drm_panel *panel)
[ ... ]
> +/**
> + * drm_panel_set_luminance - set a panel backlight's relative luminance
> + * @panel: panel whose backlight is controlled
> + * @luminance: relative luminance level
> + *
> + * Updates the backlight brightness without changing its power state, under
> + * the same lock as brightness changes made through sysfs. Turning
> + * the backlight on and off is left to drm_panel_enable() and
> + * drm_panel_disable(), so a level set while the panel is disabled is applied
> + * when the panel is enabled again.
> + */
> +void drm_panel_set_luminance(struct drm_panel *panel, unsigned int luminance)
> +{
> + struct backlight_device *backlight;
> +
> + if (!panel || !panel->backlight)
> + return;
> +
> + backlight = panel->backlight;
> + guard(mutex)(&backlight->ops_lock);
> + if (!backlight->ops || luminance > backlight->props.max_brightness)
> + return;
> +
> + backlight->props.brightness = luminance;
> + backlight_update_status(backlight);
> +}
> +EXPORT_SYMBOL(drm_panel_set_luminance);
[Severity: Medium]
Can calling backlight_update_status() unconditionally in
drm_panel_set_luminance() cause the backlight hardware to be programmed or
unblanked before panel->funcs->enable() runs, as well as trigger three
consecutive backlight updates on every modeset enable?
During a modeset enable, drm_atomic_helper_commit_modeset_enables() runs:
drm_atomic_helper_commit_encoder_bridge_enable()
-> panel_bridge_atomic_enable()
-> drm_panel_set_luminance()
-> drm_panel_enable()
drm_atomic_helper_commit_luminance_enables()
-> panel_bridge_connector_set_luminance()
-> drm_panel_set_luminance()
When panel_bridge_atomic_enable() calls drm_panel_set_luminance() before
drm_panel_enable(), panel->enabled is still false and panel->funcs->enable()
has not yet executed:
drivers/gpu/drm/drm_panel.c:drm_panel_enable() {
...
if (panel->funcs && panel->funcs->enable) {
ret = panel->funcs->enable(panel);
if (ret < 0)
goto exit;
}
panel->enabled = true;
ret = backlight_enable(panel->backlight);
...
}
Because BACKLIGHT_POWER_ON is 0, backlight devices registered with
zero-initialized props.power and props.state (or left active at boot) are not
marked blanked prior to the first drm_panel_disable() call, and several
panel backlight callbacks (such as visionox_r66451_bl_update_status() and
rad_bl_update_status()) send MIPI_DCS_SET_DISPLAY_BRIGHTNESS commands in
update_status() regardless of blank state. Calling backlight_update_status()
before drm_panel_enable() can therefore access or unblank the panel before
panel->funcs->enable() has completed its power-on sequence and mandatory
enable delays.
In addition, if an external caller invokes drm_panel_set_luminance() while
!panel->enabled, calling backlight_update_status() immediately does not match
the kernel-doc comment stating that a level set while the panel is disabled
is applied when the panel is enabled again.
Once drm_panel_enable() runs, backlight_enable() calls
backlight_update_status() a second time to apply backlight->props.brightness.
Immediately after, drm_atomic_helper_commit_luminance_enables() sees
drm_atomic_crtc_needs_modeset(new_crtc_state) and calls
panel_bridge_connector_set_luminance() -> drm_panel_set_luminance(), which
calls backlight_update_status() a third time even though
backlight->props.brightness already equals luminance.
Should drm_panel_set_luminance() only store backlight->props.brightness when
!panel->enabled (leaving the hardware update to backlight_enable() in
drm_panel_enable()), and skip backlight_update_status() when
backlight->props.brightness is unchanged?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103-superm1-backlight-property-v11-0-00cce7b2ba22@kernel.org?part=7
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v11 08/12] drm/bridge_connector: add luminance support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (6 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 07/12] drm/panel: add connector luminance forwarding Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:42 ` [PATCH v11 09/12] drm/nouveau: add connector " Mario Limonciello (AMD)
` (6 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Discover the last bridge in a chain that owns brightness control, attach
its relative luminance range to the connector, and forward atomic
luminance updates to it.
Do not infer panel luminance support from a terminal panel bridge. Panels
still have direct consumers, so their connector integration must remain
explicit.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Drop .disable_luminance, it clobbered the bridge's saved level; the
bridge disable path already turns the panel off
* Fix checkpatch line length
v10:
* Split bridge connector integration into a separate patch
* Do not special-case panels in the generic bridge connector
---
drivers/gpu/drm/display/drm_bridge_connector.c | 39 ++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
index 2202e60444449..18927fed83732 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -125,6 +125,13 @@ struct drm_bridge_connector {
*/
struct drm_bridge *bridge_hdmi_cec;
+ /**
+ * @bridge_luminance:
+ *
+ * The last bridge in the chain that controls panel luminance.
+ */
+ struct drm_bridge *bridge_luminance;
+
/**
* @hdmi_funcs:
*
@@ -421,6 +428,17 @@ static int drm_bridge_connector_atomic_check(struct drm_connector *connector,
return 0;
}
+static void
+drm_bridge_connector_set_luminance(const struct drm_connector_state *conn_state)
+{
+ struct drm_bridge_connector *bridge_connector =
+ to_drm_bridge_connector(conn_state->connector);
+ struct drm_bridge *bridge = bridge_connector->bridge_luminance;
+
+ if (bridge)
+ bridge->funcs->set_luminance(bridge, conn_state->luminance);
+}
+
static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs = {
.get_modes = drm_bridge_connector_get_modes,
.detect_ctx = drm_bridge_connector_detect_ctx,
@@ -429,6 +447,7 @@ static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs
.enable_hpd = drm_bridge_connector_enable_hpd,
.disable_hpd = drm_bridge_connector_disable_hpd,
.atomic_check = drm_bridge_connector_atomic_check,
+ .set_luminance = drm_bridge_connector_set_luminance,
};
static enum drm_mode_status
@@ -835,6 +854,7 @@ static void drm_bridge_connector_put_bridges(struct drm_device *dev, void *data)
drm_bridge_put(bridge_connector->bridge_hdmi_audio);
drm_bridge_put(bridge_connector->bridge_dp_audio);
drm_bridge_put(bridge_connector->bridge_hdmi_cec);
+ drm_bridge_put(bridge_connector->bridge_luminance);
}
/**
@@ -918,6 +938,13 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
drm_bridge_put(bridge_connector->bridge_detect);
bridge_connector->bridge_detect = drm_bridge_get(bridge);
}
+ if (bridge->ops & DRM_BRIDGE_OP_LUMINANCE) {
+ if (!bridge->funcs->set_luminance)
+ return ERR_PTR(-EINVAL);
+
+ drm_bridge_put(bridge_connector->bridge_luminance);
+ bridge_connector->bridge_luminance = drm_bridge_get(bridge);
+ }
if (bridge->ops & DRM_BRIDGE_OP_HDMI) {
if (bridge_connector->bridge_hdmi)
return ERR_PTR(-EBUSY);
@@ -1144,6 +1171,18 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
if (panel_bridge)
drm_panel_bridge_set_orientation(connector, panel_bridge);
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE) &&
+ bridge_connector->bridge_luminance &&
+ !connector->luminance_property) {
+ struct drm_bridge *bridge = bridge_connector->bridge_luminance;
+
+ ret = drm_connector_attach_luminance_property(connector, 0,
+ bridge->luminance_max,
+ bridge->luminance);
+ if (ret)
+ return ERR_PTR(ret);
+ }
+
if (support_hdcp && IS_REACHABLE(CONFIG_DRM_DISPLAY_HELPER) &&
IS_ENABLED(CONFIG_DRM_DISPLAY_HDCP_HELPER))
drm_connector_attach_content_protection_property(connector, true);
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v11 09/12] drm/nouveau: add connector luminance support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (7 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 08/12] drm/bridge_connector: add luminance support Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 23:09 ` sashiko-bot
2026-11-03 22:42 ` [PATCH v11 10/12] drm/gud: " Mario Limonciello (AMD)
` (5 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose Nouveau panel brightness through the connector LUMINANCE property
when DRM_LUMINANCE is enabled and atomic modesetting is exposed. Reuse
the existing NV50 and DPCD hardware paths while preserving the backlight
class interface otherwise, including for pre-NV50 displays.
The panel backlight is probed and the property attached before the DRM
device is registered. The luminance helpers are called from the NV50
atomic commit tail.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Call the luminance commit helpers from nv50_disp_atomic_commit_tail()
(Sashiko)
* Attach the property before drm_dev_register() (Sashiko)
* Keep the class device for non-atomic NV04 and nouveau.atomic=0
(Sashiko)
* Fix stale brightness on eDP enable for the class device path (Sashiko)
* Keep selecting BACKLIGHT_CLASS_DEVICE (Sashiko)
---
drivers/gpu/drm/nouveau/dispnv50/disp.c | 13 ++-
drivers/gpu/drm/nouveau/nouveau_backlight.c | 152 ++++++++++++++++++++++++----
drivers/gpu/drm/nouveau/nouveau_connector.c | 3 +
drivers/gpu/drm/nouveau/nouveau_connector.h | 23 +++++
drivers/gpu/drm/nouveau/nouveau_drm.c | 6 ++
5 files changed, 174 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index e91130f93db67..57653fe720d95 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -1755,6 +1755,7 @@ nv50_sor_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_commit *st
struct nouveau_connector *nv_connector;
#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
struct nouveau_backlight *backlight;
+ u16 level;
#endif
struct nvbios *bios = &drm->vbios;
bool lvds_dual = false, lvds_8bpc = false, hda = false;
@@ -1836,9 +1837,14 @@ nv50_sor_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_commit *st
#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
backlight = nv_connector->backlight;
- if (backlight && backlight->uses_dpcd)
+ if (backlight && backlight->uses_dpcd) {
+ if (backlight->dev)
+ level = backlight->dev->props.brightness;
+ else
+ level = nv_connector->base.state->luminance;
drm_edp_backlight_enable(&nv_connector->aux, &backlight->edp_info,
- backlight->dev->props.brightness);
+ level);
+ }
#endif
break;
@@ -2188,6 +2194,7 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_commit *state)
drm_dp_mst_atomic_wait_for_dependencies(state);
drm_atomic_helper_update_legacy_modeset_state(dev, state);
drm_atomic_helper_calc_timestamping_constants(state);
+ drm_atomic_helper_commit_luminance_disables(state);
if (atom->lock_core)
mutex_lock(&disp->mutex);
@@ -2370,6 +2377,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_commit *state)
if (atom->lock_core)
mutex_unlock(&disp->mutex);
+ drm_atomic_helper_commit_luminance_enables(state);
+
list_for_each_entry_safe(outp, outt, &atom->outp, head) {
list_del(&outp->head);
kfree(outp);
diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
index da1ee24a2531d..2366901581077 100644
--- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
@@ -234,12 +234,15 @@ nv50_backlight_init(struct nouveau_backlight *bl,
const struct backlight_ops **ops)
{
struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev);
+ int brightness;
+
+ brightness = nvif_outp_bl_get(&nv_encoder->outp);
/*
* Note when this runs the connectors have not been probed yet,
* so nv_conn->base.status is not set yet.
*/
- if (nvif_outp_bl_get(&nv_encoder->outp) < 0 ||
+ if (brightness < 0 ||
drm_helper_probe_detect(&nv_conn->base, NULL, false) != connector_status_connected)
return -ENODEV;
@@ -284,11 +287,25 @@ nv50_backlight_init(struct nouveau_backlight *bl,
*ops = &nv50_bl_ops;
props->max_brightness = 100;
+ props->brightness = brightness;
return 0;
}
-int
-nouveau_backlight_init(struct drm_connector *connector)
+/*
+ * LUMINANCE is an atomic connector property. Pre-NV50 hardware and
+ * nouveau.atomic=0 don't expose atomic modesetting to userspace (even though
+ * NV50+ still commits atomically internally), so keep the backlight class
+ * device there.
+ */
+static bool
+nouveau_backlight_use_luminance(struct drm_device *dev)
+{
+ return IS_ENABLED(CONFIG_DRM_LUMINANCE) &&
+ drm_core_check_feature(dev, DRIVER_ATOMIC);
+}
+
+static int
+nouveau_backlight_create(struct drm_connector *connector)
{
struct nouveau_drm *drm = nouveau_drm(connector->dev);
struct nouveau_backlight *bl;
@@ -317,6 +334,8 @@ nouveau_backlight_init(struct drm_connector *connector)
bl = kzalloc_obj(*bl);
if (!bl)
return -ENOMEM;
+ bl->id = -1;
+ bl->encoder = nv_encoder;
switch (device->info.family) {
case NV_DEVICE_INFO_V0_CURIE:
@@ -349,26 +368,36 @@ nouveau_backlight_init(struct drm_connector *connector)
goto fail_alloc;
}
- if (!nouveau_get_backlight_name(backlight_name, bl)) {
- NV_ERROR(drm, "Failed to retrieve a unique name for the backlight interface\n");
- goto fail_alloc;
- }
-
props.type = BACKLIGHT_RAW;
- bl->dev = backlight_device_register(backlight_name, connector->kdev,
- nv_encoder, ops, &props);
- if (IS_ERR(bl->dev)) {
- if (bl->id >= 0)
- ida_free(&bl_ida, bl->id);
- ret = PTR_ERR(bl->dev);
- goto fail_alloc;
+ if (nouveau_backlight_use_luminance(connector->dev)) {
+ ret = drm_connector_attach_luminance_property(connector, 0, props.max_brightness,
+ props.brightness);
+ if (ret)
+ goto fail_alloc;
+ } else {
+ if (!nouveau_get_backlight_name(backlight_name, bl)) {
+ NV_ERROR(drm,
+ "Failed to retrieve a unique name for the backlight interface\n");
+ goto fail_alloc;
+ }
+
+ bl->dev = backlight_device_register(backlight_name, connector->kdev,
+ nv_encoder, ops, &props);
+ if (IS_ERR(bl->dev)) {
+ if (bl->id >= 0)
+ ida_free(&bl_ida, bl->id);
+ ret = PTR_ERR(bl->dev);
+ goto fail_alloc;
+ }
}
nouveau_connector(connector)->backlight = bl;
- if (!bl->dev->props.brightness)
- bl->dev->props.brightness =
- bl->dev->ops->get_brightness(bl->dev);
- backlight_update_status(bl->dev);
+ if (bl->dev) {
+ if (!bl->dev->props.brightness)
+ bl->dev->props.brightness =
+ bl->dev->ops->get_brightness(bl->dev);
+ backlight_update_status(bl->dev);
+ }
return 0;
@@ -384,8 +413,40 @@ nouveau_backlight_init(struct drm_connector *connector)
return ret;
}
-void
-nouveau_backlight_fini(struct drm_connector *connector)
+/* Called from .late_register, the backlight class device needs connector->kdev */
+int
+nouveau_backlight_init(struct drm_connector *connector)
+{
+ if (nouveau_backlight_use_luminance(connector->dev))
+ return 0;
+
+ return nouveau_backlight_create(connector);
+}
+
+/* Called before drm_dev_register(), the LUMINANCE property must exist by then */
+int
+nouveau_backlight_luminance_init(struct drm_device *dev)
+{
+ struct drm_connector_list_iter conn_iter;
+ struct drm_connector *connector;
+ int ret = 0;
+
+ if (!nouveau_backlight_use_luminance(dev))
+ return 0;
+
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ nouveau_for_each_non_mst_connector_iter(connector, &conn_iter) {
+ ret = nouveau_backlight_create(connector);
+ if (ret)
+ break;
+ }
+ drm_connector_list_iter_end(&conn_iter);
+
+ return ret;
+}
+
+static void
+nouveau_backlight_free(struct drm_connector *connector)
{
struct nouveau_connector *nv_conn = nouveau_connector(connector);
struct nouveau_backlight *bl = nv_conn->backlight;
@@ -401,6 +462,23 @@ nouveau_backlight_fini(struct drm_connector *connector)
kfree(bl);
}
+/* Called from .early_unregister */
+void
+nouveau_backlight_fini(struct drm_connector *connector)
+{
+ /* LUMINANCE state is needed by commits until the connector is destroyed */
+ if (nouveau_backlight_use_luminance(connector->dev))
+ return;
+
+ nouveau_backlight_free(connector);
+}
+
+void
+nouveau_backlight_destroy(struct drm_connector *connector)
+{
+ nouveau_backlight_free(connector);
+}
+
void
nouveau_backlight_ctor(void)
{
@@ -412,3 +490,35 @@ nouveau_backlight_dtor(void)
{
ida_destroy(&bl_ida);
}
+
+void
+nouveau_backlight_set_luminance(const struct drm_connector_state *conn_state)
+{
+ struct nouveau_connector *nv_connector = nouveau_connector(conn_state->connector);
+ struct nouveau_backlight *bl = nv_connector->backlight;
+ unsigned int luminance = conn_state->luminance;
+
+ if (!bl)
+ return;
+
+ if (bl->uses_dpcd)
+ drm_edp_backlight_set_level(&nv_connector->aux, &bl->edp_info,
+ luminance);
+ else
+ nvif_outp_bl_set(&bl->encoder->outp, luminance);
+}
+
+void
+nouveau_backlight_disable_luminance(const struct drm_connector_state *conn_state)
+{
+ struct nouveau_connector *nv_connector = nouveau_connector(conn_state->connector);
+ struct nouveau_backlight *bl = nv_connector->backlight;
+
+ if (!bl)
+ return;
+
+ if (bl->uses_dpcd)
+ drm_edp_backlight_disable(&nv_connector->aux, &bl->edp_info);
+ else
+ nvif_outp_bl_set(&bl->encoder->outp, 0);
+}
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index cc3caf8de64b0..cbbdd36f49bb7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -400,6 +400,7 @@ nouveau_connector_destroy(struct drm_connector *connector)
cancel_work_sync(&nv_connector->irq_work);
drm_edid_free(nv_connector->drm_edid);
drm_connector_unregister(connector);
+ nouveau_backlight_destroy(connector);
drm_connector_cleanup(connector);
if (nv_connector->aux.transfer)
drm_dp_cec_unregister_connector(&nv_connector->aux);
@@ -1225,6 +1226,8 @@ nouveau_connector_helper_funcs = {
.mode_valid = nouveau_connector_mode_valid,
.best_encoder = nouveau_connector_best_encoder,
.atomic_check = nouveau_connector_atomic_check,
+ .set_luminance = nouveau_backlight_set_luminance,
+ .disable_luminance = nouveau_backlight_disable_luminance,
};
static const struct drm_connector_funcs
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h
index eb292d2ba4bcd..f53107ec0bf3f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.h
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
@@ -50,6 +50,7 @@ struct nouveau_backlight {
struct backlight_device *dev;
struct drm_edp_backlight_info edp_info;
+ struct nouveau_encoder *encoder;
bool uses_dpcd : 1;
int id;
@@ -237,8 +238,12 @@ nouveau_conn_mode_clock_valid(const struct drm_display_mode *,
#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
extern int nouveau_backlight_init(struct drm_connector *);
extern void nouveau_backlight_fini(struct drm_connector *);
+int nouveau_backlight_luminance_init(struct drm_device *dev);
+void nouveau_backlight_destroy(struct drm_connector *connector);
extern void nouveau_backlight_ctor(void);
extern void nouveau_backlight_dtor(void);
+void nouveau_backlight_set_luminance(const struct drm_connector_state *conn_state);
+void nouveau_backlight_disable_luminance(const struct drm_connector_state *conn_state);
#else
static inline int
nouveau_backlight_init(struct drm_connector *connector)
@@ -250,6 +255,16 @@ static inline void
nouveau_backlight_fini(struct drm_connector *connector) {
}
+static inline int
+nouveau_backlight_luminance_init(struct drm_device *dev)
+{
+ return 0;
+}
+
+static inline void
+nouveau_backlight_destroy(struct drm_connector *connector) {
+}
+
static inline void
nouveau_backlight_ctor(void) {
}
@@ -257,6 +272,14 @@ nouveau_backlight_ctor(void) {
static inline void
nouveau_backlight_dtor(void) {
}
+
+static inline void
+nouveau_backlight_set_luminance(const struct drm_connector_state *conn_state) {
+}
+
+static inline void
+nouveau_backlight_disable_luminance(const struct drm_connector_state *conn_state) {
+}
#endif
#endif /* __NOUVEAU_CONNECTOR_H__ */
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 5e1336615cf6d..53bf7c2caa164 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -673,6 +673,10 @@ nouveau_drm_device_init(struct nouveau_drm *drm)
ret = nouveau_display_init(dev, false, false);
if (ret)
goto fail_dispinit;
+
+ ret = nouveau_backlight_luminance_init(dev);
+ if (ret)
+ goto fail_backlight;
}
nouveau_debugfs_init(drm);
@@ -697,6 +701,8 @@ nouveau_drm_device_init(struct nouveau_drm *drm)
}
return 0;
+fail_backlight:
+ nouveau_display_fini(dev, false, false);
fail_dispinit:
nouveau_display_destroy(dev);
fail_dispctor:
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v11 09/12] drm/nouveau: add connector luminance support
2026-11-03 22:42 ` [PATCH v11 09/12] drm/nouveau: add connector " Mario Limonciello (AMD)
@ 2026-11-03 23:09 ` sashiko-bot
0 siblings, 0 replies; 21+ messages in thread
From: sashiko-bot @ 2026-11-03 23:09 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm/nouveau: unclamped brightness in nv50_backlight_init() fails probe
--
commit 1fa85caad592bf2bf4349656251ad8e42ff132c3
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/nouveau: add connector luminance support
This commit exposes Nouveau panel brightness through the atomic connector
LUMINANCE property when DRM_LUMINANCE is enabled and atomic modesetting is
active, while retaining the backlight class device fallback otherwise.
> diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
> index da1ee24a2531d..2366901581077 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
> @@ -234,12 +234,15 @@ nv50_backlight_init(struct nouveau_backlight *bl,
> const struct backlight_ops **ops)
> {
> struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev);
> + int brightness;
> +
> + brightness = nvif_outp_bl_get(&nv_encoder->outp);
>
> /*
> * Note when this runs the connectors have not been probed yet,
> * so nv_conn->base.status is not set yet.
> */
> - if (nvif_outp_bl_get(&nv_encoder->outp) < 0 ||
> + if (brightness < 0 ||
> drm_helper_probe_detect(&nv_conn->base, NULL, false) != connector_status_connected)
> return -ENODEV;
>
> @@ -284,11 +287,25 @@ nv50_backlight_init(struct nouveau_backlight *bl,
>
> *ops = &nv50_bl_ops;
> props->max_brightness = 100;
> + props->brightness = brightness;
> return 0;
> }
[ ... ]
> @@ -349,26 +368,36 @@ nouveau_backlight_init(struct drm_connector *connector)
> goto fail_alloc;
> }
>
> - if (!nouveau_get_backlight_name(backlight_name, bl)) {
> - NV_ERROR(drm, "Failed to retrieve a unique name for the backlight interface\n");
> - goto fail_alloc;
> - }
> -
> props.type = BACKLIGHT_RAW;
> - bl->dev = backlight_device_register(backlight_name, connector->kdev,
> - nv_encoder, ops, &props);
> - if (IS_ERR(bl->dev)) {
> - if (bl->id >= 0)
> - ida_free(&bl_ida, bl->id);
> - ret = PTR_ERR(bl->dev);
> - goto fail_alloc;
> + if (nouveau_backlight_use_luminance(connector->dev)) {
> + ret = drm_connector_attach_luminance_property(connector, 0, props.max_brightness,
> + props.brightness);
> + if (ret)
> + goto fail_alloc;
[Severity: High]
Can an unclamped initial brightness in nv50_backlight_init() cause
drm_connector_attach_luminance_property() to return -EINVAL and abort the
entire DRM device probe in nouveau_drm_device_init()?
In the nouveau_drm_device_init() -> nouveau_backlight_luminance_init() ->
nouveau_backlight_create() -> nv50_backlight_init() path, non-DPCD SOR
backlights set props->max_brightness = 100 and assign props->brightness =
brightness from nvif_outp_bl_get(&nv_encoder->outp) without clamping.
On NV50/G84/G94/MCP77, nv50_sor_bl_get() reads the 11-bit duty cycle field
and divides by a hardcoded div of 1025 without clamping (unlike
gt215_sor_bl_get()):
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c:nv50_sor_bl_get() {
u32 div = 1025;
u32 val = nvkm_rd32(device, 0x61c084 + soff);
val &= 0x000007ff;
return ((val * 100) + (div / 2)) / div;
}
When the 11-bit register value is between 1031 and 2047, nv50_sor_bl_get()
returns 101..200. Similarly, for eDP DPCD panels already in
DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD mode, drm_edp_backlight_init() ->
drm_edp_backlight_probe_state() reads the raw 8-bit or 16-bit
DP_EDP_BACKLIGHT_BRIGHTNESS_MSB/LSB registers into current_level without
clamping to bl->edp_info.max.
Previously, nv50_backlight_init() left props->brightness as 0 for non-DPCD
panels, and backlight_device_register() did not reject brightness >
max_brightness. With this change, drm_connector_attach_luminance_property()
checks:
if (drm_WARN_ON(connector->dev, min > max || value < min || value > max))
return -EINVAL;
Because nouveau_drm_device_init() treats any non-zero return from
nouveau_backlight_luminance_init() as fatal (jumping to fail_backlight),
should props.brightness be clamped to props.max_brightness before calling
drm_connector_attach_luminance_property()?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103-superm1-backlight-property-v11-0-00cce7b2ba22@kernel.org?part=9
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v11 10/12] drm/gud: add connector luminance support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (8 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 09/12] drm/nouveau: add connector " Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 22:59 ` sashiko-bot
2026-11-03 22:42 ` [PATCH v11 11/12] drm/bridge: add PS8622 " Mario Limonciello (AMD)
` (4 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose GUD display brightness through the connector LUMINANCE property
when DRM_LUMINANCE is enabled. The value is mirrored into tv.brightness
during atomic check so it is sent to the device with
GUD_REQ_SET_STATE_CHECK in the same commit.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Apply LUMINANCE in the atomic commit instead of a worker, fixing an
endless commit loop, a use-after-free on disconnect and brightness
being clobbered on DPMS off (Sashiko)
* Attach the property at connector init (Sashiko)
* Keep selecting BACKLIGHT_CLASS_DEVICE (Sashiko)
---
drivers/gpu/drm/gud/gud_connector.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/gud/gud_connector.c b/drivers/gpu/drm/gud/gud_connector.c
index ddbf3b3ebbca8..bfb298bbc9b51 100644
--- a/drivers/gpu/drm/gud/gud_connector.c
+++ b/drivers/gpu/drm/gud/gud_connector.c
@@ -292,10 +292,19 @@ static int gud_connector_atomic_check(struct drm_connector *connector,
struct drm_connector_state *old_state;
new_state = drm_atomic_get_new_connector_state(state, connector);
+ old_state = drm_atomic_get_old_connector_state(state, connector);
+
+ /*
+ * LUMINANCE is sent to the device as tv.brightness in the same commit,
+ * the brightness change below then triggers GUD_REQ_SET_STATE_CHECK.
+ */
+ if (connector->luminance_property &&
+ old_state->luminance != new_state->luminance)
+ new_state->tv.brightness = new_state->luminance;
+
if (!new_state->crtc)
return 0;
- old_state = drm_atomic_get_old_connector_state(state, connector);
new_crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc);
if (old_state->tv.margins.left != new_state->tv.margins.left ||
@@ -324,7 +333,7 @@ static int gud_connector_late_register(struct drm_connector *connector)
{
struct gud_connector *gconn = to_gud_connector(connector);
- if (gconn->initial_brightness < 0)
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE) || gconn->initial_brightness < 0)
return 0;
return gud_connector_backlight_register(gconn);
@@ -699,6 +708,13 @@ static int gud_connector_create(struct gud_device *gdrm, unsigned int index,
return ret;
}
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE) && gconn->initial_brightness >= 0) {
+ ret = drm_connector_attach_luminance_property(connector, 0, 100,
+ gconn->initial_brightness);
+ if (ret)
+ return ret;
+ }
+
gconn->encoder.possible_crtcs = drm_crtc_mask(&gdrm->crtc);
ret = drm_encoder_init(drm, &gconn->encoder, &gud_drm_simple_encoder_funcs_cleanup,
DRM_MODE_ENCODER_NONE, NULL);
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v11 10/12] drm/gud: add connector luminance support
2026-11-03 22:42 ` [PATCH v11 10/12] drm/gud: " Mario Limonciello (AMD)
@ 2026-11-03 22:59 ` sashiko-bot
0 siblings, 0 replies; 21+ messages in thread
From: sashiko-bot @ 2026-11-03 22:59 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm/gud: LUMINANCE updates in gud_connector_atomic_check() require modeset
--
commit 8034990b85e36e57451a40c677e5ac4037438eda
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/gud: add connector luminance support
This commit exposes GUD display brightness through the connector LUMINANCE
property when CONFIG_DRM_LUMINANCE is enabled, mirroring luminance changes
into tv.brightness during atomic check.
> diff --git a/drivers/gpu/drm/gud/gud_connector.c b/drivers/gpu/drm/gud/gud_connector.c
> index ddbf3b3ebbca8..bfb298bbc9b51 100644
> --- a/drivers/gpu/drm/gud/gud_connector.c
> +++ b/drivers/gpu/drm/gud/gud_connector.c
> @@ -292,10 +292,19 @@ static int gud_connector_atomic_check(struct drm_connector *connector,
> struct drm_connector_state *old_state;
>
> new_state = drm_atomic_get_new_connector_state(state, connector);
> + old_state = drm_atomic_get_old_connector_state(state, connector);
> +
> + /*
> + * LUMINANCE is sent to the device as tv.brightness in the same commit,
> + * the brightness change below then triggers GUD_REQ_SET_STATE_CHECK.
> + */
> + if (connector->luminance_property &&
> + old_state->luminance != new_state->luminance)
> + new_state->tv.brightness = new_state->luminance;
[Severity: High]
Will mirroring new_state->luminance into new_state->tv.brightness here cause
non-modeset atomic commits that update LUMINANCE to fail with -EINVAL?
In gud_connector_atomic_check(), changing new_state->tv.brightness sets
new_crtc_state->connectors_changed:
if (old_state->tv.margins.left != new_state->tv.margins.left ||
...
old_state->tv.brightness != new_state->tv.brightness ||
...)
new_crtc_state->connectors_changed = true;
When a userspace compositor updates LUMINANCE in a normal atomic commit
without DRM_MODE_ATOMIC_ALLOW_MODESET:
drm_mode_atomic_ioctl()
-> drm_atomic_check_only()
-> drm_atomic_helper_check()
-> drm_atomic_helper_check_modeset()
-> gud_connector_atomic_check()
-> drm_atomic_helper_check_planes()
-> gud_plane_atomic_check()
gud_plane_atomic_check() sees crtc_state->connectors_changed and sends
GUD_REQ_SET_STATE_CHECK to the USB device, but drm_atomic_check_only() then
rejects the commit because drm_atomic_crtc_needs_modeset(new_crtc_state) is
true when connectors_changed is set:
if (!state->allow_modeset) {
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
drm_dbg_atomic(dev, "[CRTC:%d:%s] requires full modeset\n",
crtc->base.id, crtc->name);
return -EINVAL;
}
}
}
Even if DRM_MODE_ATOMIC_ALLOW_MODESET is passed, wouldn't setting
connectors_changed force a full CRTC modeset on every brightness adjustment?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103-superm1-backlight-property-v11-0-00cce7b2ba22@kernel.org?part=10
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v11 11/12] drm/bridge: add PS8622 connector luminance support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (9 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 10/12] drm/gud: " Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-03 23:02 ` sashiko-bot
2026-11-03 22:42 ` [PATCH v11 12/12] drm/solomon: add SSD130x " Mario Limonciello (AMD)
` (3 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose PS8622 brightness through bridge luminance operations when
DRM_LUMINANCE is enabled. Keep registering the backlight class device
otherwise.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Track internal PWM mode explicitly so it is still configured with
LUMINANCE (Sashiko)
* Don't access I2C while the bridge is powered down (Sashiko)
* Keep selecting BACKLIGHT_CLASS_DEVICE (Sashiko)
* Program the committed luminance in pre_enable
---
drivers/gpu/drm/bridge/parade-ps8622.c | 66 +++++++++++++++++++++++++++-------
1 file changed, 53 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c b/drivers/gpu/drm/bridge/parade-ps8622.c
index 3a2ec482037df..c88bd7a97d4a4 100644
--- a/drivers/gpu/drm/bridge/parade-ps8622.c
+++ b/drivers/gpu/drm/bridge/parade-ps8622.c
@@ -45,6 +45,8 @@ struct ps8622_bridge {
struct drm_bridge *panel_bridge;
struct regulator *v12;
struct backlight_device *bl;
+ u8 brightness;
+ bool internal_pwm;
struct gpio_desc *gpio_slp;
struct gpio_desc *gpio_rst;
@@ -268,7 +270,7 @@ static int ps8622_send_config(struct ps8622_bridge *ps8622)
goto error;
- if (ps8622->bl) {
+ if (ps8622->internal_pwm) {
/* DPCD720, internal PWM */
err = ps8622_set(cl, 0x01, 0xa5, 0xa0);
if (err)
@@ -276,7 +278,7 @@ static int ps8622_send_config(struct ps8622_bridge *ps8622)
/* FFh for 100% brightness, 0h for 0% brightness */
err = ps8622_set(cl, 0x01, 0xa7,
- ps8622->bl->props.brightness);
+ ps8622->brightness);
if (err)
goto error;
} else {
@@ -324,6 +326,8 @@ static int ps8622_backlight_update(struct backlight_device *bl)
struct ps8622_bridge *ps8622 = dev_get_drvdata(&bl->dev);
int ret, brightness = backlight_get_brightness(bl);
+ ps8622->brightness = brightness;
+
if (!ps8622->enabled)
return -EINVAL;
@@ -332,6 +336,20 @@ static int ps8622_backlight_update(struct backlight_device *bl)
return ret;
}
+static void ps8622_set_luminance(struct drm_bridge *bridge,
+ unsigned int luminance)
+{
+ struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
+
+ ps8622->brightness = luminance;
+
+ /* Applied by ps8622_send_config() on the next pre_enable */
+ if (!ps8622->enabled)
+ return;
+
+ ps8622_set(ps8622->client, 0x01, 0xa7, luminance);
+}
+
static const struct backlight_ops ps8622_backlight_ops = {
.update_status = ps8622_backlight_update,
};
@@ -340,11 +358,22 @@ static void ps8622_pre_enable(struct drm_bridge *bridge,
struct drm_atomic_commit *commit)
{
struct ps8622_bridge *ps8622 = bridge_to_ps8622(bridge);
+ struct drm_connector *connector;
int ret;
if (ps8622->enabled)
return;
+ /* Program the committed luminance from ps8622_send_config() */
+ connector = drm_atomic_get_new_connector_for_encoder(commit, bridge->encoder);
+ if (connector && connector->luminance_property) {
+ const struct drm_connector_state *conn_state =
+ drm_atomic_get_new_connector_state(commit, connector);
+
+ if (conn_state)
+ ps8622->brightness = conn_state->luminance;
+ }
+
gpiod_set_value(ps8622->gpio_rst, 0);
if (ps8622->v12) {
@@ -438,6 +467,7 @@ static const struct drm_bridge_funcs ps8622_bridge_funcs = {
.atomic_disable = ps8622_disable,
.atomic_post_disable = ps8622_post_disable,
.attach = ps8622_attach,
+ .set_luminance = ps8622_set_luminance,
};
static const struct of_device_id ps8622_devices[] = {
@@ -502,18 +532,28 @@ static int ps8622_probe(struct i2c_client *client)
ps8622->lane_count = ps8622->max_lane_count;
}
- if (!of_property_read_bool(dev->of_node, "use-external-pwm")) {
- ps8622->bl = backlight_device_register("ps8622-backlight",
- dev, ps8622, &ps8622_backlight_ops,
- NULL);
- if (IS_ERR(ps8622->bl)) {
- DRM_ERROR("failed to register backlight\n");
- ret = PTR_ERR(ps8622->bl);
- ps8622->bl = NULL;
- return ret;
+ ps8622->brightness = PS8622_MAX_BRIGHTNESS;
+ ps8622->internal_pwm = !of_property_read_bool(dev->of_node,
+ "use-external-pwm");
+ if (ps8622->internal_pwm) {
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE)) {
+ ps8622->bridge.ops |= DRM_BRIDGE_OP_LUMINANCE;
+ ps8622->bridge.luminance_max = PS8622_MAX_BRIGHTNESS;
+ ps8622->bridge.luminance = ps8622->brightness;
+ } else {
+ ps8622->bl = backlight_device_register("ps8622-backlight",
+ dev, ps8622,
+ &ps8622_backlight_ops,
+ NULL);
+ if (IS_ERR(ps8622->bl)) {
+ DRM_ERROR("failed to register backlight\n");
+ ret = PTR_ERR(ps8622->bl);
+ ps8622->bl = NULL;
+ return ret;
+ }
+ ps8622->bl->props.max_brightness = PS8622_MAX_BRIGHTNESS;
+ ps8622->bl->props.brightness = ps8622->brightness;
}
- ps8622->bl->props.max_brightness = PS8622_MAX_BRIGHTNESS;
- ps8622->bl->props.brightness = PS8622_MAX_BRIGHTNESS;
}
ps8622->bridge.type = DRM_MODE_CONNECTOR_LVDS;
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v11 11/12] drm/bridge: add PS8622 connector luminance support
2026-11-03 22:42 ` [PATCH v11 11/12] drm/bridge: add PS8622 " Mario Limonciello (AMD)
@ 2026-11-03 23:02 ` sashiko-bot
0 siblings, 0 replies; 21+ messages in thread
From: sashiko-bot @ 2026-11-03 23:02 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: dri-devel, intel-gfx, intel-xe
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/bridge: ps8622: clobbered brightness in ps8622_backlight_update()
--
commit a81389f64f9ebf64ed6660717e83f2f04182a30d
Author: Mario Limonciello <mario.limonciello@amd.com>
drm/bridge: add PS8622 connector luminance support
This commit exposes PS8622 brightness control through bridge luminance
operations when DRM_LUMINANCE is enabled, while continuing to register the
backlight class device otherwise.
> diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c b/drivers/gpu/drm/bridge/parade-ps8622.c
> index 3a2ec482037df..c88bd7a97d4a4 100644
> --- a/drivers/gpu/drm/bridge/parade-ps8622.c
> +++ b/drivers/gpu/drm/bridge/parade-ps8622.c
[ ... ]
> @@ -268,7 +270,7 @@ static int ps8622_send_config(struct ps8622_bridge *ps8622)
> goto error;
>
>
> - if (ps8622->bl) {
> + if (ps8622->internal_pwm) {
> /* DPCD720, internal PWM */
> err = ps8622_set(cl, 0x01, 0xa5, 0xa0);
> if (err)
> @@ -276,7 +278,7 @@ static int ps8622_send_config(struct ps8622_bridge *ps8622)
>
> /* FFh for 100% brightness, 0h for 0% brightness */
> err = ps8622_set(cl, 0x01, 0xa7,
> - ps8622->bl->props.brightness);
> + ps8622->brightness);
> if (err)
> goto error;
> } else {
> @@ -324,6 +326,8 @@ static int ps8622_backlight_update(struct backlight_device *bl)
> struct ps8622_bridge *ps8622 = dev_get_drvdata(&bl->dev);
> int ret, brightness = backlight_get_brightness(bl);
>
> + ps8622->brightness = brightness;
> +
> if (!ps8622->enabled)
> return -EINVAL;
[Severity: Medium]
Can updating ps8622->brightness from backlight_get_brightness(bl) before
checking ps8622->enabled clobber the cached brightness with 0 when the
backlight is blanked while the bridge is disabled?
Previously, ps8622_send_config() programmed ps8622->bl->props.brightness,
which preserves the requested brightness level across blanking. Now it
programs ps8622->brightness, which is updated in ps8622_backlight_update()
from backlight_get_brightness(bl):
static inline int backlight_get_brightness(const struct backlight_device *bd)
{
if (backlight_is_blank(bd))
return 0;
else
return bd->props.brightness;
}
If userspace writes BACKLIGHT_POWER_OFF to bl_power while ps8622->enabled is
false, bl_power_store() in drivers/video/backlight/backlight.c temporarily
sets bd->props.power and calls backlight_update_status(bd) ->
ps8622_backlight_update(bl), which overwrites ps8622->brightness with 0 and
returns -EINVAL:
if (bd->props.power != power) {
old_power = bd->props.power;
bd->props.power = power;
rc = backlight_update_status(bd);
if (rc)
bd->props.power = old_power;
Because ps8622_backlight_update() returns -EINVAL, bl_power_store() rolls
bd->props.power back to BACKLIGHT_POWER_ON, leaving the backlight device
unblanked at its non-zero bd->props.brightness while ps8622->brightness has
been overwritten with 0.
Similarly, during fbdev blanking or backlight_suspend(), if the bridge is
disabled first (setting ps8622->enabled = false in ps8622_post_disable()) and
the backlight notifier or suspend callback subsequently invokes
ps8622_backlight_update(bl), ps8622->brightness is overwritten with 0 while
disabled. On the next ps8622_pre_enable() -> ps8622_send_config(), the panel
backlight will be programmed to 0 instead of the configured brightness.
Would it make sense to avoid overwriting ps8622->brightness when returning
-EINVAL, or to keep using bl->props.brightness when restoring the initial
backlight level in ps8622_send_config()?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103-superm1-backlight-property-v11-0-00cce7b2ba22@kernel.org?part=11
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v11 12/12] drm/solomon: add SSD130x connector luminance support
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (10 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 11/12] drm/bridge: add PS8622 " Mario Limonciello (AMD)
@ 2026-11-03 22:42 ` Mario Limonciello (AMD)
2026-11-04 16:18 ` ✓ CI.KUnit: success for Add support for a DRM backlight capability Patchwork
` (2 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Mario Limonciello (AMD) @ 2026-11-03 22:42 UTC (permalink / raw)
To: Maxime Ripard, Alex Deucher, Jani Nikula,
Javier Martinez Canillas, Maarten Lankhorst, Thomas Zimmermann,
David Airlie, Simona Vetter, Harry Wentland, Leo Li,
Rodrigo Siqueira
Cc: Mario Limonciello, Xaver Hugl, dri-devel, linux-kernel, amd-gfx,
intel-gfx, intel-xe, nouveau, Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Expose SSD130x contrast through the connector LUMINANCE property when
DRM_LUMINANCE is enabled. Program contrast directly and register the
backlight class device only when DRM_LUMINANCE is disabled, so contrast
has a single owner.
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v11:
* Keep selecting BACKLIGHT_CLASS_DEVICE and drop the guards (Sashiko)
* Register the backlight device only without DRM_LUMINANCE (Sashiko)
* Initialise the controller with the committed luminance and don't
clobber the saved contrast on disable (Sashiko)
* Skip contrast writes while the controller is powered down (Sashiko)
* Unify contrast dispatch and backlight ops (Sashiko)
* Drop Reviewed-by due to the rework
v10:
* Guard the backlight operations and registration with
BACKLIGHT_CLASS_DEVICE
* Fix Kconfig recursive issue
* Add the Reviewed-by tag
---
drivers/gpu/drm/solomon/ssd130x.c | 149 ++++++++++++++++++++++++--------------
drivers/gpu/drm/solomon/ssd130x.h | 2 +
2 files changed, 98 insertions(+), 53 deletions(-)
diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c
index ee43cf0da8792..32e892194f578 100644
--- a/drivers/gpu/drm/solomon/ssd130x.c
+++ b/drivers/gpu/drm/solomon/ssd130x.c
@@ -627,7 +627,7 @@ static int ssd130x_init(struct ssd130x_device *ssd130x)
static int ssd132x_init(struct ssd130x_device *ssd130x)
{
const u8 cmds[] = {
- 2, SSD13XX_CONTRAST, 0x80,
+ 2, SSD13XX_CONTRAST, ssd130x->contrast,
3, SSD132X_SET_COL_RANGE, 0x00, ssd130x->width / SSD132X_SEGMENT_WIDTH - 1,
3, SSD132X_SET_ROW_RANGE, 0x00, ssd130x->height - 1,
/*
@@ -696,6 +696,18 @@ static int ssd135x_set_contrast(struct ssd130x_device *ssd130x, u32 brightness)
return ssd130x_write_cmd(ssd130x, 4, SSD135X_SET_CONTRAST, a, b, c);
}
+static int ssd130x_set_contrast(struct ssd130x_device *ssd130x, u32 contrast)
+{
+ switch (ssd130x->device_info->family_id) {
+ case SSD133X_FAMILY:
+ return ssd133x_set_contrast(ssd130x, contrast);
+ case SSD135X_FAMILY:
+ return ssd135x_set_contrast(ssd130x, contrast);
+ default:
+ return ssd130x_write_cmd(ssd130x, 2, SSD13XX_CONTRAST, contrast);
+ }
+}
+
static int ssd133x_init(struct ssd130x_device *ssd130x)
{
int ret;
@@ -1836,6 +1848,23 @@ static const struct drm_crtc_funcs ssd130x_crtc_funcs = {
.atomic_destroy_state = ssd130x_crtc_destroy_state,
};
+/*
+ * With DRM_LUMINANCE, initialize the controller with the committed connector
+ * luminance, which may have changed while the display was disabled.
+ */
+static void ssd130x_load_luminance(struct ssd130x_device *ssd130x,
+ struct drm_atomic_commit *state)
+{
+ struct drm_connector_state *conn_state;
+
+ if (!IS_ENABLED(CONFIG_DRM_LUMINANCE))
+ return;
+
+ conn_state = drm_atomic_get_new_connector_state(state, &ssd130x->connector);
+ if (conn_state)
+ ssd130x->contrast = conn_state->luminance;
+}
+
static void ssd130x_encoder_atomic_enable(struct drm_encoder *encoder,
struct drm_atomic_commit *state)
{
@@ -1847,12 +1876,16 @@ static void ssd130x_encoder_atomic_enable(struct drm_encoder *encoder,
if (ret)
return;
+ ssd130x_load_luminance(ssd130x, state);
+
ret = ssd130x_init(ssd130x);
if (ret)
goto power_off;
ssd130x_write_cmd(ssd130x, 1, SSD13XX_DISPLAY_ON);
+ ssd130x->enabled = true;
+
backlight_enable(ssd130x->bl_dev);
return;
@@ -1873,12 +1906,16 @@ static void ssd132x_encoder_atomic_enable(struct drm_encoder *encoder,
if (ret)
return;
+ ssd130x_load_luminance(ssd130x, state);
+
ret = ssd132x_init(ssd130x);
if (ret)
goto power_off;
ssd130x_write_cmd(ssd130x, 1, SSD13XX_DISPLAY_ON);
+ ssd130x->enabled = true;
+
backlight_enable(ssd130x->bl_dev);
return;
@@ -1898,12 +1935,16 @@ static void ssd133x_encoder_atomic_enable(struct drm_encoder *encoder,
if (ret)
return;
+ ssd130x_load_luminance(ssd130x, state);
+
ret = ssd133x_init(ssd130x);
if (ret)
goto power_off;
ssd130x_write_cmd(ssd130x, 1, SSD13XX_DISPLAY_ON);
+ ssd130x->enabled = true;
+
backlight_enable(ssd130x->bl_dev);
return;
@@ -1923,12 +1964,16 @@ static void ssd135x_encoder_atomic_enable(struct drm_encoder *encoder,
if (ret)
return;
+ ssd130x_load_luminance(ssd130x, state);
+
ret = ssd135x_init(ssd130x);
if (ret)
goto power_off;
ssd130x_write_cmd(ssd130x, 1, SSD13XX_DISPLAY_ON);
+ ssd130x->enabled = true;
+
backlight_enable(ssd130x->bl_dev);
return;
@@ -1945,6 +1990,8 @@ static void ssd130x_encoder_atomic_disable(struct drm_encoder *encoder,
backlight_disable(ssd130x->bl_dev);
+ ssd130x->enabled = false;
+
ssd130x_write_cmd(ssd130x, 1, SSD13XX_DISPLAY_OFF);
ssd130x_power_off(ssd130x);
@@ -1980,8 +2027,34 @@ static int ssd130x_connector_get_modes(struct drm_connector *connector)
return drm_connector_helper_get_modes_fixed(connector, &ssd130x->mode);
}
+static void ssd130x_connector_set_luminance(const struct drm_connector_state *conn_state)
+{
+ struct ssd130x_device *ssd130x = drm_to_ssd130x(conn_state->connector->dev);
+
+ /*
+ * The encoder enable already initialized the controller with the
+ * committed luminance. Skip if it failed to power up the controller.
+ */
+ if (!ssd130x->enabled || ssd130x->contrast == conn_state->luminance)
+ return;
+
+ ssd130x->contrast = conn_state->luminance;
+ ssd130x_set_contrast(ssd130x, ssd130x->contrast);
+}
+
+static void ssd130x_connector_disable_luminance(const struct drm_connector_state *conn_state)
+{
+ struct ssd130x_device *ssd130x = drm_to_ssd130x(conn_state->connector->dev);
+
+ /* Keep ssd130x->contrast, it is restored when the encoder is enabled */
+ if (ssd130x->enabled)
+ ssd130x_set_contrast(ssd130x, 0);
+}
+
static const struct drm_connector_helper_funcs ssd130x_connector_helper_funcs = {
.get_modes = ssd130x_connector_get_modes,
+ .set_luminance = ssd130x_connector_set_luminance,
+ .disable_luminance = ssd130x_connector_disable_luminance,
};
static const struct drm_connector_funcs ssd130x_connector_funcs = {
@@ -2016,55 +2089,16 @@ static const struct drm_driver ssd130x_drm_driver = {
};
static int ssd130x_update_bl(struct backlight_device *bdev)
-{
- struct ssd130x_device *ssd130x = bl_get_data(bdev);
- int brightness = backlight_get_brightness(bdev);
- int ret;
-
- ssd130x->contrast = brightness;
-
- ret = ssd130x_write_cmd(ssd130x, 1, SSD13XX_CONTRAST);
- if (ret < 0)
- return ret;
-
- ret = ssd130x_write_cmd(ssd130x, 1, ssd130x->contrast);
- if (ret < 0)
- return ret;
-
- return 0;
-}
-
-static int ssd133x_update_bl(struct backlight_device *bdev)
-{
- struct ssd130x_device *ssd130x = bl_get_data(bdev);
-
- ssd130x->contrast = backlight_get_brightness(bdev);
-
- return ssd133x_set_contrast(ssd130x, ssd130x->contrast);
-}
-
-static int ssd135x_update_bl(struct backlight_device *bdev)
{
struct ssd130x_device *ssd130x = bl_get_data(bdev);
ssd130x->contrast = backlight_get_brightness(bdev);
- return ssd135x_set_contrast(ssd130x, ssd130x->contrast);
+ return ssd130x_set_contrast(ssd130x, ssd130x->contrast);
}
-static const struct backlight_ops ssd130xfb_bl_ops[] = {
- [SSD130X_FAMILY] = {
- .update_status = ssd130x_update_bl,
- },
- [SSD132X_FAMILY] = {
- .update_status = ssd130x_update_bl,
- },
- [SSD133X_FAMILY] = {
- .update_status = ssd133x_update_bl,
- },
- [SSD135X_FAMILY] = {
- .update_status = ssd135x_update_bl,
- },
+static const struct backlight_ops ssd130xfb_bl_ops = {
+ .update_status = ssd130x_update_bl,
};
static void ssd130x_parse_properties(struct ssd130x_device *ssd130x)
@@ -2213,6 +2247,13 @@ static int ssd130x_init_modeset(struct ssd130x_device *ssd130x)
}
drm_connector_helper_add(connector, &ssd130x_connector_helper_funcs);
+ if (IS_ENABLED(CONFIG_DRM_LUMINANCE)) {
+ ret = drm_connector_attach_luminance_property(connector, 0,
+ MAX_CONTRAST,
+ ssd130x->contrast);
+ if (ret)
+ return ret;
+ }
ret = drm_connector_attach_encoder(connector, encoder);
if (ret) {
@@ -2270,16 +2311,18 @@ struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *regmap)
if (ret)
return ERR_PTR(ret);
- bl = devm_backlight_device_register(dev, dev_name(dev), dev, ssd130x,
- &ssd130xfb_bl_ops[ssd130x->device_info->family_id],
- NULL);
- if (IS_ERR(bl))
- return ERR_PTR(dev_err_probe(dev, PTR_ERR(bl),
- "Unable to register backlight device\n"));
-
- bl->props.brightness = ssd130x->contrast;
- bl->props.max_brightness = MAX_CONTRAST;
- ssd130x->bl_dev = bl;
+ if (!IS_ENABLED(CONFIG_DRM_LUMINANCE)) {
+ bl = devm_backlight_device_register(dev, dev_name(dev), dev,
+ ssd130x, &ssd130xfb_bl_ops,
+ NULL);
+ if (IS_ERR(bl))
+ return ERR_PTR(dev_err_probe(dev, PTR_ERR(bl),
+ "Unable to register backlight device\n"));
+
+ bl->props.brightness = ssd130x->contrast;
+ bl->props.max_brightness = MAX_CONTRAST;
+ ssd130x->bl_dev = bl;
+ }
ret = ssd130x_init_modeset(ssd130x);
if (ret)
diff --git a/drivers/gpu/drm/solomon/ssd130x.h b/drivers/gpu/drm/solomon/ssd130x.h
index fd81262f2ceb9..536a5649edffc 100644
--- a/drivers/gpu/drm/solomon/ssd130x.h
+++ b/drivers/gpu/drm/solomon/ssd130x.h
@@ -100,6 +100,8 @@ struct ssd130x_device {
u32 prechargep2;
struct backlight_device *bl_dev;
+ /* Controller is powered and initialized, set from atomic commits */
+ bool enabled;
struct pwm_device *pwm;
struct gpio_desc *reset;
struct regulator *vcc_reg;
--
2.53.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* ✓ CI.KUnit: success for Add support for a DRM backlight capability
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (11 preceding siblings ...)
2026-11-03 22:42 ` [PATCH v11 12/12] drm/solomon: add SSD130x " Mario Limonciello (AMD)
@ 2026-11-04 16:18 ` Patchwork
2026-11-04 16:34 ` ✗ CI.checksparse: warning " Patchwork
2026-11-04 16:52 ` ✓ Xe.CI.BAT: success " Patchwork
14 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2026-11-04 16:18 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: intel-xe
== Series Details ==
Series: Add support for a DRM backlight capability
URL : https://patchwork.freedesktop.org/series/177737/
State : success
== Summary ==
+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[16:16:24] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:16:29] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[16:16:49] Starting KUnit Kernel (1/1)...
[16:16:49] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[16:16:49] ================= gpu_buddy (14 subtests) ==================
[16:16:49] [PASSED] gpu_test_buddy_alloc_limit
[16:16:49] [PASSED] gpu_test_buddy_alloc_optimistic
[16:16:49] [PASSED] gpu_test_buddy_alloc_pessimistic
[16:16:49] [PASSED] gpu_test_buddy_alloc_pathological
[16:16:49] [PASSED] gpu_test_buddy_alloc_contiguous
[16:16:49] [PASSED] gpu_test_buddy_alloc_clear
[16:16:49] [PASSED] gpu_test_buddy_alloc_range
[16:16:50] [PASSED] gpu_test_buddy_alloc_range_bias
[16:16:50] [PASSED] gpu_test_buddy_fragmentation_performance
[16:16:51] [PASSED] gpu_test_buddy_dirty_tracker_performance
[16:16:51] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[16:16:51] [PASSED] gpu_test_buddy_offset_aligned_allocation
[16:16:51] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[16:16:51] [PASSED] gpu_test_buddy_addr_to_block
[16:16:51] ==================== [PASSED] gpu_buddy ====================
[16:16:51] ============================================================
[16:16:51] Testing complete. Ran 14 tests: passed: 14
[16:16:51] Elapsed time: 27.297s total, 5.149s configuring, 20.280s building, 1.805s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[16:16:51] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:16:54] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[16:17:32] Starting KUnit Kernel (1/1)...
[16:17:32] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[16:17:32] ================== guc_buf (11 subtests) ===================
[16:17:32] [PASSED] test_smallest
[16:17:32] [PASSED] test_largest
[16:17:32] [PASSED] test_granular
[16:17:32] [PASSED] test_unique
[16:17:32] [PASSED] test_overlap
[16:17:32] [PASSED] test_reusable
[16:17:32] [PASSED] test_too_big
[16:17:32] [PASSED] test_flush
[16:17:32] [PASSED] test_lookup
[16:17:32] [PASSED] test_data
[16:17:32] [PASSED] test_class
[16:17:32] ===================== [PASSED] guc_buf =====================
[16:17:32] =================== guc_dbm (7 subtests) ===================
[16:17:32] [PASSED] test_empty
[16:17:32] [PASSED] test_default
[16:17:32] ======================== test_size ========================
[16:17:32] [PASSED] 4
[16:17:32] [PASSED] 8
[16:17:32] [PASSED] 32
[16:17:32] [PASSED] 256
[16:17:32] ==================== [PASSED] test_size ====================
[16:17:32] ======================= test_reuse ========================
[16:17:32] [PASSED] 4
[16:17:32] [PASSED] 8
[16:17:32] [PASSED] 32
[16:17:32] [PASSED] 256
[16:17:32] =================== [PASSED] test_reuse ====================
[16:17:32] =================== test_range_overlap ====================
[16:17:32] [PASSED] 4
[16:17:32] [PASSED] 8
[16:17:32] [PASSED] 32
[16:17:32] [PASSED] 256
[16:17:32] =============== [PASSED] test_range_overlap ================
[16:17:32] =================== test_range_compact ====================
[16:17:32] [PASSED] 4
[16:17:32] [PASSED] 8
[16:17:32] [PASSED] 32
[16:17:32] [PASSED] 256
[16:17:32] =============== [PASSED] test_range_compact ================
[16:17:32] ==================== test_range_spare =====================
[16:17:32] [PASSED] 4
[16:17:32] [PASSED] 8
[16:17:32] [PASSED] 32
[16:17:32] [PASSED] 256
[16:17:32] ================ [PASSED] test_range_spare =================
[16:17:32] ===================== [PASSED] guc_dbm =====================
[16:17:32] ================== guc_idm (22 subtests) ===================
[16:17:32] [PASSED] bad_init
[16:17:32] [PASSED] no_init
[16:17:32] [PASSED] init_fini
[16:17:32] [PASSED] check_init_small
[16:17:32] [PASSED] check_init_shared
[16:17:32] [PASSED] check_used
[16:17:32] [PASSED] check_quota
[16:17:32] [PASSED] check_all
[16:17:32] [PASSED] check_limits
[16:17:32] [PASSED] check_overlap
[16:17:32] [PASSED] check_overlap_alloc
[16:17:32] [PASSED] check_overlap_release
[16:17:32] [PASSED] check_overlap_partial_init
[16:17:32] [PASSED] check_overlap_partial_shared_range_blocking
[16:17:32] [PASSED] check_used_usable
[16:17:32] [PASSED] check_used_shareable
[16:17:32] [PASSED] check_used_mixed
[16:17:32] [PASSED] check_release_usable_range
[16:17:32] [PASSED] check_release_shareable_range
[16:17:32] [PASSED] check_split_boundaries
[16:17:32] [PASSED] check_shareable_spare
[16:17:32] [PASSED] check_shareable_spare_fragmented_tail
[16:17:32] ===================== [PASSED] guc_idm =====================
[16:17:32] ============== guc_klv_helpers (13 subtests) ===============
[16:17:32] [PASSED] test_count
[16:17:32] [PASSED] test_encode_u32
[16:17:32] [PASSED] test_encode_u64
[16:17:32] [PASSED] test_encode_string
[16:17:32] [PASSED] test_encode_object_raw
[16:17:32] [PASSED] test_encode_object_klv
[16:17:32] [PASSED] test_encode_object_nested
[16:17:32] [PASSED] test_encode_object_basic
[16:17:32] ===================== test_decode_u16 =====================
[16:17:32] [PASSED] empty
[16:17:32] [PASSED] valid
[16:17:32] [PASSED] max
[16:17:32] [PASSED] big
[16:17:32] [PASSED] long
[16:17:32] ================= [PASSED] test_decode_u16 =================
[16:17:32] ===================== test_decode_u32 =====================
[16:17:32] [PASSED] empty
[16:17:32] [PASSED] valid
[16:17:32] [PASSED] max
[16:17:32] [PASSED] long
[16:17:32] ================= [PASSED] test_decode_u32 =================
[16:17:32] ===================== test_decode_u64 =====================
[16:17:32] [PASSED] empty
[16:17:32] [PASSED] short
[16:17:32] [PASSED] valid
[16:17:32] [PASSED] max
[16:17:32] [PASSED] long
[16:17:32] ================= [PASSED] test_decode_u64 =================
[16:17:32] ===================== test_decode_str =====================
[16:17:32] [PASSED] empty
[16:17:32] [PASSED] one
[16:17:32] [PASSED] one_trash
[16:17:32] [PASSED] two
[16:17:32] [PASSED] two_trash
[16:17:32] [PASSED] three
[16:17:32] [PASSED] dword
[16:17:32] [PASSED] four
[16:17:32] [PASSED] five
[16:17:32] [PASSED] six
[16:17:32] [PASSED] seven
[16:17:32] [PASSED] qword
[16:17:32] ================= [PASSED] test_decode_str =================
[16:17:32] [PASSED] test_print
[16:17:32] ================= [PASSED] guc_klv_helpers =================
[16:17:32] =================== xe_log (4 subtests) ====================
[16:17:32] [PASSED] demo_cper
[16:17:32] [PASSED] demo_dmesg
[16:17:32] ======================= test_dmesg ========================
[16:17:32] [PASSED] test_fatal
[16:17:32] [PASSED] test_fatal_tile
[16:17:32] [PASSED] test_fatal_gt
[16:17:32] [PASSED] test_fatal_comp
[16:17:32] [PASSED] test_fatal_comp_tile
[16:17:32] [PASSED] test_fatal_comp_gt
[16:17:32] [PASSED] test_fatal_all
[16:17:32] [PASSED] test_recoverable
[16:17:32] [PASSED] test_recoverable_tile
[16:17:32] [PASSED] test_recoverable_gt
[16:17:32] [PASSED] test_recoverable_comp
[16:17:32] [PASSED] test_recoverable_comp_tile
[16:17:32] [PASSED] test_recoverable_comp_gt
[16:17:32] [PASSED] test_recoverable_all
[16:17:32] [PASSED] test_info
[16:17:32] [PASSED] test_info_tile
[16:17:32] [PASSED] test_info_gt
[16:17:32] [PASSED] test_info_err
[16:17:32] [PASSED] test_info_comp
[16:17:32] [PASSED] test_info_comp_tile
[16:17:32] [PASSED] test_info_comp_gt
[16:17:32] [PASSED] test_info_all
[16:17:32] [PASSED] test_hw_fatal
[16:17:32] [PASSED] test_hw_recoverable
[16:17:32] [PASSED] test_hw_corrected
[16:17:32] [PASSED] test_hw_informational
[16:17:32] =================== [PASSED] test_dmesg ====================
[16:17:32] ====================== test_invalid =======================
[16:17:32] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[16:17:32] ================== [SKIPPED] test_invalid ==================
[16:17:32] ===================== [PASSED] xe_log ======================
[16:17:32] ================== no_relay (3 subtests) ===================
[16:17:32] [PASSED] xe_drops_guc2pf_if_not_ready
[16:17:32] [PASSED] xe_drops_guc2vf_if_not_ready
[16:17:32] [PASSED] xe_rejects_send_if_not_ready
[16:17:32] ==================== [PASSED] no_relay =====================
[16:17:32] ================== pf_relay (14 subtests) ==================
[16:17:32] [PASSED] pf_rejects_guc2pf_too_short
[16:17:32] [PASSED] pf_rejects_guc2pf_too_long
[16:17:32] [PASSED] pf_rejects_guc2pf_no_payload
[16:17:32] [PASSED] pf_fails_no_payload
[16:17:32] [PASSED] pf_fails_bad_origin
[16:17:32] [PASSED] pf_fails_bad_type
[16:17:32] [PASSED] pf_txn_reports_error
[16:17:32] [PASSED] pf_txn_sends_pf2guc
[16:17:32] [PASSED] pf_sends_pf2guc
[16:17:32] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[16:17:32] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[16:17:32] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[16:17:32] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[16:17:32] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[16:17:32] ==================== [PASSED] pf_relay =====================
[16:17:32] ================== vf_relay (3 subtests) ===================
[16:17:32] [PASSED] vf_rejects_guc2vf_too_short
[16:17:32] [PASSED] vf_rejects_guc2vf_too_long
[16:17:32] [PASSED] vf_rejects_guc2vf_no_payload
[16:17:32] ==================== [PASSED] vf_relay =====================
[16:17:32] ================ pf_gt_config (9 subtests) =================
[16:17:32] [PASSED] fair_contexts_1vf
[16:17:32] [PASSED] fair_doorbells_1vf
[16:17:32] [PASSED] fair_ggtt_1vf
[16:17:32] ====================== fair_vram_1vf ======================
[16:17:32] [PASSED] 3.50 GiB
[16:17:32] [PASSED] 11.5 GiB
[16:17:32] [PASSED] 15.5 GiB
[16:17:32] [PASSED] 31.5 GiB
[16:17:32] [PASSED] 63.5 GiB
[16:17:32] [PASSED] 1.91 GiB
[16:17:32] ================== [PASSED] fair_vram_1vf ==================
[16:17:32] ================ fair_vram_1vf_admin_only =================
[16:17:32] [PASSED] 3.50 GiB
[16:17:32] [PASSED] 11.5 GiB
[16:17:32] [PASSED] 15.5 GiB
[16:17:32] [PASSED] 31.5 GiB
[16:17:32] [PASSED] 63.5 GiB
[16:17:32] [PASSED] 1.91 GiB
[16:17:32] ============ [PASSED] fair_vram_1vf_admin_only =============
[16:17:32] ====================== fair_contexts ======================
[16:17:32] [PASSED] 1 VF
[16:17:32] [PASSED] 2 VFs
[16:17:32] [PASSED] 3 VFs
[16:17:32] [PASSED] 4 VFs
[16:17:32] [PASSED] 5 VFs
[16:17:32] [PASSED] 6 VFs
[16:17:32] [PASSED] 7 VFs
[16:17:32] [PASSED] 8 VFs
[16:17:32] [PASSED] 9 VFs
[16:17:32] [PASSED] 10 VFs
[16:17:32] [PASSED] 11 VFs
[16:17:32] [PASSED] 12 VFs
[16:17:32] [PASSED] 13 VFs
[16:17:32] [PASSED] 14 VFs
[16:17:32] [PASSED] 15 VFs
[16:17:32] [PASSED] 16 VFs
[16:17:32] [PASSED] 17 VFs
[16:17:32] [PASSED] 18 VFs
[16:17:32] [PASSED] 19 VFs
[16:17:32] [PASSED] 20 VFs
[16:17:32] [PASSED] 21 VFs
[16:17:32] [PASSED] 22 VFs
[16:17:32] [PASSED] 23 VFs
[16:17:32] [PASSED] 24 VFs
[16:17:32] [PASSED] 25 VFs
[16:17:32] [PASSED] 26 VFs
[16:17:32] [PASSED] 27 VFs
[16:17:32] [PASSED] 28 VFs
[16:17:32] [PASSED] 29 VFs
[16:17:32] [PASSED] 30 VFs
[16:17:32] [PASSED] 31 VFs
[16:17:32] [PASSED] 32 VFs
[16:17:32] [PASSED] 33 VFs
[16:17:32] [PASSED] 34 VFs
[16:17:32] [PASSED] 35 VFs
[16:17:32] [PASSED] 36 VFs
[16:17:32] [PASSED] 37 VFs
[16:17:32] [PASSED] 38 VFs
[16:17:32] [PASSED] 39 VFs
[16:17:32] [PASSED] 40 VFs
[16:17:32] [PASSED] 41 VFs
[16:17:32] [PASSED] 42 VFs
[16:17:32] [PASSED] 43 VFs
[16:17:32] [PASSED] 44 VFs
[16:17:32] [PASSED] 45 VFs
[16:17:32] [PASSED] 46 VFs
[16:17:32] [PASSED] 47 VFs
[16:17:32] [PASSED] 48 VFs
[16:17:32] [PASSED] 49 VFs
[16:17:32] [PASSED] 50 VFs
[16:17:32] [PASSED] 51 VFs
[16:17:32] [PASSED] 52 VFs
[16:17:32] [PASSED] 53 VFs
[16:17:32] [PASSED] 54 VFs
[16:17:32] [PASSED] 55 VFs
[16:17:32] [PASSED] 56 VFs
[16:17:32] [PASSED] 57 VFs
[16:17:32] [PASSED] 58 VFs
[16:17:32] [PASSED] 59 VFs
[16:17:32] [PASSED] 60 VFs
[16:17:32] [PASSED] 61 VFs
[16:17:32] [PASSED] 62 VFs
[16:17:32] [PASSED] 63 VFs
[16:17:32] ================== [PASSED] fair_contexts ==================
[16:17:32] ===================== fair_doorbells ======================
[16:17:32] [PASSED] 1 VF
[16:17:32] [PASSED] 2 VFs
[16:17:32] [PASSED] 3 VFs
[16:17:32] [PASSED] 4 VFs
[16:17:32] [PASSED] 5 VFs
[16:17:32] [PASSED] 6 VFs
[16:17:32] [PASSED] 7 VFs
[16:17:32] [PASSED] 8 VFs
[16:17:32] [PASSED] 9 VFs
[16:17:32] [PASSED] 10 VFs
[16:17:32] [PASSED] 11 VFs
[16:17:32] [PASSED] 12 VFs
[16:17:32] [PASSED] 13 VFs
[16:17:32] [PASSED] 14 VFs
[16:17:32] [PASSED] 15 VFs
[16:17:32] [PASSED] 16 VFs
[16:17:32] [PASSED] 17 VFs
[16:17:32] [PASSED] 18 VFs
[16:17:32] [PASSED] 19 VFs
[16:17:32] [PASSED] 20 VFs
[16:17:32] [PASSED] 21 VFs
[16:17:32] [PASSED] 22 VFs
[16:17:32] [PASSED] 23 VFs
[16:17:32] [PASSED] 24 VFs
[16:17:32] [PASSED] 25 VFs
[16:17:32] [PASSED] 26 VFs
[16:17:32] [PASSED] 27 VFs
[16:17:32] [PASSED] 28 VFs
[16:17:32] [PASSED] 29 VFs
[16:17:32] [PASSED] 30 VFs
[16:17:32] [PASSED] 31 VFs
[16:17:32] [PASSED] 32 VFs
[16:17:32] [PASSED] 33 VFs
[16:17:32] [PASSED] 34 VFs
[16:17:32] [PASSED] 35 VFs
[16:17:32] [PASSED] 36 VFs
[16:17:32] [PASSED] 37 VFs
[16:17:32] [PASSED] 38 VFs
[16:17:32] [PASSED] 39 VFs
[16:17:32] [PASSED] 40 VFs
[16:17:32] [PASSED] 41 VFs
[16:17:32] [PASSED] 42 VFs
[16:17:32] [PASSED] 43 VFs
[16:17:32] [PASSED] 44 VFs
[16:17:32] [PASSED] 45 VFs
[16:17:32] [PASSED] 46 VFs
[16:17:32] [PASSED] 47 VFs
[16:17:32] [PASSED] 48 VFs
[16:17:32] [PASSED] 49 VFs
[16:17:32] [PASSED] 50 VFs
[16:17:32] [PASSED] 51 VFs
[16:17:32] [PASSED] 52 VFs
[16:17:32] [PASSED] 53 VFs
[16:17:32] [PASSED] 54 VFs
[16:17:32] [PASSED] 55 VFs
[16:17:32] [PASSED] 56 VFs
[16:17:32] [PASSED] 57 VFs
[16:17:32] [PASSED] 58 VFs
[16:17:32] [PASSED] 59 VFs
[16:17:32] [PASSED] 60 VFs
[16:17:32] [PASSED] 61 VFs
[16:17:32] [PASSED] 62 VFs
[16:17:32] [PASSED] 63 VFs
[16:17:32] ================= [PASSED] fair_doorbells ==================
[16:17:32] ======================== fair_ggtt ========================
[16:17:32] [PASSED] 1 VF
[16:17:32] [PASSED] 2 VFs
[16:17:32] [PASSED] 3 VFs
[16:17:32] [PASSED] 4 VFs
[16:17:32] [PASSED] 5 VFs
[16:17:32] [PASSED] 6 VFs
[16:17:32] [PASSED] 7 VFs
[16:17:32] [PASSED] 8 VFs
[16:17:32] [PASSED] 9 VFs
[16:17:32] [PASSED] 10 VFs
[16:17:32] [PASSED] 11 VFs
[16:17:32] [PASSED] 12 VFs
[16:17:32] [PASSED] 13 VFs
[16:17:32] [PASSED] 14 VFs
[16:17:32] [PASSED] 15 VFs
[16:17:32] [PASSED] 16 VFs
[16:17:32] [PASSED] 17 VFs
[16:17:32] [PASSED] 18 VFs
[16:17:32] [PASSED] 19 VFs
[16:17:32] [PASSED] 20 VFs
[16:17:32] [PASSED] 21 VFs
[16:17:32] [PASSED] 22 VFs
[16:17:32] [PASSED] 23 VFs
[16:17:32] [PASSED] 24 VFs
[16:17:32] [PASSED] 25 VFs
[16:17:32] [PASSED] 26 VFs
[16:17:32] [PASSED] 27 VFs
[16:17:32] [PASSED] 28 VFs
[16:17:32] [PASSED] 29 VFs
[16:17:32] [PASSED] 30 VFs
[16:17:32] [PASSED] 31 VFs
[16:17:32] [PASSED] 32 VFs
[16:17:32] [PASSED] 33 VFs
[16:17:32] [PASSED] 34 VFs
[16:17:32] [PASSED] 35 VFs
[16:17:32] [PASSED] 36 VFs
[16:17:32] [PASSED] 37 VFs
[16:17:32] [PASSED] 38 VFs
[16:17:32] [PASSED] 39 VFs
[16:17:32] [PASSED] 40 VFs
[16:17:32] [PASSED] 41 VFs
[16:17:32] [PASSED] 42 VFs
[16:17:32] [PASSED] 43 VFs
[16:17:32] [PASSED] 44 VFs
[16:17:32] [PASSED] 45 VFs
[16:17:32] [PASSED] 46 VFs
[16:17:32] [PASSED] 47 VFs
[16:17:32] [PASSED] 48 VFs
[16:17:32] [PASSED] 49 VFs
[16:17:32] [PASSED] 50 VFs
[16:17:32] [PASSED] 51 VFs
[16:17:32] [PASSED] 52 VFs
[16:17:32] [PASSED] 53 VFs
[16:17:32] [PASSED] 54 VFs
[16:17:32] [PASSED] 55 VFs
[16:17:32] [PASSED] 56 VFs
[16:17:32] [PASSED] 57 VFs
[16:17:32] [PASSED] 58 VFs
[16:17:32] [PASSED] 59 VFs
[16:17:32] [PASSED] 60 VFs
[16:17:32] [PASSED] 61 VFs
[16:17:32] [PASSED] 62 VFs
[16:17:32] [PASSED] 63 VFs
[16:17:32] ==================== [PASSED] fair_ggtt ====================
[16:17:32] ======================== fair_vram ========================
[16:17:32] [PASSED] 1 VF
[16:17:32] [PASSED] 2 VFs
[16:17:32] [PASSED] 3 VFs
[16:17:32] [PASSED] 4 VFs
[16:17:32] [PASSED] 5 VFs
[16:17:32] [PASSED] 6 VFs
[16:17:32] [PASSED] 7 VFs
[16:17:32] [PASSED] 8 VFs
[16:17:32] [PASSED] 9 VFs
[16:17:32] [PASSED] 10 VFs
[16:17:32] [PASSED] 11 VFs
[16:17:32] [PASSED] 12 VFs
[16:17:32] [PASSED] 13 VFs
[16:17:32] [PASSED] 14 VFs
[16:17:32] [PASSED] 15 VFs
[16:17:32] [PASSED] 16 VFs
[16:17:32] [PASSED] 17 VFs
[16:17:32] [PASSED] 18 VFs
[16:17:32] [PASSED] 19 VFs
[16:17:32] [PASSED] 20 VFs
[16:17:32] [PASSED] 21 VFs
[16:17:32] [PASSED] 22 VFs
[16:17:32] [PASSED] 23 VFs
[16:17:32] [PASSED] 24 VFs
[16:17:32] [PASSED] 25 VFs
[16:17:32] [PASSED] 26 VFs
[16:17:32] [PASSED] 27 VFs
[16:17:32] [PASSED] 28 VFs
[16:17:32] [PASSED] 29 VFs
[16:17:32] [PASSED] 30 VFs
[16:17:32] [PASSED] 31 VFs
[16:17:32] [PASSED] 32 VFs
[16:17:32] [PASSED] 33 VFs
[16:17:32] [PASSED] 34 VFs
[16:17:32] [PASSED] 35 VFs
[16:17:32] [PASSED] 36 VFs
[16:17:32] [PASSED] 37 VFs
[16:17:32] [PASSED] 38 VFs
[16:17:32] [PASSED] 39 VFs
[16:17:32] [PASSED] 40 VFs
[16:17:32] [PASSED] 41 VFs
[16:17:32] [PASSED] 42 VFs
[16:17:32] [PASSED] 43 VFs
[16:17:32] [PASSED] 44 VFs
[16:17:32] [PASSED] 45 VFs
[16:17:32] [PASSED] 46 VFs
[16:17:32] [PASSED] 47 VFs
[16:17:32] [PASSED] 48 VFs
[16:17:32] [PASSED] 49 VFs
[16:17:32] [PASSED] 50 VFs
[16:17:32] [PASSED] 51 VFs
[16:17:32] [PASSED] 52 VFs
[16:17:32] [PASSED] 53 VFs
[16:17:32] [PASSED] 54 VFs
[16:17:32] [PASSED] 55 VFs
[16:17:32] [PASSED] 56 VFs
[16:17:32] [PASSED] 57 VFs
[16:17:32] [PASSED] 58 VFs
[16:17:32] [PASSED] 59 VFs
[16:17:32] [PASSED] 60 VFs
[16:17:32] [PASSED] 61 VFs
[16:17:32] [PASSED] 62 VFs
[16:17:32] [PASSED] 63 VFs
[16:17:32] ==================== [PASSED] fair_vram ====================
[16:17:32] ================== [PASSED] pf_gt_config ===================
[16:17:32] ===================== lmtt (1 subtest) =====================
[16:17:32] ======================== test_ops =========================
[16:17:32] [PASSED] 2-level
[16:17:32] [PASSED] multi-level
[16:17:32] ==================== [PASSED] test_ops =====================
[16:17:32] ====================== [PASSED] lmtt =======================
[16:17:32] ================= sriov_packet (1 subtest) =================
[16:17:32] [PASSED] test_descriptor_init
[16:17:32] ================== [PASSED] sriov_packet ===================
[16:17:32] ================= pf_service (11 subtests) =================
[16:17:32] [PASSED] pf_negotiate_any
[16:17:32] [PASSED] pf_negotiate_base_match
[16:17:32] [PASSED] pf_negotiate_base_newer
[16:17:32] [PASSED] pf_negotiate_base_next
[16:17:32] [SKIPPED] pf_negotiate_base_older (no older minor)
[16:17:32] [PASSED] pf_negotiate_base_prev
[16:17:32] [PASSED] pf_negotiate_latest_match
[16:17:32] [PASSED] pf_negotiate_latest_newer
[16:17:32] [PASSED] pf_negotiate_latest_next
[16:17:32] [SKIPPED] pf_negotiate_latest_older (no older minor)
[16:17:32] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[16:17:32] =================== [PASSED] pf_service ====================
[16:17:32] ================= xe_guc_g2g (2 subtests) ==================
[16:17:32] ============== xe_live_guc_g2g_kunit_default ==============
[16:17:32] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[16:17:32] ============== xe_live_guc_g2g_kunit_allmem ===============
[16:17:32] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[16:17:32] =================== [SKIPPED] xe_guc_g2g ===================
[16:17:32] =================== xe_mocs (2 subtests) ===================
[16:17:32] ================ xe_live_mocs_kernel_kunit ================
[16:17:32] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[16:17:32] ================ xe_live_mocs_reset_kunit =================
[16:17:32] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[16:17:32] ==================== [SKIPPED] xe_mocs =====================
[16:17:32] ================= xe_migrate (3 subtests) ==================
[16:17:32] ================= xe_migrate_sanity_kunit =================
[16:17:32] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[16:17:32] ================== xe_validate_ccs_kunit ==================
[16:17:32] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[16:17:32] ============= xe_migrate_access_memory_kunit ==============
[16:17:32] ========= [SKIPPED] xe_migrate_access_memory_kunit =========
[16:17:32] =================== [SKIPPED] xe_migrate ===================
[16:17:32] ================== xe_dma_buf (1 subtest) ==================
[16:17:32] ==================== xe_dma_buf_kunit =====================
[16:17:32] ================ [SKIPPED] xe_dma_buf_kunit ================
[16:17:32] =================== [SKIPPED] xe_dma_buf ===================
[16:17:32] ================= xe_bo_shrink (1 subtest) =================
[16:17:32] =================== xe_bo_shrink_kunit ====================
[16:17:32] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[16:17:32] ================== [SKIPPED] xe_bo_shrink ==================
[16:17:32] ==================== xe_bo (2 subtests) ====================
[16:17:32] ================== xe_ccs_migrate_kunit ===================
[16:17:32] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[16:17:32] ==================== xe_bo_evict_kunit ====================
[16:17:32] =============== [SKIPPED] xe_bo_evict_kunit ================
[16:17:32] ===================== [SKIPPED] xe_bo ======================
[16:17:32] =================== xe_any (9 subtests) ====================
[16:17:32] [PASSED] test_to_xe
[16:17:32] [PASSED] test_to_dev
[16:17:32] [PASSED] test_to_pdev
[16:17:32] [PASSED] test_to_drm
[16:17:32] [PASSED] test_if_pdev
[16:17:32] [PASSED] test_if_xe
[16:17:32] [PASSED] test_if_tile
[16:17:32] [PASSED] test_if_gt
[16:17:32] [PASSED] test_to_id
[16:17:32] ===================== [PASSED] xe_any ======================
[16:17:32] ==================== args (13 subtests) ====================
[16:17:32] [PASSED] count_args_test
[16:17:32] [PASSED] call_args_example
[16:17:32] [PASSED] call_args_test
[16:17:32] [PASSED] drop_first_arg_example
[16:17:32] [PASSED] drop_first_arg_test
[16:17:32] [PASSED] first_arg_example
[16:17:32] [PASSED] first_arg_test
[16:17:32] [PASSED] last_arg_example
[16:17:32] [PASSED] last_arg_test
[16:17:32] [PASSED] pick_arg_example
[16:17:32] [PASSED] if_args_example
[16:17:32] [PASSED] if_args_test
[16:17:32] [PASSED] sep_comma_example
[16:17:32] ====================== [PASSED] args =======================
[16:17:32] =================== xe_pci (3 subtests) ====================
[16:17:32] ==================== check_graphics_ip ====================
[16:17:32] [PASSED] 12.00 Xe_LP
[16:17:32] [PASSED] 12.10 Xe_LP+
[16:17:32] [PASSED] 12.55 Xe_HPG
[16:17:32] [PASSED] 12.60 Xe_HPC
[16:17:32] [PASSED] 12.70 Xe_LPG
[16:17:32] [PASSED] 12.71 Xe_LPG
[16:17:32] [PASSED] 12.74 Xe_LPG+
[16:17:32] [PASSED] 20.01 Xe2_HPG
[16:17:32] [PASSED] 20.02 Xe2_HPG
[16:17:32] [PASSED] 20.04 Xe2_LPG
[16:17:32] [PASSED] 30.00 Xe3_LPG
[16:17:32] [PASSED] 30.01 Xe3_LPG
[16:17:32] [PASSED] 30.03 Xe3_LPG
[16:17:32] [PASSED] 30.04 Xe3_LPG
[16:17:32] [PASSED] 30.05 Xe3_LPG
[16:17:32] [PASSED] 35.10 Xe3p_LPG
[16:17:32] [PASSED] 35.11 Xe3p_XPC
[16:17:32] ================ [PASSED] check_graphics_ip ================
[16:17:32] ===================== check_media_ip ======================
[16:17:32] [PASSED] 12.00 Xe_M
[16:17:32] [PASSED] 12.55 Xe_HPM
[16:17:32] [PASSED] 13.00 Xe_LPM+
[16:17:32] [PASSED] 13.01 Xe2_HPM
[16:17:32] [PASSED] 20.00 Xe2_LPM
[16:17:32] [PASSED] 30.00 Xe3_LPM
[16:17:32] [PASSED] 30.02 Xe3_LPM
[16:17:32] [PASSED] 35.00 Xe3p_LPM
[16:17:32] [PASSED] 35.03 Xe3p_HPM
[16:17:32] ================= [PASSED] check_media_ip ==================
[16:17:32] =================== check_platform_desc ===================
[16:17:32] [PASSED] 0x9A60 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A68 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A70 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A40 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A49 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A59 (TIGERLAKE)
[16:17:32] [PASSED] 0x9A78 (TIGERLAKE)
[16:17:32] [PASSED] 0x9AC0 (TIGERLAKE)
[16:17:32] [PASSED] 0x9AC9 (TIGERLAKE)
[16:17:32] [PASSED] 0x9AD9 (TIGERLAKE)
[16:17:32] [PASSED] 0x9AF8 (TIGERLAKE)
[16:17:32] [PASSED] 0x4C80 (ROCKETLAKE)
[16:17:32] [PASSED] 0x4C8A (ROCKETLAKE)
[16:17:32] [PASSED] 0x4C8B (ROCKETLAKE)
[16:17:32] [PASSED] 0x4C8C (ROCKETLAKE)
[16:17:32] [PASSED] 0x4C90 (ROCKETLAKE)
[16:17:32] [PASSED] 0x4C9A (ROCKETLAKE)
[16:17:32] [PASSED] 0x4680 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4682 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4688 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x468A (ALDERLAKE_S)
[16:17:32] [PASSED] 0x468B (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4690 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4692 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4693 (ALDERLAKE_S)
[16:17:32] [PASSED] 0x46A0 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46A1 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46A2 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46A3 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46A6 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46A8 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46AA (ALDERLAKE_P)
[16:17:32] [PASSED] 0x462A (ALDERLAKE_P)
[16:17:32] [PASSED] 0x4626 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x4628 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46B0 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46B1 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46B2 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46B3 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46C0 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46C1 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46C2 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46C3 (ALDERLAKE_P)
[16:17:32] [PASSED] 0x46D0 (ALDERLAKE_N)
[16:17:32] [PASSED] 0x46D1 (ALDERLAKE_N)
[16:17:32] [PASSED] 0x46D2 (ALDERLAKE_N)
[16:17:32] [PASSED] 0x46D3 (ALDERLAKE_N)
[16:17:32] [PASSED] 0x46D4 (ALDERLAKE_N)
[16:17:32] [PASSED] 0xA721 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7A1 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7A9 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7AC (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7AD (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA720 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7A0 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7A8 (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7AA (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA7AB (ALDERLAKE_P)
[16:17:32] [PASSED] 0xA780 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA781 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA782 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA783 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA788 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA789 (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA78A (ALDERLAKE_S)
[16:17:32] [PASSED] 0xA78B (ALDERLAKE_S)
[16:17:32] [PASSED] 0x4905 (DG1)
[16:17:32] [PASSED] 0x4906 (DG1)
[16:17:32] [PASSED] 0x4907 (DG1)
[16:17:32] [PASSED] 0x4908 (DG1)
[16:17:32] [PASSED] 0x4909 (DG1)
[16:17:32] [PASSED] 0x56C0 (DG2)
[16:17:32] [PASSED] 0x56C2 (DG2)
[16:17:32] [PASSED] 0x56C1 (DG2)
[16:17:32] [PASSED] 0x7D51 (METEORLAKE)
[16:17:32] [PASSED] 0x7DD1 (METEORLAKE)
[16:17:32] [PASSED] 0x7D41 (METEORLAKE)
[16:17:32] [PASSED] 0x7D67 (METEORLAKE)
[16:17:32] [PASSED] 0xB640 (METEORLAKE)
[16:17:32] [PASSED] 0x56A0 (DG2)
[16:17:32] [PASSED] 0x56A1 (DG2)
[16:17:32] [PASSED] 0x56A2 (DG2)
[16:17:32] [PASSED] 0x56BE (DG2)
[16:17:32] [PASSED] 0x56BF (DG2)
[16:17:32] [PASSED] 0x5690 (DG2)
[16:17:32] [PASSED] 0x5691 (DG2)
[16:17:32] [PASSED] 0x5692 (DG2)
[16:17:32] [PASSED] 0x56A5 (DG2)
[16:17:32] [PASSED] 0x56A6 (DG2)
[16:17:32] [PASSED] 0x56B0 (DG2)
[16:17:32] [PASSED] 0x56B1 (DG2)
[16:17:32] [PASSED] 0x56BA (DG2)
[16:17:32] [PASSED] 0x56BB (DG2)
[16:17:32] [PASSED] 0x56BC (DG2)
[16:17:32] [PASSED] 0x56BD (DG2)
[16:17:32] [PASSED] 0x5693 (DG2)
[16:17:32] [PASSED] 0x5694 (DG2)
[16:17:32] [PASSED] 0x5695 (DG2)
[16:17:32] [PASSED] 0x56A3 (DG2)
[16:17:32] [PASSED] 0x56A4 (DG2)
[16:17:32] [PASSED] 0x56B2 (DG2)
[16:17:32] [PASSED] 0x56B3 (DG2)
[16:17:32] [PASSED] 0x5696 (DG2)
[16:17:32] [PASSED] 0x5697 (DG2)
[16:17:32] [PASSED] 0xB69 (PVC)
[16:17:32] [PASSED] 0xB6E (PVC)
[16:17:32] [PASSED] 0xBD4 (PVC)
[16:17:32] [PASSED] 0xBD5 (PVC)
[16:17:32] [PASSED] 0xBD6 (PVC)
[16:17:32] [PASSED] 0xBD7 (PVC)
[16:17:32] [PASSED] 0xBD8 (PVC)
[16:17:32] [PASSED] 0xBD9 (PVC)
[16:17:32] [PASSED] 0xBDA (PVC)
[16:17:32] [PASSED] 0xBDB (PVC)
[16:17:32] [PASSED] 0xBE0 (PVC)
[16:17:32] [PASSED] 0xBE1 (PVC)
[16:17:32] [PASSED] 0xBE5 (PVC)
[16:17:32] [PASSED] 0x7D40 (METEORLAKE)
[16:17:32] [PASSED] 0x7D45 (METEORLAKE)
[16:17:32] [PASSED] 0x7D55 (METEORLAKE)
[16:17:32] [PASSED] 0x7D60 (METEORLAKE)
[16:17:32] [PASSED] 0x7DD5 (METEORLAKE)
[16:17:32] [PASSED] 0x6420 (LUNARLAKE)
[16:17:32] [PASSED] 0x64A0 (LUNARLAKE)
[16:17:32] [PASSED] 0x64B0 (LUNARLAKE)
[16:17:32] [PASSED] 0xE202 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE209 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE20B (BATTLEMAGE)
[16:17:32] [PASSED] 0xE20C (BATTLEMAGE)
[16:17:32] [PASSED] 0xE20D (BATTLEMAGE)
[16:17:32] [PASSED] 0xE210 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE211 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE212 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE216 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE220 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE221 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE222 (BATTLEMAGE)
[16:17:32] [PASSED] 0xE223 (BATTLEMAGE)
[16:17:32] [PASSED] 0xB080 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB081 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB082 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB083 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB084 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB085 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB086 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB087 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB08F (PANTHERLAKE)
[16:17:32] [PASSED] 0xB090 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB0A0 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB0A1 (PANTHERLAKE)
[16:17:32] [PASSED] 0xB0B0 (PANTHERLAKE)
[16:17:32] [PASSED] 0xFD80 (PANTHERLAKE)
[16:17:32] [PASSED] 0xFD81 (PANTHERLAKE)
[16:17:32] [PASSED] 0xD740 (NOVALAKE_S)
[16:17:32] [PASSED] 0xD741 (NOVALAKE_S)
[16:17:32] [PASSED] 0xD742 (NOVALAKE_S)
[16:17:32] [PASSED] 0xD743 (NOVALAKE_S)
[16:17:32] [PASSED] 0xD745 (NOVALAKE_S)
[16:17:32] [PASSED] 0xD74A (NOVALAKE_S)
[16:17:32] [PASSED] 0xD74B (NOVALAKE_S)
[16:17:32] [PASSED] 0x674C (CRESCENTISLAND)
[16:17:32] [PASSED] 0x674D (CRESCENTISLAND)
[16:17:32] [PASSED] 0x674E (CRESCENTISLAND)
[16:17:32] [PASSED] 0x674F (CRESCENTISLAND)
[16:17:32] [PASSED] 0x6750 (CRESCENTISLAND)
[16:17:32] [PASSED] 0x6751 (CRESCENTISLAND)
[16:17:32] [PASSED] 0x6752 (CRESCENTISLAND)
[16:17:32] [PASSED] 0xD750 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD751 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD752 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD753 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD754 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD755 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD756 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD757 (NOVALAKE_P)
[16:17:32] [PASSED] 0xD75F (NOVALAKE_P)
[16:17:32] =============== [PASSED] check_platform_desc ===============
[16:17:32] ===================== [PASSED] xe_pci ======================
[16:17:32] ============= xe_rtp_tables_test (5 subtests) ==============
[16:17:32] ================== xe_rtp_table_gt_test ===================
[16:17:32] [PASSED] gt_was/14011060649
[16:17:32] [PASSED] gt_was/14011059788
[16:17:32] [PASSED] gt_was/14015795083
[16:17:32] [PASSED] gt_was/16021867713
[16:17:32] [PASSED] gt_was/14019449301
[16:17:32] [PASSED] gt_was/16028005424
[16:17:32] [PASSED] gt_was/14026578760
[16:17:32] [PASSED] gt_was/1409420604
[16:17:32] [PASSED] gt_was/1408615072
[16:17:32] [PASSED] gt_was/22010523718
[16:17:32] [PASSED] gt_was/14011006942
[16:17:32] [PASSED] gt_was/14014830051
[16:17:32] [PASSED] gt_was/18018781329
[16:17:32] [PASSED] gt_was/1509235366
[16:17:32] [PASSED] gt_was/18018781329
[16:17:32] [PASSED] gt_was/16016694945
[16:17:32] [PASSED] gt_was/14018575942
[16:17:32] [PASSED] gt_was/22016670082
[16:17:32] [PASSED] gt_was/22016670082
[16:17:32] [PASSED] gt_was/14017421178
[16:17:32] [PASSED] gt_was/16025250150
[16:17:32] [PASSED] gt_was/14021871409
[16:17:32] [PASSED] gt_was/16021865536
[16:17:32] [PASSED] gt_was/14021486841
[16:17:32] [PASSED] gt_was/14025160223
[16:17:32] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[16:17:32] [PASSED] gt_was/14025635424
[16:17:32] [PASSED] gt_was/16028005424
[16:17:32] ============== [PASSED] xe_rtp_table_gt_test ===============
[16:17:32] ================== xe_rtp_table_gt_test ===================
[16:17:32] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[16:17:32] [PASSED] gt_tunings/Tuning: 32B Access Enable
[16:17:32] [PASSED] gt_tunings/Tuning: L3 cache
[16:17:32] [PASSED] gt_tunings/Tuning: L3 cache - media
[16:17:32] [PASSED] gt_tunings/Tuning: Compression Overfetch
[16:17:32] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[16:17:32] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[16:17:32] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[16:17:32] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[16:17:32] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[16:17:32] [PASSED] gt_tunings/Tuning: Stateless compression control
[16:17:32] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[16:17:32] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[16:17:32] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[16:17:32] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[16:17:32] [PASSED] gt_tunings/Tuning: Force All Non-Compressible Memory Reads to be 256B Overfetches
[16:17:32] ============== [PASSED] xe_rtp_table_gt_test ===============
[16:17:32] ================== xe_rtp_table_oob_test ==================
[16:17:32] [PASSED] oob_was/1607983814
[16:17:32] [PASSED] oob_was/16010904313
[16:17:32] [PASSED] oob_was/18022495364
[16:17:32] [PASSED] oob_was/22012773006
[16:17:32] [PASSED] oob_was/14014475959
[16:17:32] [PASSED] oob_was/22011391025
[16:17:32] [PASSED] oob_was/22012727170
[16:17:32] [PASSED] oob_was/22012727685
[16:17:32] [PASSED] oob_was/22016596838
[16:17:32] [PASSED] oob_was/18020744125
[16:17:32] [PASSED] oob_was/1409600907
[16:17:32] [PASSED] oob_was/22014953428
[16:17:32] [PASSED] oob_was/16017236439
[16:17:32] [PASSED] oob_was/14019821291
[16:17:32] [PASSED] oob_was/14015076503
[16:17:32] [PASSED] oob_was/22016122933
[16:17:32] [PASSED] oob_was/14018913170
[16:17:32] [PASSED] oob_was/14018094691
[16:17:32] [PASSED] oob_was/18024947630
[16:17:32] [PASSED] oob_was/16022287689
[16:17:32] [PASSED] oob_was/13011645652
[16:17:32] [PASSED] oob_was/14022293748
[16:17:32] [PASSED] oob_was/22019794406
[16:17:32] [PASSED] oob_was/22019338487
[16:17:32] [PASSED] oob_was/16023588340
[16:17:32] [PASSED] oob_was/14019789679
[16:17:32] [PASSED] oob_was/14022866841
[16:17:32] [PASSED] oob_was/16021333562
[16:17:32] [PASSED] oob_was/14016712196
[16:17:32] [PASSED] oob_was/14015568240
[16:17:32] [PASSED] oob_was/18013179988
[16:17:32] [PASSED] oob_was/1508761755
[16:17:32] [PASSED] oob_was/16023105232
[16:17:32] [PASSED] oob_was/16026508708
[16:17:32] [PASSED] oob_was/14020001231
[16:17:32] [PASSED] oob_was/16023683509
[16:17:32] [PASSED] oob_was/14025515070
[16:17:32] [PASSED] oob_was/15015404425_disable
[16:17:32] [PASSED] oob_was/16026007364
[16:17:32] [PASSED] oob_was/14020316580
[16:17:32] [PASSED] oob_was/14025883347
[16:17:32] [PASSED] oob_was/16029380221
[16:17:32] [PASSED] oob_was/22022079272
[16:17:32] [PASSED] oob_was/16029897822
[16:17:32] [PASSED] oob_was/14026539277
[16:17:32] [PASSED] oob_was/14027054324
[16:17:32] [PASSED] oob_was/14025941587
[16:17:32] [PASSED] oob_was/16030224309
[16:17:32] [PASSED] oob_was/14028709524
[16:17:32] ============== [PASSED] xe_rtp_table_oob_test ==============
[16:17:32] ================ xe_rtp_table_dev_oob_test ================
[16:17:32] [PASSED] device_oob_was/22010954014
[16:17:32] [PASSED] device_oob_was/15015404425
[16:17:32] [PASSED] device_oob_was/22019338487_display
[16:17:32] [PASSED] device_oob_was/14022085890
[16:17:32] [PASSED] device_oob_was/14026633728
[16:17:32] [PASSED] device_oob_was/14026746987
[16:17:32] [PASSED] device_oob_was/14026779378
[16:17:32] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[16:17:32] ========== xe_rtp_table_missing_upper_bound_test ==========
[16:17:32] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[16:17:32] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[16:17:32] [PASSED] register_whitelist/1806527549
[16:17:32] [PASSED] register_whitelist/allow_read_ctx_timestamp
[16:17:32] [PASSED] register_whitelist/allow_read_queue_timestamp
[16:17:32] [PASSED] register_whitelist/16014440446
[16:17:32] [PASSED] register_whitelist/16017236439
[16:17:32] [PASSED] register_whitelist/16020183090
[16:17:32] [PASSED] register_whitelist/14024997852
[16:17:32] [PASSED] register_whitelist/14024997852
[16:17:32] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[16:17:32] =============== [PASSED] xe_rtp_tables_test ================
[16:17:32] =================== xe_rtp (3 subtests) ====================
[16:17:32] =================== xe_rtp_rules_tests ====================
[16:17:32] [PASSED] no
[16:17:32] [PASSED] yes
[16:17:32] [PASSED] no-and-no
[16:17:32] [PASSED] no-and-yes
[16:17:32] [PASSED] yes-and-no
[16:17:32] [PASSED] yes-and-yes
[16:17:32] [PASSED] no-or-no
[16:17:32] [PASSED] no-or-yes
[16:17:33] [PASSED] yes-or-no
[16:17:33] [PASSED] yes-or-yes
[16:17:33] [PASSED] no-yes-or-yes-no
[16:17:33] [PASSED] no-yes-or-yes-yes
[16:17:33] [PASSED] yes-yes-or-no-yes
[16:17:33] [PASSED] yes-yes-or-yes-yes
[16:17:33] [PASSED] no-no-or-yes-or-no
[16:17:33] [PASSED] or
[16:17:33] [PASSED] or-yes
[16:17:33] [PASSED] or-no
[16:17:33] [PASSED] yes-or
[16:17:33] [PASSED] no-or
[16:17:33] [PASSED] no-or-or-yes
[16:17:33] [PASSED] yes-or-or-no
[16:17:33] [PASSED] no-or-or-no
[16:17:33] [PASSED] missing-context-engine-class
[16:17:33] [PASSED] missing-context-engine-class-or-yes
[16:17:33] [PASSED] missing-context-engine-class-or-or-yes
[16:17:33] =============== [PASSED] xe_rtp_rules_tests ================
[16:17:33] =============== xe_rtp_process_to_sr_tests ================
[16:17:33] [PASSED] coalesce-same-reg
[16:17:33] [PASSED] coalesce-same-reg-literal-and-func
[16:17:33] [PASSED] no-match-no-add
[16:17:33] [PASSED] two-regs-two-entries
[16:17:33] [PASSED] clr-one-set-other
[16:17:33] [PASSED] set-field
[16:17:33] [PASSED] conflict-duplicate
[16:17:33] [PASSED] conflict-not-disjoint
[16:17:33] [PASSED] conflict-not-disjoint-literal-and-func
[16:17:33] [PASSED] conflict-reg-type
[16:17:33] [PASSED] bad-mcr-reg-forced-to-regular
[16:17:33] [PASSED] bad-regular-reg-forced-to-mcr
[16:17:33] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[16:17:33] ================== xe_rtp_process_tests ===================
[16:17:33] [PASSED] active1
[16:17:33] [PASSED] active2
[16:17:33] [PASSED] active-inactive
[16:17:33] [PASSED] inactive-active
[16:17:33] [PASSED] inactive-active-inactive
[16:17:33] [PASSED] inactive-inactive-inactive
[16:17:33] ============== [PASSED] xe_rtp_process_tests ===============
[16:17:33] ===================== [PASSED] xe_rtp ======================
[16:17:33] ==================== xe_wa (1 subtest) =====================
[16:17:33] ======================== xe_wa_gt =========================
[16:17:33] [PASSED] TIGERLAKE B0
[16:17:33] [PASSED] DG1 A0
[16:17:33] [PASSED] DG1 B0
[16:17:33] [PASSED] ALDERLAKE_S A0
[16:17:33] [PASSED] ALDERLAKE_S B0
[16:17:33] [PASSED] ALDERLAKE_S C0
[16:17:33] [PASSED] ALDERLAKE_S D0
[16:17:33] [PASSED] ALDERLAKE_P A0
[16:17:33] [PASSED] ALDERLAKE_P B0
[16:17:33] [PASSED] ALDERLAKE_P C0
[16:17:33] [PASSED] ALDERLAKE_S RPLS D0
[16:17:33] [PASSED] ALDERLAKE_P RPLU E0
[16:17:33] [PASSED] DG2 G10 C0
[16:17:33] [PASSED] DG2 G11 B1
[16:17:33] [PASSED] DG2 G12 A1
[16:17:33] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[16:17:33] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[16:17:33] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[16:17:33] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[16:17:33] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[16:17:33] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[16:17:33] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[16:17:33] ==================== [PASSED] xe_wa_gt =====================
[16:17:33] ====================== [PASSED] xe_wa ======================
[16:17:33] ============================================================
[16:17:33] Testing complete. Ran 840 tests: passed: 811, skipped: 29
[16:17:33] Elapsed time: 41.291s total, 2.520s configuring, 38.005s building, 0.723s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[16:17:33] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:17:35] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[16:18:00] Starting KUnit Kernel (1/1)...
[16:18:00] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[16:18:00] ============ drm_test_pick_cmdline (2 subtests) ============
[16:18:00] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[16:18:00] =============== drm_test_pick_cmdline_named ===============
[16:18:00] [PASSED] NTSC
[16:18:00] [PASSED] NTSC-J
[16:18:00] [PASSED] PAL
[16:18:00] [PASSED] PAL-M
[16:18:00] =========== [PASSED] drm_test_pick_cmdline_named ===========
[16:18:00] ============== [PASSED] drm_test_pick_cmdline ==============
[16:18:00] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[16:18:00] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[16:18:00] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[16:18:00] =========== drm_validate_clone_mode (2 subtests) ===========
[16:18:00] ============== drm_test_check_in_clone_mode ===============
[16:18:00] [PASSED] in_clone_mode
[16:18:00] [PASSED] not_in_clone_mode
[16:18:00] ========== [PASSED] drm_test_check_in_clone_mode ===========
[16:18:00] =============== drm_test_check_valid_clones ===============
[16:18:00] [PASSED] not_in_clone_mode
[16:18:00] [PASSED] valid_clone
[16:18:00] [PASSED] invalid_clone
[16:18:00] =========== [PASSED] drm_test_check_valid_clones ===========
[16:18:00] ============= [PASSED] drm_validate_clone_mode =============
[16:18:00] ============= drm_validate_modeset (1 subtest) =============
[16:18:00] [PASSED] drm_test_check_connector_changed_modeset
[16:18:00] ============== [PASSED] drm_validate_modeset ===============
[16:18:00] ====== drm_test_bridge_get_current_state (1 subtest) =======
[16:18:00] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[16:18:00] ======== [PASSED] drm_test_bridge_get_current_state ========
[16:18:00] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[16:18:00] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[16:18:00] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[16:18:00] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[16:18:00] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[16:18:00] ============== drm_bridge_alloc (2 subtests) ===============
[16:18:00] [PASSED] drm_test_drm_bridge_alloc_basic
[16:18:00] [PASSED] drm_test_drm_bridge_alloc_get_put
[16:18:00] ================ [PASSED] drm_bridge_alloc =================
[16:18:00] ============= drm_bridge_bus_fmt (5 subtests) ==============
[16:18:00] [PASSED] drm_test_bridge_rgb_yuv_rgb
[16:18:00] [PASSED] drm_test_bridge_must_convert_to_yuv444
[16:18:00] [PASSED] drm_test_bridge_hdmi_auto_rgb
[16:18:00] [PASSED] drm_test_bridge_auto_first
[16:18:00] [PASSED] drm_test_bridge_rgb_yuv_no_path
[16:18:00] =============== [PASSED] drm_bridge_bus_fmt ================
[16:18:00] ============= drm_cmdline_parser (40 subtests) =============
[16:18:00] [PASSED] drm_test_cmdline_force_d_only
[16:18:00] [PASSED] drm_test_cmdline_force_D_only_dvi
[16:18:00] [PASSED] drm_test_cmdline_force_D_only_hdmi
[16:18:00] [PASSED] drm_test_cmdline_force_D_only_not_digital
[16:18:00] [PASSED] drm_test_cmdline_force_e_only
[16:18:00] [PASSED] drm_test_cmdline_res
[16:18:00] [PASSED] drm_test_cmdline_res_vesa
[16:18:00] [PASSED] drm_test_cmdline_res_vesa_rblank
[16:18:00] [PASSED] drm_test_cmdline_res_rblank
[16:18:00] [PASSED] drm_test_cmdline_res_bpp
[16:18:00] [PASSED] drm_test_cmdline_res_refresh
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[16:18:00] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[16:18:00] [PASSED] drm_test_cmdline_res_margins_force_on
[16:18:00] [PASSED] drm_test_cmdline_res_vesa_margins
[16:18:00] [PASSED] drm_test_cmdline_name
[16:18:00] [PASSED] drm_test_cmdline_name_bpp
[16:18:00] [PASSED] drm_test_cmdline_name_option
[16:18:00] [PASSED] drm_test_cmdline_name_bpp_option
[16:18:00] [PASSED] drm_test_cmdline_rotate_0
[16:18:00] [PASSED] drm_test_cmdline_rotate_90
[16:18:00] [PASSED] drm_test_cmdline_rotate_180
[16:18:00] [PASSED] drm_test_cmdline_rotate_270
[16:18:00] [PASSED] drm_test_cmdline_hmirror
[16:18:00] [PASSED] drm_test_cmdline_vmirror
[16:18:00] [PASSED] drm_test_cmdline_margin_options
[16:18:00] [PASSED] drm_test_cmdline_multiple_options
[16:18:00] [PASSED] drm_test_cmdline_bpp_extra_and_option
[16:18:00] [PASSED] drm_test_cmdline_extra_and_option
[16:18:00] [PASSED] drm_test_cmdline_freestanding_options
[16:18:00] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[16:18:00] [PASSED] drm_test_cmdline_panel_orientation
[16:18:00] ================ drm_test_cmdline_invalid =================
[16:18:00] [PASSED] margin_only
[16:18:00] [PASSED] interlace_only
[16:18:00] [PASSED] res_missing_x
[16:18:00] [PASSED] res_missing_y
[16:18:00] [PASSED] res_bad_y
[16:18:00] [PASSED] res_missing_y_bpp
[16:18:00] [PASSED] res_bad_bpp
[16:18:00] [PASSED] res_bad_refresh
[16:18:00] [PASSED] res_bpp_refresh_force_on_off
[16:18:00] [PASSED] res_invalid_mode
[16:18:00] [PASSED] res_bpp_wrong_place_mode
[16:18:00] [PASSED] name_bpp_refresh
[16:18:00] [PASSED] name_refresh
[16:18:00] [PASSED] name_refresh_wrong_mode
[16:18:00] [PASSED] name_refresh_invalid_mode
[16:18:00] [PASSED] rotate_multiple
[16:18:00] [PASSED] rotate_invalid_val
[16:18:00] [PASSED] rotate_truncated
[16:18:00] [PASSED] invalid_option
[16:18:00] [PASSED] invalid_tv_option
[16:18:00] [PASSED] truncated_tv_option
[16:18:00] ============ [PASSED] drm_test_cmdline_invalid =============
[16:18:00] =============== drm_test_cmdline_tv_options ===============
[16:18:00] [PASSED] NTSC
[16:18:00] [PASSED] NTSC_443
[16:18:00] [PASSED] NTSC_J
[16:18:00] [PASSED] PAL
[16:18:00] [PASSED] PAL_M
[16:18:00] [PASSED] PAL_N
[16:18:00] [PASSED] SECAM
[16:18:00] [PASSED] MONO_525
[16:18:00] [PASSED] MONO_625
[16:18:00] =========== [PASSED] drm_test_cmdline_tv_options ===========
[16:18:00] =============== [PASSED] drm_cmdline_parser ================
[16:18:00] ========== drmm_connector_hdmi_init (20 subtests) ==========
[16:18:00] [PASSED] drm_test_connector_hdmi_init_valid
[16:18:00] [PASSED] drm_test_connector_hdmi_init_bpc_8
[16:18:00] [PASSED] drm_test_connector_hdmi_init_bpc_10
[16:18:00] [PASSED] drm_test_connector_hdmi_init_bpc_12
[16:18:00] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[16:18:00] [PASSED] drm_test_connector_hdmi_init_bpc_null
[16:18:00] [PASSED] drm_test_connector_hdmi_init_formats_empty
[16:18:00] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[16:18:00] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[16:18:00] [PASSED] supported_formats=0x9 yuv420_allowed=1
[16:18:00] [PASSED] supported_formats=0x9 yuv420_allowed=0
[16:18:00] [PASSED] supported_formats=0x5 yuv420_allowed=1
[16:18:00] [PASSED] supported_formats=0x5 yuv420_allowed=0
[16:18:00] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[16:18:00] [PASSED] drm_test_connector_hdmi_init_null_ddc
[16:18:00] [PASSED] drm_test_connector_hdmi_init_null_product
[16:18:00] [PASSED] drm_test_connector_hdmi_init_null_vendor
[16:18:00] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[16:18:00] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[16:18:00] [PASSED] drm_test_connector_hdmi_init_product_valid
[16:18:00] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[16:18:00] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[16:18:00] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[16:18:00] ========= drm_test_connector_hdmi_init_type_valid =========
[16:18:00] [PASSED] HDMI-A
[16:18:00] [PASSED] HDMI-B
[16:18:00] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[16:18:00] ======== drm_test_connector_hdmi_init_type_invalid ========
[16:18:00] [PASSED] Unknown
[16:18:00] [PASSED] VGA
[16:18:00] [PASSED] DVI-I
[16:18:00] [PASSED] DVI-D
[16:18:00] [PASSED] DVI-A
[16:18:00] [PASSED] Composite
[16:18:00] [PASSED] SVIDEO
[16:18:00] [PASSED] LVDS
[16:18:00] [PASSED] Component
[16:18:00] [PASSED] DIN
[16:18:00] [PASSED] DP
[16:18:00] [PASSED] TV
[16:18:00] [PASSED] eDP
[16:18:00] [PASSED] Virtual
[16:18:00] [PASSED] DSI
[16:18:00] [PASSED] DPI
[16:18:00] [PASSED] Writeback
[16:18:00] [PASSED] SPI
[16:18:00] [PASSED] USB
[16:18:00] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[16:18:00] ============ [PASSED] drmm_connector_hdmi_init =============
[16:18:00] ============= drmm_connector_init (4 subtests) =============
[16:18:00] [PASSED] drm_test_drmm_connector_init
[16:18:00] [PASSED] drm_test_drmm_connector_init_null_ddc
[16:18:00] [PASSED] drm_test_connector_attach_luminance_property
[16:18:00] ========= drm_test_drmm_connector_init_type_valid =========
[16:18:00] [PASSED] Unknown
[16:18:00] [PASSED] VGA
[16:18:00] [PASSED] DVI-I
[16:18:00] [PASSED] DVI-D
[16:18:00] [PASSED] DVI-A
[16:18:00] [PASSED] Composite
[16:18:00] [PASSED] SVIDEO
[16:18:00] [PASSED] LVDS
[16:18:00] [PASSED] Component
[16:18:00] [PASSED] DIN
[16:18:00] [PASSED] DP
[16:18:00] [PASSED] HDMI-A
[16:18:00] [PASSED] HDMI-B
[16:18:00] [PASSED] TV
[16:18:00] [PASSED] eDP
[16:18:00] [PASSED] Virtual
[16:18:00] [PASSED] DSI
[16:18:00] [PASSED] DPI
[16:18:00] [PASSED] Writeback
[16:18:00] [PASSED] SPI
[16:18:00] [PASSED] USB
[16:18:00] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[16:18:00] =============== [PASSED] drmm_connector_init ===============
[16:18:00] ========= drm_connector_dynamic_init (6 subtests) ==========
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_init
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_init_properties
[16:18:00] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[16:18:00] [PASSED] Unknown
[16:18:00] [PASSED] VGA
[16:18:00] [PASSED] DVI-I
[16:18:00] [PASSED] DVI-D
[16:18:00] [PASSED] DVI-A
[16:18:00] [PASSED] Composite
[16:18:00] [PASSED] SVIDEO
[16:18:00] [PASSED] LVDS
[16:18:00] [PASSED] Component
[16:18:00] [PASSED] DIN
[16:18:00] [PASSED] DP
[16:18:00] [PASSED] HDMI-A
[16:18:00] [PASSED] HDMI-B
[16:18:00] [PASSED] TV
[16:18:00] [PASSED] eDP
[16:18:00] [PASSED] Virtual
[16:18:00] [PASSED] DSI
[16:18:00] [PASSED] DPI
[16:18:00] [PASSED] Writeback
[16:18:00] [PASSED] SPI
[16:18:00] [PASSED] USB
[16:18:00] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[16:18:00] ======== drm_test_drm_connector_dynamic_init_name =========
[16:18:00] [PASSED] Unknown
[16:18:00] [PASSED] VGA
[16:18:00] [PASSED] DVI-I
[16:18:00] [PASSED] DVI-D
[16:18:00] [PASSED] DVI-A
[16:18:00] [PASSED] Composite
[16:18:00] [PASSED] SVIDEO
[16:18:00] [PASSED] LVDS
[16:18:00] [PASSED] Component
[16:18:00] [PASSED] DIN
[16:18:00] [PASSED] DP
[16:18:00] [PASSED] HDMI-A
[16:18:00] [PASSED] HDMI-B
[16:18:00] [PASSED] TV
[16:18:00] [PASSED] eDP
[16:18:00] [PASSED] Virtual
[16:18:00] [PASSED] DSI
[16:18:00] [PASSED] DPI
[16:18:00] [PASSED] Writeback
[16:18:00] [PASSED] SPI
[16:18:00] [PASSED] USB
[16:18:00] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[16:18:00] =========== [PASSED] drm_connector_dynamic_init ============
[16:18:00] ==== drm_connector_dynamic_register_early (4 subtests) =====
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[16:18:00] ====== [PASSED] drm_connector_dynamic_register_early =======
[16:18:00] ======= drm_connector_dynamic_register (7 subtests) ========
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[16:18:00] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[16:18:00] ========= [PASSED] drm_connector_dynamic_register ==========
[16:18:00] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[16:18:00] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[16:18:00] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[16:18:00] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[16:18:00] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[16:18:00] ========== drm_test_get_tv_mode_from_name_valid ===========
[16:18:00] [PASSED] NTSC
[16:18:00] [PASSED] NTSC-443
[16:18:00] [PASSED] NTSC-J
[16:18:00] [PASSED] PAL
[16:18:00] [PASSED] PAL-M
[16:18:00] [PASSED] PAL-N
[16:18:00] [PASSED] SECAM
[16:18:00] [PASSED] Mono
[16:18:00] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[16:18:00] [PASSED] drm_test_get_tv_mode_from_name_truncated
[16:18:00] ============ [PASSED] drm_get_tv_mode_from_name ============
[16:18:00] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[16:18:00] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[16:18:00] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[16:18:00] [PASSED] VIC 96
[16:18:00] [PASSED] VIC 97
[16:18:00] [PASSED] VIC 101
[16:18:00] [PASSED] VIC 102
[16:18:00] [PASSED] VIC 106
[16:18:00] [PASSED] VIC 107
[16:18:00] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[16:18:00] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[16:18:00] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[16:18:00] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[16:18:00] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[16:18:00] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[16:18:00] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[16:18:00] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[16:18:00] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[16:18:00] [PASSED] Automatic
[16:18:00] [PASSED] Full
[16:18:00] [PASSED] Limited 16:235
[16:18:00] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[16:18:00] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[16:18:00] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[16:18:00] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[16:18:00] === drm_test_drm_hdmi_connector_get_output_format_name ====
[16:18:00] [PASSED] RGB
[16:18:00] [PASSED] YUV 4:2:0
[16:18:00] [PASSED] YUV 4:2:2
[16:18:00] [PASSED] YUV 4:4:4
[16:18:00] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[16:18:00] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[16:18:00] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[16:18:00] ============= drm_damage_helper (21 subtests) ==============
[16:18:00] [PASSED] drm_test_damage_iter_no_damage
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_src_moved
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_not_visible
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[16:18:00] [PASSED] drm_test_damage_iter_no_damage_no_fb
[16:18:00] [PASSED] drm_test_damage_iter_simple_damage
[16:18:00] [PASSED] drm_test_damage_iter_single_damage
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_outside_src
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_src_moved
[16:18:00] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[16:18:00] [PASSED] drm_test_damage_iter_damage
[16:18:00] [PASSED] drm_test_damage_iter_damage_one_intersect
[16:18:00] [PASSED] drm_test_damage_iter_damage_one_outside
[16:18:00] [PASSED] drm_test_damage_iter_damage_src_moved
[16:18:00] [PASSED] drm_test_damage_iter_damage_not_visible
[16:18:00] ================ [PASSED] drm_damage_helper ================
[16:18:00] ============== drm_dp_mst_helper (3 subtests) ==============
[16:18:00] ============== drm_test_dp_mst_calc_pbn_mode ==============
[16:18:00] [PASSED] Clock 154000 BPP 30 DSC disabled
[16:18:00] [PASSED] Clock 234000 BPP 30 DSC disabled
[16:18:00] [PASSED] Clock 297000 BPP 24 DSC disabled
[16:18:00] [PASSED] Clock 332880 BPP 24 DSC enabled
[16:18:00] [PASSED] Clock 324540 BPP 24 DSC enabled
[16:18:00] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[16:18:00] ============== drm_test_dp_mst_calc_pbn_div ===============
[16:18:00] [PASSED] Link rate 2000000 lane count 4
[16:18:00] [PASSED] Link rate 2000000 lane count 2
[16:18:00] [PASSED] Link rate 2000000 lane count 1
[16:18:00] [PASSED] Link rate 1350000 lane count 4
[16:18:00] [PASSED] Link rate 1350000 lane count 2
[16:18:00] [PASSED] Link rate 1350000 lane count 1
[16:18:00] [PASSED] Link rate 1000000 lane count 4
[16:18:00] [PASSED] Link rate 1000000 lane count 2
[16:18:00] [PASSED] Link rate 1000000 lane count 1
[16:18:00] [PASSED] Link rate 810000 lane count 4
[16:18:00] [PASSED] Link rate 810000 lane count 2
[16:18:00] [PASSED] Link rate 810000 lane count 1
[16:18:00] [PASSED] Link rate 540000 lane count 4
[16:18:00] [PASSED] Link rate 540000 lane count 2
[16:18:00] [PASSED] Link rate 540000 lane count 1
[16:18:00] [PASSED] Link rate 270000 lane count 4
[16:18:00] [PASSED] Link rate 270000 lane count 2
[16:18:00] [PASSED] Link rate 270000 lane count 1
[16:18:00] [PASSED] Link rate 162000 lane count 4
[16:18:00] [PASSED] Link rate 162000 lane count 2
[16:18:00] [PASSED] Link rate 162000 lane count 1
[16:18:00] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[16:18:00] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[16:18:00] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[16:18:00] [PASSED] DP_POWER_UP_PHY with port number
[16:18:00] [PASSED] DP_POWER_DOWN_PHY with port number
[16:18:00] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[16:18:00] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[16:18:00] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[16:18:00] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[16:18:00] [PASSED] DP_QUERY_PAYLOAD with port number
[16:18:00] [PASSED] DP_QUERY_PAYLOAD with VCPI
[16:18:00] [PASSED] DP_REMOTE_DPCD_READ with port number
[16:18:00] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[16:18:00] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[16:18:00] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[16:18:00] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[16:18:00] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[16:18:00] [PASSED] DP_REMOTE_I2C_READ with port number
[16:18:00] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[16:18:00] [PASSED] DP_REMOTE_I2C_READ with transactions array
[16:18:00] [PASSED] DP_REMOTE_I2C_WRITE with port number
[16:18:00] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[16:18:00] [PASSED] DP_REMOTE_I2C_WRITE with data array
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[16:18:00] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[16:18:00] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[16:18:00] ================ [PASSED] drm_dp_mst_helper ================
[16:18:00] ================== drm_exec (7 subtests) ===================
[16:18:00] [PASSED] sanitycheck
[16:18:00] [PASSED] test_lock
[16:18:00] [PASSED] test_lock_unlock
[16:18:00] [PASSED] test_duplicates
[16:18:00] [PASSED] test_prepare
[16:18:00] [PASSED] test_prepare_array
[16:18:00] [PASSED] test_multiple_loops
[16:18:00] ==================== [PASSED] drm_exec =====================
[16:18:00] =========== drm_format_helper_test (17 subtests) ===========
[16:18:00] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[16:18:00] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[16:18:00] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[16:18:00] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[16:18:00] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[16:18:00] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[16:18:00] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[16:18:00] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[16:18:00] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[16:18:00] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[16:18:00] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[16:18:00] ============== drm_test_fb_xrgb8888_to_mono ===============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[16:18:00] ==================== drm_test_fb_swab =====================
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ================ [PASSED] drm_test_fb_swab =================
[16:18:00] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[16:18:00] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[16:18:00] [PASSED] single_pixel_source_buffer
[16:18:00] [PASSED] single_pixel_clip_rectangle
[16:18:00] [PASSED] well_known_colors
[16:18:00] [PASSED] destination_pitch
[16:18:00] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[16:18:00] ================= drm_test_fb_clip_offset =================
[16:18:00] [PASSED] pass through
[16:18:00] [PASSED] horizontal offset
[16:18:00] [PASSED] vertical offset
[16:18:00] [PASSED] horizontal and vertical offset
[16:18:00] [PASSED] horizontal offset (custom pitch)
[16:18:00] [PASSED] vertical offset (custom pitch)
[16:18:00] [PASSED] horizontal and vertical offset (custom pitch)
[16:18:00] ============= [PASSED] drm_test_fb_clip_offset =============
[16:18:00] =================== drm_test_fb_memcpy ====================
[16:18:00] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[16:18:00] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[16:18:00] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[16:18:00] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[16:18:00] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[16:18:00] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[16:18:00] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[16:18:00] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[16:18:00] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[16:18:00] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[16:18:00] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[16:18:00] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[16:18:00] =============== [PASSED] drm_test_fb_memcpy ================
[16:18:00] ============= [PASSED] drm_format_helper_test ==============
[16:18:00] ================= drm_format (18 subtests) =================
[16:18:00] [PASSED] drm_test_format_block_width_invalid
[16:18:00] [PASSED] drm_test_format_block_width_one_plane
[16:18:00] [PASSED] drm_test_format_block_width_two_plane
[16:18:00] [PASSED] drm_test_format_block_width_three_plane
[16:18:00] [PASSED] drm_test_format_block_width_tiled
[16:18:00] [PASSED] drm_test_format_block_height_invalid
[16:18:00] [PASSED] drm_test_format_block_height_one_plane
[16:18:00] [PASSED] drm_test_format_block_height_two_plane
[16:18:00] [PASSED] drm_test_format_block_height_three_plane
[16:18:00] [PASSED] drm_test_format_block_height_tiled
[16:18:00] [PASSED] drm_test_format_min_pitch_invalid
[16:18:00] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[16:18:00] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[16:18:00] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[16:18:00] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[16:18:00] [PASSED] drm_test_format_min_pitch_two_plane
[16:18:00] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[16:18:00] [PASSED] drm_test_format_min_pitch_tiled
[16:18:00] =================== [PASSED] drm_format ====================
[16:18:00] ============== drm_framebuffer (10 subtests) ===============
[16:18:00] ========== drm_test_framebuffer_check_src_coords ==========
[16:18:00] [PASSED] Success: source fits into fb
[16:18:00] [PASSED] Fail: overflowing fb with x-axis coordinate
[16:18:00] [PASSED] Fail: overflowing fb with y-axis coordinate
[16:18:00] [PASSED] Fail: overflowing fb with source width
[16:18:00] [PASSED] Fail: overflowing fb with source height
[16:18:00] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[16:18:00] [PASSED] drm_test_framebuffer_cleanup
[16:18:00] =============== drm_test_framebuffer_create ===============
[16:18:00] [PASSED] ABGR8888 normal sizes
[16:18:00] [PASSED] ABGR8888 max sizes
[16:18:00] [PASSED] ABGR8888 pitch greater than min required
[16:18:00] [PASSED] ABGR8888 pitch less than min required
[16:18:00] [PASSED] ABGR8888 Invalid width
[16:18:00] [PASSED] ABGR8888 Invalid buffer handle
[16:18:00] [PASSED] No pixel format
[16:18:00] [PASSED] ABGR8888 Width 0
[16:18:00] [PASSED] ABGR8888 Height 0
[16:18:00] [PASSED] ABGR8888 Out of bound height * pitch combination
[16:18:00] [PASSED] ABGR8888 Large buffer offset
[16:18:00] [PASSED] ABGR8888 Buffer offset for inexistent plane
[16:18:00] [PASSED] ABGR8888 Invalid flag
[16:18:00] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[16:18:00] [PASSED] ABGR8888 Valid buffer modifier
[16:18:00] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[16:18:00] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] NV12 Normal sizes
[16:18:00] [PASSED] NV12 Max sizes
[16:18:00] [PASSED] NV12 Invalid pitch
[16:18:00] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[16:18:00] [PASSED] NV12 different modifier per-plane
[16:18:00] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[16:18:00] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] NV12 Modifier for inexistent plane
[16:18:00] [PASSED] NV12 Handle for inexistent plane
[16:18:00] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[16:18:00] [PASSED] YVU420 Normal sizes
[16:18:00] [PASSED] YVU420 Max sizes
[16:18:00] [PASSED] YVU420 Invalid pitch
[16:18:00] [PASSED] YVU420 Different pitches
[16:18:00] [PASSED] YVU420 Different buffer offsets/pitches
[16:18:00] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[16:18:00] [PASSED] YVU420 Valid modifier
[16:18:00] [PASSED] YVU420 Different modifiers per plane
[16:18:00] [PASSED] YVU420 Modifier for inexistent plane
[16:18:00] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[16:18:00] [PASSED] X0L2 Normal sizes
[16:18:00] [PASSED] X0L2 Max sizes
[16:18:00] [PASSED] X0L2 Invalid pitch
[16:18:00] [PASSED] X0L2 Pitch greater than minimum required
[16:18:00] [PASSED] X0L2 Handle for inexistent plane
[16:18:00] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[16:18:00] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[16:18:00] [PASSED] X0L2 Valid modifier
[16:18:00] [PASSED] X0L2 Modifier for inexistent plane
[16:18:00] =========== [PASSED] drm_test_framebuffer_create ===========
[16:18:00] [PASSED] drm_test_framebuffer_free
[16:18:00] [PASSED] drm_test_framebuffer_init
[16:18:00] [PASSED] drm_test_framebuffer_init_bad_format
[16:18:00] [PASSED] drm_test_framebuffer_init_dev_mismatch
[16:18:00] [PASSED] drm_test_framebuffer_lookup
[16:18:00] [PASSED] drm_test_framebuffer_lookup_inexistent
[16:18:00] [PASSED] drm_test_framebuffer_modifiers_not_supported
[16:18:00] ================= [PASSED] drm_framebuffer =================
[16:18:00] ================ drm_gem_shmem (8 subtests) ================
[16:18:00] [PASSED] drm_gem_shmem_test_obj_create
[16:18:00] [PASSED] drm_gem_shmem_test_obj_create_private
[16:18:00] [PASSED] drm_gem_shmem_test_pin_pages
[16:18:00] [PASSED] drm_gem_shmem_test_vmap
[16:18:00] [PASSED] drm_gem_shmem_test_get_sg_table
[16:18:00] [PASSED] drm_gem_shmem_test_get_pages_sgt
[16:18:00] [PASSED] drm_gem_shmem_test_madvise
[16:18:00] [PASSED] drm_gem_shmem_test_purge
[16:18:00] ================== [PASSED] drm_gem_shmem ==================
[16:18:00] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[16:18:00] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[16:18:00] [PASSED] Automatic
[16:18:00] [PASSED] Full
[16:18:00] [PASSED] Limited 16:235
[16:18:00] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[16:18:00] [PASSED] drm_test_check_disable_connector
[16:18:00] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[16:18:00] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[16:18:00] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[16:18:00] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[16:18:00] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[16:18:00] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[16:18:00] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[16:18:00] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[16:18:00] [PASSED] drm_test_check_output_bpc_dvi
[16:18:00] [PASSED] drm_test_check_output_bpc_format_vic_1
[16:18:00] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[16:18:00] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[16:18:00] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[16:18:00] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[16:18:00] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[16:18:00] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[16:18:00] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[16:18:00] ============ drm_test_check_hdmi_color_format =============
[16:18:00] [PASSED] AUTO -> RGB
[16:18:00] [PASSED] YCBCR422 -> YUV422
[16:18:00] [PASSED] YCBCR420 -> YUV420
[16:18:00] [PASSED] YCBCR444 -> YUV444
[16:18:00] [PASSED] RGB -> RGB
[16:18:00] ======== [PASSED] drm_test_check_hdmi_color_format =========
[16:18:00] ======== drm_test_check_hdmi_color_format_420_only ========
[16:18:00] [PASSED] RGB should fail
[16:18:00] [PASSED] YUV444 should fail
[16:18:00] [PASSED] YUV422 should fail
[16:18:00] [PASSED] YUV420 should work
[16:18:00] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[16:18:00] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[16:18:00] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[16:18:00] [PASSED] drm_test_check_broadcast_rgb_value
[16:18:00] [PASSED] drm_test_check_bpc_8_value
[16:18:00] [PASSED] drm_test_check_bpc_10_value
[16:18:00] [PASSED] drm_test_check_bpc_12_value
[16:18:00] [PASSED] drm_test_check_format_value
[16:18:00] [PASSED] drm_test_check_tmds_char_value
[16:18:00] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[16:18:00] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[16:18:00] [PASSED] drm_test_check_mode_valid
[16:18:00] [PASSED] drm_test_check_mode_valid_reject
[16:18:00] [PASSED] drm_test_check_mode_valid_reject_rate
[16:18:00] [PASSED] drm_test_check_mode_valid_reject_max_clock
[16:18:00] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[16:18:00] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[16:18:00] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[16:18:00] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[16:18:00] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[16:18:00] [PASSED] drm_test_check_infoframes
[16:18:00] [PASSED] drm_test_check_reject_avi_infoframe
[16:18:00] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[16:18:00] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[16:18:00] [PASSED] drm_test_check_reject_audio_infoframe
[16:18:00] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[16:18:00] ================= drm_managed (2 subtests) =================
[16:18:00] [PASSED] drm_test_managed_release_action
[16:18:00] [PASSED] drm_test_managed_run_action
[16:18:00] =================== [PASSED] drm_managed ===================
[16:18:00] =================== drm_mm (6 subtests) ====================
[16:18:00] [PASSED] drm_test_mm_init
[16:18:00] [PASSED] drm_test_mm_debug
[16:18:00] [PASSED] drm_test_mm_align32
[16:18:00] [PASSED] drm_test_mm_align64
[16:18:00] [PASSED] drm_test_mm_lowest
[16:18:00] [PASSED] drm_test_mm_highest
[16:18:00] ===================== [PASSED] drm_mm ======================
[16:18:00] ============= drm_modes_analog_tv (5 subtests) =============
[16:18:00] [PASSED] drm_test_modes_analog_tv_mono_576i
[16:18:00] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[16:18:00] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[16:18:00] [PASSED] drm_test_modes_analog_tv_pal_576i
[16:18:00] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[16:18:00] =============== [PASSED] drm_modes_analog_tv ===============
[16:18:00] ============== drm_panic_helper (3 subtests) ===============
[16:18:00] ============= drm_test_panic_screen_user_map ==============
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] ========= [PASSED] drm_test_panic_screen_user_map ==========
[16:18:00] ============= drm_test_panic_screen_user_page =============
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] ========= [PASSED] drm_test_panic_screen_user_page =========
[16:18:00] ========== drm_test_panic_screen_user_set_pixel ===========
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen user, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 494 x 494 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1920 x 1080 XR24 little-endian (0x34325258)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG16 little-endian (0x36314752)
[16:18:00] [PASSED] Panic screen kmsg, mode: 1024 x 768 RG24 little-endian (0x34324752)
[16:18:00] ====== [PASSED] drm_test_panic_screen_user_set_pixel =======
[16:18:00] ================ [PASSED] drm_panic_helper =================
[16:18:00] ============== drm_plane_helper (2 subtests) ===============
[16:18:00] =============== drm_test_check_plane_state ================
[16:18:00] [PASSED] clipping_simple
[16:18:00] [PASSED] clipping_rotate_reflect
[16:18:00] [PASSED] positioning_simple
[16:18:00] [PASSED] upscaling
[16:18:00] [PASSED] downscaling
[16:18:00] [PASSED] rounding1
[16:18:00] [PASSED] rounding2
[16:18:00] [PASSED] rounding3
[16:18:00] [PASSED] rounding4
[16:18:00] =========== [PASSED] drm_test_check_plane_state ============
[16:18:00] =========== drm_test_check_invalid_plane_state ============
[16:18:00] [PASSED] positioning_invalid
[16:18:00] [PASSED] upscaling_invalid
[16:18:00] [PASSED] downscaling_invalid
[16:18:00] ======= [PASSED] drm_test_check_invalid_plane_state ========
[16:18:00] ================ [PASSED] drm_plane_helper =================
[16:18:00] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[16:18:00] ====== drm_test_connector_helper_tv_get_modes_check =======
[16:18:00] [PASSED] None
[16:18:00] [PASSED] PAL
[16:18:00] [PASSED] NTSC
[16:18:00] [PASSED] Both, NTSC Default
[16:18:00] [PASSED] Both, PAL Default
[16:18:00] [PASSED] Both, NTSC Default, with PAL on command-line
[16:18:00] [PASSED] Both, PAL Default, with NTSC on command-line
[16:18:00] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[16:18:00] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[16:18:00] ================== drm_rect (9 subtests) ===================
[16:18:00] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[16:18:00] [PASSED] drm_test_rect_clip_scaled_not_clipped
[16:18:00] [PASSED] drm_test_rect_clip_scaled_clipped
[16:18:00] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[16:18:00] ================= drm_test_rect_intersect =================
[16:18:00] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[16:18:00] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[16:18:00] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[16:18:00] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[16:18:00] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[16:18:00] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[16:18:00] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[16:18:00] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[16:18:00] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[16:18:00] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[16:18:00] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[16:18:00] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[16:18:00] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[16:18:00] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[16:18:00] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[16:18:00] ============= [PASSED] drm_test_rect_intersect =============
[16:18:00] ================ drm_test_rect_calc_hscale ================
[16:18:00] [PASSED] normal use
[16:18:00] [PASSED] out of max range
[16:18:00] [PASSED] out of min range
[16:18:00] [PASSED] zero dst
[16:18:00] [PASSED] negative src
[16:18:00] [PASSED] negative dst
[16:18:00] ============ [PASSED] drm_test_rect_calc_hscale ============
[16:18:00] ================ drm_test_rect_calc_vscale ================
[16:18:00] [PASSED] normal use
[16:18:00] [PASSED] out of max range
[16:18:00] [PASSED] out of min range
[16:18:00] [PASSED] zero dst
[16:18:00] [PASSED] negative src
[16:18:00] [PASSED] negative dst
[16:18:00] ============ [PASSED] drm_test_rect_calc_vscale ============
[16:18:00] ================== drm_test_rect_rotate ===================
[16:18:00] [PASSED] reflect-x
[16:18:00] [PASSED] reflect-y
[16:18:00] [PASSED] rotate-0
[16:18:00] [PASSED] rotate-90
[16:18:00] [PASSED] rotate-180
[16:18:00] [PASSED] rotate-270
[16:18:00] ============== [PASSED] drm_test_rect_rotate ===============
[16:18:00] ================ drm_test_rect_rotate_inv =================
[16:18:00] [PASSED] reflect-x
[16:18:00] [PASSED] reflect-y
[16:18:00] [PASSED] rotate-0
[16:18:00] [PASSED] rotate-90
[16:18:00] [PASSED] rotate-180
[16:18:00] [PASSED] rotate-270
[16:18:00] ============ [PASSED] drm_test_rect_rotate_inv =============
[16:18:00] ==================== [PASSED] drm_rect =====================
[16:18:00] ============ drm_sysfb_modeset_test (1 subtest) ============
[16:18:00] ============ drm_test_sysfb_build_fourcc_list =============
[16:18:00] [PASSED] no native formats
[16:18:00] [PASSED] XRGB8888 as native format
[16:18:00] [PASSED] remove duplicates
[16:18:00] [PASSED] convert alpha formats
[16:18:00] [PASSED] random formats
[16:18:00] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[16:18:00] ============= [PASSED] drm_sysfb_modeset_test ==============
[16:18:00] ================== drm_fixp (2 subtests) ===================
[16:18:00] [PASSED] drm_test_int2fixp
[16:18:00] [PASSED] drm_test_sm2fixp
[16:18:00] ==================== [PASSED] drm_fixp =====================
[16:18:00] ============================================================
[16:18:00] Testing complete. Ran 668 tests: passed: 668
[16:18:00] Elapsed time: 27.765s total, 2.568s configuring, 24.779s building, 0.406s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[16:18:01] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:18:03] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[16:18:13] Starting KUnit Kernel (1/1)...
[16:18:13] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[16:18:13] ================= ttm_device (5 subtests) ==================
[16:18:13] [PASSED] ttm_device_init_basic
[16:18:13] [PASSED] ttm_device_init_multiple
[16:18:13] [PASSED] ttm_device_fini_basic
[16:18:13] [PASSED] ttm_device_init_no_vma_man
[16:18:13] ================== ttm_device_init_pools ==================
[16:18:13] [PASSED] No DMA allocations, no DMA32 required
[16:18:13] [PASSED] DMA allocations, DMA32 required
[16:18:13] [PASSED] No DMA allocations, DMA32 required
[16:18:13] [PASSED] DMA allocations, no DMA32 required
[16:18:13] ============== [PASSED] ttm_device_init_pools ==============
[16:18:13] =================== [PASSED] ttm_device ====================
[16:18:13] ================== ttm_pool (8 subtests) ===================
[16:18:13] ================== ttm_pool_alloc_basic ===================
[16:18:13] [PASSED] One page
[16:18:13] [PASSED] More than one page
[16:18:13] [PASSED] Above the allocation limit
[16:18:13] [PASSED] One page, with coherent DMA mappings enabled
[16:18:13] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[16:18:13] ============== [PASSED] ttm_pool_alloc_basic ===============
[16:18:13] ============== ttm_pool_alloc_basic_dma_addr ==============
[16:18:13] [PASSED] One page
[16:18:13] [PASSED] More than one page
[16:18:13] [PASSED] Above the allocation limit
[16:18:13] [PASSED] One page, with coherent DMA mappings enabled
[16:18:13] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[16:18:13] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[16:18:13] [PASSED] ttm_pool_alloc_order_caching_match
[16:18:13] [PASSED] ttm_pool_alloc_caching_mismatch
[16:18:13] [PASSED] ttm_pool_alloc_order_mismatch
[16:18:13] [PASSED] ttm_pool_free_dma_alloc
[16:18:13] [PASSED] ttm_pool_free_no_dma_alloc
[16:18:13] [PASSED] ttm_pool_fini_basic
[16:18:13] ==================== [PASSED] ttm_pool =====================
[16:18:13] ================ ttm_resource (8 subtests) =================
[16:18:13] ================= ttm_resource_init_basic =================
[16:18:13] [PASSED] Init resource in TTM_PL_SYSTEM
[16:18:13] [PASSED] Init resource in TTM_PL_VRAM
[16:18:13] [PASSED] Init resource in a private placement
[16:18:13] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[16:18:13] ============= [PASSED] ttm_resource_init_basic =============
[16:18:13] [PASSED] ttm_resource_init_pinned
[16:18:13] [PASSED] ttm_resource_fini_basic
[16:18:13] [PASSED] ttm_resource_manager_init_basic
[16:18:13] [PASSED] ttm_resource_manager_usage_basic
[16:18:13] [PASSED] ttm_resource_manager_set_used_basic
[16:18:13] [PASSED] ttm_sys_man_alloc_basic
[16:18:13] [PASSED] ttm_sys_man_free_basic
[16:18:13] ================== [PASSED] ttm_resource ===================
[16:18:13] =================== ttm_tt (15 subtests) ===================
[16:18:13] ==================== ttm_tt_init_basic ====================
[16:18:13] [PASSED] Page-aligned size
[16:18:13] [PASSED] Extra pages requested
[16:18:13] ================ [PASSED] ttm_tt_init_basic ================
[16:18:13] [PASSED] ttm_tt_init_misaligned
[16:18:13] [PASSED] ttm_tt_fini_basic
[16:18:13] [PASSED] ttm_tt_fini_sg
[16:18:13] [PASSED] ttm_tt_fini_shmem
[16:18:13] [PASSED] ttm_tt_create_basic
[16:18:13] [PASSED] ttm_tt_create_invalid_bo_type
[16:18:13] [PASSED] ttm_tt_create_ttm_exists
[16:18:13] [PASSED] ttm_tt_create_failed
[16:18:13] [PASSED] ttm_tt_destroy_basic
[16:18:13] [PASSED] ttm_tt_populate_null_ttm
[16:18:13] [PASSED] ttm_tt_populate_populated_ttm
[16:18:13] [PASSED] ttm_tt_unpopulate_basic
[16:18:13] [PASSED] ttm_tt_unpopulate_empty_ttm
[16:18:13] [PASSED] ttm_tt_swapin_basic
[16:18:13] ===================== [PASSED] ttm_tt ======================
[16:18:13] =================== ttm_bo (14 subtests) ===================
[16:18:13] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[16:18:13] [PASSED] Cannot be interrupted and sleeps
[16:18:13] [PASSED] Cannot be interrupted, locks straight away
[16:18:13] [PASSED] Can be interrupted, sleeps
[16:18:13] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[16:18:13] [PASSED] ttm_bo_reserve_locked_no_sleep
[16:18:13] [PASSED] ttm_bo_reserve_no_wait_ticket
[16:18:13] [PASSED] ttm_bo_reserve_double_resv
[16:18:13] [PASSED] ttm_bo_reserve_interrupted
[16:18:13] [PASSED] ttm_bo_reserve_deadlock
[16:18:13] [PASSED] ttm_bo_unreserve_basic
[16:18:13] [PASSED] ttm_bo_unreserve_pinned
[16:18:13] [PASSED] ttm_bo_unreserve_bulk
[16:18:13] [PASSED] ttm_bo_fini_basic
[16:18:13] [PASSED] ttm_bo_fini_shared_resv
[16:18:13] [PASSED] ttm_bo_pin_basic
[16:18:13] [PASSED] ttm_bo_pin_unpin_resource
[16:18:13] [PASSED] ttm_bo_multiple_pin_one_unpin
[16:18:13] ===================== [PASSED] ttm_bo ======================
[16:18:13] ============== ttm_bo_validate (22 subtests) ===============
[16:18:13] ============== ttm_bo_init_reserved_sys_man ===============
[16:18:13] [PASSED] Buffer object for userspace
[16:18:13] [PASSED] Kernel buffer object
[16:18:13] [PASSED] Shared buffer object
[16:18:13] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[16:18:13] ============== ttm_bo_init_reserved_mock_man ==============
[16:18:13] [PASSED] Buffer object for userspace
[16:18:13] [PASSED] Kernel buffer object
[16:18:13] [PASSED] Shared buffer object
[16:18:13] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[16:18:13] [PASSED] ttm_bo_init_reserved_resv
[16:18:13] ================== ttm_bo_validate_basic ==================
[16:18:13] [PASSED] Buffer object for userspace
[16:18:13] [PASSED] Kernel buffer object
[16:18:13] [PASSED] Shared buffer object
[16:18:13] ============== [PASSED] ttm_bo_validate_basic ==============
[16:18:13] [PASSED] ttm_bo_validate_invalid_placement
[16:18:13] ============= ttm_bo_validate_same_placement ==============
[16:18:13] [PASSED] System manager
[16:18:13] [PASSED] VRAM manager
[16:18:13] ========= [PASSED] ttm_bo_validate_same_placement ==========
[16:18:13] [PASSED] ttm_bo_validate_failed_alloc
[16:18:13] [PASSED] ttm_bo_validate_pinned
[16:18:13] [PASSED] ttm_bo_validate_busy_placement
[16:18:13] ================ ttm_bo_validate_multihop =================
[16:18:13] [PASSED] Buffer object for userspace
[16:18:13] [PASSED] Kernel buffer object
[16:18:13] [PASSED] Shared buffer object
[16:18:13] ============ [PASSED] ttm_bo_validate_multihop =============
[16:18:13] ========== ttm_bo_validate_no_placement_signaled ==========
[16:18:13] [PASSED] Buffer object in system domain, no page vector
[16:18:13] [PASSED] Buffer object in system domain with an existing page vector
[16:18:13] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[16:18:13] ======== ttm_bo_validate_no_placement_not_signaled ========
[16:18:13] [PASSED] Buffer object for userspace
[16:18:13] [PASSED] Kernel buffer object
[16:18:13] [PASSED] Shared buffer object
[16:18:13] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[16:18:13] [PASSED] ttm_bo_validate_move_fence_signaled
[16:18:13] ========= ttm_bo_validate_move_fence_not_signaled =========
[16:18:13] [PASSED] Waits for GPU
[16:18:13] [PASSED] Tries to lock straight away
[16:18:13] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[16:18:13] [PASSED] ttm_bo_validate_swapout
[16:18:13] [PASSED] ttm_bo_validate_happy_evict
[16:18:13] [PASSED] ttm_bo_validate_all_pinned_evict
[16:18:13] [PASSED] ttm_bo_validate_allowed_only_evict
[16:18:13] [PASSED] ttm_bo_validate_deleted_evict
[16:18:13] [PASSED] ttm_bo_validate_busy_domain_evict
[16:18:13] [PASSED] ttm_bo_validate_evict_gutting
[16:18:13] [PASSED] ttm_bo_validate_recrusive_evict
[16:18:13] ================= [PASSED] ttm_bo_validate =================
[16:18:13] ============================================================
[16:18:13] Testing complete. Ran 102 tests: passed: 102
[16:18:13] Elapsed time: 12.727s total, 2.503s configuring, 10.009s building, 0.184s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[16:18:13] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[16:18:16] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[16:18:25] Starting KUnit Kernel (1/1)...
[16:18:25] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[16:18:25] =============== dma-buf-fence (12 subtests) ================
[16:18:25] [PASSED] test_sanitycheck
[16:18:25] [PASSED] test_signaling
[16:18:25] [PASSED] test_add_callback
[16:18:25] [PASSED] test_late_add_callback
[16:18:25] [PASSED] test_rm_callback
[16:18:25] [PASSED] test_late_rm_callback
[16:18:25] [PASSED] test_status
[16:18:25] [PASSED] test_error
[16:18:25] [PASSED] test_wait
[16:18:25] [PASSED] test_wait_timeout
[16:18:25] [PASSED] test_stub
[16:18:25] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[16:18:25] ================== [PASSED] dma-buf-fence ==================
[16:18:25] ============ dma-buf-fence-chain (11 subtests) =============
[16:18:25] [PASSED] test_sanitycheck
[16:18:25] [PASSED] test_find_seqno
[16:18:25] [PASSED] test_find_signaled
[16:18:25] [PASSED] test_find_out_of_order
[16:18:30] [PASSED] test_find_gap
[16:18:30] [PASSED] test_find_race
[16:18:30] [PASSED] test_signal_forward
[16:18:30] [PASSED] test_signal_backward
[16:18:30] [PASSED] test_wait_forward
[16:18:30] [PASSED] test_wait_backward
[16:18:30] [PASSED] test_wait_random
[16:18:30] =============== [PASSED] dma-buf-fence-chain ===============
[16:18:30] ============ dma-buf-fence-unwrap (11 subtests) ============
[16:18:30] [PASSED] test_sanitycheck
[16:18:30] [PASSED] test_unwrap_array
[16:18:30] [PASSED] test_unwrap_chain
[16:18:30] [PASSED] test_unwrap_chain_array
[16:18:30] [PASSED] test_unwrap_merge
[16:18:30] [PASSED] test_unwrap_merge_duplicate
[16:18:30] [PASSED] test_unwrap_merge_seqno
[16:18:30] [PASSED] test_unwrap_merge_order
[16:18:30] [PASSED] test_unwrap_merge_complex
[16:18:30] [PASSED] test_unwrap_merge_complex_seqno
[16:18:30] [PASSED] test_dedup_empty
[16:18:30] ============== [PASSED] dma-buf-fence-unwrap ===============
[16:18:30] ================ dma-buf-resv (5 subtests) =================
[16:18:30] [PASSED] test_sanitycheck
[16:18:30] ===================== test_signaling ======================
[16:18:30] [PASSED] kernel
[16:18:30] [PASSED] write
[16:18:30] [PASSED] read
[16:18:30] [PASSED] bookkeep
[16:18:30] ================= [PASSED] test_signaling ==================
[16:18:30] ====================== test_for_each ======================
[16:18:30] [PASSED] kernel
[16:18:30] [PASSED] write
[16:18:30] [PASSED] read
[16:18:30] [PASSED] bookkeep
[16:18:30] ================== [PASSED] test_for_each ==================
[16:18:30] ================= test_for_each_unlocked ==================
[16:18:30] [PASSED] kernel
[16:18:30] [PASSED] write
[16:18:30] [PASSED] read
[16:18:30] [PASSED] bookkeep
[16:18:30] ============= [PASSED] test_for_each_unlocked ==============
[16:18:30] ===================== test_get_fences =====================
[16:18:30] [PASSED] kernel
[16:18:30] [PASSED] write
[16:18:30] [PASSED] read
[16:18:30] [PASSED] bookkeep
[16:18:30] ================= [PASSED] test_get_fences =================
[16:18:30] ================== [PASSED] dma-buf-resv ===================
[16:18:30] ============================================================
[16:18:30] Testing complete. Ran 51 tests: passed: 50, skipped: 1
[16:18:30] Elapsed time: 16.481s total, 2.555s configuring, 8.655s building, 5.260s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 21+ messages in thread* ✗ CI.checksparse: warning for Add support for a DRM backlight capability
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (12 preceding siblings ...)
2026-11-04 16:18 ` ✓ CI.KUnit: success for Add support for a DRM backlight capability Patchwork
@ 2026-11-04 16:34 ` Patchwork
2026-11-04 16:52 ` ✓ Xe.CI.BAT: success " Patchwork
14 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2026-11-04 16:34 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: intel-xe
== Series Details ==
Series: Add support for a DRM backlight capability
URL : https://patchwork.freedesktop.org/series/177737/
State : warning
== Summary ==
+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast c0cb7e7c00c9563d72c1e1b08fac139a57fd0ebf
Sparse version: 0.6.4 (Ubuntu: 0.6.4-4ubuntu3)
Fast mode used, each commit won't be checked separately.
+/kernel/Makefile:1292: C=1 specified, but sparse is not available or not up to date
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 21+ messages in thread* ✓ Xe.CI.BAT: success for Add support for a DRM backlight capability
2026-11-03 22:42 [PATCH v11 00/12] Add support for a DRM backlight capability Mario Limonciello (AMD)
` (13 preceding siblings ...)
2026-11-04 16:34 ` ✗ CI.checksparse: warning " Patchwork
@ 2026-11-04 16:52 ` Patchwork
14 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2026-11-04 16:52 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 5130 bytes --]
== Series Details ==
Series: Add support for a DRM backlight capability
URL : https://patchwork.freedesktop.org/series/177737/
State : success
== Summary ==
CI Bug Log - changes from xe-6060-c0cb7e7c00c9563d72c1e1b08fac139a57fd0ebf_BAT -> xe-pw-177737v1_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (14 -> 15)
------------------------------
Additional (1): bat-bmg-2
Known issues
------------
Here are the changes found in xe-pw-177737v1_BAT that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@core_hotunplug@unbind-rebind:
- bat-bmg-2: NOTRUN -> [ABORT][1] ([Intel XE#9463])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@core_hotunplug@unbind-rebind.html
* igt@fbdev@write:
- bat-bmg-2: NOTRUN -> [SKIP][2] ([Intel XE#2134]) +4 other tests skip
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@fbdev@write.html
* igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
- bat-bmg-2: NOTRUN -> [SKIP][3] ([Intel XE#2233])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html
* igt@kms_cursor_legacy@basic-flip-after-cursor-legacy:
- bat-bmg-2: NOTRUN -> [SKIP][4] ([Intel XE#2489] / [Intel XE#3419]) +13 other tests skip
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@kms_cursor_legacy@basic-flip-after-cursor-legacy.html
* igt@kms_flip@basic-flip-vs-modeset:
- bat-bmg-2: NOTRUN -> [SKIP][5] ([Intel XE#2482]) +3 other tests skip
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@kms_flip@basic-flip-vs-modeset.html
* igt@kms_frontbuffer_tracking@basic:
- bat-bmg-2: NOTRUN -> [SKIP][6] ([Intel XE#2434] / [Intel XE#2548] / [Intel XE#6314])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@kms_frontbuffer_tracking@basic.html
* igt@kms_psr@psr-sprite-plane-onoff:
- bat-bmg-2: NOTRUN -> [SKIP][7] ([Intel XE#2234] / [Intel XE#2850]) +2 other tests skip
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@kms_psr@psr-sprite-plane-onoff.html
* igt@xe_exec_multi_queue@priority:
- bat-bmg-2: NOTRUN -> [SKIP][8] ([Intel XE#8364]) +13 other tests skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@xe_exec_multi_queue@priority.html
* igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
- bat-bmg-2: NOTRUN -> [SKIP][9] ([Intel XE#2229])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
* igt@xe_pat@pat-index-xehpc:
- bat-bmg-2: NOTRUN -> [SKIP][10] ([Intel XE#1420] / [Intel XE#7590])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@xe_pat@pat-index-xehpc.html
* igt@xe_pat@pat-index-xelp:
- bat-bmg-2: NOTRUN -> [SKIP][11] ([Intel XE#2245] / [Intel XE#7590])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@xe_pat@pat-index-xelp.html
* igt@xe_pat@pat-index-xelpg:
- bat-bmg-2: NOTRUN -> [SKIP][12] ([Intel XE#2236] / [Intel XE#7590])
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/bat-bmg-2/igt@xe_pat@pat-index-xelpg.html
[Intel XE#1420]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1420
[Intel XE#2134]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2134
[Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
[Intel XE#2233]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2233
[Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
[Intel XE#2236]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2236
[Intel XE#2245]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2245
[Intel XE#2434]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2434
[Intel XE#2482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2482
[Intel XE#2489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2489
[Intel XE#2548]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2548
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#3419]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3419
[Intel XE#6314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6314
[Intel XE#7590]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7590
[Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
[Intel XE#9463]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9463
Build changes
-------------
* Linux: xe-6060-c0cb7e7c00c9563d72c1e1b08fac139a57fd0ebf -> xe-pw-177737v1
IGT_9177: 9177
xe-6060-c0cb7e7c00c9563d72c1e1b08fac139a57fd0ebf: c0cb7e7c00c9563d72c1e1b08fac139a57fd0ebf
xe-pw-177737v1: 177737v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-177737v1/index.html
[-- Attachment #2: Type: text/html, Size: 6064 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread