On Mon, Aug 8, 2011 at 12:21 PM, Matthew Garrett <mjg@xxxxxxxxxx> 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@xxxxxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > 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 > > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel