diff mbox

drm/radeon/kms: fix extended lvds info parsing

Message ID 1305136927-11205-1-git-send-email-alexdeucher@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alex Deucher May 11, 2011, 6:02 p.m. UTC
On rev <= 1.1 tables, the offset is absolute,
on newer tables, it's relative.

Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=700326

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Cc: stable@kernel.org
---
 drivers/gpu/drm/radeon/radeon_atombios.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

Comments

Jerome Glisse May 11, 2011, 6:03 p.m. UTC | #1
On Wed, May 11, 2011 at 2:02 PM, Alex Deucher <alexdeucher@gmail.com> wrote:
> On rev <= 1.1 tables, the offset is absolute,
> on newer tables, it's relative.
>
> Fixes:
> https://bugzilla.redhat.com/show_bug.cgi?id=700326
>
> Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
> Cc: stable@kernel.org
Reviewed-by: Jerome Glisse <jglisse@redhat.com>

> ---
>  drivers/gpu/drm/radeon/radeon_atombios.c |   14 +++++++++++---
>  1 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
> index 7615aaa..fd6f4f3 100644
> --- a/drivers/gpu/drm/radeon/radeon_atombios.c
> +++ b/drivers/gpu/drm/radeon/radeon_atombios.c
> @@ -1585,9 +1585,17 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
>                        ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
>                        ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
>                        bool bad_record = false;
> -                       u8 *record = (u8 *)(mode_info->atom_context->bios +
> -                                           data_offset +
> -                                           le16_to_cpu(lvds_info->info.usModePatchTableOffset));
> +                       u8 *record;
> +
> +                       if ((frev == 1) && (crev < 2))
> +                               /* absolute */
> +                               record = (u8 *)(mode_info->atom_context->bios +
> +                                               le16_to_cpu(lvds_info->info.usModePatchTableOffset));
> +                       else
> +                               /* relative */
> +                               record = (u8 *)(mode_info->atom_context->bios +
> +                                               data_offset +
> +                                               le16_to_cpu(lvds_info->info.usModePatchTableOffset));
>                        while (*record != ATOM_RECORD_END_TYPE) {
>                                switch (*record) {
>                                case LCD_MODE_PATCH_RECORD_MODE_TYPE:
> --
> 1.7.1.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 7615aaa..fd6f4f3 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1585,9 +1585,17 @@  struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
 			ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
 			ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
 			bool bad_record = false;
-			u8 *record = (u8 *)(mode_info->atom_context->bios +
-					    data_offset +
-					    le16_to_cpu(lvds_info->info.usModePatchTableOffset));
+			u8 *record;
+
+			if ((frev == 1) && (crev < 2))
+				/* absolute */
+				record = (u8 *)(mode_info->atom_context->bios +
+						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
+			else
+				/* relative */
+				record = (u8 *)(mode_info->atom_context->bios +
+						data_offset +
+						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
 			while (*record != ATOM_RECORD_END_TYPE) {
 				switch (*record) {
 				case LCD_MODE_PATCH_RECORD_MODE_TYPE: