|
@@ -21,113 +21,6 @@
|
|
#define to_edacdev(k) container_of(k, struct edac_device_ctl_info, kobj)
|
|
#define to_edacdev(k) container_of(k, struct edac_device_ctl_info, kobj)
|
|
#define to_edacdev_attr(a) container_of(a, struct edacdev_attribute, attr)
|
|
#define to_edacdev_attr(a) container_of(a, struct edacdev_attribute, attr)
|
|
|
|
|
|
-#ifdef DKT
|
|
|
|
-
|
|
|
|
-static ssize_t edac_dev_ue_count_show(struct edac_device_ctl_info *edac_dev,
|
|
|
|
- char *data)
|
|
|
|
-{
|
|
|
|
- return sprintf(data, "%d\n", edac_dev->ue_count);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static ssize_t edac_dev_ce_count_show(struct edac_device_ctl_info *edac_dev,
|
|
|
|
- char *data)
|
|
|
|
-{
|
|
|
|
- return sprintf(data, "%d\n", edac_dev->ce_count);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static ssize_t edac_dev_seconds_show(struct edac_device_ctl_info *edac_dev,
|
|
|
|
- char *data)
|
|
|
|
-{
|
|
|
|
- return sprintf(data, "%ld\n", (jiffies - edac_dev->start_time) / HZ);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static ssize_t edac_dev_ctl_name_show(struct edac_device_ctl_info *edac_dev,
|
|
|
|
- char *data)
|
|
|
|
-{
|
|
|
|
- return sprintf(data, "%s\n", edac_dev->ctl_name);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-struct edacdev_attribute {
|
|
|
|
- struct attribute attr;
|
|
|
|
- ssize_t(*show) (struct edac_device_ctl_info *, char *);
|
|
|
|
- ssize_t(*store) (struct edac_device_ctl_info *, const char *, size_t);
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-/* EDAC DEVICE show/store functions for top most object */
|
|
|
|
-static ssize_t edacdev_show(struct kobject *kobj, struct attribute *attr,
|
|
|
|
- char *buffer)
|
|
|
|
-{
|
|
|
|
- struct edac_device_ctl_info *edac_dev = to_edacdev(kobj);
|
|
|
|
- struct edacdev_attribute *edacdev_attr = to_edacdev_attr(attr);
|
|
|
|
-
|
|
|
|
- if (edacdev_attr->show)
|
|
|
|
- return edacdev_attr->show(edac_dev, buffer);
|
|
|
|
-
|
|
|
|
- return -EIO;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static ssize_t edacdev_store(struct kobject *kobj, struct attribute *attr,
|
|
|
|
- const char *buffer, size_t count)
|
|
|
|
-{
|
|
|
|
- struct edac_device_ctl_info *edac_dev = to_edacdev(kobj);
|
|
|
|
- struct edacdev_attribute *edacdev_attr = to_edacdev_attr(attr);
|
|
|
|
-
|
|
|
|
- if (edacdev_attr->store)
|
|
|
|
- return edacdev_attr->store(edac_dev, buffer, count);
|
|
|
|
-
|
|
|
|
- return -EIO;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static struct sysfs_ops edac_dev_ops = {
|
|
|
|
- .show = edacdev_show,
|
|
|
|
- .store = edacdev_store
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-#define EDACDEV_ATTR(_name,_mode,_show,_store) \
|
|
|
|
-static struct edacdev_attribute edac_dev_attr_##_name = { \
|
|
|
|
- .attr = {.name = __stringify(_name), .mode = _mode }, \
|
|
|
|
- .show = _show, \
|
|
|
|
- .store = _store, \
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-/* default Control file */
|
|
|
|
-EDACDEV_ATTR(reset_counters, S_IWUSR, NULL, edac_dev_reset_counters_store);
|
|
|
|
-
|
|
|
|
-/* default Attribute files */
|
|
|
|
-EDACDEV_ATTR(mc_name, S_IRUGO, edac_dev_ctl_name_show, NULL);
|
|
|
|
-EDACDEV_ATTR(seconds_since_reset, S_IRUGO, edac_dev_seconds_show, NULL);
|
|
|
|
-EDACDEV_ATTR(ue_count, S_IRUGO, edac_dev_ue_count_show, NULL);
|
|
|
|
-EDACDEV_ATTR(ce_count, S_IRUGO, edac_dev_ce_count_show, NULL);
|
|
|
|
-
|
|
|
|
-static struct edacdev_attribute *edacdev_attr[] = {
|
|
|
|
- &edacdev_attr_reset_counters,
|
|
|
|
- &edacdev_attr_mc_name,
|
|
|
|
- &edacdev_attr_seconds_since_reset,
|
|
|
|
- &edacdev_attr_ue_count,
|
|
|
|
- &edacdev_attr_ce_count,
|
|
|
|
- NULL
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Release of a Edac Device controlling instance
|
|
|
|
- */
|
|
|
|
-static void edac_dev_instance_release(struct kobject *kobj)
|
|
|
|
-{
|
|
|
|
- struct edac_device_ctl_info *edac_dev;
|
|
|
|
-
|
|
|
|
- edac_dev = to_edacdev(kobj);
|
|
|
|
- debugf0("%s() idx=%d\n", __func__, edac_dev->dev_idx);
|
|
|
|
- complete(&edac_dev->kobj_complete);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static struct kobj_type ktype_device = {
|
|
|
|
- .release = edac_dev_instance_release,
|
|
|
|
- .sysfs_ops = &edacdev_ops,
|
|
|
|
- .default_attrs = (struct attribute **)edacdev_attr,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
/************************** edac_device sysfs code and data **************/
|
|
/************************** edac_device sysfs code and data **************/
|
|
|
|
|
|
/*
|
|
/*
|