mirror of https://gitee.com/openkylin/linux.git
drm/radeon/kms/combios: verify dac_adj values are valid
Some vbios dac_adj tables are all zeros. Check for that case and use the default table if so. Should fix fdo bug 27478. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Cc: stable <stable@kernel.org> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
affd858907
commit
3a89b4a9ca
|
@ -760,7 +760,9 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
|
|||
dac = RBIOS8(dac_info + 0x3) & 0xf;
|
||||
p_dac->ps2_pdac_adj = (bg << 8) | (dac);
|
||||
}
|
||||
found = 1;
|
||||
/* if the values are all zeros, use the table */
|
||||
if (p_dac->ps2_pdac_adj)
|
||||
found = 1;
|
||||
}
|
||||
|
||||
if (!found) /* fallback to defaults */
|
||||
|
@ -895,7 +897,9 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
|
|||
bg = RBIOS8(dac_info + 0x10) & 0xf;
|
||||
dac = RBIOS8(dac_info + 0x11) & 0xf;
|
||||
tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
|
||||
found = 1;
|
||||
/* if the values are all zeros, use the table */
|
||||
if (tv_dac->ps2_tvdac_adj)
|
||||
found = 1;
|
||||
} else if (rev > 1) {
|
||||
bg = RBIOS8(dac_info + 0xc) & 0xf;
|
||||
dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf;
|
||||
|
@ -908,7 +912,9 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
|
|||
bg = RBIOS8(dac_info + 0xe) & 0xf;
|
||||
dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf;
|
||||
tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
|
||||
found = 1;
|
||||
/* if the values are all zeros, use the table */
|
||||
if (tv_dac->ps2_tvdac_adj)
|
||||
found = 1;
|
||||
}
|
||||
tv_dac->tv_std = radeon_combios_get_tv_info(rdev);
|
||||
}
|
||||
|
@ -925,7 +931,9 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
|
|||
(bg << 16) | (dac << 20);
|
||||
tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj;
|
||||
tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj;
|
||||
found = 1;
|
||||
/* if the values are all zeros, use the table */
|
||||
if (tv_dac->ps2_tvdac_adj)
|
||||
found = 1;
|
||||
} else {
|
||||
bg = RBIOS8(dac_info + 0x4) & 0xf;
|
||||
dac = RBIOS8(dac_info + 0x5) & 0xf;
|
||||
|
@ -933,7 +941,9 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct
|
|||
(bg << 16) | (dac << 20);
|
||||
tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj;
|
||||
tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj;
|
||||
found = 1;
|
||||
/* if the values are all zeros, use the table */
|
||||
if (tv_dac->ps2_tvdac_adj)
|
||||
found = 1;
|
||||
}
|
||||
} else {
|
||||
DRM_INFO("No TV DAC info found in BIOS\n");
|
||||
|
|
Loading…
Reference in New Issue