diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2013-04-17 18:54:58 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-04-18 04:15:43 -0400 |
commit | 0a073b843bcd9a660f76e497182aac97cafddc4c (patch) | |
tree | a4665fb1ced6aa9f09150438e260544543d6335a /drivers/gpu/drm/i915/i915_debugfs.c | |
parent | 855ba3be12badf6228151ca3ccf54632cfdd463d (diff) |
drm/i915: turbo & RC6 support for VLV v7
Uses slightly different interfaces than other platforms.
v2: track actual set freq, not requested (Rohit)
fix debug prints in init code (Jesse)
v3: don't write sleep reg (Jesse)
re-add RC6 wake limit write (Ben)
fixup thresholds to match other platforms (Ben)
clean up mem freq calculation (Ben)
clean up debug prints (Ben)
v4: move defines from punit patch (Ville)
v5: remove writes to nonexistent regs (Jesse)
put RP and RC regs together (Jesse)
fix RC6 enable (Jesse)
v6: use correct fuse reads from NC (Jesse)
split out min/max funcs for use in sysfs (Jesse)
add debugfs & sysfs freq controls (Jesse)
v7: update with Ben's hw_max changes (Jesse)
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net> (v6)
[danvet: Follow checkpatch sugggestion to use min_t to avoid casting
fun.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index e913d325d5b8..367b534d2260 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -941,7 +941,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
941 | MEMSTAT_VID_SHIFT); | 941 | MEMSTAT_VID_SHIFT); |
942 | seq_printf(m, "Current P-state: %d\n", | 942 | seq_printf(m, "Current P-state: %d\n", |
943 | (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT); | 943 | (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT); |
944 | } else if (IS_GEN6(dev) || IS_GEN7(dev)) { | 944 | } else if ((IS_GEN6(dev) || IS_GEN7(dev)) && !IS_VALLEYVIEW(dev)) { |
945 | u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); | 945 | u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); |
946 | u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); | 946 | u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); |
947 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); | 947 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); |
@@ -1009,6 +1009,25 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
1009 | 1009 | ||
1010 | seq_printf(m, "Max overclocked frequency: %dMHz\n", | 1010 | seq_printf(m, "Max overclocked frequency: %dMHz\n", |
1011 | dev_priv->rps.hw_max * GT_FREQUENCY_MULTIPLIER); | 1011 | dev_priv->rps.hw_max * GT_FREQUENCY_MULTIPLIER); |
1012 | } else if (IS_VALLEYVIEW(dev)) { | ||
1013 | u32 freq_sts, val; | ||
1014 | |||
1015 | valleyview_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS, | ||
1016 | &freq_sts); | ||
1017 | seq_printf(m, "PUNIT_REG_GPU_FREQ_STS: 0x%08x\n", freq_sts); | ||
1018 | seq_printf(m, "DDR freq: %d MHz\n", dev_priv->mem_freq); | ||
1019 | |||
1020 | valleyview_punit_read(dev_priv, PUNIT_FUSE_BUS1, &val); | ||
1021 | seq_printf(m, "max GPU freq: %d MHz\n", | ||
1022 | vlv_gpu_freq(dev_priv->mem_freq, val)); | ||
1023 | |||
1024 | valleyview_punit_read(dev_priv, PUNIT_REG_GPU_LFM, &val); | ||
1025 | seq_printf(m, "min GPU freq: %d MHz\n", | ||
1026 | vlv_gpu_freq(dev_priv->mem_freq, val)); | ||
1027 | |||
1028 | seq_printf(m, "current GPU freq: %d MHz\n", | ||
1029 | vlv_gpu_freq(dev_priv->mem_freq, | ||
1030 | (freq_sts >> 8) & 0xff)); | ||
1012 | } else { | 1031 | } else { |
1013 | seq_printf(m, "no P-state info available\n"); | 1032 | seq_printf(m, "no P-state info available\n"); |
1014 | } | 1033 | } |
@@ -1812,7 +1831,11 @@ i915_max_freq_get(void *data, u64 *val) | |||
1812 | if (ret) | 1831 | if (ret) |
1813 | return ret; | 1832 | return ret; |
1814 | 1833 | ||
1815 | *val = dev_priv->rps.max_delay * GT_FREQUENCY_MULTIPLIER; | 1834 | if (IS_VALLEYVIEW(dev)) |
1835 | *val = vlv_gpu_freq(dev_priv->mem_freq, | ||
1836 | dev_priv->rps.max_delay); | ||
1837 | else | ||
1838 | *val = dev_priv->rps.max_delay * GT_FREQUENCY_MULTIPLIER; | ||
1816 | mutex_unlock(&dev_priv->rps.hw_lock); | 1839 | mutex_unlock(&dev_priv->rps.hw_lock); |
1817 | 1840 | ||
1818 | return 0; | 1841 | return 0; |
@@ -1837,9 +1860,16 @@ i915_max_freq_set(void *data, u64 val) | |||
1837 | /* | 1860 | /* |
1838 | * Turbo will still be enabled, but won't go above the set value. | 1861 | * Turbo will still be enabled, but won't go above the set value. |
1839 | */ | 1862 | */ |
1840 | do_div(val, GT_FREQUENCY_MULTIPLIER); | 1863 | if (IS_VALLEYVIEW(dev)) { |
1841 | dev_priv->rps.max_delay = val; | 1864 | val = vlv_freq_opcode(dev_priv->mem_freq, val); |
1842 | gen6_set_rps(dev, val); | 1865 | dev_priv->rps.max_delay = val; |
1866 | gen6_set_rps(dev, val); | ||
1867 | } else { | ||
1868 | do_div(val, GT_FREQUENCY_MULTIPLIER); | ||
1869 | dev_priv->rps.max_delay = val; | ||
1870 | gen6_set_rps(dev, val); | ||
1871 | } | ||
1872 | |||
1843 | mutex_unlock(&dev_priv->rps.hw_lock); | 1873 | mutex_unlock(&dev_priv->rps.hw_lock); |
1844 | 1874 | ||
1845 | return 0; | 1875 | return 0; |
@@ -1863,7 +1893,11 @@ i915_min_freq_get(void *data, u64 *val) | |||
1863 | if (ret) | 1893 | if (ret) |
1864 | return ret; | 1894 | return ret; |
1865 | 1895 | ||
1866 | *val = dev_priv->rps.min_delay * GT_FREQUENCY_MULTIPLIER; | 1896 | if (IS_VALLEYVIEW(dev)) |
1897 | *val = vlv_gpu_freq(dev_priv->mem_freq, | ||
1898 | dev_priv->rps.min_delay); | ||
1899 | else | ||
1900 | *val = dev_priv->rps.min_delay * GT_FREQUENCY_MULTIPLIER; | ||
1867 | mutex_unlock(&dev_priv->rps.hw_lock); | 1901 | mutex_unlock(&dev_priv->rps.hw_lock); |
1868 | 1902 | ||
1869 | return 0; | 1903 | return 0; |
@@ -1888,9 +1922,15 @@ i915_min_freq_set(void *data, u64 val) | |||
1888 | /* | 1922 | /* |
1889 | * Turbo will still be enabled, but won't go below the set value. | 1923 | * Turbo will still be enabled, but won't go below the set value. |
1890 | */ | 1924 | */ |
1891 | do_div(val, GT_FREQUENCY_MULTIPLIER); | 1925 | if (IS_VALLEYVIEW(dev)) { |
1892 | dev_priv->rps.min_delay = val; | 1926 | val = vlv_freq_opcode(dev_priv->mem_freq, val); |
1893 | gen6_set_rps(dev, val); | 1927 | dev_priv->rps.min_delay = val; |
1928 | valleyview_set_rps(dev, val); | ||
1929 | } else { | ||
1930 | do_div(val, GT_FREQUENCY_MULTIPLIER); | ||
1931 | dev_priv->rps.min_delay = val; | ||
1932 | gen6_set_rps(dev, val); | ||
1933 | } | ||
1894 | mutex_unlock(&dev_priv->rps.hw_lock); | 1934 | mutex_unlock(&dev_priv->rps.hw_lock); |
1895 | 1935 | ||
1896 | return 0; | 1936 | return 0; |