* [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels
@ 2026-04-28 8:33 Ankit Nautiyal
2026-04-28 8:33 ` [PATCH 1/2] drm/i915/intel_panel: Add a helper to get the highest refresh rate mode Ankit Nautiyal
` (4 more replies)
0 siblings, 5 replies; 14+ messages in thread
From: Ankit Nautiyal @ 2026-04-28 8:33 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: ville.syrjala, jani.nikula, Ankit Nautiyal
Currently intel_panel_fixed_mode() can return a lower refresh rate mode
for VRR panels if the lower refresh rate mode is first in the list.
This creates problems for seamless switch features like LRR and
Seamless-DRRS, as it results in changes to vsync_start/end causing a
full modeset instead of a seamless switch.
This is particularly problematic for DRRS panels on platforms without
double buffered M/N support for LNL+ (display version 20+), where
seamless clock changes are not possible.
This series attempts to fixe this by:
1. Adding a helper to get the highest refresh rate mode from the list of
fixed modes for a connector.
2. When a seamless switch to a lower mode is desired, making
intel_panel_fixed_mode() return the highest refresh rate mode,
provided the requested rate is in VRR range. The vblank is then
extended to provide the desired refresh rate.
To determine whether a full modeset or seamless switch is intended, the
connector state is checked for the allow_modeset flag. A nullable
conn_state parameter is added to intel_panel_fixed_mode() and
intel_panel_compute_config() for this purpose.
Ankit Nautiyal (2):
drm/i915/intel_panel: Add a helper to get the highest refresh rate
mode
drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR
changes
drivers/gpu/drm/i915/display/icl_dsi.c | 2 +-
drivers/gpu/drm/i915/display/intel_dp.c | 6 +--
drivers/gpu/drm/i915/display/intel_dsi.c | 2 +-
drivers/gpu/drm/i915/display/intel_dvo.c | 6 +--
drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-
drivers/gpu/drm/i915/display/intel_panel.c | 50 ++++++++++++++--------
drivers/gpu/drm/i915/display/intel_panel.h | 8 +++-
drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--
drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +-
9 files changed, 54 insertions(+), 34 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH 1/2] drm/i915/intel_panel: Add a helper to get the highest refresh rate mode 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal @ 2026-04-28 8:33 ` Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes Ankit Nautiyal ` (3 subsequent siblings) 4 siblings, 0 replies; 14+ messages in thread From: Ankit Nautiyal @ 2026-04-28 8:33 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: ville.syrjala, jani.nikula, Ankit Nautiyal Introduce a helper intel_panel_highest_vrefresh_mode() to get the highest refresh rate mode from the list of fixed modes for a connector. Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> --- drivers/gpu/drm/i915/display/intel_panel.c | 15 +++++++++++++++ drivers/gpu/drm/i915/display/intel_panel.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 2a20aaaaac39..5e918ee0c8ea 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -158,6 +158,21 @@ intel_panel_highest_mode(struct intel_connector *connector, return best_mode; } +const struct drm_display_mode * +intel_panel_highest_vrefresh_mode(struct intel_connector *connector) +{ + const struct drm_display_mode *fixed_mode, *best_mode = NULL; + + /* pick the fixed_mode that has the highest vrefresh */ + list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { + if (!best_mode || + drm_mode_vrefresh(fixed_mode) > drm_mode_vrefresh(best_mode)) + best_mode = fixed_mode; + } + + return best_mode; +} + int intel_panel_get_modes(struct intel_connector *connector) { const struct drm_display_mode *fixed_mode; diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h index 56a6412cf0fb..2f7a317995ea 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.h +++ b/drivers/gpu/drm/i915/display/intel_panel.h @@ -39,6 +39,8 @@ intel_panel_downclock_mode(struct intel_connector *connector, const struct drm_display_mode * intel_panel_highest_mode(struct intel_connector *connector, const struct drm_display_mode *adjusted_mode); +const struct drm_display_mode * +intel_panel_highest_vrefresh_mode(struct intel_connector *connector); int intel_panel_get_modes(struct intel_connector *connector); enum drrs_type intel_panel_drrs_type(struct intel_connector *connector); enum drm_mode_status -- 2.45.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 1/2] drm/i915/intel_panel: Add a helper to get the highest refresh rate mode Ankit Nautiyal @ 2026-04-28 8:33 ` Ankit Nautiyal 2026-04-28 9:39 ` Jani Nikula 2026-04-29 12:14 ` Ville Syrjälä 2026-04-28 9:32 ` ✓ CI.KUnit: success for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Patchwork ` (2 subsequent siblings) 4 siblings, 2 replies; 14+ messages in thread From: Ankit Nautiyal @ 2026-04-28 8:33 UTC (permalink / raw) To: intel-gfx, intel-xe; +Cc: ville.syrjala, jani.nikula, Ankit Nautiyal intel_panel_fixed_mode() intends to choose a fixed mode at or above the requested refresh rate for VRR panels, so the requested refresh can be reached by extending vblank. This is called in compute config to find the 'best' fixed mode for a requested mode and also called during mode valid phase to prune the unsupported fixed modes. For Non-VRR panels there is no issue: - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET flag) with a custom mode, the intel_panel_fixed_mode() gives the mode with refresh rate nearest to the requested mode. - Seamless switch to a lower mode is only possible if the platform has support for Double buffered MN and the sink is Seamless-DRRS capable. In this case the user sets a lower refresh rate mode and doesn't set the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns again the fixed mode whose refresh rate is nearest to the requested mode. - Since Duble buffered MN is not supported on LNL+, the seamless switch is not possible for such panels from LNL+. For VRR panels the current logic has some issues: - For VRR panels intel_panel_fixed_mode() intends to choose a fixed mode at or above the requested refresh rate so the requested refresh can be reached by extending vblank. - However, as per the current logic the helper can return a lower refresh rate mode, if the lower refresh rate mode is first in the list of fixed mode. Later, if the selected fixed mode's refresh rate < the requested mode's refresh rate, then the requested rate is matched by extending the vblank. - In case of a full modeset request with a custom mode this is not a problem. But for the seamless switch features like LRR (Lower Refresh Rate) and the Seamless-DRRS this creates a problem as this results in change in vsync_start/end and resulting in a full modeset. - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not supported on LNL+, but for VRR panels, the vblank can be extended similar to LRR case. But due to the above mentioned problem in the intel_panel_fixed_mode() this also results in full modeset. To solve these problems for the VRR panels, identify if the user wants a full modeset or expects seamless switch. If seamless switch to a lower mode is desired, make intel_panel_fixed_mode() return the highest refresh rate mode, provided the requested rate is in vrr range. This will then be modified to extend the vblank to provide the desired refresh rate. This is particularly needed for DRRS panels on platforms without the double buffered M/N support (display version 20+), where seamless clock changes are not possible. To understand the user requirement for full modeset/seamless switch, the intel_panel_fixed_mode() and intel_panel_compute_config() need access to the connector state to check the allow_modeset flag. Add a nullable conn_state parameter to both. The mode_valid callers pass NULL since they have no atomic state and the compute_config callers pass their conn_state. Also remove the VRR check from is_best_fixed_mode() since the selection is handled upfront in intel_panel_fixed_mode(). Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> --- drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- drivers/gpu/drm/i915/display/intel_panel.c | 35 +++++++++++----------- drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- 9 files changed, 37 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c index afbaa0465842..1efe81404d01 100644 --- a/drivers/gpu/drm/i915/display/icl_dsi.c +++ b/drivers/gpu/drm/i915/display/icl_dsi.c @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; - ret = intel_panel_compute_config(intel_connector, adjusted_mode); + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); if (ret) return ret; diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 35b8fb5740aa..f014ce28e69f 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, if (intel_dp_hdisplay_bad(display, mode->hdisplay)) return MODE_H_ILLEGAL; - fixed_mode = intel_panel_fixed_mode(connector, mode); + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); if (intel_dp_is_edp(intel_dp) && fixed_mode) { status = intel_panel_mode_valid(connector, mode); if (status != MODE_OK) @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, struct intel_connector *connector = intel_dp->attached_connector; int ret = 0, link_bpp_x16; - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, conn_state); if (intel_dp_is_edp(intel_dp) && fixed_mode) { - ret = intel_panel_compute_config(connector, adjusted_mode); + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); if (ret) return ret; } diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c index 9005c1f5d857..a480bb79dca7 100644 --- a/drivers/gpu/drm/i915/display/intel_dsi.c +++ b/drivers/gpu/drm/i915/display/intel_dsi.c @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector, struct intel_display *display = to_intel_display(connector->dev); struct intel_connector *intel_connector = to_intel_connector(connector); const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(intel_connector, mode); + intel_panel_fixed_mode(intel_connector, mode, NULL); int max_dotclk = display->cdclk.max_dotclk_freq; enum drm_mode_status status; diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c index 405b33aca9dd..0ec25d895777 100644 --- a/drivers/gpu/drm/i915/display/intel_dvo.c +++ b/drivers/gpu/drm/i915/display/intel_dvo.c @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector *_connector, struct intel_connector *connector = to_intel_connector(_connector); struct intel_dvo *intel_dvo = intel_attached_dvo(connector); const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(connector, mode); + intel_panel_fixed_mode(connector, mode, NULL); int max_dotclk = display->cdclk.max_dotclk_freq; int target_clock = mode->clock; enum drm_mode_status status; @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, struct intel_connector *connector = to_intel_connector(conn_state->connector); struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); + intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode, conn_state); /* * If we have timings from the BIOS for the panel, put them in @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, if (fixed_mode) { int ret; - ret = intel_panel_compute_config(connector, adjusted_mode); + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); if (ret) return ret; } diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c index cc6d4bfcff10..2e30bc3f1e62 100644 --- a/drivers/gpu/drm/i915/display/intel_lvds.c +++ b/drivers/gpu/drm/i915/display/intel_lvds.c @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector *_connector, struct intel_display *display = to_intel_display(_connector->dev); struct intel_connector *connector = to_intel_connector(_connector); const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(connector, mode); + intel_panel_fixed_mode(connector, mode, NULL); int max_pixclk = display->cdclk.max_dotclk_freq; enum drm_mode_status status; @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, * with the panel scaling set up to source from the H/VDisplay * of the original mode. */ - ret = intel_panel_compute_config(connector, adjusted_mode); + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); if (ret) return ret; diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 5e918ee0c8ea..65d017371d78 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct intel_connector *connector) struct drm_display_mode, head); } -static bool is_best_fixed_mode(struct intel_connector *connector, - int vrefresh, int fixed_mode_vrefresh, +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, const struct drm_display_mode *best_mode) { /* we want to always return something */ if (!best_mode) return true; - /* - * With VRR always pick a mode with equal/higher than requested - * vrefresh, which we can then reduce to match the requested - * vrefresh by extending the vblank length. - */ - if (intel_vrr_is_in_range(connector, vrefresh) && - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && - fixed_mode_vrefresh < vrefresh) - return false; - /* pick the fixed_mode that is closest in terms of vrefresh */ return abs(fixed_mode_vrefresh - vrefresh) < abs(drm_mode_vrefresh(best_mode) - vrefresh); @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct intel_connector *connector, const struct drm_display_mode * intel_panel_fixed_mode(struct intel_connector *connector, - const struct drm_display_mode *mode) + const struct drm_display_mode *mode, + const struct drm_connector_state *conn_state) { const struct drm_display_mode *fixed_mode, *best_mode = NULL; int vrefresh = drm_mode_vrefresh(mode); + /* + * With VRR always pick the highest refresh rate mode, + * which we can then reduce to match the requested + * vrefresh by extending the vblank length. + */ + if (conn_state && !conn_state->state->allow_modeset && + intel_vrr_is_capable(connector) && + intel_vrr_is_in_range(connector, vrefresh)) + return intel_panel_highest_vrefresh_mode(connector); + list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); - if (is_best_fixed_mode(connector, vrefresh, + if (is_best_fixed_mode(vrefresh, fixed_mode_vrefresh, best_mode)) best_mode = fixed_mode; } @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector) } int intel_panel_compute_config(struct intel_connector *connector, - struct drm_display_mode *adjusted_mode) + struct drm_display_mode *adjusted_mode, + const struct drm_connector_state *conn_state) { const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(connector, adjusted_mode); + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); int vrefresh, fixed_mode_vrefresh; bool is_vrr; @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector *connector, const struct drm_display_mode *mode) { const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(connector, mode); + intel_panel_fixed_mode(connector, mode, NULL); if (!fixed_mode) return MODE_OK; diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h index 2f7a317995ea..c1189a20c8b2 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.h +++ b/drivers/gpu/drm/i915/display/intel_panel.h @@ -32,7 +32,8 @@ const struct drm_display_mode * intel_panel_preferred_fixed_mode(struct intel_connector *connector); const struct drm_display_mode * intel_panel_fixed_mode(struct intel_connector *connector, - const struct drm_display_mode *mode); + const struct drm_display_mode *mode, + const struct drm_connector_state *conn_state); const struct drm_display_mode * intel_panel_downclock_mode(struct intel_connector *connector, const struct drm_display_mode *adjusted_mode); @@ -47,7 +48,8 @@ enum drm_mode_status intel_panel_mode_valid(struct intel_connector *connector, const struct drm_display_mode *mode); int intel_panel_compute_config(struct intel_connector *connector, - struct drm_display_mode *adjusted_mode); + struct drm_display_mode *adjusted_mode, + const struct drm_connector_state *conn_state); void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, bool use_alt_fixed_modes); void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector *connector); diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c index 2e1af9e869de..e07c1070a3ec 100644 --- a/drivers/gpu/drm/i915/display/intel_sdvo.c +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, if (IS_LVDS(intel_sdvo_connector)) { const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); if (fixed_mode->hdisplay != args.width || fixed_mode->vdisplay != args.height) @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder, pipe_config->sdvo_tv_clock = true; } else if (IS_LVDS(intel_sdvo_connector)) { const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); int ret; ret = intel_panel_compute_config(&intel_sdvo_connector->base, - adjusted_mode); + adjusted_mode, conn_state); if (ret) return ret; @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state, /* lvds has a special fixed output timing. */ if (IS_LVDS(intel_sdvo_connector)) { const struct drm_display_mode *fixed_mode = - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); } else { diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c index 76e8cd0f65a4..bfe465443d20 100644 --- a/drivers/gpu/drm/i915/display/vlv_dsi.c +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; - ret = intel_panel_compute_config(intel_connector, adjusted_mode); + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); if (ret) return ret; -- 2.45.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-28 8:33 ` [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes Ankit Nautiyal @ 2026-04-28 9:39 ` Jani Nikula 2026-04-29 13:28 ` Nautiyal, Ankit K 2026-04-29 12:14 ` Ville Syrjälä 1 sibling, 1 reply; 14+ messages in thread From: Jani Nikula @ 2026-04-28 9:39 UTC (permalink / raw) To: Ankit Nautiyal, intel-gfx, intel-xe; +Cc: ville.syrjala, Ankit Nautiyal On Tue, 28 Apr 2026, Ankit Nautiyal <ankit.k.nautiyal@intel.com> wrote: > intel_panel_fixed_mode() intends to choose a fixed mode at or above the > requested refresh rate for VRR panels, so the requested refresh can be > reached by extending vblank. > > This is called in compute config to find the 'best' fixed mode for a > requested mode and also called during mode valid phase to prune the > unsupported fixed modes. > > For Non-VRR panels there is no issue: > - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET > flag) with a custom mode, the intel_panel_fixed_mode() gives the mode > with refresh rate nearest to the requested mode. > - Seamless switch to a lower mode is only possible if the platform has > support for Double buffered MN and the sink is Seamless-DRRS capable. > In this case the user sets a lower refresh rate mode and doesn't set > the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns > again the fixed mode whose refresh rate is nearest to the requested > mode. > - Since Duble buffered MN is not supported on LNL+, the seamless switch > is not possible for such panels from LNL+. > > For VRR panels the current logic has some issues: > - For VRR panels intel_panel_fixed_mode() intends to choose a fixed mode > at or above the requested refresh rate so the requested refresh can be > reached by extending vblank. > - However, as per the current logic the helper can return a lower refresh > rate mode, if the lower refresh rate mode is first in the list of fixed > mode. Later, if the selected fixed mode's refresh rate < the requested > mode's refresh rate, then the requested rate is matched by extending > the vblank. > - In case of a full modeset request with a custom mode this is not a > problem. But for the seamless switch features like LRR (Lower Refresh > Rate) and the Seamless-DRRS this creates a problem as this results in > change in vsync_start/end and resulting in a full modeset. > - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not > supported on LNL+, but for VRR panels, the vblank can be extended > similar to LRR case. But due to the above mentioned problem in the > intel_panel_fixed_mode() this also results in full modeset. > > To solve these problems for the VRR panels, identify if the user wants a > full modeset or expects seamless switch. If seamless switch to a lower > mode is desired, make intel_panel_fixed_mode() return the highest > refresh rate mode, provided the requested rate is in vrr range. This > will then be modified to extend the vblank to provide the desired > refresh rate. > > This is particularly needed for DRRS panels on platforms without the > double buffered M/N support (display version 20+), where seamless clock > changes are not possible. > > To understand the user requirement for full modeset/seamless switch, the > intel_panel_fixed_mode() and intel_panel_compute_config() need access to > the connector state to check the allow_modeset flag. > > Add a nullable conn_state parameter to both. The mode_valid callers pass > NULL since they have no atomic state and the compute_config callers pass > their conn_state. > > Also remove the VRR check from is_best_fixed_mode() since the selection is > handled upfront in intel_panel_fixed_mode(). > > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> > --- > drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- > drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- > drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- > drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- > drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- > drivers/gpu/drm/i915/display/intel_panel.c | 35 +++++++++++----------- > drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- > drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- > drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- > 9 files changed, 37 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c > index afbaa0465842..1efe81404d01 100644 > --- a/drivers/gpu/drm/i915/display/icl_dsi.c > +++ b/drivers/gpu/drm/i915/display/icl_dsi.c > @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, > pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > > - ret = intel_panel_compute_config(intel_connector, adjusted_mode); > + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); Whenever I see the parameters changed for a "compute config" call in the compute config path, my immediate reaction is that it should be changed to take the same parameters as the encoder->compute_config hook, and be done with it for good. Maybe the first parameter should be connector instead of encoder here, but otherwise would make sense. Also, I forget why we have ->attached_connector in a number of intel_encoder "subclasses" but not in intel_encoder itself. Would make this easier, perhaps. And could conform to the exact same params. > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > index 35b8fb5740aa..f014ce28e69f 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, > if (intel_dp_hdisplay_bad(display, mode->hdisplay)) > return MODE_H_ILLEGAL; > > - fixed_mode = intel_panel_fixed_mode(connector, mode); > + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); > if (intel_dp_is_edp(intel_dp) && fixed_mode) { > status = intel_panel_mode_valid(connector, mode); > if (status != MODE_OK) > @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, > struct intel_connector *connector = intel_dp->attached_connector; > int ret = 0, link_bpp_x16; > > - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); > + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, conn_state); > if (intel_dp_is_edp(intel_dp) && fixed_mode) { > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > } > diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c > index 9005c1f5d857..a480bb79dca7 100644 > --- a/drivers/gpu/drm/i915/display/intel_dsi.c > +++ b/drivers/gpu/drm/i915/display/intel_dsi.c > @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector, > struct intel_display *display = to_intel_display(connector->dev); > struct intel_connector *intel_connector = to_intel_connector(connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(intel_connector, mode); > + intel_panel_fixed_mode(intel_connector, mode, NULL); > int max_dotclk = display->cdclk.max_dotclk_freq; > enum drm_mode_status status; > > diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c > index 405b33aca9dd..0ec25d895777 100644 > --- a/drivers/gpu/drm/i915/display/intel_dvo.c > +++ b/drivers/gpu/drm/i915/display/intel_dvo.c > @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector *_connector, > struct intel_connector *connector = to_intel_connector(_connector); > struct intel_dvo *intel_dvo = intel_attached_dvo(connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > int max_dotclk = display->cdclk.max_dotclk_freq; > int target_clock = mode->clock; > enum drm_mode_status status; > @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, > struct intel_connector *connector = to_intel_connector(conn_state->connector); > struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); > + intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode, conn_state); > > /* > * If we have timings from the BIOS for the panel, put them in > @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, > if (fixed_mode) { > int ret; > > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > } > diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c > index cc6d4bfcff10..2e30bc3f1e62 100644 > --- a/drivers/gpu/drm/i915/display/intel_lvds.c > +++ b/drivers/gpu/drm/i915/display/intel_lvds.c > @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector *_connector, > struct intel_display *display = to_intel_display(_connector->dev); > struct intel_connector *connector = to_intel_connector(_connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > int max_pixclk = display->cdclk.max_dotclk_freq; > enum drm_mode_status status; > > @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, > * with the panel scaling set up to source from the H/VDisplay > * of the original mode. > */ > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c > index 5e918ee0c8ea..65d017371d78 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.c > +++ b/drivers/gpu/drm/i915/display/intel_panel.c > @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct intel_connector *connector) > struct drm_display_mode, head); > } > > -static bool is_best_fixed_mode(struct intel_connector *connector, > - int vrefresh, int fixed_mode_vrefresh, > +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, > const struct drm_display_mode *best_mode) > { > /* we want to always return something */ > if (!best_mode) > return true; > > - /* > - * With VRR always pick a mode with equal/higher than requested > - * vrefresh, which we can then reduce to match the requested > - * vrefresh by extending the vblank length. > - */ > - if (intel_vrr_is_in_range(connector, vrefresh) && > - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && > - fixed_mode_vrefresh < vrefresh) > - return false; > - > /* pick the fixed_mode that is closest in terms of vrefresh */ > return abs(fixed_mode_vrefresh - vrefresh) < > abs(drm_mode_vrefresh(best_mode) - vrefresh); > @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct intel_connector *connector, > > const struct drm_display_mode * > intel_panel_fixed_mode(struct intel_connector *connector, > - const struct drm_display_mode *mode) > + const struct drm_display_mode *mode, > + const struct drm_connector_state *conn_state) > { > const struct drm_display_mode *fixed_mode, *best_mode = NULL; > int vrefresh = drm_mode_vrefresh(mode); > > + /* > + * With VRR always pick the highest refresh rate mode, > + * which we can then reduce to match the requested > + * vrefresh by extending the vblank length. > + */ > + if (conn_state && !conn_state->state->allow_modeset && > + intel_vrr_is_capable(connector) && > + intel_vrr_is_in_range(connector, vrefresh)) > + return intel_panel_highest_vrefresh_mode(connector); I do dislike making intel_panel_fixed_mode() this convoluted. I'm thinking perhaps we should try to refactor this so that we reduce intel_panel_fixed_mode() calls in encoder code. Instead, handle more in intel_panel_mode_valid() and intel_panel_compute_config(). It's much more clear to have the above conditions in intel_panel_compute_config(), and have that choose the function to call instead. Besides, we have a lot of code calling intel_panel_fixed_mode() and then intel_panel_mode_valid() or intel_panel_compute_config(), which both call intel_panel_fixed_mode() as the first thing. That's just silly. BR, Jani. > + > list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { > int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); > > - if (is_best_fixed_mode(connector, vrefresh, > + if (is_best_fixed_mode(vrefresh, > fixed_mode_vrefresh, best_mode)) > best_mode = fixed_mode; > } > @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector) > } > > int intel_panel_compute_config(struct intel_connector *connector, > - struct drm_display_mode *adjusted_mode) > + struct drm_display_mode *adjusted_mode, > + const struct drm_connector_state *conn_state) > { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, adjusted_mode); > + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); > int vrefresh, fixed_mode_vrefresh; > bool is_vrr; > > @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector *connector, > const struct drm_display_mode *mode) > { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > > if (!fixed_mode) > return MODE_OK; > diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h > index 2f7a317995ea..c1189a20c8b2 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.h > +++ b/drivers/gpu/drm/i915/display/intel_panel.h > @@ -32,7 +32,8 @@ const struct drm_display_mode * > intel_panel_preferred_fixed_mode(struct intel_connector *connector); > const struct drm_display_mode * > intel_panel_fixed_mode(struct intel_connector *connector, > - const struct drm_display_mode *mode); > + const struct drm_display_mode *mode, > + const struct drm_connector_state *conn_state); > const struct drm_display_mode * > intel_panel_downclock_mode(struct intel_connector *connector, > const struct drm_display_mode *adjusted_mode); > @@ -47,7 +48,8 @@ enum drm_mode_status > intel_panel_mode_valid(struct intel_connector *connector, > const struct drm_display_mode *mode); > int intel_panel_compute_config(struct intel_connector *connector, > - struct drm_display_mode *adjusted_mode); > + struct drm_display_mode *adjusted_mode, > + const struct drm_connector_state *conn_state); > void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, > bool use_alt_fixed_modes); > void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector *connector); > diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c > index 2e1af9e869de..e07c1070a3ec 100644 > --- a/drivers/gpu/drm/i915/display/intel_sdvo.c > +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c > @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, > > if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); > > if (fixed_mode->hdisplay != args.width || > fixed_mode->vdisplay != args.height) > @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder, > pipe_config->sdvo_tv_clock = true; > } else if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); > int ret; > > ret = intel_panel_compute_config(&intel_sdvo_connector->base, > - adjusted_mode); > + adjusted_mode, conn_state); > if (ret) > return ret; > > @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state, > /* lvds has a special fixed output timing. */ > if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); > > intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); > } else { > diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c > index 76e8cd0f65a4..bfe465443d20 100644 > --- a/drivers/gpu/drm/i915/display/vlv_dsi.c > +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c > @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, > pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > > - ret = intel_panel_compute_config(intel_connector, adjusted_mode); > + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); > if (ret) > return ret; -- Jani Nikula, Intel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-28 9:39 ` Jani Nikula @ 2026-04-29 13:28 ` Nautiyal, Ankit K 0 siblings, 0 replies; 14+ messages in thread From: Nautiyal, Ankit K @ 2026-04-29 13:28 UTC (permalink / raw) To: Jani Nikula, intel-gfx, intel-xe; +Cc: ville.syrjala On 4/28/2026 3:09 PM, Jani Nikula wrote: > On Tue, 28 Apr 2026, Ankit Nautiyal <ankit.k.nautiyal@intel.com> wrote: >> intel_panel_fixed_mode() intends to choose a fixed mode at or above the >> requested refresh rate for VRR panels, so the requested refresh can be >> reached by extending vblank. >> >> This is called in compute config to find the 'best' fixed mode for a >> requested mode and also called during mode valid phase to prune the >> unsupported fixed modes. >> >> For Non-VRR panels there is no issue: >> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET >> flag) with a custom mode, the intel_panel_fixed_mode() gives the mode >> with refresh rate nearest to the requested mode. >> - Seamless switch to a lower mode is only possible if the platform has >> support for Double buffered MN and the sink is Seamless-DRRS capable. >> In this case the user sets a lower refresh rate mode and doesn't set >> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns >> again the fixed mode whose refresh rate is nearest to the requested >> mode. >> - Since Duble buffered MN is not supported on LNL+, the seamless switch >> is not possible for such panels from LNL+. >> >> For VRR panels the current logic has some issues: >> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed mode >> at or above the requested refresh rate so the requested refresh can be >> reached by extending vblank. >> - However, as per the current logic the helper can return a lower refresh >> rate mode, if the lower refresh rate mode is first in the list of fixed >> mode. Later, if the selected fixed mode's refresh rate < the requested >> mode's refresh rate, then the requested rate is matched by extending >> the vblank. >> - In case of a full modeset request with a custom mode this is not a >> problem. But for the seamless switch features like LRR (Lower Refresh >> Rate) and the Seamless-DRRS this creates a problem as this results in >> change in vsync_start/end and resulting in a full modeset. >> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not >> supported on LNL+, but for VRR panels, the vblank can be extended >> similar to LRR case. But due to the above mentioned problem in the >> intel_panel_fixed_mode() this also results in full modeset. >> >> To solve these problems for the VRR panels, identify if the user wants a >> full modeset or expects seamless switch. If seamless switch to a lower >> mode is desired, make intel_panel_fixed_mode() return the highest >> refresh rate mode, provided the requested rate is in vrr range. This >> will then be modified to extend the vblank to provide the desired >> refresh rate. >> >> This is particularly needed for DRRS panels on platforms without the >> double buffered M/N support (display version 20+), where seamless clock >> changes are not possible. >> >> To understand the user requirement for full modeset/seamless switch, the >> intel_panel_fixed_mode() and intel_panel_compute_config() need access to >> the connector state to check the allow_modeset flag. >> >> Add a nullable conn_state parameter to both. The mode_valid callers pass >> NULL since they have no atomic state and the compute_config callers pass >> their conn_state. >> >> Also remove the VRR check from is_best_fixed_mode() since the selection is >> handled upfront in intel_panel_fixed_mode(). >> >> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> >> --- >> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- >> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- >> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- >> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- >> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- >> drivers/gpu/drm/i915/display/intel_panel.c | 35 +++++++++++----------- >> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- >> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- >> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- >> 9 files changed, 37 insertions(+), 34 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c >> index afbaa0465842..1efe81404d01 100644 >> --- a/drivers/gpu/drm/i915/display/icl_dsi.c >> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c >> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, >> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >> >> - ret = intel_panel_compute_config(intel_connector, adjusted_mode); >> + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); > Whenever I see the parameters changed for a "compute config" call in the > compute config path, my immediate reaction is that it should be changed > to take the same parameters as the encoder->compute_config hook, and be > done with it for good. > > Maybe the first parameter should be connector instead of encoder here, > but otherwise would make sense. Thanks Jan, this makes sense. I am working on this as suggested. I have changed intel_panel_compute_config to take crtc_state and conn_state so its arguments align with encoder compute_config shape as much as possible, while still taking intel_connector as first arg. I am also adding conn_state in the same patch to avoid another signature modifications in follow-up patches where allow_modeset handling is needed. > > Also, I forget why we have ->attached_connector in a number of > intel_encoder "subclasses" but not in intel_encoder itself. Would make > this easier, perhaps. And could conform to the exact same params. > >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c >> index 35b8fb5740aa..f014ce28e69f 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dp.c >> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, >> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) >> return MODE_H_ILLEGAL; >> >> - fixed_mode = intel_panel_fixed_mode(connector, mode); >> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); >> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >> status = intel_panel_mode_valid(connector, mode); >> if (status != MODE_OK) >> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, >> struct intel_connector *connector = intel_dp->attached_connector; >> int ret = 0, link_bpp_x16; >> >> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); >> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> } >> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c >> index 9005c1f5d857..a480bb79dca7 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dsi.c >> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c >> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector, >> struct intel_display *display = to_intel_display(connector->dev); >> struct intel_connector *intel_connector = to_intel_connector(connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(intel_connector, mode); >> + intel_panel_fixed_mode(intel_connector, mode, NULL); >> int max_dotclk = display->cdclk.max_dotclk_freq; >> enum drm_mode_status status; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c >> index 405b33aca9dd..0ec25d895777 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dvo.c >> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c >> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector *_connector, >> struct intel_connector *connector = to_intel_connector(_connector); >> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> int max_dotclk = display->cdclk.max_dotclk_freq; >> int target_clock = mode->clock; >> enum drm_mode_status status; >> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, >> struct intel_connector *connector = to_intel_connector(conn_state->connector); >> struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); >> + intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode, conn_state); >> >> /* >> * If we have timings from the BIOS for the panel, put them in >> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, >> if (fixed_mode) { >> int ret; >> >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> } >> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c >> index cc6d4bfcff10..2e30bc3f1e62 100644 >> --- a/drivers/gpu/drm/i915/display/intel_lvds.c >> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c >> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector *_connector, >> struct intel_display *display = to_intel_display(_connector->dev); >> struct intel_connector *connector = to_intel_connector(_connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> int max_pixclk = display->cdclk.max_dotclk_freq; >> enum drm_mode_status status; >> >> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, >> * with the panel scaling set up to source from the H/VDisplay >> * of the original mode. >> */ >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c >> index 5e918ee0c8ea..65d017371d78 100644 >> --- a/drivers/gpu/drm/i915/display/intel_panel.c >> +++ b/drivers/gpu/drm/i915/display/intel_panel.c >> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct intel_connector *connector) >> struct drm_display_mode, head); >> } >> >> -static bool is_best_fixed_mode(struct intel_connector *connector, >> - int vrefresh, int fixed_mode_vrefresh, >> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, >> const struct drm_display_mode *best_mode) >> { >> /* we want to always return something */ >> if (!best_mode) >> return true; >> >> - /* >> - * With VRR always pick a mode with equal/higher than requested >> - * vrefresh, which we can then reduce to match the requested >> - * vrefresh by extending the vblank length. >> - */ >> - if (intel_vrr_is_in_range(connector, vrefresh) && >> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && >> - fixed_mode_vrefresh < vrefresh) >> - return false; >> - >> /* pick the fixed_mode that is closest in terms of vrefresh */ >> return abs(fixed_mode_vrefresh - vrefresh) < >> abs(drm_mode_vrefresh(best_mode) - vrefresh); >> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct intel_connector *connector, >> >> const struct drm_display_mode * >> intel_panel_fixed_mode(struct intel_connector *connector, >> - const struct drm_display_mode *mode) >> + const struct drm_display_mode *mode, >> + const struct drm_connector_state *conn_state) >> { >> const struct drm_display_mode *fixed_mode, *best_mode = NULL; >> int vrefresh = drm_mode_vrefresh(mode); >> >> + /* >> + * With VRR always pick the highest refresh rate mode, >> + * which we can then reduce to match the requested >> + * vrefresh by extending the vblank length. >> + */ >> + if (conn_state && !conn_state->state->allow_modeset && >> + intel_vrr_is_capable(connector) && >> + intel_vrr_is_in_range(connector, vrefresh)) >> + return intel_panel_highest_vrefresh_mode(connector); > I do dislike making intel_panel_fixed_mode() this convoluted. > > I'm thinking perhaps we should try to refactor this so that we reduce > intel_panel_fixed_mode() calls in encoder code. > > Instead, handle more in intel_panel_mode_valid() and > intel_panel_compute_config(). It's much more clear to have the above > conditions in intel_panel_compute_config(), and have that choose the > function to call instead. > > Besides, we have a lot of code calling intel_panel_fixed_mode() and then > intel_panel_mode_valid() or intel_panel_compute_config(), which both > call intel_panel_fixed_mode() as the first thing. That's just silly. I want to remove direct intel_panel_fixed_mode() calls from encoder mode_valid() paths. The problem is that after intel_panel_mode_valid(), many callers still need fixed_mode->clock for max_dotclk checks. (sdvo seems to be missing this check today as well; perhaps will add that check first). I tried a few options: - Put max_dotclk check inside intel_panel_mode_valid() and return MODE_CLOCK_HIGH there. This works, but changes the semantics of intel_panel_mode_valid() where we are only doing panel-mode matching. - Extend intel_panel_mode_valid() with an out param for effective target_clock. Callers can then do max_dotclk checks without a second intel_panel_fixed_mode() call. This feels cleaner semantically, but the API gets an extra out param. - Add a helper for fixed_mode clock. But that still does another intel_panel_fixed_mode() call, so it does not really solve the duplication. :| I keep going in circles and end up erasing everything. (-_-) Do you have a preferred direction? Regards, Ankit > > > BR, > Jani. > >> + >> list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { >> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); >> >> - if (is_best_fixed_mode(connector, vrefresh, >> + if (is_best_fixed_mode(vrefresh, >> fixed_mode_vrefresh, best_mode)) >> best_mode = fixed_mode; >> } >> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector) >> } >> >> int intel_panel_compute_config(struct intel_connector *connector, >> - struct drm_display_mode *adjusted_mode) >> + struct drm_display_mode *adjusted_mode, >> + const struct drm_connector_state *conn_state) >> { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, adjusted_mode); >> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >> int vrefresh, fixed_mode_vrefresh; >> bool is_vrr; >> >> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector *connector, >> const struct drm_display_mode *mode) >> { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> >> if (!fixed_mode) >> return MODE_OK; >> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h >> index 2f7a317995ea..c1189a20c8b2 100644 >> --- a/drivers/gpu/drm/i915/display/intel_panel.h >> +++ b/drivers/gpu/drm/i915/display/intel_panel.h >> @@ -32,7 +32,8 @@ const struct drm_display_mode * >> intel_panel_preferred_fixed_mode(struct intel_connector *connector); >> const struct drm_display_mode * >> intel_panel_fixed_mode(struct intel_connector *connector, >> - const struct drm_display_mode *mode); >> + const struct drm_display_mode *mode, >> + const struct drm_connector_state *conn_state); >> const struct drm_display_mode * >> intel_panel_downclock_mode(struct intel_connector *connector, >> const struct drm_display_mode *adjusted_mode); >> @@ -47,7 +48,8 @@ enum drm_mode_status >> intel_panel_mode_valid(struct intel_connector *connector, >> const struct drm_display_mode *mode); >> int intel_panel_compute_config(struct intel_connector *connector, >> - struct drm_display_mode *adjusted_mode); >> + struct drm_display_mode *adjusted_mode, >> + const struct drm_connector_state *conn_state); >> void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, >> bool use_alt_fixed_modes); >> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector *connector); >> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c >> index 2e1af9e869de..e07c1070a3ec 100644 >> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c >> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c >> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, >> >> if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); >> >> if (fixed_mode->hdisplay != args.width || >> fixed_mode->vdisplay != args.height) >> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder, >> pipe_config->sdvo_tv_clock = true; >> } else if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); >> int ret; >> >> ret = intel_panel_compute_config(&intel_sdvo_connector->base, >> - adjusted_mode); >> + adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state, >> /* lvds has a special fixed output timing. */ >> if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); >> >> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); >> } else { >> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c >> index 76e8cd0f65a4..bfe465443d20 100644 >> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c >> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c >> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, >> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >> >> - ret = intel_panel_compute_config(intel_connector, adjusted_mode); >> + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); >> if (ret) >> return ret; ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-28 8:33 ` [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes Ankit Nautiyal 2026-04-28 9:39 ` Jani Nikula @ 2026-04-29 12:14 ` Ville Syrjälä 2026-04-29 17:00 ` Nautiyal, Ankit K 1 sibling, 1 reply; 14+ messages in thread From: Ville Syrjälä @ 2026-04-29 12:14 UTC (permalink / raw) To: Ankit Nautiyal; +Cc: intel-gfx, intel-xe, jani.nikula On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: > intel_panel_fixed_mode() intends to choose a fixed mode at or above the > requested refresh rate for VRR panels, so the requested refresh can be > reached by extending vblank. > > This is called in compute config to find the 'best' fixed mode for a > requested mode and also called during mode valid phase to prune the > unsupported fixed modes. > > For Non-VRR panels there is no issue: > - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET > flag) with a custom mode, the intel_panel_fixed_mode() gives the mode > with refresh rate nearest to the requested mode. > - Seamless switch to a lower mode is only possible if the platform has > support for Double buffered MN and the sink is Seamless-DRRS capable. > In this case the user sets a lower refresh rate mode and doesn't set > the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns > again the fixed mode whose refresh rate is nearest to the requested > mode. > - Since Duble buffered MN is not supported on LNL+, the seamless switch > is not possible for such panels from LNL+. > > For VRR panels the current logic has some issues: > - For VRR panels intel_panel_fixed_mode() intends to choose a fixed mode > at or above the requested refresh rate so the requested refresh can be > reached by extending vblank. > - However, as per the current logic the helper can return a lower refresh > rate mode, if the lower refresh rate mode is first in the list of fixed > mode. Later, if the selected fixed mode's refresh rate < the requested > mode's refresh rate, then the requested rate is matched by extending > the vblank. > - In case of a full modeset request with a custom mode this is not a > problem. But for the seamless switch features like LRR (Lower Refresh > Rate) and the Seamless-DRRS this creates a problem as this results in > change in vsync_start/end and resulting in a full modeset. > - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not > supported on LNL+, but for VRR panels, the vblank can be extended > similar to LRR case. But due to the above mentioned problem in the > intel_panel_fixed_mode() this also results in full modeset. > > To solve these problems for the VRR panels, identify if the user wants a > full modeset or expects seamless switch. If seamless switch to a lower > mode is desired, make intel_panel_fixed_mode() return the highest > refresh rate mode, provided the requested rate is in vrr range. This > will then be modified to extend the vblank to provide the desired > refresh rate. > > This is particularly needed for DRRS panels on platforms without the > double buffered M/N support (display version 20+), where seamless clock > changes are not possible. > > To understand the user requirement for full modeset/seamless switch, the > intel_panel_fixed_mode() and intel_panel_compute_config() need access to > the connector state to check the allow_modeset flag. > > Add a nullable conn_state parameter to both. The mode_valid callers pass > NULL since they have no atomic state and the compute_config callers pass > their conn_state. > > Also remove the VRR check from is_best_fixed_mode() since the selection is > handled upfront in intel_panel_fixed_mode(). > > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> > --- > drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- > drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- > drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- > drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- > drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- > drivers/gpu/drm/i915/display/intel_panel.c | 35 +++++++++++----------- > drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- > drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- > drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- > 9 files changed, 37 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c > index afbaa0465842..1efe81404d01 100644 > --- a/drivers/gpu/drm/i915/display/icl_dsi.c > +++ b/drivers/gpu/drm/i915/display/icl_dsi.c > @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, > pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > > - ret = intel_panel_compute_config(intel_connector, adjusted_mode); > + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > index 35b8fb5740aa..f014ce28e69f 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, > if (intel_dp_hdisplay_bad(display, mode->hdisplay)) > return MODE_H_ILLEGAL; > > - fixed_mode = intel_panel_fixed_mode(connector, mode); > + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); > if (intel_dp_is_edp(intel_dp) && fixed_mode) { > status = intel_panel_mode_valid(connector, mode); > if (status != MODE_OK) > @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, > struct intel_connector *connector = intel_dp->attached_connector; > int ret = 0, link_bpp_x16; > > - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); > + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, conn_state); > if (intel_dp_is_edp(intel_dp) && fixed_mode) { > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > } > diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c > index 9005c1f5d857..a480bb79dca7 100644 > --- a/drivers/gpu/drm/i915/display/intel_dsi.c > +++ b/drivers/gpu/drm/i915/display/intel_dsi.c > @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector, > struct intel_display *display = to_intel_display(connector->dev); > struct intel_connector *intel_connector = to_intel_connector(connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(intel_connector, mode); > + intel_panel_fixed_mode(intel_connector, mode, NULL); > int max_dotclk = display->cdclk.max_dotclk_freq; > enum drm_mode_status status; > > diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c > index 405b33aca9dd..0ec25d895777 100644 > --- a/drivers/gpu/drm/i915/display/intel_dvo.c > +++ b/drivers/gpu/drm/i915/display/intel_dvo.c > @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector *_connector, > struct intel_connector *connector = to_intel_connector(_connector); > struct intel_dvo *intel_dvo = intel_attached_dvo(connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > int max_dotclk = display->cdclk.max_dotclk_freq; > int target_clock = mode->clock; > enum drm_mode_status status; > @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, > struct intel_connector *connector = to_intel_connector(conn_state->connector); > struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); > + intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode, conn_state); > > /* > * If we have timings from the BIOS for the panel, put them in > @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, > if (fixed_mode) { > int ret; > > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > } > diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c > index cc6d4bfcff10..2e30bc3f1e62 100644 > --- a/drivers/gpu/drm/i915/display/intel_lvds.c > +++ b/drivers/gpu/drm/i915/display/intel_lvds.c > @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector *_connector, > struct intel_display *display = to_intel_display(_connector->dev); > struct intel_connector *connector = to_intel_connector(_connector); > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > int max_pixclk = display->cdclk.max_dotclk_freq; > enum drm_mode_status status; > > @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, > * with the panel scaling set up to source from the H/VDisplay > * of the original mode. > */ > - ret = intel_panel_compute_config(connector, adjusted_mode); > + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c > index 5e918ee0c8ea..65d017371d78 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.c > +++ b/drivers/gpu/drm/i915/display/intel_panel.c > @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct intel_connector *connector) > struct drm_display_mode, head); > } > > -static bool is_best_fixed_mode(struct intel_connector *connector, > - int vrefresh, int fixed_mode_vrefresh, > +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, > const struct drm_display_mode *best_mode) > { > /* we want to always return something */ > if (!best_mode) > return true; > > - /* > - * With VRR always pick a mode with equal/higher than requested > - * vrefresh, which we can then reduce to match the requested > - * vrefresh by extending the vblank length. > - */ > - if (intel_vrr_is_in_range(connector, vrefresh) && > - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && > - fixed_mode_vrefresh < vrefresh) > - return false; > - > /* pick the fixed_mode that is closest in terms of vrefresh */ > return abs(fixed_mode_vrefresh - vrefresh) < > abs(drm_mode_vrefresh(best_mode) - vrefresh); > @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct intel_connector *connector, > > const struct drm_display_mode * > intel_panel_fixed_mode(struct intel_connector *connector, > - const struct drm_display_mode *mode) > + const struct drm_display_mode *mode, > + const struct drm_connector_state *conn_state) > { > const struct drm_display_mode *fixed_mode, *best_mode = NULL; > int vrefresh = drm_mode_vrefresh(mode); > > + /* > + * With VRR always pick the highest refresh rate mode, > + * which we can then reduce to match the requested > + * vrefresh by extending the vblank length. > + */ > + if (conn_state && !conn_state->state->allow_modeset && The foo_state->state pointer should never be used. If you need the full atomic state then plumb it through from the top. > + intel_vrr_is_capable(connector) && > + intel_vrr_is_in_range(connector, vrefresh)) > + return intel_panel_highest_vrefresh_mode(connector); What we want is the fixed mode that matches the current adjusted mode exactly except for vtotal, and I think we also want to maintain the vsync pulse location relative to vtotal. We should in fact fix the vsync_start/end mess first. We need to add TRANS_VSYNC handling to the LRR codepaths and allow that to change during fastsets. And intel_panel_compute_config() needs to preserve the vtotal-vsync distance when adjusting vtotal. I think that should all be fine for DP since it doesn't really use TRANS_VSYNC for anything. > + > list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { > int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); > > - if (is_best_fixed_mode(connector, vrefresh, > + if (is_best_fixed_mode(vrefresh, > fixed_mode_vrefresh, best_mode)) > best_mode = fixed_mode; > } > @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector) > } > > int intel_panel_compute_config(struct intel_connector *connector, > - struct drm_display_mode *adjusted_mode) > + struct drm_display_mode *adjusted_mode, > + const struct drm_connector_state *conn_state) > { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, adjusted_mode); > + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); > int vrefresh, fixed_mode_vrefresh; > bool is_vrr; > > @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector *connector, > const struct drm_display_mode *mode) > { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(connector, mode); > + intel_panel_fixed_mode(connector, mode, NULL); > > if (!fixed_mode) > return MODE_OK; > diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h > index 2f7a317995ea..c1189a20c8b2 100644 > --- a/drivers/gpu/drm/i915/display/intel_panel.h > +++ b/drivers/gpu/drm/i915/display/intel_panel.h > @@ -32,7 +32,8 @@ const struct drm_display_mode * > intel_panel_preferred_fixed_mode(struct intel_connector *connector); > const struct drm_display_mode * > intel_panel_fixed_mode(struct intel_connector *connector, > - const struct drm_display_mode *mode); > + const struct drm_display_mode *mode, > + const struct drm_connector_state *conn_state); > const struct drm_display_mode * > intel_panel_downclock_mode(struct intel_connector *connector, > const struct drm_display_mode *adjusted_mode); > @@ -47,7 +48,8 @@ enum drm_mode_status > intel_panel_mode_valid(struct intel_connector *connector, > const struct drm_display_mode *mode); > int intel_panel_compute_config(struct intel_connector *connector, > - struct drm_display_mode *adjusted_mode); > + struct drm_display_mode *adjusted_mode, > + const struct drm_connector_state *conn_state); > void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, > bool use_alt_fixed_modes); > void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector *connector); > diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c > index 2e1af9e869de..e07c1070a3ec 100644 > --- a/drivers/gpu/drm/i915/display/intel_sdvo.c > +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c > @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, > > if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); > > if (fixed_mode->hdisplay != args.width || > fixed_mode->vdisplay != args.height) > @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder, > pipe_config->sdvo_tv_clock = true; > } else if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); > int ret; > > ret = intel_panel_compute_config(&intel_sdvo_connector->base, > - adjusted_mode); > + adjusted_mode, conn_state); > if (ret) > return ret; > > @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state, > /* lvds has a special fixed output timing. */ > if (IS_LVDS(intel_sdvo_connector)) { > const struct drm_display_mode *fixed_mode = > - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); > > intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); > } else { > diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c > index 76e8cd0f65a4..bfe465443d20 100644 > --- a/drivers/gpu/drm/i915/display/vlv_dsi.c > +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c > @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, > pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > > - ret = intel_panel_compute_config(intel_connector, adjusted_mode); > + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); > if (ret) > return ret; > > -- > 2.45.2 -- Ville Syrjälä Intel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-29 12:14 ` Ville Syrjälä @ 2026-04-29 17:00 ` Nautiyal, Ankit K 2026-04-29 17:09 ` Nautiyal, Ankit K 2026-05-04 13:17 ` Nautiyal, Ankit K 0 siblings, 2 replies; 14+ messages in thread From: Nautiyal, Ankit K @ 2026-04-29 17:00 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, intel-xe, jani.nikula On 4/29/2026 5:44 PM, Ville Syrjälä wrote: > On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: >> intel_panel_fixed_mode() intends to choose a fixed mode at or above the >> requested refresh rate for VRR panels, so the requested refresh can be >> reached by extending vblank. >> >> This is called in compute config to find the 'best' fixed mode for a >> requested mode and also called during mode valid phase to prune the >> unsupported fixed modes. >> >> For Non-VRR panels there is no issue: >> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET >> flag) with a custom mode, the intel_panel_fixed_mode() gives the mode >> with refresh rate nearest to the requested mode. >> - Seamless switch to a lower mode is only possible if the platform has >> support for Double buffered MN and the sink is Seamless-DRRS capable. >> In this case the user sets a lower refresh rate mode and doesn't set >> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns >> again the fixed mode whose refresh rate is nearest to the requested >> mode. >> - Since Duble buffered MN is not supported on LNL+, the seamless switch >> is not possible for such panels from LNL+. >> >> For VRR panels the current logic has some issues: >> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed mode >> at or above the requested refresh rate so the requested refresh can be >> reached by extending vblank. >> - However, as per the current logic the helper can return a lower refresh >> rate mode, if the lower refresh rate mode is first in the list of fixed >> mode. Later, if the selected fixed mode's refresh rate < the requested >> mode's refresh rate, then the requested rate is matched by extending >> the vblank. >> - In case of a full modeset request with a custom mode this is not a >> problem. But for the seamless switch features like LRR (Lower Refresh >> Rate) and the Seamless-DRRS this creates a problem as this results in >> change in vsync_start/end and resulting in a full modeset. >> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not >> supported on LNL+, but for VRR panels, the vblank can be extended >> similar to LRR case. But due to the above mentioned problem in the >> intel_panel_fixed_mode() this also results in full modeset. >> >> To solve these problems for the VRR panels, identify if the user wants a >> full modeset or expects seamless switch. If seamless switch to a lower >> mode is desired, make intel_panel_fixed_mode() return the highest >> refresh rate mode, provided the requested rate is in vrr range. This >> will then be modified to extend the vblank to provide the desired >> refresh rate. >> >> This is particularly needed for DRRS panels on platforms without the >> double buffered M/N support (display version 20+), where seamless clock >> changes are not possible. >> >> To understand the user requirement for full modeset/seamless switch, the >> intel_panel_fixed_mode() and intel_panel_compute_config() need access to >> the connector state to check the allow_modeset flag. >> >> Add a nullable conn_state parameter to both. The mode_valid callers pass >> NULL since they have no atomic state and the compute_config callers pass >> their conn_state. >> >> Also remove the VRR check from is_best_fixed_mode() since the selection is >> handled upfront in intel_panel_fixed_mode(). >> >> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> >> --- >> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- >> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- >> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- >> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- >> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- >> drivers/gpu/drm/i915/display/intel_panel.c | 35 +++++++++++----------- >> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- >> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- >> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- >> 9 files changed, 37 insertions(+), 34 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c >> index afbaa0465842..1efe81404d01 100644 >> --- a/drivers/gpu/drm/i915/display/icl_dsi.c >> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c >> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, >> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >> >> - ret = intel_panel_compute_config(intel_connector, adjusted_mode); >> + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c >> index 35b8fb5740aa..f014ce28e69f 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dp.c >> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, >> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) >> return MODE_H_ILLEGAL; >> >> - fixed_mode = intel_panel_fixed_mode(connector, mode); >> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); >> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >> status = intel_panel_mode_valid(connector, mode); >> if (status != MODE_OK) >> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder *encoder, >> struct intel_connector *connector = intel_dp->attached_connector; >> int ret = 0, link_bpp_x16; >> >> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); >> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> } >> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c b/drivers/gpu/drm/i915/display/intel_dsi.c >> index 9005c1f5d857..a480bb79dca7 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dsi.c >> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c >> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector, >> struct intel_display *display = to_intel_display(connector->dev); >> struct intel_connector *intel_connector = to_intel_connector(connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(intel_connector, mode); >> + intel_panel_fixed_mode(intel_connector, mode, NULL); >> int max_dotclk = display->cdclk.max_dotclk_freq; >> enum drm_mode_status status; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c >> index 405b33aca9dd..0ec25d895777 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dvo.c >> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c >> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector *_connector, >> struct intel_connector *connector = to_intel_connector(_connector); >> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> int max_dotclk = display->cdclk.max_dotclk_freq; >> int target_clock = mode->clock; >> enum drm_mode_status status; >> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, >> struct intel_connector *connector = to_intel_connector(conn_state->connector); >> struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); >> + intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode, conn_state); >> >> /* >> * If we have timings from the BIOS for the panel, put them in >> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder, >> if (fixed_mode) { >> int ret; >> >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> } >> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c >> index cc6d4bfcff10..2e30bc3f1e62 100644 >> --- a/drivers/gpu/drm/i915/display/intel_lvds.c >> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c >> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector *_connector, >> struct intel_display *display = to_intel_display(_connector->dev); >> struct intel_connector *connector = to_intel_connector(_connector); >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> int max_pixclk = display->cdclk.max_dotclk_freq; >> enum drm_mode_status status; >> >> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, >> * with the panel scaling set up to source from the H/VDisplay >> * of the original mode. >> */ >> - ret = intel_panel_compute_config(connector, adjusted_mode); >> + ret = intel_panel_compute_config(connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c >> index 5e918ee0c8ea..65d017371d78 100644 >> --- a/drivers/gpu/drm/i915/display/intel_panel.c >> +++ b/drivers/gpu/drm/i915/display/intel_panel.c >> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct intel_connector *connector) >> struct drm_display_mode, head); >> } >> >> -static bool is_best_fixed_mode(struct intel_connector *connector, >> - int vrefresh, int fixed_mode_vrefresh, >> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, >> const struct drm_display_mode *best_mode) >> { >> /* we want to always return something */ >> if (!best_mode) >> return true; >> >> - /* >> - * With VRR always pick a mode with equal/higher than requested >> - * vrefresh, which we can then reduce to match the requested >> - * vrefresh by extending the vblank length. >> - */ >> - if (intel_vrr_is_in_range(connector, vrefresh) && >> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && >> - fixed_mode_vrefresh < vrefresh) >> - return false; >> - >> /* pick the fixed_mode that is closest in terms of vrefresh */ >> return abs(fixed_mode_vrefresh - vrefresh) < >> abs(drm_mode_vrefresh(best_mode) - vrefresh); >> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct intel_connector *connector, >> >> const struct drm_display_mode * >> intel_panel_fixed_mode(struct intel_connector *connector, >> - const struct drm_display_mode *mode) >> + const struct drm_display_mode *mode, >> + const struct drm_connector_state *conn_state) >> { >> const struct drm_display_mode *fixed_mode, *best_mode = NULL; >> int vrefresh = drm_mode_vrefresh(mode); >> >> + /* >> + * With VRR always pick the highest refresh rate mode, >> + * which we can then reduce to match the requested >> + * vrefresh by extending the vblank length. >> + */ >> + if (conn_state && !conn_state->state->allow_modeset && > The foo_state->state pointer should never be used. If you need the full > atomic state then plumb it through from the top. Hmm noted. > >> + intel_vrr_is_capable(connector) && >> + intel_vrr_is_in_range(connector, vrefresh)) >> + return intel_panel_highest_vrefresh_mode(connector); > What we want is the fixed mode that matches the current adjusted mode > exactly except for vtotal, and I think we also want to maintain the > vsync pulse location relative to vtotal. Oh alright. I was thinking the issue is in the best mode logic which is resulting in lower mode getting picked when we wanted a higher mode as best fixed mode. I was under the impression that since the vsync start/end of lower is not the same with the higher mode and since this cannot be modified on the fly, it results in full modeset. However, as you said, vsync start/end can be modified indeed the problem becomes: - we are not scaling the vsync start/end similar to what we are doing for vtotal. - even if we do that, we need to remove the check for vsync start/end for fastboot. Another consideration is that is the vsync_start should be inside the vrr guardband, but I think if the vsync_start scales up then it will still be inside the guardband so we should be covered. > > We should in fact fix the vsync_start/end mess first. You mean the existing vsync_start/end change due to AS SDP thing? Or you mean the above mentioned scaling up? > We need to add > TRANS_VSYNC handling to the LRR codepaths and allow that to change > during fastsets. And intel_panel_compute_config() needs to preserve > the vtotal-vsync distance when adjusting vtotal. I think that should > all be fine for DP since it doesn't really use TRANS_VSYNC for > anything. Hmm I think I got some direction here. Thanks for making it clearer. Regards, Ankit > > + >> list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) { >> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); >> >> - if (is_best_fixed_mode(connector, vrefresh, >> + if (is_best_fixed_mode(vrefresh, >> fixed_mode_vrefresh, best_mode)) >> best_mode = fixed_mode; >> } >> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector) >> } >> >> int intel_panel_compute_config(struct intel_connector *connector, >> - struct drm_display_mode *adjusted_mode) >> + struct drm_display_mode *adjusted_mode, >> + const struct drm_connector_state *conn_state) >> { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, adjusted_mode); >> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >> int vrefresh, fixed_mode_vrefresh; >> bool is_vrr; >> >> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector *connector, >> const struct drm_display_mode *mode) >> { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(connector, mode); >> + intel_panel_fixed_mode(connector, mode, NULL); >> >> if (!fixed_mode) >> return MODE_OK; >> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h >> index 2f7a317995ea..c1189a20c8b2 100644 >> --- a/drivers/gpu/drm/i915/display/intel_panel.h >> +++ b/drivers/gpu/drm/i915/display/intel_panel.h >> @@ -32,7 +32,8 @@ const struct drm_display_mode * >> intel_panel_preferred_fixed_mode(struct intel_connector *connector); >> const struct drm_display_mode * >> intel_panel_fixed_mode(struct intel_connector *connector, >> - const struct drm_display_mode *mode); >> + const struct drm_display_mode *mode, >> + const struct drm_connector_state *conn_state); >> const struct drm_display_mode * >> intel_panel_downclock_mode(struct intel_connector *connector, >> const struct drm_display_mode *adjusted_mode); >> @@ -47,7 +48,8 @@ enum drm_mode_status >> intel_panel_mode_valid(struct intel_connector *connector, >> const struct drm_display_mode *mode); >> int intel_panel_compute_config(struct intel_connector *connector, >> - struct drm_display_mode *adjusted_mode); >> + struct drm_display_mode *adjusted_mode, >> + const struct drm_connector_state *conn_state); >> void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, >> bool use_alt_fixed_modes); >> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector *connector); >> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c >> index 2e1af9e869de..e07c1070a3ec 100644 >> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c >> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c >> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, >> >> if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); >> >> if (fixed_mode->hdisplay != args.width || >> fixed_mode->vdisplay != args.height) >> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder, >> pipe_config->sdvo_tv_clock = true; >> } else if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); >> int ret; >> >> ret = intel_panel_compute_config(&intel_sdvo_connector->base, >> - adjusted_mode); >> + adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct intel_atomic_state *state, >> /* lvds has a special fixed output timing. */ >> if (IS_LVDS(intel_sdvo_connector)) { >> const struct drm_display_mode *fixed_mode = >> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, conn_state); >> >> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); >> } else { >> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c >> index 76e8cd0f65a4..bfe465443d20 100644 >> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c >> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c >> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, >> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >> >> - ret = intel_panel_compute_config(intel_connector, adjusted_mode); >> + ret = intel_panel_compute_config(intel_connector, adjusted_mode, conn_state); >> if (ret) >> return ret; >> >> -- >> 2.45.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-29 17:00 ` Nautiyal, Ankit K @ 2026-04-29 17:09 ` Nautiyal, Ankit K 2026-05-04 13:17 ` Nautiyal, Ankit K 1 sibling, 0 replies; 14+ messages in thread From: Nautiyal, Ankit K @ 2026-04-29 17:09 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, intel-xe, jani.nikula On 4/29/2026 10:30 PM, Nautiyal, Ankit K wrote: > > On 4/29/2026 5:44 PM, Ville Syrjälä wrote: >> On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: >>> intel_panel_fixed_mode() intends to choose a fixed mode at or above the >>> requested refresh rate for VRR panels, so the requested refresh can be >>> reached by extending vblank. >>> >>> This is called in compute config to find the 'best' fixed mode for a >>> requested mode and also called during mode valid phase to prune the >>> unsupported fixed modes. >>> >>> For Non-VRR panels there is no issue: >>> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET >>> flag) with a custom mode, the intel_panel_fixed_mode() gives the >>> mode >>> with refresh rate nearest to the requested mode. >>> - Seamless switch to a lower mode is only possible if the platform has >>> support for Double buffered MN and the sink is Seamless-DRRS >>> capable. >>> In this case the user sets a lower refresh rate mode and doesn't set >>> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns >>> again the fixed mode whose refresh rate is nearest to the requested >>> mode. >>> - Since Duble buffered MN is not supported on LNL+, the seamless switch >>> is not possible for such panels from LNL+. >>> >>> For VRR panels the current logic has some issues: >>> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed >>> mode >>> at or above the requested refresh rate so the requested refresh >>> can be >>> reached by extending vblank. >>> - However, as per the current logic the helper can return a lower >>> refresh >>> rate mode, if the lower refresh rate mode is first in the list of >>> fixed >>> mode. Later, if the selected fixed mode's refresh rate < the >>> requested >>> mode's refresh rate, then the requested rate is matched by extending >>> the vblank. >>> - In case of a full modeset request with a custom mode this is not a >>> problem. But for the seamless switch features like LRR (Lower >>> Refresh >>> Rate) and the Seamless-DRRS this creates a problem as this >>> results in >>> change in vsync_start/end and resulting in a full modeset. >>> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not >>> supported on LNL+, but for VRR panels, the vblank can be extended >>> similar to LRR case. But due to the above mentioned problem in the >>> intel_panel_fixed_mode() this also results in full modeset. >>> >>> To solve these problems for the VRR panels, identify if the user >>> wants a >>> full modeset or expects seamless switch. If seamless switch to a lower >>> mode is desired, make intel_panel_fixed_mode() return the highest >>> refresh rate mode, provided the requested rate is in vrr range. This >>> will then be modified to extend the vblank to provide the desired >>> refresh rate. >>> >>> This is particularly needed for DRRS panels on platforms without the >>> double buffered M/N support (display version 20+), where seamless clock >>> changes are not possible. >>> >>> To understand the user requirement for full modeset/seamless switch, >>> the >>> intel_panel_fixed_mode() and intel_panel_compute_config() need >>> access to >>> the connector state to check the allow_modeset flag. >>> >>> Add a nullable conn_state parameter to both. The mode_valid callers >>> pass >>> NULL since they have no atomic state and the compute_config callers >>> pass >>> their conn_state. >>> >>> Also remove the VRR check from is_best_fixed_mode() since the >>> selection is >>> handled upfront in intel_panel_fixed_mode(). >>> >>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> >>> --- >>> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- >>> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- >>> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- >>> drivers/gpu/drm/i915/display/intel_panel.c | 35 >>> +++++++++++----------- >>> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- >>> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- >>> 9 files changed, 37 insertions(+), 34 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c >>> b/drivers/gpu/drm/i915/display/icl_dsi.c >>> index afbaa0465842..1efe81404d01 100644 >>> --- a/drivers/gpu/drm/i915/display/icl_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c >>> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>> - ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode); >>> + ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c >>> b/drivers/gpu/drm/i915/display/intel_dp.c >>> index 35b8fb5740aa..f014ce28e69f 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dp.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >>> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector >>> *_connector, >>> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) >>> return MODE_H_ILLEGAL; >>> - fixed_mode = intel_panel_fixed_mode(connector, mode); >>> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); >>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>> status = intel_panel_mode_valid(connector, mode); >>> if (status != MODE_OK) >>> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder >>> *encoder, >>> struct intel_connector *connector = intel_dp->attached_connector; >>> int ret = 0, link_bpp_x16; >>> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); >>> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, >>> conn_state); >>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> } >>> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c >>> b/drivers/gpu/drm/i915/display/intel_dsi.c >>> index 9005c1f5d857..a480bb79dca7 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c >>> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct >>> drm_connector *connector, >>> struct intel_display *display = to_intel_display(connector->dev); >>> struct intel_connector *intel_connector = >>> to_intel_connector(connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(intel_connector, mode); >>> + intel_panel_fixed_mode(intel_connector, mode, NULL); >>> int max_dotclk = display->cdclk.max_dotclk_freq; >>> enum drm_mode_status status; >>> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c >>> b/drivers/gpu/drm/i915/display/intel_dvo.c >>> index 405b33aca9dd..0ec25d895777 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dvo.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c >>> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector >>> *_connector, >>> struct intel_connector *connector = >>> to_intel_connector(_connector); >>> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> int max_dotclk = display->cdclk.max_dotclk_freq; >>> int target_clock = mode->clock; >>> enum drm_mode_status status; >>> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct >>> intel_encoder *encoder, >>> struct intel_connector *connector = >>> to_intel_connector(conn_state->connector); >>> struct drm_display_mode *adjusted_mode = >>> &pipe_config->hw.adjusted_mode; >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); >>> + intel_panel_fixed_mode(intel_dvo->attached_connector, >>> adjusted_mode, conn_state); >>> /* >>> * If we have timings from the BIOS for the panel, put them in >>> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct >>> intel_encoder *encoder, >>> if (fixed_mode) { >>> int ret; >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> } >>> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c >>> b/drivers/gpu/drm/i915/display/intel_lvds.c >>> index cc6d4bfcff10..2e30bc3f1e62 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_lvds.c >>> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c >>> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector >>> *_connector, >>> struct intel_display *display = >>> to_intel_display(_connector->dev); >>> struct intel_connector *connector = >>> to_intel_connector(_connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> int max_pixclk = display->cdclk.max_dotclk_freq; >>> enum drm_mode_status status; >>> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct >>> intel_encoder *encoder, >>> * with the panel scaling set up to source from the H/VDisplay >>> * of the original mode. >>> */ >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c >>> b/drivers/gpu/drm/i915/display/intel_panel.c >>> index 5e918ee0c8ea..65d017371d78 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_panel.c >>> +++ b/drivers/gpu/drm/i915/display/intel_panel.c >>> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct >>> intel_connector *connector) >>> struct drm_display_mode, head); >>> } >>> -static bool is_best_fixed_mode(struct intel_connector *connector, >>> - int vrefresh, int fixed_mode_vrefresh, >>> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, >>> const struct drm_display_mode *best_mode) >>> { >>> /* we want to always return something */ >>> if (!best_mode) >>> return true; >>> - /* >>> - * With VRR always pick a mode with equal/higher than requested >>> - * vrefresh, which we can then reduce to match the requested >>> - * vrefresh by extending the vblank length. >>> - */ >>> - if (intel_vrr_is_in_range(connector, vrefresh) && >>> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && >>> - fixed_mode_vrefresh < vrefresh) >>> - return false; >>> - >>> /* pick the fixed_mode that is closest in terms of vrefresh */ >>> return abs(fixed_mode_vrefresh - vrefresh) < >>> abs(drm_mode_vrefresh(best_mode) - vrefresh); >>> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct >>> intel_connector *connector, >>> const struct drm_display_mode * >>> intel_panel_fixed_mode(struct intel_connector *connector, >>> - const struct drm_display_mode *mode) >>> + const struct drm_display_mode *mode, >>> + const struct drm_connector_state *conn_state) >>> { >>> const struct drm_display_mode *fixed_mode, *best_mode = NULL; >>> int vrefresh = drm_mode_vrefresh(mode); >>> + /* >>> + * With VRR always pick the highest refresh rate mode, >>> + * which we can then reduce to match the requested >>> + * vrefresh by extending the vblank length. >>> + */ >>> + if (conn_state && !conn_state->state->allow_modeset && >> The foo_state->state pointer should never be used. If you need the full >> atomic state then plumb it through from the top. > > Hmm noted. > > >> >>> + intel_vrr_is_capable(connector) && >>> + intel_vrr_is_in_range(connector, vrefresh)) >>> + return intel_panel_highest_vrefresh_mode(connector); >> What we want is the fixed mode that matches the current adjusted mode >> exactly except for vtotal, and I think we also want to maintain the >> vsync pulse location relative to vtotal. > > Oh alright. I was thinking the issue is in the best mode logic which > is resulting in lower mode getting picked when we wanted a higher mode > as best fixed mode. > > I was under the impression that since the vsync start/end of lower is > not the same with the higher mode and since this cannot be modified on > the fly, it results in full modeset. > > However, as you said, vsync start/end can be modified indeed the > problem becomes: > > - we are not scaling the vsync start/end similar to what we are doing > for vtotal. > - even if we do that, we need to remove the check for vsync start/end > for fastboot. > > Another consideration is that is the vsync_start should be inside the > vrr guardband, but I think if the vsync_start scales up then it will > still be inside the guardband so we should be covered. > > >> >> We should in fact fix the vsync_start/end mess first. > > You mean the existing vsync_start/end change due to AS SDP thing? Or > you mean the above mentioned scaling up? Scratch that. For this to work, perhaps first, we need to get the AS SDP and PR fix patches in. Without those patches, the guardband changes to accommodate vsync start resulting in full modeset. > > >> We need to add >> TRANS_VSYNC handling to the LRR codepaths and allow that to change >> during fastsets. And intel_panel_compute_config() needs to preserve >> the vtotal-vsync distance when adjusting vtotal. I think that should >> all be fine for DP since it doesn't really use TRANS_VSYNC for >> anything. > > Hmm I think I got some direction here. Thanks for making it clearer. > > > Regards, > > Ankit > >> >> + >>> list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, >>> head) { >>> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); >>> - if (is_best_fixed_mode(connector, vrefresh, >>> + if (is_best_fixed_mode(vrefresh, >>> fixed_mode_vrefresh, best_mode)) >>> best_mode = fixed_mode; >>> } >>> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct >>> intel_connector *connector) >>> } >>> int intel_panel_compute_config(struct intel_connector *connector, >>> - struct drm_display_mode *adjusted_mode) >>> + struct drm_display_mode *adjusted_mode, >>> + const struct drm_connector_state *conn_state) >>> { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, adjusted_mode); >>> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >>> int vrefresh, fixed_mode_vrefresh; >>> bool is_vrr; >>> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector >>> *connector, >>> const struct drm_display_mode *mode) >>> { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> if (!fixed_mode) >>> return MODE_OK; >>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h >>> b/drivers/gpu/drm/i915/display/intel_panel.h >>> index 2f7a317995ea..c1189a20c8b2 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_panel.h >>> +++ b/drivers/gpu/drm/i915/display/intel_panel.h >>> @@ -32,7 +32,8 @@ const struct drm_display_mode * >>> intel_panel_preferred_fixed_mode(struct intel_connector *connector); >>> const struct drm_display_mode * >>> intel_panel_fixed_mode(struct intel_connector *connector, >>> - const struct drm_display_mode *mode); >>> + const struct drm_display_mode *mode, >>> + const struct drm_connector_state *conn_state); >>> const struct drm_display_mode * >>> intel_panel_downclock_mode(struct intel_connector *connector, >>> const struct drm_display_mode *adjusted_mode); >>> @@ -47,7 +48,8 @@ enum drm_mode_status >>> intel_panel_mode_valid(struct intel_connector *connector, >>> const struct drm_display_mode *mode); >>> int intel_panel_compute_config(struct intel_connector *connector, >>> - struct drm_display_mode *adjusted_mode); >>> + struct drm_display_mode *adjusted_mode, >>> + const struct drm_connector_state *conn_state); >>> void intel_panel_add_edid_fixed_modes(struct intel_connector >>> *connector, >>> bool use_alt_fixed_modes); >>> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector >>> *connector); >>> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c >>> b/drivers/gpu/drm/i915/display/intel_sdvo.c >>> index 2e1af9e869de..e07c1070a3ec 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c >>> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c >>> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct >>> intel_sdvo *intel_sdvo, >>> if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); >>> if (fixed_mode->hdisplay != args.width || >>> fixed_mode->vdisplay != args.height) >>> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sdvo_tv_clock = true; >>> } else if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>> conn_state); >>> int ret; >>> ret = >>> intel_panel_compute_config(&intel_sdvo_connector->base, >>> - adjusted_mode); >>> + adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct >>> intel_atomic_state *state, >>> /* lvds has a special fixed output timing. */ >>> if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>> conn_state); >>> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); >>> } else { >>> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c >>> b/drivers/gpu/drm/i915/display/vlv_dsi.c >>> index 76e8cd0f65a4..bfe465443d20 100644 >>> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c >>> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>> - ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode); >>> + ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> -- >>> 2.45.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-04-29 17:00 ` Nautiyal, Ankit K 2026-04-29 17:09 ` Nautiyal, Ankit K @ 2026-05-04 13:17 ` Nautiyal, Ankit K 2026-05-06 7:25 ` Nautiyal, Ankit K 1 sibling, 1 reply; 14+ messages in thread From: Nautiyal, Ankit K @ 2026-05-04 13:17 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, intel-xe, jani.nikula On 4/29/2026 10:30 PM, Nautiyal, Ankit K wrote: > > On 4/29/2026 5:44 PM, Ville Syrjälä wrote: >> On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: >>> intel_panel_fixed_mode() intends to choose a fixed mode at or above the >>> requested refresh rate for VRR panels, so the requested refresh can be >>> reached by extending vblank. >>> >>> This is called in compute config to find the 'best' fixed mode for a >>> requested mode and also called during mode valid phase to prune the >>> unsupported fixed modes. >>> >>> For Non-VRR panels there is no issue: >>> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET >>> flag) with a custom mode, the intel_panel_fixed_mode() gives the >>> mode >>> with refresh rate nearest to the requested mode. >>> - Seamless switch to a lower mode is only possible if the platform has >>> support for Double buffered MN and the sink is Seamless-DRRS >>> capable. >>> In this case the user sets a lower refresh rate mode and doesn't set >>> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() returns >>> again the fixed mode whose refresh rate is nearest to the requested >>> mode. >>> - Since Duble buffered MN is not supported on LNL+, the seamless switch >>> is not possible for such panels from LNL+. >>> >>> For VRR panels the current logic has some issues: >>> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed >>> mode >>> at or above the requested refresh rate so the requested refresh >>> can be >>> reached by extending vblank. >>> - However, as per the current logic the helper can return a lower >>> refresh >>> rate mode, if the lower refresh rate mode is first in the list of >>> fixed >>> mode. Later, if the selected fixed mode's refresh rate < the >>> requested >>> mode's refresh rate, then the requested rate is matched by extending >>> the vblank. >>> - In case of a full modeset request with a custom mode this is not a >>> problem. But for the seamless switch features like LRR (Lower >>> Refresh >>> Rate) and the Seamless-DRRS this creates a problem as this >>> results in >>> change in vsync_start/end and resulting in a full modeset. >>> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is not >>> supported on LNL+, but for VRR panels, the vblank can be extended >>> similar to LRR case. But due to the above mentioned problem in the >>> intel_panel_fixed_mode() this also results in full modeset. >>> >>> To solve these problems for the VRR panels, identify if the user >>> wants a >>> full modeset or expects seamless switch. If seamless switch to a lower >>> mode is desired, make intel_panel_fixed_mode() return the highest >>> refresh rate mode, provided the requested rate is in vrr range. This >>> will then be modified to extend the vblank to provide the desired >>> refresh rate. >>> >>> This is particularly needed for DRRS panels on platforms without the >>> double buffered M/N support (display version 20+), where seamless clock >>> changes are not possible. >>> >>> To understand the user requirement for full modeset/seamless switch, >>> the >>> intel_panel_fixed_mode() and intel_panel_compute_config() need >>> access to >>> the connector state to check the allow_modeset flag. >>> >>> Add a nullable conn_state parameter to both. The mode_valid callers >>> pass >>> NULL since they have no atomic state and the compute_config callers >>> pass >>> their conn_state. >>> >>> Also remove the VRR check from is_best_fixed_mode() since the >>> selection is >>> handled upfront in intel_panel_fixed_mode(). >>> >>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> >>> --- >>> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- >>> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- >>> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- >>> drivers/gpu/drm/i915/display/intel_panel.c | 35 >>> +++++++++++----------- >>> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- >>> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- >>> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- >>> 9 files changed, 37 insertions(+), 34 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c >>> b/drivers/gpu/drm/i915/display/icl_dsi.c >>> index afbaa0465842..1efe81404d01 100644 >>> --- a/drivers/gpu/drm/i915/display/icl_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c >>> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>> - ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode); >>> + ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c >>> b/drivers/gpu/drm/i915/display/intel_dp.c >>> index 35b8fb5740aa..f014ce28e69f 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dp.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >>> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector >>> *_connector, >>> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) >>> return MODE_H_ILLEGAL; >>> - fixed_mode = intel_panel_fixed_mode(connector, mode); >>> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); >>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>> status = intel_panel_mode_valid(connector, mode); >>> if (status != MODE_OK) >>> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder >>> *encoder, >>> struct intel_connector *connector = intel_dp->attached_connector; >>> int ret = 0, link_bpp_x16; >>> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); >>> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, >>> conn_state); >>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> } >>> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c >>> b/drivers/gpu/drm/i915/display/intel_dsi.c >>> index 9005c1f5d857..a480bb79dca7 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c >>> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct >>> drm_connector *connector, >>> struct intel_display *display = to_intel_display(connector->dev); >>> struct intel_connector *intel_connector = >>> to_intel_connector(connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(intel_connector, mode); >>> + intel_panel_fixed_mode(intel_connector, mode, NULL); >>> int max_dotclk = display->cdclk.max_dotclk_freq; >>> enum drm_mode_status status; >>> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c >>> b/drivers/gpu/drm/i915/display/intel_dvo.c >>> index 405b33aca9dd..0ec25d895777 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_dvo.c >>> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c >>> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector >>> *_connector, >>> struct intel_connector *connector = >>> to_intel_connector(_connector); >>> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> int max_dotclk = display->cdclk.max_dotclk_freq; >>> int target_clock = mode->clock; >>> enum drm_mode_status status; >>> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct >>> intel_encoder *encoder, >>> struct intel_connector *connector = >>> to_intel_connector(conn_state->connector); >>> struct drm_display_mode *adjusted_mode = >>> &pipe_config->hw.adjusted_mode; >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(intel_dvo->attached_connector, adjusted_mode); >>> + intel_panel_fixed_mode(intel_dvo->attached_connector, >>> adjusted_mode, conn_state); >>> /* >>> * If we have timings from the BIOS for the panel, put them in >>> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct >>> intel_encoder *encoder, >>> if (fixed_mode) { >>> int ret; >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> } >>> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c >>> b/drivers/gpu/drm/i915/display/intel_lvds.c >>> index cc6d4bfcff10..2e30bc3f1e62 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_lvds.c >>> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c >>> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector >>> *_connector, >>> struct intel_display *display = >>> to_intel_display(_connector->dev); >>> struct intel_connector *connector = >>> to_intel_connector(_connector); >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> int max_pixclk = display->cdclk.max_dotclk_freq; >>> enum drm_mode_status status; >>> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct >>> intel_encoder *encoder, >>> * with the panel scaling set up to source from the H/VDisplay >>> * of the original mode. >>> */ >>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>> conn_state); >>> if (ret) >>> return ret; >>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c >>> b/drivers/gpu/drm/i915/display/intel_panel.c >>> index 5e918ee0c8ea..65d017371d78 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_panel.c >>> +++ b/drivers/gpu/drm/i915/display/intel_panel.c >>> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct >>> intel_connector *connector) >>> struct drm_display_mode, head); >>> } >>> -static bool is_best_fixed_mode(struct intel_connector *connector, >>> - int vrefresh, int fixed_mode_vrefresh, >>> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, >>> const struct drm_display_mode *best_mode) >>> { >>> /* we want to always return something */ >>> if (!best_mode) >>> return true; >>> - /* >>> - * With VRR always pick a mode with equal/higher than requested >>> - * vrefresh, which we can then reduce to match the requested >>> - * vrefresh by extending the vblank length. >>> - */ >>> - if (intel_vrr_is_in_range(connector, vrefresh) && >>> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && >>> - fixed_mode_vrefresh < vrefresh) >>> - return false; >>> - >>> /* pick the fixed_mode that is closest in terms of vrefresh */ >>> return abs(fixed_mode_vrefresh - vrefresh) < >>> abs(drm_mode_vrefresh(best_mode) - vrefresh); >>> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct >>> intel_connector *connector, >>> const struct drm_display_mode * >>> intel_panel_fixed_mode(struct intel_connector *connector, >>> - const struct drm_display_mode *mode) >>> + const struct drm_display_mode *mode, >>> + const struct drm_connector_state *conn_state) >>> { >>> const struct drm_display_mode *fixed_mode, *best_mode = NULL; >>> int vrefresh = drm_mode_vrefresh(mode); >>> + /* >>> + * With VRR always pick the highest refresh rate mode, >>> + * which we can then reduce to match the requested >>> + * vrefresh by extending the vblank length. >>> + */ >>> + if (conn_state && !conn_state->state->allow_modeset && >> The foo_state->state pointer should never be used. If you need the full >> atomic state then plumb it through from the top. > > Hmm noted. > > >> >>> + intel_vrr_is_capable(connector) && >>> + intel_vrr_is_in_range(connector, vrefresh)) >>> + return intel_panel_highest_vrefresh_mode(connector); >> What we want is the fixed mode that matches the current adjusted mode >> exactly except for vtotal, and I think we also want to maintain the >> vsync pulse location relative to vtotal. > > Oh alright. I was thinking the issue is in the best mode logic which > is resulting in lower mode getting picked when we wanted a higher mode > as best fixed mode. > > I was under the impression that since the vsync start/end of lower is > not the same with the higher mode and since this cannot be modified on > the fly, it results in full modeset. > > However, as you said, vsync start/end can be modified indeed the > problem becomes: > > - we are not scaling the vsync start/end similar to what we are doing > for vtotal. > - even if we do that, we need to remove the check for vsync start/end > for fastboot. > > Another consideration is that is the vsync_start should be inside the > vrr guardband, but I think if the vsync_start scales up then it will > still be inside the guardband so we should be covered. > > >> >> We should in fact fix the vsync_start/end mess first. > > You mean the existing vsync_start/end change due to AS SDP thing? Or > you mean the above mentioned scaling up? > > >> We need to add >> TRANS_VSYNC handling to the LRR codepaths and allow that to change >> during fastsets. And intel_panel_compute_config() needs to preserve >> the vtotal-vsync distance when adjusting vtotal. I think that should >> all be fine for DP since it doesn't really use TRANS_VSYNC for >> anything. > > Hmm I think I got some direction here. Thanks for making it clearer. Hi Ville, Going through the Bspec, I have a query on the TRANS_VSYNC part. For NVL onwards, the TRANS_VSYNC seems to be deprecated. As I understand, this is no more used with VRR timing generator, instead TRANS_VRR_VSYNC is used. So we can avoid reading/writing it completely for platforms that support VRR Timing Generator. But for platforms using the legacy timing generator, BSpec says TRANS_VSYNC should not be changed while transcoder/port are enabled. Given that, should we treat TRANS_VSYNC updates as modeset-only on legacy TG platforms, and only allow the fastset path where VRR TG is always used? Just wanted to make sure I’m interpreting your suggestion correctly before changing the fastset checks. Thanks, Ankit > > > Regards, > > Ankit > >> >> + >>> list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, >>> head) { >>> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); >>> - if (is_best_fixed_mode(connector, vrefresh, >>> + if (is_best_fixed_mode(vrefresh, >>> fixed_mode_vrefresh, best_mode)) >>> best_mode = fixed_mode; >>> } >>> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct >>> intel_connector *connector) >>> } >>> int intel_panel_compute_config(struct intel_connector *connector, >>> - struct drm_display_mode *adjusted_mode) >>> + struct drm_display_mode *adjusted_mode, >>> + const struct drm_connector_state *conn_state) >>> { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, adjusted_mode); >>> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >>> int vrefresh, fixed_mode_vrefresh; >>> bool is_vrr; >>> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector >>> *connector, >>> const struct drm_display_mode *mode) >>> { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(connector, mode); >>> + intel_panel_fixed_mode(connector, mode, NULL); >>> if (!fixed_mode) >>> return MODE_OK; >>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h >>> b/drivers/gpu/drm/i915/display/intel_panel.h >>> index 2f7a317995ea..c1189a20c8b2 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_panel.h >>> +++ b/drivers/gpu/drm/i915/display/intel_panel.h >>> @@ -32,7 +32,8 @@ const struct drm_display_mode * >>> intel_panel_preferred_fixed_mode(struct intel_connector *connector); >>> const struct drm_display_mode * >>> intel_panel_fixed_mode(struct intel_connector *connector, >>> - const struct drm_display_mode *mode); >>> + const struct drm_display_mode *mode, >>> + const struct drm_connector_state *conn_state); >>> const struct drm_display_mode * >>> intel_panel_downclock_mode(struct intel_connector *connector, >>> const struct drm_display_mode *adjusted_mode); >>> @@ -47,7 +48,8 @@ enum drm_mode_status >>> intel_panel_mode_valid(struct intel_connector *connector, >>> const struct drm_display_mode *mode); >>> int intel_panel_compute_config(struct intel_connector *connector, >>> - struct drm_display_mode *adjusted_mode); >>> + struct drm_display_mode *adjusted_mode, >>> + const struct drm_connector_state *conn_state); >>> void intel_panel_add_edid_fixed_modes(struct intel_connector >>> *connector, >>> bool use_alt_fixed_modes); >>> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector >>> *connector); >>> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c >>> b/drivers/gpu/drm/i915/display/intel_sdvo.c >>> index 2e1af9e869de..e07c1070a3ec 100644 >>> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c >>> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c >>> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct >>> intel_sdvo *intel_sdvo, >>> if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); >>> if (fixed_mode->hdisplay != args.width || >>> fixed_mode->vdisplay != args.height) >>> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sdvo_tv_clock = true; >>> } else if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>> conn_state); >>> int ret; >>> ret = >>> intel_panel_compute_config(&intel_sdvo_connector->base, >>> - adjusted_mode); >>> + adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct >>> intel_atomic_state *state, >>> /* lvds has a special fixed output timing. */ >>> if (IS_LVDS(intel_sdvo_connector)) { >>> const struct drm_display_mode *fixed_mode = >>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>> conn_state); >>> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); >>> } else { >>> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c >>> b/drivers/gpu/drm/i915/display/vlv_dsi.c >>> index 76e8cd0f65a4..bfe465443d20 100644 >>> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c >>> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c >>> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct >>> intel_encoder *encoder, >>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>> - ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode); >>> + ret = intel_panel_compute_config(intel_connector, >>> adjusted_mode, conn_state); >>> if (ret) >>> return ret; >>> -- >>> 2.45.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-05-04 13:17 ` Nautiyal, Ankit K @ 2026-05-06 7:25 ` Nautiyal, Ankit K 2026-05-06 15:53 ` Manasi Navare 0 siblings, 1 reply; 14+ messages in thread From: Nautiyal, Ankit K @ 2026-05-06 7:25 UTC (permalink / raw) To: Ville Syrjälä; +Cc: intel-gfx, intel-xe, jani.nikula, Manasi Navare On 5/4/2026 6:47 PM, Nautiyal, Ankit K wrote: > > On 4/29/2026 10:30 PM, Nautiyal, Ankit K wrote: >> >> On 4/29/2026 5:44 PM, Ville Syrjälä wrote: >>> On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: >>>> intel_panel_fixed_mode() intends to choose a fixed mode at or above >>>> the >>>> requested refresh rate for VRR panels, so the requested refresh can be >>>> reached by extending vblank. >>>> >>>> This is called in compute config to find the 'best' fixed mode for a >>>> requested mode and also called during mode valid phase to prune the >>>> unsupported fixed modes. >>>> >>>> For Non-VRR panels there is no issue: >>>> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET >>>> flag) with a custom mode, the intel_panel_fixed_mode() gives the >>>> mode >>>> with refresh rate nearest to the requested mode. >>>> - Seamless switch to a lower mode is only possible if the platform has >>>> support for Double buffered MN and the sink is Seamless-DRRS >>>> capable. >>>> In this case the user sets a lower refresh rate mode and doesn't >>>> set >>>> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() >>>> returns >>>> again the fixed mode whose refresh rate is nearest to the requested >>>> mode. >>>> - Since Duble buffered MN is not supported on LNL+, the seamless >>>> switch >>>> is not possible for such panels from LNL+. >>>> >>>> For VRR panels the current logic has some issues: >>>> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed >>>> mode >>>> at or above the requested refresh rate so the requested refresh >>>> can be >>>> reached by extending vblank. >>>> - However, as per the current logic the helper can return a lower >>>> refresh >>>> rate mode, if the lower refresh rate mode is first in the list >>>> of fixed >>>> mode. Later, if the selected fixed mode's refresh rate < the >>>> requested >>>> mode's refresh rate, then the requested rate is matched by >>>> extending >>>> the vblank. >>>> - In case of a full modeset request with a custom mode this is not a >>>> problem. But for the seamless switch features like LRR (Lower >>>> Refresh >>>> Rate) and the Seamless-DRRS this creates a problem as this >>>> results in >>>> change in vsync_start/end and resulting in a full modeset. >>>> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is >>>> not >>>> supported on LNL+, but for VRR panels, the vblank can be extended >>>> similar to LRR case. But due to the above mentioned problem in the >>>> intel_panel_fixed_mode() this also results in full modeset. >>>> >>>> To solve these problems for the VRR panels, identify if the user >>>> wants a >>>> full modeset or expects seamless switch. If seamless switch to a lower >>>> mode is desired, make intel_panel_fixed_mode() return the highest >>>> refresh rate mode, provided the requested rate is in vrr range. This >>>> will then be modified to extend the vblank to provide the desired >>>> refresh rate. >>>> >>>> This is particularly needed for DRRS panels on platforms without the >>>> double buffered M/N support (display version 20+), where seamless >>>> clock >>>> changes are not possible. >>>> >>>> To understand the user requirement for full modeset/seamless >>>> switch, the >>>> intel_panel_fixed_mode() and intel_panel_compute_config() need >>>> access to >>>> the connector state to check the allow_modeset flag. >>>> >>>> Add a nullable conn_state parameter to both. The mode_valid callers >>>> pass >>>> NULL since they have no atomic state and the compute_config callers >>>> pass >>>> their conn_state. >>>> >>>> Also remove the VRR check from is_best_fixed_mode() since the >>>> selection is >>>> handled upfront in intel_panel_fixed_mode(). >>>> >>>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> >>>> --- >>>> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- >>>> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- >>>> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- >>>> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- >>>> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- >>>> drivers/gpu/drm/i915/display/intel_panel.c | 35 >>>> +++++++++++----------- >>>> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- >>>> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- >>>> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- >>>> 9 files changed, 37 insertions(+), 34 deletions(-) >>>> >>>> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c >>>> b/drivers/gpu/drm/i915/display/icl_dsi.c >>>> index afbaa0465842..1efe81404d01 100644 >>>> --- a/drivers/gpu/drm/i915/display/icl_dsi.c >>>> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c >>>> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct >>>> intel_encoder *encoder, >>>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>>> - ret = intel_panel_compute_config(intel_connector, >>>> adjusted_mode); >>>> + ret = intel_panel_compute_config(intel_connector, >>>> adjusted_mode, conn_state); >>>> if (ret) >>>> return ret; >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c >>>> b/drivers/gpu/drm/i915/display/intel_dp.c >>>> index 35b8fb5740aa..f014ce28e69f 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_dp.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >>>> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector >>>> *_connector, >>>> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) >>>> return MODE_H_ILLEGAL; >>>> - fixed_mode = intel_panel_fixed_mode(connector, mode); >>>> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); >>>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>>> status = intel_panel_mode_valid(connector, mode); >>>> if (status != MODE_OK) >>>> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder >>>> *encoder, >>>> struct intel_connector *connector = >>>> intel_dp->attached_connector; >>>> int ret = 0, link_bpp_x16; >>>> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); >>>> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, >>>> conn_state); >>>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>>> conn_state); >>>> if (ret) >>>> return ret; >>>> } >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c >>>> b/drivers/gpu/drm/i915/display/intel_dsi.c >>>> index 9005c1f5d857..a480bb79dca7 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_dsi.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c >>>> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct >>>> drm_connector *connector, >>>> struct intel_display *display = >>>> to_intel_display(connector->dev); >>>> struct intel_connector *intel_connector = >>>> to_intel_connector(connector); >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(intel_connector, mode); >>>> + intel_panel_fixed_mode(intel_connector, mode, NULL); >>>> int max_dotclk = display->cdclk.max_dotclk_freq; >>>> enum drm_mode_status status; >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c >>>> b/drivers/gpu/drm/i915/display/intel_dvo.c >>>> index 405b33aca9dd..0ec25d895777 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_dvo.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c >>>> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector >>>> *_connector, >>>> struct intel_connector *connector = >>>> to_intel_connector(_connector); >>>> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(connector, mode); >>>> + intel_panel_fixed_mode(connector, mode, NULL); >>>> int max_dotclk = display->cdclk.max_dotclk_freq; >>>> int target_clock = mode->clock; >>>> enum drm_mode_status status; >>>> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct >>>> intel_encoder *encoder, >>>> struct intel_connector *connector = >>>> to_intel_connector(conn_state->connector); >>>> struct drm_display_mode *adjusted_mode = >>>> &pipe_config->hw.adjusted_mode; >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(intel_dvo->attached_connector, >>>> adjusted_mode); >>>> + intel_panel_fixed_mode(intel_dvo->attached_connector, >>>> adjusted_mode, conn_state); >>>> /* >>>> * If we have timings from the BIOS for the panel, put them in >>>> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct >>>> intel_encoder *encoder, >>>> if (fixed_mode) { >>>> int ret; >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>>> conn_state); >>>> if (ret) >>>> return ret; >>>> } >>>> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c >>>> b/drivers/gpu/drm/i915/display/intel_lvds.c >>>> index cc6d4bfcff10..2e30bc3f1e62 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_lvds.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c >>>> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector >>>> *_connector, >>>> struct intel_display *display = >>>> to_intel_display(_connector->dev); >>>> struct intel_connector *connector = >>>> to_intel_connector(_connector); >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(connector, mode); >>>> + intel_panel_fixed_mode(connector, mode, NULL); >>>> int max_pixclk = display->cdclk.max_dotclk_freq; >>>> enum drm_mode_status status; >>>> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct >>>> intel_encoder *encoder, >>>> * with the panel scaling set up to source from the H/VDisplay >>>> * of the original mode. >>>> */ >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, >>>> conn_state); >>>> if (ret) >>>> return ret; >>>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c >>>> b/drivers/gpu/drm/i915/display/intel_panel.c >>>> index 5e918ee0c8ea..65d017371d78 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_panel.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_panel.c >>>> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct >>>> intel_connector *connector) >>>> struct drm_display_mode, head); >>>> } >>>> -static bool is_best_fixed_mode(struct intel_connector *connector, >>>> - int vrefresh, int fixed_mode_vrefresh, >>>> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, >>>> const struct drm_display_mode *best_mode) >>>> { >>>> /* we want to always return something */ >>>> if (!best_mode) >>>> return true; >>>> - /* >>>> - * With VRR always pick a mode with equal/higher than requested >>>> - * vrefresh, which we can then reduce to match the requested >>>> - * vrefresh by extending the vblank length. >>>> - */ >>>> - if (intel_vrr_is_in_range(connector, vrefresh) && >>>> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && >>>> - fixed_mode_vrefresh < vrefresh) >>>> - return false; >>>> - >>>> /* pick the fixed_mode that is closest in terms of vrefresh */ >>>> return abs(fixed_mode_vrefresh - vrefresh) < >>>> abs(drm_mode_vrefresh(best_mode) - vrefresh); >>>> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct >>>> intel_connector *connector, >>>> const struct drm_display_mode * >>>> intel_panel_fixed_mode(struct intel_connector *connector, >>>> - const struct drm_display_mode *mode) >>>> + const struct drm_display_mode *mode, >>>> + const struct drm_connector_state *conn_state) >>>> { >>>> const struct drm_display_mode *fixed_mode, *best_mode = NULL; >>>> int vrefresh = drm_mode_vrefresh(mode); >>>> + /* >>>> + * With VRR always pick the highest refresh rate mode, >>>> + * which we can then reduce to match the requested >>>> + * vrefresh by extending the vblank length. >>>> + */ >>>> + if (conn_state && !conn_state->state->allow_modeset && >>> The foo_state->state pointer should never be used. If you need the full >>> atomic state then plumb it through from the top. >> >> Hmm noted. >> >> >>> >>>> + intel_vrr_is_capable(connector) && >>>> + intel_vrr_is_in_range(connector, vrefresh)) >>>> + return intel_panel_highest_vrefresh_mode(connector); >>> What we want is the fixed mode that matches the current adjusted mode >>> exactly except for vtotal, and I think we also want to maintain the >>> vsync pulse location relative to vtotal. >> >> Oh alright. I was thinking the issue is in the best mode logic which >> is resulting in lower mode getting picked when we wanted a higher >> mode as best fixed mode. >> >> I was under the impression that since the vsync start/end of lower is >> not the same with the higher mode and since this cannot be modified >> on the fly, it results in full modeset. >> >> However, as you said, vsync start/end can be modified indeed the >> problem becomes: >> >> - we are not scaling the vsync start/end similar to what we are doing >> for vtotal. >> - even if we do that, we need to remove the check for vsync start/end >> for fastboot. >> >> Another consideration is that is the vsync_start should be inside the >> vrr guardband, but I think if the vsync_start scales up then it will >> still be inside the guardband so we should be covered. >> >> >>> >>> We should in fact fix the vsync_start/end mess first. >> >> You mean the existing vsync_start/end change due to AS SDP thing? Or >> you mean the above mentioned scaling up? >> >> >>> We need to add >>> TRANS_VSYNC handling to the LRR codepaths and allow that to change >>> during fastsets. And intel_panel_compute_config() needs to preserve >>> the vtotal-vsync distance when adjusting vtotal. I think that should >>> all be fine for DP since it doesn't really use TRANS_VSYNC for >>> anything. >> >> Hmm I think I got some direction here. Thanks for making it clearer. > > > Hi Ville, > > Going through the Bspec, I have a query on the TRANS_VSYNC part. > > For NVL onwards, the TRANS_VSYNC seems to be deprecated. As I > understand, this is no more used with VRR timing generator, instead > TRANS_VRR_VSYNC is used. > So we can avoid reading/writing it completely for platforms that > support VRR Timing Generator. > > But for platforms using the legacy timing generator, BSpec says > TRANS_VSYNC should not be changed while transcoder/port are enabled. > Given that, should we treat TRANS_VSYNC updates as modeset-only on > legacy TG platforms, and only allow the fastset path where VRR TG is > always used? > > Just wanted to make sure I’m interpreting your suggestion correctly > before changing the fastset checks. > > Thanks, > Ankit > Just an update: Maintaining vtotal-vsync pulse seems to be working, along with the change to always use highest RR mode as best mode. I still need to address the comment about avoid deriving allow_modeset from connector state directly. Cc: Manasi Navare <navaremanasi@google.com> Regards, Ankit > >> >> >> Regards, >> >> Ankit >> >>> >>> + >>>> list_for_each_entry(fixed_mode, >>>> &connector->panel.fixed_modes, head) { >>>> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); >>>> - if (is_best_fixed_mode(connector, vrefresh, >>>> + if (is_best_fixed_mode(vrefresh, >>>> fixed_mode_vrefresh, best_mode)) >>>> best_mode = fixed_mode; >>>> } >>>> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct >>>> intel_connector *connector) >>>> } >>>> int intel_panel_compute_config(struct intel_connector *connector, >>>> - struct drm_display_mode *adjusted_mode) >>>> + struct drm_display_mode *adjusted_mode, >>>> + const struct drm_connector_state *conn_state) >>>> { >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(connector, adjusted_mode); >>>> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); >>>> int vrefresh, fixed_mode_vrefresh; >>>> bool is_vrr; >>>> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector >>>> *connector, >>>> const struct drm_display_mode *mode) >>>> { >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(connector, mode); >>>> + intel_panel_fixed_mode(connector, mode, NULL); >>>> if (!fixed_mode) >>>> return MODE_OK; >>>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h >>>> b/drivers/gpu/drm/i915/display/intel_panel.h >>>> index 2f7a317995ea..c1189a20c8b2 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_panel.h >>>> +++ b/drivers/gpu/drm/i915/display/intel_panel.h >>>> @@ -32,7 +32,8 @@ const struct drm_display_mode * >>>> intel_panel_preferred_fixed_mode(struct intel_connector *connector); >>>> const struct drm_display_mode * >>>> intel_panel_fixed_mode(struct intel_connector *connector, >>>> - const struct drm_display_mode *mode); >>>> + const struct drm_display_mode *mode, >>>> + const struct drm_connector_state *conn_state); >>>> const struct drm_display_mode * >>>> intel_panel_downclock_mode(struct intel_connector *connector, >>>> const struct drm_display_mode *adjusted_mode); >>>> @@ -47,7 +48,8 @@ enum drm_mode_status >>>> intel_panel_mode_valid(struct intel_connector *connector, >>>> const struct drm_display_mode *mode); >>>> int intel_panel_compute_config(struct intel_connector *connector, >>>> - struct drm_display_mode *adjusted_mode); >>>> + struct drm_display_mode *adjusted_mode, >>>> + const struct drm_connector_state *conn_state); >>>> void intel_panel_add_edid_fixed_modes(struct intel_connector >>>> *connector, >>>> bool use_alt_fixed_modes); >>>> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector >>>> *connector); >>>> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c >>>> b/drivers/gpu/drm/i915/display/intel_sdvo.c >>>> index 2e1af9e869de..e07c1070a3ec 100644 >>>> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c >>>> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c >>>> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct >>>> intel_sdvo *intel_sdvo, >>>> if (IS_LVDS(intel_sdvo_connector)) { >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); >>>> if (fixed_mode->hdisplay != args.width || >>>> fixed_mode->vdisplay != args.height) >>>> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct >>>> intel_encoder *encoder, >>>> pipe_config->sdvo_tv_clock = true; >>>> } else if (IS_LVDS(intel_sdvo_connector)) { >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>>> conn_state); >>>> int ret; >>>> ret = >>>> intel_panel_compute_config(&intel_sdvo_connector->base, >>>> - adjusted_mode); >>>> + adjusted_mode, conn_state); >>>> if (ret) >>>> return ret; >>>> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct >>>> intel_atomic_state *state, >>>> /* lvds has a special fixed output timing. */ >>>> if (IS_LVDS(intel_sdvo_connector)) { >>>> const struct drm_display_mode *fixed_mode = >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, >>>> conn_state); >>>> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); >>>> } else { >>>> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c >>>> b/drivers/gpu/drm/i915/display/vlv_dsi.c >>>> index 76e8cd0f65a4..bfe465443d20 100644 >>>> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c >>>> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c >>>> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct >>>> intel_encoder *encoder, >>>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; >>>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; >>>> - ret = intel_panel_compute_config(intel_connector, >>>> adjusted_mode); >>>> + ret = intel_panel_compute_config(intel_connector, >>>> adjusted_mode, conn_state); >>>> if (ret) >>>> return ret; >>>> -- >>>> 2.45.2 ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes 2026-05-06 7:25 ` Nautiyal, Ankit K @ 2026-05-06 15:53 ` Manasi Navare 0 siblings, 0 replies; 14+ messages in thread From: Manasi Navare @ 2026-05-06 15:53 UTC (permalink / raw) To: Nautiyal, Ankit K Cc: Ville Syrjälä, intel-gfx, intel-xe, jani.nikula [-- Attachment #1: Type: text/plain, Size: 23967 bytes --] Hi Ankit, Ville, Jani, Thank you for the patch and the discussion here. Please see some of my comments/feedback below: On Wed, May 6, 2026 at 12:25 AM Nautiyal, Ankit K < ankit.k.nautiyal@intel.com> wrote: > > On 5/4/2026 6:47 PM, Nautiyal, Ankit K wrote: > > > > On 4/29/2026 10:30 PM, Nautiyal, Ankit K wrote: > >> > >> On 4/29/2026 5:44 PM, Ville Syrjälä wrote: > >>> On Tue, Apr 28, 2026 at 02:03:23PM +0530, Ankit Nautiyal wrote: > >>>> intel_panel_fixed_mode() intends to choose a fixed mode at or above > >>>> the > >>>> requested refresh rate for VRR panels, so the requested refresh can be > >>>> reached by extending vblank. > >>>> > >>>> This is called in compute config to find the 'best' fixed mode for a > >>>> requested mode and also called during mode valid phase to prune the > >>>> unsupported fixed modes. > >>>> > >>>> For Non-VRR panels there is no issue: > >>>> - When a user wants to do a full modeset (sets DRM_MODE_ALLOW_MODESET > >>>> flag) with a custom mode, the intel_panel_fixed_mode() gives the > >>>> mode > >>>> with refresh rate nearest to the requested mode. > >>>> - Seamless switch to a lower mode is only possible if the platform has > >>>> support for Double buffered MN and the sink is Seamless-DRRS > >>>> capable. > >>>> In this case the user sets a lower refresh rate mode and doesn't > >>>> set > >>>> the DRM_MODE_ALLOW_MODESET flag the intel_panel_fixed_mode() > >>>> returns > >>>> again the fixed mode whose refresh rate is nearest to the requested > >>>> mode. > >>>> - Since Duble buffered MN is not supported on LNL+, the seamless > >>>> switch > >>>> is not possible for such panels from LNL+. > >>>> > >>>> For VRR panels the current logic has some issues: > >>>> - For VRR panels intel_panel_fixed_mode() intends to choose a fixed > >>>> mode > >>>> at or above the requested refresh rate so the requested refresh > >>>> can be > >>>> reached by extending vblank. > >>>> - However, as per the current logic the helper can return a lower > >>>> refresh > >>>> rate mode, if the lower refresh rate mode is first in the list > >>>> of fixed > >>>> mode. Later, if the selected fixed mode's refresh rate < the > >>>> requested > >>>> mode's refresh rate, then the requested rate is matched by > >>>> extending > >>>> the vblank. > >>>> - In case of a full modeset request with a custom mode this is not a > >>>> problem. But for the seamless switch features like LRR (Lower > >>>> Refresh > >>>> Rate) and the Seamless-DRRS this creates a problem as this > >>>> results in > >>>> change in vsync_start/end and resulting in a full modeset. > >>>> - Furthermore, as with the Non-VRR panel case, the Seamless-DRRS is > >>>> not > >>>> supported on LNL+, but for VRR panels, the vblank can be extended > >>>> similar to LRR case. But due to the above mentioned problem in the > >>>> intel_panel_fixed_mode() this also results in full modeset. > >>>> > >>>> To solve these problems for the VRR panels, identify if the user > >>>> wants a > >>>> full modeset or expects seamless switch. If seamless switch to a lower > >>>> mode is desired, make intel_panel_fixed_mode() return the highest > >>>> refresh rate mode, provided the requested rate is in vrr range. This > >>>> will then be modified to extend the vblank to provide the desired > >>>> refresh rate. > >>>> > >>>> This is particularly needed for DRRS panels on platforms without the > >>>> double buffered M/N support (display version 20+), where seamless > >>>> clock > >>>> changes are not possible. > >>>> > >>>> To understand the user requirement for full modeset/seamless > >>>> switch, the > >>>> intel_panel_fixed_mode() and intel_panel_compute_config() need > >>>> access to > >>>> the connector state to check the allow_modeset flag. > >>>> > >>>> Add a nullable conn_state parameter to both. The mode_valid callers > >>>> pass > >>>> NULL since they have no atomic state and the compute_config callers > >>>> pass > >>>> their conn_state. > >>>> > >>>> Also remove the VRR check from is_best_fixed_mode() since the > >>>> selection is > >>>> handled upfront in intel_panel_fixed_mode(). > >>>> > >>>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> > >>>> --- > >>>> drivers/gpu/drm/i915/display/icl_dsi.c | 2 +- > >>>> drivers/gpu/drm/i915/display/intel_dp.c | 6 ++-- > >>>> drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- > >>>> drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++-- > >>>> drivers/gpu/drm/i915/display/intel_lvds.c | 4 +-- > >>>> drivers/gpu/drm/i915/display/intel_panel.c | 35 > >>>> +++++++++++----------- > >>>> drivers/gpu/drm/i915/display/intel_panel.h | 6 ++-- > >>>> drivers/gpu/drm/i915/display/intel_sdvo.c | 8 ++--- > >>>> drivers/gpu/drm/i915/display/vlv_dsi.c | 2 +- > >>>> 9 files changed, 37 insertions(+), 34 deletions(-) > >>>> > >>>> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c > >>>> b/drivers/gpu/drm/i915/display/icl_dsi.c > >>>> index afbaa0465842..1efe81404d01 100644 > >>>> --- a/drivers/gpu/drm/i915/display/icl_dsi.c > >>>> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c > >>>> @@ -1671,7 +1671,7 @@ static int gen11_dsi_compute_config(struct > >>>> intel_encoder *encoder, > >>>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > >>>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > >>>> - ret = intel_panel_compute_config(intel_connector, > >>>> adjusted_mode); > >>>> + ret = intel_panel_compute_config(intel_connector, > >>>> adjusted_mode, conn_state); > >>>> if (ret) > >>>> return ret; > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > >>>> b/drivers/gpu/drm/i915/display/intel_dp.c > >>>> index 35b8fb5740aa..f014ce28e69f 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_dp.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c > >>>> @@ -1588,7 +1588,7 @@ intel_dp_mode_valid(struct drm_connector > >>>> *_connector, > >>>> if (intel_dp_hdisplay_bad(display, mode->hdisplay)) > >>>> return MODE_H_ILLEGAL; > >>>> - fixed_mode = intel_panel_fixed_mode(connector, mode); > >>>> + fixed_mode = intel_panel_fixed_mode(connector, mode, NULL); > >>>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { > >>>> status = intel_panel_mode_valid(connector, mode); > >>>> if (status != MODE_OK) > >>>> @@ -3577,9 +3577,9 @@ intel_dp_compute_config(struct intel_encoder > >>>> *encoder, > >>>> struct intel_connector *connector = > >>>> intel_dp->attached_connector; > >>>> int ret = 0, link_bpp_x16; > >>>> - fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); > >>>> + fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode, > >>>> conn_state); > >>>> if (intel_dp_is_edp(intel_dp) && fixed_mode) { > >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); > >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, > >>>> conn_state); > >>>> if (ret) > >>>> return ret; > >>>> } > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dsi.c > >>>> b/drivers/gpu/drm/i915/display/intel_dsi.c > >>>> index 9005c1f5d857..a480bb79dca7 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_dsi.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_dsi.c > >>>> @@ -64,7 +64,7 @@ enum drm_mode_status intel_dsi_mode_valid(struct > >>>> drm_connector *connector, > >>>> struct intel_display *display = > >>>> to_intel_display(connector->dev); > >>>> struct intel_connector *intel_connector = > >>>> to_intel_connector(connector); > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(intel_connector, mode); > >>>> + intel_panel_fixed_mode(intel_connector, mode, NULL); > >>>> int max_dotclk = display->cdclk.max_dotclk_freq; > >>>> enum drm_mode_status status; > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c > >>>> b/drivers/gpu/drm/i915/display/intel_dvo.c > >>>> index 405b33aca9dd..0ec25d895777 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_dvo.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c > >>>> @@ -224,7 +224,7 @@ intel_dvo_mode_valid(struct drm_connector > >>>> *_connector, > >>>> struct intel_connector *connector = > >>>> to_intel_connector(_connector); > >>>> struct intel_dvo *intel_dvo = intel_attached_dvo(connector); > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(connector, mode); > >>>> + intel_panel_fixed_mode(connector, mode, NULL); > >>>> int max_dotclk = display->cdclk.max_dotclk_freq; > >>>> int target_clock = mode->clock; > >>>> enum drm_mode_status status; > >>>> @@ -259,7 +259,7 @@ static int intel_dvo_compute_config(struct > >>>> intel_encoder *encoder, > >>>> struct intel_connector *connector = > >>>> to_intel_connector(conn_state->connector); > >>>> struct drm_display_mode *adjusted_mode = > >>>> &pipe_config->hw.adjusted_mode; > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(intel_dvo->attached_connector, > >>>> adjusted_mode); > >>>> + intel_panel_fixed_mode(intel_dvo->attached_connector, > >>>> adjusted_mode, conn_state); > >>>> /* > >>>> * If we have timings from the BIOS for the panel, put them in > >>>> @@ -270,7 +270,7 @@ static int intel_dvo_compute_config(struct > >>>> intel_encoder *encoder, > >>>> if (fixed_mode) { > >>>> int ret; > >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); > >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, > >>>> conn_state); > >>>> if (ret) > >>>> return ret; > >>>> } > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c > >>>> b/drivers/gpu/drm/i915/display/intel_lvds.c > >>>> index cc6d4bfcff10..2e30bc3f1e62 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_lvds.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c > >>>> @@ -396,7 +396,7 @@ intel_lvds_mode_valid(struct drm_connector > >>>> *_connector, > >>>> struct intel_display *display = > >>>> to_intel_display(_connector->dev); > >>>> struct intel_connector *connector = > >>>> to_intel_connector(_connector); > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(connector, mode); > >>>> + intel_panel_fixed_mode(connector, mode, NULL); > >>>> int max_pixclk = display->cdclk.max_dotclk_freq; > >>>> enum drm_mode_status status; > >>>> @@ -460,7 +460,7 @@ static int intel_lvds_compute_config(struct > >>>> intel_encoder *encoder, > >>>> * with the panel scaling set up to source from the H/VDisplay > >>>> * of the original mode. > >>>> */ > >>>> - ret = intel_panel_compute_config(connector, adjusted_mode); > >>>> + ret = intel_panel_compute_config(connector, adjusted_mode, > >>>> conn_state); > >>>> if (ret) > >>>> return ret; > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c > >>>> b/drivers/gpu/drm/i915/display/intel_panel.c > >>>> index 5e918ee0c8ea..65d017371d78 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_panel.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_panel.c > >>>> @@ -59,24 +59,13 @@ intel_panel_preferred_fixed_mode(struct > >>>> intel_connector *connector) > >>>> struct drm_display_mode, head); > >>>> } > >>>> -static bool is_best_fixed_mode(struct intel_connector *connector, > >>>> - int vrefresh, int fixed_mode_vrefresh, > >>>> +static bool is_best_fixed_mode(int vrefresh, int fixed_mode_vrefresh, > >>>> const struct drm_display_mode *best_mode) > >>>> { > >>>> /* we want to always return something */ > >>>> if (!best_mode) > >>>> return true; > >>>> - /* > >>>> - * With VRR always pick a mode with equal/higher than requested > >>>> - * vrefresh, which we can then reduce to match the requested > >>>> - * vrefresh by extending the vblank length. > >>>> - */ > >>>> - if (intel_vrr_is_in_range(connector, vrefresh) && > >>>> - intel_vrr_is_in_range(connector, fixed_mode_vrefresh) && > >>>> - fixed_mode_vrefresh < vrefresh) > >>>> - return false; > >>>> - > >>>> /* pick the fixed_mode that is closest in terms of vrefresh */ > >>>> return abs(fixed_mode_vrefresh - vrefresh) < > >>>> abs(drm_mode_vrefresh(best_mode) - vrefresh); > >>>> @@ -84,15 +73,26 @@ static bool is_best_fixed_mode(struct > >>>> intel_connector *connector, > >>>> const struct drm_display_mode * > >>>> intel_panel_fixed_mode(struct intel_connector *connector, > >>>> - const struct drm_display_mode *mode) > >>>> + const struct drm_display_mode *mode, > >>>> + const struct drm_connector_state *conn_state) > >>>> { > >>>> const struct drm_display_mode *fixed_mode, *best_mode = NULL; > >>>> int vrefresh = drm_mode_vrefresh(mode); > >>>> + /* > >>>> + * With VRR always pick the highest refresh rate mode, > >>>> + * which we can then reduce to match the requested > >>>> + * vrefresh by extending the vblank length. > >>>> + */ > >>>> + if (conn_state && !conn_state->state->allow_modeset && > >>> The foo_state->state pointer should never be used. If you need the full > >>> atomic state then plumb it through from the top. > >> > >> Hmm noted. > >> > >> > >>> > >>>> + intel_vrr_is_capable(connector) && > >>>> + intel_vrr_is_in_range(connector, vrefresh)) > >>>> + return intel_panel_highest_vrefresh_mode(connector); > >>> What we want is the fixed mode that matches the current adjusted mode > >>> exactly except for vtotal, and I think we also want to maintain the > >>> vsync pulse location relative to vtotal. > >> > >> Oh alright. I was thinking the issue is in the best mode logic which > >> is resulting in lower mode getting picked when we wanted a higher > >> mode as best fixed mode. > >> > >> I was under the impression that since the vsync start/end of lower is > >> not the same with the higher mode and since this cannot be modified > >> on the fly, it results in full modeset. > >> > >> However, as you said, vsync start/end can be modified indeed the > >> problem becomes: > >> > >> - we are not scaling the vsync start/end similar to what we are doing > >> for vtotal. > >> - even if we do that, we need to remove the check for vsync start/end > >> for fastboot. > >> > >> Another consideration is that is the vsync_start should be inside the > >> vrr guardband, but I think if the vsync_start scales up then it will > >> still be inside the guardband so we should be covered. > >> > >> > >>> > >>> We should in fact fix the vsync_start/end mess first. > >> > >> You mean the existing vsync_start/end change due to AS SDP thing? Or > >> you mean the above mentioned scaling up? > >> > >> > >>> We need to add > >>> TRANS_VSYNC handling to the LRR codepaths and allow that to change > >>> during fastsets. And intel_panel_compute_config() needs to preserve > >>> the vtotal-vsync distance when adjusting vtotal. I think that should > >>> all be fine for DP since it doesn't really use TRANS_VSYNC for > >>> anything. > >> > >> Hmm I think I got some direction here. Thanks for making it clearer. > > > > > > Hi Ville, > > > > Going through the Bspec, I have a query on the TRANS_VSYNC part. > > > > For NVL onwards, the TRANS_VSYNC seems to be deprecated. As I > > understand, this is no more used with VRR timing generator, instead > > TRANS_VRR_VSYNC is used. > > So we can avoid reading/writing it completely for platforms that > > support VRR Timing Generator. > > > > But for platforms using the legacy timing generator, BSpec says > > TRANS_VSYNC should not be changed while transcoder/port are enabled. > > Given that, should we treat TRANS_VSYNC updates as modeset-only on > > legacy TG platforms, and only allow the fastset path where VRR TG is > > always used? > > > > Just wanted to make sure I’m interpreting your suggestion correctly > > before changing the fastset checks. > > > > Thanks, > > Ankit > > > > Just an update: > > Maintaining vtotal-vsync pulse seems to be working, along with the > change to always use highest RR mode as best mode. > I see that the patch selects the highest refresh rate during compute_config. Would that be sufficient to allow VRR based fastset when userspace requests 60Hz at the initial modeset from userspace? I think what we might need is that during the very first hand off to the kernel driver, is when it always internally sets the crtc state mode timings for the highest refresh rate mode such that when the usersapce requests to set the preferred mode of 60 Hz, the mode or the crtc timings would be set the only difference would be the Vtotal and it will meet the VRR fastset requirements and will be able to achieve this 60 Hz using VRR From the userspace perspective, 60Hz will still be the preferred mode as advertised by the panel, but internally if the driver can always set the timings for the highest refresh rate, then switching from lower refresh rate 60 Hz to higher refresh rate 120Hz would be possible seamlessly. Regards Manasi > > I still need to address the comment about avoid deriving allow_modeset > from connector state directly. > > Cc: > > Manasi Navare <navaremanasi@google.com> > > > Regards, > > Ankit > > > > > >> > >> > >> Regards, > >> > >> Ankit > >> > >>> > >>> + > >>>> list_for_each_entry(fixed_mode, > >>>> &connector->panel.fixed_modes, head) { > >>>> int fixed_mode_vrefresh = drm_mode_vrefresh(fixed_mode); > >>>> - if (is_best_fixed_mode(connector, vrefresh, > >>>> + if (is_best_fixed_mode(vrefresh, > >>>> fixed_mode_vrefresh, best_mode)) > >>>> best_mode = fixed_mode; > >>>> } > >>>> @@ -213,10 +213,11 @@ enum drrs_type intel_panel_drrs_type(struct > >>>> intel_connector *connector) > >>>> } > >>>> int intel_panel_compute_config(struct intel_connector *connector, > >>>> - struct drm_display_mode *adjusted_mode) > >>>> + struct drm_display_mode *adjusted_mode, > >>>> + const struct drm_connector_state *conn_state) > >>>> { > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(connector, adjusted_mode); > >>>> + intel_panel_fixed_mode(connector, adjusted_mode, conn_state); > >>>> int vrefresh, fixed_mode_vrefresh; > >>>> bool is_vrr; > >>>> @@ -414,7 +415,7 @@ intel_panel_mode_valid(struct intel_connector > >>>> *connector, > >>>> const struct drm_display_mode *mode) > >>>> { > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(connector, mode); > >>>> + intel_panel_fixed_mode(connector, mode, NULL); > >>>> if (!fixed_mode) > >>>> return MODE_OK; > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h > >>>> b/drivers/gpu/drm/i915/display/intel_panel.h > >>>> index 2f7a317995ea..c1189a20c8b2 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_panel.h > >>>> +++ b/drivers/gpu/drm/i915/display/intel_panel.h > >>>> @@ -32,7 +32,8 @@ const struct drm_display_mode * > >>>> intel_panel_preferred_fixed_mode(struct intel_connector *connector); > >>>> const struct drm_display_mode * > >>>> intel_panel_fixed_mode(struct intel_connector *connector, > >>>> - const struct drm_display_mode *mode); > >>>> + const struct drm_display_mode *mode, > >>>> + const struct drm_connector_state *conn_state); > >>>> const struct drm_display_mode * > >>>> intel_panel_downclock_mode(struct intel_connector *connector, > >>>> const struct drm_display_mode *adjusted_mode); > >>>> @@ -47,7 +48,8 @@ enum drm_mode_status > >>>> intel_panel_mode_valid(struct intel_connector *connector, > >>>> const struct drm_display_mode *mode); > >>>> int intel_panel_compute_config(struct intel_connector *connector, > >>>> - struct drm_display_mode *adjusted_mode); > >>>> + struct drm_display_mode *adjusted_mode, > >>>> + const struct drm_connector_state *conn_state); > >>>> void intel_panel_add_edid_fixed_modes(struct intel_connector > >>>> *connector, > >>>> bool use_alt_fixed_modes); > >>>> void intel_panel_add_vbt_lfp_fixed_mode(struct intel_connector > >>>> *connector); > >>>> diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c > >>>> b/drivers/gpu/drm/i915/display/intel_sdvo.c > >>>> index 2e1af9e869de..e07c1070a3ec 100644 > >>>> --- a/drivers/gpu/drm/i915/display/intel_sdvo.c > >>>> +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c > >>>> @@ -797,7 +797,7 @@ intel_sdvo_create_preferred_input_timing(struct > >>>> intel_sdvo *intel_sdvo, > >>>> if (IS_LVDS(intel_sdvo_connector)) { > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, NULL); > >>>> if (fixed_mode->hdisplay != args.width || > >>>> fixed_mode->vdisplay != args.height) > >>>> @@ -1396,11 +1396,11 @@ static int intel_sdvo_compute_config(struct > >>>> intel_encoder *encoder, > >>>> pipe_config->sdvo_tv_clock = true; > >>>> } else if (IS_LVDS(intel_sdvo_connector)) { > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, > >>>> conn_state); > >>>> int ret; > >>>> ret = > >>>> intel_panel_compute_config(&intel_sdvo_connector->base, > >>>> - adjusted_mode); > >>>> + adjusted_mode, conn_state); > >>>> if (ret) > >>>> return ret; > >>>> @@ -1562,7 +1562,7 @@ static void intel_sdvo_pre_enable(struct > >>>> intel_atomic_state *state, > >>>> /* lvds has a special fixed output timing. */ > >>>> if (IS_LVDS(intel_sdvo_connector)) { > >>>> const struct drm_display_mode *fixed_mode = > >>>> - intel_panel_fixed_mode(&intel_sdvo_connector->base, mode); > >>>> + intel_panel_fixed_mode(&intel_sdvo_connector->base, mode, > >>>> conn_state); > >>>> intel_sdvo_get_dtd_from_mode(&output_dtd, fixed_mode); > >>>> } else { > >>>> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c > >>>> b/drivers/gpu/drm/i915/display/vlv_dsi.c > >>>> index 76e8cd0f65a4..bfe465443d20 100644 > >>>> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c > >>>> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c > >>>> @@ -280,7 +280,7 @@ static int intel_dsi_compute_config(struct > >>>> intel_encoder *encoder, > >>>> pipe_config->sink_format = INTEL_OUTPUT_FORMAT_RGB; > >>>> pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; > >>>> - ret = intel_panel_compute_config(intel_connector, > >>>> adjusted_mode); > >>>> + ret = intel_panel_compute_config(intel_connector, > >>>> adjusted_mode, conn_state); > >>>> if (ret) > >>>> return ret; > >>>> -- > >>>> 2.45.2 > [-- Attachment #2: Type: text/html, Size: 32363 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* ✓ CI.KUnit: success for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 1/2] drm/i915/intel_panel: Add a helper to get the highest refresh rate mode Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes Ankit Nautiyal @ 2026-04-28 9:32 ` Patchwork 2026-04-28 10:42 ` ✓ Xe.CI.BAT: " Patchwork 2026-04-28 18:57 ` ✗ Xe.CI.FULL: failure " Patchwork 4 siblings, 0 replies; 14+ messages in thread From: Patchwork @ 2026-04-28 9:32 UTC (permalink / raw) To: Ankit Nautiyal; +Cc: intel-xe == Series Details == Series: drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels URL : https://patchwork.freedesktop.org/series/165603/ State : success == Summary == + trap cleanup EXIT + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig [09:30:13] Configuring KUnit Kernel ... Generating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:30:25] 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=25 [09:31:20] Starting KUnit Kernel (1/1)... [09:31:20] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:31:21] ================== guc_buf (11 subtests) =================== [09:31:21] [PASSED] test_smallest [09:31:21] [PASSED] test_largest [09:31:21] [PASSED] test_granular [09:31:21] [PASSED] test_unique [09:31:21] [PASSED] test_overlap [09:31:21] [PASSED] test_reusable [09:31:21] [PASSED] test_too_big [09:31:21] [PASSED] test_flush [09:31:21] [PASSED] test_lookup [09:31:21] [PASSED] test_data [09:31:21] [PASSED] test_class [09:31:21] ===================== [PASSED] guc_buf ===================== [09:31:21] =================== guc_dbm (7 subtests) =================== [09:31:21] [PASSED] test_empty [09:31:21] [PASSED] test_default [09:31:21] ======================== test_size ======================== [09:31:21] [PASSED] 4 [09:31:21] [PASSED] 8 [09:31:21] [PASSED] 32 [09:31:21] [PASSED] 256 [09:31:21] ==================== [PASSED] test_size ==================== [09:31:21] ======================= test_reuse ======================== [09:31:21] [PASSED] 4 [09:31:21] [PASSED] 8 [09:31:21] [PASSED] 32 [09:31:21] [PASSED] 256 [09:31:21] =================== [PASSED] test_reuse ==================== [09:31:21] =================== test_range_overlap ==================== [09:31:21] [PASSED] 4 [09:31:21] [PASSED] 8 [09:31:21] [PASSED] 32 [09:31:21] [PASSED] 256 [09:31:21] =============== [PASSED] test_range_overlap ================ [09:31:21] =================== test_range_compact ==================== [09:31:21] [PASSED] 4 [09:31:21] [PASSED] 8 [09:31:21] [PASSED] 32 [09:31:21] [PASSED] 256 [09:31:21] =============== [PASSED] test_range_compact ================ [09:31:21] ==================== test_range_spare ===================== [09:31:21] [PASSED] 4 [09:31:21] [PASSED] 8 [09:31:21] [PASSED] 32 [09:31:21] [PASSED] 256 [09:31:21] ================ [PASSED] test_range_spare ================= [09:31:21] ===================== [PASSED] guc_dbm ===================== [09:31:21] =================== guc_idm (6 subtests) =================== [09:31:21] [PASSED] bad_init [09:31:21] [PASSED] no_init [09:31:21] [PASSED] init_fini [09:31:21] [PASSED] check_used [09:31:21] [PASSED] check_quota [09:31:21] [PASSED] check_all [09:31:21] ===================== [PASSED] guc_idm ===================== [09:31:21] ================== no_relay (3 subtests) =================== [09:31:21] [PASSED] xe_drops_guc2pf_if_not_ready [09:31:21] [PASSED] xe_drops_guc2vf_if_not_ready [09:31:21] [PASSED] xe_rejects_send_if_not_ready [09:31:21] ==================== [PASSED] no_relay ===================== [09:31:21] ================== pf_relay (14 subtests) ================== [09:31:21] [PASSED] pf_rejects_guc2pf_too_short [09:31:21] [PASSED] pf_rejects_guc2pf_too_long [09:31:21] [PASSED] pf_rejects_guc2pf_no_payload [09:31:21] [PASSED] pf_fails_no_payload [09:31:21] [PASSED] pf_fails_bad_origin [09:31:21] [PASSED] pf_fails_bad_type [09:31:21] [PASSED] pf_txn_reports_error [09:31:21] [PASSED] pf_txn_sends_pf2guc [09:31:21] [PASSED] pf_sends_pf2guc [09:31:21] [SKIPPED] pf_loopback_nop [09:31:21] [SKIPPED] pf_loopback_echo [09:31:21] [SKIPPED] pf_loopback_fail [09:31:21] [SKIPPED] pf_loopback_busy [09:31:21] [SKIPPED] pf_loopback_retry [09:31:21] ==================== [PASSED] pf_relay ===================== [09:31:21] ================== vf_relay (3 subtests) =================== [09:31:21] [PASSED] vf_rejects_guc2vf_too_short [09:31:21] [PASSED] vf_rejects_guc2vf_too_long [09:31:21] [PASSED] vf_rejects_guc2vf_no_payload [09:31:21] ==================== [PASSED] vf_relay ===================== [09:31:21] ================ pf_gt_config (9 subtests) ================= [09:31:21] [PASSED] fair_contexts_1vf [09:31:21] [PASSED] fair_doorbells_1vf [09:31:21] [PASSED] fair_ggtt_1vf [09:31:21] ====================== fair_vram_1vf ====================== [09:31:21] [PASSED] 3.50 GiB [09:31:21] [PASSED] 11.5 GiB [09:31:21] [PASSED] 15.5 GiB [09:31:21] [PASSED] 31.5 GiB [09:31:21] [PASSED] 63.5 GiB [09:31:21] [PASSED] 1.91 GiB [09:31:21] ================== [PASSED] fair_vram_1vf ================== [09:31:21] ================ fair_vram_1vf_admin_only ================= [09:31:21] [PASSED] 3.50 GiB [09:31:21] [PASSED] 11.5 GiB [09:31:21] [PASSED] 15.5 GiB [09:31:21] [PASSED] 31.5 GiB [09:31:21] [PASSED] 63.5 GiB [09:31:21] [PASSED] 1.91 GiB [09:31:21] ============ [PASSED] fair_vram_1vf_admin_only ============= [09:31:21] ====================== fair_contexts ====================== [09:31:21] [PASSED] 1 VF [09:31:21] [PASSED] 2 VFs [09:31:21] [PASSED] 3 VFs [09:31:21] [PASSED] 4 VFs [09:31:21] [PASSED] 5 VFs [09:31:21] [PASSED] 6 VFs [09:31:21] [PASSED] 7 VFs [09:31:21] [PASSED] 8 VFs [09:31:21] [PASSED] 9 VFs [09:31:21] [PASSED] 10 VFs [09:31:21] [PASSED] 11 VFs [09:31:21] [PASSED] 12 VFs [09:31:21] [PASSED] 13 VFs [09:31:21] [PASSED] 14 VFs [09:31:21] [PASSED] 15 VFs [09:31:21] [PASSED] 16 VFs [09:31:21] [PASSED] 17 VFs [09:31:21] [PASSED] 18 VFs [09:31:21] [PASSED] 19 VFs [09:31:21] [PASSED] 20 VFs [09:31:21] [PASSED] 21 VFs [09:31:21] [PASSED] 22 VFs [09:31:21] [PASSED] 23 VFs [09:31:21] [PASSED] 24 VFs [09:31:21] [PASSED] 25 VFs [09:31:21] [PASSED] 26 VFs [09:31:21] [PASSED] 27 VFs [09:31:21] [PASSED] 28 VFs [09:31:21] [PASSED] 29 VFs [09:31:21] [PASSED] 30 VFs [09:31:21] [PASSED] 31 VFs [09:31:21] [PASSED] 32 VFs [09:31:21] [PASSED] 33 VFs [09:31:21] [PASSED] 34 VFs [09:31:21] [PASSED] 35 VFs [09:31:21] [PASSED] 36 VFs [09:31:21] [PASSED] 37 VFs [09:31:21] [PASSED] 38 VFs [09:31:21] [PASSED] 39 VFs [09:31:21] [PASSED] 40 VFs [09:31:21] [PASSED] 41 VFs [09:31:21] [PASSED] 42 VFs [09:31:21] [PASSED] 43 VFs [09:31:21] [PASSED] 44 VFs [09:31:21] [PASSED] 45 VFs [09:31:21] [PASSED] 46 VFs [09:31:21] [PASSED] 47 VFs [09:31:21] [PASSED] 48 VFs [09:31:21] [PASSED] 49 VFs [09:31:21] [PASSED] 50 VFs [09:31:21] [PASSED] 51 VFs [09:31:21] [PASSED] 52 VFs [09:31:21] [PASSED] 53 VFs [09:31:21] [PASSED] 54 VFs [09:31:21] [PASSED] 55 VFs [09:31:21] [PASSED] 56 VFs [09:31:21] [PASSED] 57 VFs [09:31:21] [PASSED] 58 VFs [09:31:21] [PASSED] 59 VFs [09:31:21] [PASSED] 60 VFs [09:31:21] [PASSED] 61 VFs [09:31:21] [PASSED] 62 VFs [09:31:21] [PASSED] 63 VFs [09:31:21] ================== [PASSED] fair_contexts ================== [09:31:21] ===================== fair_doorbells ====================== [09:31:21] [PASSED] 1 VF [09:31:21] [PASSED] 2 VFs [09:31:21] [PASSED] 3 VFs [09:31:21] [PASSED] 4 VFs [09:31:21] [PASSED] 5 VFs [09:31:21] [PASSED] 6 VFs [09:31:21] [PASSED] 7 VFs [09:31:21] [PASSED] 8 VFs [09:31:21] [PASSED] 9 VFs [09:31:21] [PASSED] 10 VFs [09:31:21] [PASSED] 11 VFs [09:31:21] [PASSED] 12 VFs [09:31:21] [PASSED] 13 VFs [09:31:21] [PASSED] 14 VFs [09:31:21] [PASSED] 15 VFs [09:31:21] [PASSED] 16 VFs [09:31:21] [PASSED] 17 VFs [09:31:21] [PASSED] 18 VFs [09:31:21] [PASSED] 19 VFs [09:31:21] [PASSED] 20 VFs [09:31:21] [PASSED] 21 VFs [09:31:21] [PASSED] 22 VFs [09:31:21] [PASSED] 23 VFs [09:31:21] [PASSED] 24 VFs [09:31:21] [PASSED] 25 VFs [09:31:21] [PASSED] 26 VFs [09:31:21] [PASSED] 27 VFs [09:31:21] [PASSED] 28 VFs [09:31:21] [PASSED] 29 VFs [09:31:21] [PASSED] 30 VFs [09:31:21] [PASSED] 31 VFs [09:31:21] [PASSED] 32 VFs [09:31:21] [PASSED] 33 VFs [09:31:21] [PASSED] 34 VFs [09:31:21] [PASSED] 35 VFs [09:31:21] [PASSED] 36 VFs [09:31:21] [PASSED] 37 VFs [09:31:21] [PASSED] 38 VFs [09:31:21] [PASSED] 39 VFs [09:31:21] [PASSED] 40 VFs [09:31:21] [PASSED] 41 VFs [09:31:21] [PASSED] 42 VFs [09:31:21] [PASSED] 43 VFs [09:31:21] [PASSED] 44 VFs [09:31:21] [PASSED] 45 VFs [09:31:21] [PASSED] 46 VFs [09:31:21] [PASSED] 47 VFs [09:31:21] [PASSED] 48 VFs [09:31:21] [PASSED] 49 VFs [09:31:21] [PASSED] 50 VFs [09:31:21] [PASSED] 51 VFs [09:31:21] [PASSED] 52 VFs [09:31:21] [PASSED] 53 VFs [09:31:21] [PASSED] 54 VFs [09:31:21] [PASSED] 55 VFs [09:31:21] [PASSED] 56 VFs [09:31:21] [PASSED] 57 VFs [09:31:21] [PASSED] 58 VFs [09:31:21] [PASSED] 59 VFs [09:31:21] [PASSED] 60 VFs [09:31:21] [PASSED] 61 VFs [09:31:21] [PASSED] 62 VFs [09:31:21] [PASSED] 63 VFs [09:31:21] ================= [PASSED] fair_doorbells ================== [09:31:21] ======================== fair_ggtt ======================== [09:31:21] [PASSED] 1 VF [09:31:21] [PASSED] 2 VFs [09:31:21] [PASSED] 3 VFs [09:31:21] [PASSED] 4 VFs [09:31:21] [PASSED] 5 VFs [09:31:21] [PASSED] 6 VFs [09:31:21] [PASSED] 7 VFs [09:31:21] [PASSED] 8 VFs [09:31:21] [PASSED] 9 VFs [09:31:21] [PASSED] 10 VFs [09:31:21] [PASSED] 11 VFs [09:31:21] [PASSED] 12 VFs [09:31:21] [PASSED] 13 VFs [09:31:21] [PASSED] 14 VFs [09:31:21] [PASSED] 15 VFs [09:31:21] [PASSED] 16 VFs [09:31:21] [PASSED] 17 VFs [09:31:21] [PASSED] 18 VFs [09:31:21] [PASSED] 19 VFs [09:31:21] [PASSED] 20 VFs [09:31:21] [PASSED] 21 VFs [09:31:21] [PASSED] 22 VFs [09:31:21] [PASSED] 23 VFs [09:31:21] [PASSED] 24 VFs [09:31:21] [PASSED] 25 VFs [09:31:21] [PASSED] 26 VFs [09:31:21] [PASSED] 27 VFs [09:31:21] [PASSED] 28 VFs [09:31:21] [PASSED] 29 VFs [09:31:21] [PASSED] 30 VFs [09:31:21] [PASSED] 31 VFs [09:31:21] [PASSED] 32 VFs [09:31:21] [PASSED] 33 VFs [09:31:21] [PASSED] 34 VFs [09:31:21] [PASSED] 35 VFs [09:31:21] [PASSED] 36 VFs [09:31:21] [PASSED] 37 VFs [09:31:21] [PASSED] 38 VFs [09:31:21] [PASSED] 39 VFs [09:31:21] [PASSED] 40 VFs [09:31:21] [PASSED] 41 VFs [09:31:21] [PASSED] 42 VFs [09:31:21] [PASSED] 43 VFs [09:31:21] [PASSED] 44 VFs [09:31:21] [PASSED] 45 VFs [09:31:21] [PASSED] 46 VFs [09:31:21] [PASSED] 47 VFs [09:31:21] [PASSED] 48 VFs [09:31:21] [PASSED] 49 VFs [09:31:21] [PASSED] 50 VFs [09:31:21] [PASSED] 51 VFs [09:31:21] [PASSED] 52 VFs [09:31:21] [PASSED] 53 VFs [09:31:21] [PASSED] 54 VFs [09:31:21] [PASSED] 55 VFs [09:31:21] [PASSED] 56 VFs [09:31:21] [PASSED] 57 VFs [09:31:21] [PASSED] 58 VFs [09:31:21] [PASSED] 59 VFs [09:31:21] [PASSED] 60 VFs [09:31:21] [PASSED] 61 VFs [09:31:21] [PASSED] 62 VFs [09:31:21] [PASSED] 63 VFs [09:31:21] ==================== [PASSED] fair_ggtt ==================== [09:31:21] ======================== fair_vram ======================== [09:31:21] [PASSED] 1 VF [09:31:21] [PASSED] 2 VFs [09:31:21] [PASSED] 3 VFs [09:31:21] [PASSED] 4 VFs [09:31:21] [PASSED] 5 VFs [09:31:21] [PASSED] 6 VFs [09:31:21] [PASSED] 7 VFs [09:31:21] [PASSED] 8 VFs [09:31:21] [PASSED] 9 VFs [09:31:21] [PASSED] 10 VFs [09:31:21] [PASSED] 11 VFs [09:31:21] [PASSED] 12 VFs [09:31:21] [PASSED] 13 VFs [09:31:21] [PASSED] 14 VFs [09:31:21] [PASSED] 15 VFs [09:31:21] [PASSED] 16 VFs [09:31:21] [PASSED] 17 VFs [09:31:21] [PASSED] 18 VFs [09:31:21] [PASSED] 19 VFs [09:31:21] [PASSED] 20 VFs [09:31:21] [PASSED] 21 VFs [09:31:21] [PASSED] 22 VFs [09:31:21] [PASSED] 23 VFs [09:31:21] [PASSED] 24 VFs [09:31:21] [PASSED] 25 VFs [09:31:21] [PASSED] 26 VFs [09:31:21] [PASSED] 27 VFs [09:31:21] [PASSED] 28 VFs [09:31:21] [PASSED] 29 VFs [09:31:21] [PASSED] 30 VFs [09:31:21] [PASSED] 31 VFs [09:31:21] [PASSED] 32 VFs [09:31:21] [PASSED] 33 VFs [09:31:21] [PASSED] 34 VFs [09:31:21] [PASSED] 35 VFs [09:31:21] [PASSED] 36 VFs [09:31:21] [PASSED] 37 VFs [09:31:21] [PASSED] 38 VFs [09:31:21] [PASSED] 39 VFs [09:31:21] [PASSED] 40 VFs [09:31:21] [PASSED] 41 VFs [09:31:21] [PASSED] 42 VFs [09:31:21] [PASSED] 43 VFs [09:31:21] [PASSED] 44 VFs [09:31:21] [PASSED] 45 VFs [09:31:21] [PASSED] 46 VFs [09:31:21] [PASSED] 47 VFs [09:31:21] [PASSED] 48 VFs [09:31:21] [PASSED] 49 VFs [09:31:21] [PASSED] 50 VFs [09:31:21] [PASSED] 51 VFs [09:31:21] [PASSED] 52 VFs [09:31:21] [PASSED] 53 VFs [09:31:21] [PASSED] 54 VFs [09:31:21] [PASSED] 55 VFs [09:31:21] [PASSED] 56 VFs [09:31:21] [PASSED] 57 VFs [09:31:21] [PASSED] 58 VFs [09:31:21] [PASSED] 59 VFs [09:31:21] [PASSED] 60 VFs [09:31:21] [PASSED] 61 VFs [09:31:21] [PASSED] 62 VFs [09:31:21] [PASSED] 63 VFs [09:31:21] ==================== [PASSED] fair_vram ==================== [09:31:21] ================== [PASSED] pf_gt_config =================== [09:31:21] ===================== lmtt (1 subtest) ===================== [09:31:21] ======================== test_ops ========================= [09:31:21] [PASSED] 2-level [09:31:21] [PASSED] multi-level [09:31:21] ==================== [PASSED] test_ops ===================== [09:31:21] ====================== [PASSED] lmtt ======================= [09:31:21] ================= pf_service (11 subtests) ================= [09:31:21] [PASSED] pf_negotiate_any [09:31:21] [PASSED] pf_negotiate_base_match [09:31:21] [PASSED] pf_negotiate_base_newer [09:31:21] [PASSED] pf_negotiate_base_next [09:31:21] [SKIPPED] pf_negotiate_base_older [09:31:21] [PASSED] pf_negotiate_base_prev [09:31:21] [PASSED] pf_negotiate_latest_match [09:31:21] [PASSED] pf_negotiate_latest_newer [09:31:21] [PASSED] pf_negotiate_latest_next [09:31:21] [SKIPPED] pf_negotiate_latest_older [09:31:21] [SKIPPED] pf_negotiate_latest_prev [09:31:21] =================== [PASSED] pf_service ==================== [09:31:21] ================= xe_guc_g2g (2 subtests) ================== [09:31:21] ============== xe_live_guc_g2g_kunit_default ============== [09:31:21] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ========== [09:31:21] ============== xe_live_guc_g2g_kunit_allmem =============== [09:31:21] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ========== [09:31:21] =================== [SKIPPED] xe_guc_g2g =================== [09:31:21] =================== xe_mocs (2 subtests) =================== [09:31:21] ================ xe_live_mocs_kernel_kunit ================ [09:31:21] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============ [09:31:21] ================ xe_live_mocs_reset_kunit ================= [09:31:21] ============ [SKIPPED] xe_live_mocs_reset_kunit ============ [09:31:21] ==================== [SKIPPED] xe_mocs ===================== [09:31:21] ================= xe_migrate (2 subtests) ================== [09:31:21] ================= xe_migrate_sanity_kunit ================= [09:31:21] ============ [SKIPPED] xe_migrate_sanity_kunit ============= [09:31:21] ================== xe_validate_ccs_kunit ================== [09:31:21] ============= [SKIPPED] xe_validate_ccs_kunit ============== [09:31:21] =================== [SKIPPED] xe_migrate =================== [09:31:21] ================== xe_dma_buf (1 subtest) ================== [09:31:21] ==================== xe_dma_buf_kunit ===================== [09:31:21] ================ [SKIPPED] xe_dma_buf_kunit ================ [09:31:21] =================== [SKIPPED] xe_dma_buf =================== [09:31:21] ================= xe_bo_shrink (1 subtest) ================= [09:31:21] =================== xe_bo_shrink_kunit ==================== [09:31:21] =============== [SKIPPED] xe_bo_shrink_kunit =============== [09:31:21] ================== [SKIPPED] xe_bo_shrink ================== [09:31:21] ==================== xe_bo (2 subtests) ==================== [09:31:21] ================== xe_ccs_migrate_kunit =================== [09:31:21] ============== [SKIPPED] xe_ccs_migrate_kunit ============== [09:31:21] ==================== xe_bo_evict_kunit ==================== [09:31:21] =============== [SKIPPED] xe_bo_evict_kunit ================ [09:31:21] ===================== [SKIPPED] xe_bo ====================== [09:31:21] ==================== args (13 subtests) ==================== [09:31:21] [PASSED] count_args_test [09:31:21] [PASSED] call_args_example [09:31:21] [PASSED] call_args_test [09:31:21] [PASSED] drop_first_arg_example [09:31:21] [PASSED] drop_first_arg_test [09:31:21] [PASSED] first_arg_example [09:31:21] [PASSED] first_arg_test [09:31:21] [PASSED] last_arg_example [09:31:21] [PASSED] last_arg_test [09:31:21] [PASSED] pick_arg_example [09:31:21] [PASSED] if_args_example [09:31:21] [PASSED] if_args_test [09:31:21] [PASSED] sep_comma_example [09:31:21] ====================== [PASSED] args ======================= [09:31:21] =================== xe_pci (3 subtests) ==================== [09:31:21] ==================== check_graphics_ip ==================== [09:31:21] [PASSED] 12.00 Xe_LP [09:31:21] [PASSED] 12.10 Xe_LP+ [09:31:21] [PASSED] 12.55 Xe_HPG [09:31:21] [PASSED] 12.60 Xe_HPC [09:31:21] [PASSED] 12.70 Xe_LPG [09:31:21] [PASSED] 12.71 Xe_LPG [09:31:21] [PASSED] 12.74 Xe_LPG+ [09:31:21] [PASSED] 20.01 Xe2_HPG [09:31:21] [PASSED] 20.02 Xe2_HPG [09:31:21] [PASSED] 20.04 Xe2_LPG [09:31:21] [PASSED] 30.00 Xe3_LPG [09:31:21] [PASSED] 30.01 Xe3_LPG [09:31:21] [PASSED] 30.03 Xe3_LPG [09:31:21] [PASSED] 30.04 Xe3_LPG [09:31:21] [PASSED] 30.05 Xe3_LPG [09:31:21] [PASSED] 35.10 Xe3p_LPG [09:31:21] [PASSED] 35.11 Xe3p_XPC [09:31:21] ================ [PASSED] check_graphics_ip ================ [09:31:21] ===================== check_media_ip ====================== [09:31:21] [PASSED] 12.00 Xe_M [09:31:21] [PASSED] 12.55 Xe_HPM [09:31:21] [PASSED] 13.00 Xe_LPM+ [09:31:21] [PASSED] 13.01 Xe2_HPM [09:31:21] [PASSED] 20.00 Xe2_LPM [09:31:21] [PASSED] 30.00 Xe3_LPM [09:31:21] [PASSED] 30.02 Xe3_LPM [09:31:21] [PASSED] 35.00 Xe3p_LPM [09:31:21] [PASSED] 35.03 Xe3p_HPM [09:31:21] ================= [PASSED] check_media_ip ================== [09:31:21] =================== check_platform_desc =================== [09:31:21] [PASSED] 0x9A60 (TIGERLAKE) [09:31:21] [PASSED] 0x9A68 (TIGERLAKE) [09:31:21] [PASSED] 0x9A70 (TIGERLAKE) [09:31:21] [PASSED] 0x9A40 (TIGERLAKE) [09:31:21] [PASSED] 0x9A49 (TIGERLAKE) [09:31:21] [PASSED] 0x9A59 (TIGERLAKE) [09:31:21] [PASSED] 0x9A78 (TIGERLAKE) [09:31:21] [PASSED] 0x9AC0 (TIGERLAKE) [09:31:21] [PASSED] 0x9AC9 (TIGERLAKE) [09:31:21] [PASSED] 0x9AD9 (TIGERLAKE) [09:31:21] [PASSED] 0x9AF8 (TIGERLAKE) [09:31:21] [PASSED] 0x4C80 (ROCKETLAKE) [09:31:21] [PASSED] 0x4C8A (ROCKETLAKE) [09:31:21] [PASSED] 0x4C8B (ROCKETLAKE) [09:31:21] [PASSED] 0x4C8C (ROCKETLAKE) [09:31:21] [PASSED] 0x4C90 (ROCKETLAKE) [09:31:21] [PASSED] 0x4C9A (ROCKETLAKE) [09:31:21] [PASSED] 0x4680 (ALDERLAKE_S) [09:31:21] [PASSED] 0x4682 (ALDERLAKE_S) [09:31:21] [PASSED] 0x4688 (ALDERLAKE_S) [09:31:21] [PASSED] 0x468A (ALDERLAKE_S) [09:31:21] [PASSED] 0x468B (ALDERLAKE_S) [09:31:21] [PASSED] 0x4690 (ALDERLAKE_S) [09:31:21] [PASSED] 0x4692 (ALDERLAKE_S) [09:31:21] [PASSED] 0x4693 (ALDERLAKE_S) [09:31:21] [PASSED] 0x46A0 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46A1 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46A2 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46A3 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46A6 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46A8 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46AA (ALDERLAKE_P) [09:31:21] [PASSED] 0x462A (ALDERLAKE_P) [09:31:21] [PASSED] 0x4626 (ALDERLAKE_P) [09:31:21] [PASSED] 0x4628 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46B0 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46B1 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46B2 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46B3 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46C0 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46C1 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46C2 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46C3 (ALDERLAKE_P) [09:31:21] [PASSED] 0x46D0 (ALDERLAKE_N) [09:31:21] [PASSED] 0x46D1 (ALDERLAKE_N) [09:31:21] [PASSED] 0x46D2 (ALDERLAKE_N) [09:31:21] [PASSED] 0x46D3 (ALDERLAKE_N) [09:31:21] [PASSED] 0x46D4 (ALDERLAKE_N) [09:31:21] [PASSED] 0xA721 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7A1 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7A9 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7AC (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7AD (ALDERLAKE_P) [09:31:21] [PASSED] 0xA720 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7A0 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7A8 (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7AA (ALDERLAKE_P) [09:31:21] [PASSED] 0xA7AB (ALDERLAKE_P) [09:31:21] [PASSED] 0xA780 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA781 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA782 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA783 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA788 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA789 (ALDERLAKE_S) [09:31:21] [PASSED] 0xA78A (ALDERLAKE_S) [09:31:21] [PASSED] 0xA78B (ALDERLAKE_S) [09:31:21] [PASSED] 0x4905 (DG1) [09:31:21] [PASSED] 0x4906 (DG1) [09:31:21] [PASSED] 0x4907 (DG1) [09:31:21] [PASSED] 0x4908 (DG1) [09:31:21] [PASSED] 0x4909 (DG1) [09:31:21] [PASSED] 0x56C0 (DG2) [09:31:21] [PASSED] 0x56C2 (DG2) [09:31:21] [PASSED] 0x56C1 (DG2) [09:31:21] [PASSED] 0x7D51 (METEORLAKE) [09:31:21] [PASSED] 0x7DD1 (METEORLAKE) [09:31:21] [PASSED] 0x7D41 (METEORLAKE) [09:31:21] [PASSED] 0x7D67 (METEORLAKE) [09:31:21] [PASSED] 0xB640 (METEORLAKE) [09:31:21] [PASSED] 0x56A0 (DG2) [09:31:21] [PASSED] 0x56A1 (DG2) [09:31:21] [PASSED] 0x56A2 (DG2) [09:31:21] [PASSED] 0x56BE (DG2) [09:31:21] [PASSED] 0x56BF (DG2) [09:31:21] [PASSED] 0x5690 (DG2) [09:31:21] [PASSED] 0x5691 (DG2) [09:31:21] [PASSED] 0x5692 (DG2) [09:31:21] [PASSED] 0x56A5 (DG2) [09:31:21] [PASSED] 0x56A6 (DG2) [09:31:21] [PASSED] 0x56B0 (DG2) [09:31:21] [PASSED] 0x56B1 (DG2) [09:31:21] [PASSED] 0x56BA (DG2) [09:31:21] [PASSED] 0x56BB (DG2) [09:31:21] [PASSED] 0x56BC (DG2) [09:31:21] [PASSED] 0x56BD (DG2) [09:31:21] [PASSED] 0x5693 (DG2) [09:31:21] [PASSED] 0x5694 (DG2) [09:31:21] [PASSED] 0x5695 (DG2) [09:31:21] [PASSED] 0x56A3 (DG2) [09:31:21] [PASSED] 0x56A4 (DG2) [09:31:21] [PASSED] 0x56B2 (DG2) [09:31:21] [PASSED] 0x56B3 (DG2) [09:31:21] [PASSED] 0x5696 (DG2) [09:31:21] [PASSED] 0x5697 (DG2) [09:31:21] [PASSED] 0xB69 (PVC) [09:31:21] [PASSED] 0xB6E (PVC) [09:31:21] [PASSED] 0xBD4 (PVC) [09:31:21] [PASSED] 0xBD5 (PVC) [09:31:21] [PASSED] 0xBD6 (PVC) [09:31:21] [PASSED] 0xBD7 (PVC) [09:31:21] [PASSED] 0xBD8 (PVC) [09:31:21] [PASSED] 0xBD9 (PVC) [09:31:21] [PASSED] 0xBDA (PVC) [09:31:21] [PASSED] 0xBDB (PVC) [09:31:21] [PASSED] 0xBE0 (PVC) [09:31:21] [PASSED] 0xBE1 (PVC) [09:31:21] [PASSED] 0xBE5 (PVC) [09:31:21] [PASSED] 0x7D40 (METEORLAKE) [09:31:21] [PASSED] 0x7D45 (METEORLAKE) [09:31:21] [PASSED] 0x7D55 (METEORLAKE) [09:31:21] [PASSED] 0x7D60 (METEORLAKE) [09:31:21] [PASSED] 0x7DD5 (METEORLAKE) [09:31:21] [PASSED] 0x6420 (LUNARLAKE) [09:31:21] [PASSED] 0x64A0 (LUNARLAKE) [09:31:21] [PASSED] 0x64B0 (LUNARLAKE) [09:31:21] [PASSED] 0xE202 (BATTLEMAGE) [09:31:21] [PASSED] 0xE209 (BATTLEMAGE) [09:31:21] [PASSED] 0xE20B (BATTLEMAGE) [09:31:21] [PASSED] 0xE20C (BATTLEMAGE) [09:31:21] [PASSED] 0xE20D (BATTLEMAGE) [09:31:21] [PASSED] 0xE210 (BATTLEMAGE) [09:31:21] [PASSED] 0xE211 (BATTLEMAGE) [09:31:21] [PASSED] 0xE212 (BATTLEMAGE) [09:31:21] [PASSED] 0xE216 (BATTLEMAGE) [09:31:21] [PASSED] 0xE220 (BATTLEMAGE) [09:31:21] [PASSED] 0xE221 (BATTLEMAGE) [09:31:21] [PASSED] 0xE222 (BATTLEMAGE) [09:31:21] [PASSED] 0xE223 (BATTLEMAGE) [09:31:21] [PASSED] 0xB080 (PANTHERLAKE) [09:31:21] [PASSED] 0xB081 (PANTHERLAKE) [09:31:21] [PASSED] 0xB082 (PANTHERLAKE) [09:31:21] [PASSED] 0xB083 (PANTHERLAKE) [09:31:21] [PASSED] 0xB084 (PANTHERLAKE) [09:31:21] [PASSED] 0xB085 (PANTHERLAKE) [09:31:21] [PASSED] 0xB086 (PANTHERLAKE) [09:31:21] [PASSED] 0xB087 (PANTHERLAKE) [09:31:21] [PASSED] 0xB08F (PANTHERLAKE) [09:31:21] [PASSED] 0xB090 (PANTHERLAKE) [09:31:21] [PASSED] 0xB0A0 (PANTHERLAKE) [09:31:21] [PASSED] 0xB0B0 (PANTHERLAKE) [09:31:21] [PASSED] 0xFD80 (PANTHERLAKE) [09:31:21] [PASSED] 0xFD81 (PANTHERLAKE) [09:31:21] [PASSED] 0xD740 (NOVALAKE_S) [09:31:21] [PASSED] 0xD741 (NOVALAKE_S) [09:31:21] [PASSED] 0xD742 (NOVALAKE_S) [09:31:21] [PASSED] 0xD743 (NOVALAKE_S) [09:31:21] [PASSED] 0xD744 (NOVALAKE_S) [09:31:21] [PASSED] 0xD745 (NOVALAKE_S) [09:31:21] [PASSED] 0x674C (CRESCENTISLAND) [09:31:21] [PASSED] 0xD750 (NOVALAKE_P) [09:31:21] [PASSED] 0xD751 (NOVALAKE_P) [09:31:21] [PASSED] 0xD752 (NOVALAKE_P) [09:31:21] [PASSED] 0xD753 (NOVALAKE_P) [09:31:21] [PASSED] 0xD754 (NOVALAKE_P) [09:31:21] [PASSED] 0xD755 (NOVALAKE_P) [09:31:21] [PASSED] 0xD756 (NOVALAKE_P) [09:31:21] [PASSED] 0xD757 (NOVALAKE_P) [09:31:21] [PASSED] 0xD75F (NOVALAKE_P) [09:31:21] =============== [PASSED] check_platform_desc =============== [09:31:21] ===================== [PASSED] xe_pci ====================== [09:31:21] =================== xe_rtp (2 subtests) ==================== [09:31:21] =============== xe_rtp_process_to_sr_tests ================ [09:31:21] [PASSED] coalesce-same-reg [09:31:21] [PASSED] no-match-no-add [09:31:21] [PASSED] match-or [09:31:21] [PASSED] match-or-xfail [09:31:21] [PASSED] no-match-no-add-multiple-rules [09:31:21] [PASSED] two-regs-two-entries [09:31:21] [PASSED] clr-one-set-other [09:31:21] [PASSED] set-field [09:31:21] [PASSED] conflict-duplicate [09:31:21] [PASSED] conflict-not-disjoint [09:31:21] [PASSED] conflict-reg-type [09:31:21] =========== [PASSED] xe_rtp_process_to_sr_tests ============ [09:31:21] ================== xe_rtp_process_tests =================== [09:31:21] [PASSED] active1 [09:31:21] [PASSED] active2 [09:31:21] [PASSED] active-inactive [09:31:21] [PASSED] inactive-active [09:31:21] [PASSED] inactive-1st_or_active-inactive [09:31:21] [PASSED] inactive-2nd_or_active-inactive [09:31:21] [PASSED] inactive-last_or_active-inactive [09:31:21] [PASSED] inactive-no_or_active-inactive [09:31:21] ============== [PASSED] xe_rtp_process_tests =============== [09:31:21] ===================== [PASSED] xe_rtp ====================== [09:31:21] ==================== xe_wa (1 subtest) ===================== [09:31:22] ======================== xe_wa_gt ========================= [09:31:22] [PASSED] TIGERLAKE B0 [09:31:22] [PASSED] DG1 A0 [09:31:22] [PASSED] DG1 B0 [09:31:22] [PASSED] ALDERLAKE_S A0 [09:31:22] [PASSED] ALDERLAKE_S B0 [09:31:22] [PASSED] ALDERLAKE_S C0 [09:31:22] [PASSED] ALDERLAKE_S D0 [09:31:22] [PASSED] ALDERLAKE_P A0 [09:31:22] [PASSED] ALDERLAKE_P B0 [09:31:22] [PASSED] ALDERLAKE_P C0 [09:31:22] [PASSED] ALDERLAKE_S RPLS D0 [09:31:22] [PASSED] ALDERLAKE_P RPLU E0 [09:31:22] [PASSED] DG2 G10 C0 [09:31:22] [PASSED] DG2 G11 B1 [09:31:22] [PASSED] DG2 G12 A1 [09:31:22] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0 [09:31:22] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0 [09:31:22] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0 [09:31:22] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0 [09:31:22] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0 [09:31:22] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1 [09:31:22] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0 [09:31:22] ==================== [PASSED] xe_wa_gt ===================== [09:31:22] ====================== [PASSED] xe_wa ====================== [09:31:22] ============================================================ [09:31:22] Testing complete. Ran 597 tests: passed: 579, skipped: 18 [09:31:22] Elapsed time: 68.632s total, 11.605s configuring, 55.552s building, 1.412s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig [09:31:22] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:31:26] 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=25 [09:32:14] Starting KUnit Kernel (1/1)... [09:32:14] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:32:14] ============ drm_test_pick_cmdline (2 subtests) ============ [09:32:14] [PASSED] drm_test_pick_cmdline_res_1920_1080_60 [09:32:14] =============== drm_test_pick_cmdline_named =============== [09:32:14] [PASSED] NTSC [09:32:14] [PASSED] NTSC-J [09:32:14] [PASSED] PAL [09:32:14] [PASSED] PAL-M [09:32:14] =========== [PASSED] drm_test_pick_cmdline_named =========== [09:32:14] ============== [PASSED] drm_test_pick_cmdline ============== [09:32:14] == drm_test_atomic_get_connector_for_encoder (1 subtest) === [09:32:14] [PASSED] drm_test_drm_atomic_get_connector_for_encoder [09:32:14] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ==== [09:32:14] =========== drm_validate_clone_mode (2 subtests) =========== [09:32:14] ============== drm_test_check_in_clone_mode =============== [09:32:14] [PASSED] in_clone_mode [09:32:14] [PASSED] not_in_clone_mode [09:32:14] ========== [PASSED] drm_test_check_in_clone_mode =========== [09:32:14] =============== drm_test_check_valid_clones =============== [09:32:14] [PASSED] not_in_clone_mode [09:32:14] [PASSED] valid_clone [09:32:14] [PASSED] invalid_clone [09:32:14] =========== [PASSED] drm_test_check_valid_clones =========== [09:32:14] ============= [PASSED] drm_validate_clone_mode ============= [09:32:14] ============= drm_validate_modeset (1 subtest) ============= [09:32:14] [PASSED] drm_test_check_connector_changed_modeset [09:32:14] ============== [PASSED] drm_validate_modeset =============== [09:32:14] ====== drm_test_bridge_get_current_state (2 subtests) ====== [09:32:14] [PASSED] drm_test_drm_bridge_get_current_state_atomic [09:32:14] [PASSED] drm_test_drm_bridge_get_current_state_legacy [09:32:14] ======== [PASSED] drm_test_bridge_get_current_state ======== [09:32:14] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ====== [09:32:14] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic [09:32:14] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled [09:32:14] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy [09:32:14] ======== [PASSED] drm_test_bridge_helper_reset_crtc ======== [09:32:14] ============== drm_bridge_alloc (2 subtests) =============== [09:32:14] [PASSED] drm_test_drm_bridge_alloc_basic [09:32:14] [PASSED] drm_test_drm_bridge_alloc_get_put [09:32:14] ================ [PASSED] drm_bridge_alloc ================= [09:32:14] ============= drm_cmdline_parser (40 subtests) ============= [09:32:14] [PASSED] drm_test_cmdline_force_d_only [09:32:14] [PASSED] drm_test_cmdline_force_D_only_dvi [09:32:14] [PASSED] drm_test_cmdline_force_D_only_hdmi [09:32:14] [PASSED] drm_test_cmdline_force_D_only_not_digital [09:32:14] [PASSED] drm_test_cmdline_force_e_only [09:32:14] [PASSED] drm_test_cmdline_res [09:32:14] [PASSED] drm_test_cmdline_res_vesa [09:32:14] [PASSED] drm_test_cmdline_res_vesa_rblank [09:32:14] [PASSED] drm_test_cmdline_res_rblank [09:32:14] [PASSED] drm_test_cmdline_res_bpp [09:32:14] [PASSED] drm_test_cmdline_res_refresh [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_margins [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital [09:32:14] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on [09:32:14] [PASSED] drm_test_cmdline_res_margins_force_on [09:32:14] [PASSED] drm_test_cmdline_res_vesa_margins [09:32:14] [PASSED] drm_test_cmdline_name [09:32:14] [PASSED] drm_test_cmdline_name_bpp [09:32:14] [PASSED] drm_test_cmdline_name_option [09:32:14] [PASSED] drm_test_cmdline_name_bpp_option [09:32:14] [PASSED] drm_test_cmdline_rotate_0 [09:32:14] [PASSED] drm_test_cmdline_rotate_90 [09:32:14] [PASSED] drm_test_cmdline_rotate_180 [09:32:14] [PASSED] drm_test_cmdline_rotate_270 [09:32:14] [PASSED] drm_test_cmdline_hmirror [09:32:14] [PASSED] drm_test_cmdline_vmirror [09:32:14] [PASSED] drm_test_cmdline_margin_options [09:32:14] [PASSED] drm_test_cmdline_multiple_options [09:32:14] [PASSED] drm_test_cmdline_bpp_extra_and_option [09:32:14] [PASSED] drm_test_cmdline_extra_and_option [09:32:14] [PASSED] drm_test_cmdline_freestanding_options [09:32:14] [PASSED] drm_test_cmdline_freestanding_force_e_and_options [09:32:14] [PASSED] drm_test_cmdline_panel_orientation [09:32:14] ================ drm_test_cmdline_invalid ================= [09:32:14] [PASSED] margin_only [09:32:14] [PASSED] interlace_only [09:32:14] [PASSED] res_missing_x [09:32:14] [PASSED] res_missing_y [09:32:14] [PASSED] res_bad_y [09:32:14] [PASSED] res_missing_y_bpp [09:32:14] [PASSED] res_bad_bpp [09:32:14] [PASSED] res_bad_refresh [09:32:14] [PASSED] res_bpp_refresh_force_on_off [09:32:14] [PASSED] res_invalid_mode [09:32:14] [PASSED] res_bpp_wrong_place_mode [09:32:14] [PASSED] name_bpp_refresh [09:32:14] [PASSED] name_refresh [09:32:14] [PASSED] name_refresh_wrong_mode [09:32:14] [PASSED] name_refresh_invalid_mode [09:32:14] [PASSED] rotate_multiple [09:32:14] [PASSED] rotate_invalid_val [09:32:14] [PASSED] rotate_truncated [09:32:14] [PASSED] invalid_option [09:32:14] [PASSED] invalid_tv_option [09:32:14] [PASSED] truncated_tv_option [09:32:14] ============ [PASSED] drm_test_cmdline_invalid ============= [09:32:14] =============== drm_test_cmdline_tv_options =============== [09:32:14] [PASSED] NTSC [09:32:14] [PASSED] NTSC_443 [09:32:14] [PASSED] NTSC_J [09:32:14] [PASSED] PAL [09:32:14] [PASSED] PAL_M [09:32:14] [PASSED] PAL_N [09:32:14] [PASSED] SECAM [09:32:14] [PASSED] MONO_525 [09:32:14] [PASSED] MONO_625 [09:32:14] =========== [PASSED] drm_test_cmdline_tv_options =========== [09:32:14] =============== [PASSED] drm_cmdline_parser ================ [09:32:14] ========== drmm_connector_hdmi_init (20 subtests) ========== [09:32:14] [PASSED] drm_test_connector_hdmi_init_valid [09:32:14] [PASSED] drm_test_connector_hdmi_init_bpc_8 [09:32:14] [PASSED] drm_test_connector_hdmi_init_bpc_10 [09:32:14] [PASSED] drm_test_connector_hdmi_init_bpc_12 [09:32:14] [PASSED] drm_test_connector_hdmi_init_bpc_invalid [09:32:14] [PASSED] drm_test_connector_hdmi_init_bpc_null [09:32:14] [PASSED] drm_test_connector_hdmi_init_formats_empty [09:32:14] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb [09:32:14] === drm_test_connector_hdmi_init_formats_yuv420_allowed === [09:32:14] [PASSED] supported_formats=0x9 yuv420_allowed=1 [09:32:14] [PASSED] supported_formats=0x9 yuv420_allowed=0 [09:32:14] [PASSED] supported_formats=0x5 yuv420_allowed=1 [09:32:14] [PASSED] supported_formats=0x5 yuv420_allowed=0 [09:32:14] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed === [09:32:14] [PASSED] drm_test_connector_hdmi_init_null_ddc [09:32:14] [PASSED] drm_test_connector_hdmi_init_null_product [09:32:14] [PASSED] drm_test_connector_hdmi_init_null_vendor [09:32:14] [PASSED] drm_test_connector_hdmi_init_product_length_exact [09:32:14] [PASSED] drm_test_connector_hdmi_init_product_length_too_long [09:32:14] [PASSED] drm_test_connector_hdmi_init_product_valid [09:32:14] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact [09:32:14] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long [09:32:14] [PASSED] drm_test_connector_hdmi_init_vendor_valid [09:32:14] ========= drm_test_connector_hdmi_init_type_valid ========= [09:32:14] [PASSED] HDMI-A [09:32:14] [PASSED] HDMI-B [09:32:14] ===== [PASSED] drm_test_connector_hdmi_init_type_valid ===== [09:32:14] ======== drm_test_connector_hdmi_init_type_invalid ======== [09:32:14] [PASSED] Unknown [09:32:14] [PASSED] VGA [09:32:14] [PASSED] DVI-I [09:32:14] [PASSED] DVI-D [09:32:14] [PASSED] DVI-A [09:32:14] [PASSED] Composite [09:32:14] [PASSED] SVIDEO [09:32:14] [PASSED] LVDS [09:32:14] [PASSED] Component [09:32:14] [PASSED] DIN [09:32:14] [PASSED] DP [09:32:14] [PASSED] TV [09:32:14] [PASSED] eDP [09:32:14] [PASSED] Virtual [09:32:14] [PASSED] DSI [09:32:14] [PASSED] DPI [09:32:14] [PASSED] Writeback [09:32:14] [PASSED] SPI [09:32:14] [PASSED] USB [09:32:14] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ==== [09:32:14] ============ [PASSED] drmm_connector_hdmi_init ============= [09:32:14] ============= drmm_connector_init (3 subtests) ============= [09:32:14] [PASSED] drm_test_drmm_connector_init [09:32:14] [PASSED] drm_test_drmm_connector_init_null_ddc [09:32:14] ========= drm_test_drmm_connector_init_type_valid ========= [09:32:14] [PASSED] Unknown [09:32:14] [PASSED] VGA [09:32:14] [PASSED] DVI-I [09:32:14] [PASSED] DVI-D [09:32:14] [PASSED] DVI-A [09:32:14] [PASSED] Composite [09:32:14] [PASSED] SVIDEO [09:32:14] [PASSED] LVDS [09:32:14] [PASSED] Component [09:32:14] [PASSED] DIN [09:32:14] [PASSED] DP [09:32:14] [PASSED] HDMI-A [09:32:14] [PASSED] HDMI-B [09:32:14] [PASSED] TV [09:32:14] [PASSED] eDP [09:32:14] [PASSED] Virtual [09:32:14] [PASSED] DSI [09:32:14] [PASSED] DPI [09:32:14] [PASSED] Writeback [09:32:14] [PASSED] SPI [09:32:14] [PASSED] USB [09:32:14] ===== [PASSED] drm_test_drmm_connector_init_type_valid ===== [09:32:14] =============== [PASSED] drmm_connector_init =============== [09:32:14] ========= drm_connector_dynamic_init (6 subtests) ========== [09:32:14] [PASSED] drm_test_drm_connector_dynamic_init [09:32:14] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc [09:32:14] [PASSED] drm_test_drm_connector_dynamic_init_not_added [09:32:14] [PASSED] drm_test_drm_connector_dynamic_init_properties [09:32:14] ===== drm_test_drm_connector_dynamic_init_type_valid ====== [09:32:14] [PASSED] Unknown [09:32:14] [PASSED] VGA [09:32:14] [PASSED] DVI-I [09:32:14] [PASSED] DVI-D [09:32:14] [PASSED] DVI-A [09:32:14] [PASSED] Composite [09:32:14] [PASSED] SVIDEO [09:32:14] [PASSED] LVDS [09:32:14] [PASSED] Component [09:32:14] [PASSED] DIN [09:32:14] [PASSED] DP [09:32:14] [PASSED] HDMI-A [09:32:14] [PASSED] HDMI-B [09:32:14] [PASSED] TV [09:32:14] [PASSED] eDP [09:32:14] [PASSED] Virtual [09:32:14] [PASSED] DSI [09:32:14] [PASSED] DPI [09:32:14] [PASSED] Writeback [09:32:14] [PASSED] SPI [09:32:14] [PASSED] USB [09:32:14] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid == [09:32:14] ======== drm_test_drm_connector_dynamic_init_name ========= [09:32:14] [PASSED] Unknown [09:32:14] [PASSED] VGA [09:32:14] [PASSED] DVI-I [09:32:14] [PASSED] DVI-D [09:32:14] [PASSED] DVI-A [09:32:14] [PASSED] Composite [09:32:14] [PASSED] SVIDEO [09:32:14] [PASSED] LVDS [09:32:14] [PASSED] Component [09:32:14] [PASSED] DIN [09:32:14] [PASSED] DP [09:32:14] [PASSED] HDMI-A [09:32:14] [PASSED] HDMI-B [09:32:14] [PASSED] TV [09:32:14] [PASSED] eDP [09:32:14] [PASSED] Virtual [09:32:14] [PASSED] DSI [09:32:14] [PASSED] DPI [09:32:14] [PASSED] Writeback [09:32:14] [PASSED] SPI [09:32:14] [PASSED] USB [09:32:14] ==== [PASSED] drm_test_drm_connector_dynamic_init_name ===== [09:32:14] =========== [PASSED] drm_connector_dynamic_init ============ [09:32:14] ==== drm_connector_dynamic_register_early (4 subtests) ===== [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_early_defer [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object [09:32:14] ====== [PASSED] drm_connector_dynamic_register_early ======= [09:32:14] ======= drm_connector_dynamic_register (7 subtests) ======== [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_on_list [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_no_defer [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_no_init [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_mode_object [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_sysfs [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name [09:32:14] [PASSED] drm_test_drm_connector_dynamic_register_debugfs [09:32:14] ========= [PASSED] drm_connector_dynamic_register ========== [09:32:14] = drm_connector_attach_broadcast_rgb_property (2 subtests) = [09:32:14] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property [09:32:14] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector [09:32:14] === [PASSED] drm_connector_attach_broadcast_rgb_property === [09:32:14] ========== drm_get_tv_mode_from_name (2 subtests) ========== [09:32:14] ========== drm_test_get_tv_mode_from_name_valid =========== [09:32:14] [PASSED] NTSC [09:32:14] [PASSED] NTSC-443 [09:32:14] [PASSED] NTSC-J [09:32:14] [PASSED] PAL [09:32:14] [PASSED] PAL-M [09:32:14] [PASSED] PAL-N [09:32:14] [PASSED] SECAM [09:32:14] [PASSED] Mono [09:32:14] ====== [PASSED] drm_test_get_tv_mode_from_name_valid ======= [09:32:14] [PASSED] drm_test_get_tv_mode_from_name_truncated [09:32:14] ============ [PASSED] drm_get_tv_mode_from_name ============ [09:32:14] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) = [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1 [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1 [09:32:14] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double [09:32:14] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid = [09:32:14] [PASSED] VIC 96 [09:32:14] [PASSED] VIC 97 [09:32:14] [PASSED] VIC 101 [09:32:14] [PASSED] VIC 102 [09:32:14] [PASSED] VIC 106 [09:32:14] [PASSED] VIC 107 [09:32:14] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid === [09:32:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc [09:32:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc [09:32:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc [09:32:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc [09:32:14] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc [09:32:14] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ==== [09:32:14] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) == [09:32:14] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ==== [09:32:14] [PASSED] Automatic [09:32:14] [PASSED] Full [09:32:14] [PASSED] Limited 16:235 [09:32:14] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name === [09:32:14] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid [09:32:14] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ==== [09:32:14] == drm_hdmi_connector_get_output_format_name (2 subtests) == [09:32:14] === drm_test_drm_hdmi_connector_get_output_format_name ==== [09:32:14] [PASSED] RGB [09:32:14] [PASSED] YUV 4:2:0 [09:32:14] [PASSED] YUV 4:2:2 [09:32:14] [PASSED] YUV 4:4:4 [09:32:14] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name === [09:32:14] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid [09:32:14] ==== [PASSED] drm_hdmi_connector_get_output_format_name ==== [09:32:14] ============= drm_damage_helper (21 subtests) ============== [09:32:14] [PASSED] drm_test_damage_iter_no_damage [09:32:14] [PASSED] drm_test_damage_iter_no_damage_fractional_src [09:32:14] [PASSED] drm_test_damage_iter_no_damage_src_moved [09:32:14] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved [09:32:14] [PASSED] drm_test_damage_iter_no_damage_not_visible [09:32:14] [PASSED] drm_test_damage_iter_no_damage_no_crtc [09:32:14] [PASSED] drm_test_damage_iter_no_damage_no_fb [09:32:14] [PASSED] drm_test_damage_iter_simple_damage [09:32:14] [PASSED] drm_test_damage_iter_single_damage [09:32:14] [PASSED] drm_test_damage_iter_single_damage_intersect_src [09:32:14] [PASSED] drm_test_damage_iter_single_damage_outside_src [09:32:14] [PASSED] drm_test_damage_iter_single_damage_fractional_src [09:32:14] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src [09:32:14] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src [09:32:14] [PASSED] drm_test_damage_iter_single_damage_src_moved [09:32:14] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved [09:32:14] [PASSED] drm_test_damage_iter_damage [09:32:14] [PASSED] drm_test_damage_iter_damage_one_intersect [09:32:14] [PASSED] drm_test_damage_iter_damage_one_outside [09:32:14] [PASSED] drm_test_damage_iter_damage_src_moved [09:32:14] [PASSED] drm_test_damage_iter_damage_not_visible [09:32:14] ================ [PASSED] drm_damage_helper ================ [09:32:14] ============== drm_dp_mst_helper (3 subtests) ============== [09:32:14] ============== drm_test_dp_mst_calc_pbn_mode ============== [09:32:14] [PASSED] Clock 154000 BPP 30 DSC disabled [09:32:14] [PASSED] Clock 234000 BPP 30 DSC disabled [09:32:14] [PASSED] Clock 297000 BPP 24 DSC disabled [09:32:14] [PASSED] Clock 332880 BPP 24 DSC enabled [09:32:14] [PASSED] Clock 324540 BPP 24 DSC enabled [09:32:14] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ========== [09:32:14] ============== drm_test_dp_mst_calc_pbn_div =============== [09:32:14] [PASSED] Link rate 2000000 lane count 4 [09:32:14] [PASSED] Link rate 2000000 lane count 2 [09:32:14] [PASSED] Link rate 2000000 lane count 1 [09:32:14] [PASSED] Link rate 1350000 lane count 4 [09:32:14] [PASSED] Link rate 1350000 lane count 2 [09:32:14] [PASSED] Link rate 1350000 lane count 1 [09:32:14] [PASSED] Link rate 1000000 lane count 4 [09:32:14] [PASSED] Link rate 1000000 lane count 2 [09:32:14] [PASSED] Link rate 1000000 lane count 1 [09:32:14] [PASSED] Link rate 810000 lane count 4 [09:32:14] [PASSED] Link rate 810000 lane count 2 [09:32:14] [PASSED] Link rate 810000 lane count 1 [09:32:14] [PASSED] Link rate 540000 lane count 4 [09:32:14] [PASSED] Link rate 540000 lane count 2 [09:32:14] [PASSED] Link rate 540000 lane count 1 [09:32:14] [PASSED] Link rate 270000 lane count 4 [09:32:14] [PASSED] Link rate 270000 lane count 2 [09:32:14] [PASSED] Link rate 270000 lane count 1 [09:32:14] [PASSED] Link rate 162000 lane count 4 [09:32:14] [PASSED] Link rate 162000 lane count 2 [09:32:14] [PASSED] Link rate 162000 lane count 1 [09:32:14] ========== [PASSED] drm_test_dp_mst_calc_pbn_div =========== [09:32:14] ========= drm_test_dp_mst_sideband_msg_req_decode ========= [09:32:14] [PASSED] DP_ENUM_PATH_RESOURCES with port number [09:32:14] [PASSED] DP_POWER_UP_PHY with port number [09:32:14] [PASSED] DP_POWER_DOWN_PHY with port number [09:32:14] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks [09:32:14] [PASSED] DP_ALLOCATE_PAYLOAD with port number [09:32:14] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI [09:32:14] [PASSED] DP_ALLOCATE_PAYLOAD with PBN [09:32:14] [PASSED] DP_QUERY_PAYLOAD with port number [09:32:14] [PASSED] DP_QUERY_PAYLOAD with VCPI [09:32:14] [PASSED] DP_REMOTE_DPCD_READ with port number [09:32:14] [PASSED] DP_REMOTE_DPCD_READ with DPCD address [09:32:14] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes [09:32:14] [PASSED] DP_REMOTE_DPCD_WRITE with port number [09:32:14] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address [09:32:14] [PASSED] DP_REMOTE_DPCD_WRITE with data array [09:32:14] [PASSED] DP_REMOTE_I2C_READ with port number [09:32:14] [PASSED] DP_REMOTE_I2C_READ with I2C device ID [09:32:14] [PASSED] DP_REMOTE_I2C_READ with transactions array [09:32:14] [PASSED] DP_REMOTE_I2C_WRITE with port number [09:32:14] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID [09:32:14] [PASSED] DP_REMOTE_I2C_WRITE with data array [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior [09:32:14] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior [09:32:14] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode ===== [09:32:14] ================ [PASSED] drm_dp_mst_helper ================ [09:32:14] ================== drm_exec (7 subtests) =================== [09:32:14] [PASSED] sanitycheck [09:32:14] [PASSED] test_lock [09:32:14] [PASSED] test_lock_unlock [09:32:14] [PASSED] test_duplicates [09:32:14] [PASSED] test_prepare [09:32:14] [PASSED] test_prepare_array [09:32:14] [PASSED] test_multiple_loops [09:32:14] ==================== [PASSED] drm_exec ===================== [09:32:14] =========== drm_format_helper_test (17 subtests) =========== [09:32:14] ============== drm_test_fb_xrgb8888_to_gray8 ============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ========== [09:32:14] ============= drm_test_fb_xrgb8888_to_rgb332 ============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ========== [09:32:14] ============= drm_test_fb_xrgb8888_to_rgb565 ============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ========== [09:32:14] ============ drm_test_fb_xrgb8888_to_xrgb1555 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 ========= [09:32:14] ============ drm_test_fb_xrgb8888_to_argb1555 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 ========= [09:32:14] ============ drm_test_fb_xrgb8888_to_rgba5551 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 ========= [09:32:14] ============= drm_test_fb_xrgb8888_to_rgb888 ============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ========== [09:32:14] ============= drm_test_fb_xrgb8888_to_bgr888 ============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ========== [09:32:14] ============ drm_test_fb_xrgb8888_to_argb8888 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 ========= [09:32:14] =========== drm_test_fb_xrgb8888_to_xrgb2101010 =========== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 ======= [09:32:14] =========== drm_test_fb_xrgb8888_to_argb2101010 =========== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 ======= [09:32:14] ============== drm_test_fb_xrgb8888_to_mono =============== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ========== [PASSED] drm_test_fb_xrgb8888_to_mono =========== [09:32:14] ==================== drm_test_fb_swab ===================== [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ================ [PASSED] drm_test_fb_swab ================= [09:32:14] ============ drm_test_fb_xrgb8888_to_xbgr8888 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 ========= [09:32:14] ============ drm_test_fb_xrgb8888_to_abgr8888 ============= [09:32:14] [PASSED] single_pixel_source_buffer [09:32:14] [PASSED] single_pixel_clip_rectangle [09:32:14] [PASSED] well_known_colors [09:32:14] [PASSED] destination_pitch [09:32:14] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 ========= [09:32:14] ================= drm_test_fb_clip_offset ================= [09:32:14] [PASSED] pass through [09:32:14] [PASSED] horizontal offset [09:32:14] [PASSED] vertical offset [09:32:14] [PASSED] horizontal and vertical offset [09:32:14] [PASSED] horizontal offset (custom pitch) [09:32:14] [PASSED] vertical offset (custom pitch) [09:32:14] [PASSED] horizontal and vertical offset (custom pitch) [09:32:14] ============= [PASSED] drm_test_fb_clip_offset ============= [09:32:14] =================== drm_test_fb_memcpy ==================== [09:32:14] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258) [09:32:14] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258) [09:32:14] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559) [09:32:14] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258) [09:32:14] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258) [09:32:14] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559) [09:32:14] [PASSED] well_known_colors: XB24 little-endian (0x34324258) [09:32:14] [PASSED] well_known_colors: XRA8 little-endian (0x38415258) [09:32:14] [PASSED] well_known_colors: YU24 little-endian (0x34325559) [09:32:14] [PASSED] destination_pitch: XB24 little-endian (0x34324258) [09:32:14] [PASSED] destination_pitch: XRA8 little-endian (0x38415258) [09:32:14] [PASSED] destination_pitch: YU24 little-endian (0x34325559) [09:32:14] =============== [PASSED] drm_test_fb_memcpy ================ [09:32:14] ============= [PASSED] drm_format_helper_test ============== [09:32:14] ================= drm_format (18 subtests) ================= [09:32:14] [PASSED] drm_test_format_block_width_invalid [09:32:14] [PASSED] drm_test_format_block_width_one_plane [09:32:14] [PASSED] drm_test_format_block_width_two_plane [09:32:14] [PASSED] drm_test_format_block_width_three_plane [09:32:14] [PASSED] drm_test_format_block_width_tiled [09:32:14] [PASSED] drm_test_format_block_height_invalid [09:32:14] [PASSED] drm_test_format_block_height_one_plane [09:32:14] [PASSED] drm_test_format_block_height_two_plane [09:32:14] [PASSED] drm_test_format_block_height_three_plane [09:32:14] [PASSED] drm_test_format_block_height_tiled [09:32:14] [PASSED] drm_test_format_min_pitch_invalid [09:32:14] [PASSED] drm_test_format_min_pitch_one_plane_8bpp [09:32:14] [PASSED] drm_test_format_min_pitch_one_plane_16bpp [09:32:14] [PASSED] drm_test_format_min_pitch_one_plane_24bpp [09:32:14] [PASSED] drm_test_format_min_pitch_one_plane_32bpp [09:32:14] [PASSED] drm_test_format_min_pitch_two_plane [09:32:14] [PASSED] drm_test_format_min_pitch_three_plane_8bpp [09:32:14] [PASSED] drm_test_format_min_pitch_tiled [09:32:14] =================== [PASSED] drm_format ==================== [09:32:14] ============== drm_framebuffer (10 subtests) =============== [09:32:14] ========== drm_test_framebuffer_check_src_coords ========== [09:32:14] [PASSED] Success: source fits into fb [09:32:14] [PASSED] Fail: overflowing fb with x-axis coordinate [09:32:14] [PASSED] Fail: overflowing fb with y-axis coordinate [09:32:14] [PASSED] Fail: overflowing fb with source width [09:32:14] [PASSED] Fail: overflowing fb with source height [09:32:14] ====== [PASSED] drm_test_framebuffer_check_src_coords ====== [09:32:14] [PASSED] drm_test_framebuffer_cleanup [09:32:14] =============== drm_test_framebuffer_create =============== [09:32:14] [PASSED] ABGR8888 normal sizes [09:32:14] [PASSED] ABGR8888 max sizes [09:32:14] [PASSED] ABGR8888 pitch greater than min required [09:32:14] [PASSED] ABGR8888 pitch less than min required [09:32:14] [PASSED] ABGR8888 Invalid width [09:32:14] [PASSED] ABGR8888 Invalid buffer handle [09:32:14] [PASSED] No pixel format [09:32:14] [PASSED] ABGR8888 Width 0 [09:32:14] [PASSED] ABGR8888 Height 0 [09:32:14] [PASSED] ABGR8888 Out of bound height * pitch combination [09:32:14] [PASSED] ABGR8888 Large buffer offset [09:32:14] [PASSED] ABGR8888 Buffer offset for inexistent plane [09:32:14] [PASSED] ABGR8888 Invalid flag [09:32:14] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers [09:32:14] [PASSED] ABGR8888 Valid buffer modifier [09:32:14] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE) [09:32:14] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] NV12 Normal sizes [09:32:14] [PASSED] NV12 Max sizes [09:32:14] [PASSED] NV12 Invalid pitch [09:32:14] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag [09:32:14] [PASSED] NV12 different modifier per-plane [09:32:14] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE [09:32:14] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] NV12 Modifier for inexistent plane [09:32:14] [PASSED] NV12 Handle for inexistent plane [09:32:14] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier [09:32:14] [PASSED] YVU420 Normal sizes [09:32:14] [PASSED] YVU420 Max sizes [09:32:14] [PASSED] YVU420 Invalid pitch [09:32:14] [PASSED] YVU420 Different pitches [09:32:14] [PASSED] YVU420 Different buffer offsets/pitches [09:32:14] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS [09:32:14] [PASSED] YVU420 Valid modifier [09:32:14] [PASSED] YVU420 Different modifiers per plane [09:32:14] [PASSED] YVU420 Modifier for inexistent plane [09:32:14] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR) [09:32:14] [PASSED] X0L2 Normal sizes [09:32:14] [PASSED] X0L2 Max sizes [09:32:14] [PASSED] X0L2 Invalid pitch [09:32:14] [PASSED] X0L2 Pitch greater than minimum required [09:32:14] [PASSED] X0L2 Handle for inexistent plane [09:32:14] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set [09:32:14] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set [09:32:14] [PASSED] X0L2 Valid modifier [09:32:14] [PASSED] X0L2 Modifier for inexistent plane [09:32:14] =========== [PASSED] drm_test_framebuffer_create =========== [09:32:14] [PASSED] drm_test_framebuffer_free [09:32:14] [PASSED] drm_test_framebuffer_init [09:32:14] [PASSED] drm_test_framebuffer_init_bad_format [09:32:14] [PASSED] drm_test_framebuffer_init_dev_mismatch [09:32:14] [PASSED] drm_test_framebuffer_lookup [09:32:14] [PASSED] drm_test_framebuffer_lookup_inexistent [09:32:14] [PASSED] drm_test_framebuffer_modifiers_not_supported [09:32:14] ================= [PASSED] drm_framebuffer ================= [09:32:14] ================ drm_gem_shmem (8 subtests) ================ [09:32:14] [PASSED] drm_gem_shmem_test_obj_create [09:32:14] [PASSED] drm_gem_shmem_test_obj_create_private [09:32:14] [PASSED] drm_gem_shmem_test_pin_pages [09:32:14] [PASSED] drm_gem_shmem_test_vmap [09:32:14] [PASSED] drm_gem_shmem_test_get_sg_table [09:32:14] [PASSED] drm_gem_shmem_test_get_pages_sgt [09:32:14] [PASSED] drm_gem_shmem_test_madvise [09:32:14] [PASSED] drm_gem_shmem_test_purge [09:32:14] ================== [PASSED] drm_gem_shmem ================== [09:32:14] === drm_atomic_helper_connector_hdmi_check (27 subtests) === [09:32:14] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode [09:32:14] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1 [09:32:14] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode [09:32:14] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1 [09:32:14] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode [09:32:14] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1 [09:32:14] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 ======= [09:32:14] [PASSED] Automatic [09:32:14] [PASSED] Full [09:32:14] [PASSED] Limited 16:235 [09:32:14] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 === [09:32:14] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed [09:32:14] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed [09:32:14] [PASSED] drm_test_check_disable_connector [09:32:14] [PASSED] drm_test_check_hdmi_funcs_reject_rate [09:32:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb [09:32:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420 [09:32:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422 [09:32:14] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420 [09:32:14] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420 [09:32:14] [PASSED] drm_test_check_output_bpc_crtc_mode_changed [09:32:14] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed [09:32:14] [PASSED] drm_test_check_output_bpc_dvi [09:32:14] [PASSED] drm_test_check_output_bpc_format_vic_1 [09:32:14] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only [09:32:14] [PASSED] drm_test_check_output_bpc_format_display_rgb_only [09:32:14] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only [09:32:14] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only [09:32:14] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc [09:32:14] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc [09:32:14] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc [09:32:14] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ====== [09:32:14] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ==== [09:32:14] [PASSED] drm_test_check_broadcast_rgb_value [09:32:14] [PASSED] drm_test_check_bpc_8_value [09:32:14] [PASSED] drm_test_check_bpc_10_value [09:32:14] [PASSED] drm_test_check_bpc_12_value [09:32:14] [PASSED] drm_test_check_format_value [09:32:14] [PASSED] drm_test_check_tmds_char_value [09:32:14] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ====== [09:32:14] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) = [09:32:14] [PASSED] drm_test_check_mode_valid [09:32:14] [PASSED] drm_test_check_mode_valid_reject [09:32:14] [PASSED] drm_test_check_mode_valid_reject_rate [09:32:14] [PASSED] drm_test_check_mode_valid_reject_max_clock [09:32:14] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid === [09:32:14] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) = [09:32:14] [PASSED] drm_test_check_infoframes [09:32:14] [PASSED] drm_test_check_reject_avi_infoframe [09:32:14] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8 [09:32:14] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10 [09:32:14] [PASSED] drm_test_check_reject_audio_infoframe [09:32:14] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes === [09:32:14] ================= drm_managed (2 subtests) ================= [09:32:14] [PASSED] drm_test_managed_release_action [09:32:14] [PASSED] drm_test_managed_run_action [09:32:14] =================== [PASSED] drm_managed =================== [09:32:14] =================== drm_mm (6 subtests) ==================== [09:32:14] [PASSED] drm_test_mm_init [09:32:14] [PASSED] drm_test_mm_debug [09:32:14] [PASSED] drm_test_mm_align32 [09:32:14] [PASSED] drm_test_mm_align64 [09:32:14] [PASSED] drm_test_mm_lowest [09:32:14] [PASSED] drm_test_mm_highest [09:32:14] ===================== [PASSED] drm_mm ====================== [09:32:14] ============= drm_modes_analog_tv (5 subtests) ============= [09:32:14] [PASSED] drm_test_modes_analog_tv_mono_576i [09:32:14] [PASSED] drm_test_modes_analog_tv_ntsc_480i [09:32:14] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined [09:32:14] [PASSED] drm_test_modes_analog_tv_pal_576i [09:32:14] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined [09:32:14] =============== [PASSED] drm_modes_analog_tv =============== [09:32:14] ============== drm_plane_helper (2 subtests) =============== [09:32:14] =============== drm_test_check_plane_state ================ [09:32:14] [PASSED] clipping_simple [09:32:14] [PASSED] clipping_rotate_reflect [09:32:14] [PASSED] positioning_simple [09:32:14] [PASSED] upscaling [09:32:14] [PASSED] downscaling [09:32:14] [PASSED] rounding1 [09:32:14] [PASSED] rounding2 [09:32:14] [PASSED] rounding3 [09:32:14] [PASSED] rounding4 [09:32:14] =========== [PASSED] drm_test_check_plane_state ============ [09:32:14] =========== drm_test_check_invalid_plane_state ============ [09:32:14] [PASSED] positioning_invalid [09:32:14] [PASSED] upscaling_invalid [09:32:14] [PASSED] downscaling_invalid [09:32:14] ======= [PASSED] drm_test_check_invalid_plane_state ======== [09:32:14] ================ [PASSED] drm_plane_helper ================= [09:32:14] ====== drm_connector_helper_tv_get_modes (1 subtest) ======= [09:32:14] ====== drm_test_connector_helper_tv_get_modes_check ======= [09:32:14] [PASSED] None [09:32:14] [PASSED] PAL [09:32:14] [PASSED] NTSC [09:32:14] [PASSED] Both, NTSC Default [09:32:14] [PASSED] Both, PAL Default [09:32:14] [PASSED] Both, NTSC Default, with PAL on command-line [09:32:14] [PASSED] Both, PAL Default, with NTSC on command-line [09:32:14] == [PASSED] drm_test_connector_helper_tv_get_modes_check === [09:32:14] ======== [PASSED] drm_connector_helper_tv_get_modes ======== [09:32:14] ================== drm_rect (9 subtests) =================== [09:32:14] [PASSED] drm_test_rect_clip_scaled_div_by_zero [09:32:14] [PASSED] drm_test_rect_clip_scaled_not_clipped [09:32:14] [PASSED] drm_test_rect_clip_scaled_clipped [09:32:14] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned [09:32:14] ================= drm_test_rect_intersect ================= [09:32:14] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0 [09:32:14] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1 [09:32:14] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0 [09:32:14] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1 [09:32:14] [PASSED] right x left: 2x1+0+0 x 3x1+1+0 [09:32:14] [PASSED] left x right: 3x1+1+0 x 2x1+0+0 [09:32:14] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1 [09:32:14] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0 [09:32:14] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1 [09:32:14] [PASSED] touching side: 1x1+0+0 x 1x1+1+0 [09:32:14] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0 [09:32:14] [PASSED] inside another: 2x2+0+0 x 1x1+1+1 [09:32:14] [PASSED] far away: 1x1+0+0 x 1x1+3+6 [09:32:14] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10 [09:32:14] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10 [09:32:14] ============= [PASSED] drm_test_rect_intersect ============= [09:32:14] ================ drm_test_rect_calc_hscale ================ [09:32:14] [PASSED] normal use [09:32:14] [PASSED] out of max range [09:32:14] [PASSED] out of min range [09:32:14] [PASSED] zero dst [09:32:14] [PASSED] negative src [09:32:14] [PASSED] negative dst [09:32:14] ============ [PASSED] drm_test_rect_calc_hscale ============ [09:32:14] ================ drm_test_rect_calc_vscale ================ [09:32:14] [PASSED] normal use [09:32:14] [PASSED] out of max range [09:32:14] [PASSED] out of min range [09:32:14] [PASSED] zero dst [09:32:14] [PASSED] negative src [09:32:14] [PASSED] negative dst [09:32:14] ============ [PASSED] drm_test_rect_calc_vscale ============ [09:32:14] ================== drm_test_rect_rotate =================== [09:32:14] [PASSED] reflect-x [09:32:14] [PASSED] reflect-y [09:32:14] [PASSED] rotate-0 [09:32:14] [PASSED] rotate-90 [09:32:14] [PASSED] rotate-180 [09:32:14] [PASSED] rotate-270 [09:32:14] ============== [PASSED] drm_test_rect_rotate =============== [09:32:14] ================ drm_test_rect_rotate_inv ================= [09:32:14] [PASSED] reflect-x [09:32:14] [PASSED] reflect-y [09:32:14] [PASSED] rotate-0 [09:32:14] [PASSED] rotate-90 [09:32:14] [PASSED] rotate-180 [09:32:14] [PASSED] rotate-270 [09:32:14] ============ [PASSED] drm_test_rect_rotate_inv ============= [09:32:14] ==================== [PASSED] drm_rect ===================== [09:32:14] ============ drm_sysfb_modeset_test (1 subtest) ============ [09:32:14] ============ drm_test_sysfb_build_fourcc_list ============= [09:32:14] [PASSED] no native formats [09:32:14] [PASSED] XRGB8888 as native format [09:32:14] [PASSED] remove duplicates [09:32:14] [PASSED] convert alpha formats [09:32:14] [PASSED] random formats [09:32:14] ======== [PASSED] drm_test_sysfb_build_fourcc_list ========= [09:32:14] ============= [PASSED] drm_sysfb_modeset_test ============== [09:32:14] ================== drm_fixp (2 subtests) =================== [09:32:14] [PASSED] drm_test_int2fixp [09:32:14] [PASSED] drm_test_sm2fixp [09:32:14] ==================== [PASSED] drm_fixp ===================== [09:32:14] ============================================================ [09:32:14] Testing complete. Ran 621 tests: passed: 621 [09:32:14] Elapsed time: 52.072s total, 4.578s configuring, 47.124s building, 0.313s running + /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig [09:32:14] Configuring KUnit Kernel ... Regenerating .config ... Populating config with: $ make ARCH=um O=.kunit olddefconfig [09:32:19] 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=25 [09:32:42] Starting KUnit Kernel (1/1)... [09:32:42] ============================================================ Running tests with: $ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt [09:32:42] ================= ttm_device (5 subtests) ================== [09:32:42] [PASSED] ttm_device_init_basic [09:32:42] [PASSED] ttm_device_init_multiple [09:32:42] [PASSED] ttm_device_fini_basic [09:32:42] [PASSED] ttm_device_init_no_vma_man [09:32:42] ================== ttm_device_init_pools ================== [09:32:42] [PASSED] No DMA allocations, no DMA32 required [09:32:42] [PASSED] DMA allocations, DMA32 required [09:32:42] [PASSED] No DMA allocations, DMA32 required [09:32:42] [PASSED] DMA allocations, no DMA32 required [09:32:42] ============== [PASSED] ttm_device_init_pools ============== [09:32:42] =================== [PASSED] ttm_device ==================== [09:32:42] ================== ttm_pool (8 subtests) =================== [09:32:42] ================== ttm_pool_alloc_basic =================== [09:32:42] [PASSED] One page [09:32:42] [PASSED] More than one page [09:32:42] [PASSED] Above the allocation limit [09:32:42] [PASSED] One page, with coherent DMA mappings enabled [09:32:42] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [09:32:42] ============== [PASSED] ttm_pool_alloc_basic =============== [09:32:42] ============== ttm_pool_alloc_basic_dma_addr ============== [09:32:42] [PASSED] One page [09:32:42] [PASSED] More than one page [09:32:42] [PASSED] Above the allocation limit [09:32:42] [PASSED] One page, with coherent DMA mappings enabled [09:32:42] [PASSED] Above the allocation limit, with coherent DMA mappings enabled [09:32:42] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ========== [09:32:42] [PASSED] ttm_pool_alloc_order_caching_match [09:32:42] [PASSED] ttm_pool_alloc_caching_mismatch [09:32:42] [PASSED] ttm_pool_alloc_order_mismatch [09:32:42] [PASSED] ttm_pool_free_dma_alloc [09:32:42] [PASSED] ttm_pool_free_no_dma_alloc [09:32:42] [PASSED] ttm_pool_fini_basic [09:32:42] ==================== [PASSED] ttm_pool ===================== [09:32:42] ================ ttm_resource (8 subtests) ================= [09:32:42] ================= ttm_resource_init_basic ================= [09:32:42] [PASSED] Init resource in TTM_PL_SYSTEM [09:32:42] [PASSED] Init resource in TTM_PL_VRAM [09:32:42] [PASSED] Init resource in a private placement [09:32:42] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags [09:32:42] ============= [PASSED] ttm_resource_init_basic ============= [09:32:42] [PASSED] ttm_resource_init_pinned [09:32:42] [PASSED] ttm_resource_fini_basic [09:32:42] [PASSED] ttm_resource_manager_init_basic [09:32:42] [PASSED] ttm_resource_manager_usage_basic [09:32:42] [PASSED] ttm_resource_manager_set_used_basic [09:32:42] [PASSED] ttm_sys_man_alloc_basic [09:32:42] [PASSED] ttm_sys_man_free_basic [09:32:42] ================== [PASSED] ttm_resource =================== [09:32:42] =================== ttm_tt (15 subtests) =================== [09:32:42] ==================== ttm_tt_init_basic ==================== [09:32:42] [PASSED] Page-aligned size [09:32:42] [PASSED] Extra pages requested [09:32:42] ================ [PASSED] ttm_tt_init_basic ================ [09:32:42] [PASSED] ttm_tt_init_misaligned [09:32:42] [PASSED] ttm_tt_fini_basic [09:32:42] [PASSED] ttm_tt_fini_sg [09:32:42] [PASSED] ttm_tt_fini_shmem [09:32:42] [PASSED] ttm_tt_create_basic [09:32:42] [PASSED] ttm_tt_create_invalid_bo_type [09:32:42] [PASSED] ttm_tt_create_ttm_exists [09:32:42] [PASSED] ttm_tt_create_failed [09:32:42] [PASSED] ttm_tt_destroy_basic [09:32:42] [PASSED] ttm_tt_populate_null_ttm [09:32:42] [PASSED] ttm_tt_populate_populated_ttm [09:32:42] [PASSED] ttm_tt_unpopulate_basic [09:32:42] [PASSED] ttm_tt_unpopulate_empty_ttm [09:32:42] [PASSED] ttm_tt_swapin_basic [09:32:42] ===================== [PASSED] ttm_tt ====================== [09:32:42] =================== ttm_bo (14 subtests) =================== [09:32:42] =========== ttm_bo_reserve_optimistic_no_ticket =========== [09:32:42] [PASSED] Cannot be interrupted and sleeps [09:32:42] [PASSED] Cannot be interrupted, locks straight away [09:32:42] [PASSED] Can be interrupted, sleeps [09:32:42] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket ======= [09:32:42] [PASSED] ttm_bo_reserve_locked_no_sleep [09:32:42] [PASSED] ttm_bo_reserve_no_wait_ticket [09:32:43] [PASSED] ttm_bo_reserve_double_resv [09:32:43] [PASSED] ttm_bo_reserve_interrupted [09:32:43] [PASSED] ttm_bo_reserve_deadlock [09:32:43] [PASSED] ttm_bo_unreserve_basic [09:32:43] [PASSED] ttm_bo_unreserve_pinned [09:32:43] [PASSED] ttm_bo_unreserve_bulk [09:32:43] [PASSED] ttm_bo_fini_basic [09:32:43] [PASSED] ttm_bo_fini_shared_resv [09:32:43] [PASSED] ttm_bo_pin_basic [09:32:43] [PASSED] ttm_bo_pin_unpin_resource [09:32:43] [PASSED] ttm_bo_multiple_pin_one_unpin [09:32:43] ===================== [PASSED] ttm_bo ====================== [09:32:43] ============== ttm_bo_validate (22 subtests) =============== [09:32:43] ============== ttm_bo_init_reserved_sys_man =============== [09:32:43] [PASSED] Buffer object for userspace [09:32:43] [PASSED] Kernel buffer object [09:32:43] [PASSED] Shared buffer object [09:32:43] ========== [PASSED] ttm_bo_init_reserved_sys_man =========== [09:32:43] ============== ttm_bo_init_reserved_mock_man ============== [09:32:43] [PASSED] Buffer object for userspace [09:32:43] [PASSED] Kernel buffer object [09:32:43] [PASSED] Shared buffer object [09:32:43] ========== [PASSED] ttm_bo_init_reserved_mock_man ========== [09:32:43] [PASSED] ttm_bo_init_reserved_resv [09:32:43] ================== ttm_bo_validate_basic ================== [09:32:43] [PASSED] Buffer object for userspace [09:32:43] [PASSED] Kernel buffer object [09:32:43] [PASSED] Shared buffer object [09:32:43] ============== [PASSED] ttm_bo_validate_basic ============== [09:32:43] [PASSED] ttm_bo_validate_invalid_placement [09:32:43] ============= ttm_bo_validate_same_placement ============== [09:32:43] [PASSED] System manager [09:32:43] [PASSED] VRAM manager [09:32:43] ========= [PASSED] ttm_bo_validate_same_placement ========== [09:32:43] [PASSED] ttm_bo_validate_failed_alloc [09:32:43] [PASSED] ttm_bo_validate_pinned [09:32:43] [PASSED] ttm_bo_validate_busy_placement [09:32:43] ================ ttm_bo_validate_multihop ================= [09:32:43] [PASSED] Buffer object for userspace [09:32:43] [PASSED] Kernel buffer object [09:32:43] [PASSED] Shared buffer object [09:32:43] ============ [PASSED] ttm_bo_validate_multihop ============= [09:32:43] ========== ttm_bo_validate_no_placement_signaled ========== [09:32:43] [PASSED] Buffer object in system domain, no page vector [09:32:43] [PASSED] Buffer object in system domain with an existing page vector [09:32:43] ====== [PASSED] ttm_bo_validate_no_placement_signaled ====== [09:32:43] ======== ttm_bo_validate_no_placement_not_signaled ======== [09:32:43] [PASSED] Buffer object for userspace [09:32:43] [PASSED] Kernel buffer object [09:32:43] [PASSED] Shared buffer object [09:32:43] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ==== [09:32:43] [PASSED] ttm_bo_validate_move_fence_signaled [09:32:43] ========= ttm_bo_validate_move_fence_not_signaled ========= [09:32:43] [PASSED] Waits for GPU [09:32:43] [PASSED] Tries to lock straight away [09:32:43] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled ===== [09:32:43] [PASSED] ttm_bo_validate_swapout [09:32:43] [PASSED] ttm_bo_validate_happy_evict [09:32:43] [PASSED] ttm_bo_validate_all_pinned_evict [09:32:43] [PASSED] ttm_bo_validate_allowed_only_evict [09:32:43] [PASSED] ttm_bo_validate_deleted_evict [09:32:43] [PASSED] ttm_bo_validate_busy_domain_evict [09:32:43] [PASSED] ttm_bo_validate_evict_gutting [09:32:43] [PASSED] ttm_bo_validate_recrusive_evict [09:32:43] ================= [PASSED] ttm_bo_validate ================= [09:32:43] ============================================================ [09:32:43] Testing complete. Ran 102 tests: passed: 102 [09:32:43] Elapsed time: 28.437s total, 4.900s configuring, 23.218s building, 0.275s running + cleanup ++ stat -c %u:%g /kernel + chown -R 1003:1003 /kernel ^ permalink raw reply [flat|nested] 14+ messages in thread
* ✓ Xe.CI.BAT: success for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal ` (2 preceding siblings ...) 2026-04-28 9:32 ` ✓ CI.KUnit: success for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Patchwork @ 2026-04-28 10:42 ` Patchwork 2026-04-28 18:57 ` ✗ Xe.CI.FULL: failure " Patchwork 4 siblings, 0 replies; 14+ messages in thread From: Patchwork @ 2026-04-28 10:42 UTC (permalink / raw) To: Ankit Nautiyal; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 983 bytes --] == Series Details == Series: drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels URL : https://patchwork.freedesktop.org/series/165603/ State : success == Summary == CI Bug Log - changes from xe-4944-aea2c496abcf55b647c14fe720bfc4ea555aac6a_BAT -> xe-pw-165603v1_BAT ==================================================== Summary ------- **SUCCESS** No regressions found. Participating hosts (13 -> 13) ------------------------------ No changes in participating hosts Changes ------- No changes found Build changes ------------- * Linux: xe-4944-aea2c496abcf55b647c14fe720bfc4ea555aac6a -> xe-pw-165603v1 IGT_8874: 4568b2c141ab630c34f8eb2b9afab8cbf8f3ce9e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git xe-4944-aea2c496abcf55b647c14fe720bfc4ea555aac6a: aea2c496abcf55b647c14fe720bfc4ea555aac6a xe-pw-165603v1: 165603v1 == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165603v1/index.html [-- Attachment #2: Type: text/html, Size: 1531 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* ✗ Xe.CI.FULL: failure for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal ` (3 preceding siblings ...) 2026-04-28 10:42 ` ✓ Xe.CI.BAT: " Patchwork @ 2026-04-28 18:57 ` Patchwork 4 siblings, 0 replies; 14+ messages in thread From: Patchwork @ 2026-04-28 18:57 UTC (permalink / raw) To: Ankit Nautiyal; +Cc: intel-xe [-- Attachment #1: Type: text/plain, Size: 400 bytes --] == Series Details == Series: drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels URL : https://patchwork.freedesktop.org/series/165603/ State : failure == Summary == ERROR: The runconfig 'xe-4944-aea2c496abcf55b647c14fe720bfc4ea555aac6a_FULL' does not exist in the database == Logs == For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-165603v1/index.html [-- Attachment #2: Type: text/html, Size: 965 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-05-06 15:53 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-28 8:33 [PATCH 0/2] drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 1/2] drm/i915/intel_panel: Add a helper to get the highest refresh rate mode Ankit Nautiyal 2026-04-28 8:33 ` [PATCH 2/2] drm/i915/intel_panel: Use highest refresh rate mode for seamless VRR changes Ankit Nautiyal 2026-04-28 9:39 ` Jani Nikula 2026-04-29 13:28 ` Nautiyal, Ankit K 2026-04-29 12:14 ` Ville Syrjälä 2026-04-29 17:00 ` Nautiyal, Ankit K 2026-04-29 17:09 ` Nautiyal, Ankit K 2026-05-04 13:17 ` Nautiyal, Ankit K 2026-05-06 7:25 ` Nautiyal, Ankit K 2026-05-06 15:53 ` Manasi Navare 2026-04-28 9:32 ` ✓ CI.KUnit: success for drm/i915/intel_panel: Fix seamless VRR mode switching for DRRS panels Patchwork 2026-04-28 10:42 ` ✓ Xe.CI.BAT: " Patchwork 2026-04-28 18:57 ` ✗ Xe.CI.FULL: failure " Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox