diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index fd94dbca33ac..58f342659cc7 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) | |||
| 595 | return false; | 595 | return false; |
| 596 | } | 596 | } |
| 597 | 597 | ||
| 598 | static const uint32_t default_primarydac_adj[CHIP_LAST] = { | ||
| 599 | 0x00000808, /* r100 */ | ||
| 600 | 0x00000808, /* rv100 */ | ||
| 601 | 0x00000808, /* rs100 */ | ||
| 602 | 0x00000808, /* rv200 */ | ||
| 603 | 0x00000808, /* rs200 */ | ||
| 604 | 0x00000808, /* r200 */ | ||
| 605 | 0x00000808, /* rv250 */ | ||
| 606 | 0x00000000, /* rs300 */ | ||
| 607 | 0x00000808, /* rv280 */ | ||
| 608 | 0x00000808, /* r300 */ | ||
| 609 | 0x00000808, /* r350 */ | ||
| 610 | 0x00000808, /* rv350 */ | ||
| 611 | 0x00000808, /* rv380 */ | ||
| 612 | 0x00000808, /* r420 */ | ||
| 613 | 0x00000808, /* r423 */ | ||
| 614 | 0x00000808, /* rv410 */ | ||
| 615 | 0x00000000, /* rs400 */ | ||
| 616 | 0x00000000, /* rs480 */ | ||
| 617 | }; | ||
| 618 | |||
| 619 | static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev, | ||
| 620 | struct radeon_encoder_primary_dac *p_dac) | ||
| 621 | { | ||
| 622 | p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family]; | ||
| 623 | return; | ||
| 624 | } | ||
| 625 | |||
| 598 | struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | 626 | struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct |
| 599 | radeon_encoder | 627 | radeon_encoder |
| 600 | *encoder) | 628 | *encoder) |
| @@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | |||
| 604 | uint16_t dac_info; | 632 | uint16_t dac_info; |
| 605 | uint8_t rev, bg, dac; | 633 | uint8_t rev, bg, dac; |
| 606 | struct radeon_encoder_primary_dac *p_dac = NULL; | 634 | struct radeon_encoder_primary_dac *p_dac = NULL; |
| 635 | int found = 0; | ||
| 607 | 636 | ||
| 608 | if (rdev->bios == NULL) | 637 | p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), |
| 638 | GFP_KERNEL); | ||
| 639 | |||
| 640 | if (!p_dac) | ||
| 609 | return NULL; | 641 | return NULL; |
| 610 | 642 | ||
| 643 | if (rdev->bios == NULL) | ||
| 644 | goto out; | ||
| 645 | |||
| 611 | /* check CRT table */ | 646 | /* check CRT table */ |
| 612 | dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); | 647 | dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); |
| 613 | if (dac_info) { | 648 | if (dac_info) { |
| 614 | p_dac = | ||
| 615 | kzalloc(sizeof(struct radeon_encoder_primary_dac), | ||
| 616 | GFP_KERNEL); | ||
| 617 | |||
| 618 | if (!p_dac) | ||
| 619 | return NULL; | ||
| 620 | |||
| 621 | rev = RBIOS8(dac_info) & 0x3; | 649 | rev = RBIOS8(dac_info) & 0x3; |
| 622 | if (rev < 2) { | 650 | if (rev < 2) { |
| 623 | bg = RBIOS8(dac_info + 0x2) & 0xf; | 651 | bg = RBIOS8(dac_info + 0x2) & 0xf; |
| @@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | |||
| 628 | dac = RBIOS8(dac_info + 0x3) & 0xf; | 656 | dac = RBIOS8(dac_info + 0x3) & 0xf; |
| 629 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); | 657 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); |
| 630 | } | 658 | } |
| 631 | 659 | found = 1; | |
| 632 | } | 660 | } |
| 633 | 661 | ||
| 662 | out: | ||
| 663 | if (!found) /* fallback to defaults */ | ||
| 664 | radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac); | ||
| 665 | |||
| 634 | return p_dac; | 666 | return p_dac; |
| 635 | } | 667 | } |
| 636 | 668 | ||
