@@ -1106,6 +1106,39 @@ static int skl_get_dimm_ranks(u16 val)
1106
1106
return val + 1 ;
1107
1107
}
1108
1108
1109
+ /* Returns total GB for the whole DIMM */
1110
+ static int cnl_get_dimm_size (u16 val )
1111
+ {
1112
+ return (val & CNL_DRAM_SIZE_MASK ) / 2 ;
1113
+ }
1114
+
1115
+ static int cnl_get_dimm_width (u16 val )
1116
+ {
1117
+ if (cnl_get_dimm_size (val ) == 0 )
1118
+ return 0 ;
1119
+
1120
+ switch (val & CNL_DRAM_WIDTH_MASK ) {
1121
+ case CNL_DRAM_WIDTH_X8 :
1122
+ case CNL_DRAM_WIDTH_X16 :
1123
+ case CNL_DRAM_WIDTH_X32 :
1124
+ val = (val & CNL_DRAM_WIDTH_MASK ) >> CNL_DRAM_WIDTH_SHIFT ;
1125
+ return 8 << val ;
1126
+ default :
1127
+ MISSING_CASE (val );
1128
+ return 0 ;
1129
+ }
1130
+ }
1131
+
1132
+ static int cnl_get_dimm_ranks (u16 val )
1133
+ {
1134
+ if (cnl_get_dimm_size (val ) == 0 )
1135
+ return 0 ;
1136
+
1137
+ val = (val & CNL_DRAM_RANK_MASK ) >> CNL_DRAM_RANK_SHIFT ;
1138
+
1139
+ return val + 1 ;
1140
+ }
1141
+
1109
1142
static bool
1110
1143
skl_is_16gb_dimm (const struct dram_dimm_info * dimm )
1111
1144
{
@@ -1114,24 +1147,34 @@ skl_is_16gb_dimm(const struct dram_dimm_info *dimm)
1114
1147
}
1115
1148
1116
1149
static void
1117
- skl_dram_get_dimm_info (struct dram_dimm_info * dimm ,
1150
+ skl_dram_get_dimm_info (struct drm_i915_private * dev_priv ,
1151
+ struct dram_dimm_info * dimm ,
1118
1152
int channel , char dimm_name , u16 val )
1119
1153
{
1120
- dimm -> size = skl_get_dimm_size (val );
1121
- dimm -> width = skl_get_dimm_width (val );
1122
- dimm -> ranks = skl_get_dimm_ranks (val );
1154
+ if (INTEL_GEN (dev_priv ) >= 10 ) {
1155
+ dimm -> size = cnl_get_dimm_size (val );
1156
+ dimm -> width = cnl_get_dimm_width (val );
1157
+ dimm -> ranks = cnl_get_dimm_ranks (val );
1158
+ } else {
1159
+ dimm -> size = skl_get_dimm_size (val );
1160
+ dimm -> width = skl_get_dimm_width (val );
1161
+ dimm -> ranks = skl_get_dimm_ranks (val );
1162
+ }
1123
1163
1124
1164
DRM_DEBUG_KMS ("CH%u DIMM %c size: %u GB, width: X%u, ranks: %u, 16Gb DIMMs: %s\n" ,
1125
1165
channel , dimm_name , dimm -> size , dimm -> width , dimm -> ranks ,
1126
1166
yesno (skl_is_16gb_dimm (dimm )));
1127
1167
}
1128
1168
1129
1169
static int
1130
- skl_dram_get_channel_info (struct dram_channel_info * ch ,
1170
+ skl_dram_get_channel_info (struct drm_i915_private * dev_priv ,
1171
+ struct dram_channel_info * ch ,
1131
1172
int channel , u32 val )
1132
1173
{
1133
- skl_dram_get_dimm_info (& ch -> dimm_l , channel , 'L' , val & 0xffff );
1134
- skl_dram_get_dimm_info (& ch -> dimm_s , channel , 'S' , val >> 16 );
1174
+ skl_dram_get_dimm_info (dev_priv , & ch -> dimm_l ,
1175
+ channel , 'L' , val & 0xffff );
1176
+ skl_dram_get_dimm_info (dev_priv , & ch -> dimm_s ,
1177
+ channel , 'S' , val >> 16 );
1135
1178
1136
1179
if (ch -> dimm_l .size == 0 && ch -> dimm_s .size == 0 ) {
1137
1180
DRM_DEBUG_KMS ("CH%u not populated\n" , channel );
@@ -1173,12 +1216,12 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1173
1216
int ret ;
1174
1217
1175
1218
val = I915_READ (SKL_MAD_DIMM_CH0_0_0_0_MCHBAR_MCMAIN );
1176
- ret = skl_dram_get_channel_info (& ch0 , 0 , val );
1219
+ ret = skl_dram_get_channel_info (dev_priv , & ch0 , 0 , val );
1177
1220
if (ret == 0 )
1178
1221
dram_info -> num_channels ++ ;
1179
1222
1180
1223
val = I915_READ (SKL_MAD_DIMM_CH1_0_0_0_MCHBAR_MCMAIN );
1181
- ret = skl_dram_get_channel_info (& ch1 , 1 , val );
1224
+ ret = skl_dram_get_channel_info (dev_priv , & ch1 , 1 , val );
1182
1225
if (ret == 0 )
1183
1226
dram_info -> num_channels ++ ;
1184
1227
@@ -1375,13 +1418,10 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
1375
1418
if (INTEL_GEN (dev_priv ) < 9 )
1376
1419
return ;
1377
1420
1378
- /* Need to calculate bandwidth only for Gen9 */
1379
1421
if (IS_GEN9_LP (dev_priv ))
1380
1422
ret = bxt_get_dram_info (dev_priv );
1381
- else if (IS_GEN (dev_priv , 9 ))
1382
- ret = skl_get_dram_info (dev_priv );
1383
1423
else
1384
- ret = skl_dram_get_channels_info (dev_priv );
1424
+ ret = skl_get_dram_info (dev_priv );
1385
1425
if (ret )
1386
1426
return ;
1387
1427
0 commit comments