xref: /linux/drivers/gpu/drm/amd/include/amd_cper.h (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1*523b69c6SHawking Zhang /* SPDX-License-Identifier: GPL-2.0 */
2*523b69c6SHawking Zhang /*
3*523b69c6SHawking Zhang  * Copyright 2025 Advanced Micro Devices, Inc.
4*523b69c6SHawking Zhang  *
5*523b69c6SHawking Zhang  * Permission is hereby granted, free of charge, to any person obtaining a
6*523b69c6SHawking Zhang  * copy of this software and associated documentation files (the "Software"),
7*523b69c6SHawking Zhang  * to deal in the Software without restriction, including without limitation
8*523b69c6SHawking Zhang  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*523b69c6SHawking Zhang  * and/or sell copies of the Software, and to permit persons to whom the
10*523b69c6SHawking Zhang  * Software is furnished to do so, subject to the following conditions:
11*523b69c6SHawking Zhang  *
12*523b69c6SHawking Zhang  * The above copyright notice and this permission notice shall be included in
13*523b69c6SHawking Zhang  * all copies or substantial portions of the Software.
14*523b69c6SHawking Zhang  *
15*523b69c6SHawking Zhang  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*523b69c6SHawking Zhang  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*523b69c6SHawking Zhang  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*523b69c6SHawking Zhang  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*523b69c6SHawking Zhang  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*523b69c6SHawking Zhang  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*523b69c6SHawking Zhang  * OTHER DEALINGS IN THE SOFTWARE.
22*523b69c6SHawking Zhang  *
23*523b69c6SHawking Zhang  */
24*523b69c6SHawking Zhang #ifndef __AMD_CPER_H__
25*523b69c6SHawking Zhang #define __AMD_CPER_H__
26*523b69c6SHawking Zhang 
27*523b69c6SHawking Zhang #include <linux/uuid.h>
28*523b69c6SHawking Zhang 
29*523b69c6SHawking Zhang #define CPER_HDR_REV_1          (0x100)
30*523b69c6SHawking Zhang #define CPER_SEC_MINOR_REV_1    (0x01)
31*523b69c6SHawking Zhang #define CPER_SEC_MAJOR_REV_22   (0x22)
32*523b69c6SHawking Zhang #define CPER_MAX_OAM_COUNT      (8)
33*523b69c6SHawking Zhang 
34*523b69c6SHawking Zhang #define CPER_CTX_TYPE_CRASH     (1)
35*523b69c6SHawking Zhang #define CPER_CTX_TYPE_BOOT      (9)
36*523b69c6SHawking Zhang 
37*523b69c6SHawking Zhang #define CPER_CREATOR_ID_AMDGPU	"amdgpu"
38*523b69c6SHawking Zhang 
39*523b69c6SHawking Zhang #define CPER_NOTIFY_MCE                                               \
40*523b69c6SHawking Zhang 	GUID_INIT(0xE8F56FFE, 0x919C, 0x4cc5, 0xBA, 0x88, 0x65, 0xAB, \
41*523b69c6SHawking Zhang 		  0xE1, 0x49, 0x13, 0xBB)
42*523b69c6SHawking Zhang #define CPER_NOTIFY_CMC                                               \
43*523b69c6SHawking Zhang 	GUID_INIT(0x2DCE8BB1, 0xBDD7, 0x450e, 0xB9, 0xAD, 0x9C, 0xF4, \
44*523b69c6SHawking Zhang 		  0xEB, 0xD4, 0xF8, 0x90)
45*523b69c6SHawking Zhang #define BOOT_TYPE                                                     \
46*523b69c6SHawking Zhang 	GUID_INIT(0x3D61A466, 0xAB40, 0x409a, 0xA6, 0x98, 0xF3, 0x62, \
47*523b69c6SHawking Zhang 		  0xD4, 0x64, 0xB3, 0x8F)
48*523b69c6SHawking Zhang 
49*523b69c6SHawking Zhang #define AMD_CRASHDUMP                                                 \
50*523b69c6SHawking Zhang 	GUID_INIT(0x32AC0C78, 0x2623, 0x48F6, 0xB0, 0xD0, 0x73, 0x65, \
51*523b69c6SHawking Zhang 		  0x72, 0x5F, 0xD6, 0xAE)
52*523b69c6SHawking Zhang #define AMD_GPU_NONSTANDARD_ERROR                                     \
53*523b69c6SHawking Zhang 	GUID_INIT(0x32AC0C78, 0x2623, 0x48F6, 0x81, 0xA2, 0xAC, 0x69, \
54*523b69c6SHawking Zhang 		  0x17, 0x80, 0x55, 0x1D)
55*523b69c6SHawking Zhang #define PROC_ERR_SECTION_TYPE                                         \
56*523b69c6SHawking Zhang 	GUID_INIT(0xDC3EA0B0, 0xA144, 0x4797, 0xB9, 0x5B, 0x53, 0xFA, \
57*523b69c6SHawking Zhang 		  0x24, 0x2B, 0x6E, 0x1D)
58*523b69c6SHawking Zhang 
59*523b69c6SHawking Zhang enum cper_error_severity {
60*523b69c6SHawking Zhang 	CPER_SEV_NON_FATAL_UNCORRECTED = 0,
61*523b69c6SHawking Zhang 	CPER_SEV_FATAL                 = 1,
62*523b69c6SHawking Zhang 	CPER_SEV_NON_FATAL_CORRECTED   = 2,
63*523b69c6SHawking Zhang 	CPER_SEV_NUM                   = 3,
64*523b69c6SHawking Zhang 
65*523b69c6SHawking Zhang 	CPER_SEV_UNUSED = 10,
66*523b69c6SHawking Zhang };
67*523b69c6SHawking Zhang 
68*523b69c6SHawking Zhang enum cper_aca_reg {
69*523b69c6SHawking Zhang 	CPER_ACA_REG_CTL_LO    = 0,
70*523b69c6SHawking Zhang 	CPER_ACA_REG_CTL_HI    = 1,
71*523b69c6SHawking Zhang 	CPER_ACA_REG_STATUS_LO = 2,
72*523b69c6SHawking Zhang 	CPER_ACA_REG_STATUS_HI = 3,
73*523b69c6SHawking Zhang 	CPER_ACA_REG_ADDR_LO   = 4,
74*523b69c6SHawking Zhang 	CPER_ACA_REG_ADDR_HI   = 5,
75*523b69c6SHawking Zhang 	CPER_ACA_REG_MISC0_LO  = 6,
76*523b69c6SHawking Zhang 	CPER_ACA_REG_MISC0_HI  = 7,
77*523b69c6SHawking Zhang 	CPER_ACA_REG_CONFIG_LO = 8,
78*523b69c6SHawking Zhang 	CPER_ACA_REG_CONFIG_HI = 9,
79*523b69c6SHawking Zhang 	CPER_ACA_REG_IPID_LO   = 10,
80*523b69c6SHawking Zhang 	CPER_ACA_REG_IPID_HI   = 11,
81*523b69c6SHawking Zhang 	CPER_ACA_REG_SYND_LO   = 12,
82*523b69c6SHawking Zhang 	CPER_ACA_REG_SYND_HI   = 13,
83*523b69c6SHawking Zhang 
84*523b69c6SHawking Zhang 	CPER_ACA_REG_COUNT     = 32,
85*523b69c6SHawking Zhang };
86*523b69c6SHawking Zhang 
87*523b69c6SHawking Zhang #pragma pack(push, 1)
88*523b69c6SHawking Zhang 
89*523b69c6SHawking Zhang struct cper_timestamp {
90*523b69c6SHawking Zhang 	uint8_t seconds;
91*523b69c6SHawking Zhang 	uint8_t minutes;
92*523b69c6SHawking Zhang 	uint8_t hours;
93*523b69c6SHawking Zhang 	uint8_t flag;
94*523b69c6SHawking Zhang 	uint8_t day;
95*523b69c6SHawking Zhang 	uint8_t month;
96*523b69c6SHawking Zhang 	uint8_t year;
97*523b69c6SHawking Zhang 	uint8_t century;
98*523b69c6SHawking Zhang };
99*523b69c6SHawking Zhang 
100*523b69c6SHawking Zhang struct cper_hdr {
101*523b69c6SHawking Zhang 	char                     signature[4];  /* "CPER"  */
102*523b69c6SHawking Zhang 	uint16_t                 revision;
103*523b69c6SHawking Zhang 	uint32_t                 signature_end; /* 0xFFFFFFFF */
104*523b69c6SHawking Zhang 	uint16_t                 sec_cnt;
105*523b69c6SHawking Zhang 	enum cper_error_severity error_severity;
106*523b69c6SHawking Zhang 	union {
107*523b69c6SHawking Zhang 		struct {
108*523b69c6SHawking Zhang 			uint32_t platform_id	: 1;
109*523b69c6SHawking Zhang 			uint32_t timestamp	: 1;
110*523b69c6SHawking Zhang 			uint32_t partition_id	: 1;
111*523b69c6SHawking Zhang 			uint32_t reserved	: 29;
112*523b69c6SHawking Zhang 		} valid_bits;
113*523b69c6SHawking Zhang 		uint32_t valid_mask;
114*523b69c6SHawking Zhang 	};
115*523b69c6SHawking Zhang 	uint32_t		record_length;    /* Total size of CPER Entry */
116*523b69c6SHawking Zhang 	struct cper_timestamp	timestamp;
117*523b69c6SHawking Zhang 	char			platform_id[16];
118*523b69c6SHawking Zhang 	guid_t			partition_id;     /* Reserved */
119*523b69c6SHawking Zhang 	char			creator_id[16];
120*523b69c6SHawking Zhang 	guid_t			notify_type;      /* CMC, MCE */
121*523b69c6SHawking Zhang 	char			record_id[8];     /* Unique CPER Entry ID */
122*523b69c6SHawking Zhang 	uint32_t		flags;            /* Reserved */
123*523b69c6SHawking Zhang 	uint64_t		persistence_info; /* Reserved */
124*523b69c6SHawking Zhang 	uint8_t			reserved[12];     /* Reserved */
125*523b69c6SHawking Zhang };
126*523b69c6SHawking Zhang 
127*523b69c6SHawking Zhang struct cper_sec_desc {
128*523b69c6SHawking Zhang 	uint32_t sec_offset;     /* Offset from the start of CPER entry */
129*523b69c6SHawking Zhang 	uint32_t sec_length;
130*523b69c6SHawking Zhang 	uint8_t  revision_minor; /* CPER_SEC_MINOR_REV_1 */
131*523b69c6SHawking Zhang 	uint8_t  revision_major; /* CPER_SEC_MAJOR_REV_22 */
132*523b69c6SHawking Zhang 	union {
133*523b69c6SHawking Zhang 		struct {
134*523b69c6SHawking Zhang 			uint8_t fru_id		: 1;
135*523b69c6SHawking Zhang 			uint8_t fru_text	: 1;
136*523b69c6SHawking Zhang 			uint8_t reserved	: 6;
137*523b69c6SHawking Zhang 		} valid_bits;
138*523b69c6SHawking Zhang 		uint8_t valid_mask;
139*523b69c6SHawking Zhang 	};
140*523b69c6SHawking Zhang 	uint8_t reserved;
141*523b69c6SHawking Zhang 	union {
142*523b69c6SHawking Zhang 		struct {
143*523b69c6SHawking Zhang 			uint32_t primary		: 1;
144*523b69c6SHawking Zhang 			uint32_t reserved1		: 2;
145*523b69c6SHawking Zhang 			uint32_t exceed_err_threshold	: 1;
146*523b69c6SHawking Zhang 			uint32_t latent_err		: 1;
147*523b69c6SHawking Zhang 			uint32_t reserved2		: 27;
148*523b69c6SHawking Zhang 		} flag_bits;
149*523b69c6SHawking Zhang 		uint32_t flag_mask;
150*523b69c6SHawking Zhang 	};
151*523b69c6SHawking Zhang 	guid_t				sec_type;
152*523b69c6SHawking Zhang 	char				fru_id[16];
153*523b69c6SHawking Zhang 	enum cper_error_severity	severity;
154*523b69c6SHawking Zhang 	char				fru_text[20];
155*523b69c6SHawking Zhang };
156*523b69c6SHawking Zhang 
157*523b69c6SHawking Zhang struct cper_sec_nonstd_err_hdr {
158*523b69c6SHawking Zhang 	union {
159*523b69c6SHawking Zhang 		struct {
160*523b69c6SHawking Zhang 			uint64_t apic_id		: 1;
161*523b69c6SHawking Zhang 			uint64_t fw_id			: 1;
162*523b69c6SHawking Zhang 			uint64_t err_info_cnt		: 6;
163*523b69c6SHawking Zhang 			uint64_t err_context_cnt	: 6;
164*523b69c6SHawking Zhang 		} valid_bits;
165*523b69c6SHawking Zhang 		uint64_t valid_mask;
166*523b69c6SHawking Zhang 	};
167*523b69c6SHawking Zhang 	uint64_t apic_id;
168*523b69c6SHawking Zhang 	char     fw_id[48];
169*523b69c6SHawking Zhang };
170*523b69c6SHawking Zhang 
171*523b69c6SHawking Zhang struct cper_sec_nonstd_err_info {
172*523b69c6SHawking Zhang 	guid_t error_type;
173*523b69c6SHawking Zhang 	union {
174*523b69c6SHawking Zhang 		struct {
175*523b69c6SHawking Zhang 			uint64_t ms_chk			: 1;
176*523b69c6SHawking Zhang 			uint64_t target_addr_id		: 1;
177*523b69c6SHawking Zhang 			uint64_t req_id			: 1;
178*523b69c6SHawking Zhang 			uint64_t resp_id		: 1;
179*523b69c6SHawking Zhang 			uint64_t instr_ptr		: 1;
180*523b69c6SHawking Zhang 			uint64_t reserved		: 59;
181*523b69c6SHawking Zhang 		} valid_bits;
182*523b69c6SHawking Zhang 		uint64_t        valid_mask;
183*523b69c6SHawking Zhang 	};
184*523b69c6SHawking Zhang 	union {
185*523b69c6SHawking Zhang 		struct {
186*523b69c6SHawking Zhang 			uint64_t err_type_valid		: 1;
187*523b69c6SHawking Zhang 			uint64_t pcc_valid		: 1;
188*523b69c6SHawking Zhang 			uint64_t uncorr_valid		: 1;
189*523b69c6SHawking Zhang 			uint64_t precise_ip_valid	: 1;
190*523b69c6SHawking Zhang 			uint64_t restartable_ip_valid	: 1;
191*523b69c6SHawking Zhang 			uint64_t overflow_valid		: 1;
192*523b69c6SHawking Zhang 			uint64_t reserved1		: 10;
193*523b69c6SHawking Zhang 			uint64_t err_type		: 2;
194*523b69c6SHawking Zhang 			uint64_t pcc			: 1;
195*523b69c6SHawking Zhang 			uint64_t uncorr			: 1;
196*523b69c6SHawking Zhang 			uint64_t precised_ip		: 1;
197*523b69c6SHawking Zhang 			uint64_t restartable_ip		: 1;
198*523b69c6SHawking Zhang 			uint64_t overflow		: 1;
199*523b69c6SHawking Zhang 			uint64_t reserved2		: 41;
200*523b69c6SHawking Zhang 		} ms_chk_bits;
201*523b69c6SHawking Zhang 		uint64_t ms_chk_mask;
202*523b69c6SHawking Zhang 	};
203*523b69c6SHawking Zhang 	uint64_t target_addr_id;
204*523b69c6SHawking Zhang 	uint64_t req_id;
205*523b69c6SHawking Zhang 	uint64_t resp_id;
206*523b69c6SHawking Zhang 	uint64_t instr_ptr;
207*523b69c6SHawking Zhang };
208*523b69c6SHawking Zhang 
209*523b69c6SHawking Zhang struct cper_sec_nonstd_err_ctx {
210*523b69c6SHawking Zhang 	uint16_t reg_ctx_type;
211*523b69c6SHawking Zhang 	uint16_t reg_arr_size;
212*523b69c6SHawking Zhang 	uint32_t msr_addr;
213*523b69c6SHawking Zhang 	uint64_t mm_reg_addr;
214*523b69c6SHawking Zhang 	uint32_t reg_dump[CPER_ACA_REG_COUNT];
215*523b69c6SHawking Zhang };
216*523b69c6SHawking Zhang 
217*523b69c6SHawking Zhang struct cper_sec_nonstd_err {
218*523b69c6SHawking Zhang 	struct cper_sec_nonstd_err_hdr  hdr;
219*523b69c6SHawking Zhang 	struct cper_sec_nonstd_err_info info;
220*523b69c6SHawking Zhang 	struct cper_sec_nonstd_err_ctx  ctx;
221*523b69c6SHawking Zhang };
222*523b69c6SHawking Zhang 
223*523b69c6SHawking Zhang struct cper_sec_crashdump_hdr {
224*523b69c6SHawking Zhang 	uint64_t reserved1;
225*523b69c6SHawking Zhang 	uint64_t reserved2;
226*523b69c6SHawking Zhang 	char     fw_id[48];
227*523b69c6SHawking Zhang 	uint64_t reserved3[8];
228*523b69c6SHawking Zhang };
229*523b69c6SHawking Zhang 
230*523b69c6SHawking Zhang struct cper_sec_crashdump_reg_data {
231*523b69c6SHawking Zhang 	uint32_t status_lo;
232*523b69c6SHawking Zhang 	uint32_t status_hi;
233*523b69c6SHawking Zhang 	uint32_t addr_lo;
234*523b69c6SHawking Zhang 	uint32_t addr_hi;
235*523b69c6SHawking Zhang 	uint32_t ipid_lo;
236*523b69c6SHawking Zhang 	uint32_t ipid_hi;
237*523b69c6SHawking Zhang 	uint32_t synd_lo;
238*523b69c6SHawking Zhang 	uint32_t synd_hi;
239*523b69c6SHawking Zhang };
240*523b69c6SHawking Zhang 
241*523b69c6SHawking Zhang struct cper_sec_crashdump_body_fatal {
242*523b69c6SHawking Zhang 	uint16_t                           reg_ctx_type;
243*523b69c6SHawking Zhang 	uint16_t                           reg_arr_size;
244*523b69c6SHawking Zhang 	uint32_t                           reserved1;
245*523b69c6SHawking Zhang 	uint64_t                           reserved2;
246*523b69c6SHawking Zhang 	struct cper_sec_crashdump_reg_data data;
247*523b69c6SHawking Zhang };
248*523b69c6SHawking Zhang 
249*523b69c6SHawking Zhang struct cper_sec_crashdump_body_boot {
250*523b69c6SHawking Zhang 	uint16_t reg_ctx_type;
251*523b69c6SHawking Zhang 	uint16_t reg_arr_size;
252*523b69c6SHawking Zhang 	uint32_t reserved1;
253*523b69c6SHawking Zhang 	uint64_t reserved2;
254*523b69c6SHawking Zhang 	uint64_t msg[CPER_MAX_OAM_COUNT];
255*523b69c6SHawking Zhang };
256*523b69c6SHawking Zhang 
257*523b69c6SHawking Zhang struct cper_sec_crashdump_fatal {
258*523b69c6SHawking Zhang 	struct cper_sec_crashdump_hdr        hdr;
259*523b69c6SHawking Zhang 	struct cper_sec_crashdump_body_fatal body;
260*523b69c6SHawking Zhang };
261*523b69c6SHawking Zhang 
262*523b69c6SHawking Zhang struct cper_sec_crashdump_boot {
263*523b69c6SHawking Zhang 	struct cper_sec_crashdump_hdr       hdr;
264*523b69c6SHawking Zhang 	struct cper_sec_crashdump_body_boot body;
265*523b69c6SHawking Zhang };
266*523b69c6SHawking Zhang 
267*523b69c6SHawking Zhang #pragma pack(pop)
268*523b69c6SHawking Zhang 
269*523b69c6SHawking Zhang #endif
270