1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 247ca08a4SBorislav Petkov #ifndef _EDAC_MCE_AMD_H 347ca08a4SBorislav Petkov #define _EDAC_MCE_AMD_H 447ca08a4SBorislav Petkov 547ca08a4SBorislav Petkov #include <linux/notifier.h> 647ca08a4SBorislav Petkov 747ca08a4SBorislav Petkov #include <asm/mce.h> 847ca08a4SBorislav Petkov 962452882SBorislav Petkov #define EC(x) ((x) & 0xffff) 1047ca08a4SBorislav Petkov 1147ca08a4SBorislav Petkov #define LOW_SYNDROME(x) (((x) >> 15) & 0xff) 1247ca08a4SBorislav Petkov #define HIGH_SYNDROME(x) (((x) >> 24) & 0xff) 1347ca08a4SBorislav Petkov 1447ca08a4SBorislav Petkov #define TLB_ERROR(x) (((x) & 0xFFF0) == 0x0010) 1547ca08a4SBorislav Petkov #define MEM_ERROR(x) (((x) & 0xFF00) == 0x0100) 1647ca08a4SBorislav Petkov #define BUS_ERROR(x) (((x) & 0xF800) == 0x0800) 17980eec8bSJacob Shin #define INT_ERROR(x) (((x) & 0xF4FF) == 0x0400) 1847ca08a4SBorislav Petkov 1947ca08a4SBorislav Petkov #define TT(x) (((x) >> 2) & 0x3) 2047ca08a4SBorislav Petkov #define TT_MSG(x) tt_msgs[TT(x)] 2147ca08a4SBorislav Petkov #define II(x) (((x) >> 2) & 0x3) 2247ca08a4SBorislav Petkov #define II_MSG(x) ii_msgs[II(x)] 2362452882SBorislav Petkov #define LL(x) ((x) & 0x3) 2447ca08a4SBorislav Petkov #define LL_MSG(x) ll_msgs[LL(x)] 2547ca08a4SBorislav Petkov #define TO(x) (((x) >> 8) & 0x1) 2647ca08a4SBorislav Petkov #define TO_MSG(x) to_msgs[TO(x)] 2747ca08a4SBorislav Petkov #define PP(x) (((x) >> 9) & 0x3) 2847ca08a4SBorislav Petkov #define PP_MSG(x) pp_msgs[PP(x)] 29980eec8bSJacob Shin #define UU(x) (((x) >> 8) & 0x3) 30980eec8bSJacob Shin #define UU_MSG(x) uu_msgs[UU(x)] 3147ca08a4SBorislav Petkov 3262452882SBorislav Petkov #define R4(x) (((x) >> 4) & 0xf) 3362452882SBorislav Petkov #define R4_MSG(x) ((R4(x) < 9) ? rrrr_msgs[R4(x)] : "Wrong R4!") 3447ca08a4SBorislav Petkov 350f08669eSBorislav Petkov extern const char * const pp_msgs[]; 360f08669eSBorislav Petkov 37888ab8e6SBorislav Petkov enum tt_ids { 38888ab8e6SBorislav Petkov TT_INSTR = 0, 39888ab8e6SBorislav Petkov TT_DATA, 40888ab8e6SBorislav Petkov TT_GEN, 41888ab8e6SBorislav Petkov TT_RESV, 42888ab8e6SBorislav Petkov }; 43888ab8e6SBorislav Petkov 44888ab8e6SBorislav Petkov enum ll_ids { 45888ab8e6SBorislav Petkov LL_RESV = 0, 46888ab8e6SBorislav Petkov LL_L1, 47888ab8e6SBorislav Petkov LL_L2, 48888ab8e6SBorislav Petkov LL_LG, 49888ab8e6SBorislav Petkov }; 50888ab8e6SBorislav Petkov 51888ab8e6SBorislav Petkov enum ii_ids { 52888ab8e6SBorislav Petkov II_MEM = 0, 53888ab8e6SBorislav Petkov II_RESV, 54888ab8e6SBorislav Petkov II_IO, 55888ab8e6SBorislav Petkov II_GEN, 56888ab8e6SBorislav Petkov }; 57888ab8e6SBorislav Petkov 58888ab8e6SBorislav Petkov enum rrrr_ids { 59888ab8e6SBorislav Petkov R4_GEN = 0, 60888ab8e6SBorislav Petkov R4_RD, 61888ab8e6SBorislav Petkov R4_WR, 62888ab8e6SBorislav Petkov R4_DRD, 63888ab8e6SBorislav Petkov R4_DWR, 64888ab8e6SBorislav Petkov R4_IRD, 65888ab8e6SBorislav Petkov R4_PREF, 66888ab8e6SBorislav Petkov R4_EVICT, 67888ab8e6SBorislav Petkov R4_SNOOP, 68888ab8e6SBorislav Petkov }; 69888ab8e6SBorislav Petkov 7047ca08a4SBorislav Petkov /* 71888ab8e6SBorislav Petkov * per-family decoder ops 72888ab8e6SBorislav Petkov */ 73888ab8e6SBorislav Petkov struct amd_decoder_ops { 74f05c41a9SBorislav Petkov bool (*mc0_mce)(u16, u8); 75f05c41a9SBorislav Petkov bool (*mc1_mce)(u16, u8); 764a73d3deSJacob Shin bool (*mc2_mce)(u16, u8); 77888ab8e6SBorislav Petkov }; 78888ab8e6SBorislav Petkov 79b0b07a2bSBorislav Petkov void amd_register_ecc_decoder(void (*f)(int, struct mce *)); 80b0b07a2bSBorislav Petkov void amd_unregister_ecc_decoder(void (*f)(int, struct mce *)); 8147ca08a4SBorislav Petkov 8247ca08a4SBorislav Petkov #endif /* _EDAC_MCE_AMD_H */ 83