21
21
#define TRP_SYN_REG_CNT 6
22
22
#define DRP_SYN_REG_CNT 8
23
23
24
- #define LLCC_COMMON_STATUS0 0x0003000c
25
24
#define LLCC_LB_CNT_MASK GENMASK(31, 28)
26
25
#define LLCC_LB_CNT_SHIFT 28
27
26
28
- /* Single & double bit syndrome register offsets */
29
- #define TRP_ECC_SB_ERR_SYN0 0x0002304c
30
- #define TRP_ECC_DB_ERR_SYN0 0x00020370
31
- #define DRP_ECC_SB_ERR_SYN0 0x0004204c
32
- #define DRP_ECC_DB_ERR_SYN0 0x00042070
33
-
34
- /* Error register offsets */
35
- #define TRP_ECC_ERROR_STATUS1 0x00020348
36
- #define TRP_ECC_ERROR_STATUS0 0x00020344
37
- #define DRP_ECC_ERROR_STATUS1 0x00042048
38
- #define DRP_ECC_ERROR_STATUS0 0x00042044
39
-
40
- /* TRP, DRP interrupt register offsets */
41
- #define DRP_INTERRUPT_STATUS 0x00041000
42
- #define TRP_INTERRUPT_0_STATUS 0x00020480
43
- #define DRP_INTERRUPT_CLEAR 0x00041008
44
- #define DRP_ECC_ERROR_CNTR_CLEAR 0x00040004
45
- #define TRP_INTERRUPT_0_CLEAR 0x00020484
46
- #define TRP_ECC_ERROR_CNTR_CLEAR 0x00020440
47
-
48
27
/* Mask and shift macros */
49
28
#define ECC_DB_ERR_COUNT_MASK GENMASK(4, 0)
50
29
#define ECC_DB_ERR_WAYS_MASK GENMASK(31, 16)
60
39
#define DRP_TRP_INT_CLEAR GENMASK(1, 0)
61
40
#define DRP_TRP_CNT_CLEAR GENMASK(1, 0)
62
41
63
- /* Config registers offsets*/
64
- #define DRP_ECC_ERROR_CFG 0x00040000
65
-
66
- /* Tag RAM, Data RAM interrupt register offsets */
67
- #define CMN_INTERRUPT_0_ENABLE 0x0003001c
68
- #define CMN_INTERRUPT_2_ENABLE 0x0003003c
69
- #define TRP_INTERRUPT_0_ENABLE 0x00020488
70
- #define DRP_INTERRUPT_ENABLE 0x0004100c
71
-
72
42
#define SB_ERROR_THRESHOLD 0x1
73
43
#define SB_ERROR_THRESHOLD_SHIFT 24
74
44
#define SB_DB_TRP_INTERRUPT_ENABLE 0x3
@@ -88,47 +58,35 @@ enum {
88
58
static const struct llcc_edac_reg_data edac_reg_data [] = {
89
59
[LLCC_DRAM_CE ] = {
90
60
.name = "DRAM Single-bit" ,
91
- .synd_reg = DRP_ECC_SB_ERR_SYN0 ,
92
- .count_status_reg = DRP_ECC_ERROR_STATUS1 ,
93
- .ways_status_reg = DRP_ECC_ERROR_STATUS0 ,
94
61
.reg_cnt = DRP_SYN_REG_CNT ,
95
62
.count_mask = ECC_SB_ERR_COUNT_MASK ,
96
63
.ways_mask = ECC_SB_ERR_WAYS_MASK ,
97
64
.count_shift = ECC_SB_ERR_COUNT_SHIFT ,
98
65
},
99
66
[LLCC_DRAM_UE ] = {
100
67
.name = "DRAM Double-bit" ,
101
- .synd_reg = DRP_ECC_DB_ERR_SYN0 ,
102
- .count_status_reg = DRP_ECC_ERROR_STATUS1 ,
103
- .ways_status_reg = DRP_ECC_ERROR_STATUS0 ,
104
68
.reg_cnt = DRP_SYN_REG_CNT ,
105
69
.count_mask = ECC_DB_ERR_COUNT_MASK ,
106
70
.ways_mask = ECC_DB_ERR_WAYS_MASK ,
107
71
.ways_shift = ECC_DB_ERR_WAYS_SHIFT ,
108
72
},
109
73
[LLCC_TRAM_CE ] = {
110
74
.name = "TRAM Single-bit" ,
111
- .synd_reg = TRP_ECC_SB_ERR_SYN0 ,
112
- .count_status_reg = TRP_ECC_ERROR_STATUS1 ,
113
- .ways_status_reg = TRP_ECC_ERROR_STATUS0 ,
114
75
.reg_cnt = TRP_SYN_REG_CNT ,
115
76
.count_mask = ECC_SB_ERR_COUNT_MASK ,
116
77
.ways_mask = ECC_SB_ERR_WAYS_MASK ,
117
78
.count_shift = ECC_SB_ERR_COUNT_SHIFT ,
118
79
},
119
80
[LLCC_TRAM_UE ] = {
120
81
.name = "TRAM Double-bit" ,
121
- .synd_reg = TRP_ECC_DB_ERR_SYN0 ,
122
- .count_status_reg = TRP_ECC_ERROR_STATUS1 ,
123
- .ways_status_reg = TRP_ECC_ERROR_STATUS0 ,
124
82
.reg_cnt = TRP_SYN_REG_CNT ,
125
83
.count_mask = ECC_DB_ERR_COUNT_MASK ,
126
84
.ways_mask = ECC_DB_ERR_WAYS_MASK ,
127
85
.ways_shift = ECC_DB_ERR_WAYS_SHIFT ,
128
86
},
129
87
};
130
88
131
- static int qcom_llcc_core_setup (struct regmap * llcc_bcast_regmap )
89
+ static int qcom_llcc_core_setup (struct llcc_drv_data * drv , struct regmap * llcc_bcast_regmap )
132
90
{
133
91
u32 sb_err_threshold ;
134
92
int ret ;
@@ -137,31 +95,31 @@ static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap)
137
95
* Configure interrupt enable registers such that Tag, Data RAM related
138
96
* interrupts are propagated to interrupt controller for servicing
139
97
*/
140
- ret = regmap_update_bits (llcc_bcast_regmap , CMN_INTERRUPT_2_ENABLE ,
98
+ ret = regmap_update_bits (llcc_bcast_regmap , drv -> edac_reg_offset -> cmn_interrupt_2_enable ,
141
99
TRP0_INTERRUPT_ENABLE ,
142
100
TRP0_INTERRUPT_ENABLE );
143
101
if (ret )
144
102
return ret ;
145
103
146
- ret = regmap_update_bits (llcc_bcast_regmap , TRP_INTERRUPT_0_ENABLE ,
104
+ ret = regmap_update_bits (llcc_bcast_regmap , drv -> edac_reg_offset -> trp_interrupt_0_enable ,
147
105
SB_DB_TRP_INTERRUPT_ENABLE ,
148
106
SB_DB_TRP_INTERRUPT_ENABLE );
149
107
if (ret )
150
108
return ret ;
151
109
152
110
sb_err_threshold = (SB_ERROR_THRESHOLD << SB_ERROR_THRESHOLD_SHIFT );
153
- ret = regmap_write (llcc_bcast_regmap , DRP_ECC_ERROR_CFG ,
111
+ ret = regmap_write (llcc_bcast_regmap , drv -> edac_reg_offset -> drp_ecc_error_cfg ,
154
112
sb_err_threshold );
155
113
if (ret )
156
114
return ret ;
157
115
158
- ret = regmap_update_bits (llcc_bcast_regmap , CMN_INTERRUPT_2_ENABLE ,
116
+ ret = regmap_update_bits (llcc_bcast_regmap , drv -> edac_reg_offset -> cmn_interrupt_2_enable ,
159
117
DRP0_INTERRUPT_ENABLE ,
160
118
DRP0_INTERRUPT_ENABLE );
161
119
if (ret )
162
120
return ret ;
163
121
164
- ret = regmap_write (llcc_bcast_regmap , DRP_INTERRUPT_ENABLE ,
122
+ ret = regmap_write (llcc_bcast_regmap , drv -> edac_reg_offset -> drp_interrupt_enable ,
165
123
SB_DB_DRP_INTERRUPT_ENABLE );
166
124
return ret ;
167
125
}
@@ -170,29 +128,33 @@ static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap)
170
128
static int
171
129
qcom_llcc_clear_error_status (int err_type , struct llcc_drv_data * drv )
172
130
{
173
- int ret = 0 ;
131
+ int ret ;
174
132
175
133
switch (err_type ) {
176
134
case LLCC_DRAM_CE :
177
135
case LLCC_DRAM_UE :
178
- ret = regmap_write (drv -> bcast_regmap , DRP_INTERRUPT_CLEAR ,
136
+ ret = regmap_write (drv -> bcast_regmap ,
137
+ drv -> edac_reg_offset -> drp_interrupt_clear ,
179
138
DRP_TRP_INT_CLEAR );
180
139
if (ret )
181
140
return ret ;
182
141
183
- ret = regmap_write (drv -> bcast_regmap , DRP_ECC_ERROR_CNTR_CLEAR ,
142
+ ret = regmap_write (drv -> bcast_regmap ,
143
+ drv -> edac_reg_offset -> drp_ecc_error_cntr_clear ,
184
144
DRP_TRP_CNT_CLEAR );
185
145
if (ret )
186
146
return ret ;
187
147
break ;
188
148
case LLCC_TRAM_CE :
189
149
case LLCC_TRAM_UE :
190
- ret = regmap_write (drv -> bcast_regmap , TRP_INTERRUPT_0_CLEAR ,
150
+ ret = regmap_write (drv -> bcast_regmap ,
151
+ drv -> edac_reg_offset -> trp_interrupt_0_clear ,
191
152
DRP_TRP_INT_CLEAR );
192
153
if (ret )
193
154
return ret ;
194
155
195
- ret = regmap_write (drv -> bcast_regmap , TRP_ECC_ERROR_CNTR_CLEAR ,
156
+ ret = regmap_write (drv -> bcast_regmap ,
157
+ drv -> edac_reg_offset -> trp_ecc_error_cntr_clear ,
196
158
DRP_TRP_CNT_CLEAR );
197
159
if (ret )
198
160
return ret ;
@@ -205,16 +167,54 @@ qcom_llcc_clear_error_status(int err_type, struct llcc_drv_data *drv)
205
167
return ret ;
206
168
}
207
169
170
+ struct qcom_llcc_syn_regs {
171
+ u32 synd_reg ;
172
+ u32 count_status_reg ;
173
+ u32 ways_status_reg ;
174
+ };
175
+
176
+ static void get_reg_offsets (struct llcc_drv_data * drv , int err_type ,
177
+ struct qcom_llcc_syn_regs * syn_regs )
178
+ {
179
+ const struct llcc_edac_reg_offset * edac_reg_offset = drv -> edac_reg_offset ;
180
+
181
+ switch (err_type ) {
182
+ case LLCC_DRAM_CE :
183
+ syn_regs -> synd_reg = edac_reg_offset -> drp_ecc_sb_err_syn0 ;
184
+ syn_regs -> count_status_reg = edac_reg_offset -> drp_ecc_error_status1 ;
185
+ syn_regs -> ways_status_reg = edac_reg_offset -> drp_ecc_error_status0 ;
186
+ break ;
187
+ case LLCC_DRAM_UE :
188
+ syn_regs -> synd_reg = edac_reg_offset -> drp_ecc_db_err_syn0 ;
189
+ syn_regs -> count_status_reg = edac_reg_offset -> drp_ecc_error_status1 ;
190
+ syn_regs -> ways_status_reg = edac_reg_offset -> drp_ecc_error_status0 ;
191
+ break ;
192
+ case LLCC_TRAM_CE :
193
+ syn_regs -> synd_reg = edac_reg_offset -> trp_ecc_sb_err_syn0 ;
194
+ syn_regs -> count_status_reg = edac_reg_offset -> trp_ecc_error_status1 ;
195
+ syn_regs -> ways_status_reg = edac_reg_offset -> trp_ecc_error_status0 ;
196
+ break ;
197
+ case LLCC_TRAM_UE :
198
+ syn_regs -> synd_reg = edac_reg_offset -> trp_ecc_db_err_syn0 ;
199
+ syn_regs -> count_status_reg = edac_reg_offset -> trp_ecc_error_status1 ;
200
+ syn_regs -> ways_status_reg = edac_reg_offset -> trp_ecc_error_status0 ;
201
+ break ;
202
+ }
203
+ }
204
+
208
205
/* Dump Syndrome registers data for Tag RAM, Data RAM bit errors*/
209
206
static int
210
207
dump_syn_reg_values (struct llcc_drv_data * drv , u32 bank , int err_type )
211
208
{
212
209
struct llcc_edac_reg_data reg_data = edac_reg_data [err_type ];
210
+ struct qcom_llcc_syn_regs regs = { };
213
211
int err_cnt , err_ways , ret , i ;
214
212
u32 synd_reg , synd_val ;
215
213
214
+ get_reg_offsets (drv , err_type , & regs );
215
+
216
216
for (i = 0 ; i < reg_data .reg_cnt ; i ++ ) {
217
- synd_reg = reg_data .synd_reg + (i * 4 );
217
+ synd_reg = regs .synd_reg + (i * 4 );
218
218
ret = regmap_read (drv -> regmaps [bank ], synd_reg ,
219
219
& synd_val );
220
220
if (ret )
@@ -224,7 +224,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
224
224
reg_data .name , i , synd_val );
225
225
}
226
226
227
- ret = regmap_read (drv -> regmaps [bank ], reg_data .count_status_reg ,
227
+ ret = regmap_read (drv -> regmaps [bank ], regs .count_status_reg ,
228
228
& err_cnt );
229
229
if (ret )
230
230
goto clear ;
@@ -234,7 +234,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
234
234
edac_printk (KERN_CRIT , EDAC_LLCC , "%s: Error count: 0x%4x\n" ,
235
235
reg_data .name , err_cnt );
236
236
237
- ret = regmap_read (drv -> regmaps [bank ], reg_data .ways_status_reg ,
237
+ ret = regmap_read (drv -> regmaps [bank ], regs .ways_status_reg ,
238
238
& err_ways );
239
239
if (ret )
240
240
goto clear ;
@@ -295,7 +295,7 @@ static irqreturn_t llcc_ecc_irq_handler(int irq, void *edev_ctl)
295
295
296
296
/* Iterate over the banks and look for Tag RAM or Data RAM errors */
297
297
for (i = 0 ; i < drv -> num_banks ; i ++ ) {
298
- ret = regmap_read (drv -> regmaps [i ], DRP_INTERRUPT_STATUS ,
298
+ ret = regmap_read (drv -> regmaps [i ], drv -> edac_reg_offset -> drp_interrupt_status ,
299
299
& drp_error );
300
300
301
301
if (!ret && (drp_error & SB_ECC_ERROR )) {
@@ -310,7 +310,7 @@ static irqreturn_t llcc_ecc_irq_handler(int irq, void *edev_ctl)
310
310
if (!ret )
311
311
irq_rc = IRQ_HANDLED ;
312
312
313
- ret = regmap_read (drv -> regmaps [i ], TRP_INTERRUPT_0_STATUS ,
313
+ ret = regmap_read (drv -> regmaps [i ], drv -> edac_reg_offset -> trp_interrupt_0_status ,
314
314
& trp_error );
315
315
316
316
if (!ret && (trp_error & SB_ECC_ERROR )) {
@@ -342,7 +342,7 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
342
342
int ecc_irq ;
343
343
int rc ;
344
344
345
- rc = qcom_llcc_core_setup (llcc_driv_data -> bcast_regmap );
345
+ rc = qcom_llcc_core_setup (llcc_driv_data , llcc_driv_data -> bcast_regmap );
346
346
if (rc )
347
347
return rc ;
348
348
0 commit comments