diff options
| author | Dave Airlie <airlied@redhat.com> | 2014-04-22 17:39:12 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2014-04-22 17:39:12 -0400 |
| commit | abaafc0af9f74f8e6212a3bf54fb907358b40ad7 (patch) | |
| tree | 09528a1f33d2ef0d247a2564766035175e87faf1 | |
| parent | 4d0fa8a0f01272d4de33704f20303dcecdb55df1 (diff) | |
| parent | 73acacc7397fe854ed2ab75f1c940fa00faaf15e (diff) | |
Merge branch 'drm-fixes-3.15' of git://people.freedesktop.org/~deathsimple/linux into drm-next
1. Further PLL parameter fixes.
2. Fixes for HPD on DP
3. Could of different PM fixes
4. Disabling DPM on RV770
* 'drm-fixes-3.15' of git://people.freedesktop.org/~deathsimple/linux:
drm/radeon: don't allow runpm=1 on systems with out ATPX
drm/radeon: fix ATPX detection on non-VGA GPUs
drm/radeon/pm: don't walk the crtc list before it has been initialized (v2)
drm/radeon: properly unregister hwmon interface (v2)
drm/radeon: fix count in cik_sdma_ring_test()
drm/radeon/aux: fix hpd assignment for aux bus
drm/radeon: improve PLL limit handling in post div calculation
drm/radeon: use fixed PPL ref divider if needed
drm/radeon: disable dpm on rv770 by default
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_dpm.c | 35 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atpx_handler.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 84 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_kms.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 51 |
7 files changed, 120 insertions, 68 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 15936524f226..bc0119fb6c12 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -209,6 +209,7 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector) | |||
| 209 | { | 209 | { |
| 210 | int ret; | 210 | int ret; |
| 211 | 211 | ||
| 212 | radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd; | ||
| 212 | radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev; | 213 | radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev; |
| 213 | radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer; | 214 | radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer; |
| 214 | ret = drm_dp_aux_register_i2c_bus(&radeon_connector->ddc_bus->aux); | 215 | ret = drm_dp_aux_register_i2c_bus(&radeon_connector->ddc_bus->aux); |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 89b4afa5041c..f7e46cf682af 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
| @@ -597,7 +597,7 @@ int cik_sdma_ring_test(struct radeon_device *rdev, | |||
| 597 | tmp = 0xCAFEDEAD; | 597 | tmp = 0xCAFEDEAD; |
| 598 | writel(tmp, ptr); | 598 | writel(tmp, ptr); |
| 599 | 599 | ||
| 600 | r = radeon_ring_lock(rdev, ring, 4); | 600 | r = radeon_ring_lock(rdev, ring, 5); |
| 601 | if (r) { | 601 | if (r) { |
| 602 | DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r); | 602 | DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r); |
| 603 | return r; | 603 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index cbf7e3269f84..9c61b74ef441 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
| @@ -158,16 +158,18 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) | |||
| 158 | u32 line_time_us, vblank_lines; | 158 | u32 line_time_us, vblank_lines; |
| 159 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ | 159 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ |
| 160 | 160 | ||
| 161 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 161 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
| 162 | radeon_crtc = to_radeon_crtc(crtc); | 162 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| 163 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | 163 | radeon_crtc = to_radeon_crtc(crtc); |
| 164 | line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / | 164 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
| 165 | radeon_crtc->hw_mode.clock; | 165 | line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / |
| 166 | vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - | 166 | radeon_crtc->hw_mode.clock; |
| 167 | radeon_crtc->hw_mode.crtc_vdisplay + | 167 | vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - |
| 168 | (radeon_crtc->v_border * 2); | 168 | radeon_crtc->hw_mode.crtc_vdisplay + |
| 169 | vblank_time_us = vblank_lines * line_time_us; | 169 | (radeon_crtc->v_border * 2); |
| 170 | break; | 170 | vblank_time_us = vblank_lines * line_time_us; |
| 171 | break; | ||
| 172 | } | ||
| 171 | } | 173 | } |
| 172 | } | 174 | } |
| 173 | 175 | ||
| @@ -181,14 +183,15 @@ u32 r600_dpm_get_vrefresh(struct radeon_device *rdev) | |||
| 181 | struct radeon_crtc *radeon_crtc; | 183 | struct radeon_crtc *radeon_crtc; |
| 182 | u32 vrefresh = 0; | 184 | u32 vrefresh = 0; |
| 183 | 185 | ||
| 184 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 186 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
| 185 | radeon_crtc = to_radeon_crtc(crtc); | 187 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| 186 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | 188 | radeon_crtc = to_radeon_crtc(crtc); |
| 187 | vrefresh = radeon_crtc->hw_mode.vrefresh; | 189 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
| 188 | break; | 190 | vrefresh = radeon_crtc->hw_mode.vrefresh; |
| 191 | break; | ||
| 192 | } | ||
| 189 | } | 193 | } |
| 190 | } | 194 | } |
| 191 | |||
| 192 | return vrefresh; | 195 | return vrefresh; |
| 193 | } | 196 | } |
| 194 | 197 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index dedea72f48c4..a9fb0d016d38 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -528,6 +528,13 @@ static bool radeon_atpx_detect(void) | |||
| 528 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | 528 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
| 529 | } | 529 | } |
| 530 | 530 | ||
| 531 | /* some newer PX laptops mark the dGPU as a non-VGA display device */ | ||
| 532 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { | ||
| 533 | vga_count++; | ||
| 534 | |||
| 535 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | ||
| 536 | } | ||
| 537 | |||
| 531 | if (has_atpx && vga_count == 2) { | 538 | if (has_atpx && vga_count == 2) { |
| 532 | acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); | 539 | acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); |
| 533 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", | 540 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 2f7cbb901fb1..8d99d5ee8014 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -840,6 +840,38 @@ static void avivo_reduce_ratio(unsigned *nom, unsigned *den, | |||
| 840 | } | 840 | } |
| 841 | 841 | ||
| 842 | /** | 842 | /** |
| 843 | * avivo_get_fb_ref_div - feedback and ref divider calculation | ||
| 844 | * | ||
| 845 | * @nom: nominator | ||
| 846 | * @den: denominator | ||
| 847 | * @post_div: post divider | ||
| 848 | * @fb_div_max: feedback divider maximum | ||
| 849 | * @ref_div_max: reference divider maximum | ||
| 850 | * @fb_div: resulting feedback divider | ||
| 851 | * @ref_div: resulting reference divider | ||
| 852 | * | ||
| 853 | * Calculate feedback and reference divider for a given post divider. Makes | ||
| 854 | * sure we stay within the limits. | ||
| 855 | */ | ||
| 856 | static void avivo_get_fb_ref_div(unsigned nom, unsigned den, unsigned post_div, | ||
| 857 | unsigned fb_div_max, unsigned ref_div_max, | ||
| 858 | unsigned *fb_div, unsigned *ref_div) | ||
| 859 | { | ||
| 860 | /* limit reference * post divider to a maximum */ | ||
| 861 | ref_div_max = min(210 / post_div, ref_div_max); | ||
| 862 | |||
| 863 | /* get matching reference and feedback divider */ | ||
| 864 | *ref_div = min(max(DIV_ROUND_CLOSEST(den, post_div), 1u), ref_div_max); | ||
| 865 | *fb_div = DIV_ROUND_CLOSEST(nom * *ref_div * post_div, den); | ||
| 866 | |||
| 867 | /* limit fb divider to its maximum */ | ||
| 868 | if (*fb_div > fb_div_max) { | ||
| 869 | *ref_div = DIV_ROUND_CLOSEST(*ref_div * fb_div_max, *fb_div); | ||
| 870 | *fb_div = fb_div_max; | ||
| 871 | } | ||
| 872 | } | ||
| 873 | |||
| 874 | /** | ||
| 843 | * radeon_compute_pll_avivo - compute PLL paramaters | 875 | * radeon_compute_pll_avivo - compute PLL paramaters |
| 844 | * | 876 | * |
| 845 | * @pll: information about the PLL | 877 | * @pll: information about the PLL |
| @@ -860,6 +892,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
| 860 | u32 *ref_div_p, | 892 | u32 *ref_div_p, |
| 861 | u32 *post_div_p) | 893 | u32 *post_div_p) |
| 862 | { | 894 | { |
| 895 | unsigned target_clock = pll->flags & RADEON_PLL_USE_FRAC_FB_DIV ? | ||
| 896 | freq : freq / 10; | ||
| 897 | |||
| 863 | unsigned fb_div_min, fb_div_max, fb_div; | 898 | unsigned fb_div_min, fb_div_max, fb_div; |
| 864 | unsigned post_div_min, post_div_max, post_div; | 899 | unsigned post_div_min, post_div_max, post_div; |
| 865 | unsigned ref_div_min, ref_div_max, ref_div; | 900 | unsigned ref_div_min, ref_div_max, ref_div; |
| @@ -880,14 +915,18 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
| 880 | ref_div_min = pll->reference_div; | 915 | ref_div_min = pll->reference_div; |
| 881 | else | 916 | else |
| 882 | ref_div_min = pll->min_ref_div; | 917 | ref_div_min = pll->min_ref_div; |
| 883 | ref_div_max = pll->max_ref_div; | 918 | |
| 919 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && | ||
| 920 | pll->flags & RADEON_PLL_USE_REF_DIV) | ||
| 921 | ref_div_max = pll->reference_div; | ||
| 922 | else | ||
| 923 | ref_div_max = pll->max_ref_div; | ||
| 884 | 924 | ||
| 885 | /* determine allowed post divider range */ | 925 | /* determine allowed post divider range */ |
| 886 | if (pll->flags & RADEON_PLL_USE_POST_DIV) { | 926 | if (pll->flags & RADEON_PLL_USE_POST_DIV) { |
| 887 | post_div_min = pll->post_div; | 927 | post_div_min = pll->post_div; |
| 888 | post_div_max = pll->post_div; | 928 | post_div_max = pll->post_div; |
| 889 | } else { | 929 | } else { |
| 890 | unsigned target_clock = freq / 10; | ||
| 891 | unsigned vco_min, vco_max; | 930 | unsigned vco_min, vco_max; |
| 892 | 931 | ||
| 893 | if (pll->flags & RADEON_PLL_IS_LCD) { | 932 | if (pll->flags & RADEON_PLL_IS_LCD) { |
| @@ -898,6 +937,11 @@ void radeon_compute_pl | |||
