summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
diff options
context:
space:
mode:
authorDavid Nieto <dmartineznie@nvidia.com>2017-05-18 19:45:40 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-05-24 07:55:59 -0400
commitc771d0b979cd9f42a21da520d5010873d2a6aa47 (patch)
treeff03cd455a5d953d5d06c597af94e819e8793a37 /drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
parent2173add7ae7210606afdaa56995a61d012b9a2f1 (diff)
gpu: nvgpu: add GPC parity counters
(1) Re-arrange the structure for ecc counters reporting so multiple units can be managed (2) Add counters and handling for additional GPC counters JIRA: GPUT19X-84 Change-Id: I74fd474d7daf7590fc7f7ddc9837bb692512d208 Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1485277 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c94
1 files changed, 73 insertions, 21 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c b/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
index 39ae68eb..1cfa2ef2 100644
--- a/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
+++ b/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
@@ -134,6 +134,11 @@ static struct device_attribute *dev_attr_sm_icache_ecc_uncorrected_err_count_arr
134static struct device_attribute *dev_attr_gcc_l15_ecc_corrected_err_count_array; 134static struct device_attribute *dev_attr_gcc_l15_ecc_corrected_err_count_array;
135static struct device_attribute *dev_attr_gcc_l15_ecc_uncorrected_err_count_array; 135static struct device_attribute *dev_attr_gcc_l15_ecc_uncorrected_err_count_array;
136 136
137static struct device_attribute *dev_attr_fecs_ecc_corrected_err_count_array;
138static struct device_attribute *dev_attr_fecs_ecc_uncorrected_err_count_array;
139static struct device_attribute *dev_attr_gpccs_ecc_corrected_err_count_array;
140static struct device_attribute *dev_attr_gpccs_ecc_uncorrected_err_count_array;
141
137void gr_gv11b_create_sysfs(struct device *dev) 142void gr_gv11b_create_sysfs(struct device *dev)
138{ 143{
139 struct gk20a *g = get_gk20a(dev); 144 struct gk20a *g = get_gk20a(dev);
@@ -142,7 +147,7 @@ void gr_gv11b_create_sysfs(struct device *dev)
142 initialized multiple times but we only need to create the ECC 147 initialized multiple times but we only need to create the ECC
143 stats once. Therefore, add the following check to avoid 148 stats once. Therefore, add the following check to avoid
144 creating duplicate stat sysfs nodes. */ 149 creating duplicate stat sysfs nodes. */
145 if (g->gr.t19x.ecc_stats.sm_l1_tag_corrected_err_count.counters != NULL) 150 if (g->ecc.gr.t19x.sm_l1_tag_corrected_err_count.counters != NULL)
146 return; 151 return;
147 152
148 gr_gp10b_create_sysfs(dev); 153 gr_gp10b_create_sysfs(dev);
@@ -150,63 +155,91 @@ void gr_gv11b_create_sysfs(struct device *dev)
150 error |= gr_gp10b_ecc_stat_create(dev, 155 error |= gr_gp10b_ecc_stat_create(dev,
151 0, 156 0,
152 "sm_l1_tag_ecc_corrected_err_count", 157 "sm_l1_tag_ecc_corrected_err_count",
153 &g->gr.t19x.ecc_stats.sm_l1_tag_corrected_err_count, 158 &g->ecc.gr.t19x.sm_l1_tag_corrected_err_count,
154 dev_attr_sm_l1_tag_ecc_corrected_err_count_array); 159 dev_attr_sm_l1_tag_ecc_corrected_err_count_array);
155 160
156 error |= gr_gp10b_ecc_stat_create(dev, 161 error |= gr_gp10b_ecc_stat_create(dev,
157 0, 162 0,
158 "sm_l1_tag_ecc_uncorrected_err_count", 163 "sm_l1_tag_ecc_uncorrected_err_count",
159 &g->gr.t19x.ecc_stats.sm_l1_tag_uncorrected_err_count, 164 &g->ecc.gr.t19x.sm_l1_tag_uncorrected_err_count,
160 dev_attr_sm_l1_tag_ecc_uncorrected_err_count_array); 165 dev_attr_sm_l1_tag_ecc_uncorrected_err_count_array);
161 166
162 error |= gr_gp10b_ecc_stat_create(dev, 167 error |= gr_gp10b_ecc_stat_create(dev,
163 0, 168 0,
164 "sm_cbu_ecc_corrected_err_count", 169 "sm_cbu_ecc_corrected_err_count",
165 &g->gr.t19x.ecc_stats.sm_cbu_corrected_err_count, 170 &g->ecc.gr.t19x.sm_cbu_corrected_err_count,
166 dev_attr_sm_cbu_ecc_corrected_err_count_array); 171 dev_attr_sm_cbu_ecc_corrected_err_count_array);
167 172
168 error |= gr_gp10b_ecc_stat_create(dev, 173 error |= gr_gp10b_ecc_stat_create(dev,
169 0, 174 0,
170 "sm_cbu_ecc_uncorrected_err_count", 175 "sm_cbu_ecc_uncorrected_err_count",
171 &g->gr.t19x.ecc_stats.sm_cbu_uncorrected_err_count, 176 &g->ecc.gr.t19x.sm_cbu_uncorrected_err_count,
172 dev_attr_sm_cbu_ecc_uncorrected_err_count_array); 177 dev_attr_sm_cbu_ecc_uncorrected_err_count_array);
173 178
174 error |= gr_gp10b_ecc_stat_create(dev, 179 error |= gr_gp10b_ecc_stat_create(dev,
175 0, 180 0,
176 "sm_l1_data_ecc_corrected_err_count", 181 "sm_l1_data_ecc_corrected_err_count",
177 &g->gr.t19x.ecc_stats.sm_l1_data_corrected_err_count, 182 &g->ecc.gr.t19x.sm_l1_data_corrected_err_count,
178 dev_attr_sm_l1_data_ecc_corrected_err_count_array); 183 dev_attr_sm_l1_data_ecc_corrected_err_count_array);
179 184
180 error |= gr_gp10b_ecc_stat_create(dev, 185 error |= gr_gp10b_ecc_stat_create(dev,
181 0, 186 0,
182 "sm_l1_data_ecc_uncorrected_err_count", 187 "sm_l1_data_ecc_uncorrected_err_count",
183 &g->gr.t19x.ecc_stats.sm_l1_data_uncorrected_err_count, 188 &g->ecc.gr.t19x.sm_l1_data_uncorrected_err_count,
184 dev_attr_sm_l1_data_ecc_uncorrected_err_count_array); 189 dev_attr_sm_l1_data_ecc_uncorrected_err_count_array);
185 190
186 error |= gr_gp10b_ecc_stat_create(dev, 191 error |= gr_gp10b_ecc_stat_create(dev,
187 0, 192 0,
188 "sm_icache_ecc_corrected_err_count", 193 "sm_icache_ecc_corrected_err_count",
189 &g->gr.t19x.ecc_stats.sm_icache_corrected_err_count, 194 &g->ecc.gr.t19x.sm_icache_corrected_err_count,
190 dev_attr_sm_icache_ecc_corrected_err_count_array); 195 dev_attr_sm_icache_ecc_corrected_err_count_array);
191 196
192 error |= gr_gp10b_ecc_stat_create(dev, 197 error |= gr_gp10b_ecc_stat_create(dev,
193 0, 198 0,
194 "sm_icache_ecc_uncorrected_err_count", 199 "sm_icache_ecc_uncorrected_err_count",
195 &g->gr.t19x.ecc_stats.sm_icache_uncorrected_err_count, 200 &g->ecc.gr.t19x.sm_icache_uncorrected_err_count,
196 dev_attr_sm_icache_ecc_uncorrected_err_count_array); 201 dev_attr_sm_icache_ecc_uncorrected_err_count_array);
197 202
198 error |= gr_gp10b_ecc_stat_create(dev, 203 error |= gr_gp10b_ecc_stat_create(dev,
199 0, 204 0,
200 "gcc_l15_ecc_corrected_err_count", 205 "gcc_l15_ecc_corrected_err_count",
201 &g->gr.t19x.ecc_stats.gcc_l15_corrected_err_count, 206 &g->ecc.gr.t19x.gcc_l15_corrected_err_count,
202 dev_attr_gcc_l15_ecc_corrected_err_count_array); 207 dev_attr_gcc_l15_ecc_corrected_err_count_array);
203 208
204 error |= gr_gp10b_ecc_stat_create(dev, 209 error |= gr_gp10b_ecc_stat_create(dev,
205 0, 210 0,
206 "gcc_l15_ecc_uncorrected_err_count", 211 "gcc_l15_ecc_uncorrected_err_count",
207 &g->gr.t19x.ecc_stats.gcc_l15_uncorrected_err_count, 212 &g->ecc.gr.t19x.gcc_l15_uncorrected_err_count,
208 dev_attr_gcc_l15_ecc_uncorrected_err_count_array); 213 dev_attr_gcc_l15_ecc_uncorrected_err_count_array);
209 214
215 error |= gp10b_ecc_stat_create(dev,
216 1,
217 "gpc",
218 "fecs_ecc_uncorrected_err_count",
219 &g->ecc.gr.t19x.fecs_uncorrected_err_count,
220 dev_attr_fecs_ecc_uncorrected_err_count_array);
221
222 error |= gp10b_ecc_stat_create(dev,
223 1,
224 "gpc",
225 "fecs_ecc_corrected_err_count",
226 &g->ecc.gr.t19x.fecs_corrected_err_count,
227 dev_attr_fecs_ecc_corrected_err_count_array);
228
229 error |= gp10b_ecc_stat_create(dev,
230 g->gr.gpc_count,
231 "gpc",
232 "gpccs_ecc_uncorrected_err_count",
233 &g->ecc.gr.t19x.gpccs_uncorrected_err_count,
234 dev_attr_gpccs_ecc_uncorrected_err_count_array);
235
236 error |= gp10b_ecc_stat_create(dev,
237 g->gr.gpc_count,
238 "gpc",
239 "gpccs_ecc_corrected_err_count",
240 &g->ecc.gr.t19x.gpccs_corrected_err_count,
241 dev_attr_gpccs_ecc_corrected_err_count_array);
242
210 if (error) 243 if (error)
211 dev_err(dev, "Failed to create gv11b sysfs attributes!\n"); 244 dev_err(dev, "Failed to create gv11b sysfs attributes!\n");
212} 245}
@@ -217,52 +250,71 @@ static void gr_gv11b_remove_sysfs(struct device *dev)
217 250
218 gr_gp10b_ecc_stat_remove(dev, 251 gr_gp10b_ecc_stat_remove(dev,
219 0, 252 0,
220 &g->gr.t19x.ecc_stats.sm_l1_tag_corrected_err_count, 253 &g->ecc.gr.t19x.sm_l1_tag_corrected_err_count,
221 dev_attr_sm_l1_tag_ecc_corrected_err_count_array); 254 dev_attr_sm_l1_tag_ecc_corrected_err_count_array);
222 255
223 gr_gp10b_ecc_stat_remove(dev, 256 gr_gp10b_ecc_stat_remove(dev,
224 0, 257 0,
225 &g->gr.t19x.ecc_stats.sm_l1_tag_uncorrected_err_count, 258 &g->ecc.gr.t19x.sm_l1_tag_uncorrected_err_count,
226 dev_attr_sm_l1_tag_ecc_uncorrected_err_count_array); 259 dev_attr_sm_l1_tag_ecc_uncorrected_err_count_array);
227 260
228 gr_gp10b_ecc_stat_remove(dev, 261 gr_gp10b_ecc_stat_remove(dev,
229 0, 262 0,
230 &g->gr.t19x.ecc_stats.sm_cbu_corrected_err_count, 263 &g->ecc.gr.t19x.sm_cbu_corrected_err_count,
231 dev_attr_sm_cbu_ecc_corrected_err_count_array); 264 dev_attr_sm_cbu_ecc_corrected_err_count_array);
232 265
233 gr_gp10b_ecc_stat_remove(dev, 266 gr_gp10b_ecc_stat_remove(dev,
234 0, 267 0,
235 &g->gr.t19x.ecc_stats.sm_cbu_uncorrected_err_count, 268 &g->ecc.gr.t19x.sm_cbu_uncorrected_err_count,
236 dev_attr_sm_cbu_ecc_uncorrected_err_count_array); 269 dev_attr_sm_cbu_ecc_uncorrected_err_count_array);
237 270
238 gr_gp10b_ecc_stat_remove(dev, 271 gr_gp10b_ecc_stat_remove(dev,
239 0, 272 0,
240 &g->gr.t19x.ecc_stats.sm_l1_data_corrected_err_count, 273 &g->ecc.gr.t19x.sm_l1_data_corrected_err_count,
241 dev_attr_sm_l1_data_ecc_corrected_err_count_array); 274 dev_attr_sm_l1_data_ecc_corrected_err_count_array);
242 275
243 gr_gp10b_ecc_stat_remove(dev, 276 gr_gp10b_ecc_stat_remove(dev,
244 0, 277 0,
245 &g->gr.t19x.ecc_stats.sm_l1_data_uncorrected_err_count, 278 &g->ecc.gr.t19x.sm_l1_data_uncorrected_err_count,
246 dev_attr_sm_l1_data_ecc_uncorrected_err_count_array); 279 dev_attr_sm_l1_data_ecc_uncorrected_err_count_array);
247 280
248 gr_gp10b_ecc_stat_remove(dev, 281 gr_gp10b_ecc_stat_remove(dev,
249 0, 282 0,
250 &g->gr.t19x.ecc_stats.sm_icache_corrected_err_count, 283 &g->ecc.gr.t19x.sm_icache_corrected_err_count,
251 dev_attr_sm_icache_ecc_corrected_err_count_array); 284 dev_attr_sm_icache_ecc_corrected_err_count_array);
252 285
253 gr_gp10b_ecc_stat_remove(dev, 286 gr_gp10b_ecc_stat_remove(dev,
254 0, 287 0,
255 &g->gr.t19x.ecc_stats.sm_icache_uncorrected_err_count, 288 &g->ecc.gr.t19x.sm_icache_uncorrected_err_count,
256 dev_attr_sm_icache_ecc_uncorrected_err_count_array); 289 dev_attr_sm_icache_ecc_uncorrected_err_count_array);
257 290
258 gr_gp10b_ecc_stat_remove(dev, 291 gr_gp10b_ecc_stat_remove(dev,
259 0, 292 0,
260 &g->gr.t19x.ecc_stats.gcc_l15_corrected_err_count, 293 &g->ecc.gr.t19x.gcc_l15_corrected_err_count,
261 dev_attr_gcc_l15_ecc_corrected_err_count_array); 294 dev_attr_gcc_l15_ecc_corrected_err_count_array);
262 295
263 gr_gp10b_ecc_stat_remove(dev, 296 gr_gp10b_ecc_stat_remove(dev,
264 0, 297 0,
265 &g->gr.t19x.ecc_stats.gcc_l15_uncorrected_err_count, 298 &g->ecc.gr.t19x.gcc_l15_uncorrected_err_count,
266 dev_attr_gcc_l15_ecc_uncorrected_err_count_array); 299 dev_attr_gcc_l15_ecc_uncorrected_err_count_array);
267 300
301 gp10b_ecc_stat_remove(dev,
302 1,
303 &g->ecc.gr.t19x.fecs_uncorrected_err_count,
304 dev_attr_fecs_ecc_uncorrected_err_count_array);
305
306 gp10b_ecc_stat_remove(dev,
307 1,
308 &g->ecc.gr.t19x.fecs_corrected_err_count,
309 dev_attr_fecs_ecc_corrected_err_count_array);
310
311 gp10b_ecc_stat_remove(dev,
312 g->gr.gpc_count,
313 &g->ecc.gr.t19x.gpccs_uncorrected_err_count,
314 dev_attr_gpccs_ecc_uncorrected_err_count_array);
315
316 gp10b_ecc_stat_remove(dev,
317 g->gr.gpc_count,
318 &g->ecc.gr.t19x.gpccs_corrected_err_count,
319 dev_attr_gpccs_ecc_corrected_err_count_array);
268} 320}