xref: /aosp_15_r20/external/libdrm/tests/amdgpu/ras_tests.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright 2017 Advanced Micro Devices, Inc.
3*7688df22SAndroid Build Coastguard Worker  *
4*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker  *
11*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker  *
14*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7688df22SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker  *
22*7688df22SAndroid Build Coastguard Worker */
23*7688df22SAndroid Build Coastguard Worker 
24*7688df22SAndroid Build Coastguard Worker #include "CUnit/Basic.h"
25*7688df22SAndroid Build Coastguard Worker 
26*7688df22SAndroid Build Coastguard Worker #include "amdgpu_test.h"
27*7688df22SAndroid Build Coastguard Worker #include "amdgpu_drm.h"
28*7688df22SAndroid Build Coastguard Worker #include "amdgpu_internal.h"
29*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
30*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
31*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
32*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
33*7688df22SAndroid Build Coastguard Worker #include <limits.h>
34*7688df22SAndroid Build Coastguard Worker 
35*7688df22SAndroid Build Coastguard Worker #define PATH_SIZE PATH_MAX
36*7688df22SAndroid Build Coastguard Worker 
37*7688df22SAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
38*7688df22SAndroid Build Coastguard Worker 
39*7688df22SAndroid Build Coastguard Worker const char *ras_block_string[] = {
40*7688df22SAndroid Build Coastguard Worker 	"umc",
41*7688df22SAndroid Build Coastguard Worker 	"sdma",
42*7688df22SAndroid Build Coastguard Worker 	"gfx",
43*7688df22SAndroid Build Coastguard Worker 	"mmhub",
44*7688df22SAndroid Build Coastguard Worker 	"athub",
45*7688df22SAndroid Build Coastguard Worker 	"pcie_bif",
46*7688df22SAndroid Build Coastguard Worker 	"hdp",
47*7688df22SAndroid Build Coastguard Worker 	"xgmi_wafl",
48*7688df22SAndroid Build Coastguard Worker 	"df",
49*7688df22SAndroid Build Coastguard Worker 	"smn",
50*7688df22SAndroid Build Coastguard Worker 	"sem",
51*7688df22SAndroid Build Coastguard Worker 	"mp0",
52*7688df22SAndroid Build Coastguard Worker 	"mp1",
53*7688df22SAndroid Build Coastguard Worker 	"fuse",
54*7688df22SAndroid Build Coastguard Worker };
55*7688df22SAndroid Build Coastguard Worker 
56*7688df22SAndroid Build Coastguard Worker #define ras_block_str(i) (ras_block_string[i])
57*7688df22SAndroid Build Coastguard Worker 
58*7688df22SAndroid Build Coastguard Worker enum amdgpu_ras_block {
59*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__UMC = 0,
60*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__SDMA,
61*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX,
62*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__MMHUB,
63*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__ATHUB,
64*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__PCIE_BIF,
65*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__HDP,
66*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__XGMI_WAFL,
67*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__DF,
68*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__SMN,
69*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__SEM,
70*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__MP0,
71*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__MP1,
72*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__FUSE,
73*7688df22SAndroid Build Coastguard Worker 
74*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__LAST
75*7688df22SAndroid Build Coastguard Worker };
76*7688df22SAndroid Build Coastguard Worker 
77*7688df22SAndroid Build Coastguard Worker #define AMDGPU_RAS_BLOCK_COUNT  AMDGPU_RAS_BLOCK__LAST
78*7688df22SAndroid Build Coastguard Worker #define AMDGPU_RAS_BLOCK_MASK   ((1ULL << AMDGPU_RAS_BLOCK_COUNT) - 1)
79*7688df22SAndroid Build Coastguard Worker 
80*7688df22SAndroid Build Coastguard Worker enum amdgpu_ras_gfx_subblock {
81*7688df22SAndroid Build Coastguard Worker 	/* CPC */
82*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_START = 0,
83*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPC_SCRATCH =
84*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_START,
85*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPC_UCODE,
86*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_STATE_ME1,
87*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_CSINVOC_ME1,
88*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME1,
89*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_STATE_ME2,
90*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_CSINVOC_ME2,
91*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME2,
92*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPC_INDEX_END =
93*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_DC_RESTORE_ME2,
94*7688df22SAndroid Build Coastguard Worker 	/* CPF */
95*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_START,
96*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPF_ROQ_ME2 =
97*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_START,
98*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPF_ROQ_ME1,
99*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPF_TAG,
100*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPF_INDEX_END = AMDGPU_RAS_BLOCK__GFX_CPF_TAG,
101*7688df22SAndroid Build Coastguard Worker 	/* CPG */
102*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_START,
103*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPG_DMA_ROQ =
104*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_START,
105*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPG_DMA_TAG,
106*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPG_TAG,
107*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_CPG_INDEX_END = AMDGPU_RAS_BLOCK__GFX_CPG_TAG,
108*7688df22SAndroid Build Coastguard Worker 	/* GDS */
109*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_START,
110*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_MEM = AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_START,
111*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_INPUT_QUEUE,
112*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_OA_PHY_CMD_RAM_MEM,
113*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_OA_PHY_DATA_RAM_MEM,
114*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
115*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_GDS_INDEX_END =
116*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
117*7688df22SAndroid Build Coastguard Worker 	/* SPI */
118*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SPI_SR_MEM,
119*7688df22SAndroid Build Coastguard Worker 	/* SQ */
120*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_START,
121*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_SGPR = AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_START,
122*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_LDS_D,
123*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_LDS_I,
124*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_VGPR,
125*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQ_INDEX_END = AMDGPU_RAS_BLOCK__GFX_SQ_VGPR,
126*7688df22SAndroid Build Coastguard Worker 	/* SQC (3 ranges) */
127*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_START,
128*7688df22SAndroid Build Coastguard Worker 	/* SQC range 0 */
129*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_START =
130*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_START,
131*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_UTCL1_LFIFO =
132*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_START,
133*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU0_WRITE_DATA_BUF,
134*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU0_UTCL1_LFIFO,
135*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU1_WRITE_DATA_BUF,
136*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU1_UTCL1_LFIFO,
137*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_WRITE_DATA_BUF,
138*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
139*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX0_END =
140*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
141*7688df22SAndroid Build Coastguard Worker 	/* SQC range 1 */
142*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_START,
143*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_TAG_RAM =
144*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_START,
145*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO,
146*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_MISS_FIFO,
147*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_BANK_RAM,
148*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_TAG_RAM,
149*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_HIT_FIFO,
150*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_MISS_FIFO,
151*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM,
152*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
153*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX1_END =
154*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
155*7688df22SAndroid Build Coastguard Worker 	/* SQC range 2 */
156*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_START,
157*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_TAG_RAM =
158*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_START,
159*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO,
160*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_MISS_FIFO,
161*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_BANK_RAM,
162*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_TAG_RAM,
163*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_HIT_FIFO,
164*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_MISS_FIFO,
165*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM,
166*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
167*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_END =
168*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
169*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_SQC_INDEX_END =
170*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_SQC_INDEX2_END,
171*7688df22SAndroid Build Coastguard Worker 	/* TA */
172*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_INDEX_START,
173*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_FS_DFIFO =
174*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TA_INDEX_START,
175*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_FS_AFIFO,
176*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_FL_LFIFO,
177*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_FX_LFIFO,
178*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_FS_CFIFO,
179*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TA_INDEX_END = AMDGPU_RAS_BLOCK__GFX_TA_FS_CFIFO,
180*7688df22SAndroid Build Coastguard Worker 	/* TCA */
181*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_START,
182*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCA_HOLE_FIFO =
183*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_START,
184*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCA_REQ_FIFO,
185*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCA_INDEX_END =
186*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCA_REQ_FIFO,
187*7688df22SAndroid Build Coastguard Worker 	/* TCC (5 sub-ranges) */
188*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_START,
189*7688df22SAndroid Build Coastguard Worker 	/* TCC range 0 */
190*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_START =
191*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_START,
192*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA =
193*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_START,
194*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_0_1,
195*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_0,
196*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_1,
197*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_0,
198*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_1,
199*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_HIGH_RATE_TAG,
200*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
201*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX0_END =
202*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
203*7688df22SAndroid Build Coastguard Worker 	/* TCC range 1 */
204*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_START,
205*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_DEC =
206*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_START,
207*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
208*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX1_END =
209*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
210*7688df22SAndroid Build Coastguard Worker 	/* TCC range 2 */
211*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_START,
212*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_RETURN_DATA =
213*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_START,
214*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_RETURN_CONTROL,
215*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_UC_ATOMIC_FIFO,
216*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_WRITE_RETURN,
217*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_WRITE_CACHE_READ,
218*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_SRC_FIFO,
219*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_SRC_FIFO_NEXT_RAM,
220*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
221*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX2_END =
222*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
223*7688df22SAndroid Build Coastguard Worker 	/* TCC range 3 */
224*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_START,
225*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO =
226*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_START,
227*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
228*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX3_END =
229*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
230*7688df22SAndroid Build Coastguard Worker 	/* TCC range 4 */
231*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_START,
232*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_WRRET_TAG_WRITE_RETURN =
233*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_START,
234*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
235*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_END =
236*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
237*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCC_INDEX_END =
238*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCC_INDEX4_END,
239*7688df22SAndroid Build Coastguard Worker 	/* TCI */
240*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCI_WRITE_RAM,
241*7688df22SAndroid Build Coastguard Worker 	/* TCP */
242*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_START,
243*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_CACHE_RAM =
244*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_START,
245*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_LFIFO_RAM,
246*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_CMD_FIFO,
247*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_VM_FIFO,
248*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_DB_RAM,
249*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO0,
250*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
251*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TCP_INDEX_END =
252*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
253*7688df22SAndroid Build Coastguard Worker 	/* TD */
254*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TD_INDEX_START,
255*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TD_SS_FIFO_LO =
256*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_TD_INDEX_START,
257*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TD_SS_FIFO_HI,
258*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TD_CS_FIFO,
259*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_TD_INDEX_END = AMDGPU_RAS_BLOCK__GFX_TD_CS_FIFO,
260*7688df22SAndroid Build Coastguard Worker 	/* EA (3 sub-ranges) */
261*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX_START,
262*7688df22SAndroid Build Coastguard Worker 	/* EA range 0 */
263*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_START =
264*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_INDEX_START,
265*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_DRAMRD_CMDMEM =
266*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_START,
267*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_CMDMEM,
268*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_DATAMEM,
269*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_RRET_TAGMEM,
270*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_WRET_TAGMEM,
271*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_GMIRD_CMDMEM,
272*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_CMDMEM,
273*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
274*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX0_END =
275*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
276*7688df22SAndroid Build Coastguard Worker 	/* EA range 1 */
277*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_START,
278*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_DRAMRD_PAGEMEM =
279*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_START,
280*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_DRAMWR_PAGEMEM,
281*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_IORD_CMDMEM,
282*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_IOWR_CMDMEM,
283*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_IOWR_DATAMEM,
284*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_GMIRD_PAGEMEM,
285*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
286*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX1_END =
287*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
288*7688df22SAndroid Build Coastguard Worker 	/* EA range 2 */
289*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_START,
290*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_MAM_D0MEM =
291*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_START,
292*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_MAM_D1MEM,
293*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_MAM_D2MEM,
294*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_MAM_D3MEM,
295*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_END =
296*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_MAM_D3MEM,
297*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_EA_INDEX_END =
298*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_BLOCK__GFX_EA_INDEX2_END,
299*7688df22SAndroid Build Coastguard Worker 	/* UTC VM L2 bank */
300*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__UTC_VML2_BANK_CACHE,
301*7688df22SAndroid Build Coastguard Worker 	/* UTC VM walker */
302*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__UTC_VML2_WALKER,
303*7688df22SAndroid Build Coastguard Worker 	/* UTC ATC L2 2MB cache */
304*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__UTC_ATCL2_CACHE_2M_BANK,
305*7688df22SAndroid Build Coastguard Worker 	/* UTC ATC L2 4KB cache */
306*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__UTC_ATCL2_CACHE_4K_BANK,
307*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_BLOCK__GFX_MAX
308*7688df22SAndroid Build Coastguard Worker };
309*7688df22SAndroid Build Coastguard Worker 
310*7688df22SAndroid Build Coastguard Worker enum amdgpu_ras_error_type {
311*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_ERROR__NONE					= 0,
312*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_ERROR__PARITY				= 1,
313*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE			= 2,
314*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE			= 4,
315*7688df22SAndroid Build Coastguard Worker 	AMDGPU_RAS_ERROR__POISON				= 8,
316*7688df22SAndroid Build Coastguard Worker };
317*7688df22SAndroid Build Coastguard Worker 
318*7688df22SAndroid Build Coastguard Worker struct ras_inject_test_config {
319*7688df22SAndroid Build Coastguard Worker 	char name[64];
320*7688df22SAndroid Build Coastguard Worker 	char block[32];
321*7688df22SAndroid Build Coastguard Worker 	int sub_block;
322*7688df22SAndroid Build Coastguard Worker 	enum amdgpu_ras_error_type type;
323*7688df22SAndroid Build Coastguard Worker 	uint64_t address;
324*7688df22SAndroid Build Coastguard Worker 	uint64_t value;
325*7688df22SAndroid Build Coastguard Worker };
326*7688df22SAndroid Build Coastguard Worker 
327*7688df22SAndroid Build Coastguard Worker struct ras_common_if {
328*7688df22SAndroid Build Coastguard Worker 	enum amdgpu_ras_block block;
329*7688df22SAndroid Build Coastguard Worker 	enum amdgpu_ras_error_type type;
330*7688df22SAndroid Build Coastguard Worker 	uint32_t sub_block_index;
331*7688df22SAndroid Build Coastguard Worker 	char name[32];
332*7688df22SAndroid Build Coastguard Worker };
333*7688df22SAndroid Build Coastguard Worker 
334*7688df22SAndroid Build Coastguard Worker struct ras_inject_if {
335*7688df22SAndroid Build Coastguard Worker 	struct ras_common_if head;
336*7688df22SAndroid Build Coastguard Worker 	uint64_t address;
337*7688df22SAndroid Build Coastguard Worker 	uint64_t value;
338*7688df22SAndroid Build Coastguard Worker };
339*7688df22SAndroid Build Coastguard Worker 
340*7688df22SAndroid Build Coastguard Worker struct ras_debug_if {
341*7688df22SAndroid Build Coastguard Worker 	union {
342*7688df22SAndroid Build Coastguard Worker 		struct ras_common_if head;
343*7688df22SAndroid Build Coastguard Worker 		struct ras_inject_if inject;
344*7688df22SAndroid Build Coastguard Worker 	};
345*7688df22SAndroid Build Coastguard Worker 	int op;
346*7688df22SAndroid Build Coastguard Worker };
347*7688df22SAndroid Build Coastguard Worker /* for now, only umc, gfx, sdma has implemented. */
348*7688df22SAndroid Build Coastguard Worker #define DEFAULT_RAS_BLOCK_MASK_INJECT ((1 << AMDGPU_RAS_BLOCK__UMC) |\
349*7688df22SAndroid Build Coastguard Worker 		(1 << AMDGPU_RAS_BLOCK__GFX))
350*7688df22SAndroid Build Coastguard Worker #define DEFAULT_RAS_BLOCK_MASK_QUERY ((1 << AMDGPU_RAS_BLOCK__UMC) |\
351*7688df22SAndroid Build Coastguard Worker 		(1 << AMDGPU_RAS_BLOCK__GFX))
352*7688df22SAndroid Build Coastguard Worker #define DEFAULT_RAS_BLOCK_MASK_BASIC (1 << AMDGPU_RAS_BLOCK__UMC |\
353*7688df22SAndroid Build Coastguard Worker 		(1 << AMDGPU_RAS_BLOCK__SDMA) |\
354*7688df22SAndroid Build Coastguard Worker 		(1 << AMDGPU_RAS_BLOCK__GFX))
355*7688df22SAndroid Build Coastguard Worker 
356*7688df22SAndroid Build Coastguard Worker static uint32_t ras_block_mask_inject = DEFAULT_RAS_BLOCK_MASK_INJECT;
357*7688df22SAndroid Build Coastguard Worker static uint32_t ras_block_mask_query = DEFAULT_RAS_BLOCK_MASK_INJECT;
358*7688df22SAndroid Build Coastguard Worker static uint32_t ras_block_mask_basic = DEFAULT_RAS_BLOCK_MASK_BASIC;
359*7688df22SAndroid Build Coastguard Worker 
360*7688df22SAndroid Build Coastguard Worker struct ras_test_mask {
361*7688df22SAndroid Build Coastguard Worker 	uint32_t inject_mask;
362*7688df22SAndroid Build Coastguard Worker 	uint32_t query_mask;
363*7688df22SAndroid Build Coastguard Worker 	uint32_t basic_mask;
364*7688df22SAndroid Build Coastguard Worker };
365*7688df22SAndroid Build Coastguard Worker 
366*7688df22SAndroid Build Coastguard Worker struct amdgpu_ras_data {
367*7688df22SAndroid Build Coastguard Worker 	amdgpu_device_handle device_handle;
368*7688df22SAndroid Build Coastguard Worker 	uint32_t  id;
369*7688df22SAndroid Build Coastguard Worker 	uint32_t  capability;
370*7688df22SAndroid Build Coastguard Worker 	struct ras_test_mask test_mask;
371*7688df22SAndroid Build Coastguard Worker };
372*7688df22SAndroid Build Coastguard Worker 
373*7688df22SAndroid Build Coastguard Worker /* all devices who has ras supported */
374*7688df22SAndroid Build Coastguard Worker static struct amdgpu_ras_data devices[MAX_CARDS_SUPPORTED];
375*7688df22SAndroid Build Coastguard Worker static int devices_count;
376*7688df22SAndroid Build Coastguard Worker 
377*7688df22SAndroid Build Coastguard Worker struct ras_DID_test_mask{
378*7688df22SAndroid Build Coastguard Worker 	uint16_t device_id;
379*7688df22SAndroid Build Coastguard Worker 	uint16_t revision_id;
380*7688df22SAndroid Build Coastguard Worker 	struct ras_test_mask test_mask;
381*7688df22SAndroid Build Coastguard Worker };
382*7688df22SAndroid Build Coastguard Worker 
383*7688df22SAndroid Build Coastguard Worker /* white list for inject test. */
384*7688df22SAndroid Build Coastguard Worker #define RAS_BLOCK_MASK_ALL {\
385*7688df22SAndroid Build Coastguard Worker 	DEFAULT_RAS_BLOCK_MASK_INJECT,\
386*7688df22SAndroid Build Coastguard Worker 	DEFAULT_RAS_BLOCK_MASK_QUERY,\
387*7688df22SAndroid Build Coastguard Worker 	DEFAULT_RAS_BLOCK_MASK_BASIC\
388*7688df22SAndroid Build Coastguard Worker }
389*7688df22SAndroid Build Coastguard Worker 
390*7688df22SAndroid Build Coastguard Worker #define RAS_BLOCK_MASK_QUERY_BASIC {\
391*7688df22SAndroid Build Coastguard Worker 	0,\
392*7688df22SAndroid Build Coastguard Worker 	DEFAULT_RAS_BLOCK_MASK_QUERY,\
393*7688df22SAndroid Build Coastguard Worker 	DEFAULT_RAS_BLOCK_MASK_BASIC\
394*7688df22SAndroid Build Coastguard Worker }
395*7688df22SAndroid Build Coastguard Worker 
396*7688df22SAndroid Build Coastguard Worker static const struct ras_inject_test_config umc_ras_inject_test[] = {
397*7688df22SAndroid Build Coastguard Worker 	{"ras_umc.1.0", "umc", 0, AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
398*7688df22SAndroid Build Coastguard Worker };
399*7688df22SAndroid Build Coastguard Worker 
400*7688df22SAndroid Build Coastguard Worker static const struct ras_inject_test_config gfx_ras_inject_test[] = {
401*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.0", "gfx", AMDGPU_RAS_BLOCK__GFX_CPC_UCODE,
402*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
403*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.1", "gfx", AMDGPU_RAS_BLOCK__GFX_CPF_TAG,
404*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
405*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.2", "gfx", AMDGPU_RAS_BLOCK__GFX_CPG_TAG,
406*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
407*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.3", "gfx", AMDGPU_RAS_BLOCK__GFX_SQ_LDS_D,
408*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
409*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.4", "gfx", AMDGPU_RAS_BLOCK__GFX_SQC_DATA_CU1_UTCL1_LFIFO,
410*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
411*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.5", "gfx", AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKA_TAG_RAM,
412*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
413*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.6", "gfx", AMDGPU_RAS_BLOCK__GFX_SQC_INST_BANKB_TAG_RAM,
414*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
415*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.7", "gfx", AMDGPU_RAS_BLOCK__GFX_TA_FS_DFIFO,
416*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
417*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.8", "gfx", AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA,
418*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
419*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.9", "gfx", AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_0_1,
420*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
421*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.10", "gfx", AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_0,
422*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
423*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.11", "gfx", AMDGPU_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_1,
424*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
425*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.12", "gfx", AMDGPU_RAS_BLOCK__GFX_TCP_CACHE_RAM,
426*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
427*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.13", "gfx", AMDGPU_RAS_BLOCK__GFX_TD_SS_FIFO_LO,
428*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
429*7688df22SAndroid Build Coastguard Worker 	{"ras_gfx.2.14", "gfx", AMDGPU_RAS_BLOCK__GFX_EA_DRAMRD_CMDMEM,
430*7688df22SAndroid Build Coastguard Worker 		AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, 0, 0},
431*7688df22SAndroid Build Coastguard Worker };
432*7688df22SAndroid Build Coastguard Worker 
433*7688df22SAndroid Build Coastguard Worker static const struct ras_DID_test_mask ras_DID_array[] = {
434*7688df22SAndroid Build Coastguard Worker 	{0x66a1, 0x00, RAS_BLOCK_MASK_ALL},
435*7688df22SAndroid Build Coastguard Worker 	{0x66a1, 0x01, RAS_BLOCK_MASK_ALL},
436*7688df22SAndroid Build Coastguard Worker 	{0x66a1, 0x04, RAS_BLOCK_MASK_ALL},
437*7688df22SAndroid Build Coastguard Worker };
438*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_find_block_id_by_name(const char * name)439*7688df22SAndroid Build Coastguard Worker static uint32_t amdgpu_ras_find_block_id_by_name(const char *name)
440*7688df22SAndroid Build Coastguard Worker {
441*7688df22SAndroid Build Coastguard Worker 	int i;
442*7688df22SAndroid Build Coastguard Worker 
443*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(ras_block_string); i++) {
444*7688df22SAndroid Build Coastguard Worker 		if (strcmp(name, ras_block_string[i]) == 0)
445*7688df22SAndroid Build Coastguard Worker 			return i;
446*7688df22SAndroid Build Coastguard Worker 	}
447*7688df22SAndroid Build Coastguard Worker 
448*7688df22SAndroid Build Coastguard Worker 	return ARRAY_SIZE(ras_block_string);
449*7688df22SAndroid Build Coastguard Worker }
450*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_get_error_type_id(enum amdgpu_ras_error_type type)451*7688df22SAndroid Build Coastguard Worker static char *amdgpu_ras_get_error_type_id(enum amdgpu_ras_error_type type)
452*7688df22SAndroid Build Coastguard Worker {
453*7688df22SAndroid Build Coastguard Worker 	switch (type) {
454*7688df22SAndroid Build Coastguard Worker 	case AMDGPU_RAS_ERROR__PARITY:
455*7688df22SAndroid Build Coastguard Worker 		return "parity";
456*7688df22SAndroid Build Coastguard Worker 	case AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE:
457*7688df22SAndroid Build Coastguard Worker 		return "single_correctable";
458*7688df22SAndroid Build Coastguard Worker 	case AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE:
459*7688df22SAndroid Build Coastguard Worker 		return "multi_uncorrectable";
460*7688df22SAndroid Build Coastguard Worker 	case AMDGPU_RAS_ERROR__POISON:
461*7688df22SAndroid Build Coastguard Worker 		return "poison";
462*7688df22SAndroid Build Coastguard Worker 	case AMDGPU_RAS_ERROR__NONE:
463*7688df22SAndroid Build Coastguard Worker 	default:
464*7688df22SAndroid Build Coastguard Worker 		return NULL;
465*7688df22SAndroid Build Coastguard Worker 	}
466*7688df22SAndroid Build Coastguard Worker }
467*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_get_test_mask(drmDevicePtr device)468*7688df22SAndroid Build Coastguard Worker static struct ras_test_mask amdgpu_ras_get_test_mask(drmDevicePtr device)
469*7688df22SAndroid Build Coastguard Worker {
470*7688df22SAndroid Build Coastguard Worker 	int i;
471*7688df22SAndroid Build Coastguard Worker 	static struct ras_test_mask default_test_mask = RAS_BLOCK_MASK_QUERY_BASIC;
472*7688df22SAndroid Build Coastguard Worker 
473*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < sizeof(ras_DID_array) / sizeof(ras_DID_array[0]); i++) {
474*7688df22SAndroid Build Coastguard Worker 		if (ras_DID_array[i].device_id == device->deviceinfo.pci->device_id &&
475*7688df22SAndroid Build Coastguard Worker 				ras_DID_array[i].revision_id == device->deviceinfo.pci->revision_id)
476*7688df22SAndroid Build Coastguard Worker 			return ras_DID_array[i].test_mask;
477*7688df22SAndroid Build Coastguard Worker 	}
478*7688df22SAndroid Build Coastguard Worker 	return default_test_mask;
479*7688df22SAndroid Build Coastguard Worker }
480*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_lookup_capability(amdgpu_device_handle device_handle)481*7688df22SAndroid Build Coastguard Worker static uint32_t amdgpu_ras_lookup_capability(amdgpu_device_handle device_handle)
482*7688df22SAndroid Build Coastguard Worker {
483*7688df22SAndroid Build Coastguard Worker 	union {
484*7688df22SAndroid Build Coastguard Worker 		uint64_t feature_mask;
485*7688df22SAndroid Build Coastguard Worker 		struct {
486*7688df22SAndroid Build Coastguard Worker 			uint32_t enabled_features;
487*7688df22SAndroid Build Coastguard Worker 			uint32_t supported_features;
488*7688df22SAndroid Build Coastguard Worker 		};
489*7688df22SAndroid Build Coastguard Worker 	} features = { 0 };
490*7688df22SAndroid Build Coastguard Worker 	int ret;
491*7688df22SAndroid Build Coastguard Worker 
492*7688df22SAndroid Build Coastguard Worker 	ret = amdgpu_query_info(device_handle, AMDGPU_INFO_RAS_ENABLED_FEATURES,
493*7688df22SAndroid Build Coastguard Worker 			sizeof(features), &features);
494*7688df22SAndroid Build Coastguard Worker 	if (ret)
495*7688df22SAndroid Build Coastguard Worker 		return 0;
496*7688df22SAndroid Build Coastguard Worker 
497*7688df22SAndroid Build Coastguard Worker 	return features.supported_features;
498*7688df22SAndroid Build Coastguard Worker }
499*7688df22SAndroid Build Coastguard Worker 
500*7688df22SAndroid Build Coastguard Worker static int get_file_contents(char *file, char *buf, int size);
501*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_lookup_id(drmDevicePtr device)502*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_lookup_id(drmDevicePtr device)
503*7688df22SAndroid Build Coastguard Worker {
504*7688df22SAndroid Build Coastguard Worker 	char path[PATH_SIZE];
505*7688df22SAndroid Build Coastguard Worker 	char str[128];
506*7688df22SAndroid Build Coastguard Worker 	drmPciBusInfo info;
507*7688df22SAndroid Build Coastguard Worker 	int i;
508*7688df22SAndroid Build Coastguard Worker 	int ret;
509*7688df22SAndroid Build Coastguard Worker 
510*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < MAX_CARDS_SUPPORTED; i++) {
511*7688df22SAndroid Build Coastguard Worker 		memset(str, 0, sizeof(str));
512*7688df22SAndroid Build Coastguard Worker 		memset(&info, 0, sizeof(info));
513*7688df22SAndroid Build Coastguard Worker 		snprintf(path, PATH_SIZE, "/sys/kernel/debug/dri/%d/name", i);
514*7688df22SAndroid Build Coastguard Worker 		if (get_file_contents(path, str, sizeof(str)) <= 0)
515*7688df22SAndroid Build Coastguard Worker 			continue;
516*7688df22SAndroid Build Coastguard Worker 
517*7688df22SAndroid Build Coastguard Worker 		ret = sscanf(str, "amdgpu dev=%04hx:%02hhx:%02hhx.%01hhx",
518*7688df22SAndroid Build Coastguard Worker 				&info.domain, &info.bus, &info.dev, &info.func);
519*7688df22SAndroid Build Coastguard Worker 		if (ret != 4)
520*7688df22SAndroid Build Coastguard Worker 			continue;
521*7688df22SAndroid Build Coastguard Worker 
522*7688df22SAndroid Build Coastguard Worker 		if (memcmp(&info, device->businfo.pci, sizeof(info)) == 0)
523*7688df22SAndroid Build Coastguard Worker 				return i;
524*7688df22SAndroid Build Coastguard Worker 	}
525*7688df22SAndroid Build Coastguard Worker 	return -1;
526*7688df22SAndroid Build Coastguard Worker }
527*7688df22SAndroid Build Coastguard Worker 
528*7688df22SAndroid Build Coastguard Worker //helpers
529*7688df22SAndroid Build Coastguard Worker 
530*7688df22SAndroid Build Coastguard Worker static int test_card;
531*7688df22SAndroid Build Coastguard Worker static char sysfs_path[PATH_SIZE];
532*7688df22SAndroid Build Coastguard Worker static char debugfs_path[PATH_SIZE];
533*7688df22SAndroid Build Coastguard Worker static uint32_t ras_mask;
534*7688df22SAndroid Build Coastguard Worker static amdgpu_device_handle device_handle;
535*7688df22SAndroid Build Coastguard Worker 
set_test_card(int card)536*7688df22SAndroid Build Coastguard Worker static void set_test_card(int card)
537*7688df22SAndroid Build Coastguard Worker {
538*7688df22SAndroid Build Coastguard Worker 	test_card = card;
539*7688df22SAndroid Build Coastguard Worker 	snprintf(sysfs_path, PATH_SIZE, "/sys/class/drm/card%d/device/ras/", devices[card].id);
540*7688df22SAndroid Build Coastguard Worker 	snprintf(debugfs_path, PATH_SIZE,  "/sys/kernel/debug/dri/%d/ras/", devices[card].id);
541*7688df22SAndroid Build Coastguard Worker 	ras_mask = devices[card].capability;
542*7688df22SAndroid Build Coastguard Worker 	device_handle = devices[card].device_handle;
543*7688df22SAndroid Build Coastguard Worker 	ras_block_mask_inject = devices[card].test_mask.inject_mask;
544*7688df22SAndroid Build Coastguard Worker 	ras_block_mask_query = devices[card].test_mask.query_mask;
545*7688df22SAndroid Build Coastguard Worker 	ras_block_mask_basic = devices[card].test_mask.basic_mask;
546*7688df22SAndroid Build Coastguard Worker }
547*7688df22SAndroid Build Coastguard Worker 
get_ras_sysfs_root(void)548*7688df22SAndroid Build Coastguard Worker static const char *get_ras_sysfs_root(void)
549*7688df22SAndroid Build Coastguard Worker {
550*7688df22SAndroid Build Coastguard Worker 	return sysfs_path;
551*7688df22SAndroid Build Coastguard Worker }
552*7688df22SAndroid Build Coastguard Worker 
get_ras_debugfs_root(void)553*7688df22SAndroid Build Coastguard Worker static const char *get_ras_debugfs_root(void)
554*7688df22SAndroid Build Coastguard Worker {
555*7688df22SAndroid Build Coastguard Worker 	return debugfs_path;
556*7688df22SAndroid Build Coastguard Worker }
557*7688df22SAndroid Build Coastguard Worker 
set_file_contents(char * file,char * buf,int size)558*7688df22SAndroid Build Coastguard Worker static int set_file_contents(char *file, char *buf, int size)
559*7688df22SAndroid Build Coastguard Worker {
560*7688df22SAndroid Build Coastguard Worker 	int n, fd;
561*7688df22SAndroid Build Coastguard Worker 	fd = open(file, O_WRONLY);
562*7688df22SAndroid Build Coastguard Worker 	if (fd == -1)
563*7688df22SAndroid Build Coastguard Worker 		return -1;
564*7688df22SAndroid Build Coastguard Worker 	n = write(fd, buf, size);
565*7688df22SAndroid Build Coastguard Worker 	close(fd);
566*7688df22SAndroid Build Coastguard Worker 	return n;
567*7688df22SAndroid Build Coastguard Worker }
568*7688df22SAndroid Build Coastguard Worker 
get_file_contents(char * file,char * buf,int size)569*7688df22SAndroid Build Coastguard Worker static int get_file_contents(char *file, char *buf, int size)
570*7688df22SAndroid Build Coastguard Worker {
571*7688df22SAndroid Build Coastguard Worker 	int n, fd;
572*7688df22SAndroid Build Coastguard Worker 	fd = open(file, O_RDONLY);
573*7688df22SAndroid Build Coastguard Worker 	if (fd == -1)
574*7688df22SAndroid Build Coastguard Worker 		return -1;
575*7688df22SAndroid Build Coastguard Worker 	n = read(fd, buf, size);
576*7688df22SAndroid Build Coastguard Worker 	close(fd);
577*7688df22SAndroid Build Coastguard Worker 	return n;
578*7688df22SAndroid Build Coastguard Worker }
579*7688df22SAndroid Build Coastguard Worker 
is_file_ok(char * file,int flags)580*7688df22SAndroid Build Coastguard Worker static int is_file_ok(char *file, int flags)
581*7688df22SAndroid Build Coastguard Worker {
582*7688df22SAndroid Build Coastguard Worker 	int fd;
583*7688df22SAndroid Build Coastguard Worker 
584*7688df22SAndroid Build Coastguard Worker 	fd = open(file, flags);
585*7688df22SAndroid Build Coastguard Worker 	if (fd == -1)
586*7688df22SAndroid Build Coastguard Worker 		return -1;
587*7688df22SAndroid Build Coastguard Worker 	close(fd);
588*7688df22SAndroid Build Coastguard Worker 	return 0;
589*7688df22SAndroid Build Coastguard Worker }
590*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_is_feature_enabled(enum amdgpu_ras_block block)591*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_is_feature_enabled(enum amdgpu_ras_block block)
592*7688df22SAndroid Build Coastguard Worker {
593*7688df22SAndroid Build Coastguard Worker 	uint32_t feature_mask;
594*7688df22SAndroid Build Coastguard Worker 	int ret;
595*7688df22SAndroid Build Coastguard Worker 
596*7688df22SAndroid Build Coastguard Worker 	ret = amdgpu_query_info(device_handle, AMDGPU_INFO_RAS_ENABLED_FEATURES,
597*7688df22SAndroid Build Coastguard Worker 			sizeof(feature_mask), &feature_mask);
598*7688df22SAndroid Build Coastguard Worker 	if (ret)
599*7688df22SAndroid Build Coastguard Worker 		return -1;
600*7688df22SAndroid Build Coastguard Worker 
601*7688df22SAndroid Build Coastguard Worker 	return (1 << block) & feature_mask;
602*7688df22SAndroid Build Coastguard Worker }
603*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_is_feature_supported(enum amdgpu_ras_block block)604*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_is_feature_supported(enum amdgpu_ras_block block)
605*7688df22SAndroid Build Coastguard Worker {
606*7688df22SAndroid Build Coastguard Worker 	return (1 << block) & ras_mask;
607*7688df22SAndroid Build Coastguard Worker }
608*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_invoke(struct ras_debug_if * data)609*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_invoke(struct ras_debug_if *data)
610*7688df22SAndroid Build Coastguard Worker {
611*7688df22SAndroid Build Coastguard Worker 	char path[PATH_SIZE];
612*7688df22SAndroid Build Coastguard Worker 	int ret;
613*7688df22SAndroid Build Coastguard Worker 
614*7688df22SAndroid Build Coastguard Worker 	snprintf(path, sizeof(path), "%s", get_ras_debugfs_root());
615*7688df22SAndroid Build Coastguard Worker 	strncat(path, "ras_ctrl", sizeof(path) - strlen(path));
616*7688df22SAndroid Build Coastguard Worker 
617*7688df22SAndroid Build Coastguard Worker 	ret = set_file_contents(path, (char *)data, sizeof(*data))
618*7688df22SAndroid Build Coastguard Worker 		- sizeof(*data);
619*7688df22SAndroid Build Coastguard Worker 	return ret;
620*7688df22SAndroid Build Coastguard Worker }
621*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_query_err_count(enum amdgpu_ras_block block,unsigned long * ue,unsigned long * ce)622*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_query_err_count(enum amdgpu_ras_block block,
623*7688df22SAndroid Build Coastguard Worker 		unsigned long *ue, unsigned long *ce)
624*7688df22SAndroid Build Coastguard Worker {
625*7688df22SAndroid Build Coastguard Worker 	char buf[64];
626*7688df22SAndroid Build Coastguard Worker 	char name[PATH_SIZE];
627*7688df22SAndroid Build Coastguard Worker 
628*7688df22SAndroid Build Coastguard Worker 	*ue = *ce = 0;
629*7688df22SAndroid Build Coastguard Worker 
630*7688df22SAndroid Build Coastguard Worker 	if (amdgpu_ras_is_feature_supported(block) <= 0)
631*7688df22SAndroid Build Coastguard Worker 		return -1;
632*7688df22SAndroid Build Coastguard Worker 
633*7688df22SAndroid Build Coastguard Worker 	snprintf(name, sizeof(name), "%s", get_ras_sysfs_root());
634*7688df22SAndroid Build Coastguard Worker 	strncat(name, ras_block_str(block), sizeof(name) - strlen(name));
635*7688df22SAndroid Build Coastguard Worker 	strncat(name, "_err_count", sizeof(name) - strlen(name));
636*7688df22SAndroid Build Coastguard Worker 
637*7688df22SAndroid Build Coastguard Worker 	if (is_file_ok(name, O_RDONLY))
638*7688df22SAndroid Build Coastguard Worker 		return 0;
639*7688df22SAndroid Build Coastguard Worker 
640*7688df22SAndroid Build Coastguard Worker 	if (get_file_contents(name, buf, sizeof(buf)) <= 0)
641*7688df22SAndroid Build Coastguard Worker 		return -1;
642*7688df22SAndroid Build Coastguard Worker 
643*7688df22SAndroid Build Coastguard Worker 	if (sscanf(buf, "ue: %lu\nce: %lu", ue, ce) != 2)
644*7688df22SAndroid Build Coastguard Worker 		return -1;
645*7688df22SAndroid Build Coastguard Worker 
646*7688df22SAndroid Build Coastguard Worker 	return 0;
647*7688df22SAndroid Build Coastguard Worker }
648*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_inject(enum amdgpu_ras_block block,uint32_t sub_block,enum amdgpu_ras_error_type type,uint64_t address,uint64_t value)649*7688df22SAndroid Build Coastguard Worker static int amdgpu_ras_inject(enum amdgpu_ras_block block,
650*7688df22SAndroid Build Coastguard Worker 		uint32_t sub_block, enum amdgpu_ras_error_type type,
651*7688df22SAndroid Build Coastguard Worker 		uint64_t address, uint64_t value)
652*7688df22SAndroid Build Coastguard Worker {
653*7688df22SAndroid Build Coastguard Worker 	struct ras_debug_if data = { .op = 2, };
654*7688df22SAndroid Build Coastguard Worker 	struct ras_inject_if *inject = &data.inject;
655*7688df22SAndroid Build Coastguard Worker 	int ret;
656*7688df22SAndroid Build Coastguard Worker 
657*7688df22SAndroid Build Coastguard Worker 	if (amdgpu_ras_is_feature_enabled(block) <= 0) {
658*7688df22SAndroid Build Coastguard Worker 		fprintf(stderr, "block id(%d) is not valid\n", block);
659*7688df22SAndroid Build Coastguard Worker 		return -1;
660*7688df22SAndroid Build Coastguard Worker 	}
661*7688df22SAndroid Build Coastguard Worker 
662*7688df22SAndroid Build Coastguard Worker 	inject->head.block = block;
663*7688df22SAndroid Build Coastguard Worker 	inject->head.type = type;
664*7688df22SAndroid Build Coastguard Worker 	inject->head.sub_block_index = sub_block;
665*7688df22SAndroid Build Coastguard Worker 	strncpy(inject->head.name, ras_block_str(block), sizeof(inject->head.name)-1);
666*7688df22SAndroid Build Coastguard Worker 	inject->address = address;
667*7688df22SAndroid Build Coastguard Worker 	inject->value = value;
668*7688df22SAndroid Build Coastguard Worker 
669*7688df22SAndroid Build Coastguard Worker 	ret = amdgpu_ras_invoke(&data);
670*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(ret, 0);
671*7688df22SAndroid Build Coastguard Worker 	if (ret)
672*7688df22SAndroid Build Coastguard Worker 		return -1;
673*7688df22SAndroid Build Coastguard Worker 
674*7688df22SAndroid Build Coastguard Worker 	return 0;
675*7688df22SAndroid Build Coastguard Worker }
676*7688df22SAndroid Build Coastguard Worker 
677*7688df22SAndroid Build Coastguard Worker //tests
amdgpu_ras_features_test(int enable)678*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_features_test(int enable)
679*7688df22SAndroid Build Coastguard Worker {
680*7688df22SAndroid Build Coastguard Worker 	struct ras_debug_if data;
681*7688df22SAndroid Build Coastguard Worker 	int ret;
682*7688df22SAndroid Build Coastguard Worker 	int i;
683*7688df22SAndroid Build Coastguard Worker 
684*7688df22SAndroid Build Coastguard Worker 	data.op = enable;
685*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < AMDGPU_RAS_BLOCK__LAST; i++) {
686*7688df22SAndroid Build Coastguard Worker 		struct ras_common_if head = {
687*7688df22SAndroid Build Coastguard Worker 			.block = i,
688*7688df22SAndroid Build Coastguard Worker 			.type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE,
689*7688df22SAndroid Build Coastguard Worker 			.sub_block_index = 0,
690*7688df22SAndroid Build Coastguard Worker 			.name = "",
691*7688df22SAndroid Build Coastguard Worker 		};
692*7688df22SAndroid Build Coastguard Worker 
693*7688df22SAndroid Build Coastguard Worker 		if (amdgpu_ras_is_feature_supported(i) <= 0)
694*7688df22SAndroid Build Coastguard Worker 			continue;
695*7688df22SAndroid Build Coastguard Worker 
696*7688df22SAndroid Build Coastguard Worker 		data.head = head;
697*7688df22SAndroid Build Coastguard Worker 
698*7688df22SAndroid Build Coastguard Worker 		ret = amdgpu_ras_invoke(&data);
699*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
700*7688df22SAndroid Build Coastguard Worker 
701*7688df22SAndroid Build Coastguard Worker 		if (ret)
702*7688df22SAndroid Build Coastguard Worker 			continue;
703*7688df22SAndroid Build Coastguard Worker 
704*7688df22SAndroid Build Coastguard Worker 		ret = enable ^ amdgpu_ras_is_feature_enabled(i);
705*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
706*7688df22SAndroid Build Coastguard Worker 	}
707*7688df22SAndroid Build Coastguard Worker }
708*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_disable_test(void)709*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_disable_test(void)
710*7688df22SAndroid Build Coastguard Worker {
711*7688df22SAndroid Build Coastguard Worker 	int i;
712*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
713*7688df22SAndroid Build Coastguard Worker 		set_test_card(i);
714*7688df22SAndroid Build Coastguard Worker 		amdgpu_ras_features_test(0);
715*7688df22SAndroid Build Coastguard Worker 	}
716*7688df22SAndroid Build Coastguard Worker }
717*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_enable_test(void)718*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_enable_test(void)
719*7688df22SAndroid Build Coastguard Worker {
720*7688df22SAndroid Build Coastguard Worker 	int i;
721*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
722*7688df22SAndroid Build Coastguard Worker 		set_test_card(i);
723*7688df22SAndroid Build Coastguard Worker 		amdgpu_ras_features_test(1);
724*7688df22SAndroid Build Coastguard Worker 	}
725*7688df22SAndroid Build Coastguard Worker }
726*7688df22SAndroid Build Coastguard Worker 
__amdgpu_ras_ip_inject_test(const struct ras_inject_test_config * ip_test,uint32_t size)727*7688df22SAndroid Build Coastguard Worker static void __amdgpu_ras_ip_inject_test(const struct ras_inject_test_config *ip_test,
728*7688df22SAndroid Build Coastguard Worker 					uint32_t size)
729*7688df22SAndroid Build Coastguard Worker {
730*7688df22SAndroid Build Coastguard Worker 	int i, ret;
731*7688df22SAndroid Build Coastguard Worker 	unsigned long old_ue, old_ce;
732*7688df22SAndroid Build Coastguard Worker 	unsigned long ue, ce;
733*7688df22SAndroid Build Coastguard Worker 	uint32_t block;
734*7688df22SAndroid Build Coastguard Worker 	int timeout;
735*7688df22SAndroid Build Coastguard Worker 	bool pass;
736*7688df22SAndroid Build Coastguard Worker 
737*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < size; i++) {
738*7688df22SAndroid Build Coastguard Worker 		timeout = 3;
739*7688df22SAndroid Build Coastguard Worker 		pass = false;
740*7688df22SAndroid Build Coastguard Worker 
741*7688df22SAndroid Build Coastguard Worker 		block = amdgpu_ras_find_block_id_by_name(ip_test[i].block);
742*7688df22SAndroid Build Coastguard Worker 
743*7688df22SAndroid Build Coastguard Worker 		/* Ensure one valid ip block */
744*7688df22SAndroid Build Coastguard Worker 		if (block == ARRAY_SIZE(ras_block_string))
745*7688df22SAndroid Build Coastguard Worker 			break;
746*7688df22SAndroid Build Coastguard Worker 
747*7688df22SAndroid Build Coastguard Worker 		/* Ensure RAS feature for the IP block is enabled by kernel */
748*7688df22SAndroid Build Coastguard Worker 		if (amdgpu_ras_is_feature_supported(block) <= 0)
749*7688df22SAndroid Build Coastguard Worker 			break;
750*7688df22SAndroid Build Coastguard Worker 
751*7688df22SAndroid Build Coastguard Worker 		ret = amdgpu_ras_query_err_count(block, &old_ue, &old_ce);
752*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
753*7688df22SAndroid Build Coastguard Worker 		if (ret)
754*7688df22SAndroid Build Coastguard Worker 			break;
755*7688df22SAndroid Build Coastguard Worker 
756*7688df22SAndroid Build Coastguard Worker 		ret = amdgpu_ras_inject(block,
757*7688df22SAndroid Build Coastguard Worker 					ip_test[i].sub_block,
758*7688df22SAndroid Build Coastguard Worker 					ip_test[i].type,
759*7688df22SAndroid Build Coastguard Worker 					ip_test[i].address,
760*7688df22SAndroid Build Coastguard Worker 					ip_test[i].value);
761*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
762*7688df22SAndroid Build Coastguard Worker 		if (ret)
763*7688df22SAndroid Build Coastguard Worker 			break;
764*7688df22SAndroid Build Coastguard Worker 
765*7688df22SAndroid Build Coastguard Worker 		while (timeout > 0) {
766*7688df22SAndroid Build Coastguard Worker 			sleep(5);
767*7688df22SAndroid Build Coastguard Worker 
768*7688df22SAndroid Build Coastguard Worker 			ret = amdgpu_ras_query_err_count(block, &ue, &ce);
769*7688df22SAndroid Build Coastguard Worker 			CU_ASSERT_EQUAL(ret, 0);
770*7688df22SAndroid Build Coastguard Worker 			if (ret)
771*7688df22SAndroid Build Coastguard Worker 				break;
772*7688df22SAndroid Build Coastguard Worker 
773*7688df22SAndroid Build Coastguard Worker 			if (old_ue != ue || old_ce != ce) {
774*7688df22SAndroid Build Coastguard Worker 				pass = true;
775*7688df22SAndroid Build Coastguard Worker 				sleep(20);
776*7688df22SAndroid Build Coastguard Worker 				break;
777*7688df22SAndroid Build Coastguard Worker 			}
778*7688df22SAndroid Build Coastguard Worker 			timeout -= 1;
779*7688df22SAndroid Build Coastguard Worker 		}
780*7688df22SAndroid Build Coastguard Worker 		printf("\t Test %s@block %s, subblock %d, error_type %s, address %ld, value %ld: %s\n",
781*7688df22SAndroid Build Coastguard Worker 			ip_test[i].name,
782*7688df22SAndroid Build Coastguard Worker 			ip_test[i].block,
783*7688df22SAndroid Build Coastguard Worker 			ip_test[i].sub_block,
784*7688df22SAndroid Build Coastguard Worker 			amdgpu_ras_get_error_type_id(ip_test[i].type),
785*7688df22SAndroid Build Coastguard Worker 			ip_test[i].address,
786*7688df22SAndroid Build Coastguard Worker 			ip_test[i].value,
787*7688df22SAndroid Build Coastguard Worker 			pass ? "Pass" : "Fail");
788*7688df22SAndroid Build Coastguard Worker 	}
789*7688df22SAndroid Build Coastguard Worker }
790*7688df22SAndroid Build Coastguard Worker 
__amdgpu_ras_inject_test(void)791*7688df22SAndroid Build Coastguard Worker static void __amdgpu_ras_inject_test(void)
792*7688df22SAndroid Build Coastguard Worker {
793*7688df22SAndroid Build Coastguard Worker 	printf("...\n");
794*7688df22SAndroid Build Coastguard Worker 
795*7688df22SAndroid Build Coastguard Worker 	/* run UMC ras inject test */
796*7688df22SAndroid Build Coastguard Worker 	__amdgpu_ras_ip_inject_test(umc_ras_inject_test,
797*7688df22SAndroid Build Coastguard Worker 		ARRAY_SIZE(umc_ras_inject_test));
798*7688df22SAndroid Build Coastguard Worker 
799*7688df22SAndroid Build Coastguard Worker 	/* run GFX ras inject test */
800*7688df22SAndroid Build Coastguard Worker 	__amdgpu_ras_ip_inject_test(gfx_ras_inject_test,
801*7688df22SAndroid Build Coastguard Worker 		ARRAY_SIZE(gfx_ras_inject_test));
802*7688df22SAndroid Build Coastguard Worker }
803*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_inject_test(void)804*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_inject_test(void)
805*7688df22SAndroid Build Coastguard Worker {
806*7688df22SAndroid Build Coastguard Worker 	int i;
807*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
808*7688df22SAndroid Build Coastguard Worker 		set_test_card(i);
809*7688df22SAndroid Build Coastguard Worker 		__amdgpu_ras_inject_test();
810*7688df22SAndroid Build Coastguard Worker 	}
811*7688df22SAndroid Build Coastguard Worker }
812*7688df22SAndroid Build Coastguard Worker 
__amdgpu_ras_query_test(void)813*7688df22SAndroid Build Coastguard Worker static void __amdgpu_ras_query_test(void)
814*7688df22SAndroid Build Coastguard Worker {
815*7688df22SAndroid Build Coastguard Worker 	unsigned long ue, ce;
816*7688df22SAndroid Build Coastguard Worker 	int ret;
817*7688df22SAndroid Build Coastguard Worker 	int i;
818*7688df22SAndroid Build Coastguard Worker 
819*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < AMDGPU_RAS_BLOCK__LAST; i++) {
820*7688df22SAndroid Build Coastguard Worker 		if (amdgpu_ras_is_feature_supported(i) <= 0)
821*7688df22SAndroid Build Coastguard Worker 			continue;
822*7688df22SAndroid Build Coastguard Worker 
823*7688df22SAndroid Build Coastguard Worker 		if (!((1 << i) & ras_block_mask_query))
824*7688df22SAndroid Build Coastguard Worker 			continue;
825*7688df22SAndroid Build Coastguard Worker 
826*7688df22SAndroid Build Coastguard Worker 		ret = amdgpu_ras_query_err_count(i, &ue, &ce);
827*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
828*7688df22SAndroid Build Coastguard Worker 	}
829*7688df22SAndroid Build Coastguard Worker }
830*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_query_test(void)831*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_query_test(void)
832*7688df22SAndroid Build Coastguard Worker {
833*7688df22SAndroid Build Coastguard Worker 	int i;
834*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
835*7688df22SAndroid Build Coastguard Worker 		set_test_card(i);
836*7688df22SAndroid Build Coastguard Worker 		__amdgpu_ras_query_test();
837*7688df22SAndroid Build Coastguard Worker 	}
838*7688df22SAndroid Build Coastguard Worker }
839*7688df22SAndroid Build Coastguard Worker 
amdgpu_ras_basic_test(void)840*7688df22SAndroid Build Coastguard Worker static void amdgpu_ras_basic_test(void)
841*7688df22SAndroid Build Coastguard Worker {
842*7688df22SAndroid Build Coastguard Worker 	int ret;
843*7688df22SAndroid Build Coastguard Worker 	int i;
844*7688df22SAndroid Build Coastguard Worker 	int j;
845*7688df22SAndroid Build Coastguard Worker 	uint32_t features;
846*7688df22SAndroid Build Coastguard Worker 	char path[PATH_SIZE];
847*7688df22SAndroid Build Coastguard Worker 
848*7688df22SAndroid Build Coastguard Worker 	ret = is_file_ok("/sys/module/amdgpu/parameters/ras_mask", O_RDONLY);
849*7688df22SAndroid Build Coastguard Worker 	CU_ASSERT_EQUAL(ret, 0);
850*7688df22SAndroid Build Coastguard Worker 
851*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
852*7688df22SAndroid Build Coastguard Worker 		set_test_card(i);
853*7688df22SAndroid Build Coastguard Worker 
854*7688df22SAndroid Build Coastguard Worker 		ret = amdgpu_query_info(device_handle, AMDGPU_INFO_RAS_ENABLED_FEATURES,
855*7688df22SAndroid Build Coastguard Worker 				sizeof(features), &features);
856*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
857*7688df22SAndroid Build Coastguard Worker 
858*7688df22SAndroid Build Coastguard Worker 		snprintf(path, sizeof(path), "%s", get_ras_debugfs_root());
859*7688df22SAndroid Build Coastguard Worker 		strncat(path, "ras_ctrl", sizeof(path) - strlen(path));
860*7688df22SAndroid Build Coastguard Worker 
861*7688df22SAndroid Build Coastguard Worker 		ret = is_file_ok(path, O_WRONLY);
862*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
863*7688df22SAndroid Build Coastguard Worker 
864*7688df22SAndroid Build Coastguard Worker 		snprintf(path, sizeof(path), "%s", get_ras_sysfs_root());
865*7688df22SAndroid Build Coastguard Worker 		strncat(path, "features", sizeof(path) - strlen(path));
866*7688df22SAndroid Build Coastguard Worker 
867*7688df22SAndroid Build Coastguard Worker 		ret = is_file_ok(path, O_RDONLY);
868*7688df22SAndroid Build Coastguard Worker 		CU_ASSERT_EQUAL(ret, 0);
869*7688df22SAndroid Build Coastguard Worker 
870*7688df22SAndroid Build Coastguard Worker 		for (j = 0; j < AMDGPU_RAS_BLOCK__LAST; j++) {
871*7688df22SAndroid Build Coastguard Worker 			ret = amdgpu_ras_is_feature_supported(j);
872*7688df22SAndroid Build Coastguard Worker 			if (ret <= 0)
873*7688df22SAndroid Build Coastguard Worker 				continue;
874*7688df22SAndroid Build Coastguard Worker 
875*7688df22SAndroid Build Coastguard Worker 			if (!((1 << j) & ras_block_mask_basic))
876*7688df22SAndroid Build Coastguard Worker 				continue;
877*7688df22SAndroid Build Coastguard Worker 
878*7688df22SAndroid Build Coastguard Worker 			snprintf(path, sizeof(path), "%s", get_ras_sysfs_root());
879*7688df22SAndroid Build Coastguard Worker 			strncat(path, ras_block_str(j), sizeof(path) -  strlen(path));
880*7688df22SAndroid Build Coastguard Worker 			strncat(path, "_err_count", sizeof(path) - strlen(path));
881*7688df22SAndroid Build Coastguard Worker 
882*7688df22SAndroid Build Coastguard Worker 			ret = is_file_ok(path, O_RDONLY);
883*7688df22SAndroid Build Coastguard Worker 			CU_ASSERT_EQUAL(ret, 0);
884*7688df22SAndroid Build Coastguard Worker 
885*7688df22SAndroid Build Coastguard Worker 			snprintf(path, sizeof(path), "%s", get_ras_debugfs_root());
886*7688df22SAndroid Build Coastguard Worker 			strncat(path, ras_block_str(j), sizeof(path) - strlen(path));
887*7688df22SAndroid Build Coastguard Worker 			strncat(path, "_err_inject", sizeof(path) - strlen(path));
888*7688df22SAndroid Build Coastguard Worker 
889*7688df22SAndroid Build Coastguard Worker 			ret = is_file_ok(path, O_WRONLY);
890*7688df22SAndroid Build Coastguard Worker 			CU_ASSERT_EQUAL(ret, 0);
891*7688df22SAndroid Build Coastguard Worker 		}
892*7688df22SAndroid Build Coastguard Worker 	}
893*7688df22SAndroid Build Coastguard Worker }
894*7688df22SAndroid Build Coastguard Worker 
895*7688df22SAndroid Build Coastguard Worker CU_TestInfo ras_tests[] = {
896*7688df22SAndroid Build Coastguard Worker 	{ "ras basic test",	amdgpu_ras_basic_test },
897*7688df22SAndroid Build Coastguard Worker 	{ "ras query test",	amdgpu_ras_query_test },
898*7688df22SAndroid Build Coastguard Worker 	{ "ras inject test",	amdgpu_ras_inject_test },
899*7688df22SAndroid Build Coastguard Worker 	{ "ras disable test",	amdgpu_ras_disable_test },
900*7688df22SAndroid Build Coastguard Worker 	{ "ras enable test",	amdgpu_ras_enable_test },
901*7688df22SAndroid Build Coastguard Worker 	CU_TEST_INFO_NULL,
902*7688df22SAndroid Build Coastguard Worker };
903*7688df22SAndroid Build Coastguard Worker 
suite_ras_tests_enable(void)904*7688df22SAndroid Build Coastguard Worker CU_BOOL suite_ras_tests_enable(void)
905*7688df22SAndroid Build Coastguard Worker {
906*7688df22SAndroid Build Coastguard Worker 	amdgpu_device_handle device_handle;
907*7688df22SAndroid Build Coastguard Worker 	uint32_t  major_version;
908*7688df22SAndroid Build Coastguard Worker 	uint32_t  minor_version;
909*7688df22SAndroid Build Coastguard Worker 	int i;
910*7688df22SAndroid Build Coastguard Worker 	drmDevicePtr device;
911*7688df22SAndroid Build Coastguard Worker 
912*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >= 0; i++) {
913*7688df22SAndroid Build Coastguard Worker 		if (amdgpu_device_initialize(drm_amdgpu[i], &major_version,
914*7688df22SAndroid Build Coastguard Worker 					&minor_version, &device_handle))
915*7688df22SAndroid Build Coastguard Worker 			continue;
916*7688df22SAndroid Build Coastguard Worker 
917*7688df22SAndroid Build Coastguard Worker 		if (drmGetDevice2(drm_amdgpu[i],
918*7688df22SAndroid Build Coastguard Worker 					DRM_DEVICE_GET_PCI_REVISION,
919*7688df22SAndroid Build Coastguard Worker 					&device))
920*7688df22SAndroid Build Coastguard Worker 			continue;
921*7688df22SAndroid Build Coastguard Worker 
922*7688df22SAndroid Build Coastguard Worker 		if (device->bustype == DRM_BUS_PCI &&
923*7688df22SAndroid Build Coastguard Worker 				amdgpu_ras_lookup_capability(device_handle)) {
924*7688df22SAndroid Build Coastguard Worker 			amdgpu_device_deinitialize(device_handle);
925*7688df22SAndroid Build Coastguard Worker 			return CU_TRUE;
926*7688df22SAndroid Build Coastguard Worker 		}
927*7688df22SAndroid Build Coastguard Worker 
928*7688df22SAndroid Build Coastguard Worker 		if (amdgpu_device_deinitialize(device_handle))
929*7688df22SAndroid Build Coastguard Worker 			continue;
930*7688df22SAndroid Build Coastguard Worker 	}
931*7688df22SAndroid Build Coastguard Worker 
932*7688df22SAndroid Build Coastguard Worker 	return CU_FALSE;
933*7688df22SAndroid Build Coastguard Worker }
934*7688df22SAndroid Build Coastguard Worker 
suite_ras_tests_init(void)935*7688df22SAndroid Build Coastguard Worker int suite_ras_tests_init(void)
936*7688df22SAndroid Build Coastguard Worker {
937*7688df22SAndroid Build Coastguard Worker 	drmDevicePtr device;
938*7688df22SAndroid Build Coastguard Worker 	amdgpu_device_handle device_handle;
939*7688df22SAndroid Build Coastguard Worker 	uint32_t  major_version;
940*7688df22SAndroid Build Coastguard Worker 	uint32_t  minor_version;
941*7688df22SAndroid Build Coastguard Worker 	uint32_t  capability;
942*7688df22SAndroid Build Coastguard Worker 	struct ras_test_mask test_mask;
943*7688df22SAndroid Build Coastguard Worker 	int id;
944*7688df22SAndroid Build Coastguard Worker 	int i;
945*7688df22SAndroid Build Coastguard Worker 	int r;
946*7688df22SAndroid Build Coastguard Worker 
947*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < MAX_CARDS_SUPPORTED && drm_amdgpu[i] >= 0; i++) {
948*7688df22SAndroid Build Coastguard Worker 		r = amdgpu_device_initialize(drm_amdgpu[i], &major_version,
949*7688df22SAndroid Build Coastguard Worker 				&minor_version, &device_handle);
950*7688df22SAndroid Build Coastguard Worker 		if (r)
951*7688df22SAndroid Build Coastguard Worker 			continue;
952*7688df22SAndroid Build Coastguard Worker 
953*7688df22SAndroid Build Coastguard Worker 		if (drmGetDevice2(drm_amdgpu[i],
954*7688df22SAndroid Build Coastguard Worker 					DRM_DEVICE_GET_PCI_REVISION,
955*7688df22SAndroid Build Coastguard Worker 					&device)) {
956*7688df22SAndroid Build Coastguard Worker 			amdgpu_device_deinitialize(device_handle);
957*7688df22SAndroid Build Coastguard Worker 			continue;
958*7688df22SAndroid Build Coastguard Worker 		}
959*7688df22SAndroid Build Coastguard Worker 
960*7688df22SAndroid Build Coastguard Worker 		if (device->bustype != DRM_BUS_PCI) {
961*7688df22SAndroid Build Coastguard Worker 			amdgpu_device_deinitialize(device_handle);
962*7688df22SAndroid Build Coastguard Worker 			continue;
963*7688df22SAndroid Build Coastguard Worker 		}
964*7688df22SAndroid Build Coastguard Worker 
965*7688df22SAndroid Build Coastguard Worker 		capability = amdgpu_ras_lookup_capability(device_handle);
966*7688df22SAndroid Build Coastguard Worker 		if (capability == 0) {
967*7688df22SAndroid Build Coastguard Worker 			amdgpu_device_deinitialize(device_handle);
968*7688df22SAndroid Build Coastguard Worker 			continue;
969*7688df22SAndroid Build Coastguard Worker 
970*7688df22SAndroid Build Coastguard Worker 		}
971*7688df22SAndroid Build Coastguard Worker 
972*7688df22SAndroid Build Coastguard Worker 		id = amdgpu_ras_lookup_id(device);
973*7688df22SAndroid Build Coastguard Worker 		if (id == -1) {
974*7688df22SAndroid Build Coastguard Worker 			amdgpu_device_deinitialize(device_handle);
975*7688df22SAndroid Build Coastguard Worker 			continue;
976*7688df22SAndroid Build Coastguard Worker 		}
977*7688df22SAndroid Build Coastguard Worker 
978*7688df22SAndroid Build Coastguard Worker 		test_mask = amdgpu_ras_get_test_mask(device);
979*7688df22SAndroid Build Coastguard Worker 
980*7688df22SAndroid Build Coastguard Worker 		devices[devices_count++] = (struct amdgpu_ras_data) {
981*7688df22SAndroid Build Coastguard Worker 			device_handle, id, capability, test_mask,
982*7688df22SAndroid Build Coastguard Worker 		};
983*7688df22SAndroid Build Coastguard Worker 	}
984*7688df22SAndroid Build Coastguard Worker 
985*7688df22SAndroid Build Coastguard Worker 	if (devices_count == 0)
986*7688df22SAndroid Build Coastguard Worker 		return CUE_SINIT_FAILED;
987*7688df22SAndroid Build Coastguard Worker 
988*7688df22SAndroid Build Coastguard Worker 	return CUE_SUCCESS;
989*7688df22SAndroid Build Coastguard Worker }
990*7688df22SAndroid Build Coastguard Worker 
suite_ras_tests_clean(void)991*7688df22SAndroid Build Coastguard Worker int suite_ras_tests_clean(void)
992*7688df22SAndroid Build Coastguard Worker {
993*7688df22SAndroid Build Coastguard Worker 	int r;
994*7688df22SAndroid Build Coastguard Worker 	int i;
995*7688df22SAndroid Build Coastguard Worker 	int ret = CUE_SUCCESS;
996*7688df22SAndroid Build Coastguard Worker 
997*7688df22SAndroid Build Coastguard Worker 	for (i = 0; i < devices_count; i++) {
998*7688df22SAndroid Build Coastguard Worker 		r = amdgpu_device_deinitialize(devices[i].device_handle);
999*7688df22SAndroid Build Coastguard Worker 		if (r)
1000*7688df22SAndroid Build Coastguard Worker 			ret = CUE_SCLEAN_FAILED;
1001*7688df22SAndroid Build Coastguard Worker 	}
1002*7688df22SAndroid Build Coastguard Worker 	return ret;
1003*7688df22SAndroid Build Coastguard Worker }
1004