[PATCH 5/7] drm: Only merge mode type bits between new probed modes

Daniel Vetter daniel at ffwll.ch
Fri Dec 4 00:29:10 PST 2015


On Thu, Dec 03, 2015 at 11:14:13PM +0200, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Currently most drivers request that any mode appearing on both the
> old mode list and the new probed_modes list get their type bits ORed
> together if the modes are deemed to otherwise match each other.
> 
> I don't know why anyone would want to merge in the mode type bits
> from any mode left over from a previous probe. For instance, you
> could never get rid of ther preferred bit if a matching non-preferred
> mode is returned by the new probe. So let's not merge anything from
> the stale old modes, and just replace them outright with matching new
> modes.
> 
> If multiple matching modes are produced by the same probe, merging
> the type bits between them would seem like a sensible thing to do.
> For a bit of extra finesse if two modes are considered equal we can
> pick the actual timings from the one marked as preferrred. And if
> multiple preferred modes are produced by the same probe somehow, we
> can just favor the first one added to the probed_modes list.
> 
> You may be asking yourself why we both with the merging at all if
s/both/bother/

> nothing from the old list survives in practice. The only asnwer I have

s/asnwer/answer/

> is "debug output". That is we want to print out a list of pruned modes,
> which is why we still want to look for duplicates with the old modes.

Yup, it's all an elaborate scheme to fill up dmesg ;-)

> There was a previous attempt to get rid of the mode type merging
> entirely, but it caused some kind of regression on Daniels's G33
> machine. Apparently the hardware has since rotted away, so we don't
> have to worry about it anymore. The relevant commits are:
> commit 3fbd6439e463 ("drm: copy mode type in drm_mode_connector_list_update()")
> commit abce1ec9b08a ("Revert "drm: copy mode type in drm_mode_connector_list_update()"")

Slight correction: It's only the sdvo transcoder that rotted, and when I
reported this regression whatever tiny change this causes seems to have
been enough to kill the machine. A few months later it died always. So
really unlucky conincidence that my hw was exactly between dead and alive
when Dave pushed this originally.

> It was then decided in
> commit b87577b7c768 ("drm: try harder to avoid regression when merging mode bits")
> that just qxl virtio are excluded from the merging, while everyone
> else does it. That is not changed, although now even qxl and virtio
> will be subject to the previously mentioned logic to choose which
> actual timings are picked for the new mode.
> 
> Cc: Marc-André Lureau <marcandre.lureau at redhat.com>
> Cc: Dave Airlie <airlied at redhat.com>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Adam Jackson <ajax at redhat.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

With the commit message corrected:

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> ---
>  drivers/gpu/drm/drm_modes.c | 34 +++++++++++++++++++++++++++-------
>  1 file changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> index 2b94a5c661b0..8c803e3af1da 100644
> --- a/drivers/gpu/drm/drm_modes.c
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -1197,13 +1197,33 @@ void drm_mode_connector_list_update(struct drm_connector *connector,
>  				continue;
>  
>  			found_it = true;
> -			/* if equal delete the probed mode */
> -			mode->status = pmode->status;
> -			/* Merge type bits together */
> -			if (merge_type_bits)
> -				mode->type |= pmode->type;
> -			else
> -				mode->type = pmode->type;
> +
> +			/*
> +			 * If the old matching mode is stale (ie. left over
> +			 * from a previous probe) just replace it outright.
> +			 * Otherwise just merge the type bits between all
> +			 * equal probed modes.
> +			 *
> +			 * If two probed modes are considered equal, pick the
> +			 * actual timings from the one that's marked as
> +			 * preferred (in case the match isn't 100%). If
> +			 * multiple or zero preferred modes are present, favor
> +			 * the mode added to the probed_modes list first.
> +			 */
> +			if (mode->status == MODE_STALE) {
> +				drm_mode_copy(mode, pmode);
> +			} else if ((mode->type & DRM_MODE_TYPE_PREFERRED) == 0 &&
> +				   (pmode->type & DRM_MODE_TYPE_PREFERRED) != 0) {
> +				if (merge_type_bits)
> +					pmode->type |= mode->type;
> +				drm_mode_copy(mode, pmode);
> +			} else {
> +				if (merge_type_bits)
> +					mode->type |= pmode->type;
> +				else
> +					mode->type = pmode->type;
> +			}
> +
>  			list_del(&pmode->head);
>  			drm_mode_destroy(connector->dev, pmode);
>  			break;
> -- 
> 2.4.10
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list