xref: /openbmc/linux/drivers/edac/edac_mc_sysfs.c (revision 25836ce1)
1 /*
2  * edac_mc kernel module
3  * (C) 2005-2007 Linux Networx (http://lnxi.com)
4  *
5  * This file may be distributed under the terms of the
6  * GNU General Public License.
7  *
8  * Written Doug Thompson <norsk5@xmission.com> www.softwarebitmaker.com
9  *
10  * (c) 2012-2013 - Mauro Carvalho Chehab
11  *	The entire API were re-written, and ported to use struct device
12  *
13  */
14 
15 #include <linux/ctype.h>
16 #include <linux/slab.h>
17 #include <linux/edac.h>
18 #include <linux/bug.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/uaccess.h>
21 
22 #include "edac_mc.h"
23 #include "edac_module.h"
24 
25 /* MC EDAC Controls, setable by module parameter, and sysfs */
26 static int edac_mc_log_ue = 1;
27 static int edac_mc_log_ce = 1;
28 static int edac_mc_panic_on_ue;
29 static unsigned int edac_mc_poll_msec = 1000;
30 
31 /* Getter functions for above */
edac_mc_get_log_ue(void)32 int edac_mc_get_log_ue(void)
33 {
34 	return edac_mc_log_ue;
35 }
36 
edac_mc_get_log_ce(void)37 int edac_mc_get_log_ce(void)
38 {
39 	return edac_mc_log_ce;
40 }
41 
edac_mc_get_panic_on_ue(void)42 int edac_mc_get_panic_on_ue(void)
43 {
44 	return edac_mc_panic_on_ue;
45 }
46 
47 /* this is temporary */
edac_mc_get_poll_msec(void)48 unsigned int edac_mc_get_poll_msec(void)
49 {
50 	return edac_mc_poll_msec;
51 }
52 
edac_set_poll_msec(const char * val,const struct kernel_param * kp)53 static int edac_set_poll_msec(const char *val, const struct kernel_param *kp)
54 {
55 	unsigned int i;
56 	int ret;
57 
58 	if (!val)
59 		return -EINVAL;
60 
61 	ret = kstrtouint(val, 0, &i);
62 	if (ret)
63 		return ret;
64 
65 	if (i < 1000)
66 		return -EINVAL;
67 
68 	*((unsigned int *)kp->arg) = i;
69 
70 	/* notify edac_mc engine to reset the poll period */
71 	edac_mc_reset_delay_period(i);
72 
73 	return 0;
74 }
75 
76 /* Parameter declarations for above */
77 module_param(edac_mc_panic_on_ue, int, 0644);
78 MODULE_PARM_DESC(edac_mc_panic_on_ue, "Panic on uncorrected error: 0=off 1=on");
79 module_param(edac_mc_log_ue, int, 0644);
80 MODULE_PARM_DESC(edac_mc_log_ue,
81 		 "Log uncorrectable error to console: 0=off 1=on");
82 module_param(edac_mc_log_ce, int, 0644);
83 MODULE_PARM_DESC(edac_mc_log_ce,
84 		 "Log correctable error to console: 0=off 1=on");
85 module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_uint,
86 		  &edac_mc_poll_msec, 0644);
87 MODULE_PARM_DESC(edac_mc_poll_msec, "Polling period in milliseconds");
88 
89 static struct device *mci_pdev;
90 
91 /*
92  * various constants for Memory Controllers
93  */
94 static const char * const dev_types[] = {
95 	[DEV_UNKNOWN] = "Unknown",
96 	[DEV_X1] = "x1",
97 	[DEV_X2] = "x2",
98 	[DEV_X4] = "x4",
99 	[DEV_X8] = "x8",
100 	[DEV_X16] = "x16",
101 	[DEV_X32] = "x32",
102 	[DEV_X64] = "x64"
103 };
104 
105 static const char * const edac_caps[] = {
106 	[EDAC_UNKNOWN] = "Unknown",
107 	[EDAC_NONE] = "None",
108 	[EDAC_RESERVED] = "Reserved",
109 	[EDAC_PARITY] = "PARITY",
110 	[EDAC_EC] = "EC",
111 	[EDAC_SECDED] = "SECDED",
112 	[EDAC_S2ECD2ED] = "S2ECD2ED",
113 	[EDAC_S4ECD4ED] = "S4ECD4ED",
114 	[EDAC_S8ECD8ED] = "S8ECD8ED",
115 	[EDAC_S16ECD16ED] = "S16ECD16ED"
116 };
117 
118 #ifdef CONFIG_EDAC_LEGACY_SYSFS
119 /*
120  * EDAC sysfs CSROW data structures and methods
121  */
122 
123 #define to_csrow(k) container_of(k, struct csrow_info, dev)
124 
125 /*
126  * We need it to avoid namespace conflicts between the legacy API
127  * and the per-dimm/per-rank one
128  */
129 #define DEVICE_ATTR_LEGACY(_name, _mode, _show, _store) \
130 	static struct device_attribute dev_attr_legacy_##_name = __ATTR(_name, _mode, _show, _store)
131 
132 struct dev_ch_attribute {
133 	struct device_attribute attr;
134 	unsigned int channel;
135 };
136 
137 #define DEVICE_CHANNEL(_name, _mode, _show, _store, _var) \
138 	static struct dev_ch_attribute dev_attr_legacy_##_name = \
139 		{ __ATTR(_name, _mode, _show, _store), (_var) }
140 
141 #define to_channel(k) (container_of(k, struct dev_ch_attribute, attr)->channel)
142 
143 /* Set of more default csrow<id> attribute show/store functions */
csrow_ue_count_show(struct device * dev,struct device_attribute * mattr,char * data)144 static ssize_t csrow_ue_count_show(struct device *dev,
145 				   struct device_attribute *mattr, char *data)
146 {
147 	struct csrow_info *csrow = to_csrow(dev);
148 
149 	return sprintf(data, "%u\n", csrow->ue_count);
150 }
151 
csrow_ce_count_show(struct device * dev,struct device_attribute * mattr,char * data)152 static ssize_t csrow_ce_count_show(struct device *dev,
153 				   struct device_attribute *mattr, char *data)
154 {
155 	struct csrow_info *csrow = to_csrow(dev);
156 
157 	return sprintf(data, "%u\n", csrow->ce_count);
158 }
159 
csrow_size_show(struct device * dev,struct device_attribute * mattr,char * data)160 static ssize_t csrow_size_show(struct device *dev,
161 			       struct device_attribute *mattr, char *data)
162 {
163 	struct csrow_info *csrow = to_csrow(dev);
164 	int i;
165 	u32 nr_pages = 0;
166 
167 	for (i = 0; i < csrow->nr_channels; i++)
168 		nr_pages += csrow->channels[i]->dimm->nr_pages;
169 	return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
170 }
171 
csrow_mem_type_show(struct device * dev,struct device_attribute * mattr,char * data)172 static ssize_t csrow_mem_type_show(struct device *dev,
173 				   struct device_attribute *mattr, char *data)
174 {
175 	struct csrow_info *csrow = to_csrow(dev);
176 
177 	return sprintf(data, "%s\n", edac_mem_types[csrow->channels[0]->dimm->mtype]);
178 }
179 
csrow_dev_type_show(struct device * dev,struct device_attribute * mattr,char * data)180 static ssize_t csrow_dev_type_show(struct device *dev,
181 				   struct device_attribute *mattr, char *data)
182 {
183 	struct csrow_info *csrow = to_csrow(dev);
184 
185 	return sprintf(data, "%s\n", dev_types[csrow->channels[0]->dimm->dtype]);
186 }
187 
csrow_edac_mode_show(struct device * dev,struct device_attribute * mattr,char * data)188 static ssize_t csrow_edac_mode_show(struct device *dev,
189 				    struct device_attribute *mattr,
190 				    char *data)
191 {
192 	struct csrow_info *csrow = to_csrow(dev);
193 
194 	return sprintf(data, "%s\n", edac_caps[csrow->channels[0]->dimm->edac_mode]);
195 }
196 
197 /* show/store functions for DIMM Label attributes */
channel_dimm_label_show(struct device * dev,struct device_attribute * mattr,char * data)198 static ssize_t channel_dimm_label_show(struct device *dev,
199 				       struct device_attribute *mattr,
200 				       char *data)
201 {
202 	struct csrow_info *csrow = to_csrow(dev);
203 	unsigned int chan = to_channel(mattr);
204 	struct rank_info *rank = csrow->channels[chan];
205 
206 	/* if field has not been initialized, there is nothing to send */
207 	if (!rank->dimm->label[0])
208 		return 0;
209 
210 	return snprintf(data, sizeof(rank->dimm->label) + 1, "%s\n",
211 			rank->dimm->label);
212 }
213 
channel_dimm_label_store(struct device * dev,struct device_attribute * mattr,const char * data,size_t count)214 static ssize_t channel_dimm_label_store(struct device *dev,
215 					struct device_attribute *mattr,
216 					const char *data, size_t count)
217 {
218 	struct csrow_info *csrow = to_csrow(dev);
219 	unsigned int chan = to_channel(mattr);
220 	struct rank_info *rank = csrow->channels[chan];
221 	size_t copy_count = count;
222 
223 	if (count == 0)
224 		return -EINVAL;
225 
226 	if (data[count - 1] == '\0' || data[count - 1] == '\n')
227 		copy_count -= 1;
228 
229 	if (copy_count == 0 || copy_count >= sizeof(rank->dimm->label))
230 		return -EINVAL;
231 
232 	strncpy(rank->dimm->label, data, copy_count);
233 	rank->dimm->label[copy_count] = '\0';
234 
235 	return count;
236 }
237 
238 /* show function for dynamic chX_ce_count attribute */
channel_ce_count_show(struct device * dev,struct device_attribute * mattr,char * data)239 static ssize_t channel_ce_count_show(struct device *dev,
240 				     struct device_attribute *mattr, char *data)
241 {
242 	struct csrow_info *csrow = to_csrow(dev);
243 	unsigned int chan = to_channel(mattr);
244 	struct rank_info *rank = csrow->channels[chan];
245 
246 	return sprintf(data, "%u\n", rank->ce_count);
247 }
248 
249 /* cwrow<id>/attribute files */
250 DEVICE_ATTR_LEGACY(size_mb, S_IRUGO, csrow_size_show, NULL);
251 DEVICE_ATTR_LEGACY(dev_type, S_IRUGO, csrow_dev_type_show, NULL);
252 DEVICE_ATTR_LEGACY(mem_type, S_IRUGO, csrow_mem_type_show, NULL);
253 DEVICE_ATTR_LEGACY(edac_mode, S_IRUGO, csrow_edac_mode_show, NULL);
254 DEVICE_ATTR_LEGACY(ue_count, S_IRUGO, csrow_ue_count_show, NULL);
255 DEVICE_ATTR_LEGACY(ce_count, S_IRUGO, csrow_ce_count_show, NULL);
256 
257 /* default attributes of the CSROW<id> object */
258 static struct attribute *csrow_attrs[] = {
259 	&dev_attr_legacy_dev_type.attr,
260 	&dev_attr_legacy_mem_type.attr,
261 	&dev_attr_legacy_edac_mode.attr,
262 	&dev_attr_legacy_size_mb.attr,
263 	&dev_attr_legacy_ue_count.attr,
264 	&dev_attr_legacy_ce_count.attr,
265 	NULL,
266 };
267 
268 static const struct attribute_group csrow_attr_grp = {
269 	.attrs	= csrow_attrs,
270 };
271 
272 static const struct attribute_group *csrow_attr_groups[] = {
273 	&csrow_attr_grp,
274 	NULL
275 };
276 
277 static const struct device_type csrow_attr_type = {
278 	.groups		= csrow_attr_groups,
279 };
280 
281 /*
282  * possible dynamic channel DIMM Label attribute files
283  *
284  */
285 DEVICE_CHANNEL(ch0_dimm_label, S_IRUGO | S_IWUSR,
286 	channel_dimm_label_show, channel_dimm_label_store, 0);
287 DEVICE_CHANNEL(ch1_dimm_label, S_IRUGO | S_IWUSR,
288 	channel_dimm_label_show, channel_dimm_label_store, 1);
289 DEVICE_CHANNEL(ch2_dimm_label, S_IRUGO | S_IWUSR,
290 	channel_dimm_label_show, channel_dimm_label_store, 2);
291 DEVICE_CHANNEL(ch3_dimm_label, S_IRUGO | S_IWUSR,
292 	channel_dimm_label_show, channel_dimm_label_store, 3);
293 DEVICE_CHANNEL(ch4_dimm_label, S_IRUGO | S_IWUSR,
294 	channel_dimm_label_show, channel_dimm_label_store, 4);
295 DEVICE_CHANNEL(ch5_dimm_label, S_IRUGO | S_IWUSR,
296 	channel_dimm_label_show, channel_dimm_label_store, 5);
297 DEVICE_CHANNEL(ch6_dimm_label, S_IRUGO | S_IWUSR,
298 	channel_dimm_label_show, channel_dimm_label_store, 6);
299 DEVICE_CHANNEL(ch7_dimm_label, S_IRUGO | S_IWUSR,
300 	channel_dimm_label_show, channel_dimm_label_store, 7);
301 DEVICE_CHANNEL(ch8_dimm_label, S_IRUGO | S_IWUSR,
302 	channel_dimm_label_show, channel_dimm_label_store, 8);
303 DEVICE_CHANNEL(ch9_dimm_label, S_IRUGO | S_IWUSR,
304 	channel_dimm_label_show, channel_dimm_label_store, 9);
305 DEVICE_CHANNEL(ch10_dimm_label, S_IRUGO | S_IWUSR,
306 	channel_dimm_label_show, channel_dimm_label_store, 10);
307 DEVICE_CHANNEL(ch11_dimm_label, S_IRUGO | S_IWUSR,
308 	channel_dimm_label_show, channel_dimm_label_store, 11);
309 
310 /* Total possible dynamic DIMM Label attribute file table */
311 static struct attribute *dynamic_csrow_dimm_attr[] = {
312 	&dev_attr_legacy_ch0_dimm_label.attr.attr,
313 	&dev_attr_legacy_ch1_dimm_label.attr.attr,
314 	&dev_attr_legacy_ch2_dimm_label.attr.attr,
315 	&dev_attr_legacy_ch3_dimm_label.attr.attr,
316 	&dev_attr_legacy_ch4_dimm_label.attr.attr,
317 	&dev_attr_legacy_ch5_dimm_label.attr.attr,
318 	&dev_attr_legacy_ch6_dimm_label.attr.attr,
319 	&dev_attr_legacy_ch7_dimm_label.attr.attr,
320 	&dev_attr_legacy_ch8_dimm_label.attr.attr,
321 	&dev_attr_legacy_ch9_dimm_label.attr.attr,
322 	&dev_attr_legacy_ch10_dimm_label.attr.attr,
323 	&dev_attr_legacy_ch11_dimm_label.attr.attr,
324 	NULL
325 };
326 
327 /* possible dynamic channel ce_count attribute files */
328 DEVICE_CHANNEL(ch0_ce_count, S_IRUGO,
329 		   channel_ce_count_show, NULL, 0);
330 DEVICE_CHANNEL(ch1_ce_count, S_IRUGO,
331 		   channel_ce_count_show, NULL, 1);
332 DEVICE_CHANNEL(ch2_ce_count, S_IRUGO,
333 		   channel_ce_count_show, NULL, 2);
334 DEVICE_CHANNEL(ch3_ce_count, S_IRUGO,
335 		   channel_ce_count_show, NULL, 3);
336 DEVICE_CHANNEL(ch4_ce_count, S_IRUGO,
337 		   channel_ce_count_show, NULL, 4);
338 DEVICE_CHANNEL(ch5_ce_count, S_IRUGO,
339 		   channel_ce_count_show, NULL, 5);
340 DEVICE_CHANNEL(ch6_ce_count, S_IRUGO,
341 		   channel_ce_count_show, NULL, 6);
342 DEVICE_CHANNEL(ch7_ce_count, S_IRUGO,
343 		   channel_ce_count_show, NULL, 7);
344 DEVICE_CHANNEL(ch8_ce_count, S_IRUGO,
345 		   channel_ce_count_show, NULL, 8);
346 DEVICE_CHANNEL(ch9_ce_count, S_IRUGO,
347 		   channel_ce_count_show, NULL, 9);
348 DEVICE_CHANNEL(ch10_ce_count, S_IRUGO,
349 		   channel_ce_count_show, NULL, 10);
350 DEVICE_CHANNEL(ch11_ce_count, S_IRUGO,
351 		   channel_ce_count_show, NULL, 11);
352 
353 /* Total possible dynamic ce_count attribute file table */
354 static struct attribute *dynamic_csrow_ce_count_attr[] = {
355 	&dev_attr_legacy_ch0_ce_count.attr.attr,
356 	&dev_attr_legacy_ch1_ce_count.attr.attr,
357 	&dev_attr_legacy_ch2_ce_count.attr.attr,
358 	&dev_attr_legacy_ch3_ce_count.attr.attr,
359 	&dev_attr_legacy_ch4_ce_count.attr.attr,
360 	&dev_attr_legacy_ch5_ce_count.attr.attr,
361 	&dev_attr_legacy_ch6_ce_count.attr.attr,
362 	&dev_attr_legacy_ch7_ce_count.attr.attr,
363 	&dev_attr_legacy_ch8_ce_count.attr.attr,
364 	&dev_attr_legacy_ch9_ce_count.attr.attr,
365 	&dev_attr_legacy_ch10_ce_count.attr.attr,
366 	&dev_attr_legacy_ch11_ce_count.attr.attr,
367 	NULL
368 };
369 
csrow_dev_is_visible(struct kobject * kobj,struct attribute * attr,int idx)370 static umode_t csrow_dev_is_visible(struct kobject *kobj,
371 				    struct attribute *attr, int idx)
372 {
373 	struct device *dev = kobj_to_dev(kobj);
374 	struct csrow_info *csrow = container_of(dev, struct csrow_info, dev);
375 
376 	if (idx >= csrow->nr_channels)
377 		return 0;
378 
379 	if (idx >= ARRAY_SIZE(dynamic_csrow_ce_count_attr) - 1) {
380 		WARN_ONCE(1, "idx: %d\n", idx);
381 		return 0;
382 	}
383 
384 	/* Only expose populated DIMMs */
385 	if (!csrow->channels[idx]->dimm->nr_pages)
386 		return 0;
387 
388 	return attr->mode;
389 }
390 
391 
392 static const struct attribute_group csrow_dev_dimm_group = {
393 	.attrs = dynamic_csrow_dimm_attr,
394 	.is_visible = csrow_dev_is_visible,
395 };
396 
397 static const struct attribute_group csrow_dev_ce_count_group = {
398 	.attrs = dynamic_csrow_ce_count_attr,
399 	.is_visible = csrow_dev_is_visible,
400 };
401 
402 static const struct attribute_group *csrow_dev_groups[] = {
403 	&csrow_dev_dimm_group,
404 	&csrow_dev_ce_count_group,
405 	NULL
406 };
407 
csrow_release(struct device * dev)408 static void csrow_release(struct device *dev)
409 {
410 	/*
411 	 * Nothing to do, just unregister sysfs here. The mci
412 	 * device owns the data and will also release it.
413 	 */
414 }
415 
nr_pages_per_csrow(struct csrow_info * csrow)416 static inline int nr_pages_per_csrow(struct csrow_info *csrow)
417 {
418 	int chan, nr_pages = 0;
419 
420 	for (chan = 0; chan < csrow->nr_channels; chan++)
421 		nr_pages += csrow->channels[chan]->dimm->nr_pages;
422 
423 	return nr_pages;
424 }
425 
426 /* Create a CSROW object under specifed edac_mc_device */
edac_create_csrow_object(struct mem_ctl_info * mci,struct csrow_info * csrow,int index)427 static int edac_create_csrow_object(struct mem_ctl_info *mci,
428 				    struct csrow_info *csrow, int index)
429 {
430 	int err;
431 
432 	csrow->dev.type = &csrow_attr_type;
433 	csrow->dev.groups = csrow_dev_groups;
434 	csrow->dev.release = csrow_release;
435 	device_initialize(&csrow->dev);
436 	csrow->dev.parent = &mci->dev;
437 	csrow->mci = mci;
438 	dev_set_name(&csrow->dev, "csrow%d", index);
439 	dev_set_drvdata(&csrow->dev, csrow);
440 
441 	err = device_add(&csrow->dev);
442 	if (err) {
443 		edac_dbg(1, "failure: create device %s\n", dev_name(&csrow->dev));
444 		put_device(&csrow->dev);
445 		return err;
446 	}
447 
448 	edac_dbg(0, "device %s created\n", dev_name(&csrow->dev));
449 
450 	return 0;
451 }
452 
453 /* Create a CSROW object under specifed edac_mc_device */
edac_create_csrow_objects(struct mem_ctl_info * mci)454 static int edac_create_csrow_objects(struct mem_ctl_info *mci)
455 {
456 	int err, i;
457 	struct csrow_info *csrow;
458 
459 	for (i = 0; i < mci->nr_csrows; i++) {
460 		csrow = mci->csrows[i];
461 		if (!nr_pages_per_csrow(csrow))
462 			continue;
463 		err = edac_create_csrow_object(mci, mci->csrows[i], i);
464 		if (err < 0)
465 			goto error;
466 	}
467 	return 0;
468 
469 error:
470 	for (--i; i >= 0; i--) {
471 		if (device_is_registered(&mci->csrows[i]->dev))
472 			device_unregister(&mci->csrows[i]->dev);
473 	}
474 
475 	return err;
476 }
477 
edac_delete_csrow_objects(struct mem_ctl_info * mci)478 static void edac_delete_csrow_objects(struct mem_ctl_info *mci)
479 {
480 	int i;
481 
482 	for (i = 0; i < mci->nr_csrows; i++) {
483 		if (device_is_registered(&mci->csrows[i]->dev))
484 			device_unregister(&mci->csrows[i]->dev);
485 	}
486 }
487 
488 #endif
489 
490 /*
491  * Per-dimm (or per-rank) devices
492  */
493 
494 #define to_dimm(k) container_of(k, struct dimm_info, dev)
495 
496 /* show/store functions for DIMM Label attributes */
dimmdev_location_show(struct device * dev,struct device_attribute * mattr,char * data)497 static ssize_t dimmdev_location_show(struct device *dev,
498 				     struct device_attribute *mattr, char *data)
499 {
500 	struct dimm_info *dimm = to_dimm(dev);
501 	ssize_t count;
502 
503 	count = edac_dimm_info_location(dimm, data, PAGE_SIZE);
504 	count += scnprintf(data + count, PAGE_SIZE - count, "\n");
505 
506 	return count;
507 }
508 
dimmdev_label_show(struct device * dev,struct device_attribute * mattr,char * data)509 static ssize_t dimmdev_label_show(struct device *dev,
510 				  struct device_attribute *mattr, char *data)
511 {
512 	struct dimm_info *dimm = to_dimm(dev);
513 
514 	/* if field has not been initialized, there is nothing to send */
515 	if (!dimm->label[0])
516 		return 0;
517 
518 	return snprintf(data, sizeof(dimm->label) + 1, "%s\n", dimm->label);
519 }
520 
dimmdev_label_store(struct device * dev,struct device_attribute * mattr,const char * data,size_t count)521 static ssize_t dimmdev_label_store(struct device *dev,
522 				   struct device_attribute *mattr,
523 				   const char *data,
524 				   size_t count)
525 {
526 	struct dimm_info *dimm = to_dimm(dev);
527 	size_t copy_count = count;
528 
529 	if (count == 0)
530 		return -EINVAL;
531 
532 	if (data[count - 1] == '\0' || data[count - 1] == '\n')
533 		copy_count -= 1;
534 
535 	if (copy_count == 0 || copy_count >= sizeof(dimm->label))
536 		return -EINVAL;
537 
538 	strncpy(dimm->label, data, copy_count);
539 	dimm->label[copy_count] = '\0';
540 
541 	return count;
542 }
543 
dimmdev_size_show(struct device * dev,struct device_attribute * mattr,char * data)544 static ssize_t dimmdev_size_show(struct device *dev,
545 				 struct device_attribute *mattr, char *data)
546 {
547 	struct dimm_info *dimm = to_dimm(dev);
548 
549 	return sprintf(data, "%u\n", PAGES_TO_MiB(dimm->nr_pages));
550 }
551 
dimmdev_mem_type_show(struct device * dev,struct device_attribute * mattr,char * data)552 static ssize_t dimmdev_mem_type_show(struct device *dev,
553 				     struct device_attribute *mattr, char *data)
554 {
555 	struct dimm_info *dimm = to_dimm(dev);
556 
557 	return sprintf(data, "%s\n", edac_mem_types[dimm->mtype]);
558 }
559 
dimmdev_dev_type_show(struct device * dev,struct device_attribute * mattr,char * data)560 static ssize_t dimmdev_dev_type_show(struct device *dev,
561 				     struct device_attribute *mattr, char *data)
562 {
563 	struct dimm_info *dimm = to_dimm(dev);
564 
565 	return sprintf(data, "%s\n", dev_types[dimm->dtype]);
566 }
567 
dimmdev_edac_mode_show(struct device * dev,struct device_attribute * mattr,char * data)568 static ssize_t dimmdev_edac_mode_show(struct device *dev,
569 				      struct device_attribute *mattr,
570 				      char *data)
571 {
572 	struct dimm_info *dimm = to_dimm(dev);
573 
574 	return sprintf(data, "%s\n", edac_caps[dimm->edac_mode]);
575 }
576 
dimmdev_ce_count_show(struct device * dev,struct device_attribute * mattr,char * data)577 static ssize_t dimmdev_ce_count_show(struct device *dev,
578 				      struct device_attribute *mattr,
579 				      char *data)
580 {
581 	struct dimm_info *dimm = to_dimm(dev);
582 
583 	return sprintf(data, "%u\n", dimm->ce_count);
584 }
585 
dimmdev_ue_count_show(struct device * dev,struct device_attribute * mattr,char * data)586 static ssize_t dimmdev_ue_count_show(struct device *dev,
587 				      struct device_attribute *mattr,
588 				      char *data)
589 {
590 	struct dimm_info *dimm = to_dimm(dev);
591 
592 	return sprintf(data, "%u\n", dimm->ue_count);
593 }
594 
595 /* dimm/rank attribute files */
596 static DEVICE_ATTR(dimm_label, S_IRUGO | S_IWUSR,
597 		   dimmdev_label_show, dimmdev_label_store);
598 static DEVICE_ATTR(dimm_location, S_IRUGO, dimmdev_location_show, NULL);
599 static DEVICE_ATTR(size, S_IRUGO, dimmdev_size_show, NULL);
600 static DEVICE_ATTR(dimm_mem_type, S_IRUGO, dimmdev_mem_type_show, NULL);
601 static DEVICE_ATTR(dimm_dev_type, S_IRUGO, dimmdev_dev_type_show, NULL);
602 static DEVICE_ATTR(dimm_edac_mode, S_IRUGO, dimmdev_edac_mode_show, NULL);
603 static DEVICE_ATTR(dimm_ce_count, S_IRUGO, dimmdev_ce_count_show, NULL);
604 static DEVICE_ATTR(dimm_ue_count, S_IRUGO, dimmdev_ue_count_show, NULL);
605 
606 /* attributes of the dimm<id>/rank<id> object */
607 static struct attribute *dimm_attrs[] = {
608 	&dev_attr_dimm_label.attr,
609 	&dev_attr_dimm_location.attr,
610 	&dev_attr_size.attr,
611 	&dev_attr_dimm_mem_type.attr,
612 	&dev_attr_dimm_dev_type.attr,
613 	&dev_attr_dimm_edac_mode.attr,
614 	&dev_attr_dimm_ce_count.attr,
615 	&dev_attr_dimm_ue_count.attr,
616 	NULL,
617 };
618 
619 static const struct attribute_group dimm_attr_grp = {
620 	.attrs	= dimm_attrs,
621 };
622 
623 static const struct attribute_group *dimm_attr_groups[] = {
624 	&dimm_attr_grp,
625 	NULL
626 };
627 
628 static const struct device_type dimm_attr_type = {
629 	.groups		= dimm_attr_groups,
630 };
631 
dimm_release(struct device * dev)632 static void dimm_release(struct device *dev)
633 {
634 	/*
635 	 * Nothing to do, just unregister sysfs here. The mci
636 	 * device owns the data and will also release it.
637 	 */
638 }
639 
640 /* Create a DIMM object under specifed memory controller device */
edac_create_dimm_object(struct mem_ctl_info * mci,struct dimm_info * dimm)641 static int edac_create_dimm_object(struct mem_ctl_info *mci,
642 				   struct dimm_info *dimm)
643 {
644 	int err;
645 	dimm->mci = mci;
646 
647 	dimm->dev.type = &dimm_attr_type;
648 	dimm->dev.release = dimm_release;
649 	device_initialize(&dimm->dev);
650 
651 	dimm->dev.parent = &mci->dev;
652 	if (mci->csbased)
653 		dev_set_name(&dimm->dev, "rank%d", dimm->idx);
654 	else
655 		dev_set_name(&dimm->dev, "dimm%d", dimm->idx);
656 	dev_set_drvdata(&dimm->dev, dimm);
657 	pm_runtime_forbid(&mci->dev);
658 
659 	err = device_add(&dimm->dev);
660 	if (err) {
661 		edac_dbg(1, "failure: create device %s\n", dev_name(&dimm->dev));
662 		put_device(&dimm->dev);
663 		return err;
664 	}
665 
666 	if (IS_ENABLED(CONFIG_EDAC_DEBUG)) {
667 		char location[80];
668 
669 		edac_dimm_info_location(dimm, location, sizeof(location));
670 		edac_dbg(0, "device %s created at location %s\n",
671 			dev_name(&dimm->dev), location);
672 	}
673 
674 	return 0;
675 }
676 
677 /*
678  * Memory controller device
679  */
680 
681 #define to_mci(k) container_of(k, struct mem_ctl_info, dev)
682 
mci_reset_counters_store(struct device * dev,struct device_attribute * mattr,const char * data,size_t count)683 static ssize_t mci_reset_counters_store(struct device *dev,
684 					struct device_attribute *mattr,
685 					const char *data, size_t count)
686 {
687 	struct mem_ctl_info *mci = to_mci(dev);
688 	struct dimm_info *dimm;
689 	int row, chan;
690 
691 	mci->ue_mc = 0;
692 	mci->ce_mc = 0;
693 	mci->ue_noinfo_count = 0;
694 	mci->ce_noinfo_count = 0;
695 
696 	for (row = 0; row < mci->nr_csrows; row++) {
697 		struct csrow_info *ri = mci->csrows[row];
698 
699 		ri->ue_count = 0;
700 		ri->ce_count = 0;
701 
702 		for (chan = 0; chan < ri->nr_channels; chan++)
703 			ri->channels[chan]->ce_count = 0;
704 	}
705 
706 	mci_for_each_dimm(mci, dimm) {
707 		dimm->ue_count = 0;
708 		dimm->ce_count = 0;
709 	}
710 
711 	mci->start_time = jiffies;
712 	return count;
713 }
714 
715 /* Memory scrubbing interface:
716  *
717  * A MC driver can limit the scrubbing bandwidth based on the CPU type.
718  * Therefore, ->set_sdram_scrub_rate should be made to return the actual
719  * bandwidth that is accepted or 0 when scrubbing is to be disabled.
720  *
721  * Negative value still means that an error has occurred while setting
722  * the scrub rate.
723  */
mci_sdram_scrub_rate_store(struct device * dev,struct device_attribute * mattr,const char * data,size_t count)724 static ssize_t mci_sdram_scrub_rate_store(struct device *dev,
725 					  struct device_attribute *mattr,
726 					  const char *data, size_t count)
727 {
728 	struct mem_ctl_info *mci = to_mci(dev);
729 	unsigned long bandwidth = 0;
730 	int new_bw = 0;
731 
732 	if (kstrtoul(data, 10, &bandwidth) < 0)
733 		return -EINVAL;
734 
735 	new_bw = mci->set_sdram_scrub_rate(mci, bandwidth);
736 	if (new_bw < 0) {
737 		edac_printk(KERN_WARNING, EDAC_MC,
738 			    "Error setting scrub rate to: %lu\n", bandwidth);
739 		return -EINVAL;
740 	}
741 
742 	return count;
743 }
744 
745 /*
746  * ->get_sdram_scrub_rate() return value semantics same as above.
747  */
mci_sdram_scrub_rate_show(struct device * dev,struct device_attribute * mattr,char * data)748 static ssize_t mci_sdram_scrub_rate_show(struct device *dev,
749 					 struct device_attribute *mattr,
750 					 char *data)
751 {
752 	struct mem_ctl_info *mci = to_mci(dev);
753 	int bandwidth = 0;
754 
755 	bandwidth = mci->get_sdram_scrub_rate(mci);
756 	if (bandwidth < 0) {
757 		edac_printk(KERN_DEBUG, EDAC_MC, "Error reading scrub rate\n");
758 		return bandwidth;
759 	}
760 
761 	return sprintf(data, "%d\n", bandwidth);
762 }
763 
764 /* default attribute files for the MCI object */
mci_ue_count_show(struct device * dev,struct device_attribute * mattr,char * data)765 static ssize_t mci_ue_count_show(struct device *dev,
766 				 struct device_attribute *mattr,
767 				 char *data)
768 {
769 	struct mem_ctl_info *mci = to_mci(dev);
770 
771 	return sprintf(data, "%u\n", mci->ue_mc);
772 }
773 
mci_ce_count_show(struct device * dev,struct device_attribute * mattr,char * data)774 static ssize_t mci_ce_count_show(struct device *dev,
775 				 struct device_attribute *mattr,
776 				 char *data)
777 {
778 	struct mem_ctl_info *mci = to_mci(dev);
779 
780 	return sprintf(data, "%u\n", mci->ce_mc);
781 }
782 
mci_ce_noinfo_show(struct device * dev,struct device_attribute * mattr,char * data)783 static ssize_t mci_ce_noinfo_show(struct device *dev,
784 				  struct device_attribute *mattr,
785 				  char *data)
786 {
787 	struct mem_ctl_info *mci = to_mci(dev);
788 
789 	return sprintf(data, "%u\n", mci->ce_noinfo_count);
790 }
791 
mci_ue_noinfo_show(struct device * dev,struct device_attribute * mattr,char * data)792 static ssize_t mci_ue_noinfo_show(struct device *dev,
793 				  struct device_attribute *mattr,
794 				  char *data)
795 {
796 	struct mem_ctl_info *mci = to_mci(dev);
797 
798 	return sprintf(data, "%u\n", mci->ue_noinfo_count);
799 }
800 
mci_seconds_show(struct device * dev,struct device_attribute * mattr,char * data)801 static ssize_t mci_seconds_show(struct device *dev,
802 				struct device_attribute *mattr,
803 				char *data)
804 {
805 	struct mem_ctl_info *mci = to_mci(dev);
806 
807 	return sprintf(data, "%ld\n", (jiffies - mci->start_time) / HZ);
808 }
809 
mci_ctl_name_show(struct device * dev,struct device_attribute * mattr,char * data)810 static ssize_t mci_ctl_name_show(struct device *dev,
811 				 struct device_attribute *mattr,
812 				 char *data)
813 {
814 	struct mem_ctl_info *mci = to_mci(dev);
815 
816 	return sprintf(data, "%s\n", mci->ctl_name);
817 }
818 
mci_size_mb_show(struct device * dev,struct device_attribute * mattr,char * data)819 static ssize_t mci_size_mb_show(struct device *dev,
820 				struct device_attribute *mattr,
821 				char *data)
822 {
823 	struct mem_ctl_info *mci = to_mci(dev);
824 	int total_pages = 0, csrow_idx, j;
825 
826 	for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
827 		struct csrow_info *csrow = mci->csrows[csrow_idx];
828 
829 		for (j = 0; j < csrow->nr_channels; j++) {
830 			struct dimm_info *dimm = csrow->channels[j]->dimm;
831 
832 			total_pages += dimm->nr_pages;
833 		}
834 	}
835 
836 	return sprintf(data, "%u\n", PAGES_TO_MiB(total_pages));
837 }
838 
mci_max_location_show(struct device * dev,struct device_attribute * mattr,char * data)839 static ssize_t mci_max_location_show(struct device *dev,
840 				     struct device_attribute *mattr,
841 				     char *data)
842 {
843 	struct mem_ctl_info *mci = to_mci(dev);
844 	int len = PAGE_SIZE;
845 	char *p = data;
846 	int i, n;
847 
848 	for (i = 0; i < mci->n_layers; i++) {
849 		n = scnprintf(p, len, "%s %d ",
850 			      edac_layer_name[mci->layers[i].type],
851 			      mci->layers[i].size - 1);
852 		len -= n;
853 		if (len <= 0)
854 			goto out;
855 
856 		p += n;
857 	}
858 
859 	p += scnprintf(p, len, "\n");
860 out:
861 	return p - data;
862 }
863 
864 /* default Control file */
865 static DEVICE_ATTR(reset_counters, S_IWUSR, NULL, mci_reset_counters_store);
866 
867 /* default Attribute files */
868 static DEVICE_ATTR(mc_name, S_IRUGO, mci_ctl_name_show, NULL);
869 static DEVICE_ATTR(size_mb, S_IRUGO, mci_size_mb_show, NULL);
870 static DEVICE_ATTR(seconds_since_reset, S_IRUGO, mci_seconds_show, NULL);
871 static DEVICE_ATTR(ue_noinfo_count, S_IRUGO, mci_ue_noinfo_show, NULL);
872 static DEVICE_ATTR(ce_noinfo_count, S_IRUGO, mci_ce_noinfo_show, NULL);
873 static DEVICE_ATTR(ue_count, S_IRUGO, mci_ue_count_show, NULL);
874 static DEVICE_ATTR(ce_count, S_IRUGO, mci_ce_count_show, NULL);
875 static DEVICE_ATTR(max_location, S_IRUGO, mci_max_location_show, NULL);
876 
877 /* memory scrubber attribute file */
878 static DEVICE_ATTR(sdram_scrub_rate, 0, mci_sdram_scrub_rate_show,
879 	    mci_sdram_scrub_rate_store); /* umode set later in is_visible */
880 
881 static struct attribute *mci_attrs[] = {
882 	&dev_attr_reset_counters.attr,
883 	&dev_attr_mc_name.attr,
884 	&dev_attr_size_mb.attr,
885 	&dev_attr_seconds_since_reset.attr,
886 	&dev_attr_ue_noinfo_count.attr,
887 	&dev_attr_ce_noinfo_count.attr,
888 	&dev_attr_ue_count.attr,
889 	&dev_attr_ce_count.attr,
890 	&dev_attr_max_location.attr,
891 	&dev_attr_sdram_scrub_rate.attr,
892 	NULL
893 };
894 
mci_attr_is_visible(struct kobject * kobj,struct attribute * attr,int idx)895 static umode_t mci_attr_is_visible(struct kobject *kobj,
896 				   struct attribute *attr, int idx)
897 {
898 	struct device *dev = kobj_to_dev(kobj);
899 	struct mem_ctl_info *mci = to_mci(dev);
900 	umode_t mode = 0;
901 
902 	if (attr != &dev_attr_sdram_scrub_rate.attr)
903 		return attr->mode;
904 	if (mci->get_sdram_scrub_rate)
905 		mode |= S_IRUGO;
906 	if (mci->set_sdram_scrub_rate)
907 		mode |= S_IWUSR;
908 	return mode;
909 }
910 
911 static const struct attribute_group mci_attr_grp = {
912 	.attrs	= mci_attrs,
913 	.is_visible = mci_attr_is_visible,
914 };
915 
916 static const struct attribute_group *mci_attr_groups[] = {
917 	&mci_attr_grp,
918 	NULL
919 };
920 
921 static const struct device_type mci_attr_type = {
922 	.groups		= mci_attr_groups,
923 };
924 
925 /*
926  * Create a new Memory Controller kobject instance,
927  *	mc<id> under the 'mc' directory
928  *
929  * Return:
930  *	0	Success
931  *	!0	Failure
932  */
edac_create_sysfs_mci_device(struct mem_ctl_info * mci,const struct attribute_group ** groups)933 int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
934 				 const struct attribute_group **groups)
935 {
936 	struct dimm_info *dimm;
937 	int err;
938 
939 	/* get the /sys/devices/system/edac subsys reference */
940 	mci->dev.type = &mci_attr_type;
941 	mci->dev.parent = mci_pdev;
942 	mci->dev.groups = groups;
943 	dev_set_name(&mci->dev, "mc%d", mci->mc_idx);
944 	dev_set_drvdata(&mci->dev, mci);
945 	pm_runtime_forbid(&mci->dev);
946 
947 	err = device_add(&mci->dev);
948 	if (err < 0) {
949 		edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev));
950 		/* no put_device() here, free mci with _edac_mc_free() */
951 		return err;
952 	}
953 
954 	edac_dbg(0, "device %s created\n", dev_name(&mci->dev));
955 
956 	/*
957 	 * Create the dimm/rank devices
958 	 */
959 	mci_for_each_dimm(mci, dimm) {
960 		/* Only expose populated DIMMs */
961 		if (!dimm->nr_pages)
962 			continue;
963 
964 		err = edac_create_dimm_object(mci, dimm);
965 		if (err)
966 			goto fail;
967 	}
968 
969 #ifdef CONFIG_EDAC_LEGACY_SYSFS
970 	err = edac_create_csrow_objects(mci);
971 	if (err < 0)
972 		goto fail;
973 #endif
974 
975 	edac_create_debugfs_nodes(mci);
976 	return 0;
977 
978 fail:
979 	edac_remove_sysfs_mci_device(mci);
980 
981 	return err;
982 }
983 
984 /*
985  * remove a Memory Controller instance
986  */
edac_remove_sysfs_mci_device(struct mem_ctl_info * mci)987 void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
988 {
989 	struct dimm_info *dimm;
990 
991 	if (!device_is_registered(&mci->dev))
992 		return;
993 
994 	edac_dbg(0, "\n");
995 
996 #ifdef CONFIG_EDAC_DEBUG
997 	edac_debugfs_remove_recursive(mci->debugfs);
998 #endif
999 #ifdef CONFIG_EDAC_LEGACY_SYSFS
1000 	edac_delete_csrow_objects(mci);
1001 #endif
1002 
1003 	mci_for_each_dimm(mci, dimm) {
1004 		if (!device_is_registered(&dimm->dev))
1005 			continue;
1006 		edac_dbg(1, "unregistering device %s\n", dev_name(&dimm->dev));
1007 		device_unregister(&dimm->dev);
1008 	}
1009 
1010 	/* only remove the device, but keep mci */
1011 	device_del(&mci->dev);
1012 }
1013 
mc_attr_release(struct device * dev)1014 static void mc_attr_release(struct device *dev)
1015 {
1016 	/*
1017 	 * There's no container structure here, as this is just the mci
1018 	 * parent device, used to create the /sys/devices/mc sysfs node.
1019 	 * So, there are no attributes on it.
1020 	 */
1021 	edac_dbg(1, "device %s released\n", dev_name(dev));
1022 	kfree(dev);
1023 }
1024 
1025 /*
1026  * Init/exit code for the module. Basically, creates/removes /sys/class/rc
1027  */
edac_mc_sysfs_init(void)1028 int __init edac_mc_sysfs_init(void)
1029 {
1030 	int err;
1031 
1032 	mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL);
1033 	if (!mci_pdev)
1034 		return -ENOMEM;
1035 
1036 	mci_pdev->bus = edac_get_sysfs_subsys();
1037 	mci_pdev->release = mc_attr_release;
1038 	mci_pdev->init_name = "mc";
1039 
1040 	err = device_register(mci_pdev);
1041 	if (err < 0) {
1042 		edac_dbg(1, "failure: create device %s\n", dev_name(mci_pdev));
1043 		put_device(mci_pdev);
1044 		return err;
1045 	}
1046 
1047 	edac_dbg(0, "device %s created\n", dev_name(mci_pdev));
1048 
1049 	return 0;
1050 }
1051 
edac_mc_sysfs_exit(void)1052 void edac_mc_sysfs_exit(void)
1053 {
1054 	device_unregister(mci_pdev);
1055 }
1056