Commit b97b869a83318c473aa5fce8dcd45edb0275004e
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "Nothing too major, radeon still has some dpm changes for off by default. Radeon, intel, msm: - radeon: a few more dpm fixes (still off by default), uvd fixes - i915: runtime warn backtrace and regression fix - msm: iommu changes fallout" * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (27 commits) drm/msm: use drm_gem_dumb_destroy helper drm/msm: deal with mach/iommu.h removal drm/msm: Remove iommu include from mdp4_kms.c drm/msm: Odd PTR_ERR usage drm/i915: Fix up usage of SHRINK_STOP drm/radeon: fix hdmi audio on DCE3.0/3.1 asics drm/i915: preserve pipe A quirk in i9xx_set_pipeconf drm/i915/tv: clear adjusted_mode.flags drm/i915/dp: increase i2c-over-aux retry interval on AUX DEFER drm/radeon/cik: fix overflow in vram fetch drm/radeon: add missing hdmi callbacks for rv6xx drm/i915: Use a temporary va_list for two-pass string handling drm/radeon/uvd: lower msg&fb buffer requirements on UVD3 drm/radeon: disable tests/benchmarks if accel is disabled drm/radeon: don't set default clocks for SI when DPM is disabled drm/radeon/dpm/ci: filter clocks based on voltage/clk dep tables drm/radeon/dpm/si: filter clocks based on voltage/clk dep tables drm/radeon/dpm/ni: filter clocks based on voltage/clk dep tables drm/radeon/dpm/btc: filter clocks based on voltage/clk dep tables drm/radeon/dpm: fetch the max clk from voltage dep tables helper ...
Showing 26 changed files Side-by-side Diff
- drivers/gpu/drm/i915/i915_gem.c
- drivers/gpu/drm/i915/i915_gpu_error.c
- drivers/gpu/drm/i915/intel_display.c
- drivers/gpu/drm/i915/intel_dp.c
- drivers/gpu/drm/i915/intel_tv.c
- drivers/gpu/drm/msm/mdp4/mdp4_kms.c
- drivers/gpu/drm/msm/msm_drv.c
- drivers/gpu/drm/msm/msm_gem.c
- drivers/gpu/drm/radeon/btc_dpm.c
- drivers/gpu/drm/radeon/btc_dpm.h
- drivers/gpu/drm/radeon/ci_dpm.c
- drivers/gpu/drm/radeon/cik.c
- drivers/gpu/drm/radeon/ni_dpm.c
- drivers/gpu/drm/radeon/r100.c
- drivers/gpu/drm/radeon/r600_dpm.c
- drivers/gpu/drm/radeon/r600_hdmi.c
- drivers/gpu/drm/radeon/radeon_asic.c
- drivers/gpu/drm/radeon/radeon_atombios.c
- drivers/gpu/drm/radeon/radeon_cs.c
- drivers/gpu/drm/radeon/radeon_device.c
- drivers/gpu/drm/radeon/radeon_pm.c
- drivers/gpu/drm/radeon/radeon_ring.c
- drivers/gpu/drm/radeon/radeon_uvd.c
- drivers/gpu/drm/radeon/si_dpm.c
- drivers/gpu/drm/radeon/uvd_v1_0.c
- include/uapi/drm/radeon_drm.h
drivers/gpu/drm/i915/i915_gem.c
... | ... | @@ -4800,10 +4800,10 @@ |
4800 | 4800 | |
4801 | 4801 | if (!mutex_trylock(&dev->struct_mutex)) { |
4802 | 4802 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
4803 | - return SHRINK_STOP; | |
4803 | + return 0; | |
4804 | 4804 | |
4805 | 4805 | if (dev_priv->mm.shrinker_no_lock_stealing) |
4806 | - return SHRINK_STOP; | |
4806 | + return 0; | |
4807 | 4807 | |
4808 | 4808 | unlock = false; |
4809 | 4809 | } |
4810 | 4810 | |
... | ... | @@ -4901,10 +4901,10 @@ |
4901 | 4901 | |
4902 | 4902 | if (!mutex_trylock(&dev->struct_mutex)) { |
4903 | 4903 | if (!mutex_is_locked_by(&dev->struct_mutex, current)) |
4904 | - return 0; | |
4904 | + return SHRINK_STOP; | |
4905 | 4905 | |
4906 | 4906 | if (dev_priv->mm.shrinker_no_lock_stealing) |
4907 | - return 0; | |
4907 | + return SHRINK_STOP; | |
4908 | 4908 | |
4909 | 4909 | unlock = false; |
4910 | 4910 | } |
drivers/gpu/drm/i915/i915_gpu_error.c
... | ... | @@ -143,8 +143,10 @@ |
143 | 143 | |
144 | 144 | /* Seek the first printf which is hits start position */ |
145 | 145 | if (e->pos < e->start) { |
146 | - len = vsnprintf(NULL, 0, f, args); | |
147 | - if (!__i915_error_seek(e, len)) | |
146 | + va_list tmp; | |
147 | + | |
148 | + va_copy(tmp, args); | |
149 | + if (!__i915_error_seek(e, vsnprintf(NULL, 0, f, tmp))) | |
148 | 150 | return; |
149 | 151 | } |
150 | 152 |
drivers/gpu/drm/i915/intel_display.c
... | ... | @@ -4775,6 +4775,10 @@ |
4775 | 4775 | |
4776 | 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 | 4782 | if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) { |
4779 | 4783 | /* Enable pixel doubling when the dot clock is > 90% of the (display) |
4780 | 4784 | * core speed. |
drivers/gpu/drm/i915/intel_dp.c
... | ... | @@ -588,7 +588,18 @@ |
588 | 588 | DRM_DEBUG_KMS("aux_ch native nack\n"); |
589 | 589 | return -EREMOTEIO; |
590 | 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 | 603 | continue; |
593 | 604 | default: |
594 | 605 | DRM_ERROR("aux_ch invalid native reply 0x%02x\n", |
drivers/gpu/drm/i915/intel_tv.c
... | ... | @@ -916,6 +916,14 @@ |
916 | 916 | DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); |
917 | 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 | 927 | return true; |
920 | 928 | } |
921 | 929 |
drivers/gpu/drm/msm/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/msm_drv.c
... | ... | @@ -18,8 +18,6 @@ |
18 | 18 | #include "msm_drv.h" |
19 | 19 | #include "msm_gpu.h" |
20 | 20 | |
21 | -#include <mach/iommu.h> | |
22 | - | |
23 | 21 | static void msm_fb_output_poll_changed(struct drm_device *dev) |
24 | 22 | { |
25 | 23 | struct msm_drm_private *priv = dev->dev_private; |
... | ... | @@ -62,6 +60,8 @@ |
62 | 60 | int i, ret; |
63 | 61 | |
64 | 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 | 65 | struct device *ctx = msm_iommu_get_ctx(names[i]); |
66 | 66 | if (!ctx) |
67 | 67 | continue; |
... | ... | @@ -199,7 +199,7 @@ |
199 | 199 | * imx drm driver on iMX5 |
200 | 200 | */ |
201 | 201 | dev_err(dev->dev, "failed to load kms\n"); |
202 | - ret = PTR_ERR(priv->kms); | |
202 | + ret = PTR_ERR(kms); | |
203 | 203 | goto fail; |
204 | 204 | } |
205 | 205 | |
... | ... | @@ -697,7 +697,7 @@ |
697 | 697 | .gem_vm_ops = &vm_ops, |
698 | 698 | .dumb_create = msm_gem_dumb_create, |
699 | 699 | .dumb_map_offset = msm_gem_dumb_map_offset, |
700 | - .dumb_destroy = msm_gem_dumb_destroy, | |
700 | + .dumb_destroy = drm_gem_dumb_destroy, | |
701 | 701 | #ifdef CONFIG_DEBUG_FS |
702 | 702 | .debugfs_init = msm_debugfs_init, |
703 | 703 | .debugfs_cleanup = msm_debugfs_cleanup, |
drivers/gpu/drm/msm/msm_gem.c
... | ... | @@ -319,13 +319,6 @@ |
319 | 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 | 322 | int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, |
330 | 323 | uint32_t handle, uint64_t *offset) |
331 | 324 | { |
drivers/gpu/drm/radeon/btc_dpm.c
... | ... | @@ -1168,6 +1168,23 @@ |
1168 | 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 | 1188 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
1172 | 1189 | u32 clock, u16 max_voltage, u16 *voltage) |
1173 | 1190 | { |
... | ... | @@ -2080,6 +2097,7 @@ |
2080 | 2097 | bool disable_mclk_switching; |
2081 | 2098 | u32 mclk, sclk; |
2082 | 2099 | u16 vddc, vddci; |
2100 | + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | |
2083 | 2101 | |
2084 | 2102 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
2085 | 2103 | btc_dpm_vblank_too_short(rdev)) |
... | ... | @@ -2119,6 +2137,39 @@ |
2119 | 2137 | ps->low.vddc = max_limits->vddc; |
2120 | 2138 | if (ps->low.vddci > max_limits->vddci) |
2121 | 2139 | ps->low.vddci = max_limits->vddci; |
2140 | + } | |
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; | |
2122 | 2173 | } |
2123 | 2174 | |
2124 | 2175 | /* XXX validate the min clocks required for display */ |
drivers/gpu/drm/radeon/btc_dpm.h
... | ... | @@ -46,6 +46,8 @@ |
46 | 46 | struct rv7xx_pl *pl); |
47 | 47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
48 | 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 | 51 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, |
50 | 52 | u16 max_vddc, u16 max_vddci, |
51 | 53 | u16 *vddc, u16 *vddci); |
drivers/gpu/drm/radeon/ci_dpm.c
... | ... | @@ -146,6 +146,8 @@ |
146 | 146 | }; |
147 | 147 | |
148 | 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 | 151 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, |
150 | 152 | u32 arb_freq_src, u32 arb_freq_dest); |
151 | 153 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); |
... | ... | @@ -712,6 +714,7 @@ |
712 | 714 | struct radeon_clock_and_voltage_limits *max_limits; |
713 | 715 | bool disable_mclk_switching; |
714 | 716 | u32 sclk, mclk; |
717 | + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | |
715 | 718 | int i; |
716 | 719 | |
717 | 720 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
... | ... | @@ -736,6 +739,29 @@ |
736 | 739 | ps->performance_levels[i].mclk = max_limits->mclk; |
737 | 740 | if (ps->performance_levels[i].sclk > max_limits->sclk) |
738 | 741 | ps->performance_levels[i].sclk = max_limits->sclk; |
742 | + } | |
743 | + } | |
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; | |
739 | 765 | } |
740 | 766 | } |
741 | 767 |
drivers/gpu/drm/radeon/cik.c
... | ... | @@ -2845,11 +2845,9 @@ |
2845 | 2845 | rdev->config.cik.tile_config |= (3 << 0); |
2846 | 2846 | break; |
2847 | 2847 | } |
2848 | - if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) | |
2849 | - rdev->config.cik.tile_config |= 1 << 4; | |
2850 | - else | |
2851 | - rdev->config.cik.tile_config |= 0 << 4; | |
2852 | 2848 | rdev->config.cik.tile_config |= |
2849 | + ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; | |
2850 | + rdev->config.cik.tile_config |= | |
2853 | 2851 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
2854 | 2852 | rdev->config.cik.tile_config |= |
2855 | 2853 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; |
... | ... | @@ -4456,8 +4454,8 @@ |
4456 | 4454 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
4457 | 4455 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
4458 | 4456 | /* size in MB on si */ |
4459 | - rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | |
4460 | - rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | |
4457 | + rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; | |
4458 | + rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; | |
4461 | 4459 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
4462 | 4460 | si_vram_gtt_location(rdev, &rdev->mc); |
4463 | 4461 | radeon_update_bandwidth_info(rdev); |
4464 | 4462 | |
4465 | 4463 | |
... | ... | @@ -4735,12 +4733,13 @@ |
4735 | 4733 | u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; |
4736 | 4734 | u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; |
4737 | 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 | 4740 | protections, vmid, addr, |
4742 | 4741 | (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", |
4743 | - block, mc_id); | |
4742 | + block, mc_client, mc_id); | |
4744 | 4743 | } |
4745 | 4744 | |
4746 | 4745 | /** |
drivers/gpu/drm/radeon/ni_dpm.c
... | ... | @@ -787,6 +787,7 @@ |
787 | 787 | bool disable_mclk_switching; |
788 | 788 | u32 mclk, sclk; |
789 | 789 | u16 vddc, vddci; |
790 | + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | |
790 | 791 | int i; |
791 | 792 | |
792 | 793 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
... | ... | @@ -810,6 +811,29 @@ |
810 | 811 | ps->performance_levels[i].vddc = max_limits->vddc; |
811 | 812 | if (ps->performance_levels[i].vddci > max_limits->vddci) |
812 | 813 | ps->performance_levels[i].vddci = max_limits->vddci; |
814 | + } | |
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; | |
813 | 837 | } |
814 | 838 | } |
815 | 839 |
drivers/gpu/drm/radeon/r100.c
... | ... | @@ -2933,9 +2933,11 @@ |
2933 | 2933 | seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp); |
2934 | 2934 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
2935 | 2935 | seq_printf(m, "%u dwords in ring\n", count); |
2936 | - for (j = 0; j <= count; j++) { | |
2937 | - i = (rdp + j) & ring->ptr_mask; | |
2938 | - seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | |
2936 | + if (ring->ready) { | |
2937 | + for (j = 0; j <= count; j++) { | |
2938 | + i = (rdp + j) & ring->ptr_mask; | |
2939 | + seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]); | |
2940 | + } | |
2939 | 2941 | } |
2940 | 2942 | return 0; |
2941 | 2943 | } |
drivers/gpu/drm/radeon/r600_dpm.c
... | ... | @@ -1084,7 +1084,7 @@ |
1084 | 1084 | rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk = |
1085 | 1085 | le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16); |
1086 | 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 | 1088 | entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *) |
1089 | 1089 | ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record)); |
1090 | 1090 | } |
drivers/gpu/drm/radeon/r600_hdmi.c
... | ... | @@ -257,10 +257,7 @@ |
257 | 257 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
258 | 258 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
259 | 259 | */ |
260 | - if (ASIC_IS_DCE3(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 | - */ | |
260 | + if (ASIC_IS_DCE32(rdev)) { | |
264 | 261 | if (dig->dig_encoder == 0) { |
265 | 262 | dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK; |
266 | 263 | dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio); |
267 | 264 | |
... | ... | @@ -276,8 +273,21 @@ |
276 | 273 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); |
277 | 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 | 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 | 291 | WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | |
282 | 292 | AUDIO_DTO_MODULE(clock / 10)); |
283 | 293 | } |
drivers/gpu/drm/radeon/radeon_asic.c
... | ... | @@ -1004,6 +1004,8 @@ |
1004 | 1004 | .wait_for_vblank = &avivo_wait_for_vblank, |
1005 | 1005 | .set_backlight_level = &atombios_set_backlight_level, |
1006 | 1006 | .get_backlight_level = &atombios_get_backlight_level, |
1007 | + .hdmi_enable = &r600_hdmi_enable, | |
1008 | + .hdmi_setmode = &r600_hdmi_setmode, | |
1007 | 1009 | }, |
1008 | 1010 | .copy = { |
1009 | 1011 | .blit = &r600_copy_cpdma, |
drivers/gpu/drm/radeon/radeon_atombios.c
... | ... | @@ -1367,6 +1367,7 @@ |
1367 | 1367 | int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); |
1368 | 1368 | uint16_t data_offset, size; |
1369 | 1369 | struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; |
1370 | + struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *ss_assign; | |
1370 | 1371 | uint8_t frev, crev; |
1371 | 1372 | int i, num_indices; |
1372 | 1373 | |
1373 | 1374 | |
1374 | 1375 | |
1375 | 1376 | |
... | ... | @@ -1378,18 +1379,21 @@ |
1378 | 1379 | |
1379 | 1380 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1380 | 1381 | sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); |
1381 | - | |
1382 | + ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) | |
1383 | + ((u8 *)&ss_info->asSS_Info[0]); | |
1382 | 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 | 1386 | ss->percentage = |
1385 | - le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage); | |
1386 | - ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType; | |
1387 | - ss->step = ss_info->asSS_Info[i].ucSS_Step; | |
1388 | - ss->delay = ss_info->asSS_Info[i].ucSS_Delay; | |
1389 | - ss->range = ss_info->asSS_Info[i].ucSS_Range; | |
1390 | - ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; | |
1387 | + le16_to_cpu(ss_assign->usSpreadSpectrumPercentage); | |
1388 | + ss->type = ss_assign->ucSpreadSpectrumType; | |
1389 | + ss->step = ss_assign->ucSS_Step; | |
1390 | + ss->delay = ss_assign->ucSS_Delay; | |
1391 | + ss->range = ss_assign->ucSS_Range; | |
1392 | + ss->refdiv = ss_assign->ucRecommendedRef_Div; | |
1391 | 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 | 1399 | return false; |
... | ... | @@ -1477,6 +1481,12 @@ |
1477 | 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 | 1490 | bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, |
1481 | 1491 | struct radeon_atom_ss *ss, |
1482 | 1492 | int id, u32 clock) |
... | ... | @@ -1485,6 +1495,7 @@ |
1485 | 1495 | int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); |
1486 | 1496 | uint16_t data_offset, size; |
1487 | 1497 | union asic_ss_info *ss_info; |
1498 | + union asic_ss_assignment *ss_assign; | |
1488 | 1499 | uint8_t frev, crev; |
1489 | 1500 | int i, num_indices; |
1490 | 1501 | |
1491 | 1502 | |
1492 | 1503 | |
1493 | 1504 | |
1494 | 1505 | |
1495 | 1506 | |
1496 | 1507 | |
1497 | 1508 | |
1498 | 1509 | |
1499 | 1510 | |
1500 | 1511 | |
... | ... | @@ -1509,45 +1520,52 @@ |
1509 | 1520 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1510 | 1521 | sizeof(ATOM_ASIC_SS_ASSIGNMENT); |
1511 | 1522 | |
1523 | + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]); | |
1512 | 1524 | for (i = 0; i < num_indices; i++) { |
1513 | - if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) && | |
1514 | - (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) { | |
1525 | + if ((ss_assign->v1.ucClockIndication == id) && | |
1526 | + (clock <= le32_to_cpu(ss_assign->v1.ulTargetClockRange))) { | |
1515 | 1527 | ss->percentage = |
1516 | - le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | |
1517 | - ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode; | |
1518 | - ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz); | |
1528 | + le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); | |
1529 | + ss->type = ss_assign->v1.ucSpreadSpectrumMode; | |
1530 | + ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); | |
1519 | 1531 | return true; |
1520 | 1532 | } |
1533 | + ss_assign = (union asic_ss_assignment *) | |
1534 | + ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT)); | |
1521 | 1535 | } |
1522 | 1536 | break; |
1523 | 1537 | case 2: |
1524 | 1538 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1525 | 1539 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); |
1540 | + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]); | |
1526 | 1541 | for (i = 0; i < num_indices; i++) { |
1527 | - if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) && | |
1528 | - (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) { | |
1542 | + if ((ss_assign->v2.ucClockIndication == id) && | |
1543 | + (clock <= le32_to_cpu(ss_assign->v2.ulTargetClockRange))) { | |
1529 | 1544 | ss->percentage = |
1530 | - le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | |
1531 | - ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode; | |
1532 | - ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz); | |
1545 | + le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); | |
1546 | + ss->type = ss_assign->v2.ucSpreadSpectrumMode; | |
1547 | + ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); | |
1533 | 1548 | if ((crev == 2) && |
1534 | 1549 | ((id == ASIC_INTERNAL_ENGINE_SS) || |
1535 | 1550 | (id == ASIC_INTERNAL_MEMORY_SS))) |
1536 | 1551 | ss->rate /= 100; |
1537 | 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 | 1557 | break; |
1541 | 1558 | case 3: |
1542 | 1559 | num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / |
1543 | 1560 | sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); |
1561 | + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]); | |
1544 | 1562 | for (i = 0; i < num_indices; i++) { |
1545 | - if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) && | |
1546 | - (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) { | |
1563 | + if ((ss_assign->v3.ucClockIndication == id) && | |
1564 | + (clock <= le32_to_cpu(ss_assign->v3.ulTargetClockRange))) { | |
1547 | 1565 | ss->percentage = |
1548 | - le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage); | |
1549 | - ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode; | |
1550 | - ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz); | |
1566 | + le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); | |
1567 | + ss->type = ss_assign->v3.ucSpreadSpectrumMode; | |
1568 | + ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); | |
1551 | 1569 | if ((id == ASIC_INTERNAL_ENGINE_SS) || |
1552 | 1570 | (id == ASIC_INTERNAL_MEMORY_SS)) |
1553 | 1571 | ss->rate /= 100; |
... | ... | @@ -1555,6 +1573,8 @@ |
1555 | 1573 | radeon_atombios_get_igp_ss_overrides(rdev, ss, id); |
1556 | 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 | 1579 | break; |
1560 | 1580 | default: |
drivers/gpu/drm/radeon/radeon_cs.c
... | ... | @@ -85,8 +85,9 @@ |
85 | 85 | VRAM, also but everything into VRAM on AGP cards to avoid |
86 | 86 | image corruptions */ |
87 | 87 | if (p->ring == R600_RING_TYPE_UVD_INDEX && |
88 | - (i == 0 || p->rdev->flags & RADEON_IS_AGP)) { | |
89 | - /* TODO: is this still needed for NI+ ? */ | |
88 | + p->rdev->family < CHIP_PALM && | |
89 | + (i == 0 || drm_pci_device_is_agp(p->rdev->ddev))) { | |
90 | + | |
90 | 91 | p->relocs[i].lobj.domain = |
91 | 92 | RADEON_GEM_DOMAIN_VRAM; |
92 | 93 |
drivers/gpu/drm/radeon/radeon_device.c
... | ... | @@ -1320,13 +1320,22 @@ |
1320 | 1320 | return r; |
1321 | 1321 | } |
1322 | 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 | 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 | 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 | 1340 | return 0; |
1332 | 1341 | } |
drivers/gpu/drm/radeon/radeon_pm.c
... | ... | @@ -1002,7 +1002,7 @@ |
1002 | 1002 | { |
1003 | 1003 | /* set up the default clocks if the MC ucode is loaded */ |
1004 | 1004 | if ((rdev->family >= CHIP_BARTS) && |
1005 | - (rdev->family <= CHIP_HAINAN) && | |
1005 | + (rdev->family <= CHIP_CAYMAN) && | |
1006 | 1006 | rdev->mc_fw) { |
1007 | 1007 | if (rdev->pm.default_vddc) |
1008 | 1008 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
... | ... | @@ -1046,7 +1046,7 @@ |
1046 | 1046 | if (ret) { |
1047 | 1047 | DRM_ERROR("radeon: dpm resume failed\n"); |
1048 | 1048 | if ((rdev->family >= CHIP_BARTS) && |
1049 | - (rdev->family <= CHIP_HAINAN) && | |
1049 | + (rdev->family <= CHIP_CAYMAN) && | |
1050 | 1050 | rdev->mc_fw) { |
1051 | 1051 | if (rdev->pm.default_vddc) |
1052 | 1052 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
... | ... | @@ -1097,7 +1097,7 @@ |
1097 | 1097 | radeon_pm_init_profile(rdev); |
1098 | 1098 | /* set up the default clocks if the MC ucode is loaded */ |
1099 | 1099 | if ((rdev->family >= CHIP_BARTS) && |
1100 | - (rdev->family <= CHIP_HAINAN) && | |
1100 | + (rdev->family <= CHIP_CAYMAN) && | |
1101 | 1101 | rdev->mc_fw) { |
1102 | 1102 | if (rdev->pm.default_vddc) |
1103 | 1103 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
... | ... | @@ -1183,7 +1183,7 @@ |
1183 | 1183 | if (ret) { |
1184 | 1184 | rdev->pm.dpm_enabled = false; |
1185 | 1185 | if ((rdev->family >= CHIP_BARTS) && |
1186 | - (rdev->family <= CHIP_HAINAN) && | |
1186 | + (rdev->family <= CHIP_CAYMAN) && | |
1187 | 1187 | rdev->mc_fw) { |
1188 | 1188 | if (rdev->pm.default_vddc) |
1189 | 1189 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
drivers/gpu/drm/radeon/radeon_ring.c
... | ... | @@ -839,9 +839,11 @@ |
839 | 839 | * packet that is the root issue |
840 | 840 | */ |
841 | 841 | i = (ring->rptr + ring->ptr_mask + 1 - 32) & ring->ptr_mask; |
842 | - for (j = 0; j <= (count + 32); j++) { | |
843 | - seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); | |
844 | - i = (i + 1) & ring->ptr_mask; | |
842 | + if (ring->ready) { | |
843 | + for (j = 0; j <= (count + 32); j++) { | |
844 | + seq_printf(m, "r[%5d]=0x%08x\n", i, ring->ring[i]); | |
845 | + i = (i + 1) & ring->ptr_mask; | |
846 | + } | |
845 | 847 | } |
846 | 848 | return 0; |
847 | 849 | } |
drivers/gpu/drm/radeon/radeon_uvd.c
... | ... | @@ -476,8 +476,7 @@ |
476 | 476 | return -EINVAL; |
477 | 477 | } |
478 | 478 | |
479 | - /* TODO: is this still necessary on NI+ ? */ | |
480 | - if ((cmd == 0 || cmd == 0x3) && | |
479 | + if (p->rdev->family < CHIP_PALM && (cmd == 0 || cmd == 0x3) && | |
481 | 480 | (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) { |
482 | 481 | DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", |
483 | 482 | start, end); |
drivers/gpu/drm/radeon/si_dpm.c
... | ... | @@ -2910,6 +2910,7 @@ |
2910 | 2910 | bool disable_sclk_switching = false; |
2911 | 2911 | u32 mclk, sclk; |
2912 | 2912 | u16 vddc, vddci; |
2913 | + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | |
2913 | 2914 | int i; |
2914 | 2915 | |
2915 | 2916 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
... | ... | @@ -2940,6 +2941,29 @@ |
2940 | 2941 | ps->performance_levels[i].vddc = max_limits->vddc; |
2941 | 2942 | if (ps->performance_levels[i].vddci > max_limits->vddci) |
2942 | 2943 | ps->performance_levels[i].vddci = max_limits->vddci; |
2944 | + } | |
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; | |
2943 | 2967 | } |
2944 | 2968 | } |
2945 | 2969 |
drivers/gpu/drm/radeon/uvd_v1_0.c
... | ... | @@ -212,8 +212,8 @@ |
212 | 212 | /* enable VCPU clock */ |
213 | 213 | WREG32(UVD_VCPU_CNTL, 1 << 9); |
214 | 214 | |
215 | - /* enable UMC */ | |
216 | - WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8)); | |
215 | + /* enable UMC and NC0 */ | |
216 | + WREG32_P(UVD_LMI_CTRL2, 1 << 13, ~((1 << 8) | (1 << 13))); | |
217 | 217 | |
218 | 218 | /* boot up the VCPU */ |
219 | 219 | WREG32(UVD_SOFT_RESET, 0); |