[PATCH 1/2] radeon: Allow panel preferred EDID to override BIOS native mode

Alex Deucher alexdeucher at gmail.com
Mon Aug 8 09:40:41 PDT 2011


On Mon, Aug 8, 2011 at 12:21 PM, Matthew Garrett <mjg at redhat.com> wrote:
> We have two sources of information about panel capabilities on mobile
> radeon - the BIOS, which gives us a native mode, and the panel's preferred
> mode. In theory these two will always match, but there's some corner cases
> where the BIOS hasn't been fully initialised and so the native mode in it
> ends up with default values. However, if we get a panel with reasonable
> EDID, it's probably the case that the panel's preferred mode does actually
> represent the panel capabilities. This patch handles that case by replacing
> the native mode with the panel's preferred mode if the resolutions don't
> match. Systems without a valid internal panel EDID will still use the BIOS
> native mode.
>
> Signed-off-by: Matthew Garrett <mjg at redhat.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/radeon/radeon_connectors.c |   13 +++++++++++--
>  1 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
> index 6d6b5f1..3248738 100644
> --- a/drivers/gpu/drm/radeon/radeon_connectors.c
> +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
> @@ -474,11 +474,19 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
>  {
>        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
>        struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
> +       struct drm_display_mode *t, *mode;
> +
> +       /* If the EDID preferred mode doesn't match the native mode, use it */
> +       list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
> +               if (mode->type & DRM_MODE_TYPE_PREFERRED) {
> +                       if (mode->hdisplay != native_mode->hdisplay ||
> +                           mode->vdisplay != native_mode->vdisplay)
> +                               memcpy(native_mode, mode, sizeof(*mode));
> +               }
> +       }
>
>        /* Try to get native mode details from EDID if necessary */
>        if (!native_mode->clock) {
> -               struct drm_display_mode *t, *mode;
> -
>                list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
>                        if (mode->hdisplay == native_mode->hdisplay &&
>                            mode->vdisplay == native_mode->vdisplay) {
> @@ -489,6 +497,7 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
>                        }
>                }
>        }
> +
>        if (!native_mode->clock) {
>                DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
>                radeon_encoder->rmx_type = RMX_OFF;
> --
> 1.7.6
>
>


More information about the dri-devel mailing list