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

Merge branch 'drm-fixes-3.11' of git://people.freedesktop.org/~agd5f/linux

Alex writes:
- more fixes for SI dpm
- fix DP on some rv6xx boards

* 'drm-fixes-3.11' of git://people.freedesktop.org/~agd5f/linux:
drm/radeon/dpm: re-enable cac control on SI
drm/radeon/dpm: fix calculations in si_calculate_leakage_for_v_and_t_formula
drm: fix 64 bit drm fixed point helpers
drm/radeon/atom: initialize more atom interpretor elements to 0

+18 -12
+5
drivers/gpu/drm/radeon/atom.c
··· 1222 1222 int r; 1223 1223 1224 1224 mutex_lock(&ctx->mutex); 1225 + /* reset data block */ 1226 + ctx->data_block = 0; 1225 1227 /* reset reg block */ 1226 1228 ctx->reg_block = 0; 1227 1229 /* reset fb window */ 1228 1230 ctx->fb_base = 0; 1229 1231 /* reset io mode */ 1230 1232 ctx->io_mode = ATOM_IO_MM; 1233 + /* reset divmul */ 1234 + ctx->divmul[0] = 0; 1235 + ctx->divmul[1] = 0; 1231 1236 r = atom_execute_table_locked(ctx, index, params); 1232 1237 mutex_unlock(&ctx->mutex); 1233 1238 return r;
+6 -5
drivers/gpu/drm/radeon/si_dpm.c
··· 1765 1765 { 1766 1766 s64 kt, kv, leakage_w, i_leakage, vddc; 1767 1767 s64 temperature, t_slope, t_intercept, av, bv, t_ref; 1768 + s64 tmp; 1768 1769 1769 - i_leakage = drm_int2fixp(ileakage / 100); 1770 + i_leakage = drm_int2fixp(ileakage) / 100; 1770 1771 vddc = div64_s64(drm_int2fixp(v), 1000); 1771 1772 temperature = div64_s64(drm_int2fixp(t), 1000); 1772 1773 ··· 1777 1776 bv = div64_s64(drm_int2fixp(coeff->bv), 100000000); 1778 1777 t_ref = drm_int2fixp(coeff->t_ref); 1779 1778 1780 - kt = drm_fixp_div(drm_fixp_exp(drm_fixp_mul(drm_fixp_mul(t_slope, vddc) + t_intercept, temperature)), 1781 - drm_fixp_exp(drm_fixp_mul(drm_fixp_mul(t_slope, vddc) + t_intercept, t_ref))); 1779 + tmp = drm_fixp_mul(t_slope, vddc) + t_intercept; 1780 + kt = drm_fixp_exp(drm_fixp_mul(tmp, temperature)); 1781 + kt = drm_fixp_div(kt, drm_fixp_exp(drm_fixp_mul(tmp, t_ref))); 1782 1782 kv = drm_fixp_mul(av, drm_fixp_exp(drm_fixp_mul(bv, vddc))); 1783 1783 1784 1784 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc); ··· 2044 2042 ni_pi->enable_sq_ramping = false; 2045 2043 si_pi->enable_dte = false; 2046 2044 2047 - /* XXX: fix me */ 2048 - if (0/*si_pi->powertune_data->enable_powertune_by_default*/) { 2045 + if (si_pi->powertune_data->enable_powertune_by_default) { 2049 2046 ni_pi->enable_power_containment= true; 2050 2047 ni_pi->enable_cac = true; 2051 2048 if (si_pi->dte_data.enable_dte_by_default) {
+7 -7
include/drm/drm_fixed.h
··· 84 84 return ((s64)a) >> DRM_FIXED_POINT; 85 85 } 86 86 87 - static inline s64 drm_fixp_msbset(int64_t a) 87 + static inline unsigned drm_fixp_msbset(int64_t a) 88 88 { 89 89 unsigned shift, sign = (a >> 63) & 1; 90 90 91 91 for (shift = 62; shift > 0; --shift) 92 - if ((a >> shift) != sign) 92 + if (((a >> shift) & 1) != sign) 93 93 return shift; 94 94 95 95 return 0; ··· 100 100 unsigned shift = drm_fixp_msbset(a) + drm_fixp_msbset(b); 101 101 s64 result; 102 102 103 - if (shift > 63) { 104 - shift = shift - 63; 105 - a >>= shift >> 1; 103 + if (shift > 61) { 104 + shift = shift - 61; 105 + a >>= (shift >> 1) + (shift & 1); 106 106 b >>= shift >> 1; 107 107 } else 108 108 shift = 0; ··· 120 120 121 121 static inline s64 drm_fixp_div(s64 a, s64 b) 122 122 { 123 - unsigned shift = 63 - drm_fixp_msbset(a); 123 + unsigned shift = 62 - drm_fixp_msbset(a); 124 124 s64 result; 125 125 126 126 a <<= shift; ··· 154 154 } 155 155 156 156 if (x < 0) 157 - sum = drm_fixp_div(1, sum); 157 + sum = drm_fixp_div(DRM_FIXED_ONE, sum); 158 158 159 159 return sum; 160 160 }