@@ -1068,6 +1068,26 @@ static void intel_sanitize_options(struct drm_i915_private *dev_priv)
1068
1068
intel_gvt_sanitize_options (dev_priv );
1069
1069
}
1070
1070
1071
+ #define DRAM_TYPE_STR (type ) [INTEL_DRAM_ ## type] = #type
1072
+
1073
+ static const char * intel_dram_type_str (enum intel_dram_type type )
1074
+ {
1075
+ static const char * const str [] = {
1076
+ DRAM_TYPE_STR (UNKNOWN ),
1077
+ DRAM_TYPE_STR (DDR3 ),
1078
+ DRAM_TYPE_STR (DDR4 ),
1079
+ DRAM_TYPE_STR (LPDDR3 ),
1080
+ DRAM_TYPE_STR (LPDDR4 ),
1081
+ };
1082
+
1083
+ if (type >= ARRAY_SIZE (str ))
1084
+ type = INTEL_DRAM_UNKNOWN ;
1085
+
1086
+ return str [type ];
1087
+ }
1088
+
1089
+ #undef DRAM_TYPE_STR
1090
+
1071
1091
static int intel_dimm_num_devices (const struct dram_dimm_info * dimm )
1072
1092
{
1073
1093
return dimm -> ranks * 64 / (dimm -> width ?: 1 );
@@ -1254,13 +1274,38 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1254
1274
return 0 ;
1255
1275
}
1256
1276
1277
+ static enum intel_dram_type
1278
+ skl_get_dram_type (struct drm_i915_private * dev_priv )
1279
+ {
1280
+ u32 val ;
1281
+
1282
+ val = I915_READ (SKL_MAD_INTER_CHANNEL_0_0_0_MCHBAR_MCMAIN );
1283
+
1284
+ switch (val & SKL_DRAM_DDR_TYPE_MASK ) {
1285
+ case SKL_DRAM_DDR_TYPE_DDR3 :
1286
+ return INTEL_DRAM_DDR3 ;
1287
+ case SKL_DRAM_DDR_TYPE_DDR4 :
1288
+ return INTEL_DRAM_DDR4 ;
1289
+ case SKL_DRAM_DDR_TYPE_LPDDR3 :
1290
+ return INTEL_DRAM_LPDDR3 ;
1291
+ case SKL_DRAM_DDR_TYPE_LPDDR4 :
1292
+ return INTEL_DRAM_LPDDR4 ;
1293
+ default :
1294
+ MISSING_CASE (val );
1295
+ return INTEL_DRAM_UNKNOWN ;
1296
+ }
1297
+ }
1298
+
1257
1299
static int
1258
1300
skl_get_dram_info (struct drm_i915_private * dev_priv )
1259
1301
{
1260
1302
struct dram_info * dram_info = & dev_priv -> dram_info ;
1261
1303
u32 mem_freq_khz , val ;
1262
1304
int ret ;
1263
1305
1306
+ dram_info -> type = skl_get_dram_type (dev_priv );
1307
+ DRM_DEBUG_KMS ("DRAM type: %s\n" , intel_dram_type_str (dram_info -> type ));
1308
+
1264
1309
ret = skl_dram_get_channels_info (dev_priv );
1265
1310
if (ret )
1266
1311
return ret ;
@@ -1327,6 +1372,26 @@ static int bxt_get_dimm_ranks(u32 val)
1327
1372
}
1328
1373
}
1329
1374
1375
+ static enum intel_dram_type bxt_get_dimm_type (u32 val )
1376
+ {
1377
+ if (!bxt_get_dimm_size (val ))
1378
+ return INTEL_DRAM_UNKNOWN ;
1379
+
1380
+ switch (val & BXT_DRAM_TYPE_MASK ) {
1381
+ case BXT_DRAM_TYPE_DDR3 :
1382
+ return INTEL_DRAM_DDR3 ;
1383
+ case BXT_DRAM_TYPE_LPDDR3 :
1384
+ return INTEL_DRAM_LPDDR3 ;
1385
+ case BXT_DRAM_TYPE_DDR4 :
1386
+ return INTEL_DRAM_DDR4 ;
1387
+ case BXT_DRAM_TYPE_LPDDR4 :
1388
+ return INTEL_DRAM_LPDDR4 ;
1389
+ default :
1390
+ MISSING_CASE (val );
1391
+ return INTEL_DRAM_UNKNOWN ;
1392
+ }
1393
+ }
1394
+
1330
1395
static void bxt_get_dimm_info (struct dram_dimm_info * dimm ,
1331
1396
u32 val )
1332
1397
{
@@ -1369,6 +1434,7 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
1369
1434
*/
1370
1435
for (i = BXT_D_CR_DRP0_DUNIT_START ; i <= BXT_D_CR_DRP0_DUNIT_END ; i ++ ) {
1371
1436
struct dram_dimm_info dimm ;
1437
+ enum intel_dram_type type ;
1372
1438
1373
1439
val = I915_READ (BXT_D_CR_DRP0_DUNIT (i ));
1374
1440
if (val == 0xFFFFFFFF )
@@ -1377,10 +1443,16 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
1377
1443
dram_info -> num_channels ++ ;
1378
1444
1379
1445
bxt_get_dimm_info (& dimm , val );
1446
+ type = bxt_get_dimm_type (val );
1447
+
1448
+ WARN_ON (type != INTEL_DRAM_UNKNOWN &&
1449
+ dram_info -> type != INTEL_DRAM_UNKNOWN &&
1450
+ dram_info -> type != type );
1380
1451
1381
- DRM_DEBUG_KMS ("CH%u DIMM size: %u GB, width: X%u, ranks: %u\n" ,
1452
+ DRM_DEBUG_KMS ("CH%u DIMM size: %u GB, width: X%u, ranks: %u, type: %s \n" ,
1382
1453
i - BXT_D_CR_DRP0_DUNIT_START ,
1383
- dimm .size , dimm .width , dimm .ranks );
1454
+ dimm .size , dimm .width , dimm .ranks ,
1455
+ intel_dram_type_str (type ));
1384
1456
1385
1457
/*
1386
1458
* If any of the channel is single rank channel,
@@ -1391,10 +1463,14 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
1391
1463
dram_info -> ranks = dimm .ranks ;
1392
1464
else if (dimm .ranks == 1 )
1393
1465
dram_info -> ranks = 1 ;
1466
+
1467
+ if (type != INTEL_DRAM_UNKNOWN )
1468
+ dram_info -> type = type ;
1394
1469
}
1395
1470
1396
- if (dram_info -> ranks == 0 ) {
1397
- DRM_INFO ("couldn't get memory rank information\n" );
1471
+ if (dram_info -> type == INTEL_DRAM_UNKNOWN ||
1472
+ dram_info -> ranks == 0 ) {
1473
+ DRM_INFO ("couldn't get memory information\n" );
1398
1474
return - EINVAL ;
1399
1475
}
1400
1476
0 commit comments