@@ -65,15 +65,12 @@ static const u32 ibridge_dram_rule[] = {
65
65
0xd8 , 0xe0 , 0xe8 , 0xf0 , 0xf8 ,
66
66
};
67
67
68
- #define SAD_LIMIT (reg ) ((GET_BITFIELD(reg, 6, 25) << 26) | 0x3ffffff)
69
- #define DRAM_ATTR (reg ) GET_BITFIELD(reg, 2, 3)
70
- #define INTERLEAVE_MODE (reg ) GET_BITFIELD(reg, 1, 1)
71
68
#define DRAM_RULE_ENABLE (reg ) GET_BITFIELD(reg, 0, 0)
72
69
#define A7MODE (reg ) GET_BITFIELD(reg, 26, 26)
73
70
74
- static char * get_dram_attr (u32 reg )
71
+ static char * show_dram_attr (u32 attr )
75
72
{
76
- switch ( DRAM_ATTR ( reg ) ) {
73
+ switch ( attr ) {
77
74
case 0 :
78
75
return "DRAM" ;
79
76
case 1 :
@@ -273,6 +270,10 @@ struct sbridge_info {
273
270
u64 (* get_tolm )(struct sbridge_pvt * pvt );
274
271
u64 (* get_tohm )(struct sbridge_pvt * pvt );
275
272
u64 (* rir_limit )(u32 reg );
273
+ u64 (* sad_limit )(u32 reg );
274
+ u32 (* interleave_mode )(u32 reg );
275
+ char * (* show_interleave_mode )(u32 reg );
276
+ u32 (* dram_attr )(u32 reg );
276
277
const u32 * dram_rule ;
277
278
const u32 * interleave_list ;
278
279
const struct interleave_pkg * interleave_pkg ;
@@ -718,6 +719,26 @@ static u64 rir_limit(u32 reg)
718
719
return ((u64 )GET_BITFIELD (reg , 1 , 10 ) << 29 ) | 0x1fffffff ;
719
720
}
720
721
722
+ static u64 sad_limit (u32 reg )
723
+ {
724
+ return (GET_BITFIELD (reg , 6 , 25 ) << 26 ) | 0x3ffffff ;
725
+ }
726
+
727
+ static u32 interleave_mode (u32 reg )
728
+ {
729
+ return GET_BITFIELD (reg , 1 , 1 );
730
+ }
731
+
732
+ char * show_interleave_mode (u32 reg )
733
+ {
734
+ return interleave_mode (reg ) ? "8:6" : "[8:6]XOR[18:16]" ;
735
+ }
736
+
737
+ static u32 dram_attr (u32 reg )
738
+ {
739
+ return GET_BITFIELD (reg , 2 , 3 );
740
+ }
741
+
721
742
static enum mem_type get_memory_type (struct sbridge_pvt * pvt )
722
743
{
723
744
u32 reg ;
@@ -1069,7 +1090,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
1069
1090
/* SAD_LIMIT Address range is 45:26 */
1070
1091
pci_read_config_dword (pvt -> pci_sad0 , pvt -> info .dram_rule [n_sads ],
1071
1092
& reg );
1072
- limit = SAD_LIMIT (reg );
1093
+ limit = pvt -> info . sad_limit (reg );
1073
1094
1074
1095
if (!DRAM_RULE_ENABLE (reg ))
1075
1096
continue ;
@@ -1081,10 +1102,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
1081
1102
gb = div_u64_rem (tmp_mb , 1024 , & mb );
1082
1103
edac_dbg (0 , "SAD#%d %s up to %u.%03u GB (0x%016Lx) Interleave: %s reg=0x%08x\n" ,
1083
1104
n_sads ,
1084
- get_dram_attr ( reg ),
1105
+ show_dram_attr ( pvt -> info . dram_attr ( reg ) ),
1085
1106
gb , (mb * 1000 )/1024 ,
1086
1107
((u64 )tmp_mb ) << 20L ,
1087
- INTERLEAVE_MODE (reg ) ? "8:6" : "[8:6]XOR[18:16]" ,
1108
+ pvt -> info . show_interleave_mode (reg ),
1088
1109
reg );
1089
1110
prv = limit ;
1090
1111
@@ -1248,7 +1269,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
1248
1269
if (!DRAM_RULE_ENABLE (reg ))
1249
1270
continue ;
1250
1271
1251
- limit = SAD_LIMIT (reg );
1272
+ limit = pvt -> info . sad_limit (reg );
1252
1273
if (limit <= prv ) {
1253
1274
sprintf (msg , "Can't discover the memory socket" );
1254
1275
return - EINVAL ;
@@ -1262,8 +1283,8 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
1262
1283
return - EINVAL ;
1263
1284
}
1264
1285
dram_rule = reg ;
1265
- * area_type = get_dram_attr ( dram_rule );
1266
- interleave_mode = INTERLEAVE_MODE (dram_rule );
1286
+ * area_type = show_dram_attr ( pvt -> info . dram_attr ( dram_rule ) );
1287
+ interleave_mode = pvt -> info . interleave_mode (dram_rule );
1267
1288
1268
1289
pci_read_config_dword (pvt -> pci_sad0 , pvt -> info .interleave_list [n_sads ],
1269
1290
& reg );
@@ -2401,6 +2422,10 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
2401
2422
pvt -> info .get_memory_type = get_memory_type ;
2402
2423
pvt -> info .get_node_id = get_node_id ;
2403
2424
pvt -> info .rir_limit = rir_limit ;
2425
+ pvt -> info .sad_limit = sad_limit ;
2426
+ pvt -> info .interleave_mode = interleave_mode ;
2427
+ pvt -> info .show_interleave_mode = show_interleave_mode ;
2428
+ pvt -> info .dram_attr = dram_attr ;
2404
2429
pvt -> info .max_sad = ARRAY_SIZE (ibridge_dram_rule );
2405
2430
pvt -> info .interleave_list = ibridge_interleave_list ;
2406
2431
pvt -> info .max_interleave = ARRAY_SIZE (ibridge_interleave_list );
@@ -2421,6 +2446,10 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
2421
2446
pvt -> info .get_memory_type = get_memory_type ;
2422
2447
pvt -> info .get_node_id = get_node_id ;
2423
2448
pvt -> info .rir_limit = rir_limit ;
2449
+ pvt -> info .sad_limit = sad_limit ;
2450
+ pvt -> info .interleave_mode = interleave_mode ;
2451
+ pvt -> info .show_interleave_mode = show_interleave_mode ;
2452
+ pvt -> info .dram_attr = dram_attr ;
2424
2453
pvt -> info .max_sad = ARRAY_SIZE (sbridge_dram_rule );
2425
2454
pvt -> info .interleave_list = sbridge_interleave_list ;
2426
2455
pvt -> info .max_interleave = ARRAY_SIZE (sbridge_interleave_list );
@@ -2441,6 +2470,10 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
2441
2470
pvt -> info .get_memory_type = haswell_get_memory_type ;
2442
2471
pvt -> info .get_node_id = haswell_get_node_id ;
2443
2472
pvt -> info .rir_limit = haswell_rir_limit ;
2473
+ pvt -> info .sad_limit = sad_limit ;
2474
+ pvt -> info .interleave_mode = interleave_mode ;
2475
+ pvt -> info .show_interleave_mode = show_interleave_mode ;
2476
+ pvt -> info .dram_attr = dram_attr ;
2444
2477
pvt -> info .max_sad = ARRAY_SIZE (ibridge_dram_rule );
2445
2478
pvt -> info .interleave_list = ibridge_interleave_list ;
2446
2479
pvt -> info .max_interleave = ARRAY_SIZE (ibridge_interleave_list );
@@ -2461,6 +2494,10 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
2461
2494
pvt -> info .get_memory_type = haswell_get_memory_type ;
2462
2495
pvt -> info .get_node_id = haswell_get_node_id ;
2463
2496
pvt -> info .rir_limit = haswell_rir_limit ;
2497
+ pvt -> info .sad_limit = sad_limit ;
2498
+ pvt -> info .interleave_mode = interleave_mode ;
2499
+ pvt -> info .show_interleave_mode = show_interleave_mode ;
2500
+ pvt -> info .dram_attr = dram_attr ;
2464
2501
pvt -> info .max_sad = ARRAY_SIZE (ibridge_dram_rule );
2465
2502
pvt -> info .interleave_list = ibridge_interleave_list ;
2466
2503
pvt -> info .max_interleave = ARRAY_SIZE (ibridge_interleave_list );
0 commit comments