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