Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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
...

+266 -77
+4 -4
drivers/gpu/drm/i915/i915_gem.c
··· 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 } ··· 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 }
+4 -2
drivers/gpu/drm/i915/i915_gpu_error.c
··· 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
+4
drivers/gpu/drm/i915/intel_display.c
··· 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.
+12 -1
drivers/gpu/drm/i915/intel_dp.c
··· 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",
+8
drivers/gpu/drm/i915/intel_tv.c
··· 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
-2
drivers/gpu/drm/msm/mdp4/mdp4_kms.c
··· 19 19 #include "msm_drv.h" 20 20 #include "mdp4_kms.h" 21 21 22 - #include <mach/iommu.h> 23 - 24 22 static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev); 25 23 26 24 static int mdp4_hw_init(struct msm_kms *kms)
+4 -4
drivers/gpu/drm/msm/msm_drv.c
··· 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; ··· 60 62 int i, ret; 61 63 62 64 for (i = 0; i < cnt; i++) { 65 + /* TODO maybe some day msm iommu won't require this hack: */ 66 + struct device *msm_iommu_get_ctx(const char *ctx_name); 63 67 struct device *ctx = msm_iommu_get_ctx(names[i]); 64 68 if (!ctx) 65 69 continue; ··· 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 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,
-7
drivers/gpu/drm/msm/msm_gem.c
··· 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 {
+51
drivers/gpu/drm/radeon/btc_dpm.c
··· 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 { ··· 2097 2080 bool disable_mclk_switching; 2098 2081 u32 mclk, sclk; 2099 2082 u16 vddc, vddci; 2083 + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; 2100 2084 2101 2085 if ((rdev->pm.dpm.new_active_crtc_count > 1) || 2102 2086 btc_dpm_vblank_too_short(rdev)) ··· 2137 2119 ps->low.vddc = max_limits->vddc; 2138 2120 if (ps->low.vddci > max_limits->vddci) 2139 2121 ps->low.vddci = max_limits->vddci; 2122 + } 2123 + 2124 + /* limit clocks to max supported clocks based on voltage dependency tables */ 2125 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2126 + &max_sclk_vddc); 2127 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2128 + &max_mclk_vddci); 2129 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2130 + &max_mclk_vddc); 2131 + 2132 + if (max_sclk_vddc) { 2133 + if (ps->low.sclk > max_sclk_vddc) 2134 + ps->low.sclk = max_sclk_vddc; 2135 + if (ps->medium.sclk > max_sclk_vddc) 2136 + ps->medium.sclk = max_sclk_vddc; 2137 + if (ps->high.sclk > max_sclk_vddc) 2138 + ps->high.sclk = max_sclk_vddc; 2139 + } 2140 + if (max_mclk_vddci) { 2141 + if (ps->low.mclk > max_mclk_vddci) 2142 + ps->low.mclk = max_mclk_vddci; 2143 + if (ps->medium.mclk > max_mclk_vddci) 2144 + ps->medium.mclk = max_mclk_vddci; 2145 + if (ps->high.mclk > max_mclk_vddci) 2146 + ps->high.mclk = max_mclk_vddci; 2147 + } 2148 + if (max_mclk_vddc) { 2149 + if (ps->low.mclk > max_mclk_vddc) 2150 + ps->low.mclk = max_mclk_vddc; 2151 + if (ps->medium.mclk > max_mclk_vddc) 2152 + ps->medium.mclk = max_mclk_vddc; 2153 + if (ps->high.mclk > max_mclk_vddc) 2154 + ps->high.mclk = max_mclk_vddc; 2140 2155 } 2141 2156 2142 2157 /* XXX validate the min clocks required for display */
+2
drivers/gpu/drm/radeon/btc_dpm.h
··· 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);
+26
drivers/gpu/drm/radeon/ci_dpm.c
··· 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); ··· 714 712 struct radeon_clock_and_voltage_limits *max_limits; 715 713 bool disable_mclk_switching; 716 714 u32 sclk, mclk; 715 + u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; 717 716 int i; 718 717 719 718 if ((rdev->pm.dpm.new_active_crtc_count > 1) || ··· 739 736 ps->performance_levels[i].mclk = max_limits->mclk; 740 737 if (ps->performance_levels[i].sclk > max_limits->sclk) 741 738 ps->performance_levels[i].sclk = max_limits->sclk; 739 + } 740 + } 741 + 742 + /* limit clocks to max supported clocks based on voltage dependency tables */ 743 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 744 + &max_sclk_vddc); 745 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 746 + &max_mclk_vddci); 747 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 748 + &max_mclk_vddc); 749 + 750 + for (i = 0; i < ps->performance_level_count; i++) { 751 + if (max_sclk_vddc) { 752 + if (ps->performance_levels[i].sclk > max_sclk_vddc) 753 + ps->performance_levels[i].sclk = max_sclk_vddc; 754 + } 755 + if (max_mclk_vddci) { 756 + if (ps->performance_levels[i].mclk > max_mclk_vddci) 757 + ps->performance_levels[i].mclk = max_mclk_vddci; 758 + } 759 + if (max_mclk_vddc) { 760 + if (ps->performance_levels[i].mclk > max_mclk_vddc) 761 + ps->performance_levels[i].mclk = max_mclk_vddc; 742 762 } 743 763 } 744 764
+8 -9
drivers/gpu/drm/radeon/cik.c
··· 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; 2848 + rdev->config.cik.tile_config |= 2849 + ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; 2852 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 |= ··· 4454 4456 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 4455 4457 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 4456 4458 /* size in MB on si */ 4457 - rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 4458 - rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 4459 + rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; 4460 + rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; 4459 4461 rdev->mc.visible_vram_size = rdev->mc.aper_size; 4460 4462 si_vram_gtt_location(rdev, &rdev->mc); 4461 4463 radeon_update_bandwidth_info(rdev); ··· 4733 4735 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; 4734 4736 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; 4735 4737 u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; 4736 - char *block = (char *)&mc_client; 4738 + char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff, 4739 + (mc_client >> 8) & 0xff, mc_client & 0xff, 0 }; 4737 4740 4738 - printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", 4741 + printk("VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n", 4739 4742 protections, vmid, addr, 4740 4743 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", 4741 - block, mc_id); 4744 + block, mc_client, mc_id); 4742 4745 } 4743 4746 4744 4747 /**
+24
drivers/gpu/drm/radeon/ni_dpm.c
··· 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) || ··· 811 810 ps->performance_levels[i].vddc = max_limits->vddc; 812 811 if (ps->performance_levels[i].vddci > max_limits->vddci) 813 812 ps->performance_levels[i].vddci = max_limits->vddci; 813 + } 814 + } 815 + 816 + /* limit clocks to max supported clocks based on voltage dependency tables */ 817 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 818 + &max_sclk_vddc); 819 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 820 + &max_mclk_vddci); 821 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 822 + &max_mclk_vddc); 823 + 824 + for (i = 0; i < ps->performance_level_count; i++) { 825 + if (max_sclk_vddc) { 826 + if (ps->performance_levels[i].sclk > max_sclk_vddc) 827 + ps->performance_levels[i].sclk = max_sclk_vddc; 828 + } 829 + if (max_mclk_vddci) { 830 + if (ps->performance_levels[i].mclk > max_mclk_vddci) 831 + ps->performance_levels[i].mclk = max_mclk_vddci; 832 + } 833 + if (max_mclk_vddc) { 834 + if (ps->performance_levels[i].mclk > max_mclk_vddc) 835 + ps->performance_levels[i].mclk = max_mclk_vddc; 814 836 } 815 837 } 816 838
+5 -3
drivers/gpu/drm/radeon/r100.c
··· 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 }
+1 -1
drivers/gpu/drm/radeon/r600_dpm.c
··· 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 }
+15 -5
drivers/gpu/drm/radeon/r600_hdmi.c
··· 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); ··· 273 276 WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); 274 277 WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ 275 278 } 279 + } else if (ASIC_IS_DCE3(rdev)) { 280 + /* according to the reg specs, this should DCE3.2 only, but in 281 + * practice it seems to cover DCE3.0/3.1 as well. 282 + */ 283 + if (dig->dig_encoder == 0) { 284 + WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); 285 + WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); 286 + WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */ 287 + } else { 288 + WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100); 289 + WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100); 290 + WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ 291 + } 276 292 } else { 277 - /* according to the reg specs, this should be DCE2.0 and DCE3.0 */ 293 + /* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */ 278 294 WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | 279 295 AUDIO_DTO_MODULE(clock / 10)); 280 296 }
+2
drivers/gpu/drm/radeon/radeon_asic.c
··· 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,
+43 -23
drivers/gpu/drm/radeon/radeon_atombios.c
··· 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 ··· 1379 1378 1380 1379 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1381 1380 sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); 1382 - 1381 + ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) 1382 + ((u8 *)&ss_info->asSS_Info[0]); 1383 1383 for (i = 0; i < num_indices; i++) { 1384 - if (ss_info->asSS_Info[i].ucSS_Id == id) { 1384 + if (ss_assign->ucSS_Id == id) { 1385 1385 ss->percentage = 1386 - le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage); 1387 - ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType; 1388 - ss->step = ss_info->asSS_Info[i].ucSS_Step; 1389 - ss->delay = ss_info->asSS_Info[i].ucSS_Delay; 1390 - ss->range = ss_info->asSS_Info[i].ucSS_Range; 1391 - ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; 1386 + le16_to_cpu(ss_assign->usSpreadSpectrumPercentage); 1387 + ss->type = ss_assign->ucSpreadSpectrumType; 1388 + ss->step = ss_assign->ucSS_Step; 1389 + ss->delay = ss_assign->ucSS_Delay; 1390 + ss->range = ss_assign->ucSS_Range; 1391 + ss->refdiv = ss_assign->ucRecommendedRef_Div; 1392 1392 return true; 1393 1393 } 1394 + ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*) 1395 + ((u8 *)ss_assign + sizeof(struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT)); 1394 1396 } 1395 1397 } 1396 1398 return false; ··· 1481 1477 struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; 1482 1478 }; 1483 1479 1480 + union asic_ss_assignment { 1481 + struct _ATOM_ASIC_SS_ASSIGNMENT v1; 1482 + struct _ATOM_ASIC_SS_ASSIGNMENT_V2 v2; 1483 + struct _ATOM_ASIC_SS_ASSIGNMENT_V3 v3; 1484 + }; 1485 + 1484 1486 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, 1485 1487 struct radeon_atom_ss *ss, 1486 1488 int id, u32 clock) ··· 1495 1485 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); 1496 1486 uint16_t data_offset, size; 1497 1487 union asic_ss_info *ss_info; 1488 + union asic_ss_assignment *ss_assign; 1498 1489 uint8_t frev, crev; 1499 1490 int i, num_indices; 1500 1491 ··· 1520 1509 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1521 1510 sizeof(ATOM_ASIC_SS_ASSIGNMENT); 1522 1511 1512 + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]); 1523 1513 for (i = 0; i < num_indices; i++) { 1524 - if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) && 1525 - (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) { 1514 + if ((ss_assign->v1.ucClockIndication == id) && 1515 + (clock <= le32_to_cpu(ss_assign->v1.ulTargetClockRange))) { 1526 1516 ss->percentage = 1527 - le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage); 1528 - ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode; 1529 - ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz); 1517 + le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); 1518 + ss->type = ss_assign->v1.ucSpreadSpectrumMode; 1519 + ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); 1530 1520 return true; 1531 1521 } 1522 + ss_assign = (union asic_ss_assignment *) 1523 + ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT)); 1532 1524 } 1533 1525 break; 1534 1526 case 2: 1535 1527 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1536 1528 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); 1529 + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]); 1537 1530 for (i = 0; i < num_indices; i++) { 1538 - if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) && 1539 - (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) { 1531 + if ((ss_assign->v2.ucClockIndication == id) && 1532 + (clock <= le32_to_cpu(ss_assign->v2.ulTargetClockRange))) { 1540 1533 ss->percentage = 1541 - le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage); 1542 - ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode; 1543 - ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz); 1534 + le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); 1535 + ss->type = ss_assign->v2.ucSpreadSpectrumMode; 1536 + ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); 1544 1537 if ((crev == 2) && 1545 1538 ((id == ASIC_INTERNAL_ENGINE_SS) || 1546 1539 (id == ASIC_INTERNAL_MEMORY_SS))) 1547 1540 ss->rate /= 100; 1548 1541 return true; 1549 1542 } 1543 + ss_assign = (union asic_ss_assignment *) 1544 + ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2)); 1550 1545 } 1551 1546 break; 1552 1547 case 3: 1553 1548 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1554 1549 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); 1550 + ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]); 1555 1551 for (i = 0; i < num_indices; i++) { 1556 - if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) && 1557 - (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) { 1552 + if ((ss_assign->v3.ucClockIndication == id) && 1553 + (clock <= le32_to_cpu(ss_assign->v3.ulTargetClockRange))) { 1558 1554 ss->percentage = 1559 - le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage); 1560 - ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode; 1561 - ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz); 1555 + le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); 1556 + ss->type = ss_assign->v3.ucSpreadSpectrumMode; 1557 + ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); 1562 1558 if ((id == ASIC_INTERNAL_ENGINE_SS) || 1563 1559 (id == ASIC_INTERNAL_MEMORY_SS)) 1564 1560 ss->rate /= 100; ··· 1573 1555 radeon_atombios_get_igp_ss_overrides(rdev, ss, id); 1574 1556 return true; 1575 1557 } 1558 + ss_assign = (union asic_ss_assignment *) 1559 + ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3)); 1576 1560 } 1577 1561 break; 1578 1562 default:
+3 -2
drivers/gpu/drm/radeon/radeon_cs.c
··· 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
+12 -3
drivers/gpu/drm/radeon/radeon_device.c
··· 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 }
+4 -4
drivers/gpu/drm/radeon/radeon_pm.c
··· 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 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 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 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,
+5 -3
drivers/gpu/drm/radeon/radeon_ring.c
··· 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 }
+1 -2
drivers/gpu/drm/radeon/radeon_uvd.c
··· 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);
+24
drivers/gpu/drm/radeon/si_dpm.c
··· 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) || ··· 2941 2940 ps->performance_levels[i].vddc = max_limits->vddc; 2942 2941 if (ps->performance_levels[i].vddci > max_limits->vddci) 2943 2942 ps->performance_levels[i].vddci = max_limits->vddci; 2943 + } 2944 + } 2945 + 2946 + /* limit clocks to max supported clocks based on voltage dependency tables */ 2947 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 2948 + &max_sclk_vddc); 2949 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 2950 + &max_mclk_vddci); 2951 + btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 2952 + &max_mclk_vddc); 2953 + 2954 + for (i = 0; i < ps->performance_level_count; i++) { 2955 + if (max_sclk_vddc) { 2956 + if (ps->performance_levels[i].sclk > max_sclk_vddc) 2957 + ps->performance_levels[i].sclk = max_sclk_vddc; 2958 + } 2959 + if (max_mclk_vddci) { 2960 + if (ps->performance_levels[i].mclk > max_mclk_vddci) 2961 + ps->performance_levels[i].mclk = max_mclk_vddci; 2962 + } 2963 + if (max_mclk_vddc) { 2964 + if (ps->performance_levels[i].mclk > max_mclk_vddc) 2965 + ps->performance_levels[i].mclk = max_mclk_vddc; 2944 2966 } 2945 2967 } 2946 2968
+2 -2
drivers/gpu/drm/radeon/uvd_v1_0.c
··· 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);
+2
include/uapi/drm/radeon_drm.h
··· 1007 1007 #define SI_TILE_MODE_DEPTH_STENCIL_2D_4AA 3 1008 1008 #define SI_TILE_MODE_DEPTH_STENCIL_2D_8AA 2 1009 1009 1010 + #define CIK_TILE_MODE_DEPTH_STENCIL_1D 5 1011 + 1010 1012 #endif