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 > >