18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _EDAC_MCE_AMD_H
38c2ecf20Sopenharmony_ci#define _EDAC_MCE_AMD_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/notifier.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <asm/mce.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#define EC(x)				((x) & 0xffff)
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define LOW_SYNDROME(x)			(((x) >> 15) & 0xff)
128c2ecf20Sopenharmony_ci#define HIGH_SYNDROME(x)		(((x) >> 24) & 0xff)
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#define TLB_ERROR(x)			(((x) & 0xFFF0) == 0x0010)
158c2ecf20Sopenharmony_ci#define MEM_ERROR(x)			(((x) & 0xFF00) == 0x0100)
168c2ecf20Sopenharmony_ci#define BUS_ERROR(x)			(((x) & 0xF800) == 0x0800)
178c2ecf20Sopenharmony_ci#define INT_ERROR(x)			(((x) & 0xF4FF) == 0x0400)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define TT(x)				(((x) >> 2) & 0x3)
208c2ecf20Sopenharmony_ci#define TT_MSG(x)			tt_msgs[TT(x)]
218c2ecf20Sopenharmony_ci#define II(x)				(((x) >> 2) & 0x3)
228c2ecf20Sopenharmony_ci#define II_MSG(x)			ii_msgs[II(x)]
238c2ecf20Sopenharmony_ci#define LL(x)				((x) & 0x3)
248c2ecf20Sopenharmony_ci#define LL_MSG(x)			ll_msgs[LL(x)]
258c2ecf20Sopenharmony_ci#define TO(x)				(((x) >> 8) & 0x1)
268c2ecf20Sopenharmony_ci#define TO_MSG(x)			to_msgs[TO(x)]
278c2ecf20Sopenharmony_ci#define PP(x)				(((x) >> 9) & 0x3)
288c2ecf20Sopenharmony_ci#define PP_MSG(x)			pp_msgs[PP(x)]
298c2ecf20Sopenharmony_ci#define UU(x)				(((x) >> 8) & 0x3)
308c2ecf20Sopenharmony_ci#define UU_MSG(x)			uu_msgs[UU(x)]
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define R4(x)				(((x) >> 4) & 0xf)
338c2ecf20Sopenharmony_ci#define R4_MSG(x)			((R4(x) < 9) ?  rrrr_msgs[R4(x)] : "Wrong R4!")
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ciextern const char * const pp_msgs[];
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cienum tt_ids {
388c2ecf20Sopenharmony_ci	TT_INSTR = 0,
398c2ecf20Sopenharmony_ci	TT_DATA,
408c2ecf20Sopenharmony_ci	TT_GEN,
418c2ecf20Sopenharmony_ci	TT_RESV,
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cienum ll_ids {
458c2ecf20Sopenharmony_ci	LL_RESV = 0,
468c2ecf20Sopenharmony_ci	LL_L1,
478c2ecf20Sopenharmony_ci	LL_L2,
488c2ecf20Sopenharmony_ci	LL_LG,
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cienum ii_ids {
528c2ecf20Sopenharmony_ci	II_MEM = 0,
538c2ecf20Sopenharmony_ci	II_RESV,
548c2ecf20Sopenharmony_ci	II_IO,
558c2ecf20Sopenharmony_ci	II_GEN,
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cienum rrrr_ids {
598c2ecf20Sopenharmony_ci	R4_GEN	= 0,
608c2ecf20Sopenharmony_ci	R4_RD,
618c2ecf20Sopenharmony_ci	R4_WR,
628c2ecf20Sopenharmony_ci	R4_DRD,
638c2ecf20Sopenharmony_ci	R4_DWR,
648c2ecf20Sopenharmony_ci	R4_IRD,
658c2ecf20Sopenharmony_ci	R4_PREF,
668c2ecf20Sopenharmony_ci	R4_EVICT,
678c2ecf20Sopenharmony_ci	R4_SNOOP,
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/*
718c2ecf20Sopenharmony_ci * per-family decoder ops
728c2ecf20Sopenharmony_ci */
738c2ecf20Sopenharmony_cistruct amd_decoder_ops {
748c2ecf20Sopenharmony_ci	bool (*mc0_mce)(u16, u8);
758c2ecf20Sopenharmony_ci	bool (*mc1_mce)(u16, u8);
768c2ecf20Sopenharmony_ci	bool (*mc2_mce)(u16, u8);
778c2ecf20Sopenharmony_ci};
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_civoid amd_register_ecc_decoder(void (*f)(int, struct mce *));
808c2ecf20Sopenharmony_civoid amd_unregister_ecc_decoder(void (*f)(int, struct mce *));
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#endif /* _EDAC_MCE_AMD_H */
83