diff options
Diffstat (limited to 'include/linux/edac.h')
| -rw-r--r-- | include/linux/edac.h | 82 | 
1 files changed, 79 insertions, 3 deletions
diff --git a/include/linux/edac.h b/include/linux/edac.h index bab9f8473dc..4fd4999ccb5 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -14,7 +14,6 @@  #include <linux/atomic.h>  #include <linux/device.h> -#include <linux/kobject.h>  #include <linux/completion.h>  #include <linux/workqueue.h>  #include <linux/debugfs.h> @@ -48,8 +47,17 @@ static inline void opstate_init(void)  	return;  } +/* Max length of a DIMM label*/  #define EDAC_MC_LABEL_LEN	31 -#define MC_PROC_NAME_MAX_LEN	7 + +/* Maximum size of the location string */ +#define LOCATION_SIZE 80 + +/* Defines the maximum number of labels that can be reported */ +#define EDAC_MAX_LABELS		8 + +/* String used to join two or more labels */ +#define OTHER_LABEL " or "  /**   * enum dev_type - describe the type of memory DRAM chips used at the stick @@ -101,8 +109,24 @@ enum hw_event_mc_err_type {  	HW_EVENT_ERR_CORRECTED,  	HW_EVENT_ERR_UNCORRECTED,  	HW_EVENT_ERR_FATAL, +	HW_EVENT_ERR_INFO,  }; +static inline char *mc_event_error_type(const unsigned int err_type) +{ +	switch (err_type) { +	case HW_EVENT_ERR_CORRECTED: +		return "Corrected"; +	case HW_EVENT_ERR_UNCORRECTED: +		return "Uncorrected"; +	case HW_EVENT_ERR_FATAL: +		return "Fatal"; +	default: +	case HW_EVENT_ERR_INFO: +		return "Info"; +	} +} +  /**   * enum mem_type - memory types. For a more detailed reference, please see   *			http://en.wikipedia.org/wiki/DRAM @@ -376,6 +400,9 @@ enum scrub_type {   * @EDAC_MC_LAYER_CHANNEL:	memory layer is named "channel"   * @EDAC_MC_LAYER_SLOT:		memory layer is named "slot"   * @EDAC_MC_LAYER_CHIP_SELECT:	memory layer is named "chip select" + * @EDAC_MC_LAYER_ALL_MEM:	memory layout is unknown. All memory is mapped + *				as a single memory area. This is used when + *				retrieving errors from a firmware driven driver.   *   * This enum is used by the drivers to tell edac_mc_sysfs what name should   * be used when describing a memory stick location. @@ -385,6 +412,7 @@ enum edac_mc_layer_type {  	EDAC_MC_LAYER_CHANNEL,  	EDAC_MC_LAYER_SLOT,  	EDAC_MC_LAYER_CHIP_SELECT, +	EDAC_MC_LAYER_ALL_MEM,  };  /** @@ -533,6 +561,7 @@ struct csrow_info {  	u32 ue_count;		/* Uncorrectable Errors for this csrow */  	u32 ce_count;		/* Correctable Errors for this csrow */ +	u32 nr_pages;		/* combined pages count of all channels */  	struct mem_ctl_info *mci;	/* the parent */ @@ -550,6 +579,46 @@ struct errcount_attribute_data {  	int layer0, layer1, layer2;  }; +/** + * edac_raw_error_desc - Raw error report structure + * @grain:			minimum granularity for an error report, in bytes + * @error_count:		number of errors of the same type + * @top_layer:			top layer of the error (layer[0]) + * @mid_layer:			middle layer of the error (layer[1]) + * @low_layer:			low layer of the error (layer[2]) + * @page_frame_number:		page where the error happened + * @offset_in_page:		page offset + * @syndrome:			syndrome of the error (or 0 if unknown or if + * 				the syndrome is not applicable) + * @msg:			error message + * @location:			location of the error + * @label:			label of the affected DIMM(s) + * @other_detail:		other driver-specific detail about the error + * @enable_per_layer_report:	if false, the error affects all layers + *				(typically, a memory controller error) + */ +struct edac_raw_error_desc { +	/* +	 * NOTE: everything before grain won't be cleaned by +	 * edac_raw_error_desc_clean() +	 */ +	char location[LOCATION_SIZE]; +	char label[(EDAC_MC_LABEL_LEN + 1 + sizeof(OTHER_LABEL)) * EDAC_MAX_LABELS]; +	long grain; + +	/* the vars below and grain will be cleaned on every new error report */ +	u16 error_count; +	int top_layer; +	int mid_layer; +	int low_layer; +	unsigned long page_frame_number; +	unsigned long offset_in_page; +	unsigned long syndrome; +	const char *msg; +	const char *other_detail; +	bool enable_per_layer_report; +}; +  /* MEMORY controller information structure   */  struct mem_ctl_info { @@ -629,7 +698,6 @@ struct mem_ctl_info {  	const char *mod_ver;  	const char *ctl_name;  	const char *dev_name; -	char proc_name[MC_PROC_NAME_MAX_LEN + 1];  	void *pvt_info;  	unsigned long start_time;	/* mci load start time (in jiffies) */ @@ -658,6 +726,12 @@ struct mem_ctl_info {  	/* work struct for this MC */  	struct delayed_work work; +	/* +	 * Used to report an error - by being at the global struct +	 * makes the memory allocated by the EDAC core +	 */ +	struct edac_raw_error_desc error_desc; +  	/* the internal state of this controller instance */  	int op_state; @@ -667,6 +741,8 @@ struct mem_ctl_info {  	u32 fake_inject_ue;  	u16 fake_inject_count;  #endif +	__u8 csbased : 1,	/* csrow-based memory controller */ +	     __resv  : 7;  };  #endif  |