drm/modes: Allow to specify rotation and reflection on the commandline
Rotations and reflections setup are needed in some scenarios to initialise properly the initial framebuffer. Some drivers already had a bunch of quirks to deal with this, such as either a private kernel command line parameter (omapdss) or on the device tree (various panels). In order to accomodate this, let's create a video mode parameter to deal with the rotation and reflexion. Reviewed-by: Noralf Trønnes <noralf@tronnes.org> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Link: https://patchwork.freedesktop.org/patch/msgid/777da16e42db757c1f5b414b5ca34507097fed5c.1560783090.git-series.maxime.ripard@bootlin.com
This commit is contained in:
@@ -824,6 +824,7 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)
|
||||
{
|
||||
struct drm_connector *connector = modeset->connectors[0];
|
||||
struct drm_plane *plane = modeset->crtc->primary;
|
||||
struct drm_cmdline_mode *cmdline;
|
||||
u64 valid_mask = 0;
|
||||
unsigned int i;
|
||||
|
||||
@@ -844,6 +845,35 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)
|
||||
*rotation = DRM_MODE_ROTATE_0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The panel already defined the default rotation
|
||||
* through its orientation. Whatever has been provided
|
||||
* on the command line needs to be added to that.
|
||||
*
|
||||
* Unfortunately, the rotations are at different bit
|
||||
* indices, so the math to add them up are not as
|
||||
* trivial as they could.
|
||||
*
|
||||
* Reflections on the other hand are pretty trivial to deal with, a
|
||||
* simple XOR between the two handle the addition nicely.
|
||||
*/
|
||||
cmdline = &connector->cmdline_mode;
|
||||
if (cmdline->specified) {
|
||||
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_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;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: support 90 / 270 degree hardware rotation,
|
||||
* depending on the hardware this may require the framebuffer
|
||||
|
||||
Reference in New Issue
Block a user