From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Stephan Gerhold <stephan@gerhold.net>
Cc: David Airlie <airlied@linux.ie>, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2] drm/modes: Apply video parameters with only reflect option
Date: Mon, 16 Dec 2019 19:27:25 +0200 [thread overview]
Message-ID: <20191216172725.GZ1208@intel.com> (raw)
In-Reply-To: <20191216171017.173326-1-stephan@gerhold.net>
On Mon, Dec 16, 2019 at 06:10:17PM +0100, Stephan Gerhold wrote:
> At the moment, video mode parameters like video=540x960,reflect_x,
> (without rotation set) are not taken into account when applying the
> mode in drm_client_modeset.c.
A rotation value without exactly one rotation angle is illegal.
IMO the code should not generate a value like that in the first
place.
>
> One of the reasons for this is that the calculation that
> combines the panel_orientation with cmdline->rotation_reflection
> does not handle the case when cmdline->rotation_reflection does
> not have any rotation set.
> (i.e. cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK == 0)
>
> Example:
> *rotation = DRM_MODE_ROTATE_0 (no panel_orientation)
> cmdline->rotation_reflection = DRM_MODE_REFLECT_X (video=MODE,reflect_x)
>
> The current code does:
> panel_rot = ilog2(*rotation & DRM_MODE_ROTATE_MASK);
> cmdline_rot = ilog2(cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK);
> sum_rot = (panel_rot + cmdline_rot) % 4;
>
> and therefore:
> panel_rot = ilog2(DRM_MODE_ROTATE_0) = ilog2(1) = 0
> cmdline_rot = ilog2(0) = -1
> sum_rot = (0 + -1) % 4 = -1 % 4 = 3
> ...
> *rotation = DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X
>
> So we incorrectly generate DRM_MODE_ROTATE_270 in this case.
> To prevent cmdline_rot from becoming -1, we need to treat
> the rotation as DRM_MODE_ROTATE_0.
>
> On the other hand, there is no need to go through that calculation
> at all if no rotation is set in rotation_reflection.
> A simple XOR is enough to combine the reflections.
>
> Finally, also allow DRM_MODE_ROTATE_0 in the if statement below.
> DRM_MODE_ROTATE_0 means "no rotation" and should therefore not
> require any special handling (e.g. specific tiling format).
>
> This makes video parameters with only reflect option work correctly.
>
> Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
> ---
> v1: https://lists.freedesktop.org/archives/dri-devel/2019-December/248145.html
>
> Changes in v2:
> - Clarified commit message - parameters are parsed correctly,
> but not taken into account when applying the mode.
> ---
> drivers/gpu/drm/drm_client_modeset.c | 27 ++++++++++++++++-----------
> 1 file changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
> index 895b73f23079..cfebce4f19a5 100644
> --- a/drivers/gpu/drm/drm_client_modeset.c
> +++ b/drivers/gpu/drm/drm_client_modeset.c
> @@ -859,19 +859,23 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)
> */
> cmdline = &connector->cmdline_mode;
> if (cmdline->specified && cmdline->rotation_reflection) {
> - unsigned int cmdline_rest, panel_rest;
> - unsigned int cmdline_rot, panel_rot;
> - unsigned int sum_rot, sum_rest;
> + if (cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK) {
> + unsigned int cmdline_rest, panel_rest;
> + unsigned int cmdline_rot, panel_rot;
> + unsigned int sum_rot, sum_rest;
>
> - panel_rot = ilog2(*rotation & DRM_MODE_ROTATE_MASK);
> - cmdline_rot = ilog2(cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK);
> - sum_rot = (panel_rot + cmdline_rot) % 4;
> + panel_rot = ilog2(*rotation & DRM_MODE_ROTATE_MASK);
> + cmdline_rot = ilog2(cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK);
> + sum_rot = (panel_rot + cmdline_rot) % 4;
>
> - panel_rest = *rotation & ~DRM_MODE_ROTATE_MASK;
> - cmdline_rest = cmdline->rotation_reflection & ~DRM_MODE_ROTATE_MASK;
> - sum_rest = panel_rest ^ cmdline_rest;
> + panel_rest = *rotation & ~DRM_MODE_ROTATE_MASK;
> + cmdline_rest = cmdline->rotation_reflection & ~DRM_MODE_ROTATE_MASK;
> + sum_rest = panel_rest ^ cmdline_rest;
>
> - *rotation = (1 << sum_rot) | sum_rest;
> + *rotation = (1 << sum_rot) | sum_rest;
> + } else {
> + *rotation ^= cmdline->rotation_reflection;
> + }
> }
>
> /*
> @@ -879,7 +883,8 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)
> * depending on the hardware this may require the framebuffer
> * to be in a specific tiling format.
> */
> - if ((*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_180 ||
> + if (((*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_0 &&
> + (*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_180) ||
> !plane->rotation_property)
> return false;
>
> --
> 2.24.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2019-12-16 17:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-16 17:10 [PATCH v2] drm/modes: Apply video parameters with only reflect option Stephan Gerhold
2019-12-16 17:27 ` Ville Syrjälä [this message]
2019-12-16 18:08 ` Stephan Gerhold
2020-01-13 16:30 ` Stephan Gerhold
2020-01-16 7:57 ` Maxime Ripard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191216172725.GZ1208@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=airlied@linux.ie \
--cc=dri-devel@lists.freedesktop.org \
--cc=stephan@gerhold.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.