Commit 246263cc authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie

drm/radeon/kms: add primary dac adj values table

Look up primary dac adj values from the table if
there is no bios or bios dac table to reference.

The lookup table may need to be adjusted for certain
families.

Should fix kernel bug 14945.
Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent b9597a1c
...@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) ...@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
return false; return false;
} }
static const uint32_t default_primarydac_adj[CHIP_LAST] = {
0x00000808, /* r100 */
0x00000808, /* rv100 */
0x00000808, /* rs100 */
0x00000808, /* rv200 */
0x00000808, /* rs200 */
0x00000808, /* r200 */
0x00000808, /* rv250 */
0x00000000, /* rs300 */
0x00000808, /* rv280 */
0x00000808, /* r300 */
0x00000808, /* r350 */
0x00000808, /* rv350 */
0x00000808, /* rv380 */
0x00000808, /* r420 */
0x00000808, /* r423 */
0x00000808, /* rv410 */
0x00000000, /* rs400 */
0x00000000, /* rs480 */
};
static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev,
struct radeon_encoder_primary_dac *p_dac)
{
p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family];
return;
}
struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
radeon_encoder radeon_encoder
*encoder) *encoder)
...@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct ...@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
uint16_t dac_info; uint16_t dac_info;
uint8_t rev, bg, dac; uint8_t rev, bg, dac;
struct radeon_encoder_primary_dac *p_dac = NULL; struct radeon_encoder_primary_dac *p_dac = NULL;
int found = 0;
if (rdev->bios == NULL) p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac),
GFP_KERNEL);
if (!p_dac)
return NULL; return NULL;
if (rdev->bios == NULL)
goto out;
/* check CRT table */ /* check CRT table */
dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
if (dac_info) { if (dac_info) {
p_dac =
kzalloc(sizeof(struct radeon_encoder_primary_dac),
GFP_KERNEL);
if (!p_dac)
return NULL;
rev = RBIOS8(dac_info) & 0x3; rev = RBIOS8(dac_info) & 0x3;
if (rev < 2) { if (rev < 2) {
bg = RBIOS8(dac_info + 0x2) & 0xf; bg = RBIOS8(dac_info + 0x2) & 0xf;
...@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct ...@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
dac = RBIOS8(dac_info + 0x3) & 0xf; dac = RBIOS8(dac_info + 0x3) & 0xf;
p_dac->ps2_pdac_adj = (bg << 8) | (dac); p_dac->ps2_pdac_adj = (bg << 8) | (dac);
} }
found = 1;
} }
out:
if (!found) /* fallback to defaults */
radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac);
return p_dac; return p_dac;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment