History

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

Linus Torvalds committed 13 years ago

Commit b97b8692 parents 669fc2f 665441726 files · +266 −77Browse files

Unified · Split

26 files
  1. drivers/gpu/drm/i915/i915_gem.c +4 −4
  2. drivers/gpu/drm/i915/i915_gpu_error.c +4 −2
  3. drivers/gpu/drm/i915/intel_display.c +4 −0
  4. drivers/gpu/drm/i915/intel_dp.c +12 −1
  5. drivers/gpu/drm/i915/intel_tv.c +8 −0
  6. drivers/gpu/drm/msm/mdp4/mdp4_kms.c +0 −2
  7. drivers/gpu/drm/msm/msm_drv.c +4 −4
  8. drivers/gpu/drm/msm/msm_gem.c +0 −7
  9. drivers/gpu/drm/radeon/btc_dpm.c +51 −0
  10. drivers/gpu/drm/radeon/btc_dpm.h +2 −0
  11. drivers/gpu/drm/radeon/ci_dpm.c +26 −0
  12. drivers/gpu/drm/radeon/cik.c +8 −9
  13. drivers/gpu/drm/radeon/ni_dpm.c +24 −0
  14. drivers/gpu/drm/radeon/r100.c +5 −3
  15. drivers/gpu/drm/radeon/r600_dpm.c +1 −1
  16. drivers/gpu/drm/radeon/r600_hdmi.c +15 −5
  17. drivers/gpu/drm/radeon/radeon_asic.c +2 −0
  18. drivers/gpu/drm/radeon/radeon_atombios.c +43 −23
  19. drivers/gpu/drm/radeon/radeon_cs.c +3 −2
  20. drivers/gpu/drm/radeon/radeon_device.c +12 −3
  21. drivers/gpu/drm/radeon/radeon_pm.c +4 −4
  22. drivers/gpu/drm/radeon/radeon_ring.c +5 −3
  23. drivers/gpu/drm/radeon/radeon_uvd.c +1 −2
  24. drivers/gpu/drm/radeon/si_dpm.c +24 −0
  25. drivers/gpu/drm/radeon/uvd_v1_0.c +2 −2
  26. include/uapi/drm/radeon_drm.h +2 −0
drivers/gpu/drm/i915/i915_gem.c+4−4
@@ -4800,10 +4800,10 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc) · 4799 unmodified lines
48004800
48014801 if (!mutex_trylock(&dev->struct_mutex)) {
48024802 if (!mutex_is_locked_by(&dev->struct_mutex, current))
4803− return SHRINK_STOP;
4803+ return 0;
48044804
48054805 if (dev_priv->mm.shrinker_no_lock_stealing)
4806− return SHRINK_STOP;
4806+ return 0;
48074807
48084808 unlock = false;
48094809 }
@@ -4901,10 +4901,10 @@ i915_gem_inactive_scan(struct shrinker *shrinker, struct shrink_control *sc) · 91 unmodified lines
49014901
49024902 if (!mutex_trylock(&dev->struct_mutex)) {
49034903 if (!mutex_is_locked_by(&dev->struct_mutex, current))
4904− return 0;
4904+ return SHRINK_STOP;
49054905
49064906 if (dev_priv->mm.shrinker_no_lock_stealing)
4907− return 0;
4907+ return SHRINK_STOP;
49084908
49094909 unlock = false;
49104910 }
drivers/gpu/drm/i915/i915_gpu_error.c+4−2
@@ -143,8 +143,10 @@ static void i915_error_vprintf(struct drm_i915_error_state_buf *e, · 142 unmodified lines
143143
144144 /* Seek the first printf which is hits start position */
145145 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)))
148150 return;
149151 }
150152
drivers/gpu/drm/i915/intel_display.c+4−0
@@ -4775,6 +4775,10 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc) · 4774 unmodified lines
47754775
47764776 pipeconf = 0;
47774777
4778+ if (dev_priv->quirks & QUIRK_PIPEA_FORCE &&
4779+ I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE)
4780+ pipeconf |= PIPECONF_ENABLE;
4781+
47784782 if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) {
47794783 /* Enable pixel doubling when the dot clock is > 90% of the (display)
47804784 * core speed.
drivers/gpu/drm/i915/intel_dp.c+12−1
@@ -588,7 +588,18 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, · 587 unmodified lines
588588 DRM_DEBUG_KMS("aux_ch native nack\n");
589589 return -EREMOTEIO;
590590 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);
592603 continue;
593604 default:
594605 DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
drivers/gpu/drm/i915/intel_tv.c+8−0
@@ -916,6 +916,14 @@ intel_tv_compute_config(struct intel_encoder *encoder, · 915 unmodified lines
916916 DRM_DEBUG_KMS("forcing bpc to 8 for TV\n");
917917 pipe_config->pipe_bpp = 8*3;
918918
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+
919927 return true;
920928 }
921929
drivers/gpu/drm/msm/mdp4/mdp4_kms.c+0−2
@@ -19,8 +19,6 @@ · 18 unmodified lines
1919 #include "msm_drv.h"
2020 #include "mdp4_kms.h"
2121
22−#include <mach/iommu.h>
23−
2422 static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev);
2523
2624 static int mdp4_hw_init(struct msm_kms *kms)
drivers/gpu/drm/msm/msm_drv.c+4−4
@@ -18,8 +18,6 @@ · 17 unmodified lines
1818 #include "msm_drv.h"
1919 #include "msm_gpu.h"
2020
21−#include <mach/iommu.h>
22−
2321 static void msm_fb_output_poll_changed(struct drm_device *dev)
2422 {
2523 struct msm_drm_private *priv = dev->dev_private;
@@ -62,6 +60,8 @@ int msm_iommu_attach(struct drm_device *dev, struct iommu_domain *iommu, · 36 unmodified lines
6260 int i, ret;
6361
6462 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);
6565 struct device *ctx = msm_iommu_get_ctx(names[i]);
6666 if (!ctx)
6767 continue;
@@ -199,7 +199,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags) · 131 unmodified lines
199199 * imx drm driver on iMX5
200200 */
201201 dev_err(dev->dev, "failed to load kms\n");
202− ret = PTR_ERR(priv->kms);
202+ ret = PTR_ERR(kms);
203203 goto fail;
204204 }
205205
@@ -697,7 +697,7 @@ static struct drm_driver msm_driver = { · 491 unmodified lines
697697 .gem_vm_ops = &vm_ops,
698698 .dumb_create = msm_gem_dumb_create,
699699 .dumb_map_offset = msm_gem_dumb_map_offset,
700− .dumb_destroy = msm_gem_dumb_destroy,
700+ .dumb_destroy = drm_gem_dumb_destroy,
701701 #ifdef CONFIG_DEBUG_FS
702702 .debugfs_init = msm_debugfs_init,
703703 .debugfs_cleanup = msm_debugfs_cleanup,
drivers/gpu/drm/msm/msm_gem.c+0−7
@@ -319,13 +319,6 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, · 318 unmodified lines
319319 MSM_BO_SCANOUT | MSM_BO_WC, &args->handle);
320320 }
321321
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−
329322 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
330323 uint32_t handle, uint64_t *offset)
331324 {
drivers/gpu/drm/radeon/btc_dpm.c+51−0
@@ -1168,6 +1168,23 @@ static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = · 1167 unmodified lines
11681168 { 25000, 30000, RADEON_SCLK_UP }
11691169 };
11701170
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+
11711188 void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
11721189 u32 clock, u16 max_voltage, u16 *voltage)
11731190 {
@@ -2080,6 +2097,7 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, · 906 unmodified lines
20802097 bool disable_mclk_switching;
20812098 u32 mclk, sclk;
20822099 u16 vddc, vddci;
2100+ u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
20832101
20842102 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
20852103 btc_dpm_vblank_too_short(rdev))
@@ -2121,6 +2139,39 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, · 35 unmodified lines
21212139 ps->low.vddci = max_limits->vddci;
21222140 }
21232141
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+
21242175 /* XXX validate the min clocks required for display */
21252176
21262177 if (disable_mclk_switching) {
drivers/gpu/drm/radeon/btc_dpm.h+2−0
@@ -46,6 +46,8 @@ void btc_adjust_clock_combinations(struct radeon_device *rdev, · 45 unmodified lines
4646 struct rv7xx_pl *pl);
4747 void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
4848 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);
4951 void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
5052 u16 max_vddc, u16 max_vddci,
5153 u16 *vddc, u16 *vddci);
drivers/gpu/drm/radeon/ci_dpm.c+26−0
@@ -146,6 +146,8 @@ static const struct ci_pt_config_reg didt_config_ci[] = · 145 unmodified lines
146146 };
147147
148148 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);
149151 extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
150152 u32 arb_freq_src, u32 arb_freq_dest);
151153 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, · 560 unmodified lines
712714 struct radeon_clock_and_voltage_limits *max_limits;
713715 bool disable_mclk_switching;
714716 u32 sclk, mclk;
717+ u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
715718 int i;
716719
717720 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
@@ -739,6 +742,29 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, · 21 unmodified lines
739742 }
740743 }
741744
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+
742768 /* XXX validate the min clocks required for display */
743769
744770 if (disable_mclk_switching) {
drivers/gpu/drm/radeon/cik.c+8−9
@@ -2845,10 +2845,8 @@ static void cik_gpu_init(struct radeon_device *rdev) · 2844 unmodified lines
28452845 rdev->config.cik.tile_config |= (3 << 0);
28462846 break;
28472847 }
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;
28522850 rdev->config.cik.tile_config |=
28532851 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
28542852 rdev->config.cik.tile_config |=
@@ -4456,8 +4454,8 @@ static int cik_mc_init(struct radeon_device *rdev) · 1601 unmodified lines
44564454 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
44574455 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
44584456 /* 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;
44614459 rdev->mc.visible_vram_size = rdev->mc.aper_size;
44624460 si_vram_gtt_location(rdev, &rdev->mc);
44634461 radeon_update_bandwidth_info(rdev);
@@ -4735,12 +4733,13 @@ static void cik_vm_decode_fault(struct radeon_device *rdev, · 271 unmodified lines
47354733 u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
47364734 u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
47374735 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 };
47394738
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",
47414740 protections, vmid, addr,
47424741 (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
4743− block, mc_id);
4742+ block, mc_client, mc_id);
47444743 }
47454744
47464745 /**
drivers/gpu/drm/radeon/ni_dpm.c+24−0
@@ -787,6 +787,7 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, · 786 unmodified lines
787787 bool disable_mclk_switching;
788788 u32 mclk, sclk;
789789 u16 vddc, vddci;
790+ u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
790791 int i;
791792
792793 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
@@ -813,6 +814,29 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, · 20 unmodified lines
813814 }
814815 }
815816
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+
816840 /* XXX validate the min clocks required for display */
817841
818842 if (disable_mclk_switching) {
drivers/gpu/drm/radeon/r100.c+5−3
@@ -2933,9 +2933,11 @@ static int r100_debugfs_cp_ring_info(struct seq_file *m, void *data) · 2932 unmodified lines
29332933 seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp);
29342934 seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);
29352935 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+ }
29392941 }
29402942 return 0;
29412943 }
drivers/gpu/drm/radeon/r600_dpm.c+1−1
@@ -1084,7 +1084,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev) · 1083 unmodified lines
10841084 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk =
10851085 le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16);
10861086 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);
10881088 entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *)
10891089 ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record));
10901090 }
drivers/gpu/drm/radeon/r600_hdmi.c+15−5
@@ -257,10 +257,7 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) · 256 unmodified lines
257257 * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
258258 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
259259 */
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)) {
264261 if (dig->dig_encoder == 0) {
265262 dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
266263 dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
@@ -276,8 +273,21 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) · 9 unmodified lines
276273 WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo);
277274 WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
278275 }
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+ }
279289 } 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 */
281291 WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) |
282292 AUDIO_DTO_MODULE(clock / 10));
283293 }
drivers/gpu/drm/radeon/radeon_asic.c+2−0
@@ -1004,6 +1004,8 @@ static struct radeon_asic rv6xx_asic = { · 1003 unmodified lines
10041004 .wait_for_vblank = &avivo_wait_for_vblank,
10051005 .set_backlight_level = &atombios_set_backlight_level,
10061006 .get_backlight_level = &atombios_get_backlight_level,
1007+ .hdmi_enable = &r600_hdmi_enable,
1008+ .hdmi_setmode = &r600_hdmi_setmode,
10071009 },
10081010 .copy = {
10091011 .blit = &r600_copy_cpdma,
drivers/gpu/drm/radeon/radeon_atombios.c+43−23
@@ -1367,6 +1367,7 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, · 1366 unmodified lines
13671367 int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
13681368 uint16_t data_offset, size;
13691369 struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1370+ struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *ss_assign;
13701371 uint8_t frev, crev;
13711372 int i, num_indices;
13721373
@@ -1378,18 +1379,21 @@ bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, · 5 unmodified lines
13781379
13791380 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
13801381 sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1381−
1382+ ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*)
1383+ ((u8 *)&ss_info->asSS_Info[0]);
13821384 for (i = 0; i < num_indices; i++) {
1383− if (ss_info->asSS_Info[i].ucSS_Id == id) {
1385+ if (ss_assign->ucSS_Id == id) {
13841386 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;
13911393 return true;
13921394 }
1395+ ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT*)
1396+ ((u8 *)ss_assign + sizeof(struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT));
13931397 }
13941398 }
13951399 return false;
@@ -1477,6 +1481,12 @@ union asic_ss_info { · 81 unmodified lines
14771481 struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
14781482 };
14791483
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+
14801490 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
14811491 struct radeon_atom_ss *ss,
14821492 int id, u32 clock)
@@ -1485,6 +1495,7 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, · 2 unmodified lines
14851495 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
14861496 uint16_t data_offset, size;
14871497 union asic_ss_info *ss_info;
1498+ union asic_ss_assignment *ss_assign;
14881499 uint8_t frev, crev;
14891500 int i, num_indices;
14901501
@@ -1509,45 +1520,52 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, · 18 unmodified lines
15091520 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
15101521 sizeof(ATOM_ASIC_SS_ASSIGNMENT);
15111522
1523+ ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]);
15121524 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))) {
15151527 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);
15191531 return true;
15201532 }
1533+ ss_assign = (union asic_ss_assignment *)
1534+ ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT));
15211535 }
15221536 break;
15231537 case 2:
15241538 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
15251539 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1540+ ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]);
15261541 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))) {
15291544 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);
15331548 if ((crev == 2) &&
15341549 ((id == ASIC_INTERNAL_ENGINE_SS) ||
15351550 (id == ASIC_INTERNAL_MEMORY_SS)))
15361551 ss->rate /= 100;
15371552 return true;
15381553 }
1554+ ss_assign = (union asic_ss_assignment *)
1555+ ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2));
15391556 }
15401557 break;
15411558 case 3:
15421559 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
15431560 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1561+ ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]);
15441562 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))) {
15471565 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);
15511569 if ((id == ASIC_INTERNAL_ENGINE_SS) ||
15521570 (id == ASIC_INTERNAL_MEMORY_SS))
15531571 ss->rate /= 100;
@@ -1555,6 +1573,8 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, · 1 unmodified line
15551573 radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
15561574 return true;
15571575 }
1576+ ss_assign = (union asic_ss_assignment *)
1577+ ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3));
15581578 }
15591579 break;
15601580 default:
drivers/gpu/drm/radeon/radeon_cs.c+3−2
@@ -85,8 +85,9 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) · 84 unmodified lines
8585 VRAM, also but everything into VRAM on AGP cards to avoid
8686 image corruptions */
8787 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+
9091 p->relocs[i].lobj.domain =
9192 RADEON_GEM_DOMAIN_VRAM;
9293
drivers/gpu/drm/radeon/radeon_device.c+12−3
@@ -1320,13 +1320,22 @@ int radeon_device_init(struct radeon_device *rdev, · 1319 unmodified lines
13201320 return r;
13211321 }
13221322 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");
13241327 }
13251328 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");
13271333 }
13281334 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");
13301339 }
13311340 return 0;
13321341 }
drivers/gpu/drm/radeon/radeon_pm.c+4−4
@@ -1002,7 +1002,7 @@ static void radeon_pm_resume_old(struct radeon_device *rdev) · 1001 unmodified lines
10021002 {
10031003 /* set up the default clocks if the MC ucode is loaded */
10041004 if ((rdev->family >= CHIP_BARTS) &&
1005− (rdev->family <= CHIP_HAINAN) &&
1005+ (rdev->family <= CHIP_CAYMAN) &&
10061006 rdev->mc_fw) {
10071007 if (rdev->pm.default_vddc)
10081008 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
@@ -1046,7 +1046,7 @@ static void radeon_pm_resume_dpm(struct radeon_device *rdev) · 37 unmodified lines
10461046 if (ret) {
10471047 DRM_ERROR("radeon: dpm resume failed\n");
10481048 if ((rdev->family >= CHIP_BARTS) &&
1049− (rdev->family <= CHIP_HAINAN) &&
1049+ (rdev->family <= CHIP_CAYMAN) &&
10501050 rdev->mc_fw) {
10511051 if (rdev->pm.default_vddc)
10521052 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
@@ -1097,7 +1097,7 @@ static int radeon_pm_init_old(struct radeon_device *rdev) · 44 unmodified lines
10971097 radeon_pm_init_profile(rdev);
10981098 /* set up the default clocks if the MC ucode is loaded */
10991099 if ((rdev->family >= CHIP_BARTS) &&
1100− (rdev->family <= CHIP_HAINAN) &&
1100+ (rdev->family <= CHIP_CAYMAN) &&
11011101 rdev->mc_fw) {
11021102 if (rdev->pm.default_vddc)
11031103 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
@@ -1183,7 +1183,7 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) · 79 unmodified lines
11831183 if (ret) {
11841184 rdev->pm.dpm_enabled = false;
11851185 if ((rdev->family >= CHIP_BARTS) &&
1186− (rdev->family <= CHIP_HAINAN) &&
1186+ (rdev->family <= CHIP_CAYMAN) &&
11871187 rdev->mc_fw) {
11881188 if (rdev->pm.default_vddc)
11891189 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
drivers/gpu/drm/radeon/radeon_ring.c+5−3
@@ -839,9 +839,11 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) · 838 unmodified lines
839839 * packet that is the root issue
840840 */
841841 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+ }
845847 }
846848 return 0;
847849 }
drivers/gpu/drm/radeon/radeon_uvd.c+1−2
@@ -476,8 +476,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, · 475 unmodified lines
476476 return -EINVAL;
477477 }
478478
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) &&
481480 (start >> 28) != (p->rdev->uvd.gpu_addr >> 28)) {
482481 DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n",
483482 start, end);
drivers/gpu/drm/radeon/si_dpm.c+24−0
@@ -2910,6 +2910,7 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, · 2909 unmodified lines
29102910 bool disable_sclk_switching = false;
29112911 u32 mclk, sclk;
29122912 u16 vddc, vddci;
2913+ u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
29132914 int i;
29142915
29152916 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
@@ -2943,6 +2944,29 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, · 27 unmodified lines
29432944 }
29442945 }
29452946
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+
29462970 /* XXX validate the min clocks required for display */
29472971
29482972 if (disable_mclk_switching) {
drivers/gpu/drm/radeon/uvd_v1_0.c+2−2
@@ -212,8 +212,8 @@ int uvd_v1_0_start(struct radeon_device *rdev) · 211 unmodified lines
212212 /* enable VCPU clock */
213213 WREG32(UVD_VCPU_CNTL, 1 << 9);
214214
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)));
217217
218218 /* boot up the VCPU */
219219 WREG32(UVD_SOFT_RESET, 0);
include/uapi/drm/radeon_drm.h+2−0
@@ -1007,4 +1007,6 @@ struct drm_radeon_info { · 1006 unmodified lines
10071007 #define SI_TILE_MODE_DEPTH_STENCIL_2D_4AA 3
10081008 #define SI_TILE_MODE_DEPTH_STENCIL_2D_8AA 2
10091009
1010+#define CIK_TILE_MODE_DEPTH_STENCIL_1D 5
1011+
10101012 #endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t