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

drm/i915/dg2: Memory latency values from pcode must be doubled

The memory latency values returned by pcode on DG2 are in units of "2
usec" rather than 1 usec on all other platforms. I.e., we need to
double the value returned by pcode to obtain the true latency value.

The bspec wording here was a bit ambiguous as to whether it wanted us to
multiply or divide the pcode value by two, but we confirmed offline with
the hardware team that we need to double the value the pcode gives us;
this change is intended to support a larger range of potential latency
values.

Bspec: 49326
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Harish Chegondi <harish.chegondi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210820225710.401136-1-matthew.d.roper@intel.com

+15 -14
+15 -14
drivers/gpu/drm/i915/intel_pm.c
··· 2859 2859 u32 val; 2860 2860 int ret, i; 2861 2861 int level, max_level = ilk_wm_max_level(dev_priv); 2862 + int mult = IS_DG2(dev_priv) ? 2 : 1; 2862 2863 2863 2864 /* read the first set of memory latencies[0:3] */ 2864 2865 val = 0; /* data0 to be programmed to 0 for first set */ ··· 2873 2872 return; 2874 2873 } 2875 2874 2876 - wm[0] = val & GEN9_MEM_LATENCY_LEVEL_MASK; 2877 - wm[1] = (val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2878 - GEN9_MEM_LATENCY_LEVEL_MASK; 2879 - wm[2] = (val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2880 - GEN9_MEM_LATENCY_LEVEL_MASK; 2881 - wm[3] = (val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2882 - GEN9_MEM_LATENCY_LEVEL_MASK; 2875 + wm[0] = (val & GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2876 + wm[1] = ((val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2877 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2878 + wm[2] = ((val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2879 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2880 + wm[3] = ((val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2881 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2883 2882 2884 2883 /* read the second set of memory latencies[4:7] */ 2885 2884 val = 1; /* data0 to be programmed to 1 for second set */ ··· 2892 2891 return; 2893 2892 } 2894 2893 2895 - wm[4] = val & GEN9_MEM_LATENCY_LEVEL_MASK; 2896 - wm[5] = (val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2897 - GEN9_MEM_LATENCY_LEVEL_MASK; 2898 - wm[6] = (val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2899 - GEN9_MEM_LATENCY_LEVEL_MASK; 2900 - wm[7] = (val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2901 - GEN9_MEM_LATENCY_LEVEL_MASK; 2894 + wm[4] = (val & GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2895 + wm[5] = ((val >> GEN9_MEM_LATENCY_LEVEL_1_5_SHIFT) & 2896 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2897 + wm[6] = ((val >> GEN9_MEM_LATENCY_LEVEL_2_6_SHIFT) & 2898 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2899 + wm[7] = ((val >> GEN9_MEM_LATENCY_LEVEL_3_7_SHIFT) & 2900 + GEN9_MEM_LATENCY_LEVEL_MASK) * mult; 2902 2901 2903 2902 /* 2904 2903 * If a level n (n > 1) has a 0us latency, all levels m (m >= n)