diff options
Diffstat (limited to 'drivers')
29 files changed, 278 insertions, 79 deletions
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 41c69469ce20..971d796e071d 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig | |||
| @@ -26,6 +26,7 @@ config DW_APB_TIMER_OF | |||
| 26 | 26 | ||
| 27 | config ARMADA_370_XP_TIMER | 27 | config ARMADA_370_XP_TIMER |
| 28 | bool | 28 | bool |
| 29 | select CLKSRC_OF | ||
| 29 | 30 | ||
| 30 | config ORION_TIMER | 31 | config ORION_TIMER |
| 31 | select CLKSRC_OF | 32 | select CLKSRC_OF |
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c index 37f5325bec95..b9ddd9e3a2f5 100644 --- a/drivers/clocksource/clksrc-of.c +++ b/drivers/clocksource/clksrc-of.c | |||
| @@ -30,6 +30,9 @@ void __init clocksource_of_init(void) | |||
| 30 | clocksource_of_init_fn init_func; | 30 | clocksource_of_init_fn init_func; |
| 31 | 31 | ||
| 32 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { | 32 | for_each_matching_node_and_match(np, __clksrc_of_table, &match) { |
| 33 | if (!of_device_is_available(np)) | ||
| 34 | continue; | ||
| 35 | |||
| 33 | init_func = match->data; | 36 | init_func = match->data; |
| 34 | init_func(np); | 37 | init_func(np); |
| 35 | } | 38 | } |
diff --git a/drivers/clocksource/em_sti.c b/drivers/clocksource/em_sti.c index b9c81b7c3a3b..3a5909c12d42 100644 --- a/drivers/clocksource/em_sti.c +++ b/drivers/clocksource/em_sti.c | |||
| @@ -301,7 +301,7 @@ static void em_sti_register_clockevent(struct em_sti_priv *p) | |||
| 301 | ced->name = dev_name(&p->pdev->dev); | 301 | ced->name = dev_name(&p->pdev->dev); |
| 302 | ced->features = CLOCK_EVT_FEAT_ONESHOT; | 302 | ced->features = CLOCK_EVT_FEAT_ONESHOT; |
| 303 | ced->rating = 200; | 303 | ced->rating = 200; |
| 304 | ced->cpumask = cpumask_of(0); | 304 | ced->cpumask = cpu_possible_mask; |
| 305 | ced->set_next_event = em_sti_clock_event_next; | 305 | ced->set_next_event = em_sti_clock_event_next; |
| 306 | ced->set_mode = em_sti_clock_event_mode; | 306 | ced->set_mode = em_sti_clock_event_mode; |
| 307 | 307 | ||
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index 5b34768f4d7c..62b0de6a1837 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
| @@ -428,7 +428,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
| 428 | evt->irq); | 428 | evt->irq); |
| 429 | return -EIO; | 429 | return -EIO; |
| 430 | } | 430 | } |
| 431 | irq_set_affinity(evt->irq, cpumask_of(cpu)); | ||
| 432 | } else { | 431 | } else { |
| 433 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); | 432 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
| 434 | } | 433 | } |
| @@ -449,6 +448,7 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 449 | unsigned long action, void *hcpu) | 448 | unsigned long action, void *hcpu) |
| 450 | { | 449 | { |
| 451 | struct mct_clock_event_device *mevt; | 450 | struct mct_clock_event_device *mevt; |
| 451 | unsigned int cpu; | ||
| 452 | 452 | ||
| 453 | /* | 453 | /* |
| 454 | * Grab cpu pointer in each case to avoid spurious | 454 | * Grab cpu pointer in each case to avoid spurious |
| @@ -459,6 +459,12 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 459 | mevt = this_cpu_ptr(&percpu_mct_tick); | 459 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 460 | exynos4_local_timer_setup(&mevt->evt); | 460 | exynos4_local_timer_setup(&mevt->evt); |
| 461 | break; | 461 | break; |
| 462 | case CPU_ONLINE: | ||
| 463 | cpu = (unsigned long)hcpu; | ||
| 464 | if (mct_int_type == MCT_INT_SPI) | ||
| 465 | irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], | ||
| 466 | cpumask_of(cpu)); | ||
| 467 | break; | ||
| 462 | case CPU_DYING: | 468 | case CPU_DYING: |
| 463 | mevt = this_cpu_ptr(&percpu_mct_tick); | 469 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 464 | exynos4_local_timer_stop(&mevt->evt); | 470 | exynos4_local_timer_stop(&mevt->evt); |
| @@ -500,6 +506,8 @@ static void __init exynos4_timer_resources(struct device_node *np, void __iomem | |||
| 500 | &percpu_mct_tick); | 506 | &percpu_mct_tick); |
| 501 | WARN(err, "MCT: can't request IRQ %d (%d)\n", | 507 | WARN(err, "MCT: can't request IRQ %d (%d)\n", |
| 502 | mct_irqs[MCT_L0_IRQ], err); | 508 | mct_irqs[MCT_L0_IRQ], err); |
| 509 | } else { | ||
| 510 | irq_set_affinity(mct_irqs[MCT_L0_IRQ], cpumask_of(0)); | ||
| 503 | } | 511 | } |
| 504 | 512 | ||
| 505 | err = register_cpu_notifier(&exynos4_mct_cpu_nb); | 513 | err = register_cpu_notifier(&exynos4_mct_cpu_nb); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index df9253d890ee..cdfb9da0e4ce 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -4800,10 +4800,10 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc) | |||
| 4800 | 4800 | ||
| 4801 | if (!mutex_trylock(&dev->struct_mutex)) { | 4801 | if (!mutex_trylock(&dev->struct_mutex)) { |
| 4802 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) | 4802 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
| 4803 | return SHRINK_STOP; | 4803 | return 0; |
| 4804 | 4804 | ||
| 4805 | if (dev_priv->mm.shrinker_no_lock_stealing) | 4805 | if (dev_priv->mm.shrinker_no_lock_stealing) |
| 4806 | return SHRINK_STOP; | 4806 | return 0; |
| 4807 | 4807 | ||
| 4808 | unlock = false; | 4808 | unlock = false; |
| 4809 | } | 4809 | } |
| @@ -4901,10 +4901,10 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) | |||
| 4901 | 4901 | ||
| 4902 | if (!mutex_trylock(&dev->struct_mutex)) { | 4902 | if (!mutex_trylock(&dev->struct_mutex)) { |
| 4903 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) | 4903 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
| 4904 | return 0; | 4904 | return SHRINK_STOP; |
| 4905 | 4905 | ||
| 4906 | if (dev_priv->mm.shrinker_no_lock_stealing) | 4906 | if (dev_priv->mm.shrinker_no_lock_stealing) |
| 4907 | return 0; | 4907 | return SHRINK_STOP; |
| 4908 | 4908 | ||
| 4909 | unlock = false; | 4909 | unlock = false; |
| 4910 | } | 4910 | } |
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index aba9d7498996..dae364f0028c 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
| @@ -143,8 +143,10 @@ static void i915_error_vprintf(struct drm_i915_error_state_buf *e, | |||
| 143 | 143 | ||
| 144 | /* Seek the first printf which is hits start position */ | 144 | /* Seek the first printf which is hits start position */ |
| 145 | if (e->pos < e->start) { | 145 | if (e->pos < e->start) { |
| 146 | len = vsnprintf(NULL, 0, f, args); | 146 | va_list tmp; |
| 147 | if (!__i915_error_seek(e, len)) | 147 | |
| 148 | va_copy(tmp, args); | ||
| 149 | if (!__i915_error_seek(e, vsnprintf(NULL, 0, f, tmp))) | ||
| 148 | return; | 150 | return; |
| 149 | } | 151 | } |
| 150 | 152 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d8a1d98693e7..e5822e79f912 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -4775,6 +4775,10 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc) | |||
| 4775 | 4775 | ||
| 4776 | pipeconf = 0; | 4776 | pipeconf = 0; |
| 4777 | 4777 | ||
| 4778 | if (dev_priv->quirks & QUIRK_PIPEA_FORCE && | ||
| 4779 | I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE) | ||
| 4780 | pipeconf |= PIPECONF_ENABLE; | ||
| 4781 | |||
| 4778 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { | 4782 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { |
| 4779 | /* Enable pixel doubling when the dot clock is > 90% of the (display) | 4783 | /* Enable pixel doubling when the dot clock is > 90% of the (display) |
| 4780 | * core speed. | 4784 | * core speed. |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 2151d13772b8..79c14e298ba6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -588,7 +588,18 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | |||
| 588 | DRM_DEBUG_KMS("aux_ch native nack\n"); | 588 | DRM_DEBUG_KMS("aux_ch native nack\n"); |
| 589 | return -EREMOTEIO; | 589 | return -EREMOTEIO; |
| 590 | case AUX_NATIVE_REPLY_DEFER: | 590 | case AUX_NATIVE_REPLY_DEFER: |
| 591 | udelay(100); | 591 | /* |
| 592 | * For now, just give more slack to branch devices. We | ||
| 593 | * could check the DPCD for I2C bit rate capabilities, | ||
| 594 | * and if available, adjust the interval. We could also | ||
| 595 | * be more careful with DP-to-Legacy adapters where a | ||
| 596 | * long legacy cable may force very low I2C bit rates. | ||
| 597 | */ | ||
| 598 | if (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & | ||
| 599 | DP_DWN_STRM_PORT_PRESENT) | ||
| 600 | usleep_range(500, 600); | ||
| 601 | else | ||
| 602 | usleep_range(300, 400); | ||
| 592 | continue; | 603 | continue; |
| 593 | default: | 604 | default: |
| 594 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", | 605 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index f2c6d7909ae2..dd6f84bf6c22 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -916,6 +916,14 @@ intel_tv_compute_config(struct intel_encoder *encoder, | |||
| 916 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); | 916 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); |
| 917 | pipe_config->pipe_bpp = 8*3; | 917 | pipe_config->pipe_bpp = 8*3; |
| 918 | 918 | ||
| 919 | /* TV has it's own notion of sync and other mode flags, so clear them. */ | ||
| 920 | pipe_config->adjusted_mode.flags = 0; | ||
| 921 | |||
| 922 | /* | ||
| 923 | * FIXME: We don't check whether the input mode is actually what we want | ||
| 924 | * or whether userspace is doing something stupid. | ||
| 925 | */ | ||
| 926 | |||
| 919 | return true; | 927 | return true; |
| 920 | } | 928 | } |
| 921 | 929 | ||
diff --git a/drivers/gpu/drm/msm/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp4/mdp4_kms.c index 5db5bbaedae2..bc7fd11ad8be 100644 --- a/drivers/gpu/drm/msm/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/mdp4/mdp4_kms.c | |||
| @@ -19,8 +19,6 @@ | |||
| 19 | #include "msm_drv.h" | 19 | #include "msm_drv.h" |
| 20 | #include "mdp4_kms.h" | 20 | #include "mdp4_kms.h" |
| 21 | 21 | ||
| 22 | #include <mach/iommu.h> | ||
| 23 | |||
| 24 | static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev); | 22 | static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev); |
| 25 | 23 | ||
| 26 | static int mdp4_hw_init(struct msm_kms *kms) | 24 | static int mdp4_hw_init(struct msm_kms *kms) |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 008d772384c7..b3a2f1629041 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
| @@ -18,8 +18,6 @@ | |||
| 18 | #include "msm_drv.h" | 18 | #include "msm_drv.h" |
| 19 | #include "msm_gpu.h" | 19 | #include "msm_gpu.h" |
| 20 | 20 | ||
| 21 | #include <mach/iommu.h> | ||
| 22 | |||
| 23 | static void msm_fb_output_poll_changed(struct drm_device *dev) | 21 | static void msm_fb_output_poll_changed(struct drm_device *dev) |
| 24 | { | 22 | { |
| 25 | struct msm_drm_private *priv = dev->dev_private; | 23 | struct msm_drm_private *priv = dev->dev_private; |
| @@ -62,6 +60,8 @@ int msm_iommu_attach(struct drm_device *dev, struct iommu_domain *iommu, | |||
| 62 | int i, ret; | 60 | int i, ret; |
| 63 | 61 | ||
| 64 | for (i = 0; i < cnt; i++) { | 62 | for (i = 0; i < cnt; i++) { |
| 63 | /* TODO maybe some day msm iommu won't require this hack: */ | ||
| 64 | struct device *msm_iommu_get_ctx(const char *ctx_name); | ||
| 65 | struct device *ctx = msm_iommu_get_ctx(names[i]); | 65 | struct device *ctx = msm_iommu_get_ctx(names[i]); |
| 66 | if (!ctx) | 66 | if (!ctx) |
| 67 | continue; | 67 | continue; |
| @@ -199,7 +199,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags) | |||
| 199 | * imx drm driver on iMX5 | 199 | * imx drm driver on iMX5 |
| 200 | */ | 200 | */ |
| 201 | dev_err(dev->dev, "failed to load kms\n"); | 201 | dev_err(dev->dev, "failed to load kms\n"); |
| 202 | ret = PTR_ERR(priv->kms); | 202 | ret = PTR_ERR(kms); |
| 203 | goto fail; | 203 | goto fail; |
| 204 | } | 204 | } |
| 205 | 205 | ||
| @@ -697,7 +697,7 @@ static struct drm_driver msm_driver = { | |||
| 697 | .gem_vm_ops = &vm_ops, | 697 | .gem_vm_ops = &vm_ops, |
| 698 | .dumb_create = msm_gem_dumb_create, | 698 | .dumb_create = msm_gem_dumb_create, |
| 699 | .dumb_map_offset = msm_gem_dumb_map_offset, | 699 | .dumb_map_offset = msm_gem_dumb_map_offset, |
| 700 | .dumb_destroy = msm_gem_dumb_destroy, | 700 | .dumb_destroy = drm_gem_dumb_destroy, |
| 701 | #ifdef CONFIG_DEBUG_FS | 701 | #ifdef CONFIG_DEBUG_FS |
| 702 | .debugfs_init = msm_debugfs_init, | 702 | .debugfs_init = msm_debugfs_init, |
| 703 | .debugfs_cleanup = msm_debugfs_cleanup, | 703 | .debugfs_cleanup = msm_debugfs_cleanup, |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 29eacfa29cfb..2bae46c66a30 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
| @@ -319,13 +319,6 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, | |||
| 319 | MSM_BO_SCANOUT | MSM_BO_WC, &args->handle); | 319 | MSM_BO_SCANOUT | MSM_BO_WC, &args->handle); |
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | int msm_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, | ||
| 323 | uint32_t handle) | ||
| 324 | { | ||
| 325 | /* No special work needed, drop the reference and see what falls out */ | ||
| 326 | return drm_gem_handle_delete(file, handle); | ||
| 327 | } | ||
| 328 | |||
| 329 | int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, | 322 | int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, |
| 330 | uint32_t handle, uint64_t *offset) | 323 | uint32_t handle, uint64_t *offset) |
| 331 | { | 324 | { |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c index 05ff315e8e9e..b162e98a2953 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.c +++ b/drivers/gpu/drm/radeon/btc_dpm.c | |||
| @@ -1168,6 +1168,23 @@ static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = | |||
| 1168 | { 25000, 30000, RADEON_SCLK_UP } | 1168 | { 25000, 30000, RADEON_SCLK_UP } |
| 1169 | }; | 1169 | }; |
| 1170 | 1170 | ||
| 1171 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
| 1172 | u32 *max_clock) | ||
| 1173 | { | ||
| 1174 | u32 i, clock = 0; | ||
| 1175 | |||
| 1176 | if ((table == NULL) || (table->count == 0)) { | ||
| 1177 | *max_clock = clock; | ||
| 1178 | return; | ||
| 1179 | } | ||
| 1180 | |||
| 1181 | for (i = 0; i < table->count; i++) { | ||
| 1182 | if (clock < table->entries[i].clk) | ||
| 1183 | clock = table->entries[i].clk; | ||
| 1184 | } | ||
| 1185 | *max_clock = clock; | ||
| 1186 | } | ||
| 1187 | |||
| 1171 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 1188 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
| 1172 | u32 clock, u16 max_voltage, u16 *voltage) | 1189 | u32 clock, u16 max_voltage, u16 *voltage) |
| 1173 | { | 1190 | { |
| @@ -2080,6 +2097,7 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2080 | bool disable_mclk_switching; | 2097 | bool disable_mclk_switching; |
| 2081 | u32 mclk, sclk; | 2098 | u32 mclk, sclk; |
| 2082 | u16 vddc, vddci; | 2099 | u16 vddc, vddci; |
| 2100 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
| 2083 | 2101 | ||
| 2084 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2102 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
| 2085 | btc_dpm_vblank_too_short(rdev)) | 2103 | btc_dpm_vblank_too_short(rdev)) |
| @@ -2121,6 +2139,39 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2121 | ps->low.vddci = max_limits->vddci; | 2139 | ps->low.vddci = max_limits->vddci; |
| 2122 | } | 2140 | } |
| 2123 | 2141 | ||
| 2142 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
| 2143 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
| 2144 | &max_sclk_vddc); | ||
| 2145 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
| 2146 | &max_mclk_vddci); | ||
| 2147 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
| 2148 | &max_mclk_vddc); | ||
| 2149 | |||
| 2150 | if (max_sclk_vddc) { | ||
| 2151 | if (ps->low.sclk > max_sclk_vddc) | ||
| 2152 | ps->low.sclk = max_sclk_vddc; | ||
| 2153 | if (ps->medium.sclk > max_sclk_vddc) | ||
| 2154 | ps->medium.sclk = max_sclk_vddc; | ||
| 2155 | if (ps->high.sclk > max_sclk_vddc) | ||
| 2156 | ps->high.sclk = max_sclk_vddc; | ||
| 2157 | } | ||
| 2158 | if (max_mclk_vddci) { | ||
| 2159 | if (ps->low.mclk > max_mclk_vddci) | ||
| 2160 | ps->low.mclk = max_mclk_vddci; | ||
| 2161 | if (ps->medium.mclk > max_mclk_vddci) | ||
| 2162 | ps->medium.mclk = max_mclk_vddci; | ||
| 2163 | if (ps->high.mclk > max_mclk_vddci) | ||
| 2164 | ps->high.mclk = max_mclk_vddci; | ||
| 2165 | } | ||
| 2166 | if (max_mclk_vddc) { | ||
| 2167 | if (ps->low.mclk > max_mclk_vddc) | ||
| 2168 | ps->low.mclk = max_mclk_vddc; | ||
| 2169 | if (ps->medium.mclk > max_mclk_vddc) | ||
| 2170 | ps->medium.mclk = max_mclk_vddc; | ||
| 2171 | if (ps->high.mclk > max_mclk_vddc) | ||
| 2172 | ps->high.mclk = max_mclk_vddc; | ||
| 2173 | } | ||
| 2174 | |||
| 2124 | /* XXX validate the min clocks required for display */ | 2175 | /* XXX validate the min clocks required for display */ |
| 2125 | 2176 | ||
| 2126 | if (disable_mclk_switching) { | 2177 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.h b/drivers/gpu/drm/radeon/btc_dpm.h index 1a15e0e41950..3b6f12b7760b 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.h +++ b/drivers/gpu/drm/radeon/btc_dpm.h | |||
| @@ -46,6 +46,8 @@ void btc_adjust_clock_combinations(struct radeon_device *rdev, | |||
| 46 | struct rv7xx_pl *pl); | 46 | struct rv7xx_pl *pl); |
| 47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
| 48 | u32 clock, u16 max_voltage, u16 *voltage); | 48 | u32 clock, u16 max_voltage, u16 *voltage); |
| 49 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
| 50 | u32 *max_clock); | ||
| 49 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, | 51 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, |
| 50 | u16 max_vddc, u16 max_vddci, | 52 | u16 max_vddc, u16 max_vddci, |
| 51 | u16 *vddc, u16 *vddci); | 53 | u16 *vddc, u16 *vddci); |
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index 899627443030..51e947a97edf 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
| @@ -146,6 +146,8 @@ static const struct ci_pt_config_reg didt_config_ci[] = | |||
| 146 | }; | 146 | }; |
| 147 | 147 | ||
| 148 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); | 148 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); |
| 149 | extern void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
| 150 | u32 *max_clock); | ||
| 149 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, | 151 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, |
| 150 | u32 arb_freq_src, u32 arb_freq_dest); | 152 | u32 arb_freq_src, u32 arb_freq_dest); |
| 151 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); | 153 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); |
| @@ -712,6 +714,7 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 712 | struct radeon_clock_and_voltage_limits *max_limits; | 714 | struct radeon_clock_and_voltage_limits *max_limits; |
| 713 | bool disable_mclk_switching; | 715 | bool disable_mclk_switching; |
| 714 | u32 sclk, mclk; | 716 | u32 sclk, mclk; |
| 717 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
| 715 | int i; | 718 | int i; |
| 716 | 719 | ||
| 717 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 720 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
| @@ -739,6 +742,29 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 739 | } | 742 | } |
| 740 | } | 743 | } |
| 741 | 744 | ||
| 745 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
| 746 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
| 747 | &max_sclk_vddc); | ||
| 748 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
| 749 | &max_mclk_vddci); | ||
| 750 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
| 751 | &max_mclk_vddc); | ||
| 752 | |||
| 753 | for (i = 0; i < ps->performance_level_count; i++) { | ||
| 754 | if (max_sclk_vddc) { | ||
| 755 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
| 756 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
| 757 | } | ||
| 758 | if (max_mclk_vddci) { | ||
| 759 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
| 760 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
| 761 | } | ||
| 762 | if (max_mclk_vddc) { | ||
| 763 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
| 764 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
| 765 | } | ||
| 766 | } | ||
| 767 | |||
| 742 | /* XXX validate the min clocks required for display */ | 768 | /* XXX validate the min clocks required for display */ |
| 743 | 769 | ||
| 744 | if (disable_mclk_switching) { | 770 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index adbdb6503b05..d02fd1c045d5 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -2845,10 +2845,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
| 2845 | rdev->config.cik.tile_config |= (3 << 0); | 2845 | rdev->config.cik.tile_config |= (3 << 0); |
| 2846 | break; | 2846 | break; |
| 2847 | } | 2847 | } |
| 2848 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) | 2848 | rdev->config.cik.tile_config |= |
| 2849 | rdev->config.cik.tile_config |= 1 << 4; | 2849 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; |
| 2850 | else | ||
| 2851 | rdev->config.cik.tile_config |= 0 << 4; | ||
| 2852 | rdev->config.cik.tile_config |= | 2850 | rdev->config.cik.tile_config |= |
| 2853 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; | 2851 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
| 2854 | rdev->config.cik.tile_config |= | 2852 | rdev->config.cik.tile_config |= |
| @@ -4456,8 +4454,8 @@ static int cik_mc_init(struct radeon_device *rdev) | |||
| 4456 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); | 4454 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
| 4457 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); | 4455 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
| 4458 | /* size in MB on si */ | 4456 | /* size in MB on si */ |
| 4459 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4457 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
| 4460 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 4458 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
| 4461 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 4459 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
| 4462 | si_vram_gtt_location(rdev, &rdev->mc); | 4460 | si_vram_gtt_location(rdev, &rdev->mc); |
| 4463 | radeon_update_bandwidth_info(rdev); | 4461 | radeon_update_bandwidth_info(rdev); |
| @@ -4735,12 +4733,13 @@ static void cik_vm_decode_fault(struct radeon_device *rdev, | |||
| 4735 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; | 4733 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; |
| 4736 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; | 4734 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; |
| 4737 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; | 4735 | u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; |
| 4738 | char *block = (char *)&mc_client; | 4736 | char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, |
| 4737 | (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; | ||
| 4739 | 4738 | ||
| 4740 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", | 4739 | printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", |
| 4741 | protections, vmid, addr, | 4740 | protections, vmid, addr, |
| 4742 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", | 4741 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", |
| 4743 | block, mc_id); | 4742 | block, mc_client, mc_id); |
| 4744 | } | 4743 | } |
| 4745 | 4744 | ||
| 4746 | /** | 4745 | /** |
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c index 6c398a456d78..f26339028154 100644 --- a/drivers/gpu/drm/radeon/ni_dpm.c +++ b/drivers/gpu/drm/radeon/ni_dpm.c | |||
| @@ -787,6 +787,7 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 787 | bool disable_mclk_switching; | 787 | bool disable_mclk_switching; |
| 788 | u32 mclk, sclk; | 788 | u32 mclk, sclk; |
| 789 | u16 vddc, vddci; | 789 | u16 vddc, vddci; |
| 790 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
| 790 | int i; | 791 | int i; |
| 791 | 792 | ||
| 792 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 793 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
| @@ -813,6 +814,29 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 813 | } | 814 | } |
| 814 | } | 815 | } |
| 815 | 816 | ||
| 817 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
| 818 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
| 819 | &max_sclk_vddc); | ||
| 820 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
| 821 | &max_mclk_vddci); | ||
| 822 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
| 823 | &max_mclk_vddc); | ||
| 824 | |||
| 825 | for (i = 0; i < ps->performance_level_count; i++) { | ||
| 826 | if (max_sclk_vddc) { | ||
| 827 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
| 828 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
| 829 | } | ||
| 830 | if (max_mclk_vddci) { | ||
| 831 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
| 832 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
| 833 | } | ||
| 834 | if (max_mclk_vddc) { | ||
| 835 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
| 836 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
| 837 | } | ||
| 838 | } | ||
| 839 | |||
| 816 | /* XXX validate the min clocks required for display */ | 840 | /* XXX validate the min clocks required for display */ |
| 817 | 841 | ||
| 818 | if (disable_mclk_switching) { | 842 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 24175717307b..d71333033b2b 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -2933,9 +2933,11 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data) | |||
| 2933 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); | 2933 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); |
| 2934 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); | 2934 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
| 2935 | seq_printf(m, "%u dwords in ring\n", count); | 2935 | seq_printf(m, "%u dwords in ring\n", count); |
| 2936 | for (j = 0; j <= count; j++) { | 2936 | if (ring->ready) { |
| 2937 | i = (rdp + j) & ring->ptr_mask; | 2937 | for (j = 0; j <= count; j++) { |
| 2938 | seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | 2938 | i = (rdp + j) & ring->ptr_mask; |
| 2939 | seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | ||
| 2940 | } | ||
| 2939 | } | 2941 | } |
| 2940 | return 0; | 2942 | return 0; |
| 2941 | } | 2943 | } |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index e65f211a7be0..5513d8f06252 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
| @@ -1084,7 +1084,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) | |||
| 1084 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk = | 1084 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk = |
| 1085 | le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16); | 1085 | le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16); |
| 1086 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v = | 1086 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v = |
| 1087 | le16_to_cpu(limits->entries[i].usVoltage); | 1087 | le16_to_cpu(entry->usVoltage); |
| 1088 | entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *) | 1088 | entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *) |
| 1089 | ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record)); | 1089 | ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record)); |
| 1090 | } | 1090 | } |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index f443010ce90b..b0fa6002af3e 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -257,10 +257,7 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) | |||
| 257 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | 257 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
| 258 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 258 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
| 259 | */ | 259 | */ |
| 260 | if (ASIC_IS_DCE3(rdev)) { | 260 | if (ASIC_IS_DCE32(rdev)) { |
| 261 | /* according to the reg specs, this should DCE3.2 only, but in | ||
| 262 | * practice it seems to cover DCE3.0 as well. | ||
| 263 | */ | ||
| 264 | if (dig->dig_encoder == 0) { | 261 | if (dig->dig_encoder == 0) { |
| 265 | dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK; | 262 | dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK; |
| 266 | dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio); | 263 | dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio); |
| @@ -276,8 +273,21 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) | |||
| 276 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); | 273 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); |
| 277 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ | 274 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
| 278 | } | 275 | } |
| 276 | } else if (ASIC_IS_DCE3(rdev)) { | ||
| 277 | /* according to the reg specs, this should DCE3.2 only, but in | ||
| 278 | * practice it seems to cover DCE3.0/3.1 as well. | ||
| 279 | */ | ||
| 280 | if (dig->dig_encoder == 0) { | ||
| 281 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); | ||
| 282 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); | ||
| 283 | WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */ | ||
| 284 | } else { | ||
| 285 | WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100); | ||
| 286 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100); | ||
| 287 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ | ||
| 288 | } | ||
| 279 | } else { | 289 | } else { |
| 280 | /* according to the reg specs, this should be DCE2.0 and DCE3.0 */ | 290 | /* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */ |
| 281 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | | 291 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | |
| 282 | AUDIO_DTO_MODULE(clock / 10)); | 292 | AUDIO_DTO_MODULE(clock / 10)); |
| 283 | } | 293 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 5003385a7512..8f7e04538fd6 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -1004,6 +1004,8 @@ static struct radeon_asic rv6xx_asic = { | |||
| 1004 | .wait_for_vblank = &avivo_wait_for_vblank, | 1004 | .wait_for_vblank = &avivo_wait_for_vblank, |
| 1005 | .set_backlight_level = &atombios_set_backlight_level, | 1005 | .set_backlight_level = &atombios_set_backlight_level, |
| 1006 | .get_backlight_level = &atombios_get_backlight_level, | 1006 | .get_backlight_level = &atombios_get_backlight_level, |
| 1007 | .hdmi_enable = &r600_hdmi_enable, | ||
| 1008 | .hdmi_setmode = &r600_hdmi_setmode, | ||
| 1007 | }, | 1009 | }, |
| 1008 | .copy = { | 1010 | .copy = { |
| 1009 | .blit = &r600_copy_cpdma, | 1011 | .blit = &r600_copy_cpdma, |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 404e25d285ba..f79ee184ffd5 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -1367,6 +1367,7 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, | |||
| 1367 | int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); | 1367 | int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); |
| 1368 | uint16_t data_offset, size; | 1368 | uint16_t data_offset, size; |
| 1369 | struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; | 1369 | struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; |
| 1370 | struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *ss_assign; | ||
| 1370 | uint8_t frev, crev; | 1371 | uint8_t frev, crev; |
| 1371 | int i, num_indices; | 1372 | int i, num_indices; |
| 1372 | 1373 | ||
| @@ -1378,18 +1379,21 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, | |||
| 1378 | 1379 | ||
| 1379 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1380 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
| 1380 | sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); | 1381 | sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); |
| 1381 | 1382 | ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) | |
| 1383 | ((u8 *)&ss_info->asSS_Info[0]); | ||
| 1382 | for (i = 0; i < num_indices; i++) { | 1384 | for (i = 0; i < num_indices; i++) { |
| 1383 | if (ss_info->asSS_Info[i].ucSS_Id == id) { | 1385 | if (ss_assign->ucSS_Id == id) { |
| 1384 | ss->percentage = | 1386 | ss->percentage = |
| 1385 | le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage); | 1387 | le16_to_cpu(ss_assign->usSpreadSpectrumPercentage); |
| 1386 | ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType; | 1388 | ss->type = ss_assign->ucSpreadSpectrumType; |
| 1387 | ss->step = ss_info->asSS_Info[i].ucSS_Step; | 1389 | ss->step = ss_assign->ucSS_Step; |
| 1388 | ss->delay = ss_info->asSS_Info[i].ucSS_Delay; | 1390 | ss->delay = ss_assign->ucSS_Delay; |
| 1389 | ss->range = ss_info->asSS_Info[i].ucSS_Range; | 1391 | ss->range = ss_assign->ucSS_Range; |
| 1390 | ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; | 1392 | ss->refdiv = ss_assign->ucRecommendedRef_Div; |
| 1391 | return true; | 1393 | return true; |
| 1392 | } | 1394 | } |
| 1395 | ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) | ||
| 1396 | ((u8 *)ss_assign + sizeof(struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT)); | ||
| 1393 | } | 1397 | } |
| 1394 | } | 1398 | } |
| 1395 | return false; | 1399 | return false; |
| @@ -1477,6 +1481,12 @@ union asic_ss_info { | |||
| 1477 | struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; | 1481 | struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; |
| 1478 | }; | 1482 | }; |
| 1479 | 1483 | ||
| 1484 | union asic_ss_assignment { | ||
| 1485 | struct _ATOM_ASIC_SS_ASSIGNMENT v1; | ||
| 1486 | struct _ATOM_ASIC_SS_ASSIGNMENT_V2 v2; | ||
| 1487 | struct _ATOM_ASIC_SS_ASSIGNMENT_V3 v3; | ||
| 1488 | }; | ||
| 1489 | |||
| 1480 | bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | 1490 | bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, |
| 1481 | struct radeon_atom_ss *ss, | 1491 | struct radeon_atom_ss *ss, |
| 1482 | int id, u32 clock) | 1492 | int id, u32 clock) |
| @@ -1485,6 +1495,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
| 1485 | int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); | 1495 | int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); |
| 1486 | uint16_t data_offset, size; | 1496 | uint16_t data_offset, size; |
| 1487 | union asic_ss_info *ss_info; | 1497 | union asic_ss_info *ss_info; |
| 1498 | union asic_ss_assignment *ss_assign; | ||
| 1488 | uint8_t frev, crev; | 1499 | uint8_t frev, crev; |
| 1489 | int i, num_indices; | 1500 | int i, num_indices; |
| 1490 | 1501 | ||
| @@ -1509,45 +1520,52 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
| 1509 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1520 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
| 1510 | sizeof(ATOM_ASIC_SS_ASSIGNMENT); | 1521 | sizeof(ATOM_ASIC_SS_ASSIGNMENT); |
| 1511 | 1522 | ||
| 1523 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]); | ||
| 1512 | for (i = 0; i < num_indices; i++) { | 1524 | for (i = 0; i < num_indices; i++) { |
| 1513 | if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) && | 1525 | if ((ss_assign->v1.ucClockIndication == id) && |
| 1514 | (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) { | 1526 | (clock <= le32_to_cpu(ss_assign->v1.ulTargetClockRange))) { |
| 1515 | ss->percentage = | 1527 | ss->percentage = |
| 1516 | le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1528 | le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); |
| 1517 | ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1529 | ss->type = ss_assign->v1.ucSpreadSpectrumMode; |
| 1518 | ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz); | 1530 | ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); |
| 1519 | return true; | 1531 | return true; |
| 1520 | } | 1532 | } |
| 1533 | ss_assign = (union asic_ss_assignment *) | ||
| 1534 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT)); | ||
| 1521 | } | 1535 | } |
| 1522 | break; | 1536 | break; |
| 1523 | case 2: | 1537 | case 2: |
| 1524 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1538 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
| 1525 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); | 1539 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); |
| 1540 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]); | ||
| 1526 | for (i = 0; i < num_indices; i++) { | 1541 | for (i = 0; i < num_indices; i++) { |
| 1527 | if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) && | 1542 | if ((ss_assign->v2.ucClockIndication == id) && |
| 1528 | (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) { | 1543 | (clock <= le32_to_cpu(ss_assign->v2.ulTargetClockRange))) { |
| 1529 | ss->percentage = | 1544 | ss->percentage = |
| 1530 | le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1545 | le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); |
| 1531 | ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1546 | ss->type = ss_assign->v2.ucSpreadSpectrumMode; |
| 1532 | ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz); | 1547 | ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); |
| 1533 | if ((crev == 2) && | 1548 | if ((crev == 2) && |
| 1534 | ((id == ASIC_INTERNAL_ENGINE_SS) || | 1549 | ((id == ASIC_INTERNAL_ENGINE_SS) || |
| 1535 | (id == ASIC_INTERNAL_MEMORY_SS))) | 1550 | (id == ASIC_INTERNAL_MEMORY_SS))) |
| 1536 | ss->rate /= 100; | 1551 | ss->rate /= 100; |
| 1537 | return true; | 1552 | return true; |
| 1538 | } | 1553 | } |
| 1554 | ss_assign = (union asic_ss_assignment *) | ||
| 1555 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2)); | ||
| 1539 | } | 1556 | } |
| 1540 | break; | 1557 | break; |
| 1541 | case 3: | 1558 | case 3: |
| 1542 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / | 1559 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
| 1543 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); | 1560 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); |
| 1561 | ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]); | ||
| 1544 | for (i = 0; i < num_indices; i++) { | 1562 | for (i = 0; i < num_indices; i++) { |
| 1545 | if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) && | 1563 | if ((ss_assign->v3.ucClockIndication == id) && |
| 1546 | (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) { | 1564 | (clock <= le32_to_cpu(ss_assign->v3.ulTargetClockRange))) { |
| 1547 | ss->percentage = | 1565 | ss->percentage = |
| 1548 | le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | 1566 | le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); |
| 1549 | ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode; | 1567 | ss->type = ss_assign->v3.ucSpreadSpectrumMode; |
| 1550 | ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz); | 1568 | ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); |
| 1551 | if ((id == ASIC_INTERNAL_ENGINE_SS) || | 1569 | if ((id == ASIC_INTERNAL_ENGINE_SS) || |
| 1552 | (id == ASIC_INTERNAL_MEMORY_SS)) | 1570 | (id == ASIC_INTERNAL_MEMORY_SS)) |
| 1553 | ss->rate /= 100; | 1571 | ss->rate /= 100; |
| @@ -1555,6 +1573,8 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, | |||
| 1555 | radeon_atombios_get_igp_ss_overrides(rdev, ss, id); | 1573 | radeon_atombios_get_igp_ss_overrides(rdev, ss, id); |
| 1556 | return true; | 1574 | return true; |
| 1557 | } | 1575 | } |
| 1576 | ss_assign = (union asic_ss_assignment *) | ||
| 1577 | ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3)); | ||
| 1558 | } | 1578 | } |
| 1559 | break; | 1579 | break; |
| 1560 | default: | 1580 | default: |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index ac6ece61a476..66c222836631 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -85,8 +85,9 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) | |||
| 85 | VRAM, also but everything into VRAM on AGP cards to avoid | 85 | VRAM, also but everything into VRAM on AGP cards to avoid |
| 86 | image corruptions */ | 86 | image corruptions */ |
| 87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && | 87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && |
| 88 | (i == 0 || p->rdev->flags & RADEON_IS_AGP)) { | 88 | p->rdev->family < CHIP_PALM && |
| 89 | /* TODO: is this still needed for NI+ ? */ | 89 | (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { |
| 90 | |||
| 90 | p->relocs[i].lobj.domain = | 91 | p->relocs[i].lobj.domain = |
| 91 | RADEON_GEM_DOMAIN_VRAM; | 92 | RADEON_GEM_DOMAIN_VRAM; |
| 92 | 93 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e29faa73b574..841d0e09be3e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1320,13 +1320,22 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 1320 | return r; | 1320 | return r; |
| 1321 | } | 1321 | } |
| 1322 | if ((radeon_testing & 1)) { | 1322 | if ((radeon_testing & 1)) { |
| 1323 | radeon_test_moves(rdev); | 1323 | if (rdev->accel_working) |
| 1324 | radeon_test_moves(rdev); | ||
| 1325 | else | ||
| 1326 | DRM_INFO("radeon: acceleration disabled, skipping move tests\n"); | ||
| 1324 | } | 1327 | } |
| 1325 | if ((radeon_testing & 2)) { | 1328 | if ((radeon_testing & 2)) { |
| 1326 | radeon_test_syncing(rdev); | 1329 | if (rdev->accel_working) |
| 1330 | radeon_test_syncing(rdev); | ||
| 1331 | else | ||
| 1332 | DRM_INFO("radeon: acceleration disabled, skipping sync tests\n"); | ||
| 1327 | } | 1333 | } |
| 1328 | if (radeon_benchmarking) { | 1334 | if (radeon_benchmarking) { |
| 1329 | radeon_benchmark(rdev, radeon_benchmarking); | 1335 | if (rdev->accel_working) |
| 1336 | radeon_benchmark(rdev, radeon_benchmarking); | ||
| 1337 | else | ||
| 1338 | DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n"); | ||
| 1330 | } | 1339 | } |
| 1331 | return 0; | 1340 | return 0; |
| 1332 | } | 1341 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 87e1d69e8fdb..ac07ad1d4f8c 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -1002,7 +1002,7 @@ static void radeon_pm_resume_old(struct radeon_device *rdev) | |||
| 1002 | { | 1002 | { |
| 1003 | /* set up the default clocks if the MC ucode is loaded */ | 1003 | /* set up the default clocks if the MC ucode is loaded */ |
| 1004 | if ((rdev->family >= CHIP_BARTS) && | 1004 | if ((rdev->family >= CHIP_BARTS) && |
| 1005 | (rdev->family <= CHIP_HAINAN) && | 1005 | (rdev->family <= CHIP_CAYMAN) && |
| 1006 | rdev->mc_fw) { | 1006 | rdev->mc_fw) { |
| 1007 | if (rdev->pm.default_vddc) | 1007 | if (rdev->pm.default_vddc) |
| 1008 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1008 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
| @@ -1046,7 +1046,7 @@ static void radeon_pm_resume_dpm(struct radeon_device *rdev) | |||
| 1046 | if (ret) { | 1046 | if (ret) { |
| 1047 | DRM_ERROR("radeon: dpm resume failed\n"); | 1047 | DRM_ERROR("radeon: dpm resume failed\n"); |
| 1048 | if ((rdev->family >= CHIP_BARTS) && | 1048 | if ((rdev->family >= CHIP_BARTS) && |
| 1049 | (rdev->family <= CHIP_HAINAN) && | 1049 | (rdev->family <= CHIP_CAYMAN) && |
| 1050 | rdev->mc_fw) { | 1050 | rdev->mc_fw) { |
| 1051 | if (rdev->pm.default_vddc) | 1051 | if (rdev->pm.default_vddc) |
| 1052 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1052 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
| @@ -1097,7 +1097,7 @@ static int radeon_pm_init_old(struct radeon_device *rdev) | |||
| 1097 | radeon_pm_init_profile(rdev); | 1097 | radeon_pm_init_profile(rdev); |
| 1098 | /* set up the default clocks if the MC ucode is loaded */ | 1098 | /* set up the default clocks if the MC ucode is loaded */ |
| 1099 | if ((rdev->family >= CHIP_BARTS) && | 1099 | if ((rdev->family >= CHIP_BARTS) && |
| 1100 | (rdev->family <= CHIP_HAINAN) && | 1100 | (rdev->family <= CHIP_CAYMAN) && |
| 1101 | rdev->mc_fw) { | 1101 | rdev->mc_fw) { |
| 1102 | if (rdev->pm.default_vddc) | 1102 | if (rdev->pm.default_vddc) |
| 1103 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1103 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
| @@ -1183,7 +1183,7 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) | |||
| 1183 | if (ret) { | 1183 | if (ret) { |
| 1184 | rdev->pm.dpm_enabled = false; | 1184 | rdev->pm.dpm_enabled = false; |
| 1185 | if ((rdev->family >= CHIP_BARTS) && | 1185 | if ((rdev->family >= CHIP_BARTS) && |
| 1186 | (rdev->family <= CHIP_HAINAN) && | 1186 | (rdev->family <= CHIP_CAYMAN) && |
| 1187 | rdev->mc_fw) { | 1187 | rdev->mc_fw) { |
| 1188 | if (rdev->pm.default_vddc) | 1188 | if (rdev->pm.default_vddc) |
| 1189 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 1189 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 46a25f037b84..18254e1c3e71 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -839,9 +839,11 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
| 839 | * packet that is the root issue | 839 | * packet that is the root issue |
| 840 | */ | 840 | */ |
| 841 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; | 841 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; |
| 842 | for (j = 0; j <= (count + 32); j++) { | 842 | if (ring->ready) { |
| 843 | seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); | 843 | for (j = 0; j <= (count + 32); j++) { |
| 844 | i = (i + 1) & ring->ptr_mask; | 844 | seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); |
| 845 | i = (i + 1) & ring->ptr_mask; | ||
| 846 | } | ||
| 845 | } | 847 | } |
| 846 | return 0; | 848 | return 0; |
| 847 | } | 849 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 1a01bbff9bfa..a0f11856ddde 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
| @@ -476,8 +476,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, | |||
| 476 | return -EINVAL; | 476 | return -EINVAL; |
| 477 | } | 477 | } |
| 478 | 478 | ||
| 479 | /* TODO: is this still necessary on NI+ ? */ | 479 | if (p->rdev->family < CHIP_PALM && (cmd == 0 || cmd == 0x3) && |
| 480 | if ((cmd == 0 || cmd == 0x3) && | ||
| 481 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { | 480 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { |
| 482 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", | 481 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", |
| 483 | start, end); | 482 | start, end); |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index cfe5d4d28915..9ace28702c76 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
| @@ -2910,6 +2910,7 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2910 | bool disable_sclk_switching = false; | 2910 | bool disable_sclk_switching = false; |
| 2911 | u32 mclk, sclk; | 2911 | u32 mclk, sclk; |
| 2912 | u16 vddc, vddci; | 2912 | u16 vddc, vddci; |
| 2913 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
| 2913 | int i; | 2914 | int i; |
| 2914 | 2915 | ||
| 2915 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2916 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
| @@ -2943,6 +2944,29 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2943 | } | 2944 | } |
| 2944 | } | 2945 | } |
| 2945 | 2946 | ||
| 2947 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
| 2948 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
| 2949 | &max_sclk_vddc); | ||
| 2950 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
| 2951 | &max_mclk_vddci); | ||
| 2952 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
| 2953 | &max_mclk_vddc); | ||
| 2954 | |||
| 2955 | for (i = 0; i < ps->performance_level_count; i++) { | ||
| 2956 | if (max_sclk_vddc) { | ||
| 2957 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
| 2958 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
| 2959 | } | ||
| 2960 | if (max_mclk_vddci) { | ||
| 2961 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
| 2962 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
| 2963 | } | ||
| 2964 | if (max_mclk_vddc) { | ||
| 2965 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
| 2966 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
| 2967 | } | ||
| 2968 | } | ||
| 2969 | |||
| 2946 | /* XXX validate the min clocks required for display */ | 2970 | /* XXX validate the min clocks required for display */ |
| 2947 | 2971 | ||
| 2948 | if (disable_mclk_switching) { | 2972 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c index 7266805d9786..3100fa9cb52f 100644 --- a/drivers/gpu/drm/radeon/uvd_v1_0.c +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c | |||
| @@ -212,8 +212,8 @@ int uvd_v1_0_start(struct radeon_device *rdev) | |||
| 212 | /* enable VCPU clock */ | 212 | /* enable VCPU clock */ |
| 213 | WREG32(UVD_VCPU_CNTL, 1 << 9); | 213 | WREG32(UVD_VCPU_CNTL, 1 << 9); |
| 214 | 214 | ||
| 215 | /* enable UMC */ | 215 | /* enable UMC and NC0 */ |
| 216 | WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8)); | 216 | WREG32_P(UVD_LMI_CTRL2, 1 << 13, ~((1 << 8) | (1 << 13))); |
| 217 | 217 | ||
| 218 | /* boot up the VCPU */ | 218 | /* boot up the VCPU */ |
| 219 | WREG32(UVD_SOFT_RESET, 0); | 219 | WREG32(UVD_SOFT_RESET, 0); |
