[PATCH] drm: Don't override active mode.
Forest Bond
forest at alittletooquiet.net
Sun Jun 13 09:58:38 PDT 2010
Hi,
Please disregard this patch, I'll resend with tweaks.
Thanks,
Forest
On Sun, Jun 13, 2010 at 12:39:56PM -0400, Forest Bond wrote:
> The drm renderer calls drmModeSetCrtc to tell the CRTC to use the
> allocated scan out buffer. This should not result in setting a
> new mode for the CRTC, but can do exactly that since plymouth saves
> the wrong mode when creating heads, and inadvertently overrides the
> initial mode set by the kernel.
>
> The root of the problem is the assumption that the first mode in the
> connector's mode list is the current active mode. This will be true
> if the active mode is set by automatic detection, as the kernel will
> have selected the first mode in the list as the initial mode, but it
> will not be true if the user has selected a different mode via the
> video= kernel boot parameter.
>
> To fix this, the saved mode is copied from the controller itself,
> unless that mode is for some reason not valid, in which case we fall
> back to the old behavior (which could result in a mode switch).
>
> Signed-off-by: Forest Bond <forest at alittletooquiet.net>
> ---
> src/plugins/renderers/drm/plugin.c | 35 ++++++++++++++++++++++++++++++++---
> 1 files changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c
> index 385bd91..7976e21 100644
> --- a/src/plugins/renderers/drm/plugin.c
> +++ b/src/plugins/renderers/drm/plugin.c
> @@ -159,6 +159,7 @@ ply_renderer_head_free (ply_renderer_head_t *head)
> ply_trace ("freeing %ldx%ld renderer head", head->area.width, head->area.height);
> ply_pixel_buffer_free (head->pixel_buffer);
> drmModeFreeConnector (head->connector);
> + drmModeFreeModeInfo (head->mode);
> free (head);
> }
>
> @@ -547,12 +548,21 @@ close_device (ply_renderer_backend_t *backend)
> }
>
> static drmModeModeInfo *
> -get_active_mode_for_connector (ply_renderer_backend_t *backend,
> - drmModeConnector *connector)
> +get_preferred_mode_for_connector (ply_renderer_backend_t *backend,
> + drmModeConnector *connector)
> {
> return &connector->modes[0];
> }
>
> +static drmModeModeInfo *
> +get_active_mode_for_controller (ply_renderer_backend_t *backend,
> + drmModeCrtc *controller)
> +{
> + if (controller->mode_valid)
> + return &controller->mode;
> + return NULL;
> +}
> +
> static bool
> controller_is_available (ply_renderer_backend_t *backend,
> uint32_t controller_id)
> @@ -725,6 +735,8 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
> uint32_t encoder_id;
> uint32_t console_buffer_id;
> drmModeModeInfo *mode;
> + drmModeModeInfo *src_mode;
> + drmModeCrtc *controller;
>
> connector = drmModeGetConnector (backend->device_fd,
> backend->resources->connectors[i]);
> @@ -762,7 +774,24 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
> continue;
> }
>
> - mode = get_active_mode_for_connector (backend, connector);
> + mode = malloc (sizeof (drmModeModeInfo));
> + controller = drmModeGetCrtc (backend->device_fd, controller_id);
> + /* Try to preserve the active mode for the controller. */
> + src_mode = get_active_mode_for_controller (backend, controller);
> + if (src_mode)
> + {
> + /* Active mode is set and valid, use it. */
> + memcpy (mode, src_mode, sizeof (drmModeModeInfo));
> + }
> + else
> + {
> + /* Fall back to setting the preferred mode for the connector.
> + * This will result in changing the active mode if one is set.
> + */
> + src_mode = get_preferred_mode_for_connector (backend, connector);
> + memcpy (mode, src_mode, sizeof (drmModeModeInfo));
> + }
> + drmModeFreeCrtc (controller);
>
> console_buffer_id = get_console_buffer_id (backend, controller_id);
>
> --
> 1.7.0.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/plymouth/attachments/20100613/fe2ba9b7/attachment.pgp>
More information about the plymouth
mailing list