Hi Mahesh, A few nitpicks.
Mahesh J Salgaonkar <mah...@linux.vnet.ibm.com> writes: > From: Mahesh Salgaonkar <mah...@linux.vnet.ibm.com> > > On pseries, the machine check error details are part of RTAS extended > event log passed under Machine check exception section. This patch adds > the definition of rtas MCE event section and related helper > functions. > > Signed-off-by: Mahesh Salgaonkar <mah...@linux.vnet.ibm.com> > --- > arch/powerpc/include/asm/rtas.h | 111 > +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 111 insertions(+) AFIACS none of this ever gets used outside of ras.c, should it should just go in there. > diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h > index 71e393c46a49..adc677c5e3a4 100644 > --- a/arch/powerpc/include/asm/rtas.h > +++ b/arch/powerpc/include/asm/rtas.h > @@ -326,6 +334,109 @@ struct pseries_hp_errorlog { > #define PSERIES_HP_ELOG_ID_DRC_COUNT 3 > #define PSERIES_HP_ELOG_ID_DRC_IC 4 > > +/* RTAS pseries MCE errorlog section */ > +#pragma pack(push, 1) > +struct pseries_mc_errorlog { > + __be32 fru_id; > + __be32 proc_id; > + uint8_t error_type; Please use kernel types, so u8. > + union { > + struct { > + uint8_t ue_err_type; > + /* XXXXXXXX > + * X 1: Permanent or Transient UE. > + * X 1: Effective address provided. > + * X 1: Logical address provided. > + * XX 2: Reserved. > + * XXX 3: Type of UE error. > + */ But which bit is bit 0? And is that the LSB or MSB? > + uint8_t reserved_1[6]; > + __be64 effective_address; > + __be64 logical_address; > + } ue_error; > + struct { > + uint8_t soft_err_type; > + /* XXXXXXXX > + * X 1: Effective address provided. > + * XXXXX 5: Reserved. > + * XX 2: Type of SLB/ERAT/TLB error. > + */ > + uint8_t reserved_1[6]; > + __be64 effective_address; > + uint8_t reserved_2[8]; > + } soft_error; > + } u; > +}; > +#pragma pack(pop) Why not __packed ? > +/* RTAS pseries MCE error types */ > +#define PSERIES_MC_ERROR_TYPE_UE 0x00 > +#define PSERIES_MC_ERROR_TYPE_SLB 0x01 > +#define PSERIES_MC_ERROR_TYPE_ERAT 0x02 > +#define PSERIES_MC_ERROR_TYPE_TLB 0x04 > +#define PSERIES_MC_ERROR_TYPE_D_CACHE 0x05 > +#define PSERIES_MC_ERROR_TYPE_I_CACHE 0x07 Once these are in ras.c they can have less unwieldy names, ie. the PSERIES at least can be dropped. > +/* RTAS pseries MCE error sub types */ > +#define PSERIES_MC_ERROR_UE_INDETERMINATE 0 > +#define PSERIES_MC_ERROR_UE_IFETCH 1 > +#define PSERIES_MC_ERROR_UE_PAGE_TABLE_WALK_IFETCH 2 > +#define PSERIES_MC_ERROR_UE_LOAD_STORE 3 > +#define PSERIES_MC_ERROR_UE_PAGE_TABLE_WALK_LOAD_STORE 4 > + > +#define PSERIES_MC_ERROR_SLB_PARITY 0 > +#define PSERIES_MC_ERROR_SLB_MULTIHIT 1 > +#define PSERIES_MC_ERROR_SLB_INDETERMINATE 2 > + > +#define PSERIES_MC_ERROR_ERAT_PARITY 1 > +#define PSERIES_MC_ERROR_ERAT_MULTIHIT 2 > +#define PSERIES_MC_ERROR_ERAT_INDETERMINATE 3 > + > +#define PSERIES_MC_ERROR_TLB_PARITY 1 > +#define PSERIES_MC_ERROR_TLB_MULTIHIT 2 > +#define PSERIES_MC_ERROR_TLB_INDETERMINATE 3 > + > +static inline uint8_t rtas_mc_error_type(const struct pseries_mc_errorlog > *mlog) > +{ > + return mlog->error_type; > +} Why not just access it directly? > +static inline uint8_t rtas_mc_error_sub_type( > + const struct pseries_mc_errorlog *mlog) > +{ > + switch (mlog->error_type) { > + case PSERIES_MC_ERROR_TYPE_UE: > + return (mlog->u.ue_error.ue_err_type & 0x07); > + case PSERIES_MC_ERROR_TYPE_SLB: > + case PSERIES_MC_ERROR_TYPE_ERAT: > + case PSERIES_MC_ERROR_TYPE_TLB: > + return (mlog->u.soft_error.soft_err_type & 0x03); > + default: > + return 0; > + } > +} > + > +static inline uint64_t rtas_mc_get_effective_addr( > + const struct pseries_mc_errorlog *mlog) > +{ > + uint64_t addr = 0; That should be __be64. > + > + switch (mlog->error_type) { > + case PSERIES_MC_ERROR_TYPE_UE: > + if (mlog->u.ue_error.ue_err_type & 0x40) > + addr = mlog->u.ue_error.effective_address; > + break; > + case PSERIES_MC_ERROR_TYPE_SLB: > + case PSERIES_MC_ERROR_TYPE_ERAT: > + case PSERIES_MC_ERROR_TYPE_TLB: > + if (mlog->u.soft_error.soft_err_type & 0x80) > + addr = mlog->u.soft_error.effective_address; > + default: > + break; > + } > + return be64_to_cpu(addr); > +} > + > struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, > uint16_t section_id); > cheers