diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_combios.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 64 |
1 files changed, 55 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index fd94dbca33ac..7914455c96ca 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -595,6 +595,48 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) | |||
| 595 | return false; | 595 | return false; |
| 596 | } | 596 | } |
| 597 | 597 | ||
| 598 | bool radeon_combios_sideport_present(struct radeon_device *rdev) | ||
| 599 | { | ||
| 600 | struct drm_device *dev = rdev->ddev; | ||
| 601 | u16 igp_info; | ||
| 602 | |||
| 603 | igp_info = combios_get_table_offset(dev, COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE); | ||
| 604 | |||
| 605 | if (igp_info) { | ||
| 606 | if (RBIOS16(igp_info + 0x4)) | ||
| 607 | return true; | ||
| 608 | } | ||
| 609 | return false; | ||
| 610 | } | ||
| 611 | |||
| 612 | static const uint32_t default_primarydac_adj[CHIP_LAST] = { | ||
| 613 | 0x00000808, /* r100 */ | ||
| 614 | 0x00000808, /* rv100 */ | ||
| 615 | 0x00000808, /* rs100 */ | ||
| 616 | 0x00000808, /* rv200 */ | ||
| 617 | 0x00000808, /* rs200 */ | ||
| 618 | 0x00000808, /* r200 */ | ||
| 619 | 0x00000808, /* rv250 */ | ||
| 620 | 0x00000000, /* rs300 */ | ||
| 621 | 0x00000808, /* rv280 */ | ||
| 622 | 0x00000808, /* r300 */ | ||
| 623 | 0x00000808, /* r350 */ | ||
| 624 | 0x00000808, /* rv350 */ | ||
| 625 | 0x00000808, /* rv380 */ | ||
| 626 | 0x00000808, /* r420 */ | ||
| 627 | 0x00000808, /* r423 */ | ||
| 628 | 0x00000808, /* rv410 */ | ||
| 629 | 0x00000000, /* rs400 */ | ||
| 630 | 0x00000000, /* rs480 */ | ||
| 631 | }; | ||
| 632 | |||
| 633 | static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev, | ||
| 634 | struct radeon_encoder_primary_dac *p_dac) | ||
| 635 | { | ||
| 636 | p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family]; | ||
| 637 | return; | ||
| 638 | } | ||
| 639 | |||
| 598 | struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | 640 | struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct |
| 599 | radeon_encoder | 641 | radeon_encoder |
| 600 | *encoder) | 642 | *encoder) |
| @@ -604,20 +646,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | |||
| 604 | uint16_t dac_info; | 646 | uint16_t dac_info; |
| 605 | uint8_t rev, bg, dac; | 647 | uint8_t rev, bg, dac; |
| 606 | struct radeon_encoder_primary_dac *p_dac = NULL; | 648 | struct radeon_encoder_primary_dac *p_dac = NULL; |
| 649 | int found = 0; | ||
| 607 | 650 | ||
| 608 | if (rdev->bios == NULL) | 651 | p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), |
| 652 | GFP_KERNEL); | ||
| 653 | |||
| 654 | if (!p_dac) | ||
| 609 | return NULL; | 655 | return NULL; |
| 610 | 656 | ||
| 657 | if (rdev->bios == NULL) | ||
| 658 | goto out; | ||
| 659 | |||
| 611 | /* check CRT table */ | 660 | /* check CRT table */ |
| 612 | dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); | 661 | dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); |
| 613 | if (dac_info) { | 662 | 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; | 663 | rev = RBIOS8(dac_info) & 0x3; |
| 622 | if (rev < 2) { | 664 | if (rev < 2) { |
| 623 | bg = RBIOS8(dac_info + 0x2) & 0xf; | 665 | bg = RBIOS8(dac_info + 0x2) & 0xf; |
| @@ -628,9 +670,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct | |||
| 628 | dac = RBIOS8(dac_info + 0x3) & 0xf; | 670 | dac = RBIOS8(dac_info + 0x3) & 0xf; |
| 629 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); | 671 | p_dac->ps2_pdac_adj = (bg << 8) | (dac); |
| 630 | } | 672 | } |
| 631 | 673 | found = 1; | |
| 632 | } | 674 | } |
| 633 | 675 | ||
| 676 | out: | ||
| 677 | if (!found) /* fallback to defaults */ | ||
| 678 | radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac); | ||
| 679 | |||
| 634 | return p_dac; | 680 | return p_dac; |
| 635 | } | 681 | } |
| 636 | 682 | ||
