xref: /openbsd/sys/dev/pci/drm/amd/amdgpu/gfx_v9_0.c (revision c1522d76)
1fb4d8502Sjsg /*
2fb4d8502Sjsg  * Copyright 2016 Advanced Micro Devices, Inc.
3fb4d8502Sjsg  *
4fb4d8502Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg  * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg  * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg  * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg  *
11fb4d8502Sjsg  * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg  * all copies or substantial portions of the Software.
13fb4d8502Sjsg  *
14fb4d8502Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fb4d8502Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg  *
22fb4d8502Sjsg  */
23c349dbc7Sjsg 
24c349dbc7Sjsg #include <linux/delay.h>
25fb4d8502Sjsg #include <linux/kernel.h>
26fb4d8502Sjsg #include <linux/firmware.h>
27c349dbc7Sjsg #include <linux/module.h>
28c349dbc7Sjsg #include <linux/pci.h>
29c349dbc7Sjsg 
30fb4d8502Sjsg #include "amdgpu.h"
31fb4d8502Sjsg #include "amdgpu_gfx.h"
32fb4d8502Sjsg #include "soc15.h"
33fb4d8502Sjsg #include "soc15d.h"
34fb4d8502Sjsg #include "amdgpu_atomfirmware.h"
35c349dbc7Sjsg #include "amdgpu_pm.h"
36fb4d8502Sjsg 
37fb4d8502Sjsg #include "gc/gc_9_0_offset.h"
38fb4d8502Sjsg #include "gc/gc_9_0_sh_mask.h"
39c349dbc7Sjsg 
40fb4d8502Sjsg #include "vega10_enum.h"
41fb4d8502Sjsg 
42fb4d8502Sjsg #include "soc15_common.h"
43fb4d8502Sjsg #include "clearstate_gfx9.h"
44fb4d8502Sjsg #include "v9_structs.h"
45fb4d8502Sjsg 
46fb4d8502Sjsg #include "ivsrcid/gfx/irqsrcs_gfx_9_0.h"
47fb4d8502Sjsg 
48c349dbc7Sjsg #include "amdgpu_ras.h"
49c349dbc7Sjsg 
50f005ef32Sjsg #include "amdgpu_ring_mux.h"
51c349dbc7Sjsg #include "gfx_v9_4.h"
52ad8b1aafSjsg #include "gfx_v9_0.h"
535ca02815Sjsg #include "gfx_v9_4_2.h"
54ad8b1aafSjsg 
55ad8b1aafSjsg #include "asic_reg/pwr/pwr_10_0_offset.h"
56ad8b1aafSjsg #include "asic_reg/pwr/pwr_10_0_sh_mask.h"
575ca02815Sjsg #include "asic_reg/gc/gc_9_0_default.h"
58c349dbc7Sjsg 
59fb4d8502Sjsg #define GFX9_NUM_GFX_RINGS     1
60f005ef32Sjsg #define GFX9_NUM_SW_GFX_RINGS  2
61c349dbc7Sjsg #define GFX9_MEC_HPD_SIZE 4096
62fb4d8502Sjsg #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L
63fb4d8502Sjsg #define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L
64fb4d8502Sjsg 
65c349dbc7Sjsg #define mmGCEA_PROBE_MAP                        0x070c
66c349dbc7Sjsg #define mmGCEA_PROBE_MAP_BASE_IDX               0
67c349dbc7Sjsg 
68fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_ce.bin");
69fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_pfp.bin");
70fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_me.bin");
71fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_mec.bin");
72fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_mec2.bin");
73fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega10_rlc.bin");
74fb4d8502Sjsg 
75fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_ce.bin");
76fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_pfp.bin");
77fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_me.bin");
78fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_mec.bin");
79fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_mec2.bin");
80fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega12_rlc.bin");
81fb4d8502Sjsg 
82fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_ce.bin");
83fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_pfp.bin");
84fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_me.bin");
85fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_mec.bin");
86fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_mec2.bin");
87fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/vega20_rlc.bin");
88fb4d8502Sjsg 
89fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_ce.bin");
90fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_pfp.bin");
91fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_me.bin");
92fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_mec.bin");
93fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_mec2.bin");
94fb4d8502Sjsg MODULE_FIRMWARE("amdgpu/raven_rlc.bin");
95fb4d8502Sjsg 
9602fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_ce.bin");
9702fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_pfp.bin");
9802fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_me.bin");
9902fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_mec.bin");
10002fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_mec2.bin");
10102fbaceeSjsg MODULE_FIRMWARE("amdgpu/picasso_rlc.bin");
102c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/picasso_rlc_am4.bin");
103c349dbc7Sjsg 
104c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_ce.bin");
105c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_pfp.bin");
106c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_me.bin");
107c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_mec.bin");
108c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_mec2.bin");
109c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven2_rlc.bin");
110c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin");
111c349dbc7Sjsg 
112c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/arcturus_mec.bin");
113c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/arcturus_rlc.bin");
114c349dbc7Sjsg 
115c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/renoir_ce.bin");
116c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/renoir_pfp.bin");
117c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/renoir_me.bin");
118c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/renoir_mec.bin");
119c349dbc7Sjsg MODULE_FIRMWARE("amdgpu/renoir_rlc.bin");
120c349dbc7Sjsg 
121ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_ce.bin");
122ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_pfp.bin");
123ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_me.bin");
124ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_mec.bin");
125ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_mec2.bin");
126ad8b1aafSjsg MODULE_FIRMWARE("amdgpu/green_sardine_rlc.bin");
127ad8b1aafSjsg 
1285ca02815Sjsg MODULE_FIRMWARE("amdgpu/aldebaran_mec.bin");
1295ca02815Sjsg MODULE_FIRMWARE("amdgpu/aldebaran_mec2.bin");
1305ca02815Sjsg MODULE_FIRMWARE("amdgpu/aldebaran_rlc.bin");
1311bb76ff1Sjsg MODULE_FIRMWARE("amdgpu/aldebaran_sjt_mec.bin");
1321bb76ff1Sjsg MODULE_FIRMWARE("amdgpu/aldebaran_sjt_mec2.bin");
1335ca02815Sjsg 
134c349dbc7Sjsg #define mmTCP_CHAN_STEER_0_ARCT								0x0b03
135c349dbc7Sjsg #define mmTCP_CHAN_STEER_0_ARCT_BASE_IDX							0
136c349dbc7Sjsg #define mmTCP_CHAN_STEER_1_ARCT								0x0b04
137c349dbc7Sjsg #define mmTCP_CHAN_STEER_1_ARCT_BASE_IDX							0
138c349dbc7Sjsg #define mmTCP_CHAN_STEER_2_ARCT								0x0b09
139c349dbc7Sjsg #define mmTCP_CHAN_STEER_2_ARCT_BASE_IDX							0
140c349dbc7Sjsg #define mmTCP_CHAN_STEER_3_ARCT								0x0b0a
141c349dbc7Sjsg #define mmTCP_CHAN_STEER_3_ARCT_BASE_IDX							0
142c349dbc7Sjsg #define mmTCP_CHAN_STEER_4_ARCT								0x0b0b
143c349dbc7Sjsg #define mmTCP_CHAN_STEER_4_ARCT_BASE_IDX							0
144c349dbc7Sjsg #define mmTCP_CHAN_STEER_5_ARCT								0x0b0c
145c349dbc7Sjsg #define mmTCP_CHAN_STEER_5_ARCT_BASE_IDX							0
146c349dbc7Sjsg 
147c953f924Sjsg #define mmGOLDEN_TSC_COUNT_UPPER_Renoir                0x0025
148c953f924Sjsg #define mmGOLDEN_TSC_COUNT_UPPER_Renoir_BASE_IDX       1
149c953f924Sjsg #define mmGOLDEN_TSC_COUNT_LOWER_Renoir                0x0026
150c953f924Sjsg #define mmGOLDEN_TSC_COUNT_LOWER_Renoir_BASE_IDX       1
151c953f924Sjsg 
152c349dbc7Sjsg enum ta_ras_gfx_subblock {
153c349dbc7Sjsg 	/*CPC*/
154c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPC_INDEX_START = 0,
155c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPC_SCRATCH = TA_RAS_BLOCK__GFX_CPC_INDEX_START,
156c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPC_UCODE,
157c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_STATE_ME1,
158c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_CSINVOC_ME1,
159c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_RESTORE_ME1,
160c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_STATE_ME2,
161c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_CSINVOC_ME2,
162c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_DC_RESTORE_ME2,
163c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPC_INDEX_END = TA_RAS_BLOCK__GFX_DC_RESTORE_ME2,
164c349dbc7Sjsg 	/* CPF*/
165c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPF_INDEX_START,
166c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPF_ROQ_ME2 = TA_RAS_BLOCK__GFX_CPF_INDEX_START,
167c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPF_ROQ_ME1,
168c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPF_TAG,
169c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPF_INDEX_END = TA_RAS_BLOCK__GFX_CPF_TAG,
170c349dbc7Sjsg 	/* CPG*/
171c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPG_INDEX_START,
172c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPG_DMA_ROQ = TA_RAS_BLOCK__GFX_CPG_INDEX_START,
173c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPG_DMA_TAG,
174c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPG_TAG,
175c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_CPG_INDEX_END = TA_RAS_BLOCK__GFX_CPG_TAG,
176c349dbc7Sjsg 	/* GDS*/
177c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_INDEX_START,
178c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_MEM = TA_RAS_BLOCK__GFX_GDS_INDEX_START,
179c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_INPUT_QUEUE,
180c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_OA_PHY_CMD_RAM_MEM,
181c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_OA_PHY_DATA_RAM_MEM,
182c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
183c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_GDS_INDEX_END = TA_RAS_BLOCK__GFX_GDS_OA_PIPE_MEM,
184c349dbc7Sjsg 	/* SPI*/
185c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SPI_SR_MEM,
186c349dbc7Sjsg 	/* SQ*/
187c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_INDEX_START,
188c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_SGPR = TA_RAS_BLOCK__GFX_SQ_INDEX_START,
189c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_LDS_D,
190c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_LDS_I,
191c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_VGPR, /* VGPR = SP*/
192c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQ_INDEX_END = TA_RAS_BLOCK__GFX_SQ_VGPR,
193c349dbc7Sjsg 	/* SQC (3 ranges)*/
194c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX_START,
195c349dbc7Sjsg 	/* SQC range 0*/
196c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX0_START = TA_RAS_BLOCK__GFX_SQC_INDEX_START,
197c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_UTCL1_LFIFO =
198c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_INDEX0_START,
199c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU0_WRITE_DATA_BUF,
200c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU0_UTCL1_LFIFO,
201c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU1_WRITE_DATA_BUF,
202c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU1_UTCL1_LFIFO,
203c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU2_WRITE_DATA_BUF,
204c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
205c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX0_END =
206c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_DATA_CU2_UTCL1_LFIFO,
207c349dbc7Sjsg 	/* SQC range 1*/
208c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX1_START,
209c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKA_TAG_RAM =
210c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_INDEX1_START,
211c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO,
212c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKA_MISS_FIFO,
213c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKA_BANK_RAM,
214c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_TAG_RAM,
215c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_HIT_FIFO,
216c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_MISS_FIFO,
217c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM,
218c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
219c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX1_END =
220c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_DATA_BANKA_BANK_RAM,
221c349dbc7Sjsg 	/* SQC range 2*/
222c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX2_START,
223c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKB_TAG_RAM =
224c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_INDEX2_START,
225c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO,
226c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKB_MISS_FIFO,
227c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INST_BANKB_BANK_RAM,
228c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_TAG_RAM,
229c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_HIT_FIFO,
230c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_MISS_FIFO,
231c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM,
232c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
233c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX2_END =
234c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_SQC_DATA_BANKB_BANK_RAM,
235c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_SQC_INDEX_END = TA_RAS_BLOCK__GFX_SQC_INDEX2_END,
236c349dbc7Sjsg 	/* TA*/
237c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_INDEX_START,
238c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_FS_DFIFO = TA_RAS_BLOCK__GFX_TA_INDEX_START,
239c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_FS_AFIFO,
240c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_FL_LFIFO,
241c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_FX_LFIFO,
242c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_FS_CFIFO,
243c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TA_INDEX_END = TA_RAS_BLOCK__GFX_TA_FS_CFIFO,
244c349dbc7Sjsg 	/* TCA*/
245c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCA_INDEX_START,
246c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCA_HOLE_FIFO = TA_RAS_BLOCK__GFX_TCA_INDEX_START,
247c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCA_REQ_FIFO,
248c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCA_INDEX_END = TA_RAS_BLOCK__GFX_TCA_REQ_FIFO,
249c349dbc7Sjsg 	/* TCC (5 sub-ranges)*/
250c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX_START,
251c349dbc7Sjsg 	/* TCC range 0*/
252c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX0_START = TA_RAS_BLOCK__GFX_TCC_INDEX_START,
253c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DATA = TA_RAS_BLOCK__GFX_TCC_INDEX0_START,
254c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_0_1,
255c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_0,
256c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DATA_BANK_1_1,
257c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_0,
258c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_DIRTY_BANK_1,
259c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_HIGH_RATE_TAG,
260c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
261c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX0_END = TA_RAS_BLOCK__GFX_TCC_LOW_RATE_TAG,
262c349dbc7Sjsg 	/* TCC range 1*/
263c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX1_START,
264c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_IN_USE_DEC = TA_RAS_BLOCK__GFX_TCC_INDEX1_START,
265c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
266c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX1_END =
267c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_TCC_IN_USE_TRANSFER,
268c349dbc7Sjsg 	/* TCC range 2*/
269c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX2_START,
270c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_RETURN_DATA = TA_RAS_BLOCK__GFX_TCC_INDEX2_START,
271c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_RETURN_CONTROL,
272c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_UC_ATOMIC_FIFO,
273c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_WRITE_RETURN,
274c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_WRITE_CACHE_READ,
275c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_SRC_FIFO,
276c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_SRC_FIFO_NEXT_RAM,
277c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
278c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX2_END =
279c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_TCC_CACHE_TAG_PROBE_FIFO,
280c349dbc7Sjsg 	/* TCC range 3*/
281c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX3_START,
282c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO = TA_RAS_BLOCK__GFX_TCC_INDEX3_START,
283c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
284c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX3_END =
285c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_TCC_LATENCY_FIFO_NEXT_RAM,
286c349dbc7Sjsg 	/* TCC range 4*/
287c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX4_START,
288c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_WRRET_TAG_WRITE_RETURN =
289c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_TCC_INDEX4_START,
290c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
291c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX4_END =
292c349dbc7Sjsg 		TA_RAS_BLOCK__GFX_TCC_ATOMIC_RETURN_BUFFER,
293c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCC_INDEX_END = TA_RAS_BLOCK__GFX_TCC_INDEX4_END,
294c349dbc7Sjsg 	/* TCI*/
295c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCI_WRITE_RAM,
296c349dbc7Sjsg 	/* TCP*/
297c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_INDEX_START,
298c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_CACHE_RAM = TA_RAS_BLOCK__GFX_TCP_INDEX_START,
299c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_LFIFO_RAM,
300c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_CMD_FIFO,
301c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_VM_FIFO,
302c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_DB_RAM,
303c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO0,
304c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
305c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TCP_INDEX_END = TA_RAS_BLOCK__GFX_TCP_UTCL1_LFIFO1,
306c349dbc7Sjsg 	/* TD*/
307c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TD_INDEX_START,
308c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TD_SS_FIFO_LO = TA_RAS_BLOCK__GFX_TD_INDEX_START,
309c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TD_SS_FIFO_HI,
310c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TD_CS_FIFO,
311c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_TD_INDEX_END = TA_RAS_BLOCK__GFX_TD_CS_FIFO,
312c349dbc7Sjsg 	/* EA (3 sub-ranges)*/
313c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX_START,
314c349dbc7Sjsg 	/* EA range 0*/
315c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX0_START = TA_RAS_BLOCK__GFX_EA_INDEX_START,
316c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_DRAMRD_CMDMEM = TA_RAS_BLOCK__GFX_EA_INDEX0_START,
317c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_DRAMWR_CMDMEM,
318c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_DRAMWR_DATAMEM,
319c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_RRET_TAGMEM,
320c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_WRET_TAGMEM,
321c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_GMIRD_CMDMEM,
322c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_GMIWR_CMDMEM,
323c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
324c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX0_END = TA_RAS_BLOCK__GFX_EA_GMIWR_DATAMEM,
325c349dbc7Sjsg 	/* EA range 1*/
326c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX1_START,
327c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_DRAMRD_PAGEMEM = TA_RAS_BLOCK__GFX_EA_INDEX1_START,
328c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_DRAMWR_PAGEMEM,
329c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_IORD_CMDMEM,
330c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_IOWR_CMDMEM,
331c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_IOWR_DATAMEM,
332c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_GMIRD_PAGEMEM,
333c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
334c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX1_END = TA_RAS_BLOCK__GFX_EA_GMIWR_PAGEMEM,
335c349dbc7Sjsg 	/* EA range 2*/
336c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX2_START,
337c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_MAM_D0MEM = TA_RAS_BLOCK__GFX_EA_INDEX2_START,
338c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_MAM_D1MEM,
339c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_MAM_D2MEM,
340c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_MAM_D3MEM,
341c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX2_END = TA_RAS_BLOCK__GFX_EA_MAM_D3MEM,
342c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_EA_INDEX_END = TA_RAS_BLOCK__GFX_EA_INDEX2_END,
343c349dbc7Sjsg 	/* UTC VM L2 bank*/
344c349dbc7Sjsg 	TA_RAS_BLOCK__UTC_VML2_BANK_CACHE,
345c349dbc7Sjsg 	/* UTC VM walker*/
346c349dbc7Sjsg 	TA_RAS_BLOCK__UTC_VML2_WALKER,
347c349dbc7Sjsg 	/* UTC ATC L2 2MB cache*/
348c349dbc7Sjsg 	TA_RAS_BLOCK__UTC_ATCL2_CACHE_2M_BANK,
349c349dbc7Sjsg 	/* UTC ATC L2 4KB cache*/
350c349dbc7Sjsg 	TA_RAS_BLOCK__UTC_ATCL2_CACHE_4K_BANK,
351c349dbc7Sjsg 	TA_RAS_BLOCK__GFX_MAX
352c349dbc7Sjsg };
353c349dbc7Sjsg 
354c349dbc7Sjsg struct ras_gfx_subblock {
355c349dbc7Sjsg 	unsigned char *name;
356c349dbc7Sjsg 	int ta_subblock;
357c349dbc7Sjsg 	int hw_supported_error_type;
358c349dbc7Sjsg 	int sw_supported_error_type;
359c349dbc7Sjsg };
360c349dbc7Sjsg 
361c349dbc7Sjsg #define AMDGPU_RAS_SUB_BLOCK(subblock, a, b, c, d, e, f, g, h)                             \
362c349dbc7Sjsg 	[AMDGPU_RAS_BLOCK__##subblock] = {                                     \
363c349dbc7Sjsg 		#subblock,                                                     \
364c349dbc7Sjsg 		TA_RAS_BLOCK__##subblock,                                      \
365c349dbc7Sjsg 		((a) | ((b) << 1) | ((c) << 2) | ((d) << 3)),                  \
366c349dbc7Sjsg 		(((e) << 1) | ((f) << 3) | (g) | ((h) << 2)),                  \
367c349dbc7Sjsg 	}
368c349dbc7Sjsg 
369c349dbc7Sjsg static const struct ras_gfx_subblock ras_gfx_subblocks[] = {
370c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPC_SCRATCH, 0, 1, 1, 1, 1, 0, 0, 1),
371c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPC_UCODE, 0, 1, 1, 1, 1, 0, 0, 1),
372c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_STATE_ME1, 1, 0, 0, 1, 0, 0, 1, 0),
373c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_CSINVOC_ME1, 1, 0, 0, 1, 0, 0, 0, 0),
374c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_RESTORE_ME1, 1, 0, 0, 1, 0, 0, 0, 0),
375c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_STATE_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
376c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_CSINVOC_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
377c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_DC_RESTORE_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
378c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPF_ROQ_ME2, 1, 0, 0, 1, 0, 0, 0, 0),
379c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPF_ROQ_ME1, 1, 0, 0, 1, 0, 0, 1, 0),
380c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPF_TAG, 0, 1, 1, 1, 1, 0, 0, 1),
381c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPG_DMA_ROQ, 1, 0, 0, 1, 0, 0, 1, 0),
382c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPG_DMA_TAG, 0, 1, 1, 1, 0, 1, 0, 1),
383c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_CPG_TAG, 0, 1, 1, 1, 1, 1, 0, 1),
384c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_GDS_MEM, 0, 1, 1, 1, 0, 0, 0, 0),
385c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_GDS_INPUT_QUEUE, 1, 0, 0, 1, 0, 0, 0, 0),
386c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PHY_CMD_RAM_MEM, 0, 1, 1, 1, 0, 0, 0,
387c349dbc7Sjsg 			     0),
388c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PHY_DATA_RAM_MEM, 1, 0, 0, 1, 0, 0, 0,
389c349dbc7Sjsg 			     0),
390c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_GDS_OA_PIPE_MEM, 0, 1, 1, 1, 0, 0, 0, 0),
391c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SPI_SR_MEM, 1, 0, 0, 1, 0, 0, 0, 0),
392c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQ_SGPR, 0, 1, 1, 1, 0, 0, 0, 0),
393c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQ_LDS_D, 0, 1, 1, 1, 1, 0, 0, 1),
394c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQ_LDS_I, 0, 1, 1, 1, 0, 0, 0, 0),
395c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQ_VGPR, 0, 1, 1, 1, 0, 0, 0, 0),
396c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0, 1),
397c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU0_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
398c349dbc7Sjsg 			     0, 0),
399c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU0_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0,
400c349dbc7Sjsg 			     0),
401c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU1_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
402c349dbc7Sjsg 			     0, 0),
403c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU1_UTCL1_LFIFO, 0, 1, 1, 1, 1, 0, 0,
404c349dbc7Sjsg 			     0),
405c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU2_WRITE_DATA_BUF, 0, 1, 1, 1, 0, 0,
406c349dbc7Sjsg 			     0, 0),
407c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_CU2_UTCL1_LFIFO, 0, 1, 1, 1, 0, 0, 0,
408c349dbc7Sjsg 			     0),
409c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_TAG_RAM, 0, 1, 1, 1, 1, 0, 0,
410c349dbc7Sjsg 			     1),
411c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_UTCL1_MISS_FIFO, 1, 0, 0, 1, 0,
412c349dbc7Sjsg 			     0, 0, 0),
413c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
414c349dbc7Sjsg 			     0),
415c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKA_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
416c349dbc7Sjsg 			     0),
417c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_TAG_RAM, 0, 1, 1, 1, 0, 0, 0,
418c349dbc7Sjsg 			     0),
419c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_HIT_FIFO, 1, 0, 0, 1, 0, 0, 0,
420c349dbc7Sjsg 			     0),
421c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
422c349dbc7Sjsg 			     0),
423c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_DIRTY_BIT_RAM, 1, 0, 0, 1, 0, 0,
424c349dbc7Sjsg 			     0, 0),
425c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKA_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
426c349dbc7Sjsg 			     0),
427c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_TAG_RAM, 0, 1, 1, 1, 1, 0, 0,
428c349dbc7Sjsg 			     0),
429c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_UTCL1_MISS_FIFO, 1, 0, 0, 1, 0,
430c349dbc7Sjsg 			     0, 0, 0),
431c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
432c349dbc7Sjsg 			     0),
433c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_INST_BANKB_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
434c349dbc7Sjsg 			     0),
435c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_TAG_RAM, 0, 1, 1, 1, 0, 0, 0,
436c349dbc7Sjsg 			     0),
437c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_HIT_FIFO, 1, 0, 0, 1, 0, 0, 0,
438c349dbc7Sjsg 			     0),
439c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_MISS_FIFO, 1, 0, 0, 1, 0, 0, 0,
440c349dbc7Sjsg 			     0),
441c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_DIRTY_BIT_RAM, 1, 0, 0, 1, 0, 0,
442c349dbc7Sjsg 			     0, 0),
443c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_SQC_DATA_BANKB_BANK_RAM, 0, 1, 1, 1, 0, 0, 0,
444c349dbc7Sjsg 			     0),
445c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_DFIFO, 0, 1, 1, 1, 1, 0, 0, 1),
446c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_AFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
447c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TA_FL_LFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
448c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TA_FX_LFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
449c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TA_FS_CFIFO, 1, 0, 0, 1, 0, 0, 0, 0),
450c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCA_HOLE_FIFO, 1, 0, 0, 1, 0, 1, 1, 0),
451c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCA_REQ_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
452c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA, 0, 1, 1, 1, 1, 0, 0, 1),
453c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_0_1, 0, 1, 1, 1, 1, 0, 0,
454c349dbc7Sjsg 			     1),
455c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_1_0, 0, 1, 1, 1, 1, 0, 0,
456c349dbc7Sjsg 			     1),
457c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DATA_BANK_1_1, 0, 1, 1, 1, 1, 0, 0,
458c349dbc7Sjsg 			     1),
459c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DIRTY_BANK_0, 0, 1, 1, 1, 0, 0, 0,
460c349dbc7Sjsg 			     0),
461c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_DIRTY_BANK_1, 0, 1, 1, 1, 0, 0, 0,
462c349dbc7Sjsg 			     0),
463c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_HIGH_RATE_TAG, 0, 1, 1, 1, 0, 0, 0, 0),
464c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LOW_RATE_TAG, 0, 1, 1, 1, 0, 0, 0, 0),
465c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_IN_USE_DEC, 1, 0, 0, 1, 0, 0, 0, 0),
466c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_IN_USE_TRANSFER, 1, 0, 0, 1, 0, 0, 0, 0),
467c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_RETURN_DATA, 1, 0, 0, 1, 0, 0, 0, 0),
468c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_RETURN_CONTROL, 1, 0, 0, 1, 0, 0, 0, 0),
469c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_UC_ATOMIC_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
470c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRITE_RETURN, 1, 0, 0, 1, 0, 1, 1, 0),
471c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRITE_CACHE_READ, 1, 0, 0, 1, 0, 0, 0, 0),
472c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_SRC_FIFO, 0, 1, 1, 1, 0, 0, 0, 0),
473c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_SRC_FIFO_NEXT_RAM, 1, 0, 0, 1, 0, 0, 1, 0),
474c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_CACHE_TAG_PROBE_FIFO, 1, 0, 0, 1, 0, 0, 0,
475c349dbc7Sjsg 			     0),
476c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LATENCY_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
477c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_LATENCY_FIFO_NEXT_RAM, 1, 0, 0, 1, 0, 0, 0,
478c349dbc7Sjsg 			     0),
479c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_WRRET_TAG_WRITE_RETURN, 1, 0, 0, 1, 0, 0,
480c349dbc7Sjsg 			     0, 0),
481c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCC_ATOMIC_RETURN_BUFFER, 1, 0, 0, 1, 0, 0, 0,
482c349dbc7Sjsg 			     0),
483c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCI_WRITE_RAM, 1, 0, 0, 1, 0, 0, 0, 0),
484c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_CACHE_RAM, 0, 1, 1, 1, 1, 0, 0, 1),
485c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_LFIFO_RAM, 0, 1, 1, 1, 0, 0, 0, 0),
486c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_CMD_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
487c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_VM_FIFO, 0, 1, 1, 1, 0, 0, 0, 0),
488c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_DB_RAM, 1, 0, 0, 1, 0, 0, 0, 0),
489c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_UTCL1_LFIFO0, 0, 1, 1, 1, 0, 0, 0, 0),
490c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TCP_UTCL1_LFIFO1, 0, 1, 1, 1, 0, 0, 0, 0),
491c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TD_SS_FIFO_LO, 0, 1, 1, 1, 1, 0, 0, 1),
492c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TD_SS_FIFO_HI, 0, 1, 1, 1, 0, 0, 0, 0),
493c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_TD_CS_FIFO, 1, 0, 0, 1, 0, 0, 0, 0),
494c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMRD_CMDMEM, 0, 1, 1, 1, 1, 0, 0, 1),
495c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
496c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_DATAMEM, 0, 1, 1, 1, 0, 0, 0, 0),
497c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_RRET_TAGMEM, 0, 1, 1, 1, 0, 0, 0, 0),
498c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_WRET_TAGMEM, 0, 1, 1, 1, 0, 0, 0, 0),
499c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIRD_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
500c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_CMDMEM, 0, 1, 1, 1, 0, 0, 0, 0),
501c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_DATAMEM, 0, 1, 1, 1, 0, 0, 0, 0),
502c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMRD_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
503c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_DRAMWR_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
504c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_IORD_CMDMEM, 1, 0, 0, 1, 0, 0, 0, 0),
505c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_IOWR_CMDMEM, 1, 0, 0, 1, 0, 0, 0, 0),
506c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_IOWR_DATAMEM, 1, 0, 0, 1, 0, 0, 0, 0),
507c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIRD_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
508c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_GMIWR_PAGEMEM, 1, 0, 0, 1, 0, 0, 0, 0),
509c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D0MEM, 1, 0, 0, 1, 0, 0, 0, 0),
510c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D1MEM, 1, 0, 0, 1, 0, 0, 0, 0),
511c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D2MEM, 1, 0, 0, 1, 0, 0, 0, 0),
512c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(GFX_EA_MAM_D3MEM, 1, 0, 0, 1, 0, 0, 0, 0),
513c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(UTC_VML2_BANK_CACHE, 0, 1, 1, 1, 0, 0, 0, 0),
514c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(UTC_VML2_WALKER, 0, 1, 1, 1, 0, 0, 0, 0),
515c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(UTC_ATCL2_CACHE_2M_BANK, 1, 0, 0, 1, 0, 0, 0, 0),
516c349dbc7Sjsg 	AMDGPU_RAS_SUB_BLOCK(UTC_ATCL2_CACHE_4K_BANK, 0, 1, 1, 1, 0, 0, 0, 0),
517c349dbc7Sjsg };
51802fbaceeSjsg 
519fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_0[] =
520fb4d8502Sjsg {
5217a066a52Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400),
522bbba1d3bSjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0x80000000, 0x80000000),
523fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
524fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
525fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
526fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
527fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
528fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),
529fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800),
530ad8b1aafSjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x00ffff87),
531ad8b1aafSjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x00ffff8f),
532fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
533fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
534fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
535fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197),
536fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
537c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff),
538c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
539c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
540c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
541fb4d8502Sjsg };
542fb4d8502Sjsg 
543fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_0_vg10[] =
544fb4d8502Sjsg {
545fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0x0000f000, 0x00012107),
546fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
547fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
548fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
549fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
550fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
551fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x2a114042),
552fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
553fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0x00008000, 0x00048000),
554fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
555fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
556fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
557fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
558fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
559fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
560fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x01000107),
561fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x00001800, 0x00000800),
562fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080)
563fb4d8502Sjsg };
564fb4d8502Sjsg 
565fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_0_vg20[] =
566fb4d8502Sjsg {
567fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0x0f000080, 0x04000080),
568fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0x0f000000, 0x0a000000),
569fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
570fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xf3e777ff, 0x22014042),
571fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xf3e777ff, 0x22014042),
572fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0x00003e00, 0x00000400),
573fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xff840000, 0x04040000),
574fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00030000),
575fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0xffff010f, 0x01000107),
576fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0x000b0000, 0x000b0000),
577fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01000000, 0x01000000)
578fb4d8502Sjsg };
579fb4d8502Sjsg 
580fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_1[] =
581fb4d8502Sjsg {
582fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
583fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
584fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
585fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
586fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
587fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
588fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
589fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
590fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
591fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
592fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
593fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
594fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
595fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
596fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
597fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
598fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
599fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003120),
600fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
601fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000000ff),
602c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080),
603c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
604c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
605c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
606fb4d8502Sjsg };
607fb4d8502Sjsg 
608fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_1_rv1[] =
609fb4d8502Sjsg {
610fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
611fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x24000042),
612fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x24000042),
613fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04048000),
614fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_MODE_CNTL_1, 0x06000000, 0x06000000),
615fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
616fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x00000800)
617fb4d8502Sjsg };
618fb4d8502Sjsg 
619c349dbc7Sjsg static const struct soc15_reg_golden golden_settings_gc_9_1_rv2[] =
620c349dbc7Sjsg {
621c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0xff7fffff, 0x04000000),
622c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
623c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0xff7fffff, 0x0a000000),
624c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x7f0fffff, 0x08000080),
625c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0xff8fffff, 0x08000080),
626c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x7f8fffff, 0x08000080),
627c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x26013041),
628c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x26013041),
629c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x3f8fffff, 0x08000080),
630c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
631c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0xff0fffff, 0x08000080),
632c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0xff0fffff, 0x08000080),
633c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0xff0fffff, 0x08000080),
634c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0xff0fffff, 0x08000080),
635c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0xff0fffff, 0x08000080),
636c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
637c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00000010),
638c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x01000000),
639c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x3f8fffff, 0x08000080),
640c349dbc7Sjsg };
641c349dbc7Sjsg 
642c349dbc7Sjsg static const struct soc15_reg_golden golden_settings_gc_9_1_rn[] =
643c349dbc7Sjsg {
644c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
645c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0xff7fffff, 0x0a000000),
646c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400),
647c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xf3e777ff, 0x24000042),
648c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xf3e777ff, 0x24000042),
649c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
650c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
651c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
652c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
653c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
654c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003120),
655c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCEA_PROBE_MAP, 0xffffffff, 0x0000cccc),
656c349dbc7Sjsg };
657c349dbc7Sjsg 
658fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_x_common[] =
659fb4d8502Sjsg {
660c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_SD_CNTL, 0xffffffff, 0x000001ff),
661fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_INDEX, 0xffffffff, 0x00000000),
662fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_DATA, 0xffffffff, 0x2544c382)
663fb4d8502Sjsg };
664fb4d8502Sjsg 
665fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_2_1[] =
666fb4d8502Sjsg {
667fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
668fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
669fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
670fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
671fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
672fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
673fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),
674fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800),
675fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x0000ff87),
676fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x0000ff8f),
677fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
678fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
679fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
680fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197),
681fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
682fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff)
683fb4d8502Sjsg };
684fb4d8502Sjsg 
685fb4d8502Sjsg static const struct soc15_reg_golden golden_settings_gc_9_2_1_vg12[] =
686fb4d8502Sjsg {
687fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_DCC_CONFIG, 0x00000080, 0x04000080),
688fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
689fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_2, 0x0f000000, 0x0a000000),
690fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x24104041),
691fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x24104041),
692fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04040000),
693fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0xffff03ff, 0x01000107),
694fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
695fb4d8502Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x76325410),
696c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x01000000),
697c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000800, 0x00000800),
698c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000800, 0x00000800),
699c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00008000, 0x00008000)
700c349dbc7Sjsg };
701c349dbc7Sjsg 
702c349dbc7Sjsg static const struct soc15_reg_golden golden_settings_gc_9_4_1_arct[] =
703c349dbc7Sjsg {
704c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
705c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x10b0000),
706c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_0_ARCT, 0x3fffffff, 0x346f0a4e),
707c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_1_ARCT, 0x3fffffff, 0x1c642ca),
708c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_2_ARCT, 0x3fffffff, 0x26f45098),
709c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_3_ARCT, 0x3fffffff, 0x2ebd9fe3),
710c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_4_ARCT, 0x3fffffff, 0xb90f5b1),
711c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_5_ARCT, 0x3ff, 0x135),
712c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_CONFIG, 0xffffffff, 0x011A0000),
713c349dbc7Sjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_FIFO_SIZES, 0xffffffff, 0x00000f00),
714ad8b1aafSjsg 	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_UTCL1_CNTL1, 0x30000000, 0x30000000)
715c349dbc7Sjsg };
716c349dbc7Sjsg 
717c349dbc7Sjsg static const struct soc15_reg_rlcg rlcg_access_gc_9_0[] = {
718c349dbc7Sjsg 	{SOC15_REG_ENTRY(GC, 0, mmGRBM_GFX_INDEX)},
719c349dbc7Sjsg 	{SOC15_REG_ENTRY(GC, 0, mmSQ_IND_INDEX)},
720fb4d8502Sjsg };
721fb4d8502Sjsg 
722fb4d8502Sjsg static const u32 GFX_RLC_SRM_INDEX_CNTL_ADDR_OFFSETS[] =
723fb4d8502Sjsg {
724fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_0 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
725fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_1 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
726fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_2 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
727fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_3 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
728fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_4 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
729fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_5 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
730fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_6 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
731fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_ADDR_7 - mmRLC_SRM_INDEX_CNTL_ADDR_0,
732fb4d8502Sjsg };
733fb4d8502Sjsg 
734fb4d8502Sjsg static const u32 GFX_RLC_SRM_INDEX_CNTL_DATA_OFFSETS[] =
735fb4d8502Sjsg {
736fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_0 - mmRLC_SRM_INDEX_CNTL_DATA_0,
737fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_1 - mmRLC_SRM_INDEX_CNTL_DATA_0,
738fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_2 - mmRLC_SRM_INDEX_CNTL_DATA_0,
739fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_3 - mmRLC_SRM_INDEX_CNTL_DATA_0,
740fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_4 - mmRLC_SRM_INDEX_CNTL_DATA_0,
741fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_5 - mmRLC_SRM_INDEX_CNTL_DATA_0,
742fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_6 - mmRLC_SRM_INDEX_CNTL_DATA_0,
743fb4d8502Sjsg 	mmRLC_SRM_INDEX_CNTL_DATA_7 - mmRLC_SRM_INDEX_CNTL_DATA_0,
744fb4d8502Sjsg };
745fb4d8502Sjsg 
746fb4d8502Sjsg #define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042
747fb4d8502Sjsg #define VEGA12_GB_ADDR_CONFIG_GOLDEN 0x24104041
748fb4d8502Sjsg #define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042
749c349dbc7Sjsg #define RAVEN2_GB_ADDR_CONFIG_GOLDEN 0x26013041
750fb4d8502Sjsg 
751fb4d8502Sjsg static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev);
752fb4d8502Sjsg static void gfx_v9_0_set_irq_funcs(struct amdgpu_device *adev);
753fb4d8502Sjsg static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev);
754fb4d8502Sjsg static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev);
755fb4d8502Sjsg static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,
756fb4d8502Sjsg 				struct amdgpu_cu_info *cu_info);
757fb4d8502Sjsg static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev);
758f005ef32Sjsg static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bool usegds);
759c349dbc7Sjsg static u64 gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring *ring);
7601bb76ff1Sjsg static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,
761c349dbc7Sjsg 					  void *ras_error_status);
762c349dbc7Sjsg static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev,
763f005ef32Sjsg 				     void *inject_if, uint32_t instance_mask);
764c349dbc7Sjsg static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev);
765f005ef32Sjsg static void gfx_v9_0_update_spm_vmid_internal(struct amdgpu_device *adev,
766f005ef32Sjsg 					      unsigned int vmid);
767c349dbc7Sjsg 
gfx_v9_0_kiq_set_resources(struct amdgpu_ring * kiq_ring,uint64_t queue_mask)768c349dbc7Sjsg static void gfx_v9_0_kiq_set_resources(struct amdgpu_ring *kiq_ring,
769c349dbc7Sjsg 				uint64_t queue_mask)
770c349dbc7Sjsg {
771c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6));
772c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
773c349dbc7Sjsg 		PACKET3_SET_RESOURCES_VMID_MASK(0) |
774c349dbc7Sjsg 		/* vmid_mask:0* queue_type:0 (KIQ) */
775c349dbc7Sjsg 		PACKET3_SET_RESOURCES_QUEUE_TYPE(0));
776c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
777c349dbc7Sjsg 			lower_32_bits(queue_mask));	/* queue mask lo */
778c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
779c349dbc7Sjsg 			upper_32_bits(queue_mask));	/* queue mask hi */
780c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, 0);	/* gws mask lo */
781c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, 0);	/* gws mask hi */
782c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, 0);	/* oac mask */
783c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, 0);	/* gds heap base:0, gds heap size:0 */
784c349dbc7Sjsg }
785c349dbc7Sjsg 
gfx_v9_0_kiq_map_queues(struct amdgpu_ring * kiq_ring,struct amdgpu_ring * ring)786c349dbc7Sjsg static void gfx_v9_0_kiq_map_queues(struct amdgpu_ring *kiq_ring,
787c349dbc7Sjsg 				 struct amdgpu_ring *ring)
788c349dbc7Sjsg {
789c349dbc7Sjsg 	uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);
7901bb76ff1Sjsg 	uint64_t wptr_addr = ring->wptr_gpu_addr;
791c349dbc7Sjsg 	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
792c349dbc7Sjsg 
793c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5));
794c349dbc7Sjsg 	/* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/
795c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
796c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_QUEUE_SEL(0) | /* Queue_Sel */
797c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_VMID(0) | /* VMID */
798c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_QUEUE(ring->queue) |
799c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_PIPE(ring->pipe) |
800c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |
801c349dbc7Sjsg 			 /*queue_type: normal compute queue */
802c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_QUEUE_TYPE(0) |
803c349dbc7Sjsg 			 /* alloc format: all_on_one_pipe */
804c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) |
805c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_ENGINE_SEL(eng_sel) |
806c349dbc7Sjsg 			 /* num_queues: must be 1 */
807c349dbc7Sjsg 			 PACKET3_MAP_QUEUES_NUM_QUEUES(1));
808c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
809c349dbc7Sjsg 			PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index));
810c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr));
811c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr));
812c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr));
813c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
814c349dbc7Sjsg }
815c349dbc7Sjsg 
gfx_v9_0_kiq_unmap_queues(struct amdgpu_ring * kiq_ring,struct amdgpu_ring * ring,enum amdgpu_unmap_queues_action action,u64 gpu_addr,u64 seq)816c349dbc7Sjsg static void gfx_v9_0_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,
817c349dbc7Sjsg 				   struct amdgpu_ring *ring,
818c349dbc7Sjsg 				   enum amdgpu_unmap_queues_action action,
819c349dbc7Sjsg 				   u64 gpu_addr, u64 seq)
820c349dbc7Sjsg {
821c349dbc7Sjsg 	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
822c349dbc7Sjsg 
823c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
824c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
825c349dbc7Sjsg 			  PACKET3_UNMAP_QUEUES_ACTION(action) |
826c349dbc7Sjsg 			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
827c349dbc7Sjsg 			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(eng_sel) |
828c349dbc7Sjsg 			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
829c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
830c349dbc7Sjsg 			PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));
831c349dbc7Sjsg 
832c349dbc7Sjsg 	if (action == PREEMPT_QUEUES_NO_UNMAP) {
833f005ef32Sjsg 		amdgpu_ring_write(kiq_ring, lower_32_bits(ring->wptr & ring->buf_mask));
834f005ef32Sjsg 		amdgpu_ring_write(kiq_ring, 0);
835f005ef32Sjsg 		amdgpu_ring_write(kiq_ring, 0);
836f005ef32Sjsg 
837c349dbc7Sjsg 	} else {
838c349dbc7Sjsg 		amdgpu_ring_write(kiq_ring, 0);
839c349dbc7Sjsg 		amdgpu_ring_write(kiq_ring, 0);
840c349dbc7Sjsg 		amdgpu_ring_write(kiq_ring, 0);
841c349dbc7Sjsg 	}
842c349dbc7Sjsg }
843c349dbc7Sjsg 
gfx_v9_0_kiq_query_status(struct amdgpu_ring * kiq_ring,struct amdgpu_ring * ring,u64 addr,u64 seq)844c349dbc7Sjsg static void gfx_v9_0_kiq_query_status(struct amdgpu_ring *kiq_ring,
845c349dbc7Sjsg 				   struct amdgpu_ring *ring,
846c349dbc7Sjsg 				   u64 addr,
847c349dbc7Sjsg 				   u64 seq)
848c349dbc7Sjsg {
849c349dbc7Sjsg 	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
850c349dbc7Sjsg 
851c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_QUERY_STATUS, 5));
852c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
853c349dbc7Sjsg 			  PACKET3_QUERY_STATUS_CONTEXT_ID(0) |
854c349dbc7Sjsg 			  PACKET3_QUERY_STATUS_INTERRUPT_SEL(0) |
855c349dbc7Sjsg 			  PACKET3_QUERY_STATUS_COMMAND(2));
856c349dbc7Sjsg 	/* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
857c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
858c349dbc7Sjsg 			PACKET3_QUERY_STATUS_DOORBELL_OFFSET(ring->doorbell_index) |
859c349dbc7Sjsg 			PACKET3_QUERY_STATUS_ENG_SEL(eng_sel));
860c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, lower_32_bits(addr));
861c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, upper_32_bits(addr));
862c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, lower_32_bits(seq));
863c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, upper_32_bits(seq));
864c349dbc7Sjsg }
865c349dbc7Sjsg 
gfx_v9_0_kiq_invalidate_tlbs(struct amdgpu_ring * kiq_ring,uint16_t pasid,uint32_t flush_type,bool all_hub)866c349dbc7Sjsg static void gfx_v9_0_kiq_invalidate_tlbs(struct amdgpu_ring *kiq_ring,
867c349dbc7Sjsg 				uint16_t pasid, uint32_t flush_type,
868c349dbc7Sjsg 				bool all_hub)
869c349dbc7Sjsg {
870c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0));
871c349dbc7Sjsg 	amdgpu_ring_write(kiq_ring,
872c349dbc7Sjsg 			PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
873c349dbc7Sjsg 			PACKET3_INVALIDATE_TLBS_ALL_HUB(all_hub) |
874c349dbc7Sjsg 			PACKET3_INVALIDATE_TLBS_PASID(pasid) |
875c349dbc7Sjsg 			PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(flush_type));
876c349dbc7Sjsg }
877c349dbc7Sjsg 
878c349dbc7Sjsg static const struct kiq_pm4_funcs gfx_v9_0_kiq_pm4_funcs = {
879c349dbc7Sjsg 	.kiq_set_resources = gfx_v9_0_kiq_set_resources,
880c349dbc7Sjsg 	.kiq_map_queues = gfx_v9_0_kiq_map_queues,
881c349dbc7Sjsg 	.kiq_unmap_queues = gfx_v9_0_kiq_unmap_queues,
882c349dbc7Sjsg 	.kiq_query_status = gfx_v9_0_kiq_query_status,
883c349dbc7Sjsg 	.kiq_invalidate_tlbs = gfx_v9_0_kiq_invalidate_tlbs,
884c349dbc7Sjsg 	.set_resources_size = 8,
885c349dbc7Sjsg 	.map_queues_size = 7,
886c349dbc7Sjsg 	.unmap_queues_size = 6,
887c349dbc7Sjsg 	.query_status_size = 7,
888c349dbc7Sjsg 	.invalidate_tlbs_size = 2,
889c349dbc7Sjsg };
890c349dbc7Sjsg 
gfx_v9_0_set_kiq_pm4_funcs(struct amdgpu_device * adev)891c349dbc7Sjsg static void gfx_v9_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)
892c349dbc7Sjsg {
893f005ef32Sjsg 	adev->gfx.kiq[0].pmf = &gfx_v9_0_kiq_pm4_funcs;
894c349dbc7Sjsg }
895fb4d8502Sjsg 
gfx_v9_0_init_golden_registers(struct amdgpu_device * adev)896fb4d8502Sjsg static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
897fb4d8502Sjsg {
8981bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
8991bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
900fb4d8502Sjsg 		soc15_program_register_sequence(adev,
901fb4d8502Sjsg 						golden_settings_gc_9_0,
902fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_0));
903fb4d8502Sjsg 		soc15_program_register_sequence(adev,
904fb4d8502Sjsg 						golden_settings_gc_9_0_vg10,
905fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_0_vg10));
906fb4d8502Sjsg 		break;
9071bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
908fb4d8502Sjsg 		soc15_program_register_sequence(adev,
909fb4d8502Sjsg 						golden_settings_gc_9_2_1,
910fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_2_1));
911fb4d8502Sjsg 		soc15_program_register_sequence(adev,
912fb4d8502Sjsg 						golden_settings_gc_9_2_1_vg12,
913fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_2_1_vg12));
914fb4d8502Sjsg 		break;
9151bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
916fb4d8502Sjsg 		soc15_program_register_sequence(adev,
917fb4d8502Sjsg 						golden_settings_gc_9_0,
918fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_0));
919fb4d8502Sjsg 		soc15_program_register_sequence(adev,
920fb4d8502Sjsg 						golden_settings_gc_9_0_vg20,
921fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_0_vg20));
922fb4d8502Sjsg 		break;
9231bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
924fb4d8502Sjsg 		soc15_program_register_sequence(adev,
925c349dbc7Sjsg 						golden_settings_gc_9_4_1_arct,
926c349dbc7Sjsg 						ARRAY_SIZE(golden_settings_gc_9_4_1_arct));
927c349dbc7Sjsg 		break;
9281bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
9291bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
930c349dbc7Sjsg 		soc15_program_register_sequence(adev, golden_settings_gc_9_1,
931fb4d8502Sjsg 						ARRAY_SIZE(golden_settings_gc_9_1));
932ad8b1aafSjsg 		if (adev->apu_flags & AMD_APU_IS_RAVEN2)
933c349dbc7Sjsg 			soc15_program_register_sequence(adev,
934c349dbc7Sjsg 							golden_settings_gc_9_1_rv2,
935c349dbc7Sjsg 							ARRAY_SIZE(golden_settings_gc_9_1_rv2));
936c349dbc7Sjsg 		else
937fb4d8502Sjsg 			soc15_program_register_sequence(adev,
938fb4d8502Sjsg 							golden_settings_gc_9_1_rv1,
939fb4d8502Sjsg 							ARRAY_SIZE(golden_settings_gc_9_1_rv1));
940fb4d8502Sjsg 		break;
9411bb76ff1Sjsg 	 case IP_VERSION(9, 3, 0):
942c349dbc7Sjsg 		soc15_program_register_sequence(adev,
943c349dbc7Sjsg 						golden_settings_gc_9_1_rn,
944c349dbc7Sjsg 						ARRAY_SIZE(golden_settings_gc_9_1_rn));
945c349dbc7Sjsg 		return; /* for renoir, don't need common goldensetting */
9461bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
9475ca02815Sjsg 		gfx_v9_4_2_init_golden_registers(adev,
9485ca02815Sjsg 						 adev->smuio.funcs->get_die_id(adev));
9495ca02815Sjsg 		break;
950fb4d8502Sjsg 	default:
951fb4d8502Sjsg 		break;
952fb4d8502Sjsg 	}
953fb4d8502Sjsg 
9541bb76ff1Sjsg 	if ((adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 1)) &&
9551bb76ff1Sjsg 	    (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 2)))
956fb4d8502Sjsg 		soc15_program_register_sequence(adev, golden_settings_gc_9_x_common,
957fb4d8502Sjsg 						(const u32)ARRAY_SIZE(golden_settings_gc_9_x_common));
958fb4d8502Sjsg }
959fb4d8502Sjsg 
gfx_v9_0_write_data_to_reg(struct amdgpu_ring * ring,int eng_sel,bool wc,uint32_t reg,uint32_t val)960fb4d8502Sjsg static void gfx_v9_0_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel,
961fb4d8502Sjsg 				       bool wc, uint32_t reg, uint32_t val)
962fb4d8502Sjsg {
963fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
964fb4d8502Sjsg 	amdgpu_ring_write(ring, WRITE_DATA_ENGINE_SEL(eng_sel) |
965fb4d8502Sjsg 				WRITE_DATA_DST_SEL(0) |
966fb4d8502Sjsg 				(wc ? WR_CONFIRM : 0));
967fb4d8502Sjsg 	amdgpu_ring_write(ring, reg);
968fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
969fb4d8502Sjsg 	amdgpu_ring_write(ring, val);
970fb4d8502Sjsg }
971fb4d8502Sjsg 
gfx_v9_0_wait_reg_mem(struct amdgpu_ring * ring,int eng_sel,int mem_space,int opt,uint32_t addr0,uint32_t addr1,uint32_t ref,uint32_t mask,uint32_t inv)972fb4d8502Sjsg static void gfx_v9_0_wait_reg_mem(struct amdgpu_ring *ring, int eng_sel,
973fb4d8502Sjsg 				  int mem_space, int opt, uint32_t addr0,
974fb4d8502Sjsg 				  uint32_t addr1, uint32_t ref, uint32_t mask,
975fb4d8502Sjsg 				  uint32_t inv)
976fb4d8502Sjsg {
977fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
978fb4d8502Sjsg 	amdgpu_ring_write(ring,
979fb4d8502Sjsg 				 /* memory (1) or register (0) */
980fb4d8502Sjsg 				 (WAIT_REG_MEM_MEM_SPACE(mem_space) |
981fb4d8502Sjsg 				 WAIT_REG_MEM_OPERATION(opt) | /* wait */
982fb4d8502Sjsg 				 WAIT_REG_MEM_FUNCTION(3) |  /* equal */
983fb4d8502Sjsg 				 WAIT_REG_MEM_ENGINE(eng_sel)));
984fb4d8502Sjsg 
985fb4d8502Sjsg 	if (mem_space)
986fb4d8502Sjsg 		BUG_ON(addr0 & 0x3); /* Dword align */
987fb4d8502Sjsg 	amdgpu_ring_write(ring, addr0);
988fb4d8502Sjsg 	amdgpu_ring_write(ring, addr1);
989fb4d8502Sjsg 	amdgpu_ring_write(ring, ref);
990fb4d8502Sjsg 	amdgpu_ring_write(ring, mask);
991fb4d8502Sjsg 	amdgpu_ring_write(ring, inv); /* poll interval */
992fb4d8502Sjsg }
993fb4d8502Sjsg 
gfx_v9_0_ring_test_ring(struct amdgpu_ring * ring)994fb4d8502Sjsg static int gfx_v9_0_ring_test_ring(struct amdgpu_ring *ring)
995fb4d8502Sjsg {
996fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
9971bb76ff1Sjsg 	uint32_t scratch = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG0);
998fb4d8502Sjsg 	uint32_t tmp = 0;
999fb4d8502Sjsg 	unsigned i;
1000fb4d8502Sjsg 	int r;
1001fb4d8502Sjsg 
1002fb4d8502Sjsg 	WREG32(scratch, 0xCAFEDEAD);
1003fb4d8502Sjsg 	r = amdgpu_ring_alloc(ring, 3);
1004c349dbc7Sjsg 	if (r)
10051bb76ff1Sjsg 		return r;
1006c349dbc7Sjsg 
1007fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
10081bb76ff1Sjsg 	amdgpu_ring_write(ring, scratch - PACKET3_SET_UCONFIG_REG_START);
1009fb4d8502Sjsg 	amdgpu_ring_write(ring, 0xDEADBEEF);
1010fb4d8502Sjsg 	amdgpu_ring_commit(ring);
1011fb4d8502Sjsg 
1012fb4d8502Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
1013fb4d8502Sjsg 		tmp = RREG32(scratch);
1014fb4d8502Sjsg 		if (tmp == 0xDEADBEEF)
1015fb4d8502Sjsg 			break;
1016c349dbc7Sjsg 		udelay(1);
1017fb4d8502Sjsg 	}
1018c349dbc7Sjsg 
1019c349dbc7Sjsg 	if (i >= adev->usec_timeout)
1020c349dbc7Sjsg 		r = -ETIMEDOUT;
1021fb4d8502Sjsg 	return r;
1022fb4d8502Sjsg }
1023fb4d8502Sjsg 
gfx_v9_0_ring_test_ib(struct amdgpu_ring * ring,long timeout)1024fb4d8502Sjsg static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1025fb4d8502Sjsg {
1026fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
1027fb4d8502Sjsg 	struct amdgpu_ib ib;
1028fb4d8502Sjsg 	struct dma_fence *f = NULL;
1029fb4d8502Sjsg 
1030fb4d8502Sjsg 	unsigned index;
1031fb4d8502Sjsg 	uint64_t gpu_addr;
1032fb4d8502Sjsg 	uint32_t tmp;
1033fb4d8502Sjsg 	long r;
1034fb4d8502Sjsg 
1035fb4d8502Sjsg 	r = amdgpu_device_wb_get(adev, &index);
1036c349dbc7Sjsg 	if (r)
1037fb4d8502Sjsg 		return r;
1038fb4d8502Sjsg 
1039fb4d8502Sjsg 	gpu_addr = adev->wb.gpu_addr + (index * 4);
1040fb4d8502Sjsg 	adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);
1041fb4d8502Sjsg 	memset(&ib, 0, sizeof(ib));
10427cb3d583Sjsg 
10437cb3d583Sjsg 	r = amdgpu_ib_get(adev, NULL, 20, AMDGPU_IB_POOL_DIRECT, &ib);
1044c349dbc7Sjsg 	if (r)
1045fb4d8502Sjsg 		goto err1;
1046c349dbc7Sjsg 
1047fb4d8502Sjsg 	ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);
1048fb4d8502Sjsg 	ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
1049fb4d8502Sjsg 	ib.ptr[2] = lower_32_bits(gpu_addr);
1050fb4d8502Sjsg 	ib.ptr[3] = upper_32_bits(gpu_addr);
1051fb4d8502Sjsg 	ib.ptr[4] = 0xDEADBEEF;
1052fb4d8502Sjsg 	ib.length_dw = 5;
1053fb4d8502Sjsg 
1054fb4d8502Sjsg 	r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
1055fb4d8502Sjsg 	if (r)
1056fb4d8502Sjsg 		goto err2;
1057fb4d8502Sjsg 
1058fb4d8502Sjsg 	r = dma_fence_wait_timeout(f, false, timeout);
1059fb4d8502Sjsg 	if (r == 0) {
1060fb4d8502Sjsg 		r = -ETIMEDOUT;
1061fb4d8502Sjsg 		goto err2;
1062fb4d8502Sjsg 	} else if (r < 0) {
1063fb4d8502Sjsg 		goto err2;
1064fb4d8502Sjsg 	}
1065fb4d8502Sjsg 
1066fb4d8502Sjsg 	tmp = adev->wb.wb[index];
1067c349dbc7Sjsg 	if (tmp == 0xDEADBEEF)
1068fb4d8502Sjsg 		r = 0;
1069c349dbc7Sjsg 	else
1070fb4d8502Sjsg 		r = -EINVAL;
1071fb4d8502Sjsg 
1072fb4d8502Sjsg err2:
1073fb4d8502Sjsg 	amdgpu_ib_free(adev, &ib, NULL);
1074fb4d8502Sjsg 	dma_fence_put(f);
1075fb4d8502Sjsg err1:
1076fb4d8502Sjsg 	amdgpu_device_wb_free(adev, index);
1077fb4d8502Sjsg 	return r;
1078fb4d8502Sjsg }
1079fb4d8502Sjsg 
1080fb4d8502Sjsg 
gfx_v9_0_free_microcode(struct amdgpu_device * adev)1081fb4d8502Sjsg static void gfx_v9_0_free_microcode(struct amdgpu_device *adev)
1082fb4d8502Sjsg {
1083f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.pfp_fw);
1084f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.me_fw);
1085f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.ce_fw);
1086f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.rlc_fw);
1087f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.mec_fw);
1088f005ef32Sjsg 	amdgpu_ucode_release(&adev->gfx.mec2_fw);
1089fb4d8502Sjsg 
1090fb4d8502Sjsg 	kfree(adev->gfx.rlc.register_list_format);
1091fb4d8502Sjsg }
1092fb4d8502Sjsg 
gfx_v9_0_check_fw_write_wait(struct amdgpu_device * adev)1093c349dbc7Sjsg static void gfx_v9_0_check_fw_write_wait(struct amdgpu_device *adev)
1094fb4d8502Sjsg {
1095c349dbc7Sjsg 	adev->gfx.me_fw_write_wait = false;
1096c349dbc7Sjsg 	adev->gfx.mec_fw_write_wait = false;
1097c349dbc7Sjsg 
10981bb76ff1Sjsg 	if ((adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 1)) &&
1099c349dbc7Sjsg 	    ((adev->gfx.mec_fw_version < 0x000001a5) ||
1100c349dbc7Sjsg 	    (adev->gfx.mec_feature_version < 46) ||
1101c349dbc7Sjsg 	    (adev->gfx.pfp_fw_version < 0x000000b7) ||
1102c349dbc7Sjsg 	    (adev->gfx.pfp_feature_version < 46)))
1103c349dbc7Sjsg 		DRM_WARN_ONCE("CP firmware version too old, please update!");
1104c349dbc7Sjsg 
11051bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
11061bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
1107c349dbc7Sjsg 		if ((adev->gfx.me_fw_version >= 0x0000009c) &&
1108c349dbc7Sjsg 		    (adev->gfx.me_feature_version >= 42) &&
1109c349dbc7Sjsg 		    (adev->gfx.pfp_fw_version >=  0x000000b1) &&
1110c349dbc7Sjsg 		    (adev->gfx.pfp_feature_version >= 42))
1111c349dbc7Sjsg 			adev->gfx.me_fw_write_wait = true;
1112c349dbc7Sjsg 
1113c349dbc7Sjsg 		if ((adev->gfx.mec_fw_version >=  0x00000193) &&
1114c349dbc7Sjsg 		    (adev->gfx.mec_feature_version >= 42))
1115c349dbc7Sjsg 			adev->gfx.mec_fw_write_wait = true;
1116c349dbc7Sjsg 		break;
11171bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
1118c349dbc7Sjsg 		if ((adev->gfx.me_fw_version >= 0x0000009c) &&
1119c349dbc7Sjsg 		    (adev->gfx.me_feature_version >= 44) &&
1120c349dbc7Sjsg 		    (adev->gfx.pfp_fw_version >=  0x000000b2) &&
1121c349dbc7Sjsg 		    (adev->gfx.pfp_feature_version >= 44))
1122c349dbc7Sjsg 			adev->gfx.me_fw_write_wait = true;
1123c349dbc7Sjsg 
1124c349dbc7Sjsg 		if ((adev->gfx.mec_fw_version >=  0x00000196) &&
1125c349dbc7Sjsg 		    (adev->gfx.mec_feature_version >= 44))
1126c349dbc7Sjsg 			adev->gfx.mec_fw_write_wait = true;
1127c349dbc7Sjsg 		break;
11281bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
1129c349dbc7Sjsg 		if ((adev->gfx.me_fw_version >= 0x0000009c) &&
1130c349dbc7Sjsg 		    (adev->gfx.me_feature_version >= 44) &&
1131c349dbc7Sjsg 		    (adev->gfx.pfp_fw_version >=  0x000000b2) &&
1132c349dbc7Sjsg 		    (adev->gfx.pfp_feature_version >= 44))
1133c349dbc7Sjsg 			adev->gfx.me_fw_write_wait = true;
1134c349dbc7Sjsg 
1135c349dbc7Sjsg 		if ((adev->gfx.mec_fw_version >=  0x00000197) &&
1136c349dbc7Sjsg 		    (adev->gfx.mec_feature_version >= 44))
1137c349dbc7Sjsg 			adev->gfx.mec_fw_write_wait = true;
1138c349dbc7Sjsg 		break;
11391bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
11401bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
1141c349dbc7Sjsg 		if ((adev->gfx.me_fw_version >= 0x0000009c) &&
1142c349dbc7Sjsg 		    (adev->gfx.me_feature_version >= 42) &&
1143c349dbc7Sjsg 		    (adev->gfx.pfp_fw_version >=  0x000000b1) &&
1144c349dbc7Sjsg 		    (adev->gfx.pfp_feature_version >= 42))
1145c349dbc7Sjsg 			adev->gfx.me_fw_write_wait = true;
1146c349dbc7Sjsg 
1147c349dbc7Sjsg 		if ((adev->gfx.mec_fw_version >=  0x00000192) &&
1148c349dbc7Sjsg 		    (adev->gfx.mec_feature_version >= 42))
1149c349dbc7Sjsg 			adev->gfx.mec_fw_write_wait = true;
1150c349dbc7Sjsg 		break;
1151c349dbc7Sjsg 	default:
1152c349dbc7Sjsg 		adev->gfx.me_fw_write_wait = true;
1153c349dbc7Sjsg 		adev->gfx.mec_fw_write_wait = true;
1154c349dbc7Sjsg 		break;
1155c349dbc7Sjsg 	}
1156c349dbc7Sjsg }
1157c349dbc7Sjsg 
1158c349dbc7Sjsg struct amdgpu_gfxoff_quirk {
1159c349dbc7Sjsg 	u16 chip_vendor;
1160c349dbc7Sjsg 	u16 chip_device;
1161c349dbc7Sjsg 	u16 subsys_vendor;
1162c349dbc7Sjsg 	u16 subsys_device;
1163c349dbc7Sjsg 	u8 revision;
1164c349dbc7Sjsg };
1165c349dbc7Sjsg 
1166c349dbc7Sjsg static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = {
1167c349dbc7Sjsg 	/* https://bugzilla.kernel.org/show_bug.cgi?id=204689 */
1168c349dbc7Sjsg 	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc8 },
1169c349dbc7Sjsg 	/* https://bugzilla.kernel.org/show_bug.cgi?id=207171 */
1170c349dbc7Sjsg 	{ 0x1002, 0x15dd, 0x103c, 0x83e7, 0xd3 },
1171c349dbc7Sjsg 	/* GFXOFF is unstable on C6 parts with a VBIOS 113-RAVEN-114 */
1172c349dbc7Sjsg 	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },
1173657bc213Sjsg 	/* Apple MacBook Pro (15-inch, 2019) Radeon Pro Vega 20 4 GB */
1174657bc213Sjsg 	{ 0x1002, 0x69af, 0x106b, 0x019a, 0xc0 },
1175c349dbc7Sjsg 	{ 0, 0, 0, 0, 0 },
1176c349dbc7Sjsg };
1177c349dbc7Sjsg 
gfx_v9_0_should_disable_gfxoff(struct pci_dev * pdev)1178c349dbc7Sjsg static bool gfx_v9_0_should_disable_gfxoff(struct pci_dev *pdev)
1179c349dbc7Sjsg {
1180c349dbc7Sjsg 	const struct amdgpu_gfxoff_quirk *p = amdgpu_gfxoff_quirk_list;
1181c349dbc7Sjsg 
1182c349dbc7Sjsg 	while (p && p->chip_device != 0) {
1183c349dbc7Sjsg 		if (pdev->vendor == p->chip_vendor &&
1184c349dbc7Sjsg 		    pdev->device == p->chip_device &&
1185c349dbc7Sjsg 		    pdev->subsystem_vendor == p->subsys_vendor &&
1186c349dbc7Sjsg 		    pdev->subsystem_device == p->subsys_device &&
1187c349dbc7Sjsg 		    pdev->revision == p->revision) {
1188c349dbc7Sjsg 			return true;
1189c349dbc7Sjsg 		}
1190c349dbc7Sjsg 		++p;
1191c349dbc7Sjsg 	}
1192c349dbc7Sjsg 	return false;
1193c349dbc7Sjsg }
1194c349dbc7Sjsg 
is_raven_kicker(struct amdgpu_device * adev)1195c349dbc7Sjsg static bool is_raven_kicker(struct amdgpu_device *adev)
1196c349dbc7Sjsg {
1197c349dbc7Sjsg 	if (adev->pm.fw_version >= 0x41e2b)
1198c349dbc7Sjsg 		return true;
1199c349dbc7Sjsg 	else
1200c349dbc7Sjsg 		return false;
1201c349dbc7Sjsg }
1202c349dbc7Sjsg 
check_if_enlarge_doorbell_range(struct amdgpu_device * adev)12031c23f5d9Sjsg static bool check_if_enlarge_doorbell_range(struct amdgpu_device *adev)
12041c23f5d9Sjsg {
12051bb76ff1Sjsg 	if ((adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 3, 0)) &&
12061c23f5d9Sjsg 	    (adev->gfx.me_fw_version >= 0x000000a5) &&
12071c23f5d9Sjsg 	    (adev->gfx.me_feature_version >= 52))
12081c23f5d9Sjsg 		return true;
12091c23f5d9Sjsg 	else
12101c23f5d9Sjsg 		return false;
12111c23f5d9Sjsg }
12121c23f5d9Sjsg 
gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device * adev)1213c349dbc7Sjsg static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
1214c349dbc7Sjsg {
1215c349dbc7Sjsg 	if (gfx_v9_0_should_disable_gfxoff(adev->pdev))
1216c349dbc7Sjsg 		adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
1217c349dbc7Sjsg 
12181bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
12191bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
12201bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
12211bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
1222c349dbc7Sjsg 		break;
12231bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
12241bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
1225ad8b1aafSjsg 		if (!((adev->apu_flags & AMD_APU_IS_RAVEN2) ||
1226ad8b1aafSjsg 		      (adev->apu_flags & AMD_APU_IS_PICASSO)) &&
1227c349dbc7Sjsg 		    ((!is_raven_kicker(adev) &&
1228c349dbc7Sjsg 		      adev->gfx.rlc_fw_version < 531) ||
1229c349dbc7Sjsg 		     (adev->gfx.rlc_feature_version < 1) ||
1230c349dbc7Sjsg 		     !adev->gfx.rlc.is_rlc_v2_1))
1231c349dbc7Sjsg 			adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
1232c349dbc7Sjsg 
1233c349dbc7Sjsg 		if (adev->pm.pp_feature & PP_GFXOFF_MASK)
1234c349dbc7Sjsg 			adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
1235c349dbc7Sjsg 				AMD_PG_SUPPORT_CP |
1236c349dbc7Sjsg 				AMD_PG_SUPPORT_RLC_SMU_HS;
1237c349dbc7Sjsg 		break;
12381bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
1239c349dbc7Sjsg 		if (adev->pm.pp_feature & PP_GFXOFF_MASK)
1240c349dbc7Sjsg 			adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
1241c349dbc7Sjsg 				AMD_PG_SUPPORT_CP |
1242c349dbc7Sjsg 				AMD_PG_SUPPORT_RLC_SMU_HS;
1243c349dbc7Sjsg 		break;
1244c349dbc7Sjsg 	default:
1245c349dbc7Sjsg 		break;
1246c349dbc7Sjsg 	}
1247c349dbc7Sjsg }
1248c349dbc7Sjsg 
gfx_v9_0_init_cp_gfx_microcode(struct amdgpu_device * adev,char * chip_name)1249c349dbc7Sjsg static int gfx_v9_0_init_cp_gfx_microcode(struct amdgpu_device *adev,
1250f005ef32Sjsg 					  char *chip_name)
1251c349dbc7Sjsg {
1252fb4d8502Sjsg 	char fw_name[30];
1253fb4d8502Sjsg 	int err;
1254fb4d8502Sjsg 
1255fb4d8502Sjsg 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name);
1256f005ef32Sjsg 	err = amdgpu_ucode_request(adev, &adev->gfx.pfp_fw, fw_name);
1257fb4d8502Sjsg 	if (err)
1258fb4d8502Sjsg 		goto out;
12591bb76ff1Sjsg 	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_PFP);
1260fb4d8502Sjsg 
1261fb4d8502Sjsg 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
1262f005ef32Sjsg 	err = amdgpu_ucode_request(adev, &adev->gfx.me_fw, fw_name);
1263fb4d8502Sjsg 	if (err)
1264fb4d8502Sjsg 		goto out;
12651bb76ff1Sjsg 	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_ME);
1266fb4d8502Sjsg 
1267fb4d8502Sjsg 	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
1268f005ef32Sjsg 	err = amdgpu_ucode_request(adev, &adev->gfx.ce_fw, fw_name);
1269fb4d8502Sjsg 	if (err)
1270fb4d8502Sjsg 		goto out;
12711bb76ff1Sjsg 	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_CE);
1272c349dbc7Sjsg 
1273c349dbc7Sjsg out:
1274c349dbc7Sjsg 	if (err) {
1275f005ef32Sjsg 		amdgpu_ucode_release(&adev->gfx.pfp_fw);
1276f005ef32Sjsg 		amdgpu_ucode_release(&adev->gfx.me_fw);
1277f005ef32Sjsg 		amdgpu_ucode_release(&adev->gfx.ce_fw);
1278c349dbc7Sjsg 	}
1279c349dbc7Sjsg 	return err;
1280c349dbc7Sjsg }
1281c349dbc7Sjsg 
gfx_v9_0_init_rlc_microcode(struct amdgpu_device * adev,char * chip_name)1282c349dbc7Sjsg static int gfx_v9_0_init_rlc_microcode(struct amdgpu_device *adev,
1283f005ef32Sjsg 				       char *chip_name)
1284c349dbc7Sjsg {
1285c349dbc7Sjsg 	char fw_name[30];
1286c349dbc7Sjsg 	int err;
1287c349dbc7Sjsg 	const struct rlc_firmware_header_v2_0 *rlc_hdr;
1288c349dbc7Sjsg 	uint16_t version_major;
1289c349dbc7Sjsg 	uint16_t version_minor;
1290c349dbc7Sjsg 	uint32_t smu_version;
1291c349dbc7Sjsg 
1292c349dbc7Sjsg 	/*
1293c349dbc7Sjsg 	 * For Picasso && AM4 SOCKET board, we use picasso_rlc_am4.bin
1294c349dbc7Sjsg 	 * instead of picasso_rlc.bin.
1295c349dbc7Sjsg 	 * Judgment method:
1296c349dbc7Sjsg 	 * PCO AM4: revision >= 0xC8 && revision <= 0xCF
1297c349dbc7Sjsg 	 *          or revision >= 0xD8 && revision <= 0xDF
1298c349dbc7Sjsg 	 * otherwise is PCO FP5
1299c349dbc7Sjsg 	 */
1300c349dbc7Sjsg 	if (!strcmp(chip_name, "picasso") &&
1301c349dbc7Sjsg 		(((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) ||
1302c349dbc7Sjsg 		((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF))))
1303c349dbc7Sjsg 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name);
1304c349dbc7Sjsg 	else if (!strcmp(chip_name, "raven") && (amdgpu_pm_load_smu_firmware(adev, &smu_version) == 0) &&
1305c349dbc7Sjsg 		(smu_version >= 0x41e2b))
1306c349dbc7Sjsg 		/**
1307c349dbc7Sjsg 		*SMC is loaded by SBIOS on APU and it's able to get the SMU version directly.
1308c349dbc7Sjsg 		*/
1309c349dbc7Sjsg 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name);
1310c349dbc7Sjsg 	else
1311fb4d8502Sjsg 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
1312f005ef32Sjsg 	err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name);
13131bb76ff1Sjsg 	if (err)
13141bb76ff1Sjsg 		goto out;
1315fb4d8502Sjsg 	rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
1316fb4d8502Sjsg 
1317fb4d8502Sjsg 	version_major = le16_to_cpu(rlc_hdr->header.header_version_major);
1318fb4d8502Sjsg 	version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor);
13191bb76ff1Sjsg 	err = amdgpu_gfx_rlc_init_microcode(adev, version_major, version_minor);
1320c349dbc7Sjsg out:
1321f005ef32Sjsg 	if (err)
1322f005ef32Sjsg 		amdgpu_ucode_release(&adev->gfx.rlc_fw);
1323f005ef32Sjsg 
1324c349dbc7Sjsg 	return err;
1325c349dbc7Sjsg }
1326c349dbc7Sjsg 
gfx_v9_0_load_mec2_fw_bin_support(struct amdgpu_device * adev)13275ca02815Sjsg static bool gfx_v9_0_load_mec2_fw_bin_support(struct amdgpu_device *adev)
13285ca02815Sjsg {
13291bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2) ||
13301bb76ff1Sjsg 	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1) ||
13311bb76ff1Sjsg 	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 3, 0))
13325ca02815Sjsg 		return false;
13335ca02815Sjsg 
13345ca02815Sjsg 	return true;
13355ca02815Sjsg }
13365ca02815Sjsg 
gfx_v9_0_init_cp_compute_microcode(struct amdgpu_device * adev,char * chip_name)1337c349dbc7Sjsg static int gfx_v9_0_init_cp_compute_microcode(struct amdgpu_device *adev,
1338f005ef32Sjsg 					      char *chip_name)
1339c349dbc7Sjsg {
1340c349dbc7Sjsg 	char fw_name[30];
1341c349dbc7Sjsg 	int err;
1342c349dbc7Sjsg 
13431bb76ff1Sjsg 	if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_ALDEBARAN))
13441bb76ff1Sjsg 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sjt_mec.bin", chip_name);
13451bb76ff1Sjsg 	else
1346fb4d8502Sjsg 		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
13471bb76ff1Sjsg 
1348f005ef32Sjsg 	err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name);
1349fb4d8502Sjsg 	if (err)
1350fb4d8502Sjsg 		goto out;
13511bb76ff1Sjsg 	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1);
13521bb76ff1Sjsg 	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT);
1353fb4d8502Sjsg 
13545ca02815Sjsg 	if (gfx_v9_0_load_mec2_fw_bin_support(adev)) {
13551bb76ff1Sjsg 		if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_ALDEBARAN))
13561bb76ff1Sjsg 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sjt_mec2.bin", chip_name);
13571bb76ff1Sjsg 		else
1358fb4d8502Sjsg 			snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
13591bb76ff1Sjsg 
1360f005ef32Sjsg 		/* ignore failures to load */
1361f005ef32Sjsg 		err = amdgpu_ucode_request(adev, &adev->gfx.mec2_fw, fw_name);
1362fb4d8502Sjsg 		if (!err) {
13631bb76ff1Sjsg 			amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2);
13641bb76ff1Sjsg 			amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC2_JT);
1365fb4d8502Sjsg 		} else {
1366fb4d8502Sjsg 			err = 0;
1367f005ef32Sjsg 			amdgpu_ucode_release(&adev->gfx.mec2_fw);
1368fb4d8502Sjsg 		}
13695ca02815Sjsg 	} else {
13705ca02815Sjsg 		adev->gfx.mec2_fw_version = adev->gfx.mec_fw_version;
13715ca02815Sjsg 		adev->gfx.mec2_feature_version = adev->gfx.mec_feature_version;
13725ca02815Sjsg 	}
1373fb4d8502Sjsg 
1374c349dbc7Sjsg 	gfx_v9_0_check_if_need_gfxoff(adev);
1375c349dbc7Sjsg 	gfx_v9_0_check_fw_write_wait(adev);
1376f005ef32Sjsg 
1377f005ef32Sjsg out:
1378f005ef32Sjsg 	if (err)
1379f005ef32Sjsg 		amdgpu_ucode_release(&adev->gfx.mec_fw);
1380fb4d8502Sjsg 	return err;
1381fb4d8502Sjsg }
1382fb4d8502Sjsg 
gfx_v9_0_init_microcode(struct amdgpu_device * adev)1383c349dbc7Sjsg static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)
1384c349dbc7Sjsg {
1385f005ef32Sjsg 	char ucode_prefix[30];
1386c349dbc7Sjsg 	int r;
1387c349dbc7Sjsg 
1388c349dbc7Sjsg 	DRM_DEBUG("\n");
1389f005ef32Sjsg 	amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix, sizeof(ucode_prefix));
1390c349dbc7Sjsg 
1391c349dbc7Sjsg 	/* No CPG in Arcturus */
13925ca02815Sjsg 	if (adev->gfx.num_gfx_rings) {
1393f005ef32Sjsg 		r = gfx_v9_0_init_cp_gfx_microcode(adev, ucode_prefix);
1394c349dbc7Sjsg 		if (r)
1395c349dbc7Sjsg 			return r;
1396c349dbc7Sjsg 	}
1397c349dbc7Sjsg 
1398f005ef32Sjsg 	r = gfx_v9_0_init_rlc_microcode(adev, ucode_prefix);
1399c349dbc7Sjsg 	if (r)
1400c349dbc7Sjsg 		return r;
1401c349dbc7Sjsg 
1402f005ef32Sjsg 	r = gfx_v9_0_init_cp_compute_microcode(adev, ucode_prefix);
1403c349dbc7Sjsg 	if (r)
1404c349dbc7Sjsg 		return r;
1405c349dbc7Sjsg 
1406c349dbc7Sjsg 	return r;
1407c349dbc7Sjsg }
1408c349dbc7Sjsg 
gfx_v9_0_get_csb_size(struct amdgpu_device * adev)1409fb4d8502Sjsg static u32 gfx_v9_0_get_csb_size(struct amdgpu_device *adev)
1410fb4d8502Sjsg {
1411fb4d8502Sjsg 	u32 count = 0;
1412fb4d8502Sjsg 	const struct cs_section_def *sect = NULL;
1413fb4d8502Sjsg 	const struct cs_extent_def *ext = NULL;
1414fb4d8502Sjsg 
1415fb4d8502Sjsg 	/* begin clear state */
1416fb4d8502Sjsg 	count += 2;
1417fb4d8502Sjsg 	/* context control state */
1418fb4d8502Sjsg 	count += 3;
1419fb4d8502Sjsg 
1420fb4d8502Sjsg 	for (sect = gfx9_cs_data; sect->section != NULL; ++sect) {
1421fb4d8502Sjsg 		for (ext = sect->section; ext->extent != NULL; ++ext) {
1422fb4d8502Sjsg 			if (sect->id == SECT_CONTEXT)
1423fb4d8502Sjsg 				count += 2 + ext->reg_count;
1424fb4d8502Sjsg 			else
1425fb4d8502Sjsg 				return 0;
1426fb4d8502Sjsg 		}
1427fb4d8502Sjsg 	}
1428fb4d8502Sjsg 
1429fb4d8502Sjsg 	/* end clear state */
1430fb4d8502Sjsg 	count += 2;
1431fb4d8502Sjsg 	/* clear state */
1432fb4d8502Sjsg 	count += 2;
1433fb4d8502Sjsg 
1434fb4d8502Sjsg 	return count;
1435fb4d8502Sjsg }
1436fb4d8502Sjsg 
gfx_v9_0_get_csb_buffer(struct amdgpu_device * adev,volatile u32 * buffer)1437fb4d8502Sjsg static void gfx_v9_0_get_csb_buffer(struct amdgpu_device *adev,
1438fb4d8502Sjsg 				    volatile u32 *buffer)
1439fb4d8502Sjsg {
1440fb4d8502Sjsg 	u32 count = 0, i;
1441fb4d8502Sjsg 	const struct cs_section_def *sect = NULL;
1442fb4d8502Sjsg 	const struct cs_extent_def *ext = NULL;
1443fb4d8502Sjsg 
1444fb4d8502Sjsg 	if (adev->gfx.rlc.cs_data == NULL)
1445fb4d8502Sjsg 		return;
1446fb4d8502Sjsg 	if (buffer == NULL)
1447fb4d8502Sjsg 		return;
1448fb4d8502Sjsg 
1449fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1450fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1451fb4d8502Sjsg 
1452fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
1453fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(0x80000000);
1454fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(0x80000000);
1455fb4d8502Sjsg 
1456fb4d8502Sjsg 	for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
1457fb4d8502Sjsg 		for (ext = sect->section; ext->extent != NULL; ++ext) {
1458fb4d8502Sjsg 			if (sect->id == SECT_CONTEXT) {
1459fb4d8502Sjsg 				buffer[count++] =
1460fb4d8502Sjsg 					cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
1461fb4d8502Sjsg 				buffer[count++] = cpu_to_le32(ext->reg_index -
1462fb4d8502Sjsg 						PACKET3_SET_CONTEXT_REG_START);
1463fb4d8502Sjsg 				for (i = 0; i < ext->reg_count; i++)
1464fb4d8502Sjsg 					buffer[count++] = cpu_to_le32(ext->extent[i]);
1465fb4d8502Sjsg 			} else {
1466fb4d8502Sjsg 				return;
1467fb4d8502Sjsg 			}
1468fb4d8502Sjsg 		}
1469fb4d8502Sjsg 	}
1470fb4d8502Sjsg 
1471fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1472fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
1473fb4d8502Sjsg 
1474fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
1475fb4d8502Sjsg 	buffer[count++] = cpu_to_le32(0);
1476fb4d8502Sjsg }
1477fb4d8502Sjsg 
gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device * adev)1478c349dbc7Sjsg static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev)
1479c349dbc7Sjsg {
1480c349dbc7Sjsg 	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
1481c349dbc7Sjsg 	uint32_t pg_always_on_cu_num = 2;
1482c349dbc7Sjsg 	uint32_t always_on_cu_num;
1483c349dbc7Sjsg 	uint32_t i, j, k;
1484c349dbc7Sjsg 	uint32_t mask, cu_bitmap, counter;
1485c349dbc7Sjsg 
1486c349dbc7Sjsg 	if (adev->flags & AMD_IS_APU)
1487c349dbc7Sjsg 		always_on_cu_num = 4;
14881bb76ff1Sjsg 	else if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 2, 1))
1489c349dbc7Sjsg 		always_on_cu_num = 8;
1490c349dbc7Sjsg 	else
1491c349dbc7Sjsg 		always_on_cu_num = 12;
1492c349dbc7Sjsg 
1493c349dbc7Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
1494c349dbc7Sjsg 	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
1495c349dbc7Sjsg 		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
1496c349dbc7Sjsg 			mask = 1;
1497c349dbc7Sjsg 			cu_bitmap = 0;
1498c349dbc7Sjsg 			counter = 0;
1499f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);
1500c349dbc7Sjsg 
1501c349dbc7Sjsg 			for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {
1502f005ef32Sjsg 				if (cu_info->bitmap[0][i][j] & mask) {
1503c349dbc7Sjsg 					if (counter == pg_always_on_cu_num)
1504c349dbc7Sjsg 						WREG32_SOC15(GC, 0, mmRLC_PG_ALWAYS_ON_CU_MASK, cu_bitmap);
1505c349dbc7Sjsg 					if (counter < always_on_cu_num)
1506c349dbc7Sjsg 						cu_bitmap |= mask;
1507c349dbc7Sjsg 					else
1508c349dbc7Sjsg 						break;
1509c349dbc7Sjsg 					counter++;
1510c349dbc7Sjsg 				}
1511c349dbc7Sjsg 				mask <<= 1;
1512c349dbc7Sjsg 			}
1513c349dbc7Sjsg 
1514c349dbc7Sjsg 			WREG32_SOC15(GC, 0, mmRLC_LB_ALWAYS_ACTIVE_CU_MASK, cu_bitmap);
1515c349dbc7Sjsg 			cu_info->ao_cu_bitmap[i][j] = cu_bitmap;
1516c349dbc7Sjsg 		}
1517c349dbc7Sjsg 	}
1518f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1519c349dbc7Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
1520c349dbc7Sjsg }
1521c349dbc7Sjsg 
gfx_v9_0_init_lbpw(struct amdgpu_device * adev)1522fb4d8502Sjsg static void gfx_v9_0_init_lbpw(struct amdgpu_device *adev)
1523fb4d8502Sjsg {
1524fb4d8502Sjsg 	uint32_t data;
1525fb4d8502Sjsg 
1526fb4d8502Sjsg 	/* set mmRLC_LB_THR_CONFIG_1/2/3/4 */
1527fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_1, 0x0000007F);
1528fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_2, 0x0333A5A7);
1529fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_3, 0x00000077);
1530fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_4, (0x30 | 0x40 << 8 | 0x02FA << 16));
1531fb4d8502Sjsg 
1532fb4d8502Sjsg 	/* set mmRLC_LB_CNTR_INIT = 0x0000_0000 */
1533fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_INIT, 0x00000000);
1534fb4d8502Sjsg 
1535fb4d8502Sjsg 	/* set mmRLC_LB_CNTR_MAX = 0x0000_0500 */
1536fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_MAX, 0x00000500);
1537fb4d8502Sjsg 
1538fb4d8502Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
1539fb4d8502Sjsg 	/* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/
1540f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1541fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff);
1542fb4d8502Sjsg 
1543fb4d8502Sjsg 	/* set mmRLC_LB_PARAMS = 0x003F_1006 */
1544fb4d8502Sjsg 	data = REG_SET_FIELD(0, RLC_LB_PARAMS, FIFO_SAMPLES, 0x0003);
1545fb4d8502Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLES, 0x0010);
1546fb4d8502Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLE_INTERVAL, 0x033F);
1547fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_PARAMS, data);
1548fb4d8502Sjsg 
1549fb4d8502Sjsg 	/* set mmRLC_GPM_GENERAL_7[31-16] = 0x00C0 */
1550fb4d8502Sjsg 	data = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7);
1551fb4d8502Sjsg 	data &= 0x0000FFFF;
1552fb4d8502Sjsg 	data |= 0x00C00000;
1553fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7, data);
1554fb4d8502Sjsg 
1555c349dbc7Sjsg 	/*
1556c349dbc7Sjsg 	 * RLC_LB_ALWAYS_ACTIVE_CU_MASK = 0xF (4 CUs AON for Raven),
1557c349dbc7Sjsg 	 * programmed in gfx_v9_0_init_always_on_cu_mask()
1558c349dbc7Sjsg 	 */
1559fb4d8502Sjsg 
1560fb4d8502Sjsg 	/* set RLC_LB_CNTL = 0x8000_0095, 31 bit is reserved,
1561fb4d8502Sjsg 	 * but used for RLC_LB_CNTL configuration */
1562fb4d8502Sjsg 	data = RLC_LB_CNTL__LB_CNT_SPIM_ACTIVE_MASK;
1563fb4d8502Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_CNTL, CU_MASK_USED_OFF_HYST, 0x09);
1564fb4d8502Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_CNTL, RESERVED, 0x80000);
1565fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTL, data);
1566fb4d8502Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
1567c349dbc7Sjsg 
1568c349dbc7Sjsg 	gfx_v9_0_init_always_on_cu_mask(adev);
1569c349dbc7Sjsg }
1570c349dbc7Sjsg 
gfx_v9_4_init_lbpw(struct amdgpu_device * adev)1571c349dbc7Sjsg static void gfx_v9_4_init_lbpw(struct amdgpu_device *adev)
1572c349dbc7Sjsg {
1573c349dbc7Sjsg 	uint32_t data;
1574c349dbc7Sjsg 
1575c349dbc7Sjsg 	/* set mmRLC_LB_THR_CONFIG_1/2/3/4 */
1576c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_1, 0x0000007F);
1577c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_2, 0x033388F8);
1578c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_3, 0x00000077);
1579c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_THR_CONFIG_4, (0x10 | 0x27 << 8 | 0x02FA << 16));
1580c349dbc7Sjsg 
1581c349dbc7Sjsg 	/* set mmRLC_LB_CNTR_INIT = 0x0000_0000 */
1582c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_INIT, 0x00000000);
1583c349dbc7Sjsg 
1584c349dbc7Sjsg 	/* set mmRLC_LB_CNTR_MAX = 0x0000_0500 */
1585c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTR_MAX, 0x00000800);
1586c349dbc7Sjsg 
1587c349dbc7Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
1588c349dbc7Sjsg 	/* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/
1589f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1590c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff);
1591c349dbc7Sjsg 
1592c349dbc7Sjsg 	/* set mmRLC_LB_PARAMS = 0x003F_1006 */
1593c349dbc7Sjsg 	data = REG_SET_FIELD(0, RLC_LB_PARAMS, FIFO_SAMPLES, 0x0003);
1594c349dbc7Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLES, 0x0010);
1595c349dbc7Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_PARAMS, PG_IDLE_SAMPLE_INTERVAL, 0x033F);
1596c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_PARAMS, data);
1597c349dbc7Sjsg 
1598c349dbc7Sjsg 	/* set mmRLC_GPM_GENERAL_7[31-16] = 0x00C0 */
1599c349dbc7Sjsg 	data = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7);
1600c349dbc7Sjsg 	data &= 0x0000FFFF;
1601c349dbc7Sjsg 	data |= 0x00C00000;
1602c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_7, data);
1603c349dbc7Sjsg 
1604c349dbc7Sjsg 	/*
1605c349dbc7Sjsg 	 * RLC_LB_ALWAYS_ACTIVE_CU_MASK = 0xFFF (12 CUs AON),
1606c349dbc7Sjsg 	 * programmed in gfx_v9_0_init_always_on_cu_mask()
1607c349dbc7Sjsg 	 */
1608c349dbc7Sjsg 
1609c349dbc7Sjsg 	/* set RLC_LB_CNTL = 0x8000_0095, 31 bit is reserved,
1610c349dbc7Sjsg 	 * but used for RLC_LB_CNTL configuration */
1611c349dbc7Sjsg 	data = RLC_LB_CNTL__LB_CNT_SPIM_ACTIVE_MASK;
1612c349dbc7Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_CNTL, CU_MASK_USED_OFF_HYST, 0x09);
1613c349dbc7Sjsg 	data |= REG_SET_FIELD(data, RLC_LB_CNTL, RESERVED, 0x80000);
1614c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmRLC_LB_CNTL, data);
1615c349dbc7Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
1616c349dbc7Sjsg 
1617c349dbc7Sjsg 	gfx_v9_0_init_always_on_cu_mask(adev);
1618fb4d8502Sjsg }
1619fb4d8502Sjsg 
gfx_v9_0_enable_lbpw(struct amdgpu_device * adev,bool enable)1620fb4d8502Sjsg static void gfx_v9_0_enable_lbpw(struct amdgpu_device *adev, bool enable)
1621fb4d8502Sjsg {
1622fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0);
1623fb4d8502Sjsg }
1624fb4d8502Sjsg 
gfx_v9_0_cp_jump_table_num(struct amdgpu_device * adev)1625c349dbc7Sjsg static int gfx_v9_0_cp_jump_table_num(struct amdgpu_device *adev)
1626fb4d8502Sjsg {
16275ca02815Sjsg 	if (gfx_v9_0_load_mec2_fw_bin_support(adev))
1628c349dbc7Sjsg 		return 5;
16295ca02815Sjsg 	else
16305ca02815Sjsg 		return 4;
1631fb4d8502Sjsg }
1632fb4d8502Sjsg 
gfx_v9_0_init_rlcg_reg_access_ctrl(struct amdgpu_device * adev)16331bb76ff1Sjsg static void gfx_v9_0_init_rlcg_reg_access_ctrl(struct amdgpu_device *adev)
16341bb76ff1Sjsg {
16351bb76ff1Sjsg 	struct amdgpu_rlcg_reg_access_ctrl *reg_access_ctrl;
16361bb76ff1Sjsg 
1637f005ef32Sjsg 	reg_access_ctrl = &adev->gfx.rlc.reg_access_ctrl[0];
16381bb76ff1Sjsg 	reg_access_ctrl->scratch_reg0 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG0);
16391bb76ff1Sjsg 	reg_access_ctrl->scratch_reg1 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG1);
16401bb76ff1Sjsg 	reg_access_ctrl->scratch_reg2 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG2);
16411bb76ff1Sjsg 	reg_access_ctrl->scratch_reg3 = SOC15_REG_OFFSET(GC, 0, mmSCRATCH_REG3);
16421bb76ff1Sjsg 	reg_access_ctrl->grbm_cntl = SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL);
16431bb76ff1Sjsg 	reg_access_ctrl->grbm_idx = SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX);
16441bb76ff1Sjsg 	reg_access_ctrl->spare_int = SOC15_REG_OFFSET(GC, 0, mmRLC_SPARE_INT);
16451bb76ff1Sjsg 	adev->gfx.rlc.rlcg_reg_access_supported = true;
16461bb76ff1Sjsg }
16471bb76ff1Sjsg 
gfx_v9_0_rlc_init(struct amdgpu_device * adev)1648fb4d8502Sjsg static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
1649fb4d8502Sjsg {
1650fb4d8502Sjsg 	const struct cs_section_def *cs_data;
1651fb4d8502Sjsg 	int r;
1652fb4d8502Sjsg 
1653fb4d8502Sjsg 	adev->gfx.rlc.cs_data = gfx9_cs_data;
1654fb4d8502Sjsg 
1655fb4d8502Sjsg 	cs_data = adev->gfx.rlc.cs_data;
1656fb4d8502Sjsg 
1657fb4d8502Sjsg 	if (cs_data) {
1658c349dbc7Sjsg 		/* init clear state block */
1659c349dbc7Sjsg 		r = amdgpu_gfx_rlc_init_csb(adev);
1660c349dbc7Sjsg 		if (r)
1661fb4d8502Sjsg 			return r;
1662fb4d8502Sjsg 	}
1663fb4d8502Sjsg 
1664ad8b1aafSjsg 	if (adev->flags & AMD_IS_APU) {
1665fb4d8502Sjsg 		/* TODO: double check the cp_table_size for RV */
1666f005ef32Sjsg 		adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */
1667c349dbc7Sjsg 		r = amdgpu_gfx_rlc_init_cpt(adev);
1668c349dbc7Sjsg 		if (r)
1669fb4d8502Sjsg 			return r;
1670fb4d8502Sjsg 	}
1671fb4d8502Sjsg 
1672fb4d8502Sjsg 	return 0;
1673fb4d8502Sjsg }
1674fb4d8502Sjsg 
gfx_v9_0_mec_fini(struct amdgpu_device * adev)1675fb4d8502Sjsg static void gfx_v9_0_mec_fini(struct amdgpu_device *adev)
1676fb4d8502Sjsg {
1677fb4d8502Sjsg 	amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);
1678fb4d8502Sjsg 	amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_obj, NULL, NULL);
1679fb4d8502Sjsg }
1680fb4d8502Sjsg 
gfx_v9_0_mec_init(struct amdgpu_device * adev)1681fb4d8502Sjsg static int gfx_v9_0_mec_init(struct amdgpu_device *adev)
1682fb4d8502Sjsg {
1683fb4d8502Sjsg 	int r;
1684fb4d8502Sjsg 	u32 *hpd;
1685fb4d8502Sjsg 	const __le32 *fw_data;
1686fb4d8502Sjsg 	unsigned fw_size;
1687fb4d8502Sjsg 	u32 *fw;
1688fb4d8502Sjsg 	size_t mec_hpd_size;
1689fb4d8502Sjsg 
1690fb4d8502Sjsg 	const struct gfx_firmware_header_v1_0 *mec_hdr;
1691fb4d8502Sjsg 
1692f005ef32Sjsg 	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
1693fb4d8502Sjsg 
1694fb4d8502Sjsg 	/* take ownership of the relevant compute queues */
1695fb4d8502Sjsg 	amdgpu_gfx_compute_queue_acquire(adev);
1696fb4d8502Sjsg 	mec_hpd_size = adev->gfx.num_compute_rings * GFX9_MEC_HPD_SIZE;
1697ad8b1aafSjsg 	if (mec_hpd_size) {
1698fb4d8502Sjsg 		r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,
1699f005ef32Sjsg 					      AMDGPU_GEM_DOMAIN_VRAM |
1700f005ef32Sjsg 					      AMDGPU_GEM_DOMAIN_GTT,
1701fb4d8502Sjsg 					      &adev->gfx.mec.hpd_eop_obj,
1702fb4d8502Sjsg 					      &adev->gfx.mec.hpd_eop_gpu_addr,
1703fb4d8502Sjsg 					      (void **)&hpd);
1704fb4d8502Sjsg 		if (r) {
1705fb4d8502Sjsg 			dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r);
1706fb4d8502Sjsg 			gfx_v9_0_mec_fini(adev);
1707fb4d8502Sjsg 			return r;
1708fb4d8502Sjsg 		}
1709fb4d8502Sjsg 
1710c349dbc7Sjsg 		memset(hpd, 0, mec_hpd_size);
1711fb4d8502Sjsg 
1712fb4d8502Sjsg 		amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj);
1713fb4d8502Sjsg 		amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);
1714ad8b1aafSjsg 	}
1715fb4d8502Sjsg 
1716fb4d8502Sjsg 	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1717fb4d8502Sjsg 
1718fb4d8502Sjsg 	fw_data = (const __le32 *)
1719fb4d8502Sjsg 		(adev->gfx.mec_fw->data +
1720fb4d8502Sjsg 		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
1721ad8b1aafSjsg 	fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes);
1722fb4d8502Sjsg 
1723fb4d8502Sjsg 	r = amdgpu_bo_create_reserved(adev, mec_hdr->header.ucode_size_bytes,
1724fb4d8502Sjsg 				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
1725fb4d8502Sjsg 				      &adev->gfx.mec.mec_fw_obj,
1726fb4d8502Sjsg 				      &adev->gfx.mec.mec_fw_gpu_addr,
1727fb4d8502Sjsg 				      (void **)&fw);
1728fb4d8502Sjsg 	if (r) {
1729fb4d8502Sjsg 		dev_warn(adev->dev, "(%d) create mec firmware bo failed\n", r);
1730fb4d8502Sjsg 		gfx_v9_0_mec_fini(adev);
1731fb4d8502Sjsg 		return r;
1732fb4d8502Sjsg 	}
1733fb4d8502Sjsg 
1734fb4d8502Sjsg 	memcpy(fw, fw_data, fw_size);
1735fb4d8502Sjsg 
1736fb4d8502Sjsg 	amdgpu_bo_kunmap(adev->gfx.mec.mec_fw_obj);
1737fb4d8502Sjsg 	amdgpu_bo_unreserve(adev->gfx.mec.mec_fw_obj);
1738fb4d8502Sjsg 
1739fb4d8502Sjsg 	return 0;
1740fb4d8502Sjsg }
1741fb4d8502Sjsg 
wave_read_ind(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t address)1742fb4d8502Sjsg static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
1743fb4d8502Sjsg {
1744c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmSQ_IND_INDEX,
1745fb4d8502Sjsg 		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
1746fb4d8502Sjsg 		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
1747fb4d8502Sjsg 		(address << SQ_IND_INDEX__INDEX__SHIFT) |
1748fb4d8502Sjsg 		(SQ_IND_INDEX__FORCE_READ_MASK));
1749fb4d8502Sjsg 	return RREG32_SOC15(GC, 0, mmSQ_IND_DATA);
1750fb4d8502Sjsg }
1751fb4d8502Sjsg 
wave_read_regs(struct amdgpu_device * adev,uint32_t simd,uint32_t wave,uint32_t thread,uint32_t regno,uint32_t num,uint32_t * out)1752fb4d8502Sjsg static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,
1753fb4d8502Sjsg 			   uint32_t wave, uint32_t thread,
1754fb4d8502Sjsg 			   uint32_t regno, uint32_t num, uint32_t *out)
1755fb4d8502Sjsg {
1756c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmSQ_IND_INDEX,
1757fb4d8502Sjsg 		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
1758fb4d8502Sjsg 		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
1759fb4d8502Sjsg 		(regno << SQ_IND_INDEX__INDEX__SHIFT) |
1760fb4d8502Sjsg 		(thread << SQ_IND_INDEX__THREAD_ID__SHIFT) |
1761fb4d8502Sjsg 		(SQ_IND_INDEX__FORCE_READ_MASK) |
1762fb4d8502Sjsg 		(SQ_IND_INDEX__AUTO_INCR_MASK));
1763fb4d8502Sjsg 	while (num--)
1764fb4d8502Sjsg 		*(out++) = RREG32_SOC15(GC, 0, mmSQ_IND_DATA);
1765fb4d8502Sjsg }
1766fb4d8502Sjsg 
gfx_v9_0_read_wave_data(struct amdgpu_device * adev,uint32_t xcc_id,uint32_t simd,uint32_t wave,uint32_t * dst,int * no_fields)1767f005ef32Sjsg static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)
1768fb4d8502Sjsg {
1769fb4d8502Sjsg 	/* type 1 wave data */
1770fb4d8502Sjsg 	dst[(*no_fields)++] = 1;
1771fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS);
1772fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO);
1773fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI);
1774fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO);
1775fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI);
1776fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID);
1777fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0);
1778fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1);
1779fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC);
1780fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC);
1781fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS);
1782fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS);
1783fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0);
1784fb4d8502Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0);
17855ca02815Sjsg 	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);
1786fb4d8502Sjsg }
1787fb4d8502Sjsg 
gfx_v9_0_read_wave_sgprs(struct amdgpu_device * adev,uint32_t xcc_id,uint32_t simd,uint32_t wave,uint32_t start,uint32_t size,uint32_t * dst)1788f005ef32Sjsg static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,
1789fb4d8502Sjsg 				     uint32_t wave, uint32_t start,
1790fb4d8502Sjsg 				     uint32_t size, uint32_t *dst)
1791fb4d8502Sjsg {
1792fb4d8502Sjsg 	wave_read_regs(
1793fb4d8502Sjsg 		adev, simd, wave, 0,
1794fb4d8502Sjsg 		start + SQIND_WAVE_SGPRS_OFFSET, size, dst);
1795fb4d8502Sjsg }
1796fb4d8502Sjsg 
gfx_v9_0_read_wave_vgprs(struct amdgpu_device * adev,uint32_t xcc_id,uint32_t simd,uint32_t wave,uint32_t thread,uint32_t start,uint32_t size,uint32_t * dst)1797f005ef32Sjsg static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,
1798fb4d8502Sjsg 				     uint32_t wave, uint32_t thread,
1799fb4d8502Sjsg 				     uint32_t start, uint32_t size,
1800fb4d8502Sjsg 				     uint32_t *dst)
1801fb4d8502Sjsg {
1802fb4d8502Sjsg 	wave_read_regs(
1803fb4d8502Sjsg 		adev, simd, wave, thread,
1804fb4d8502Sjsg 		start + SQIND_WAVE_VGPRS_OFFSET, size, dst);
1805fb4d8502Sjsg }
1806fb4d8502Sjsg 
gfx_v9_0_select_me_pipe_q(struct amdgpu_device * adev,u32 me,u32 pipe,u32 q,u32 vm,u32 xcc_id)1807fb4d8502Sjsg static void gfx_v9_0_select_me_pipe_q(struct amdgpu_device *adev,
1808f005ef32Sjsg 				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)
1809fb4d8502Sjsg {
1810f005ef32Sjsg 	soc15_grbm_select(adev, me, pipe, q, vm, 0);
1811fb4d8502Sjsg }
1812fb4d8502Sjsg 
1813fb4d8502Sjsg static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = {
1814fb4d8502Sjsg         .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter,
1815fb4d8502Sjsg         .select_se_sh = &gfx_v9_0_select_se_sh,
1816fb4d8502Sjsg         .read_wave_data = &gfx_v9_0_read_wave_data,
1817fb4d8502Sjsg         .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs,
1818fb4d8502Sjsg         .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs,
1819c349dbc7Sjsg         .select_me_pipe_q = &gfx_v9_0_select_me_pipe_q,
18205ca02815Sjsg };
18215ca02815Sjsg 
18221bb76ff1Sjsg const struct amdgpu_ras_block_hw_ops  gfx_v9_0_ras_ops = {
1823c349dbc7Sjsg 		.ras_error_inject = &gfx_v9_0_ras_error_inject,
1824c349dbc7Sjsg 		.query_ras_error_count = &gfx_v9_0_query_ras_error_count,
1825c349dbc7Sjsg 		.reset_ras_error_count = &gfx_v9_0_reset_ras_error_count,
1826c349dbc7Sjsg };
1827c349dbc7Sjsg 
18281bb76ff1Sjsg static struct amdgpu_gfx_ras gfx_v9_0_ras = {
18291bb76ff1Sjsg 	.ras_block = {
18301bb76ff1Sjsg 		.hw_ops = &gfx_v9_0_ras_ops,
18311bb76ff1Sjsg 	},
18321bb76ff1Sjsg };
18331bb76ff1Sjsg 
gfx_v9_0_gpu_early_init(struct amdgpu_device * adev)1834fb4d8502Sjsg static int gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)
1835fb4d8502Sjsg {
1836fb4d8502Sjsg 	u32 gb_addr_config;
1837fb4d8502Sjsg 	int err;
1838fb4d8502Sjsg 
18391bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
18401bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
1841fb4d8502Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1842fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1843fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1844fb4d8502Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1845fb4d8502Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1846fb4d8502Sjsg 		gb_addr_config = VEGA10_GB_ADDR_CONFIG_GOLDEN;
1847fb4d8502Sjsg 		break;
18481bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
1849fb4d8502Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1850fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1851fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1852fb4d8502Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1853fb4d8502Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1854fb4d8502Sjsg 		gb_addr_config = VEGA12_GB_ADDR_CONFIG_GOLDEN;
1855fb4d8502Sjsg 		DRM_INFO("fix gfx.config for vega12\n");
1856fb4d8502Sjsg 		break;
18571bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
18581bb76ff1Sjsg 		adev->gfx.ras = &gfx_v9_0_ras;
1859fb4d8502Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1860fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1861fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1862fb4d8502Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1863fb4d8502Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1864fb4d8502Sjsg 		gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG);
1865fb4d8502Sjsg 		gb_addr_config &= ~0xf3e777ff;
1866fb4d8502Sjsg 		gb_addr_config |= 0x22014042;
1867fb4d8502Sjsg 		/* check vbios table if gpu info is not available */
1868fb4d8502Sjsg 		err = amdgpu_atomfirmware_get_gfx_info(adev);
1869fb4d8502Sjsg 		if (err)
1870fb4d8502Sjsg 			return err;
1871fb4d8502Sjsg 		break;
18721bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
18731bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
1874fb4d8502Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1875fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1876fb4d8502Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1877fb4d8502Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1878fb4d8502Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1879ad8b1aafSjsg 		if (adev->apu_flags & AMD_APU_IS_RAVEN2)
1880c349dbc7Sjsg 			gb_addr_config = RAVEN2_GB_ADDR_CONFIG_GOLDEN;
1881c349dbc7Sjsg 		else
1882fb4d8502Sjsg 			gb_addr_config = RAVEN_GB_ADDR_CONFIG_GOLDEN;
1883fb4d8502Sjsg 		break;
18841bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
18851bb76ff1Sjsg 		adev->gfx.ras = &gfx_v9_4_ras;
1886c349dbc7Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1887c349dbc7Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1888c349dbc7Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1889c349dbc7Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1890c349dbc7Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1891c349dbc7Sjsg 		gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG);
1892c349dbc7Sjsg 		gb_addr_config &= ~0xf3e777ff;
1893c349dbc7Sjsg 		gb_addr_config |= 0x22014042;
1894c349dbc7Sjsg 		break;
18951bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
1896c349dbc7Sjsg 		adev->gfx.config.max_hw_contexts = 8;
1897c349dbc7Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1898c349dbc7Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1899c349dbc7Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x80;
1900c349dbc7Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
1901c349dbc7Sjsg 		gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG);
1902c349dbc7Sjsg 		gb_addr_config &= ~0xf3e777ff;
1903c349dbc7Sjsg 		gb_addr_config |= 0x22010042;
1904c349dbc7Sjsg 		break;
19051bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
19061bb76ff1Sjsg 		adev->gfx.ras = &gfx_v9_4_2_ras;
19075ca02815Sjsg 		adev->gfx.config.max_hw_contexts = 8;
19085ca02815Sjsg 		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
19095ca02815Sjsg 		adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
19105ca02815Sjsg 		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
19115ca02815Sjsg 		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0;
19125ca02815Sjsg 		gb_addr_config = RREG32_SOC15(GC, 0, mmGB_ADDR_CONFIG);
19135ca02815Sjsg 		gb_addr_config &= ~0xf3e777ff;
19145ca02815Sjsg 		gb_addr_config |= 0x22014042;
19155ca02815Sjsg 		/* check vbios table if gpu info is not available */
19165ca02815Sjsg 		err = amdgpu_atomfirmware_get_gfx_info(adev);
19175ca02815Sjsg 		if (err)
19185ca02815Sjsg 			return err;
19195ca02815Sjsg 		break;
1920fb4d8502Sjsg 	default:
1921fb4d8502Sjsg 		BUG();
1922fb4d8502Sjsg 		break;
1923fb4d8502Sjsg 	}
1924fb4d8502Sjsg 
1925fb4d8502Sjsg 	adev->gfx.config.gb_addr_config = gb_addr_config;
1926fb4d8502Sjsg 
1927fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.num_pipes = 1 <<
1928fb4d8502Sjsg 			REG_GET_FIELD(
1929fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1930fb4d8502Sjsg 					GB_ADDR_CONFIG,
1931fb4d8502Sjsg 					NUM_PIPES);
1932fb4d8502Sjsg 
1933fb4d8502Sjsg 	adev->gfx.config.max_tile_pipes =
1934fb4d8502Sjsg 		adev->gfx.config.gb_addr_config_fields.num_pipes;
1935fb4d8502Sjsg 
1936fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.num_banks = 1 <<
1937fb4d8502Sjsg 			REG_GET_FIELD(
1938fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1939fb4d8502Sjsg 					GB_ADDR_CONFIG,
1940fb4d8502Sjsg 					NUM_BANKS);
1941fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.max_compress_frags = 1 <<
1942fb4d8502Sjsg 			REG_GET_FIELD(
1943fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1944fb4d8502Sjsg 					GB_ADDR_CONFIG,
1945fb4d8502Sjsg 					MAX_COMPRESSED_FRAGS);
1946fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.num_rb_per_se = 1 <<
1947fb4d8502Sjsg 			REG_GET_FIELD(
1948fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1949fb4d8502Sjsg 					GB_ADDR_CONFIG,
1950fb4d8502Sjsg 					NUM_RB_PER_SE);
1951fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.num_se = 1 <<
1952fb4d8502Sjsg 			REG_GET_FIELD(
1953fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1954fb4d8502Sjsg 					GB_ADDR_CONFIG,
1955fb4d8502Sjsg 					NUM_SHADER_ENGINES);
1956fb4d8502Sjsg 	adev->gfx.config.gb_addr_config_fields.pipe_interleave_size = 1 << (8 +
1957fb4d8502Sjsg 			REG_GET_FIELD(
1958fb4d8502Sjsg 					adev->gfx.config.gb_addr_config,
1959fb4d8502Sjsg 					GB_ADDR_CONFIG,
1960fb4d8502Sjsg 					PIPE_INTERLEAVE_SIZE));
1961fb4d8502Sjsg 
1962fb4d8502Sjsg 	return 0;
1963fb4d8502Sjsg }
1964fb4d8502Sjsg 
gfx_v9_0_compute_ring_init(struct amdgpu_device * adev,int ring_id,int mec,int pipe,int queue)1965fb4d8502Sjsg static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,
1966fb4d8502Sjsg 				      int mec, int pipe, int queue)
1967fb4d8502Sjsg {
1968fb4d8502Sjsg 	unsigned irq_type;
1969fb4d8502Sjsg 	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id];
1970ad8b1aafSjsg 	unsigned int hw_prio;
1971fb4d8502Sjsg 
1972fb4d8502Sjsg 	ring = &adev->gfx.compute_ring[ring_id];
1973fb4d8502Sjsg 
1974fb4d8502Sjsg 	/* mec0 is me1 */
1975fb4d8502Sjsg 	ring->me = mec + 1;
1976fb4d8502Sjsg 	ring->pipe = pipe;
1977fb4d8502Sjsg 	ring->queue = queue;
1978fb4d8502Sjsg 
1979fb4d8502Sjsg 	ring->ring_obj = NULL;
1980fb4d8502Sjsg 	ring->use_doorbell = true;
1981c349dbc7Sjsg 	ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1;
1982fb4d8502Sjsg 	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr
1983fb4d8502Sjsg 				+ (ring_id * GFX9_MEC_HPD_SIZE);
1984f005ef32Sjsg 	ring->vm_hub = AMDGPU_GFXHUB(0);
1985fb4d8502Sjsg 	snprintf(ring->name, sizeof(ring->name), "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
1986fb4d8502Sjsg 
1987fb4d8502Sjsg 	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP
1988fb4d8502Sjsg 		+ ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec)
1989fb4d8502Sjsg 		+ ring->pipe;
19905ca02815Sjsg 	hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring) ?
19911bb76ff1Sjsg 			AMDGPU_RING_PRIO_2 : AMDGPU_RING_PRIO_DEFAULT;
1992fb4d8502Sjsg 	/* type-2 packets are deprecated on MEC, use type-3 instead */
19935ca02815Sjsg 	return amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, irq_type,
19945ca02815Sjsg 				hw_prio, NULL);
1995fb4d8502Sjsg }
1996fb4d8502Sjsg 
gfx_v9_0_sw_init(void * handle)1997fb4d8502Sjsg static int gfx_v9_0_sw_init(void *handle)
1998fb4d8502Sjsg {
1999fb4d8502Sjsg 	int i, j, k, r, ring_id;
2000fb4d8502Sjsg 	struct amdgpu_ring *ring;
2001fb4d8502Sjsg 	struct amdgpu_kiq *kiq;
2002fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2003f005ef32Sjsg 	unsigned int hw_prio;
2004fb4d8502Sjsg 
20051bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
20061bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
20071bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
20081bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
20091bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
20101bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
20111bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
20121bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
20131bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
2014fb4d8502Sjsg 		adev->gfx.mec.num_mec = 2;
2015fb4d8502Sjsg 		break;
2016fb4d8502Sjsg 	default:
2017fb4d8502Sjsg 		adev->gfx.mec.num_mec = 1;
2018fb4d8502Sjsg 		break;
2019fb4d8502Sjsg 	}
2020fb4d8502Sjsg 
2021fb4d8502Sjsg 	adev->gfx.mec.num_pipe_per_mec = 4;
2022fb4d8502Sjsg 	adev->gfx.mec.num_queue_per_pipe = 8;
2023fb4d8502Sjsg 
2024fb4d8502Sjsg 	/* EOP Event */
2025fb4d8502Sjsg 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_EOP_INTERRUPT, &adev->gfx.eop_irq);
2026fb4d8502Sjsg 	if (r)
2027fb4d8502Sjsg 		return r;
2028fb4d8502Sjsg 
2029fb4d8502Sjsg 	/* Privileged reg */
2030fb4d8502Sjsg 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_REG_FAULT,
2031fb4d8502Sjsg 			      &adev->gfx.priv_reg_irq);
2032fb4d8502Sjsg 	if (r)
2033fb4d8502Sjsg 		return r;
2034fb4d8502Sjsg 
2035fb4d8502Sjsg 	/* Privileged inst */
2036fb4d8502Sjsg 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_INSTR_FAULT,
2037fb4d8502Sjsg 			      &adev->gfx.priv_inst_irq);
2038fb4d8502Sjsg 	if (r)
2039fb4d8502Sjsg 		return r;
2040fb4d8502Sjsg 
2041c349dbc7Sjsg 	/* ECC error */
2042c349dbc7Sjsg 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_ECC_ERROR,
2043c349dbc7Sjsg 			      &adev->gfx.cp_ecc_error_irq);
2044c349dbc7Sjsg 	if (r)
2045c349dbc7Sjsg 		return r;
2046c349dbc7Sjsg 
2047c349dbc7Sjsg 	/* FUE error */
2048c349dbc7Sjsg 	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_FUE_ERROR,
2049c349dbc7Sjsg 			      &adev->gfx.cp_ecc_error_irq);
2050c349dbc7Sjsg 	if (r)
2051c349dbc7Sjsg 		return r;
2052c349dbc7Sjsg 
2053fb4d8502Sjsg 	adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE;
2054fb4d8502Sjsg 
20551bb76ff1Sjsg 	if (adev->gfx.rlc.funcs) {
20561bb76ff1Sjsg 		if (adev->gfx.rlc.funcs->init) {
2057c349dbc7Sjsg 			r = adev->gfx.rlc.funcs->init(adev);
2058fb4d8502Sjsg 			if (r) {
20591bb76ff1Sjsg 				dev_err(adev->dev, "Failed to init rlc BOs!\n");
2060fb4d8502Sjsg 				return r;
2061fb4d8502Sjsg 			}
20621bb76ff1Sjsg 		}
20631bb76ff1Sjsg 	}
2064fb4d8502Sjsg 
2065fb4d8502Sjsg 	r = gfx_v9_0_mec_init(adev);
2066fb4d8502Sjsg 	if (r) {
2067fb4d8502Sjsg 		DRM_ERROR("Failed to init MEC BOs!\n");
2068fb4d8502Sjsg 		return r;
2069fb4d8502Sjsg 	}
2070fb4d8502Sjsg 
2071fb4d8502Sjsg 	/* set up the gfx ring */
2072fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
2073fb4d8502Sjsg 		ring = &adev->gfx.gfx_ring[i];
2074fb4d8502Sjsg 		ring->ring_obj = NULL;
2075fb4d8502Sjsg 		if (!i)
2076fb4d8502Sjsg 			snprintf(ring->name, sizeof(ring->name), "gfx");
2077fb4d8502Sjsg 		else
2078fb4d8502Sjsg 			snprintf(ring->name, sizeof(ring->name), "gfx_%d", i);
2079fb4d8502Sjsg 		ring->use_doorbell = true;
2080c349dbc7Sjsg 		ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;
2081f005ef32Sjsg 
2082f005ef32Sjsg 		/* disable scheduler on the real ring */
2083f005ef32Sjsg 		ring->no_scheduler = true;
2084f005ef32Sjsg 		ring->vm_hub = AMDGPU_GFXHUB(0);
20855ca02815Sjsg 		r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,
2086ad8b1aafSjsg 				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP,
20875ca02815Sjsg 				     AMDGPU_RING_PRIO_DEFAULT, NULL);
2088fb4d8502Sjsg 		if (r)
2089fb4d8502Sjsg 			return r;
2090fb4d8502Sjsg 	}
2091fb4d8502Sjsg 
2092f005ef32Sjsg 	/* set up the software rings */
2093f005ef32Sjsg 	if (adev->gfx.num_gfx_rings) {
2094f005ef32Sjsg 		for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) {
2095f005ef32Sjsg 			ring = &adev->gfx.sw_gfx_ring[i];
2096f005ef32Sjsg 			ring->ring_obj = NULL;
2097f005ef32Sjsg 			snprintf(ring->name, sizeof(ring->name), "%s", amdgpu_sw_ring_name(i));
2098f005ef32Sjsg 			ring->use_doorbell = true;
2099f005ef32Sjsg 			ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;
2100f005ef32Sjsg 			ring->is_sw_ring = true;
2101f005ef32Sjsg 			hw_prio = amdgpu_sw_ring_priority(i);
2102f005ef32Sjsg 			ring->vm_hub = AMDGPU_GFXHUB(0);
2103f005ef32Sjsg 			r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,
2104f005ef32Sjsg 					     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, hw_prio,
2105f005ef32Sjsg 					     NULL);
2106f005ef32Sjsg 			if (r)
2107f005ef32Sjsg 				return r;
2108f005ef32Sjsg 			ring->wptr = 0;
2109f005ef32Sjsg 		}
2110f005ef32Sjsg 
2111f005ef32Sjsg 		/* init the muxer and add software rings */
2112f005ef32Sjsg 		r = amdgpu_ring_mux_init(&adev->gfx.muxer, &adev->gfx.gfx_ring[0],
2113f005ef32Sjsg 					 GFX9_NUM_SW_GFX_RINGS);
2114f005ef32Sjsg 		if (r) {
2115f005ef32Sjsg 			DRM_ERROR("amdgpu_ring_mux_init failed(%d)\n", r);
2116f005ef32Sjsg 			return r;
2117f005ef32Sjsg 		}
2118f005ef32Sjsg 		for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++) {
2119f005ef32Sjsg 			r = amdgpu_ring_mux_add_sw_ring(&adev->gfx.muxer,
2120f005ef32Sjsg 							&adev->gfx.sw_gfx_ring[i]);
2121f005ef32Sjsg 			if (r) {
2122f005ef32Sjsg 				DRM_ERROR("amdgpu_ring_mux_add_sw_ring failed(%d)\n", r);
2123f005ef32Sjsg 				return r;
2124f005ef32Sjsg 			}
2125f005ef32Sjsg 		}
2126f005ef32Sjsg 	}
2127f005ef32Sjsg 
2128fb4d8502Sjsg 	/* set up the compute queues - allocate horizontally across pipes */
2129fb4d8502Sjsg 	ring_id = 0;
2130fb4d8502Sjsg 	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {
2131fb4d8502Sjsg 		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {
2132fb4d8502Sjsg 			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) {
2133f005ef32Sjsg 				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i,
2134f005ef32Sjsg 								     k, j))
2135fb4d8502Sjsg 					continue;
2136fb4d8502Sjsg 
2137fb4d8502Sjsg 				r = gfx_v9_0_compute_ring_init(adev,
2138fb4d8502Sjsg 							       ring_id,
2139fb4d8502Sjsg 							       i, k, j);
2140fb4d8502Sjsg 				if (r)
2141fb4d8502Sjsg 					return r;
2142fb4d8502Sjsg 
2143fb4d8502Sjsg 				ring_id++;
2144fb4d8502Sjsg 			}
2145fb4d8502Sjsg 		}
2146fb4d8502Sjsg 	}
2147fb4d8502Sjsg 
2148f005ef32Sjsg 	r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE, 0);
2149fb4d8502Sjsg 	if (r) {
2150fb4d8502Sjsg 		DRM_ERROR("Failed to init KIQ BOs!\n");
2151fb4d8502Sjsg 		return r;
2152fb4d8502Sjsg 	}
2153fb4d8502Sjsg 
2154f005ef32Sjsg 	kiq = &adev->gfx.kiq[0];
2155f005ef32Sjsg 	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);
2156fb4d8502Sjsg 	if (r)
2157fb4d8502Sjsg 		return r;
2158fb4d8502Sjsg 
2159fb4d8502Sjsg 	/* create MQD for all compute queues as wel as KIQ for SRIOV case */
2160f005ef32Sjsg 	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation), 0);
2161fb4d8502Sjsg 	if (r)
2162fb4d8502Sjsg 		return r;
2163fb4d8502Sjsg 
2164fb4d8502Sjsg 	adev->gfx.ce_ram_size = 0x8000;
2165fb4d8502Sjsg 
2166fb4d8502Sjsg 	r = gfx_v9_0_gpu_early_init(adev);
2167fb4d8502Sjsg 	if (r)
2168fb4d8502Sjsg 		return r;
2169fb4d8502Sjsg 
2170f005ef32Sjsg 	if (amdgpu_gfx_ras_sw_init(adev)) {
2171f005ef32Sjsg 		dev_err(adev->dev, "Failed to initialize gfx ras block!\n");
2172f005ef32Sjsg 		return -EINVAL;
2173f005ef32Sjsg 	}
2174f005ef32Sjsg 
2175fb4d8502Sjsg 	return 0;
2176fb4d8502Sjsg }
2177fb4d8502Sjsg 
2178fb4d8502Sjsg 
gfx_v9_0_sw_fini(void * handle)2179fb4d8502Sjsg static int gfx_v9_0_sw_fini(void *handle)
2180fb4d8502Sjsg {
2181fb4d8502Sjsg 	int i;
2182fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2183fb4d8502Sjsg 
2184f005ef32Sjsg 	if (adev->gfx.num_gfx_rings) {
2185f005ef32Sjsg 		for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++)
2186f005ef32Sjsg 			amdgpu_ring_fini(&adev->gfx.sw_gfx_ring[i]);
2187f005ef32Sjsg 		amdgpu_ring_mux_fini(&adev->gfx.muxer);
2188f005ef32Sjsg 	}
2189f005ef32Sjsg 
2190fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2191fb4d8502Sjsg 		amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
2192fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_compute_rings; i++)
2193fb4d8502Sjsg 		amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
2194fb4d8502Sjsg 
2195f005ef32Sjsg 	amdgpu_gfx_mqd_sw_fini(adev, 0);
2196f005ef32Sjsg 	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring);
2197f005ef32Sjsg 	amdgpu_gfx_kiq_fini(adev, 0);
2198fb4d8502Sjsg 
2199fb4d8502Sjsg 	gfx_v9_0_mec_fini(adev);
22001bb76ff1Sjsg 	amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
22011bb76ff1Sjsg 				&adev->gfx.rlc.clear_state_gpu_addr,
22021bb76ff1Sjsg 				(void **)&adev->gfx.rlc.cs_ptr);
2203ad8b1aafSjsg 	if (adev->flags & AMD_IS_APU) {
2204fb4d8502Sjsg 		amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj,
2205fb4d8502Sjsg 				&adev->gfx.rlc.cp_table_gpu_addr,
2206fb4d8502Sjsg 				(void **)&adev->gfx.rlc.cp_table_ptr);
2207fb4d8502Sjsg 	}
2208fb4d8502Sjsg 	gfx_v9_0_free_microcode(adev);
2209fb4d8502Sjsg 
2210fb4d8502Sjsg 	return 0;
2211fb4d8502Sjsg }
2212fb4d8502Sjsg 
2213fb4d8502Sjsg 
gfx_v9_0_tiling_mode_table_init(struct amdgpu_device * adev)2214fb4d8502Sjsg static void gfx_v9_0_tiling_mode_table_init(struct amdgpu_device *adev)
2215fb4d8502Sjsg {
2216fb4d8502Sjsg 	/* TODO */
2217fb4d8502Sjsg }
2218fb4d8502Sjsg 
gfx_v9_0_select_se_sh(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 instance,int xcc_id)2219ad8b1aafSjsg void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num,
2220f005ef32Sjsg 			   u32 instance, int xcc_id)
2221fb4d8502Sjsg {
2222fb4d8502Sjsg 	u32 data;
2223fb4d8502Sjsg 
2224fb4d8502Sjsg 	if (instance == 0xffffffff)
2225fb4d8502Sjsg 		data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1);
2226fb4d8502Sjsg 	else
2227fb4d8502Sjsg 		data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance);
2228fb4d8502Sjsg 
2229fb4d8502Sjsg 	if (se_num == 0xffffffff)
2230fb4d8502Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
2231fb4d8502Sjsg 	else
2232fb4d8502Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
2233fb4d8502Sjsg 
2234fb4d8502Sjsg 	if (sh_num == 0xffffffff)
2235fb4d8502Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
2236fb4d8502Sjsg 	else
2237fb4d8502Sjsg 		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
2238fb4d8502Sjsg 
2239c349dbc7Sjsg 	WREG32_SOC15_RLC_SHADOW(GC, 0, mmGRBM_GFX_INDEX, data);
2240fb4d8502Sjsg }
2241fb4d8502Sjsg 
gfx_v9_0_get_rb_active_bitmap(struct amdgpu_device * adev)2242fb4d8502Sjsg static u32 gfx_v9_0_get_rb_active_bitmap(struct amdgpu_device *adev)
2243fb4d8502Sjsg {
2244fb4d8502Sjsg 	u32 data, mask;
2245fb4d8502Sjsg 
2246fb4d8502Sjsg 	data = RREG32_SOC15(GC, 0, mmCC_RB_BACKEND_DISABLE);
2247fb4d8502Sjsg 	data |= RREG32_SOC15(GC, 0, mmGC_USER_RB_BACKEND_DISABLE);
2248fb4d8502Sjsg 
2249fb4d8502Sjsg 	data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK;
2250fb4d8502Sjsg 	data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
2251fb4d8502Sjsg 
2252fb4d8502Sjsg 	mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_backends_per_se /
2253fb4d8502Sjsg 					 adev->gfx.config.max_sh_per_se);
2254fb4d8502Sjsg 
2255fb4d8502Sjsg 	return (~data) & mask;
2256fb4d8502Sjsg }
2257fb4d8502Sjsg 
gfx_v9_0_setup_rb(struct amdgpu_device * adev)2258fb4d8502Sjsg static void gfx_v9_0_setup_rb(struct amdgpu_device *adev)
2259fb4d8502Sjsg {
2260fb4d8502Sjsg 	int i, j;
2261fb4d8502Sjsg 	u32 data;
2262fb4d8502Sjsg 	u32 active_rbs = 0;
2263fb4d8502Sjsg 	u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
2264fb4d8502Sjsg 					adev->gfx.config.max_sh_per_se;
2265fb4d8502Sjsg 
2266fb4d8502Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
2267fb4d8502Sjsg 	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
2268fb4d8502Sjsg 		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
2269f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);
2270fb4d8502Sjsg 			data = gfx_v9_0_get_rb_active_bitmap(adev);
2271fb4d8502Sjsg 			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *
2272fb4d8502Sjsg 					       rb_bitmap_width_per_sh);
2273fb4d8502Sjsg 		}
2274fb4d8502Sjsg 	}
2275f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
2276fb4d8502Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
2277fb4d8502Sjsg 
2278fb4d8502Sjsg 	adev->gfx.config.backend_enable_mask = active_rbs;
2279fb4d8502Sjsg 	adev->gfx.config.num_rbs = hweight32(active_rbs);
2280fb4d8502Sjsg }
2281fb4d8502Sjsg 
gfx_v9_0_debug_trap_config_init(struct amdgpu_device * adev,uint32_t first_vmid,uint32_t last_vmid)2282f005ef32Sjsg static void gfx_v9_0_debug_trap_config_init(struct amdgpu_device *adev,
2283f005ef32Sjsg 				uint32_t first_vmid,
2284f005ef32Sjsg 				uint32_t last_vmid)
2285f005ef32Sjsg {
2286f005ef32Sjsg 	uint32_t data;
2287f005ef32Sjsg 	uint32_t trap_config_vmid_mask = 0;
2288f005ef32Sjsg 	int i;
2289f005ef32Sjsg 
2290f005ef32Sjsg 	/* Calculate trap config vmid mask */
2291f005ef32Sjsg 	for (i = first_vmid; i < last_vmid; i++)
2292f005ef32Sjsg 		trap_config_vmid_mask |= (1 << i);
2293f005ef32Sjsg 
2294f005ef32Sjsg 	data = REG_SET_FIELD(0, SPI_GDBG_TRAP_CONFIG,
2295f005ef32Sjsg 			VMID_SEL, trap_config_vmid_mask);
2296f005ef32Sjsg 	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG,
2297f005ef32Sjsg 			TRAP_EN, 1);
2298f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_CONFIG), data);
2299f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0);
2300f005ef32Sjsg 
2301f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA0), 0);
2302f005ef32Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA1), 0);
2303f005ef32Sjsg }
2304f005ef32Sjsg 
2305fb4d8502Sjsg #define DEFAULT_SH_MEM_BASES	(0x6000)
gfx_v9_0_init_compute_vmid(struct amdgpu_device * adev)2306fb4d8502Sjsg static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)
2307fb4d8502Sjsg {
2308fb4d8502Sjsg 	int i;
2309fb4d8502Sjsg 	uint32_t sh_mem_config;
2310fb4d8502Sjsg 	uint32_t sh_mem_bases;
2311fb4d8502Sjsg 
2312fb4d8502Sjsg 	/*
2313fb4d8502Sjsg 	 * Configure apertures:
2314fb4d8502Sjsg 	 * LDS:         0x60000000'00000000 - 0x60000001'00000000 (4GB)
2315fb4d8502Sjsg 	 * Scratch:     0x60000001'00000000 - 0x60000002'00000000 (4GB)
2316fb4d8502Sjsg 	 * GPUVM:       0x60010000'00000000 - 0x60020000'00000000 (1TB)
2317fb4d8502Sjsg 	 */
2318fb4d8502Sjsg 	sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16);
2319fb4d8502Sjsg 
2320fb4d8502Sjsg 	sh_mem_config = SH_MEM_ADDRESS_MODE_64 |
2321fb4d8502Sjsg 			SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
2322fb4d8502Sjsg 			SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT;
2323fb4d8502Sjsg 
2324fb4d8502Sjsg 	mutex_lock(&adev->srbm_mutex);
2325ad8b1aafSjsg 	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) {
2326f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, i, 0);
2327fb4d8502Sjsg 		/* CP and shaders */
2328c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, sh_mem_config);
2329c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, sh_mem_bases);
2330fb4d8502Sjsg 	}
2331f005ef32Sjsg 	soc15_grbm_select(adev, 0, 0, 0, 0, 0);
2332fb4d8502Sjsg 	mutex_unlock(&adev->srbm_mutex);
2333c349dbc7Sjsg 
2334c349dbc7Sjsg 	/* Initialize all compute VMIDs to have no GDS, GWS, or OA
23351bb76ff1Sjsg 	   access. These should be enabled by FW for target VMIDs. */
2336ad8b1aafSjsg 	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) {
2337c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * i, 0);
2338c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * i, 0);
2339c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, i, 0);
2340c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, i, 0);
2341c349dbc7Sjsg 	}
2342fb4d8502Sjsg }
2343fb4d8502Sjsg 
gfx_v9_0_init_gds_vmid(struct amdgpu_device * adev)2344c349dbc7Sjsg static void gfx_v9_0_init_gds_vmid(struct amdgpu_device *adev)
2345c349dbc7Sjsg {
2346c349dbc7Sjsg 	int vmid;
2347c349dbc7Sjsg 
2348c349dbc7Sjsg 	/*
2349c349dbc7Sjsg 	 * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA
2350c349dbc7Sjsg 	 * access. Compute VMIDs should be enabled by FW for target VMIDs,
2351c349dbc7Sjsg 	 * the driver can enable them for graphics. VMID0 should maintain
2352c349dbc7Sjsg 	 * access so that HWS firmware can save/restore entries.
2353c349dbc7Sjsg 	 */
23545ca02815Sjsg 	for (vmid = 1; vmid < AMDGPU_NUM_VMID; vmid++) {
2355c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * vmid, 0);
2356c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * vmid, 0);
2357c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, vmid, 0);
2358c349dbc7Sjsg 		WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, vmid, 0);
2359c349dbc7Sjsg 	}
2360c349dbc7Sjsg }
2361c349dbc7Sjsg 
gfx_v9_0_init_sq_config(struct amdgpu_device * adev)2362c349dbc7Sjsg static void gfx_v9_0_init_sq_config(struct amdgpu_device *adev)
2363c349dbc7Sjsg {
2364c349dbc7Sjsg 	uint32_t tmp;
2365c349dbc7Sjsg 
23661bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
23671bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
2368c349dbc7Sjsg 		tmp = RREG32_SOC15(GC, 0, mmSQ_CONFIG);
2369f005ef32Sjsg 		tmp = REG_SET_FIELD(tmp, SQ_CONFIG, DISABLE_BARRIER_WAITCNT,
2370f005ef32Sjsg 				!READ_ONCE(adev->barrier_has_auto_waitcnt));
2371c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmSQ_CONFIG, tmp);
2372c349dbc7Sjsg 		break;
2373c349dbc7Sjsg 	default:
2374c349dbc7Sjsg 		break;
2375ad8b1aafSjsg 	}
2376c349dbc7Sjsg }
2377c349dbc7Sjsg 
gfx_v9_0_constants_init(struct amdgpu_device * adev)2378c349dbc7Sjsg static void gfx_v9_0_constants_init(struct amdgpu_device *adev)
2379fb4d8502Sjsg {
2380fb4d8502Sjsg 	u32 tmp;
2381fb4d8502Sjsg 	int i;
2382fb4d8502Sjsg 
2383c349dbc7Sjsg 	WREG32_FIELD15_RLC(GC, 0, GRBM_CNTL, READ_TIMEOUT, 0xff);
2384fb4d8502Sjsg 
2385fb4d8502Sjsg 	gfx_v9_0_tiling_mode_table_init(adev);
2386fb4d8502Sjsg 
2387b87290b8Sjsg 	if (adev->gfx.num_gfx_rings)
2388fb4d8502Sjsg 		gfx_v9_0_setup_rb(adev);
2389fb4d8502Sjsg 	gfx_v9_0_get_cu_info(adev, &adev->gfx.cu_info);
2390fb4d8502Sjsg 	adev->gfx.config.db_debug2 = RREG32_SOC15(GC, 0, mmDB_DEBUG2);
2391fb4d8502Sjsg 
2392fb4d8502Sjsg 	/* XXX SH_MEM regs */
2393fb4d8502Sjsg 	/* where to put LDS, scratch, GPUVM in FSA64 space */
2394fb4d8502Sjsg 	mutex_lock(&adev->srbm_mutex);
2395f005ef32Sjsg 	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) {
2396f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, i, 0);
2397fb4d8502Sjsg 		/* CP and shaders */
2398fb4d8502Sjsg 		if (i == 0) {
2399fb4d8502Sjsg 			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,
2400fb4d8502Sjsg 					    SH_MEM_ALIGNMENT_MODE_UNALIGNED);
2401c349dbc7Sjsg 			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE,
2402ad8b1aafSjsg 					    !!adev->gmc.noretry);
2403c349dbc7Sjsg 			WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, tmp);
2404c349dbc7Sjsg 			WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, 0);
2405fb4d8502Sjsg 		} else {
2406fb4d8502Sjsg 			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,
2407fb4d8502Sjsg 					    SH_MEM_ALIGNMENT_MODE_UNALIGNED);
2408c349dbc7Sjsg 			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE,
2409ad8b1aafSjsg 					    !!adev->gmc.noretry);
2410c349dbc7Sjsg 			WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, tmp);
2411fb4d8502Sjsg 			tmp = REG_SET_FIELD(0, SH_MEM_BASES, PRIVATE_BASE,
2412fb4d8502Sjsg 				(adev->gmc.private_aperture_start >> 48));
2413fb4d8502Sjsg 			tmp = REG_SET_FIELD(tmp, SH_MEM_BASES, SHARED_BASE,
2414fb4d8502Sjsg 				(adev->gmc.shared_aperture_start >> 48));
2415c349dbc7Sjsg 			WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, tmp);
2416fb4d8502Sjsg 		}
2417fb4d8502Sjsg 	}
2418f005ef32Sjsg 	soc15_grbm_select(adev, 0, 0, 0, 0, 0);
2419fb4d8502Sjsg 
2420fb4d8502Sjsg 	mutex_unlock(&adev->srbm_mutex);
2421fb4d8502Sjsg 
2422fb4d8502Sjsg 	gfx_v9_0_init_compute_vmid(adev);
2423c349dbc7Sjsg 	gfx_v9_0_init_gds_vmid(adev);
2424c349dbc7Sjsg 	gfx_v9_0_init_sq_config(adev);
2425fb4d8502Sjsg }
2426fb4d8502Sjsg 
gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device * adev)2427fb4d8502Sjsg static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
2428fb4d8502Sjsg {
2429fb4d8502Sjsg 	u32 i, j, k;
2430fb4d8502Sjsg 	u32 mask;
2431fb4d8502Sjsg 
2432fb4d8502Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
2433fb4d8502Sjsg 	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
2434fb4d8502Sjsg 		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
2435f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);
2436fb4d8502Sjsg 			for (k = 0; k < adev->usec_timeout; k++) {
2437fb4d8502Sjsg 				if (RREG32_SOC15(GC, 0, mmRLC_SERDES_CU_MASTER_BUSY) == 0)
2438fb4d8502Sjsg 					break;
2439fb4d8502Sjsg 				udelay(1);
2440fb4d8502Sjsg 			}
2441fb4d8502Sjsg 			if (k == adev->usec_timeout) {
2442f005ef32Sjsg 				amdgpu_gfx_select_se_sh(adev, 0xffffffff,
2443f005ef32Sjsg 						      0xffffffff, 0xffffffff, 0);
2444fb4d8502Sjsg 				mutex_unlock(&adev->grbm_idx_mutex);
2445fb4d8502Sjsg 				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",
2446fb4d8502Sjsg 					 i, j);
2447fb4d8502Sjsg 				return;
2448fb4d8502Sjsg 			}
2449fb4d8502Sjsg 		}
2450fb4d8502Sjsg 	}
2451f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
2452fb4d8502Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
2453fb4d8502Sjsg 
2454fb4d8502Sjsg 	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK |
2455fb4d8502Sjsg 		RLC_SERDES_NONCU_MASTER_BUSY__GC_MASTER_BUSY_MASK |
2456fb4d8502Sjsg 		RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK |
2457fb4d8502Sjsg 		RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK;
2458fb4d8502Sjsg 	for (k = 0; k < adev->usec_timeout; k++) {
2459fb4d8502Sjsg 		if ((RREG32_SOC15(GC, 0, mmRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)
2460fb4d8502Sjsg 			break;
2461fb4d8502Sjsg 		udelay(1);
2462fb4d8502Sjsg 	}
2463fb4d8502Sjsg }
2464fb4d8502Sjsg 
gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device * adev,bool enable)2465fb4d8502Sjsg static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
2466fb4d8502Sjsg 					       bool enable)
2467fb4d8502Sjsg {
24685ca02815Sjsg 	u32 tmp;
24695ca02815Sjsg 
24705ca02815Sjsg 	/* These interrupts should be enabled to drive DS clock */
24715ca02815Sjsg 
24725ca02815Sjsg 	tmp= RREG32_SOC15(GC, 0, mmCP_INT_CNTL_RING0);
2473fb4d8502Sjsg 
2474fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE, enable ? 1 : 0);
2475fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_EMPTY_INT_ENABLE, enable ? 1 : 0);
2476fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0);
24775ca02815Sjsg 	if(adev->gfx.num_gfx_rings)
2478fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, GFX_IDLE_INT_ENABLE, enable ? 1 : 0);
2479fb4d8502Sjsg 
2480fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_INT_CNTL_RING0, tmp);
2481fb4d8502Sjsg }
2482fb4d8502Sjsg 
gfx_v9_0_init_csb(struct amdgpu_device * adev)2483fb4d8502Sjsg static void gfx_v9_0_init_csb(struct amdgpu_device *adev)
2484fb4d8502Sjsg {
2485c349dbc7Sjsg 	adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr);
2486fb4d8502Sjsg 	/* csib */
2487c349dbc7Sjsg 	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI),
2488fb4d8502Sjsg 			adev->gfx.rlc.clear_state_gpu_addr >> 32);
2489c349dbc7Sjsg 	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_LO),
2490fb4d8502Sjsg 			adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc);
2491c349dbc7Sjsg 	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_LENGTH),
2492fb4d8502Sjsg 			adev->gfx.rlc.clear_state_size);
2493fb4d8502Sjsg }
2494fb4d8502Sjsg 
gfx_v9_1_parse_ind_reg_list(int * register_list_format,int indirect_offset,int list_size,int * unique_indirect_regs,int unique_indirect_reg_count,int * indirect_start_offsets,int * indirect_start_offsets_count,int max_start_offsets_count)2495fb4d8502Sjsg static void gfx_v9_1_parse_ind_reg_list(int *register_list_format,
2496fb4d8502Sjsg 				int indirect_offset,
2497fb4d8502Sjsg 				int list_size,
2498fb4d8502Sjsg 				int *unique_indirect_regs,
2499fb4d8502Sjsg 				int unique_indirect_reg_count,
2500fb4d8502Sjsg 				int *indirect_start_offsets,
2501fb4d8502Sjsg 				int *indirect_start_offsets_count,
2502fb4d8502Sjsg 				int max_start_offsets_count)
2503fb4d8502Sjsg {
2504fb4d8502Sjsg 	int idx;
2505fb4d8502Sjsg 
2506fb4d8502Sjsg 	for (; indirect_offset < list_size; indirect_offset++) {
2507fb4d8502Sjsg 		WARN_ON(*indirect_start_offsets_count >= max_start_offsets_count);
2508fb4d8502Sjsg 		indirect_start_offsets[*indirect_start_offsets_count] = indirect_offset;
2509fb4d8502Sjsg 		*indirect_start_offsets_count = *indirect_start_offsets_count + 1;
2510fb4d8502Sjsg 
2511fb4d8502Sjsg 		while (register_list_format[indirect_offset] != 0xFFFFFFFF) {
2512fb4d8502Sjsg 			indirect_offset += 2;
2513fb4d8502Sjsg 
2514fb4d8502Sjsg 			/* look for the matching indice */
2515fb4d8502Sjsg 			for (idx = 0; idx < unique_indirect_reg_count; idx++) {
2516fb4d8502Sjsg 				if (unique_indirect_regs[idx] ==
2517fb4d8502Sjsg 					register_list_format[indirect_offset] ||
2518fb4d8502Sjsg 					!unique_indirect_regs[idx])
2519fb4d8502Sjsg 					break;
2520fb4d8502Sjsg 			}
2521fb4d8502Sjsg 
2522fb4d8502Sjsg 			BUG_ON(idx >= unique_indirect_reg_count);
2523fb4d8502Sjsg 
2524fb4d8502Sjsg 			if (!unique_indirect_regs[idx])
2525fb4d8502Sjsg 				unique_indirect_regs[idx] = register_list_format[indirect_offset];
2526fb4d8502Sjsg 
2527fb4d8502Sjsg 			indirect_offset++;
2528fb4d8502Sjsg 		}
2529fb4d8502Sjsg 	}
2530fb4d8502Sjsg }
2531fb4d8502Sjsg 
gfx_v9_1_init_rlc_save_restore_list(struct amdgpu_device * adev)2532fb4d8502Sjsg static int gfx_v9_1_init_rlc_save_restore_list(struct amdgpu_device *adev)
2533fb4d8502Sjsg {
2534fb4d8502Sjsg 	int unique_indirect_regs[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
2535fb4d8502Sjsg 	int unique_indirect_reg_count = 0;
2536fb4d8502Sjsg 
2537fb4d8502Sjsg 	int indirect_start_offsets[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
2538fb4d8502Sjsg 	int indirect_start_offsets_count = 0;
2539fb4d8502Sjsg 
2540fb4d8502Sjsg 	int list_size = 0;
2541fb4d8502Sjsg 	int i = 0, j = 0;
2542fb4d8502Sjsg 	u32 tmp = 0;
2543fb4d8502Sjsg 
2544fb4d8502Sjsg 	u32 *register_list_format =
2545c349dbc7Sjsg 		kmemdup(adev->gfx.rlc.register_list_format,
2546c349dbc7Sjsg 			adev->gfx.rlc.reg_list_format_size_bytes, GFP_KERNEL);
2547fb4d8502Sjsg 	if (!register_list_format)
2548fb4d8502Sjsg 		return -ENOMEM;
2549fb4d8502Sjsg 
2550fb4d8502Sjsg 	/* setup unique_indirect_regs array and indirect_start_offsets array */
2551fb4d8502Sjsg 	unique_indirect_reg_count = ARRAY_SIZE(unique_indirect_regs);
2552fb4d8502Sjsg 	gfx_v9_1_parse_ind_reg_list(register_list_format,
2553fb4d8502Sjsg 				    adev->gfx.rlc.reg_list_format_direct_reg_list_length,
2554fb4d8502Sjsg 				    adev->gfx.rlc.reg_list_format_size_bytes >> 2,
2555fb4d8502Sjsg 				    unique_indirect_regs,
2556fb4d8502Sjsg 				    unique_indirect_reg_count,
2557fb4d8502Sjsg 				    indirect_start_offsets,
2558fb4d8502Sjsg 				    &indirect_start_offsets_count,
2559fb4d8502Sjsg 				    ARRAY_SIZE(indirect_start_offsets));
2560fb4d8502Sjsg 
2561fb4d8502Sjsg 	/* enable auto inc in case it is disabled */
2562fb4d8502Sjsg 	tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL));
2563fb4d8502Sjsg 	tmp |= RLC_SRM_CNTL__AUTO_INCR_ADDR_MASK;
2564fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL), tmp);
2565fb4d8502Sjsg 
2566fb4d8502Sjsg 	/* write register_restore table to offset 0x0 using RLC_SRM_ARAM_ADDR/DATA */
2567fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_ARAM_ADDR),
2568fb4d8502Sjsg 		RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET);
2569fb4d8502Sjsg 	for (i = 0; i < adev->gfx.rlc.reg_list_size_bytes >> 2; i++)
2570fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_ARAM_DATA),
2571fb4d8502Sjsg 			adev->gfx.rlc.register_restore[i]);
2572fb4d8502Sjsg 
2573fb4d8502Sjsg 	/* load indirect register */
2574fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_ADDR),
2575fb4d8502Sjsg 		adev->gfx.rlc.reg_list_format_start);
2576fb4d8502Sjsg 
2577fb4d8502Sjsg 	/* direct register portion */
2578fb4d8502Sjsg 	for (i = 0; i < adev->gfx.rlc.reg_list_format_direct_reg_list_length; i++)
2579fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_DATA),
2580fb4d8502Sjsg 			register_list_format[i]);
2581fb4d8502Sjsg 
2582fb4d8502Sjsg 	/* indirect register portion */
2583fb4d8502Sjsg 	while (i < (adev->gfx.rlc.reg_list_format_size_bytes >> 2)) {
2584fb4d8502Sjsg 		if (register_list_format[i] == 0xFFFFFFFF) {
2585fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_GPM_SCRATCH_DATA, register_list_format[i++]);
2586fb4d8502Sjsg 			continue;
2587fb4d8502Sjsg 		}
2588fb4d8502Sjsg 
2589fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmRLC_GPM_SCRATCH_DATA, register_list_format[i++]);
2590fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmRLC_GPM_SCRATCH_DATA, register_list_format[i++]);
2591fb4d8502Sjsg 
2592fb4d8502Sjsg 		for (j = 0; j < unique_indirect_reg_count; j++) {
2593fb4d8502Sjsg 			if (register_list_format[i] == unique_indirect_regs[j]) {
2594fb4d8502Sjsg 				WREG32_SOC15(GC, 0, mmRLC_GPM_SCRATCH_DATA, j);
2595fb4d8502Sjsg 				break;
2596fb4d8502Sjsg 			}
2597fb4d8502Sjsg 		}
2598fb4d8502Sjsg 
2599fb4d8502Sjsg 		BUG_ON(j >= unique_indirect_reg_count);
2600fb4d8502Sjsg 
2601fb4d8502Sjsg 		i++;
2602fb4d8502Sjsg 	}
2603fb4d8502Sjsg 
2604fb4d8502Sjsg 	/* set save/restore list size */
2605fb4d8502Sjsg 	list_size = adev->gfx.rlc.reg_list_size_bytes >> 2;
2606fb4d8502Sjsg 	list_size = list_size >> 1;
2607fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_ADDR),
2608fb4d8502Sjsg 		adev->gfx.rlc.reg_restore_list_size);
2609fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_DATA), list_size);
2610fb4d8502Sjsg 
2611fb4d8502Sjsg 	/* write the starting offsets to RLC scratch ram */
2612fb4d8502Sjsg 	WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_ADDR),
2613fb4d8502Sjsg 		adev->gfx.rlc.starting_offsets_start);
2614fb4d8502Sjsg 	for (i = 0; i < ARRAY_SIZE(indirect_start_offsets); i++)
2615fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_SCRATCH_DATA),
2616fb4d8502Sjsg 		       indirect_start_offsets[i]);
2617fb4d8502Sjsg 
2618fb4d8502Sjsg 	/* load unique indirect regs*/
2619fb4d8502Sjsg 	for (i = 0; i < ARRAY_SIZE(unique_indirect_regs); i++) {
2620fb4d8502Sjsg 		if (unique_indirect_regs[i] != 0) {
2621fb4d8502Sjsg 			WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_INDEX_CNTL_ADDR_0)
2622fb4d8502Sjsg 			       + GFX_RLC_SRM_INDEX_CNTL_ADDR_OFFSETS[i],
2623fb4d8502Sjsg 			       unique_indirect_regs[i] & 0x3FFFF);
2624fb4d8502Sjsg 
2625fb4d8502Sjsg 			WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_INDEX_CNTL_DATA_0)
2626fb4d8502Sjsg 			       + GFX_RLC_SRM_INDEX_CNTL_DATA_OFFSETS[i],
2627fb4d8502Sjsg 			       unique_indirect_regs[i] >> 20);
2628fb4d8502Sjsg 		}
2629fb4d8502Sjsg 	}
2630fb4d8502Sjsg 
2631fb4d8502Sjsg 	kfree(register_list_format);
2632fb4d8502Sjsg 	return 0;
2633fb4d8502Sjsg }
2634fb4d8502Sjsg 
gfx_v9_0_enable_save_restore_machine(struct amdgpu_device * adev)2635fb4d8502Sjsg static void gfx_v9_0_enable_save_restore_machine(struct amdgpu_device *adev)
2636fb4d8502Sjsg {
2637fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, RLC_SRM_CNTL, SRM_ENABLE, 1);
2638fb4d8502Sjsg }
2639fb4d8502Sjsg 
pwr_10_0_gfxip_control_over_cgpg(struct amdgpu_device * adev,bool enable)2640fb4d8502Sjsg static void pwr_10_0_gfxip_control_over_cgpg(struct amdgpu_device *adev,
2641fb4d8502Sjsg 					     bool enable)
2642fb4d8502Sjsg {
2643fb4d8502Sjsg 	uint32_t data = 0;
2644fb4d8502Sjsg 	uint32_t default_data = 0;
2645fb4d8502Sjsg 
2646fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(PWR, 0, mmPWR_MISC_CNTL_STATUS));
2647ad8b1aafSjsg 	if (enable) {
2648fb4d8502Sjsg 		/* enable GFXIP control over CGPG */
2649fb4d8502Sjsg 		data |= PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN_MASK;
2650fb4d8502Sjsg 		if(default_data != data)
2651fb4d8502Sjsg 			WREG32(SOC15_REG_OFFSET(PWR, 0, mmPWR_MISC_CNTL_STATUS), data);
2652fb4d8502Sjsg 
2653fb4d8502Sjsg 		/* update status */
2654fb4d8502Sjsg 		data &= ~PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS_MASK;
2655fb4d8502Sjsg 		data |= (2 << PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS__SHIFT);
2656fb4d8502Sjsg 		if(default_data != data)
2657fb4d8502Sjsg 			WREG32(SOC15_REG_OFFSET(PWR, 0, mmPWR_MISC_CNTL_STATUS), data);
2658fb4d8502Sjsg 	} else {
2659fb4d8502Sjsg 		/* restore GFXIP control over GCPG */
2660fb4d8502Sjsg 		data &= ~PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN_MASK;
2661fb4d8502Sjsg 		if(default_data != data)
2662fb4d8502Sjsg 			WREG32(SOC15_REG_OFFSET(PWR, 0, mmPWR_MISC_CNTL_STATUS), data);
2663fb4d8502Sjsg 	}
2664fb4d8502Sjsg }
2665fb4d8502Sjsg 
gfx_v9_0_init_gfx_power_gating(struct amdgpu_device * adev)2666fb4d8502Sjsg static void gfx_v9_0_init_gfx_power_gating(struct amdgpu_device *adev)
2667fb4d8502Sjsg {
2668fb4d8502Sjsg 	uint32_t data = 0;
2669fb4d8502Sjsg 
2670fb4d8502Sjsg 	if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
2671fb4d8502Sjsg 			      AMD_PG_SUPPORT_GFX_SMG |
2672fb4d8502Sjsg 			      AMD_PG_SUPPORT_GFX_DMG)) {
2673fb4d8502Sjsg 		/* init IDLE_POLL_COUNT = 60 */
2674fb4d8502Sjsg 		data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL));
2675fb4d8502Sjsg 		data &= ~CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT_MASK;
2676fb4d8502Sjsg 		data |= (0x60 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
2677fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_RB_WPTR_POLL_CNTL), data);
2678fb4d8502Sjsg 
2679fb4d8502Sjsg 		/* init RLC PG Delay */
2680fb4d8502Sjsg 		data = 0;
2681fb4d8502Sjsg 		data |= (0x10 << RLC_PG_DELAY__POWER_UP_DELAY__SHIFT);
2682fb4d8502Sjsg 		data |= (0x10 << RLC_PG_DELAY__POWER_DOWN_DELAY__SHIFT);
2683fb4d8502Sjsg 		data |= (0x10 << RLC_PG_DELAY__CMD_PROPAGATE_DELAY__SHIFT);
2684fb4d8502Sjsg 		data |= (0x40 << RLC_PG_DELAY__MEM_SLEEP_DELAY__SHIFT);
2685fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_DELAY), data);
2686fb4d8502Sjsg 
2687fb4d8502Sjsg 		data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_DELAY_2));
2688fb4d8502Sjsg 		data &= ~RLC_PG_DELAY_2__SERDES_CMD_DELAY_MASK;
2689fb4d8502Sjsg 		data |= (0x4 << RLC_PG_DELAY_2__SERDES_CMD_DELAY__SHIFT);
2690fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_DELAY_2), data);
2691fb4d8502Sjsg 
2692fb4d8502Sjsg 		data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_DELAY_3));
2693fb4d8502Sjsg 		data &= ~RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG_MASK;
2694fb4d8502Sjsg 		data |= (0xff << RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG__SHIFT);
2695fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_DELAY_3), data);
2696fb4d8502Sjsg 
2697fb4d8502Sjsg 		data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_AUTO_PG_CTRL));
2698fb4d8502Sjsg 		data &= ~RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD_MASK;
2699fb4d8502Sjsg 
2700fb4d8502Sjsg 		/* program GRBM_REG_SAVE_GFX_IDLE_THRESHOLD to 0x55f0 */
2701fb4d8502Sjsg 		data |= (0x55f0 << RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD__SHIFT);
2702fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_AUTO_PG_CTRL), data);
27031bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 3, 0))
2704fb4d8502Sjsg 			pwr_10_0_gfxip_control_over_cgpg(adev, true);
2705fb4d8502Sjsg 	}
2706fb4d8502Sjsg }
2707fb4d8502Sjsg 
gfx_v9_0_enable_sck_slow_down_on_power_up(struct amdgpu_device * adev,bool enable)2708fb4d8502Sjsg static void gfx_v9_0_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev,
2709fb4d8502Sjsg 						bool enable)
2710fb4d8502Sjsg {
2711fb4d8502Sjsg 	uint32_t data = 0;
2712fb4d8502Sjsg 	uint32_t default_data = 0;
2713fb4d8502Sjsg 
2714fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2715fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2716fb4d8502Sjsg 			     SMU_CLK_SLOWDOWN_ON_PU_ENABLE,
2717fb4d8502Sjsg 			     enable ? 1 : 0);
2718fb4d8502Sjsg 	if (default_data != data)
2719fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2720fb4d8502Sjsg }
2721fb4d8502Sjsg 
gfx_v9_0_enable_sck_slow_down_on_power_down(struct amdgpu_device * adev,bool enable)2722fb4d8502Sjsg static void gfx_v9_0_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev,
2723fb4d8502Sjsg 						bool enable)
2724fb4d8502Sjsg {
2725fb4d8502Sjsg 	uint32_t data = 0;
2726fb4d8502Sjsg 	uint32_t default_data = 0;
2727fb4d8502Sjsg 
2728fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2729fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2730fb4d8502Sjsg 			     SMU_CLK_SLOWDOWN_ON_PD_ENABLE,
2731fb4d8502Sjsg 			     enable ? 1 : 0);
2732fb4d8502Sjsg 	if(default_data != data)
2733fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2734fb4d8502Sjsg }
2735fb4d8502Sjsg 
gfx_v9_0_enable_cp_power_gating(struct amdgpu_device * adev,bool enable)2736fb4d8502Sjsg static void gfx_v9_0_enable_cp_power_gating(struct amdgpu_device *adev,
2737fb4d8502Sjsg 					bool enable)
2738fb4d8502Sjsg {
2739fb4d8502Sjsg 	uint32_t data = 0;
2740fb4d8502Sjsg 	uint32_t default_data = 0;
2741fb4d8502Sjsg 
2742fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2743fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2744fb4d8502Sjsg 			     CP_PG_DISABLE,
2745fb4d8502Sjsg 			     enable ? 0 : 1);
2746fb4d8502Sjsg 	if(default_data != data)
2747fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2748fb4d8502Sjsg }
2749fb4d8502Sjsg 
gfx_v9_0_enable_gfx_cg_power_gating(struct amdgpu_device * adev,bool enable)2750fb4d8502Sjsg static void gfx_v9_0_enable_gfx_cg_power_gating(struct amdgpu_device *adev,
2751fb4d8502Sjsg 						bool enable)
2752fb4d8502Sjsg {
2753fb4d8502Sjsg 	uint32_t data, default_data;
2754fb4d8502Sjsg 
2755fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2756fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2757fb4d8502Sjsg 			     GFX_POWER_GATING_ENABLE,
2758fb4d8502Sjsg 			     enable ? 1 : 0);
2759fb4d8502Sjsg 	if(default_data != data)
2760fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2761fb4d8502Sjsg }
2762fb4d8502Sjsg 
gfx_v9_0_enable_gfx_pipeline_powergating(struct amdgpu_device * adev,bool enable)2763fb4d8502Sjsg static void gfx_v9_0_enable_gfx_pipeline_powergating(struct amdgpu_device *adev,
2764fb4d8502Sjsg 						bool enable)
2765fb4d8502Sjsg {
2766fb4d8502Sjsg 	uint32_t data, default_data;
2767fb4d8502Sjsg 
2768fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2769fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2770fb4d8502Sjsg 			     GFX_PIPELINE_PG_ENABLE,
2771fb4d8502Sjsg 			     enable ? 1 : 0);
2772fb4d8502Sjsg 	if(default_data != data)
2773fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2774fb4d8502Sjsg 
2775fb4d8502Sjsg 	if (!enable)
2776fb4d8502Sjsg 		/* read any GFX register to wake up GFX */
2777fb4d8502Sjsg 		data = RREG32(SOC15_REG_OFFSET(GC, 0, mmDB_RENDER_CONTROL));
2778fb4d8502Sjsg }
2779fb4d8502Sjsg 
gfx_v9_0_enable_gfx_static_mg_power_gating(struct amdgpu_device * adev,bool enable)2780fb4d8502Sjsg static void gfx_v9_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev,
2781fb4d8502Sjsg 						       bool enable)
2782fb4d8502Sjsg {
2783fb4d8502Sjsg 	uint32_t data, default_data;
2784fb4d8502Sjsg 
2785fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2786fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2787fb4d8502Sjsg 			     STATIC_PER_CU_PG_ENABLE,
2788fb4d8502Sjsg 			     enable ? 1 : 0);
2789fb4d8502Sjsg 	if(default_data != data)
2790fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2791fb4d8502Sjsg }
2792fb4d8502Sjsg 
gfx_v9_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device * adev,bool enable)2793fb4d8502Sjsg static void gfx_v9_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device *adev,
2794fb4d8502Sjsg 						bool enable)
2795fb4d8502Sjsg {
2796fb4d8502Sjsg 	uint32_t data, default_data;
2797fb4d8502Sjsg 
2798fb4d8502Sjsg 	default_data = data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL));
2799fb4d8502Sjsg 	data = REG_SET_FIELD(data, RLC_PG_CNTL,
2800fb4d8502Sjsg 			     DYN_PER_CU_PG_ENABLE,
2801fb4d8502Sjsg 			     enable ? 1 : 0);
2802fb4d8502Sjsg 	if(default_data != data)
2803fb4d8502Sjsg 		WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_PG_CNTL), data);
2804fb4d8502Sjsg }
2805fb4d8502Sjsg 
gfx_v9_0_init_pg(struct amdgpu_device * adev)2806fb4d8502Sjsg static void gfx_v9_0_init_pg(struct amdgpu_device *adev)
2807fb4d8502Sjsg {
2808fb4d8502Sjsg 	gfx_v9_0_init_csb(adev);
2809fb4d8502Sjsg 
2810fb4d8502Sjsg 	/*
2811fb4d8502Sjsg 	 * Rlc save restore list is workable since v2_1.
2812fb4d8502Sjsg 	 * And it's needed by gfxoff feature.
2813fb4d8502Sjsg 	 */
2814fb4d8502Sjsg 	if (adev->gfx.rlc.is_rlc_v2_1) {
28151bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 2, 1) ||
2816ad8b1aafSjsg 		    (adev->apu_flags & AMD_APU_IS_RAVEN2))
2817fb4d8502Sjsg 			gfx_v9_1_init_rlc_save_restore_list(adev);
2818fb4d8502Sjsg 		gfx_v9_0_enable_save_restore_machine(adev);
2819fb4d8502Sjsg 	}
2820fb4d8502Sjsg 
2821fb4d8502Sjsg 	if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
2822fb4d8502Sjsg 			      AMD_PG_SUPPORT_GFX_SMG |
2823fb4d8502Sjsg 			      AMD_PG_SUPPORT_GFX_DMG |
2824fb4d8502Sjsg 			      AMD_PG_SUPPORT_CP |
2825fb4d8502Sjsg 			      AMD_PG_SUPPORT_GDS |
2826fb4d8502Sjsg 			      AMD_PG_SUPPORT_RLC_SMU_HS)) {
2827642ce627Sjsg 		WREG32_SOC15(GC, 0, mmRLC_JUMP_TABLE_RESTORE,
2828fb4d8502Sjsg 			     adev->gfx.rlc.cp_table_gpu_addr >> 8);
2829fb4d8502Sjsg 		gfx_v9_0_init_gfx_power_gating(adev);
2830fb4d8502Sjsg 	}
2831fb4d8502Sjsg }
2832fb4d8502Sjsg 
gfx_v9_0_rlc_stop(struct amdgpu_device * adev)28335ca02815Sjsg static void gfx_v9_0_rlc_stop(struct amdgpu_device *adev)
2834fb4d8502Sjsg {
2835fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 0);
2836fb4d8502Sjsg 	gfx_v9_0_enable_gui_idle_interrupt(adev, false);
2837fb4d8502Sjsg 	gfx_v9_0_wait_for_rlc_serdes(adev);
2838fb4d8502Sjsg }
2839fb4d8502Sjsg 
gfx_v9_0_rlc_reset(struct amdgpu_device * adev)2840fb4d8502Sjsg static void gfx_v9_0_rlc_reset(struct amdgpu_device *adev)
2841fb4d8502Sjsg {
2842fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
2843fb4d8502Sjsg 	udelay(50);
2844fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 0);
2845fb4d8502Sjsg 	udelay(50);
2846fb4d8502Sjsg }
2847fb4d8502Sjsg 
gfx_v9_0_rlc_start(struct amdgpu_device * adev)2848fb4d8502Sjsg static void gfx_v9_0_rlc_start(struct amdgpu_device *adev)
2849fb4d8502Sjsg {
2850fb4d8502Sjsg #ifdef AMDGPU_RLC_DEBUG_RETRY
2851fb4d8502Sjsg 	u32 rlc_ucode_ver;
2852fb4d8502Sjsg #endif
2853fb4d8502Sjsg 
2854fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1);
2855fb4d8502Sjsg 	udelay(50);
2856fb4d8502Sjsg 
2857fb4d8502Sjsg 	/* carrizo do enable cp interrupt after cp inited */
2858fb4d8502Sjsg 	if (!(adev->flags & AMD_IS_APU)) {
2859fb4d8502Sjsg 		gfx_v9_0_enable_gui_idle_interrupt(adev, true);
2860fb4d8502Sjsg 		udelay(50);
2861fb4d8502Sjsg 	}
2862fb4d8502Sjsg 
2863fb4d8502Sjsg #ifdef AMDGPU_RLC_DEBUG_RETRY
2864fb4d8502Sjsg 	/* RLC_GPM_GENERAL_6 : RLC Ucode version */
2865fb4d8502Sjsg 	rlc_ucode_ver = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_6);
2866fb4d8502Sjsg 	if(rlc_ucode_ver == 0x108) {
2867fb4d8502Sjsg 		DRM_INFO("Using rlc debug ucode. mmRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n",
2868fb4d8502Sjsg 				rlc_ucode_ver, adev->gfx.rlc_fw_version);
2869fb4d8502Sjsg 		/* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles,
2870fb4d8502Sjsg 		 * default is 0x9C4 to create a 100us interval */
2871fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmRLC_GPM_TIMER_INT_3, 0x9C4);
2872fb4d8502Sjsg 		/* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr
2873fb4d8502Sjsg 		 * to disable the page fault retry interrupts, default is
2874fb4d8502Sjsg 		 * 0x100 (256) */
2875fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_12, 0x100);
2876fb4d8502Sjsg 	}
2877fb4d8502Sjsg #endif
2878fb4d8502Sjsg }
2879fb4d8502Sjsg 
gfx_v9_0_rlc_load_microcode(struct amdgpu_device * adev)2880fb4d8502Sjsg static int gfx_v9_0_rlc_load_microcode(struct amdgpu_device *adev)
2881fb4d8502Sjsg {
2882fb4d8502Sjsg 	const struct rlc_firmware_header_v2_0 *hdr;
2883fb4d8502Sjsg 	const __le32 *fw_data;
2884fb4d8502Sjsg 	unsigned i, fw_size;
2885fb4d8502Sjsg 
2886fb4d8502Sjsg 	if (!adev->gfx.rlc_fw)
2887fb4d8502Sjsg 		return -EINVAL;
2888fb4d8502Sjsg 
2889fb4d8502Sjsg 	hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
2890fb4d8502Sjsg 	amdgpu_ucode_print_rlc_hdr(&hdr->header);
2891fb4d8502Sjsg 
2892fb4d8502Sjsg 	fw_data = (const __le32 *)(adev->gfx.rlc_fw->data +
2893fb4d8502Sjsg 			   le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2894fb4d8502Sjsg 	fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
2895fb4d8502Sjsg 
2896fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_ADDR,
2897fb4d8502Sjsg 			RLCG_UCODE_LOADING_START_ADDRESS);
2898fb4d8502Sjsg 	for (i = 0; i < fw_size; i++)
2899fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
2900fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version);
2901fb4d8502Sjsg 
2902fb4d8502Sjsg 	return 0;
2903fb4d8502Sjsg }
2904fb4d8502Sjsg 
gfx_v9_0_rlc_resume(struct amdgpu_device * adev)2905fb4d8502Sjsg static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
2906fb4d8502Sjsg {
2907fb4d8502Sjsg 	int r;
2908fb4d8502Sjsg 
2909fb4d8502Sjsg 	if (amdgpu_sriov_vf(adev)) {
2910fb4d8502Sjsg 		gfx_v9_0_init_csb(adev);
2911fb4d8502Sjsg 		return 0;
2912fb4d8502Sjsg 	}
2913fb4d8502Sjsg 
2914c349dbc7Sjsg 	adev->gfx.rlc.funcs->stop(adev);
2915fb4d8502Sjsg 
2916fb4d8502Sjsg 	/* disable CG */
2917fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0);
2918fb4d8502Sjsg 
2919fb4d8502Sjsg 	gfx_v9_0_init_pg(adev);
2920fb4d8502Sjsg 
2921fb4d8502Sjsg 	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
2922fb4d8502Sjsg 		/* legacy rlc firmware loading */
2923fb4d8502Sjsg 		r = gfx_v9_0_rlc_load_microcode(adev);
2924fb4d8502Sjsg 		if (r)
2925fb4d8502Sjsg 			return r;
2926fb4d8502Sjsg 	}
2927fb4d8502Sjsg 
29281bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
29291bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
29301bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
2931f005ef32Sjsg 		gfx_v9_0_init_lbpw(adev);
2932c349dbc7Sjsg 		if (amdgpu_lbpw == 0)
2933c349dbc7Sjsg 			gfx_v9_0_enable_lbpw(adev, false);
2934c349dbc7Sjsg 		else
2935c349dbc7Sjsg 			gfx_v9_0_enable_lbpw(adev, true);
2936c349dbc7Sjsg 		break;
29371bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
2938f005ef32Sjsg 		gfx_v9_4_init_lbpw(adev);
2939c349dbc7Sjsg 		if (amdgpu_lbpw > 0)
2940fb4d8502Sjsg 			gfx_v9_0_enable_lbpw(adev, true);
2941fb4d8502Sjsg 		else
2942fb4d8502Sjsg 			gfx_v9_0_enable_lbpw(adev, false);
2943c349dbc7Sjsg 		break;
2944c349dbc7Sjsg 	default:
2945c349dbc7Sjsg 		break;
2946fb4d8502Sjsg 	}
2947fb4d8502Sjsg 
2948f005ef32Sjsg 	gfx_v9_0_update_spm_vmid_internal(adev, 0xf);
2949f005ef32Sjsg 
2950c349dbc7Sjsg 	adev->gfx.rlc.funcs->start(adev);
2951fb4d8502Sjsg 
2952fb4d8502Sjsg 	return 0;
2953fb4d8502Sjsg }
2954fb4d8502Sjsg 
gfx_v9_0_cp_gfx_enable(struct amdgpu_device * adev,bool enable)2955fb4d8502Sjsg static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
2956fb4d8502Sjsg {
2957fb4d8502Sjsg 	u32 tmp = RREG32_SOC15(GC, 0, mmCP_ME_CNTL);
2958fb4d8502Sjsg 
2959fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);
2960fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);
2961fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1);
2962c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_ME_CNTL, tmp);
2963fb4d8502Sjsg 	udelay(50);
2964fb4d8502Sjsg }
2965fb4d8502Sjsg 
gfx_v9_0_cp_gfx_load_microcode(struct amdgpu_device * adev)2966fb4d8502Sjsg static int gfx_v9_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
2967fb4d8502Sjsg {
2968fb4d8502Sjsg 	const struct gfx_firmware_header_v1_0 *pfp_hdr;
2969fb4d8502Sjsg 	const struct gfx_firmware_header_v1_0 *ce_hdr;
2970fb4d8502Sjsg 	const struct gfx_firmware_header_v1_0 *me_hdr;
2971fb4d8502Sjsg 	const __le32 *fw_data;
2972fb4d8502Sjsg 	unsigned i, fw_size;
2973fb4d8502Sjsg 
2974fb4d8502Sjsg 	if (!adev->gfx.me_fw || !adev->gfx.pfp_fw || !adev->gfx.ce_fw)
2975fb4d8502Sjsg 		return -EINVAL;
2976fb4d8502Sjsg 
2977fb4d8502Sjsg 	pfp_hdr = (const struct gfx_firmware_header_v1_0 *)
2978fb4d8502Sjsg 		adev->gfx.pfp_fw->data;
2979fb4d8502Sjsg 	ce_hdr = (const struct gfx_firmware_header_v1_0 *)
2980fb4d8502Sjsg 		adev->gfx.ce_fw->data;
2981fb4d8502Sjsg 	me_hdr = (const struct gfx_firmware_header_v1_0 *)
2982fb4d8502Sjsg 		adev->gfx.me_fw->data;
2983fb4d8502Sjsg 
2984fb4d8502Sjsg 	amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header);
2985fb4d8502Sjsg 	amdgpu_ucode_print_gfx_hdr(&ce_hdr->header);
2986fb4d8502Sjsg 	amdgpu_ucode_print_gfx_hdr(&me_hdr->header);
2987fb4d8502Sjsg 
2988fb4d8502Sjsg 	gfx_v9_0_cp_gfx_enable(adev, false);
2989fb4d8502Sjsg 
2990fb4d8502Sjsg 	/* PFP */
2991fb4d8502Sjsg 	fw_data = (const __le32 *)
2992fb4d8502Sjsg 		(adev->gfx.pfp_fw->data +
2993fb4d8502Sjsg 		 le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
2994fb4d8502Sjsg 	fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
2995fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_ADDR, 0);
2996fb4d8502Sjsg 	for (i = 0; i < fw_size; i++)
2997fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
2998fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_PFP_UCODE_ADDR, adev->gfx.pfp_fw_version);
2999fb4d8502Sjsg 
3000fb4d8502Sjsg 	/* CE */
3001fb4d8502Sjsg 	fw_data = (const __le32 *)
3002fb4d8502Sjsg 		(adev->gfx.ce_fw->data +
3003fb4d8502Sjsg 		 le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
3004fb4d8502Sjsg 	fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
3005fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_CE_UCODE_ADDR, 0);
3006fb4d8502Sjsg 	for (i = 0; i < fw_size; i++)
3007fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
3008fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_CE_UCODE_ADDR, adev->gfx.ce_fw_version);
3009fb4d8502Sjsg 
3010fb4d8502Sjsg 	/* ME */
3011fb4d8502Sjsg 	fw_data = (const __le32 *)
3012fb4d8502Sjsg 		(adev->gfx.me_fw->data +
3013fb4d8502Sjsg 		 le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
3014fb4d8502Sjsg 	fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
3015fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_ME_RAM_WADDR, 0);
3016fb4d8502Sjsg 	for (i = 0; i < fw_size; i++)
3017fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_ME_RAM_DATA, le32_to_cpup(fw_data++));
3018fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_ME_RAM_WADDR, adev->gfx.me_fw_version);
3019fb4d8502Sjsg 
3020fb4d8502Sjsg 	return 0;
3021fb4d8502Sjsg }
3022fb4d8502Sjsg 
gfx_v9_0_cp_gfx_start(struct amdgpu_device * adev)3023fb4d8502Sjsg static int gfx_v9_0_cp_gfx_start(struct amdgpu_device *adev)
3024fb4d8502Sjsg {
3025fb4d8502Sjsg 	struct amdgpu_ring *ring = &adev->gfx.gfx_ring[0];
3026fb4d8502Sjsg 	const struct cs_section_def *sect = NULL;
3027fb4d8502Sjsg 	const struct cs_extent_def *ext = NULL;
3028fb4d8502Sjsg 	int r, i, tmp;
3029fb4d8502Sjsg 
3030fb4d8502Sjsg 	/* init the CP */
3031fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_MAX_CONTEXT, adev->gfx.config.max_hw_contexts - 1);
3032fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_DEVICE_ID, 1);
3033fb4d8502Sjsg 
3034fb4d8502Sjsg 	gfx_v9_0_cp_gfx_enable(adev, true);
3035fb4d8502Sjsg 
3036*2ef2b99cSjsg 	/* Now only limit the quirk on the APU gfx9 series and already
3037*2ef2b99cSjsg 	 * confirmed that the APU gfx10/gfx11 needn't such update.
3038*2ef2b99cSjsg 	 */
3039*2ef2b99cSjsg 	if (adev->flags & AMD_IS_APU &&
3040*2ef2b99cSjsg 			adev->in_s3 && !adev->suspend_complete) {
3041*2ef2b99cSjsg 		DRM_INFO(" Will skip the CSB packet resubmit\n");
3042*2ef2b99cSjsg 		return 0;
3043*2ef2b99cSjsg 	}
3044fb4d8502Sjsg 	r = amdgpu_ring_alloc(ring, gfx_v9_0_get_csb_size(adev) + 4 + 3);
3045fb4d8502Sjsg 	if (r) {
3046fb4d8502Sjsg 		DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
3047fb4d8502Sjsg 		return r;
3048fb4d8502Sjsg 	}
3049fb4d8502Sjsg 
3050fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3051fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3052fb4d8502Sjsg 
3053fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
3054fb4d8502Sjsg 	amdgpu_ring_write(ring, 0x80000000);
3055fb4d8502Sjsg 	amdgpu_ring_write(ring, 0x80000000);
3056fb4d8502Sjsg 
3057fb4d8502Sjsg 	for (sect = gfx9_cs_data; sect->section != NULL; ++sect) {
3058fb4d8502Sjsg 		for (ext = sect->section; ext->extent != NULL; ++ext) {
3059fb4d8502Sjsg 			if (sect->id == SECT_CONTEXT) {
3060fb4d8502Sjsg 				amdgpu_ring_write(ring,
3061fb4d8502Sjsg 				       PACKET3(PACKET3_SET_CONTEXT_REG,
3062fb4d8502Sjsg 					       ext->reg_count));
3063fb4d8502Sjsg 				amdgpu_ring_write(ring,
3064fb4d8502Sjsg 				       ext->reg_index - PACKET3_SET_CONTEXT_REG_START);
3065fb4d8502Sjsg 				for (i = 0; i < ext->reg_count; i++)
3066fb4d8502Sjsg 					amdgpu_ring_write(ring, ext->extent[i]);
3067fb4d8502Sjsg 			}
3068fb4d8502Sjsg 		}
3069fb4d8502Sjsg 	}
3070fb4d8502Sjsg 
3071fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3072fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3073fb4d8502Sjsg 
3074fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3075fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
3076fb4d8502Sjsg 
3077fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
3078fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
3079fb4d8502Sjsg 	amdgpu_ring_write(ring, 0x8000);
3080fb4d8502Sjsg 	amdgpu_ring_write(ring, 0x8000);
3081fb4d8502Sjsg 
3082fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG,1));
3083fb4d8502Sjsg 	tmp = (PACKET3_SET_UCONFIG_REG_INDEX_TYPE |
3084fb4d8502Sjsg 		(SOC15_REG_OFFSET(GC, 0, mmVGT_INDEX_TYPE) - PACKET3_SET_UCONFIG_REG_START));
3085fb4d8502Sjsg 	amdgpu_ring_write(ring, tmp);
3086fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
3087fb4d8502Sjsg 
3088fb4d8502Sjsg 	amdgpu_ring_commit(ring);
3089fb4d8502Sjsg 
3090fb4d8502Sjsg 	return 0;
3091fb4d8502Sjsg }
3092fb4d8502Sjsg 
gfx_v9_0_cp_gfx_resume(struct amdgpu_device * adev)3093fb4d8502Sjsg static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)
3094fb4d8502Sjsg {
3095fb4d8502Sjsg 	struct amdgpu_ring *ring;
3096fb4d8502Sjsg 	u32 tmp;
3097fb4d8502Sjsg 	u32 rb_bufsz;
3098fb4d8502Sjsg 	u64 rb_addr, rptr_addr, wptr_gpu_addr;
3099fb4d8502Sjsg 
3100fb4d8502Sjsg 	/* Set the write pointer delay */
3101fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_DELAY, 0);
3102fb4d8502Sjsg 
3103fb4d8502Sjsg 	/* set the RB to use vmid 0 */
3104fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_VMID, 0);
3105fb4d8502Sjsg 
3106fb4d8502Sjsg 	/* Set ring buffer size */
3107fb4d8502Sjsg 	ring = &adev->gfx.gfx_ring[0];
3108fb4d8502Sjsg 	rb_bufsz = order_base_2(ring->ring_size / 8);
3109fb4d8502Sjsg 	tmp = REG_SET_FIELD(0, CP_RB0_CNTL, RB_BUFSZ, rb_bufsz);
3110fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, RB_BLKSZ, rb_bufsz - 2);
3111fb4d8502Sjsg #ifdef __BIG_ENDIAN
3112fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_RB0_CNTL, BUF_SWAP, 1);
3113fb4d8502Sjsg #endif
3114fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_CNTL, tmp);
3115fb4d8502Sjsg 
3116fb4d8502Sjsg 	/* Initialize the ring buffer's write pointers */
3117fb4d8502Sjsg 	ring->wptr = 0;
3118fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
3119fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, upper_32_bits(ring->wptr));
3120fb4d8502Sjsg 
3121fb4d8502Sjsg 	/* set the wb address wether it's enabled or not */
31221bb76ff1Sjsg 	rptr_addr = ring->rptr_gpu_addr;
3123fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_RPTR_ADDR, lower_32_bits(rptr_addr));
3124fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & CP_RB_RPTR_ADDR_HI__RB_RPTR_ADDR_HI_MASK);
3125fb4d8502Sjsg 
31261bb76ff1Sjsg 	wptr_gpu_addr = ring->wptr_gpu_addr;
3127fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO, lower_32_bits(wptr_gpu_addr));
3128fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI, upper_32_bits(wptr_gpu_addr));
3129fb4d8502Sjsg 
3130fb4d8502Sjsg 	mdelay(1);
3131fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_CNTL, tmp);
3132fb4d8502Sjsg 
3133fb4d8502Sjsg 	rb_addr = ring->gpu_addr >> 8;
3134fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_BASE, rb_addr);
3135fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB0_BASE_HI, upper_32_bits(rb_addr));
3136fb4d8502Sjsg 
3137fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_CONTROL);
3138fb4d8502Sjsg 	if (ring->use_doorbell) {
3139fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
3140fb4d8502Sjsg 				    DOORBELL_OFFSET, ring->doorbell_index);
3141fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
3142fb4d8502Sjsg 				    DOORBELL_EN, 1);
3143fb4d8502Sjsg 	} else {
3144fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL, DOORBELL_EN, 0);
3145fb4d8502Sjsg 	}
3146fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_CONTROL, tmp);
3147fb4d8502Sjsg 
3148fb4d8502Sjsg 	tmp = REG_SET_FIELD(0, CP_RB_DOORBELL_RANGE_LOWER,
3149fb4d8502Sjsg 			DOORBELL_RANGE_LOWER, ring->doorbell_index);
3150fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_LOWER, tmp);
3151fb4d8502Sjsg 
3152fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_RANGE_UPPER,
3153fb4d8502Sjsg 		       CP_RB_DOORBELL_RANGE_UPPER__DOORBELL_RANGE_UPPER_MASK);
3154fb4d8502Sjsg 
3155fb4d8502Sjsg 
3156fb4d8502Sjsg 	/* start the ring */
3157fb4d8502Sjsg 	gfx_v9_0_cp_gfx_start(adev);
3158fb4d8502Sjsg 
3159fb4d8502Sjsg 	return 0;
3160fb4d8502Sjsg }
3161fb4d8502Sjsg 
gfx_v9_0_cp_compute_enable(struct amdgpu_device * adev,bool enable)3162fb4d8502Sjsg static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
3163fb4d8502Sjsg {
3164fb4d8502Sjsg 	if (enable) {
3165c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL, 0);
3166fb4d8502Sjsg 	} else {
3167c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL,
3168fb4d8502Sjsg 			(CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
3169f005ef32Sjsg 		adev->gfx.kiq[0].ring.sched.ready = false;
3170fb4d8502Sjsg 	}
3171fb4d8502Sjsg 	udelay(50);
3172fb4d8502Sjsg }
3173fb4d8502Sjsg 
gfx_v9_0_cp_compute_load_microcode(struct amdgpu_device * adev)3174fb4d8502Sjsg static int gfx_v9_0_cp_compute_load_microcode(struct amdgpu_device *adev)
3175fb4d8502Sjsg {
3176fb4d8502Sjsg 	const struct gfx_firmware_header_v1_0 *mec_hdr;
3177fb4d8502Sjsg 	const __le32 *fw_data;
3178fb4d8502Sjsg 	unsigned i;
3179fb4d8502Sjsg 	u32 tmp;
3180fb4d8502Sjsg 
3181fb4d8502Sjsg 	if (!adev->gfx.mec_fw)
3182fb4d8502Sjsg 		return -EINVAL;
3183fb4d8502Sjsg 
3184fb4d8502Sjsg 	gfx_v9_0_cp_compute_enable(adev, false);
3185fb4d8502Sjsg 
3186fb4d8502Sjsg 	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
3187fb4d8502Sjsg 	amdgpu_ucode_print_gfx_hdr(&mec_hdr->header);
3188fb4d8502Sjsg 
3189fb4d8502Sjsg 	fw_data = (const __le32 *)
3190fb4d8502Sjsg 		(adev->gfx.mec_fw->data +
3191fb4d8502Sjsg 		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
3192fb4d8502Sjsg 	tmp = 0;
3193fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0);
3194fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0);
3195fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_CNTL, tmp);
3196fb4d8502Sjsg 
3197fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_LO,
3198fb4d8502Sjsg 		adev->gfx.mec.mec_fw_gpu_addr & 0xFFFFF000);
3199fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_CPC_IC_BASE_HI,
3200fb4d8502Sjsg 		upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr));
3201fb4d8502Sjsg 
3202fb4d8502Sjsg 	/* MEC1 */
3203fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_ADDR,
3204fb4d8502Sjsg 			 mec_hdr->jt_offset);
3205fb4d8502Sjsg 	for (i = 0; i < mec_hdr->jt_size; i++)
3206fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_DATA,
3207fb4d8502Sjsg 			le32_to_cpup(fw_data + mec_hdr->jt_offset + i));
3208fb4d8502Sjsg 
3209fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmCP_MEC_ME1_UCODE_ADDR,
3210fb4d8502Sjsg 			adev->gfx.mec_fw_version);
3211fb4d8502Sjsg 	/* Todo : Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */
3212fb4d8502Sjsg 
3213fb4d8502Sjsg 	return 0;
3214fb4d8502Sjsg }
3215fb4d8502Sjsg 
3216fb4d8502Sjsg /* KIQ functions */
gfx_v9_0_kiq_setting(struct amdgpu_ring * ring)3217fb4d8502Sjsg static void gfx_v9_0_kiq_setting(struct amdgpu_ring *ring)
3218fb4d8502Sjsg {
3219fb4d8502Sjsg 	uint32_t tmp;
3220fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3221fb4d8502Sjsg 
3222fb4d8502Sjsg 	/* tell RLC which is KIQ queue */
3223fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmRLC_CP_SCHEDULERS);
3224fb4d8502Sjsg 	tmp &= 0xffffff00;
3225fb4d8502Sjsg 	tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue);
3226c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmRLC_CP_SCHEDULERS, tmp);
3227fb4d8502Sjsg 	tmp |= 0x80;
3228c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmRLC_CP_SCHEDULERS, tmp);
3229fb4d8502Sjsg }
3230fb4d8502Sjsg 
gfx_v9_0_mqd_set_priority(struct amdgpu_ring * ring,struct v9_mqd * mqd)3231c349dbc7Sjsg static void gfx_v9_0_mqd_set_priority(struct amdgpu_ring *ring, struct v9_mqd *mqd)
3232fb4d8502Sjsg {
3233c349dbc7Sjsg 	struct amdgpu_device *adev = ring->adev;
3234fb4d8502Sjsg 
3235c349dbc7Sjsg 	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {
32365ca02815Sjsg 		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring)) {
3237c349dbc7Sjsg 			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH;
3238c349dbc7Sjsg 			mqd->cp_hqd_queue_priority =
3239c349dbc7Sjsg 				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM;
3240fb4d8502Sjsg 		}
3241fb4d8502Sjsg 	}
3242fb4d8502Sjsg }
3243fb4d8502Sjsg 
gfx_v9_0_mqd_init(struct amdgpu_ring * ring)3244fb4d8502Sjsg static int gfx_v9_0_mqd_init(struct amdgpu_ring *ring)
3245fb4d8502Sjsg {
3246fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3247fb4d8502Sjsg 	struct v9_mqd *mqd = ring->mqd_ptr;
3248fb4d8502Sjsg 	uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;
3249fb4d8502Sjsg 	uint32_t tmp;
3250fb4d8502Sjsg 
3251fb4d8502Sjsg 	mqd->header = 0xC0310800;
3252fb4d8502Sjsg 	mqd->compute_pipelinestat_enable = 0x00000001;
3253fb4d8502Sjsg 	mqd->compute_static_thread_mgmt_se0 = 0xffffffff;
3254fb4d8502Sjsg 	mqd->compute_static_thread_mgmt_se1 = 0xffffffff;
3255fb4d8502Sjsg 	mqd->compute_static_thread_mgmt_se2 = 0xffffffff;
3256fb4d8502Sjsg 	mqd->compute_static_thread_mgmt_se3 = 0xffffffff;
3257c349dbc7Sjsg 	mqd->compute_static_thread_mgmt_se4 = 0xffffffff;
3258c349dbc7Sjsg 	mqd->compute_static_thread_mgmt_se5 = 0xffffffff;
3259c349dbc7Sjsg 	mqd->compute_static_thread_mgmt_se6 = 0xffffffff;
3260c349dbc7Sjsg 	mqd->compute_static_thread_mgmt_se7 = 0xffffffff;
3261fb4d8502Sjsg 	mqd->compute_misc_reserved = 0x00000003;
3262fb4d8502Sjsg 
3263fb4d8502Sjsg 	mqd->dynamic_cu_mask_addr_lo =
3264fb4d8502Sjsg 		lower_32_bits(ring->mqd_gpu_addr
3265fb4d8502Sjsg 			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask));
3266fb4d8502Sjsg 	mqd->dynamic_cu_mask_addr_hi =
3267fb4d8502Sjsg 		upper_32_bits(ring->mqd_gpu_addr
3268fb4d8502Sjsg 			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask));
3269fb4d8502Sjsg 
3270fb4d8502Sjsg 	eop_base_addr = ring->eop_gpu_addr >> 8;
3271fb4d8502Sjsg 	mqd->cp_hqd_eop_base_addr_lo = eop_base_addr;
3272fb4d8502Sjsg 	mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr);
3273fb4d8502Sjsg 
3274fb4d8502Sjsg 	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
3275fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_HQD_EOP_CONTROL);
3276fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE,
3277fb4d8502Sjsg 			(order_base_2(GFX9_MEC_HPD_SIZE / 4) - 1));
3278fb4d8502Sjsg 
3279fb4d8502Sjsg 	mqd->cp_hqd_eop_control = tmp;
3280fb4d8502Sjsg 
3281fb4d8502Sjsg 	/* enable doorbell? */
3282fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL);
3283fb4d8502Sjsg 
3284fb4d8502Sjsg 	if (ring->use_doorbell) {
3285fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3286fb4d8502Sjsg 				    DOORBELL_OFFSET, ring->doorbell_index);
3287fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3288fb4d8502Sjsg 				    DOORBELL_EN, 1);
3289fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3290fb4d8502Sjsg 				    DOORBELL_SOURCE, 0);
3291fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3292fb4d8502Sjsg 				    DOORBELL_HIT, 0);
3293fb4d8502Sjsg 	} else {
3294fb4d8502Sjsg 		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL,
3295fb4d8502Sjsg 					 DOORBELL_EN, 0);
3296fb4d8502Sjsg 	}
3297fb4d8502Sjsg 
3298fb4d8502Sjsg 	mqd->cp_hqd_pq_doorbell_control = tmp;
3299fb4d8502Sjsg 
3300fb4d8502Sjsg 	/* disable the queue if it's active */
3301fb4d8502Sjsg 	ring->wptr = 0;
3302fb4d8502Sjsg 	mqd->cp_hqd_dequeue_request = 0;
3303fb4d8502Sjsg 	mqd->cp_hqd_pq_rptr = 0;
3304fb4d8502Sjsg 	mqd->cp_hqd_pq_wptr_lo = 0;
3305fb4d8502Sjsg 	mqd->cp_hqd_pq_wptr_hi = 0;
3306fb4d8502Sjsg 
3307fb4d8502Sjsg 	/* set the pointer to the MQD */
3308fb4d8502Sjsg 	mqd->cp_mqd_base_addr_lo = ring->mqd_gpu_addr & 0xfffffffc;
3309fb4d8502Sjsg 	mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr);
3310fb4d8502Sjsg 
3311fb4d8502Sjsg 	/* set MQD vmid to 0 */
3312fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_MQD_CONTROL);
3313fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);
3314fb4d8502Sjsg 	mqd->cp_mqd_control = tmp;
3315fb4d8502Sjsg 
3316fb4d8502Sjsg 	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
3317fb4d8502Sjsg 	hqd_gpu_addr = ring->gpu_addr >> 8;
3318fb4d8502Sjsg 	mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;
3319fb4d8502Sjsg 	mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
3320fb4d8502Sjsg 
3321fb4d8502Sjsg 	/* set up the HQD, this is similar to CP_RB0_CNTL */
3322fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_CONTROL);
3323fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
3324fb4d8502Sjsg 			    (order_base_2(ring->ring_size / 4) - 1));
3325fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
33261bb76ff1Sjsg 			(order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1));
3327fb4d8502Sjsg #ifdef __BIG_ENDIAN
3328fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ENDIAN_SWAP, 1);
3329fb4d8502Sjsg #endif
3330fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 0);
3331fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0);
3332fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
3333fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);
3334fb4d8502Sjsg 	mqd->cp_hqd_pq_control = tmp;
3335fb4d8502Sjsg 
3336fb4d8502Sjsg 	/* set the wb address whether it's enabled or not */
33371bb76ff1Sjsg 	wb_gpu_addr = ring->rptr_gpu_addr;
3338fb4d8502Sjsg 	mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc;
3339fb4d8502Sjsg 	mqd->cp_hqd_pq_rptr_report_addr_hi =
3340fb4d8502Sjsg 		upper_32_bits(wb_gpu_addr) & 0xffff;
3341fb4d8502Sjsg 
3342fb4d8502Sjsg 	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */
33431bb76ff1Sjsg 	wb_gpu_addr = ring->wptr_gpu_addr;
3344fb4d8502Sjsg 	mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc;
3345fb4d8502Sjsg 	mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff;
3346fb4d8502Sjsg 
3347fb4d8502Sjsg 	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
3348fb4d8502Sjsg 	ring->wptr = 0;
3349fb4d8502Sjsg 	mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, 0, mmCP_HQD_PQ_RPTR);
3350fb4d8502Sjsg 
3351fb4d8502Sjsg 	/* set the vmid for the queue */
3352fb4d8502Sjsg 	mqd->cp_hqd_vmid = 0;
3353fb4d8502Sjsg 
3354fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_HQD_PERSISTENT_STATE);
3355fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);
3356fb4d8502Sjsg 	mqd->cp_hqd_persistent_state = tmp;
3357fb4d8502Sjsg 
3358fb4d8502Sjsg 	/* set MIN_IB_AVAIL_SIZE */
3359fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmCP_HQD_IB_CONTROL);
3360fb4d8502Sjsg 	tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3);
3361fb4d8502Sjsg 	mqd->cp_hqd_ib_control = tmp;
3362fb4d8502Sjsg 
3363c349dbc7Sjsg 	/* set static priority for a queue/ring */
3364c349dbc7Sjsg 	gfx_v9_0_mqd_set_priority(ring, mqd);
33652bdcbea8Sjsg 	mqd->cp_hqd_quantum = RREG32_SOC15(GC, 0, mmCP_HQD_QUANTUM);
3366c349dbc7Sjsg 
3367c349dbc7Sjsg 	/* map_queues packet doesn't need activate the queue,
3368c349dbc7Sjsg 	 * so only kiq need set this field.
3369c349dbc7Sjsg 	 */
3370c349dbc7Sjsg 	if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)
3371fb4d8502Sjsg 		mqd->cp_hqd_active = 1;
3372fb4d8502Sjsg 
3373fb4d8502Sjsg 	return 0;
3374fb4d8502Sjsg }
3375fb4d8502Sjsg 
gfx_v9_0_kiq_init_register(struct amdgpu_ring * ring)3376fb4d8502Sjsg static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)
3377fb4d8502Sjsg {
3378fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3379fb4d8502Sjsg 	struct v9_mqd *mqd = ring->mqd_ptr;
3380fb4d8502Sjsg 	int j;
3381fb4d8502Sjsg 
3382fb4d8502Sjsg 	/* disable wptr polling */
3383fb4d8502Sjsg 	WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0);
3384fb4d8502Sjsg 
3385c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_EOP_BASE_ADDR,
3386fb4d8502Sjsg 	       mqd->cp_hqd_eop_base_addr_lo);
3387c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_EOP_BASE_ADDR_HI,
3388fb4d8502Sjsg 	       mqd->cp_hqd_eop_base_addr_hi);
3389fb4d8502Sjsg 
3390fb4d8502Sjsg 	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */
3391c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_EOP_CONTROL,
3392fb4d8502Sjsg 	       mqd->cp_hqd_eop_control);
3393fb4d8502Sjsg 
3394fb4d8502Sjsg 	/* enable doorbell? */
3395c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
3396fb4d8502Sjsg 	       mqd->cp_hqd_pq_doorbell_control);
3397fb4d8502Sjsg 
3398fb4d8502Sjsg 	/* disable the queue if it's active */
3399fb4d8502Sjsg 	if (RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1) {
3400c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 1);
3401fb4d8502Sjsg 		for (j = 0; j < adev->usec_timeout; j++) {
3402fb4d8502Sjsg 			if (!(RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1))
3403fb4d8502Sjsg 				break;
3404fb4d8502Sjsg 			udelay(1);
3405fb4d8502Sjsg 		}
3406c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_DEQUEUE_REQUEST,
3407fb4d8502Sjsg 		       mqd->cp_hqd_dequeue_request);
3408c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_RPTR,
3409fb4d8502Sjsg 		       mqd->cp_hqd_pq_rptr);
3410c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_LO,
3411fb4d8502Sjsg 		       mqd->cp_hqd_pq_wptr_lo);
3412c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_HI,
3413fb4d8502Sjsg 		       mqd->cp_hqd_pq_wptr_hi);
3414fb4d8502Sjsg 	}
3415fb4d8502Sjsg 
3416fb4d8502Sjsg 	/* set the pointer to the MQD */
3417c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_MQD_BASE_ADDR,
3418fb4d8502Sjsg 	       mqd->cp_mqd_base_addr_lo);
3419c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_MQD_BASE_ADDR_HI,
3420fb4d8502Sjsg 	       mqd->cp_mqd_base_addr_hi);
3421fb4d8502Sjsg 
3422fb4d8502Sjsg 	/* set MQD vmid to 0 */
3423c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_MQD_CONTROL,
3424fb4d8502Sjsg 	       mqd->cp_mqd_control);
3425fb4d8502Sjsg 
3426fb4d8502Sjsg 	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
3427c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_BASE,
3428fb4d8502Sjsg 	       mqd->cp_hqd_pq_base_lo);
3429c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_BASE_HI,
3430fb4d8502Sjsg 	       mqd->cp_hqd_pq_base_hi);
3431fb4d8502Sjsg 
3432fb4d8502Sjsg 	/* set up the HQD, this is similar to CP_RB0_CNTL */
3433c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_CONTROL,
3434fb4d8502Sjsg 	       mqd->cp_hqd_pq_control);
3435fb4d8502Sjsg 
3436fb4d8502Sjsg 	/* set the wb address whether it's enabled or not */
3437c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR,
3438fb4d8502Sjsg 				mqd->cp_hqd_pq_rptr_report_addr_lo);
3439c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI,
3440fb4d8502Sjsg 				mqd->cp_hqd_pq_rptr_report_addr_hi);
3441fb4d8502Sjsg 
3442fb4d8502Sjsg 	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */
3443c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR,
3444fb4d8502Sjsg 	       mqd->cp_hqd_pq_wptr_poll_addr_lo);
3445c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI,
3446fb4d8502Sjsg 	       mqd->cp_hqd_pq_wptr_poll_addr_hi);
3447fb4d8502Sjsg 
3448fb4d8502Sjsg 	/* enable the doorbell if requested */
3449fb4d8502Sjsg 	if (ring->use_doorbell) {
3450fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_LOWER,
3451c349dbc7Sjsg 					(adev->doorbell_index.kiq * 2) << 2);
34521c23f5d9Sjsg 		/* If GC has entered CGPG, ringing doorbell > first page
34531c23f5d9Sjsg 		 * doesn't wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to
34541c23f5d9Sjsg 		 * workaround this issue. And this change has to align with firmware
34551c23f5d9Sjsg 		 * update.
34561c23f5d9Sjsg 		 */
34571c23f5d9Sjsg 		if (check_if_enlarge_doorbell_range(adev))
34581c23f5d9Sjsg 			WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
34591c23f5d9Sjsg 					(adev->doorbell.size - 4));
34601c23f5d9Sjsg 		else
3461fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmCP_MEC_DOORBELL_RANGE_UPPER,
3462c349dbc7Sjsg 					(adev->doorbell_index.userqueue_end * 2) << 2);
3463fb4d8502Sjsg 	}
3464fb4d8502Sjsg 
3465c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL,
3466fb4d8502Sjsg 	       mqd->cp_hqd_pq_doorbell_control);
3467fb4d8502Sjsg 
3468fb4d8502Sjsg 	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */
3469c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_LO,
3470fb4d8502Sjsg 	       mqd->cp_hqd_pq_wptr_lo);
3471c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_HI,
3472fb4d8502Sjsg 	       mqd->cp_hqd_pq_wptr_hi);
3473fb4d8502Sjsg 
3474fb4d8502Sjsg 	/* set the vmid for the queue */
3475c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_VMID, mqd->cp_hqd_vmid);
3476fb4d8502Sjsg 
3477c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PERSISTENT_STATE,
3478fb4d8502Sjsg 	       mqd->cp_hqd_persistent_state);
3479fb4d8502Sjsg 
3480fb4d8502Sjsg 	/* activate the queue */
3481c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_ACTIVE,
3482fb4d8502Sjsg 	       mqd->cp_hqd_active);
3483fb4d8502Sjsg 
3484fb4d8502Sjsg 	if (ring->use_doorbell)
3485fb4d8502Sjsg 		WREG32_FIELD15(GC, 0, CP_PQ_STATUS, DOORBELL_ENABLE, 1);
3486fb4d8502Sjsg 
3487fb4d8502Sjsg 	return 0;
3488fb4d8502Sjsg }
3489fb4d8502Sjsg 
gfx_v9_0_kiq_fini_register(struct amdgpu_ring * ring)3490fb4d8502Sjsg static int gfx_v9_0_kiq_fini_register(struct amdgpu_ring *ring)
3491fb4d8502Sjsg {
3492fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3493fb4d8502Sjsg 	int j;
3494fb4d8502Sjsg 
3495fb4d8502Sjsg 	/* disable the queue if it's active */
3496fb4d8502Sjsg 	if (RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1) {
3497fb4d8502Sjsg 
3498c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 1);
3499fb4d8502Sjsg 
3500fb4d8502Sjsg 		for (j = 0; j < adev->usec_timeout; j++) {
3501fb4d8502Sjsg 			if (!(RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE) & 1))
3502fb4d8502Sjsg 				break;
3503fb4d8502Sjsg 			udelay(1);
3504fb4d8502Sjsg 		}
3505fb4d8502Sjsg 
3506fb4d8502Sjsg 		if (j == AMDGPU_MAX_USEC_TIMEOUT) {
3507fb4d8502Sjsg 			DRM_DEBUG("KIQ dequeue request failed.\n");
3508fb4d8502Sjsg 
3509fb4d8502Sjsg 			/* Manual disable if dequeue request times out */
3510c349dbc7Sjsg 			WREG32_SOC15_RLC(GC, 0, mmCP_HQD_ACTIVE, 0);
3511fb4d8502Sjsg 		}
3512fb4d8502Sjsg 
3513c349dbc7Sjsg 		WREG32_SOC15_RLC(GC, 0, mmCP_HQD_DEQUEUE_REQUEST,
3514fb4d8502Sjsg 		      0);
3515fb4d8502Sjsg 	}
3516fb4d8502Sjsg 
3517c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_IQ_TIMER, 0);
3518c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_IB_CONTROL, 0);
3519c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PERSISTENT_STATE, 0);
3520c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, 0x40000000);
3521c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, 0);
3522c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_RPTR, 0);
3523c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_HI, 0);
3524c349dbc7Sjsg 	WREG32_SOC15_RLC(GC, 0, mmCP_HQD_PQ_WPTR_LO, 0);
3525fb4d8502Sjsg 
3526fb4d8502Sjsg 	return 0;
3527fb4d8502Sjsg }
3528fb4d8502Sjsg 
gfx_v9_0_kiq_init_queue(struct amdgpu_ring * ring)3529fb4d8502Sjsg static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)
3530fb4d8502Sjsg {
3531fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3532fb4d8502Sjsg 	struct v9_mqd *mqd = ring->mqd_ptr;
35335ca02815Sjsg 	struct v9_mqd *tmp_mqd;
3534fb4d8502Sjsg 
3535fb4d8502Sjsg 	gfx_v9_0_kiq_setting(ring);
3536fb4d8502Sjsg 
35375ca02815Sjsg 	/* GPU could be in bad state during probe, driver trigger the reset
35385ca02815Sjsg 	 * after load the SMU, in this case , the mqd is not be initialized.
35395ca02815Sjsg 	 * driver need to re-init the mqd.
35405ca02815Sjsg 	 * check mqd->cp_hqd_pq_control since this value should not be 0
35415ca02815Sjsg 	 */
3542f005ef32Sjsg 	tmp_mqd = (struct v9_mqd *)adev->gfx.kiq[0].mqd_backup;
35435ca02815Sjsg 	if (amdgpu_in_reset(adev) && tmp_mqd->cp_hqd_pq_control){
35445ca02815Sjsg 		/* for GPU_RESET case , reset MQD to a clean status */
3545f005ef32Sjsg 		if (adev->gfx.kiq[0].mqd_backup)
3546f005ef32Sjsg 			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(struct v9_mqd_allocation));
3547fb4d8502Sjsg 
3548fb4d8502Sjsg 		/* reset ring buffer */
3549fb4d8502Sjsg 		ring->wptr = 0;
3550fb4d8502Sjsg 		amdgpu_ring_clear_ring(ring);
3551fb4d8502Sjsg 
3552fb4d8502Sjsg 		mutex_lock(&adev->srbm_mutex);
3553f005ef32Sjsg 		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);
3554fb4d8502Sjsg 		gfx_v9_0_kiq_init_register(ring);
3555f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, 0, 0);
3556fb4d8502Sjsg 		mutex_unlock(&adev->srbm_mutex);
3557fb4d8502Sjsg 	} else {
3558fb4d8502Sjsg 		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));
3559fb4d8502Sjsg 		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
3560fb4d8502Sjsg 		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
3561f005ef32Sjsg 		if (amdgpu_sriov_vf(adev) && adev->in_suspend)
3562f005ef32Sjsg 			amdgpu_ring_clear_ring(ring);
3563fb4d8502Sjsg 		mutex_lock(&adev->srbm_mutex);
3564f005ef32Sjsg 		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);
3565fb4d8502Sjsg 		gfx_v9_0_mqd_init(ring);
3566fb4d8502Sjsg 		gfx_v9_0_kiq_init_register(ring);
3567f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, 0, 0);
3568fb4d8502Sjsg 		mutex_unlock(&adev->srbm_mutex);
3569fb4d8502Sjsg 
3570f005ef32Sjsg 		if (adev->gfx.kiq[0].mqd_backup)
3571f005ef32Sjsg 			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(struct v9_mqd_allocation));
3572fb4d8502Sjsg 	}
3573fb4d8502Sjsg 
3574fb4d8502Sjsg 	return 0;
3575fb4d8502Sjsg }
3576fb4d8502Sjsg 
gfx_v9_0_kcq_init_queue(struct amdgpu_ring * ring)3577fb4d8502Sjsg static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring)
3578fb4d8502Sjsg {
3579fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
3580fb4d8502Sjsg 	struct v9_mqd *mqd = ring->mqd_ptr;
3581fb4d8502Sjsg 	int mqd_idx = ring - &adev->gfx.compute_ring[0];
35825ca02815Sjsg 	struct v9_mqd *tmp_mqd;
3583fb4d8502Sjsg 
35845ca02815Sjsg 	/* Same as above kiq init, driver need to re-init the mqd if mqd->cp_hqd_pq_control
35855ca02815Sjsg 	 * is not be initialized before
35865ca02815Sjsg 	 */
35875ca02815Sjsg 	tmp_mqd = (struct v9_mqd *)adev->gfx.mec.mqd_backup[mqd_idx];
35885ca02815Sjsg 
35895ca02815Sjsg 	if (!tmp_mqd->cp_hqd_pq_control ||
35905ca02815Sjsg 	    (!amdgpu_in_reset(adev) && !adev->in_suspend)) {
3591fb4d8502Sjsg 		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));
3592fb4d8502Sjsg 		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
3593fb4d8502Sjsg 		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
3594fb4d8502Sjsg 		mutex_lock(&adev->srbm_mutex);
3595f005ef32Sjsg 		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);
3596fb4d8502Sjsg 		gfx_v9_0_mqd_init(ring);
3597f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, 0, 0);
3598fb4d8502Sjsg 		mutex_unlock(&adev->srbm_mutex);
3599fb4d8502Sjsg 
3600fb4d8502Sjsg 		if (adev->gfx.mec.mqd_backup[mqd_idx])
3601fb4d8502Sjsg 			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct v9_mqd_allocation));
3602f005ef32Sjsg 	} else {
3603f005ef32Sjsg 		/* restore MQD to a clean status */
3604fb4d8502Sjsg 		if (adev->gfx.mec.mqd_backup[mqd_idx])
3605fb4d8502Sjsg 			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct v9_mqd_allocation));
3606fb4d8502Sjsg 		/* reset ring buffer */
3607fb4d8502Sjsg 		ring->wptr = 0;
36081bb76ff1Sjsg 		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0);
3609fb4d8502Sjsg 		amdgpu_ring_clear_ring(ring);
3610fb4d8502Sjsg 	}
3611fb4d8502Sjsg 
3612fb4d8502Sjsg 	return 0;
3613fb4d8502Sjsg }
3614fb4d8502Sjsg 
gfx_v9_0_kiq_resume(struct amdgpu_device * adev)3615fb4d8502Sjsg static int gfx_v9_0_kiq_resume(struct amdgpu_device *adev)
3616fb4d8502Sjsg {
3617c349dbc7Sjsg 	struct amdgpu_ring *ring;
3618c349dbc7Sjsg 	int r;
3619fb4d8502Sjsg 
3620f005ef32Sjsg 	ring = &adev->gfx.kiq[0].ring;
3621fb4d8502Sjsg 
3622fb4d8502Sjsg 	r = amdgpu_bo_reserve(ring->mqd_obj, false);
3623fb4d8502Sjsg 	if (unlikely(r != 0))
3624c349dbc7Sjsg 		return r;
3625fb4d8502Sjsg 
3626fb4d8502Sjsg 	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
36277e7270cfSjsg 	if (unlikely(r != 0)) {
36287e7270cfSjsg 		amdgpu_bo_unreserve(ring->mqd_obj);
3629c349dbc7Sjsg 		return r;
36307e7270cfSjsg 	}
3631c349dbc7Sjsg 
3632c349dbc7Sjsg 	gfx_v9_0_kiq_init_queue(ring);
3633fb4d8502Sjsg 	amdgpu_bo_kunmap(ring->mqd_obj);
3634fb4d8502Sjsg 	ring->mqd_ptr = NULL;
3635fb4d8502Sjsg 	amdgpu_bo_unreserve(ring->mqd_obj);
3636c349dbc7Sjsg 	return 0;
3637c349dbc7Sjsg }
3638c349dbc7Sjsg 
gfx_v9_0_kcq_resume(struct amdgpu_device * adev)3639c349dbc7Sjsg static int gfx_v9_0_kcq_resume(struct amdgpu_device *adev)
3640c349dbc7Sjsg {
3641c349dbc7Sjsg 	struct amdgpu_ring *ring = NULL;
3642c349dbc7Sjsg 	int r = 0, i;
3643c349dbc7Sjsg 
3644c349dbc7Sjsg 	gfx_v9_0_cp_compute_enable(adev, true);
3645fb4d8502Sjsg 
3646fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_compute_rings; i++) {
3647fb4d8502Sjsg 		ring = &adev->gfx.compute_ring[i];
3648fb4d8502Sjsg 
3649fb4d8502Sjsg 		r = amdgpu_bo_reserve(ring->mqd_obj, false);
3650fb4d8502Sjsg 		if (unlikely(r != 0))
3651fb4d8502Sjsg 			goto done;
3652fb4d8502Sjsg 		r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
3653fb4d8502Sjsg 		if (!r) {
3654fb4d8502Sjsg 			r = gfx_v9_0_kcq_init_queue(ring);
3655fb4d8502Sjsg 			amdgpu_bo_kunmap(ring->mqd_obj);
3656fb4d8502Sjsg 			ring->mqd_ptr = NULL;
3657fb4d8502Sjsg 		}
3658fb4d8502Sjsg 		amdgpu_bo_unreserve(ring->mqd_obj);
3659fb4d8502Sjsg 		if (r)
3660fb4d8502Sjsg 			goto done;
3661fb4d8502Sjsg 	}
3662fb4d8502Sjsg 
3663f005ef32Sjsg 	r = amdgpu_gfx_enable_kcq(adev, 0);
3664fb4d8502Sjsg done:
3665fb4d8502Sjsg 	return r;
3666fb4d8502Sjsg }
3667fb4d8502Sjsg 
gfx_v9_0_cp_resume(struct amdgpu_device * adev)3668fb4d8502Sjsg static int gfx_v9_0_cp_resume(struct amdgpu_device *adev)
3669fb4d8502Sjsg {
3670fb4d8502Sjsg 	int r, i;
3671fb4d8502Sjsg 	struct amdgpu_ring *ring;
3672fb4d8502Sjsg 
3673fb4d8502Sjsg 	if (!(adev->flags & AMD_IS_APU))
3674fb4d8502Sjsg 		gfx_v9_0_enable_gui_idle_interrupt(adev, false);
3675fb4d8502Sjsg 
3676fb4d8502Sjsg 	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
36775ca02815Sjsg 		if (adev->gfx.num_gfx_rings) {
3678fb4d8502Sjsg 			/* legacy firmware loading */
3679fb4d8502Sjsg 			r = gfx_v9_0_cp_gfx_load_microcode(adev);
3680fb4d8502Sjsg 			if (r)
3681fb4d8502Sjsg 				return r;
3682c349dbc7Sjsg 		}
3683fb4d8502Sjsg 
3684fb4d8502Sjsg 		r = gfx_v9_0_cp_compute_load_microcode(adev);
3685fb4d8502Sjsg 		if (r)
3686fb4d8502Sjsg 			return r;
3687fb4d8502Sjsg 	}
3688fb4d8502Sjsg 
3689fb4d8502Sjsg 	r = gfx_v9_0_kiq_resume(adev);
3690fb4d8502Sjsg 	if (r)
3691fb4d8502Sjsg 		return r;
3692fb4d8502Sjsg 
36935ca02815Sjsg 	if (adev->gfx.num_gfx_rings) {
3694c349dbc7Sjsg 		r = gfx_v9_0_cp_gfx_resume(adev);
3695c349dbc7Sjsg 		if (r)
3696fb4d8502Sjsg 			return r;
3697fb4d8502Sjsg 	}
3698fb4d8502Sjsg 
3699c349dbc7Sjsg 	r = gfx_v9_0_kcq_resume(adev);
3700fb4d8502Sjsg 	if (r)
3701c349dbc7Sjsg 		return r;
3702c349dbc7Sjsg 
37035ca02815Sjsg 	if (adev->gfx.num_gfx_rings) {
3704c349dbc7Sjsg 		ring = &adev->gfx.gfx_ring[0];
3705c349dbc7Sjsg 		r = amdgpu_ring_test_helper(ring);
3706c349dbc7Sjsg 		if (r)
3707c349dbc7Sjsg 			return r;
3708c349dbc7Sjsg 	}
3709fb4d8502Sjsg 
3710fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_compute_rings; i++) {
3711fb4d8502Sjsg 		ring = &adev->gfx.compute_ring[i];
3712c349dbc7Sjsg 		amdgpu_ring_test_helper(ring);
3713fb4d8502Sjsg 	}
3714fb4d8502Sjsg 
3715fb4d8502Sjsg 	gfx_v9_0_enable_gui_idle_interrupt(adev, true);
3716fb4d8502Sjsg 
3717fb4d8502Sjsg 	return 0;
3718fb4d8502Sjsg }
3719fb4d8502Sjsg 
gfx_v9_0_init_tcp_config(struct amdgpu_device * adev)3720c349dbc7Sjsg static void gfx_v9_0_init_tcp_config(struct amdgpu_device *adev)
3721c349dbc7Sjsg {
3722c349dbc7Sjsg 	u32 tmp;
3723c349dbc7Sjsg 
37241bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 1) &&
37251bb76ff1Sjsg 	    adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 2))
3726c349dbc7Sjsg 		return;
3727c349dbc7Sjsg 
3728c349dbc7Sjsg 	tmp = RREG32_SOC15(GC, 0, mmTCP_ADDR_CONFIG);
3729c349dbc7Sjsg 	tmp = REG_SET_FIELD(tmp, TCP_ADDR_CONFIG, ENABLE64KHASH,
3730c349dbc7Sjsg 				adev->df.hash_status.hash_64k);
3731c349dbc7Sjsg 	tmp = REG_SET_FIELD(tmp, TCP_ADDR_CONFIG, ENABLE2MHASH,
3732c349dbc7Sjsg 				adev->df.hash_status.hash_2m);
3733c349dbc7Sjsg 	tmp = REG_SET_FIELD(tmp, TCP_ADDR_CONFIG, ENABLE1GHASH,
3734c349dbc7Sjsg 				adev->df.hash_status.hash_1g);
3735c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmTCP_ADDR_CONFIG, tmp);
3736c349dbc7Sjsg }
3737c349dbc7Sjsg 
gfx_v9_0_cp_enable(struct amdgpu_device * adev,bool enable)3738fb4d8502Sjsg static void gfx_v9_0_cp_enable(struct amdgpu_device *adev, bool enable)
3739fb4d8502Sjsg {
37405ca02815Sjsg 	if (adev->gfx.num_gfx_rings)
3741fb4d8502Sjsg 		gfx_v9_0_cp_gfx_enable(adev, enable);
3742fb4d8502Sjsg 	gfx_v9_0_cp_compute_enable(adev, enable);
3743fb4d8502Sjsg }
3744fb4d8502Sjsg 
gfx_v9_0_hw_init(void * handle)3745fb4d8502Sjsg static int gfx_v9_0_hw_init(void *handle)
3746fb4d8502Sjsg {
3747fb4d8502Sjsg 	int r;
3748fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3749fb4d8502Sjsg 
3750c349dbc7Sjsg 	if (!amdgpu_sriov_vf(adev))
3751fb4d8502Sjsg 		gfx_v9_0_init_golden_registers(adev);
3752fb4d8502Sjsg 
3753c349dbc7Sjsg 	gfx_v9_0_constants_init(adev);
3754fb4d8502Sjsg 
3755c349dbc7Sjsg 	gfx_v9_0_init_tcp_config(adev);
3756fb4d8502Sjsg 
3757c349dbc7Sjsg 	r = adev->gfx.rlc.funcs->resume(adev);
3758fb4d8502Sjsg 	if (r)
3759fb4d8502Sjsg 		return r;
3760fb4d8502Sjsg 
3761fb4d8502Sjsg 	r = gfx_v9_0_cp_resume(adev);
3762fb4d8502Sjsg 	if (r)
3763fb4d8502Sjsg 		return r;
3764fb4d8502Sjsg 
37651bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2))
37665ca02815Sjsg 		gfx_v9_4_2_set_power_brake_sequence(adev);
37675ca02815Sjsg 
3768fb4d8502Sjsg 	return r;
3769fb4d8502Sjsg }
3770fb4d8502Sjsg 
gfx_v9_0_hw_fini(void * handle)3771fb4d8502Sjsg static int gfx_v9_0_hw_fini(void *handle)
3772fb4d8502Sjsg {
3773fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3774fb4d8502Sjsg 
3775de4b31ccSjsg 	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
3776c349dbc7Sjsg 		amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
3777fb4d8502Sjsg 	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
3778fb4d8502Sjsg 	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
3779fb4d8502Sjsg 
3780c349dbc7Sjsg 	/* DF freeze and kcq disable will fail */
3781c349dbc7Sjsg 	if (!amdgpu_ras_intr_triggered())
3782fb4d8502Sjsg 		/* disable KCQ to avoid CPC touch memory not valid anymore */
3783f005ef32Sjsg 		amdgpu_gfx_disable_kcq(adev, 0);
3784fb4d8502Sjsg 
3785fb4d8502Sjsg 	if (amdgpu_sriov_vf(adev)) {
3786fb4d8502Sjsg 		gfx_v9_0_cp_gfx_enable(adev, false);
3787fb4d8502Sjsg 		/* must disable polling for SRIOV when hw finished, otherwise
3788fb4d8502Sjsg 		 * CPC engine may still keep fetching WB address which is already
3789fb4d8502Sjsg 		 * invalid after sw finished and trigger DMAR reading error in
3790fb4d8502Sjsg 		 * hypervisor side.
3791fb4d8502Sjsg 		 */
3792fb4d8502Sjsg 		WREG32_FIELD15(GC, 0, CP_PQ_WPTR_POLL_CNTL, EN, 0);
3793fb4d8502Sjsg 		return 0;
3794fb4d8502Sjsg 	}
3795fb4d8502Sjsg 
3796fb4d8502Sjsg 	/* Use deinitialize sequence from CAIL when unbinding device from driver,
3797fb4d8502Sjsg 	 * otherwise KIQ is hanging when binding back
3798fb4d8502Sjsg 	 */
3799ad8b1aafSjsg 	if (!amdgpu_in_reset(adev) && !adev->in_suspend) {
3800fb4d8502Sjsg 		mutex_lock(&adev->srbm_mutex);
3801f005ef32Sjsg 		soc15_grbm_select(adev, adev->gfx.kiq[0].ring.me,
3802f005ef32Sjsg 				adev->gfx.kiq[0].ring.pipe,
3803f005ef32Sjsg 				adev->gfx.kiq[0].ring.queue, 0, 0);
3804f005ef32Sjsg 		gfx_v9_0_kiq_fini_register(&adev->gfx.kiq[0].ring);
3805f005ef32Sjsg 		soc15_grbm_select(adev, 0, 0, 0, 0, 0);
3806fb4d8502Sjsg 		mutex_unlock(&adev->srbm_mutex);
3807fb4d8502Sjsg 	}
3808fb4d8502Sjsg 
3809fb4d8502Sjsg 	gfx_v9_0_cp_enable(adev, false);
3810fb4d8502Sjsg 
38111bb76ff1Sjsg 	/* Skip stopping RLC with A+A reset or when RLC controls GFX clock */
38121bb76ff1Sjsg 	if ((adev->gmc.xgmi.connected_to_cpu && amdgpu_in_reset(adev)) ||
38131bb76ff1Sjsg 	    (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(9, 4, 2))) {
38141bb76ff1Sjsg 		dev_dbg(adev->dev, "Skipping RLC halt\n");
38155ca02815Sjsg 		return 0;
38165ca02815Sjsg 	}
38175ca02815Sjsg 
38185ca02815Sjsg 	adev->gfx.rlc.funcs->stop(adev);
3819fb4d8502Sjsg 	return 0;
3820fb4d8502Sjsg }
3821fb4d8502Sjsg 
gfx_v9_0_suspend(void * handle)3822fb4d8502Sjsg static int gfx_v9_0_suspend(void *handle)
3823fb4d8502Sjsg {
3824c349dbc7Sjsg 	return gfx_v9_0_hw_fini(handle);
3825fb4d8502Sjsg }
3826fb4d8502Sjsg 
gfx_v9_0_resume(void * handle)3827fb4d8502Sjsg static int gfx_v9_0_resume(void *handle)
3828fb4d8502Sjsg {
3829c349dbc7Sjsg 	return gfx_v9_0_hw_init(handle);
3830fb4d8502Sjsg }
3831fb4d8502Sjsg 
gfx_v9_0_is_idle(void * handle)3832fb4d8502Sjsg static bool gfx_v9_0_is_idle(void *handle)
3833fb4d8502Sjsg {
3834fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3835fb4d8502Sjsg 
3836fb4d8502Sjsg 	if (REG_GET_FIELD(RREG32_SOC15(GC, 0, mmGRBM_STATUS),
3837fb4d8502Sjsg 				GRBM_STATUS, GUI_ACTIVE))
3838fb4d8502Sjsg 		return false;
3839fb4d8502Sjsg 	else
3840fb4d8502Sjsg 		return true;
3841fb4d8502Sjsg }
3842fb4d8502Sjsg 
gfx_v9_0_wait_for_idle(void * handle)3843fb4d8502Sjsg static int gfx_v9_0_wait_for_idle(void *handle)
3844fb4d8502Sjsg {
3845fb4d8502Sjsg 	unsigned i;
3846fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3847fb4d8502Sjsg 
3848fb4d8502Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
3849fb4d8502Sjsg 		if (gfx_v9_0_is_idle(handle))
3850fb4d8502Sjsg 			return 0;
3851fb4d8502Sjsg 		udelay(1);
3852fb4d8502Sjsg 	}
3853fb4d8502Sjsg 	return -ETIMEDOUT;
3854fb4d8502Sjsg }
3855fb4d8502Sjsg 
gfx_v9_0_soft_reset(void * handle)3856fb4d8502Sjsg static int gfx_v9_0_soft_reset(void *handle)
3857fb4d8502Sjsg {
3858fb4d8502Sjsg 	u32 grbm_soft_reset = 0;
3859fb4d8502Sjsg 	u32 tmp;
3860fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3861fb4d8502Sjsg 
3862fb4d8502Sjsg 	/* GRBM_STATUS */
3863fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS);
3864fb4d8502Sjsg 	if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK |
3865fb4d8502Sjsg 		   GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK |
3866fb4d8502Sjsg 		   GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK |
3867fb4d8502Sjsg 		   GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK |
3868fb4d8502Sjsg 		   GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK |
3869fb4d8502Sjsg 		   GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK)) {
3870fb4d8502Sjsg 		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
3871fb4d8502Sjsg 						GRBM_SOFT_RESET, SOFT_RESET_CP, 1);
3872fb4d8502Sjsg 		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
3873fb4d8502Sjsg 						GRBM_SOFT_RESET, SOFT_RESET_GFX, 1);
3874fb4d8502Sjsg 	}
3875fb4d8502Sjsg 
3876fb4d8502Sjsg 	if (tmp & (GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) {
3877fb4d8502Sjsg 		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
3878fb4d8502Sjsg 						GRBM_SOFT_RESET, SOFT_RESET_CP, 1);
3879fb4d8502Sjsg 	}
3880fb4d8502Sjsg 
3881fb4d8502Sjsg 	/* GRBM_STATUS2 */
3882fb4d8502Sjsg 	tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS2);
3883fb4d8502Sjsg 	if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY))
3884fb4d8502Sjsg 		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
3885fb4d8502Sjsg 						GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
3886fb4d8502Sjsg 
3887fb4d8502Sjsg 
3888fb4d8502Sjsg 	if (grbm_soft_reset) {
3889fb4d8502Sjsg 		/* stop the rlc */
3890c349dbc7Sjsg 		adev->gfx.rlc.funcs->stop(adev);
3891fb4d8502Sjsg 
38925ca02815Sjsg 		if (adev->gfx.num_gfx_rings)
3893fb4d8502Sjsg 			/* Disable GFX parsing/prefetching */
3894fb4d8502Sjsg 			gfx_v9_0_cp_gfx_enable(adev, false);
3895fb4d8502Sjsg 
3896fb4d8502Sjsg 		/* Disable MEC parsing/prefetching */
3897fb4d8502Sjsg 		gfx_v9_0_cp_compute_enable(adev, false);
3898fb4d8502Sjsg 
3899fb4d8502Sjsg 		if (grbm_soft_reset) {
3900fb4d8502Sjsg 			tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
3901fb4d8502Sjsg 			tmp |= grbm_soft_reset;
3902fb4d8502Sjsg 			dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3903fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
3904fb4d8502Sjsg 			tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
3905fb4d8502Sjsg 
3906fb4d8502Sjsg 			udelay(50);
3907fb4d8502Sjsg 
3908fb4d8502Sjsg 			tmp &= ~grbm_soft_reset;
3909fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
3910fb4d8502Sjsg 			tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
3911fb4d8502Sjsg 		}
3912fb4d8502Sjsg 
3913fb4d8502Sjsg 		/* Wait a little for things to settle down */
3914fb4d8502Sjsg 		udelay(50);
3915fb4d8502Sjsg 	}
3916fb4d8502Sjsg 	return 0;
3917fb4d8502Sjsg }
3918fb4d8502Sjsg 
gfx_v9_0_kiq_read_clock(struct amdgpu_device * adev)3919c349dbc7Sjsg static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)
3920c349dbc7Sjsg {
3921c349dbc7Sjsg 	signed long r, cnt = 0;
3922c349dbc7Sjsg 	unsigned long flags;
3923ad8b1aafSjsg 	uint32_t seq, reg_val_offs = 0;
3924ad8b1aafSjsg 	uint64_t value = 0;
3925f005ef32Sjsg 	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
3926c349dbc7Sjsg 	struct amdgpu_ring *ring = &kiq->ring;
3927c349dbc7Sjsg 
3928c349dbc7Sjsg 	BUG_ON(!ring->funcs->emit_rreg);
3929c349dbc7Sjsg 
3930c349dbc7Sjsg 	spin_lock_irqsave(&kiq->ring_lock, flags);
3931ad8b1aafSjsg 	if (amdgpu_device_wb_get(adev, &reg_val_offs)) {
3932ad8b1aafSjsg 		pr_err("critical bug! too many kiq readers\n");
3933ad8b1aafSjsg 		goto failed_unlock;
3934ad8b1aafSjsg 	}
3935c349dbc7Sjsg 	amdgpu_ring_alloc(ring, 32);
3936c349dbc7Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));
3937c349dbc7Sjsg 	amdgpu_ring_write(ring, 9 |	/* src: register*/
3938c349dbc7Sjsg 				(5 << 8) |	/* dst: memory */
3939c349dbc7Sjsg 				(1 << 16) |	/* count sel */
3940c349dbc7Sjsg 				(1 << 20));	/* write confirm */
3941c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
3942c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
3943c349dbc7Sjsg 	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr +
3944ad8b1aafSjsg 				reg_val_offs * 4));
3945c349dbc7Sjsg 	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr +
3946ad8b1aafSjsg 				reg_val_offs * 4));
3947ad8b1aafSjsg 	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);
3948ad8b1aafSjsg 	if (r)
3949ad8b1aafSjsg 		goto failed_undo;
3950ad8b1aafSjsg 
3951c349dbc7Sjsg 	amdgpu_ring_commit(ring);
3952c349dbc7Sjsg 	spin_unlock_irqrestore(&kiq->ring_lock, flags);
3953c349dbc7Sjsg 
3954c349dbc7Sjsg 	r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
3955c349dbc7Sjsg 
3956c349dbc7Sjsg 	/* don't wait anymore for gpu reset case because this way may
3957c349dbc7Sjsg 	 * block gpu_recover() routine forever, e.g. this virt_kiq_rreg
3958c349dbc7Sjsg 	 * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will
3959c349dbc7Sjsg 	 * never return if we keep waiting in virt_kiq_rreg, which cause
3960c349dbc7Sjsg 	 * gpu_recover() hang there.
3961c349dbc7Sjsg 	 *
3962c349dbc7Sjsg 	 * also don't wait anymore for IRQ context
3963c349dbc7Sjsg 	 * */
39645ca02815Sjsg 	if (r < 1 && (amdgpu_in_reset(adev)))
3965c349dbc7Sjsg 		goto failed_kiq_read;
3966c349dbc7Sjsg 
3967c349dbc7Sjsg 	might_sleep();
3968c349dbc7Sjsg 	while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
3969c349dbc7Sjsg 		drm_msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
3970c349dbc7Sjsg 		r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
3971c349dbc7Sjsg 	}
3972c349dbc7Sjsg 
3973c349dbc7Sjsg 	if (cnt > MAX_KIQ_REG_TRY)
3974c349dbc7Sjsg 		goto failed_kiq_read;
3975c349dbc7Sjsg 
3976ad8b1aafSjsg 	mb();
3977ad8b1aafSjsg 	value = (uint64_t)adev->wb.wb[reg_val_offs] |
3978ad8b1aafSjsg 		(uint64_t)adev->wb.wb[reg_val_offs + 1 ] << 32ULL;
3979ad8b1aafSjsg 	amdgpu_device_wb_free(adev, reg_val_offs);
3980ad8b1aafSjsg 	return value;
3981c349dbc7Sjsg 
3982ad8b1aafSjsg failed_undo:
3983ad8b1aafSjsg 	amdgpu_ring_undo(ring);
3984ad8b1aafSjsg failed_unlock:
3985ad8b1aafSjsg 	spin_unlock_irqrestore(&kiq->ring_lock, flags);
3986c349dbc7Sjsg failed_kiq_read:
3987ad8b1aafSjsg 	if (reg_val_offs)
3988ad8b1aafSjsg 		amdgpu_device_wb_free(adev, reg_val_offs);
3989c349dbc7Sjsg 	pr_err("failed to read gpu clock\n");
3990c349dbc7Sjsg 	return ~0;
3991c349dbc7Sjsg }
3992c349dbc7Sjsg 
gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device * adev)3993fb4d8502Sjsg static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
3994fb4d8502Sjsg {
3995c953f924Sjsg 	uint64_t clock, clock_lo, clock_hi, hi_check;
3996fb4d8502Sjsg 
39971bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
39981bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
3999c953f924Sjsg 		preempt_disable();
4000c953f924Sjsg 		clock_hi = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_Renoir);
4001c953f924Sjsg 		clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_Renoir);
4002c953f924Sjsg 		hi_check = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_Renoir);
4003c953f924Sjsg 		/* The SMUIO TSC clock frequency is 100MHz, which sets 32-bit carry over
4004c953f924Sjsg 		 * roughly every 42 seconds.
4005c953f924Sjsg 		 */
4006c953f924Sjsg 		if (hi_check != clock_hi) {
4007c953f924Sjsg 			clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_Renoir);
4008c953f924Sjsg 			clock_hi = hi_check;
4009c953f924Sjsg 		}
4010c953f924Sjsg 		preempt_enable();
4011c953f924Sjsg 		clock = clock_lo | (clock_hi << 32ULL);
4012c953f924Sjsg 		break;
4013c953f924Sjsg 	default:
4014c349dbc7Sjsg 		amdgpu_gfx_off_ctrl(adev, false);
4015fb4d8502Sjsg 		mutex_lock(&adev->gfx.gpu_clock_mutex);
40161bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 0, 1) && amdgpu_sriov_runtime(adev)) {
4017c349dbc7Sjsg 			clock = gfx_v9_0_kiq_read_clock(adev);
4018c349dbc7Sjsg 		} else {
4019fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
4020fb4d8502Sjsg 			clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) |
4021fb4d8502Sjsg 				((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
4022c349dbc7Sjsg 		}
4023fb4d8502Sjsg 		mutex_unlock(&adev->gfx.gpu_clock_mutex);
4024c349dbc7Sjsg 		amdgpu_gfx_off_ctrl(adev, true);
4025c953f924Sjsg 		break;
4026c953f924Sjsg 	}
4027fb4d8502Sjsg 	return clock;
4028fb4d8502Sjsg }
4029fb4d8502Sjsg 
gfx_v9_0_ring_emit_gds_switch(struct amdgpu_ring * ring,uint32_t vmid,uint32_t gds_base,uint32_t gds_size,uint32_t gws_base,uint32_t gws_size,uint32_t oa_base,uint32_t oa_size)4030fb4d8502Sjsg static void gfx_v9_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
4031fb4d8502Sjsg 					  uint32_t vmid,
4032fb4d8502Sjsg 					  uint32_t gds_base, uint32_t gds_size,
4033fb4d8502Sjsg 					  uint32_t gws_base, uint32_t gws_size,
4034fb4d8502Sjsg 					  uint32_t oa_base, uint32_t oa_size)
4035fb4d8502Sjsg {
4036fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
4037fb4d8502Sjsg 
4038fb4d8502Sjsg 	/* GDS Base */
4039fb4d8502Sjsg 	gfx_v9_0_write_data_to_reg(ring, 0, false,
4040fb4d8502Sjsg 				   SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE) + 2 * vmid,
4041fb4d8502Sjsg 				   gds_base);
4042fb4d8502Sjsg 
4043fb4d8502Sjsg 	/* GDS Size */
4044fb4d8502Sjsg 	gfx_v9_0_write_data_to_reg(ring, 0, false,
4045fb4d8502Sjsg 				   SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE) + 2 * vmid,
4046fb4d8502Sjsg 				   gds_size);
4047fb4d8502Sjsg 
4048fb4d8502Sjsg 	/* GWS */
4049fb4d8502Sjsg 	gfx_v9_0_write_data_to_reg(ring, 0, false,
4050fb4d8502Sjsg 				   SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID0) + vmid,
4051fb4d8502Sjsg 				   gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
4052fb4d8502Sjsg 
4053fb4d8502Sjsg 	/* OA */
4054fb4d8502Sjsg 	gfx_v9_0_write_data_to_reg(ring, 0, false,
4055fb4d8502Sjsg 				   SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID0) + vmid,
4056fb4d8502Sjsg 				   (1 << (oa_size + oa_base)) - (1 << oa_base));
4057fb4d8502Sjsg }
4058fb4d8502Sjsg 
4059c349dbc7Sjsg static const u32 vgpr_init_compute_shader[] =
4060c349dbc7Sjsg {
4061c349dbc7Sjsg 	0xb07c0000, 0xbe8000ff,
4062c349dbc7Sjsg 	0x000000f8, 0xbf110800,
4063c349dbc7Sjsg 	0x7e000280, 0x7e020280,
4064c349dbc7Sjsg 	0x7e040280, 0x7e060280,
4065c349dbc7Sjsg 	0x7e080280, 0x7e0a0280,
4066c349dbc7Sjsg 	0x7e0c0280, 0x7e0e0280,
4067c349dbc7Sjsg 	0x80808800, 0xbe803200,
4068c349dbc7Sjsg 	0xbf84fff5, 0xbf9c0000,
4069c349dbc7Sjsg 	0xd28c0001, 0x0001007f,
4070c349dbc7Sjsg 	0xd28d0001, 0x0002027e,
4071c349dbc7Sjsg 	0x10020288, 0xb8810904,
4072c349dbc7Sjsg 	0xb7814000, 0xd1196a01,
4073c349dbc7Sjsg 	0x00000301, 0xbe800087,
4074c349dbc7Sjsg 	0xbefc00c1, 0xd89c4000,
4075c349dbc7Sjsg 	0x00020201, 0xd89cc080,
4076c349dbc7Sjsg 	0x00040401, 0x320202ff,
4077c349dbc7Sjsg 	0x00000800, 0x80808100,
4078c349dbc7Sjsg 	0xbf84fff8, 0x7e020280,
4079c349dbc7Sjsg 	0xbf810000, 0x00000000,
4080c349dbc7Sjsg };
4081c349dbc7Sjsg 
4082c349dbc7Sjsg static const u32 sgpr_init_compute_shader[] =
4083c349dbc7Sjsg {
4084c349dbc7Sjsg 	0xb07c0000, 0xbe8000ff,
4085c349dbc7Sjsg 	0x0000005f, 0xbee50080,
4086c349dbc7Sjsg 	0xbe812c65, 0xbe822c65,
4087c349dbc7Sjsg 	0xbe832c65, 0xbe842c65,
4088c349dbc7Sjsg 	0xbe852c65, 0xb77c0005,
4089c349dbc7Sjsg 	0x80808500, 0xbf84fff8,
4090c349dbc7Sjsg 	0xbe800080, 0xbf810000,
4091c349dbc7Sjsg };
4092c349dbc7Sjsg 
4093c349dbc7Sjsg static const u32 vgpr_init_compute_shader_arcturus[] = {
4094c349dbc7Sjsg 	0xd3d94000, 0x18000080, 0xd3d94001, 0x18000080, 0xd3d94002, 0x18000080,
4095c349dbc7Sjsg 	0xd3d94003, 0x18000080, 0xd3d94004, 0x18000080, 0xd3d94005, 0x18000080,
4096c349dbc7Sjsg 	0xd3d94006, 0x18000080, 0xd3d94007, 0x18000080, 0xd3d94008, 0x18000080,
4097c349dbc7Sjsg 	0xd3d94009, 0x18000080, 0xd3d9400a, 0x18000080, 0xd3d9400b, 0x18000080,
4098c349dbc7Sjsg 	0xd3d9400c, 0x18000080, 0xd3d9400d, 0x18000080, 0xd3d9400e, 0x18000080,
4099c349dbc7Sjsg 	0xd3d9400f, 0x18000080, 0xd3d94010, 0x18000080, 0xd3d94011, 0x18000080,
4100c349dbc7Sjsg 	0xd3d94012, 0x18000080, 0xd3d94013, 0x18000080, 0xd3d94014, 0x18000080,
4101c349dbc7Sjsg 	0xd3d94015, 0x18000080, 0xd3d94016, 0x18000080, 0xd3d94017, 0x18000080,
4102c349dbc7Sjsg 	0xd3d94018, 0x18000080, 0xd3d94019, 0x18000080, 0xd3d9401a, 0x18000080,
4103c349dbc7Sjsg 	0xd3d9401b, 0x18000080, 0xd3d9401c, 0x18000080, 0xd3d9401d, 0x18000080,
4104c349dbc7Sjsg 	0xd3d9401e, 0x18000080, 0xd3d9401f, 0x18000080, 0xd3d94020, 0x18000080,
4105c349dbc7Sjsg 	0xd3d94021, 0x18000080, 0xd3d94022, 0x18000080, 0xd3d94023, 0x18000080,
4106c349dbc7Sjsg 	0xd3d94024, 0x18000080, 0xd3d94025, 0x18000080, 0xd3d94026, 0x18000080,
4107c349dbc7Sjsg 	0xd3d94027, 0x18000080, 0xd3d94028, 0x18000080, 0xd3d94029, 0x18000080,
4108c349dbc7Sjsg 	0xd3d9402a, 0x18000080, 0xd3d9402b, 0x18000080, 0xd3d9402c, 0x18000080,
4109c349dbc7Sjsg 	0xd3d9402d, 0x18000080, 0xd3d9402e, 0x18000080, 0xd3d9402f, 0x18000080,
4110c349dbc7Sjsg 	0xd3d94030, 0x18000080, 0xd3d94031, 0x18000080, 0xd3d94032, 0x18000080,
4111c349dbc7Sjsg 	0xd3d94033, 0x18000080, 0xd3d94034, 0x18000080, 0xd3d94035, 0x18000080,
4112c349dbc7Sjsg 	0xd3d94036, 0x18000080, 0xd3d94037, 0x18000080, 0xd3d94038, 0x18000080,
4113c349dbc7Sjsg 	0xd3d94039, 0x18000080, 0xd3d9403a, 0x18000080, 0xd3d9403b, 0x18000080,
4114c349dbc7Sjsg 	0xd3d9403c, 0x18000080, 0xd3d9403d, 0x18000080, 0xd3d9403e, 0x18000080,
4115c349dbc7Sjsg 	0xd3d9403f, 0x18000080, 0xd3d94040, 0x18000080, 0xd3d94041, 0x18000080,
4116c349dbc7Sjsg 	0xd3d94042, 0x18000080, 0xd3d94043, 0x18000080, 0xd3d94044, 0x18000080,
4117c349dbc7Sjsg 	0xd3d94045, 0x18000080, 0xd3d94046, 0x18000080, 0xd3d94047, 0x18000080,
4118c349dbc7Sjsg 	0xd3d94048, 0x18000080, 0xd3d94049, 0x18000080, 0xd3d9404a, 0x18000080,
4119c349dbc7Sjsg 	0xd3d9404b, 0x18000080, 0xd3d9404c, 0x18000080, 0xd3d9404d, 0x18000080,
4120c349dbc7Sjsg 	0xd3d9404e, 0x18000080, 0xd3d9404f, 0x18000080, 0xd3d94050, 0x18000080,
4121c349dbc7Sjsg 	0xd3d94051, 0x18000080, 0xd3d94052, 0x18000080, 0xd3d94053, 0x18000080,
4122c349dbc7Sjsg 	0xd3d94054, 0x18000080, 0xd3d94055, 0x18000080, 0xd3d94056, 0x18000080,
4123c349dbc7Sjsg 	0xd3d94057, 0x18000080, 0xd3d94058, 0x18000080, 0xd3d94059, 0x18000080,
4124c349dbc7Sjsg 	0xd3d9405a, 0x18000080, 0xd3d9405b, 0x18000080, 0xd3d9405c, 0x18000080,
4125c349dbc7Sjsg 	0xd3d9405d, 0x18000080, 0xd3d9405e, 0x18000080, 0xd3d9405f, 0x18000080,
4126c349dbc7Sjsg 	0xd3d94060, 0x18000080, 0xd3d94061, 0x18000080, 0xd3d94062, 0x18000080,
4127c349dbc7Sjsg 	0xd3d94063, 0x18000080, 0xd3d94064, 0x18000080, 0xd3d94065, 0x18000080,
4128c349dbc7Sjsg 	0xd3d94066, 0x18000080, 0xd3d94067, 0x18000080, 0xd3d94068, 0x18000080,
4129c349dbc7Sjsg 	0xd3d94069, 0x18000080, 0xd3d9406a, 0x18000080, 0xd3d9406b, 0x18000080,
4130c349dbc7Sjsg 	0xd3d9406c, 0x18000080, 0xd3d9406d, 0x18000080, 0xd3d9406e, 0x18000080,
4131c349dbc7Sjsg 	0xd3d9406f, 0x18000080, 0xd3d94070, 0x18000080, 0xd3d94071, 0x18000080,
4132c349dbc7Sjsg 	0xd3d94072, 0x18000080, 0xd3d94073, 0x18000080, 0xd3d94074, 0x18000080,
4133c349dbc7Sjsg 	0xd3d94075, 0x18000080, 0xd3d94076, 0x18000080, 0xd3d94077, 0x18000080,
4134c349dbc7Sjsg 	0xd3d94078, 0x18000080, 0xd3d94079, 0x18000080, 0xd3d9407a, 0x18000080,
4135c349dbc7Sjsg 	0xd3d9407b, 0x18000080, 0xd3d9407c, 0x18000080, 0xd3d9407d, 0x18000080,
4136c349dbc7Sjsg 	0xd3d9407e, 0x18000080, 0xd3d9407f, 0x18000080, 0xd3d94080, 0x18000080,
4137c349dbc7Sjsg 	0xd3d94081, 0x18000080, 0xd3d94082, 0x18000080, 0xd3d94083, 0x18000080,
4138c349dbc7Sjsg 	0xd3d94084, 0x18000080, 0xd3d94085, 0x18000080, 0xd3d94086, 0x18000080,
4139c349dbc7Sjsg 	0xd3d94087, 0x18000080, 0xd3d94088, 0x18000080, 0xd3d94089, 0x18000080,
4140c349dbc7Sjsg 	0xd3d9408a, 0x18000080, 0xd3d9408b, 0x18000080, 0xd3d9408c, 0x18000080,
4141c349dbc7Sjsg 	0xd3d9408d, 0x18000080, 0xd3d9408e, 0x18000080, 0xd3d9408f, 0x18000080,
4142c349dbc7Sjsg 	0xd3d94090, 0x18000080, 0xd3d94091, 0x18000080, 0xd3d94092, 0x18000080,
4143c349dbc7Sjsg 	0xd3d94093, 0x18000080, 0xd3d94094, 0x18000080, 0xd3d94095, 0x18000080,
4144c349dbc7Sjsg 	0xd3d94096, 0x18000080, 0xd3d94097, 0x18000080, 0xd3d94098, 0x18000080,
4145c349dbc7Sjsg 	0xd3d94099, 0x18000080, 0xd3d9409a, 0x18000080, 0xd3d9409b, 0x18000080,
4146c349dbc7Sjsg 	0xd3d9409c, 0x18000080, 0xd3d9409d, 0x18000080, 0xd3d9409e, 0x18000080,
4147c349dbc7Sjsg 	0xd3d9409f, 0x18000080, 0xd3d940a0, 0x18000080, 0xd3d940a1, 0x18000080,
4148c349dbc7Sjsg 	0xd3d940a2, 0x18000080, 0xd3d940a3, 0x18000080, 0xd3d940a4, 0x18000080,
4149c349dbc7Sjsg 	0xd3d940a5, 0x18000080, 0xd3d940a6, 0x18000080, 0xd3d940a7, 0x18000080,
4150c349dbc7Sjsg 	0xd3d940a8, 0x18000080, 0xd3d940a9, 0x18000080, 0xd3d940aa, 0x18000080,
4151c349dbc7Sjsg 	0xd3d940ab, 0x18000080, 0xd3d940ac, 0x18000080, 0xd3d940ad, 0x18000080,
4152c349dbc7Sjsg 	0xd3d940ae, 0x18000080, 0xd3d940af, 0x18000080, 0xd3d940b0, 0x18000080,
4153c349dbc7Sjsg 	0xd3d940b1, 0x18000080, 0xd3d940b2, 0x18000080, 0xd3d940b3, 0x18000080,
4154c349dbc7Sjsg 	0xd3d940b4, 0x18000080, 0xd3d940b5, 0x18000080, 0xd3d940b6, 0x18000080,
4155c349dbc7Sjsg 	0xd3d940b7, 0x18000080, 0xd3d940b8, 0x18000080, 0xd3d940b9, 0x18000080,
4156c349dbc7Sjsg 	0xd3d940ba, 0x18000080, 0xd3d940bb, 0x18000080, 0xd3d940bc, 0x18000080,
4157c349dbc7Sjsg 	0xd3d940bd, 0x18000080, 0xd3d940be, 0x18000080, 0xd3d940bf, 0x18000080,
4158c349dbc7Sjsg 	0xd3d940c0, 0x18000080, 0xd3d940c1, 0x18000080, 0xd3d940c2, 0x18000080,
4159c349dbc7Sjsg 	0xd3d940c3, 0x18000080, 0xd3d940c4, 0x18000080, 0xd3d940c5, 0x18000080,
4160c349dbc7Sjsg 	0xd3d940c6, 0x18000080, 0xd3d940c7, 0x18000080, 0xd3d940c8, 0x18000080,
4161c349dbc7Sjsg 	0xd3d940c9, 0x18000080, 0xd3d940ca, 0x18000080, 0xd3d940cb, 0x18000080,
4162c349dbc7Sjsg 	0xd3d940cc, 0x18000080, 0xd3d940cd, 0x18000080, 0xd3d940ce, 0x18000080,
4163c349dbc7Sjsg 	0xd3d940cf, 0x18000080, 0xd3d940d0, 0x18000080, 0xd3d940d1, 0x18000080,
4164c349dbc7Sjsg 	0xd3d940d2, 0x18000080, 0xd3d940d3, 0x18000080, 0xd3d940d4, 0x18000080,
4165c349dbc7Sjsg 	0xd3d940d5, 0x18000080, 0xd3d940d6, 0x18000080, 0xd3d940d7, 0x18000080,
4166c349dbc7Sjsg 	0xd3d940d8, 0x18000080, 0xd3d940d9, 0x18000080, 0xd3d940da, 0x18000080,
4167c349dbc7Sjsg 	0xd3d940db, 0x18000080, 0xd3d940dc, 0x18000080, 0xd3d940dd, 0x18000080,
4168c349dbc7Sjsg 	0xd3d940de, 0x18000080, 0xd3d940df, 0x18000080, 0xd3d940e0, 0x18000080,
4169c349dbc7Sjsg 	0xd3d940e1, 0x18000080, 0xd3d940e2, 0x18000080, 0xd3d940e3, 0x18000080,
4170c349dbc7Sjsg 	0xd3d940e4, 0x18000080, 0xd3d940e5, 0x18000080, 0xd3d940e6, 0x18000080,
4171c349dbc7Sjsg 	0xd3d940e7, 0x18000080, 0xd3d940e8, 0x18000080, 0xd3d940e9, 0x18000080,
4172c349dbc7Sjsg 	0xd3d940ea, 0x18000080, 0xd3d940eb, 0x18000080, 0xd3d940ec, 0x18000080,
4173c349dbc7Sjsg 	0xd3d940ed, 0x18000080, 0xd3d940ee, 0x18000080, 0xd3d940ef, 0x18000080,
4174c349dbc7Sjsg 	0xd3d940f0, 0x18000080, 0xd3d940f1, 0x18000080, 0xd3d940f2, 0x18000080,
4175c349dbc7Sjsg 	0xd3d940f3, 0x18000080, 0xd3d940f4, 0x18000080, 0xd3d940f5, 0x18000080,
4176c349dbc7Sjsg 	0xd3d940f6, 0x18000080, 0xd3d940f7, 0x18000080, 0xd3d940f8, 0x18000080,
4177c349dbc7Sjsg 	0xd3d940f9, 0x18000080, 0xd3d940fa, 0x18000080, 0xd3d940fb, 0x18000080,
4178c349dbc7Sjsg 	0xd3d940fc, 0x18000080, 0xd3d940fd, 0x18000080, 0xd3d940fe, 0x18000080,
4179c349dbc7Sjsg 	0xd3d940ff, 0x18000080, 0xb07c0000, 0xbe8a00ff, 0x000000f8, 0xbf11080a,
4180c349dbc7Sjsg 	0x7e000280, 0x7e020280, 0x7e040280, 0x7e060280, 0x7e080280, 0x7e0a0280,
4181c349dbc7Sjsg 	0x7e0c0280, 0x7e0e0280, 0x808a880a, 0xbe80320a, 0xbf84fff5, 0xbf9c0000,
4182c349dbc7Sjsg 	0xd28c0001, 0x0001007f, 0xd28d0001, 0x0002027e, 0x10020288, 0xb88b0904,
4183c349dbc7Sjsg 	0xb78b4000, 0xd1196a01, 0x00001701, 0xbe8a0087, 0xbefc00c1, 0xd89c4000,
4184c349dbc7Sjsg 	0x00020201, 0xd89cc080, 0x00040401, 0x320202ff, 0x00000800, 0x808a810a,
4185c349dbc7Sjsg 	0xbf84fff8, 0xbf810000,
4186c349dbc7Sjsg };
4187c349dbc7Sjsg 
4188c349dbc7Sjsg /* When below register arrays changed, please update gpr_reg_size,
4189c349dbc7Sjsg   and sec_ded_counter_reg_size in function gfx_v9_0_do_edc_gpr_workarounds,
4190c349dbc7Sjsg   to cover all gfx9 ASICs */
4191c349dbc7Sjsg static const struct soc15_reg_entry vgpr_init_regs[] = {
4192c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
4193c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_X), 0x40 },
4194c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Y), 4 },
4195c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Z), 1 },
4196c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC1), 0x3f },
4197c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC2), 0x400000 },  /* 64KB LDS */
4198c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
4199c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
4200c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
4201c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
4202c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
4203c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
4204c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
4205c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
4206c349dbc7Sjsg };
4207c349dbc7Sjsg 
4208c349dbc7Sjsg static const struct soc15_reg_entry vgpr_init_regs_arcturus[] = {
4209c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
4210c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_X), 0x40 },
4211c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Y), 4 },
4212c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Z), 1 },
4213c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC1), 0xbf },
4214c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC2), 0x400000 },  /* 64KB LDS */
4215c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE0), 0xffffffff },
4216c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE1), 0xffffffff },
4217c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE2), 0xffffffff },
4218c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE3), 0xffffffff },
4219c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE4), 0xffffffff },
4220c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE5), 0xffffffff },
4221c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE6), 0xffffffff },
4222c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE7), 0xffffffff },
4223c349dbc7Sjsg };
4224c349dbc7Sjsg 
4225c349dbc7Sjsg static const struct soc15_reg_entry sgpr1_init_regs[] = {
4226c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
4227c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_X), 0x40 },
4228c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Y), 8 },
4229c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Z), 1 },
4230c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC1), 0x240 }, /* (80 GPRS) */
4231c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC2), 0x0 },
4232c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE0), 0x000000ff },
4233c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE1), 0x000000ff },
4234c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE2), 0x000000ff },
4235c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE3), 0x000000ff },
4236c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE4), 0x000000ff },
4237c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE5), 0x000000ff },
4238c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE6), 0x000000ff },
4239c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE7), 0x000000ff },
4240c349dbc7Sjsg };
4241c349dbc7Sjsg 
4242c349dbc7Sjsg static const struct soc15_reg_entry sgpr2_init_regs[] = {
4243c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_RESOURCE_LIMITS), 0x0000000 },
4244c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_X), 0x40 },
4245c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Y), 8 },
4246c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_NUM_THREAD_Z), 1 },
4247c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC1), 0x240 }, /* (80 GPRS) */
4248c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_PGM_RSRC2), 0x0 },
4249c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE0), 0x0000ff00 },
4250c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE1), 0x0000ff00 },
4251c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE2), 0x0000ff00 },
4252c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE3), 0x0000ff00 },
4253c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE4), 0x0000ff00 },
4254c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE5), 0x0000ff00 },
4255c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE6), 0x0000ff00 },
4256c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCOMPUTE_STATIC_THREAD_MGMT_SE7), 0x0000ff00 },
4257c349dbc7Sjsg };
4258c349dbc7Sjsg 
4259c349dbc7Sjsg static const struct soc15_reg_entry gfx_v9_0_edc_counter_regs[] = {
4260c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_SCRATCH_CNT), 0, 1, 1},
4261c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_UCODE_CNT), 0, 1, 1},
4262c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_ROQ_CNT), 0, 1, 1},
4263c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_TAG_CNT), 0, 1, 1},
4264c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_DMA_CNT), 0, 1, 1},
4265c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_TAG_CNT), 0, 1, 1},
4266c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_CSINVOC_CNT), 0, 1, 1},
4267c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_RESTORE_CNT), 0, 1, 1},
4268c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmDC_EDC_STATE_CNT), 0, 1, 1},
4269c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_CNT), 0, 1, 1},
4270c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_GRBM_CNT), 0, 1, 1},
4271c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_DED), 0, 1, 1},
4272c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSPI_EDC_CNT), 0, 4, 1},
4273c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT), 0, 4, 6},
4274c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_DED_CNT), 0, 4, 16},
4275c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_INFO), 0, 4, 16},
4276c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_SEC_CNT), 0, 4, 16},
4277c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT), 0, 1, 16},
4278c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCP_ATC_EDC_GATCL1_CNT), 0, 4, 16},
4279c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT), 0, 4, 16},
4280c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW), 0, 4, 16},
4281c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT), 0, 4, 16},
4282c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2), 0, 4, 6},
4283c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT), 0, 4, 16},
4284c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT), 0, 4, 16},
4285c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT), 0, 1, 1},
4286c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT), 0, 1, 1},
4287c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT), 0, 1, 32},
4288c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2), 0, 1, 32},
4289c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCI_EDC_CNT), 0, 1, 72},
4290c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2), 0, 1, 16},
4291c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmTCA_EDC_CNT), 0, 1, 2},
4292c349dbc7Sjsg    { SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3), 0, 4, 6},
4293c349dbc7Sjsg };
4294c349dbc7Sjsg 
gfx_v9_0_do_edc_gds_workarounds(struct amdgpu_device * adev)4295c349dbc7Sjsg static int gfx_v9_0_do_edc_gds_workarounds(struct amdgpu_device *adev)
4296c349dbc7Sjsg {
4297c349dbc7Sjsg 	struct amdgpu_ring *ring = &adev->gfx.compute_ring[0];
4298c349dbc7Sjsg 	int i, r;
4299c349dbc7Sjsg 
4300c349dbc7Sjsg 	/* only support when RAS is enabled */
4301c349dbc7Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
4302c349dbc7Sjsg 		return 0;
4303c349dbc7Sjsg 
4304c349dbc7Sjsg 	r = amdgpu_ring_alloc(ring, 7);
4305c349dbc7Sjsg 	if (r) {
4306c349dbc7Sjsg 		DRM_ERROR("amdgpu: GDS workarounds failed to lock ring %s (%d).\n",
4307c349dbc7Sjsg 			ring->name, r);
4308c349dbc7Sjsg 		return r;
4309c349dbc7Sjsg 	}
4310c349dbc7Sjsg 
4311c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmGDS_VMID0_BASE, 0x00000000);
4312c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE, adev->gds.gds_size);
4313c349dbc7Sjsg 
4314c349dbc7Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
4315c349dbc7Sjsg 	amdgpu_ring_write(ring, (PACKET3_DMA_DATA_CP_SYNC |
4316c349dbc7Sjsg 				PACKET3_DMA_DATA_DST_SEL(1) |
4317c349dbc7Sjsg 				PACKET3_DMA_DATA_SRC_SEL(2) |
4318c349dbc7Sjsg 				PACKET3_DMA_DATA_ENGINE(0)));
4319c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
4320c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
4321c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
4322c349dbc7Sjsg 	amdgpu_ring_write(ring, 0);
4323c349dbc7Sjsg 	amdgpu_ring_write(ring, PACKET3_DMA_DATA_CMD_RAW_WAIT |
4324c349dbc7Sjsg 				adev->gds.gds_size);
4325c349dbc7Sjsg 
4326c349dbc7Sjsg 	amdgpu_ring_commit(ring);
4327c349dbc7Sjsg 
4328c349dbc7Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
4329c349dbc7Sjsg 		if (ring->wptr == gfx_v9_0_ring_get_rptr_compute(ring))
4330c349dbc7Sjsg 			break;
4331c349dbc7Sjsg 		udelay(1);
4332c349dbc7Sjsg 	}
4333c349dbc7Sjsg 
4334c349dbc7Sjsg 	if (i >= adev->usec_timeout)
4335c349dbc7Sjsg 		r = -ETIMEDOUT;
4336c349dbc7Sjsg 
4337c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE, 0x00000000);
4338c349dbc7Sjsg 
4339c349dbc7Sjsg 	return r;
4340c349dbc7Sjsg }
4341c349dbc7Sjsg 
gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device * adev)4342c349dbc7Sjsg static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
4343c349dbc7Sjsg {
4344c349dbc7Sjsg 	struct amdgpu_ring *ring = &adev->gfx.compute_ring[0];
4345c349dbc7Sjsg 	struct amdgpu_ib ib;
4346c349dbc7Sjsg 	struct dma_fence *f = NULL;
4347c349dbc7Sjsg 	int r, i;
4348c349dbc7Sjsg 	unsigned total_size, vgpr_offset, sgpr_offset;
4349c349dbc7Sjsg 	u64 gpu_addr;
4350c349dbc7Sjsg 
4351c349dbc7Sjsg 	int compute_dim_x = adev->gfx.config.max_shader_engines *
4352c349dbc7Sjsg 						adev->gfx.config.max_cu_per_sh *
4353c349dbc7Sjsg 						adev->gfx.config.max_sh_per_se;
4354c349dbc7Sjsg 	int sgpr_work_group_size = 5;
4355c349dbc7Sjsg 	int gpr_reg_size = adev->gfx.config.max_shader_engines + 6;
4356c349dbc7Sjsg 	int vgpr_init_shader_size;
4357c349dbc7Sjsg 	const u32 *vgpr_init_shader_ptr;
4358c349dbc7Sjsg 	const struct soc15_reg_entry *vgpr_init_regs_ptr;
4359c349dbc7Sjsg 
4360c349dbc7Sjsg 	/* only support when RAS is enabled */
4361c349dbc7Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
4362c349dbc7Sjsg 		return 0;
4363c349dbc7Sjsg 
4364c349dbc7Sjsg 	/* bail if the compute ring is not ready */
4365c349dbc7Sjsg 	if (!ring->sched.ready)
4366c349dbc7Sjsg 		return 0;
4367c349dbc7Sjsg 
43681bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1)) {
4369c349dbc7Sjsg 		vgpr_init_shader_ptr = vgpr_init_compute_shader_arcturus;
4370c349dbc7Sjsg 		vgpr_init_shader_size = sizeof(vgpr_init_compute_shader_arcturus);
4371c349dbc7Sjsg 		vgpr_init_regs_ptr = vgpr_init_regs_arcturus;
4372c349dbc7Sjsg 	} else {
4373c349dbc7Sjsg 		vgpr_init_shader_ptr = vgpr_init_compute_shader;
4374c349dbc7Sjsg 		vgpr_init_shader_size = sizeof(vgpr_init_compute_shader);
4375c349dbc7Sjsg 		vgpr_init_regs_ptr = vgpr_init_regs;
4376c349dbc7Sjsg 	}
4377c349dbc7Sjsg 
4378c349dbc7Sjsg 	total_size =
4379c349dbc7Sjsg 		(gpr_reg_size * 3 + 4 + 5 + 2) * 4; /* VGPRS */
4380c349dbc7Sjsg 	total_size +=
4381c349dbc7Sjsg 		(gpr_reg_size * 3 + 4 + 5 + 2) * 4; /* SGPRS1 */
4382c349dbc7Sjsg 	total_size +=
4383c349dbc7Sjsg 		(gpr_reg_size * 3 + 4 + 5 + 2) * 4; /* SGPRS2 */
4384f005ef32Sjsg 	total_size = ALIGN(total_size, 256);
4385c349dbc7Sjsg 	vgpr_offset = total_size;
4386f005ef32Sjsg 	total_size += ALIGN(vgpr_init_shader_size, 256);
4387c349dbc7Sjsg 	sgpr_offset = total_size;
4388c349dbc7Sjsg 	total_size += sizeof(sgpr_init_compute_shader);
4389c349dbc7Sjsg 
4390c349dbc7Sjsg 	/* allocate an indirect buffer to put the commands in */
4391c349dbc7Sjsg 	memset(&ib, 0, sizeof(ib));
4392ad8b1aafSjsg 	r = amdgpu_ib_get(adev, NULL, total_size,
4393ad8b1aafSjsg 					AMDGPU_IB_POOL_DIRECT, &ib);
4394c349dbc7Sjsg 	if (r) {
4395c349dbc7Sjsg 		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
4396c349dbc7Sjsg 		return r;
4397c349dbc7Sjsg 	}
4398c349dbc7Sjsg 
4399c349dbc7Sjsg 	/* load the compute shaders */
4400c349dbc7Sjsg 	for (i = 0; i < vgpr_init_shader_size/sizeof(u32); i++)
4401c349dbc7Sjsg 		ib.ptr[i + (vgpr_offset / 4)] = vgpr_init_shader_ptr[i];
4402c349dbc7Sjsg 
4403c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(sgpr_init_compute_shader); i++)
4404c349dbc7Sjsg 		ib.ptr[i + (sgpr_offset / 4)] = sgpr_init_compute_shader[i];
4405c349dbc7Sjsg 
4406c349dbc7Sjsg 	/* init the ib length to 0 */
4407c349dbc7Sjsg 	ib.length_dw = 0;
4408c349dbc7Sjsg 
4409c349dbc7Sjsg 	/* VGPR */
4410c349dbc7Sjsg 	/* write the register state for the compute dispatch */
4411c349dbc7Sjsg 	for (i = 0; i < gpr_reg_size; i++) {
4412c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
4413c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = SOC15_REG_ENTRY_OFFSET(vgpr_init_regs_ptr[i])
4414c349dbc7Sjsg 								- PACKET3_SET_SH_REG_START;
4415c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = vgpr_init_regs_ptr[i].reg_value;
4416c349dbc7Sjsg 	}
4417c349dbc7Sjsg 	/* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
4418c349dbc7Sjsg 	gpu_addr = (ib.gpu_addr + (u64)vgpr_offset) >> 8;
4419c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
4420c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = SOC15_REG_OFFSET(GC, 0, mmCOMPUTE_PGM_LO)
4421c349dbc7Sjsg 							- PACKET3_SET_SH_REG_START;
4422c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
4423c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
4424c349dbc7Sjsg 
4425c349dbc7Sjsg 	/* write dispatch packet */
4426c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
4427c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = compute_dim_x * 2; /* x */
4428c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* y */
4429c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* z */
4430c349dbc7Sjsg 	ib.ptr[ib.length_dw++] =
4431c349dbc7Sjsg 		REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
4432c349dbc7Sjsg 
4433c349dbc7Sjsg 	/* write CS partial flush packet */
4434c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
4435c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
4436c349dbc7Sjsg 
4437c349dbc7Sjsg 	/* SGPR1 */
4438c349dbc7Sjsg 	/* write the register state for the compute dispatch */
4439c349dbc7Sjsg 	for (i = 0; i < gpr_reg_size; i++) {
4440c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
4441c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = SOC15_REG_ENTRY_OFFSET(sgpr1_init_regs[i])
4442c349dbc7Sjsg 								- PACKET3_SET_SH_REG_START;
4443c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = sgpr1_init_regs[i].reg_value;
4444c349dbc7Sjsg 	}
4445c349dbc7Sjsg 	/* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
4446c349dbc7Sjsg 	gpu_addr = (ib.gpu_addr + (u64)sgpr_offset) >> 8;
4447c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
4448c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = SOC15_REG_OFFSET(GC, 0, mmCOMPUTE_PGM_LO)
4449c349dbc7Sjsg 							- PACKET3_SET_SH_REG_START;
4450c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
4451c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
4452c349dbc7Sjsg 
4453c349dbc7Sjsg 	/* write dispatch packet */
4454c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
4455c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = compute_dim_x / 2 * sgpr_work_group_size; /* x */
4456c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* y */
4457c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* z */
4458c349dbc7Sjsg 	ib.ptr[ib.length_dw++] =
4459c349dbc7Sjsg 		REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
4460c349dbc7Sjsg 
4461c349dbc7Sjsg 	/* write CS partial flush packet */
4462c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
4463c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
4464c349dbc7Sjsg 
4465c349dbc7Sjsg 	/* SGPR2 */
4466c349dbc7Sjsg 	/* write the register state for the compute dispatch */
4467c349dbc7Sjsg 	for (i = 0; i < gpr_reg_size; i++) {
4468c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 1);
4469c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = SOC15_REG_ENTRY_OFFSET(sgpr2_init_regs[i])
4470c349dbc7Sjsg 								- PACKET3_SET_SH_REG_START;
4471c349dbc7Sjsg 		ib.ptr[ib.length_dw++] = sgpr2_init_regs[i].reg_value;
4472c349dbc7Sjsg 	}
4473c349dbc7Sjsg 	/* write the shader start address: mmCOMPUTE_PGM_LO, mmCOMPUTE_PGM_HI */
4474c349dbc7Sjsg 	gpu_addr = (ib.gpu_addr + (u64)sgpr_offset) >> 8;
4475c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_SET_SH_REG, 2);
4476c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = SOC15_REG_OFFSET(GC, 0, mmCOMPUTE_PGM_LO)
4477c349dbc7Sjsg 							- PACKET3_SET_SH_REG_START;
4478c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = lower_32_bits(gpu_addr);
4479c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = upper_32_bits(gpu_addr);
4480c349dbc7Sjsg 
4481c349dbc7Sjsg 	/* write dispatch packet */
4482c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_DISPATCH_DIRECT, 3);
4483c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = compute_dim_x / 2 * sgpr_work_group_size; /* x */
4484c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* y */
4485c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = 1; /* z */
4486c349dbc7Sjsg 	ib.ptr[ib.length_dw++] =
4487c349dbc7Sjsg 		REG_SET_FIELD(0, COMPUTE_DISPATCH_INITIATOR, COMPUTE_SHADER_EN, 1);
4488c349dbc7Sjsg 
4489c349dbc7Sjsg 	/* write CS partial flush packet */
4490c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = PACKET3(PACKET3_EVENT_WRITE, 0);
4491c349dbc7Sjsg 	ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
4492c349dbc7Sjsg 
4493c349dbc7Sjsg 	/* shedule the ib on the ring */
4494c349dbc7Sjsg 	r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
4495c349dbc7Sjsg 	if (r) {
4496c349dbc7Sjsg 		DRM_ERROR("amdgpu: ib submit failed (%d).\n", r);
4497c349dbc7Sjsg 		goto fail;
4498c349dbc7Sjsg 	}
4499c349dbc7Sjsg 
4500c349dbc7Sjsg 	/* wait for the GPU to finish processing the IB */
4501c349dbc7Sjsg 	r = dma_fence_wait(f, false);
4502c349dbc7Sjsg 	if (r) {
4503c349dbc7Sjsg 		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
4504c349dbc7Sjsg 		goto fail;
4505c349dbc7Sjsg 	}
4506c349dbc7Sjsg 
4507c349dbc7Sjsg fail:
4508c349dbc7Sjsg 	amdgpu_ib_free(adev, &ib, NULL);
4509c349dbc7Sjsg 	dma_fence_put(f);
4510c349dbc7Sjsg 
4511c349dbc7Sjsg 	return r;
4512c349dbc7Sjsg }
4513c349dbc7Sjsg 
gfx_v9_0_early_init(void * handle)4514fb4d8502Sjsg static int gfx_v9_0_early_init(void *handle)
4515fb4d8502Sjsg {
4516fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4517fb4d8502Sjsg 
4518f005ef32Sjsg 	adev->gfx.funcs = &gfx_v9_0_gfx_funcs;
4519f005ef32Sjsg 
45201bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1) ||
45211bb76ff1Sjsg 	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2))
4522c349dbc7Sjsg 		adev->gfx.num_gfx_rings = 0;
4523c349dbc7Sjsg 	else
4524fb4d8502Sjsg 		adev->gfx.num_gfx_rings = GFX9_NUM_GFX_RINGS;
4525f005ef32Sjsg 	adev->gfx.xcc_mask = 1;
45265ca02815Sjsg 	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),
45275ca02815Sjsg 					  AMDGPU_MAX_COMPUTE_RINGS);
4528c349dbc7Sjsg 	gfx_v9_0_set_kiq_pm4_funcs(adev);
4529fb4d8502Sjsg 	gfx_v9_0_set_ring_funcs(adev);
4530fb4d8502Sjsg 	gfx_v9_0_set_irq_funcs(adev);
4531fb4d8502Sjsg 	gfx_v9_0_set_gds_init(adev);
4532fb4d8502Sjsg 	gfx_v9_0_set_rlc_funcs(adev);
4533fb4d8502Sjsg 
45341bb76ff1Sjsg 	/* init rlcg reg access ctrl */
45351bb76ff1Sjsg 	gfx_v9_0_init_rlcg_reg_access_ctrl(adev);
45361bb76ff1Sjsg 
4537f005ef32Sjsg 	return gfx_v9_0_init_microcode(adev);
4538fb4d8502Sjsg }
4539fb4d8502Sjsg 
gfx_v9_0_ecc_late_init(void * handle)4540c349dbc7Sjsg static int gfx_v9_0_ecc_late_init(void *handle)
4541c349dbc7Sjsg {
4542c349dbc7Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4543c349dbc7Sjsg 	int r;
4544c349dbc7Sjsg 
4545c349dbc7Sjsg 	/*
4546c349dbc7Sjsg 	 * Temp workaround to fix the issue that CP firmware fails to
4547c349dbc7Sjsg 	 * update read pointer when CPDMA is writing clearing operation
4548c349dbc7Sjsg 	 * to GDS in suspend/resume sequence on several cards. So just
4549c349dbc7Sjsg 	 * limit this operation in cold boot sequence.
4550c349dbc7Sjsg 	 */
45515ca02815Sjsg 	if ((!adev->in_suspend) &&
45525ca02815Sjsg 	    (adev->gds.gds_size)) {
4553c349dbc7Sjsg 		r = gfx_v9_0_do_edc_gds_workarounds(adev);
4554c349dbc7Sjsg 		if (r)
4555c349dbc7Sjsg 			return r;
4556c349dbc7Sjsg 	}
4557c349dbc7Sjsg 
4558c349dbc7Sjsg 	/* requires IBs so do in late init after IB pool is initialized */
45591bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2))
45605ca02815Sjsg 		r = gfx_v9_4_2_do_edc_gpr_workarounds(adev);
45615ca02815Sjsg 	else
4562c349dbc7Sjsg 		r = gfx_v9_0_do_edc_gpr_workarounds(adev);
45635ca02815Sjsg 
4564c349dbc7Sjsg 	if (r)
4565c349dbc7Sjsg 		return r;
4566c349dbc7Sjsg 
45671bb76ff1Sjsg 	if (adev->gfx.ras &&
45681bb76ff1Sjsg 	    adev->gfx.ras->enable_watchdog_timer)
45691bb76ff1Sjsg 		adev->gfx.ras->enable_watchdog_timer(adev);
4570c349dbc7Sjsg 
4571c349dbc7Sjsg 	return 0;
4572c349dbc7Sjsg }
4573c349dbc7Sjsg 
gfx_v9_0_late_init(void * handle)4574fb4d8502Sjsg static int gfx_v9_0_late_init(void *handle)
4575fb4d8502Sjsg {
4576fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4577fb4d8502Sjsg 	int r;
4578fb4d8502Sjsg 
4579fb4d8502Sjsg 	r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0);
4580fb4d8502Sjsg 	if (r)
4581fb4d8502Sjsg 		return r;
4582fb4d8502Sjsg 
4583fb4d8502Sjsg 	r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0);
4584fb4d8502Sjsg 	if (r)
4585fb4d8502Sjsg 		return r;
4586fb4d8502Sjsg 
4587c349dbc7Sjsg 	r = gfx_v9_0_ecc_late_init(handle);
4588c349dbc7Sjsg 	if (r)
4589c349dbc7Sjsg 		return r;
4590c349dbc7Sjsg 
4591f005ef32Sjsg 	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2))
4592f005ef32Sjsg 		gfx_v9_4_2_debug_trap_config_init(adev,
4593f005ef32Sjsg 			adev->vm_manager.first_kfd_vmid, AMDGPU_NUM_VMID);
4594f005ef32Sjsg 	else
4595f005ef32Sjsg 		gfx_v9_0_debug_trap_config_init(adev,
4596f005ef32Sjsg 			adev->vm_manager.first_kfd_vmid, AMDGPU_NUM_VMID);
4597f005ef32Sjsg 
4598fb4d8502Sjsg 	return 0;
4599fb4d8502Sjsg }
4600fb4d8502Sjsg 
gfx_v9_0_is_rlc_enabled(struct amdgpu_device * adev)4601c349dbc7Sjsg static bool gfx_v9_0_is_rlc_enabled(struct amdgpu_device *adev)
4602fb4d8502Sjsg {
4603c349dbc7Sjsg 	uint32_t rlc_setting;
4604fb4d8502Sjsg 
4605fb4d8502Sjsg 	/* if RLC is not enabled, do nothing */
4606fb4d8502Sjsg 	rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL);
4607fb4d8502Sjsg 	if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))
4608c349dbc7Sjsg 		return false;
4609fb4d8502Sjsg 
4610c349dbc7Sjsg 	return true;
4611c349dbc7Sjsg }
4612c349dbc7Sjsg 
gfx_v9_0_set_safe_mode(struct amdgpu_device * adev,int xcc_id)4613f005ef32Sjsg static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)
4614c349dbc7Sjsg {
4615c349dbc7Sjsg 	uint32_t data;
4616c349dbc7Sjsg 	unsigned i;
4617c349dbc7Sjsg 
4618fb4d8502Sjsg 	data = RLC_SAFE_MODE__CMD_MASK;
4619fb4d8502Sjsg 	data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
4620fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
4621fb4d8502Sjsg 
4622fb4d8502Sjsg 	/* wait for RLC_SAFE_MODE */
4623fb4d8502Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
4624fb4d8502Sjsg 		if (!REG_GET_FIELD(RREG32_SOC15(GC, 0, mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
4625fb4d8502Sjsg 			break;
4626fb4d8502Sjsg 		udelay(1);
4627fb4d8502Sjsg 	}
4628fb4d8502Sjsg }
4629fb4d8502Sjsg 
gfx_v9_0_unset_safe_mode(struct amdgpu_device * adev,int xcc_id)4630f005ef32Sjsg static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)
4631fb4d8502Sjsg {
4632c349dbc7Sjsg 	uint32_t data;
4633fb4d8502Sjsg 
4634fb4d8502Sjsg 	data = RLC_SAFE_MODE__CMD_MASK;
4635fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
4636fb4d8502Sjsg }
4637fb4d8502Sjsg 
gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device * adev,bool enable)4638fb4d8502Sjsg static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,
4639fb4d8502Sjsg 						bool enable)
4640fb4d8502Sjsg {
4641f005ef32Sjsg 	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
4642fb4d8502Sjsg 
4643fb4d8502Sjsg 	if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) {
4644fb4d8502Sjsg 		gfx_v9_0_enable_gfx_cg_power_gating(adev, true);
4645fb4d8502Sjsg 		if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PIPELINE)
4646fb4d8502Sjsg 			gfx_v9_0_enable_gfx_pipeline_powergating(adev, true);
4647fb4d8502Sjsg 	} else {
4648fb4d8502Sjsg 		gfx_v9_0_enable_gfx_cg_power_gating(adev, false);
4649c349dbc7Sjsg 		if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PIPELINE)
4650fb4d8502Sjsg 			gfx_v9_0_enable_gfx_pipeline_powergating(adev, false);
4651fb4d8502Sjsg 	}
4652fb4d8502Sjsg 
4653f005ef32Sjsg 	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
4654fb4d8502Sjsg }
4655fb4d8502Sjsg 
gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device * adev,bool enable)4656fb4d8502Sjsg static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev,
4657fb4d8502Sjsg 						bool enable)
4658fb4d8502Sjsg {
4659fb4d8502Sjsg 	/* TODO: double check if we need to perform under safe mode */
4660fb4d8502Sjsg 	/* gfx_v9_0_enter_rlc_safe_mode(adev); */
4661fb4d8502Sjsg 
4662fb4d8502Sjsg 	if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG) && enable)
4663fb4d8502Sjsg 		gfx_v9_0_enable_gfx_static_mg_power_gating(adev, true);
4664fb4d8502Sjsg 	else
4665fb4d8502Sjsg 		gfx_v9_0_enable_gfx_static_mg_power_gating(adev, false);
4666fb4d8502Sjsg 
4667fb4d8502Sjsg 	if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG) && enable)
4668fb4d8502Sjsg 		gfx_v9_0_enable_gfx_dynamic_mg_power_gating(adev, true);
4669fb4d8502Sjsg 	else
4670fb4d8502Sjsg 		gfx_v9_0_enable_gfx_dynamic_mg_power_gating(adev, false);
4671fb4d8502Sjsg 
4672fb4d8502Sjsg 	/* gfx_v9_0_exit_rlc_safe_mode(adev); */
4673fb4d8502Sjsg }
4674fb4d8502Sjsg 
gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device * adev,bool enable)4675fb4d8502Sjsg static void gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
4676fb4d8502Sjsg 						      bool enable)
4677fb4d8502Sjsg {
4678fb4d8502Sjsg 	uint32_t data, def;
4679fb4d8502Sjsg 
4680f005ef32Sjsg 	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
4681c349dbc7Sjsg 
4682fb4d8502Sjsg 	/* It is disabled by HW by default */
4683fb4d8502Sjsg 	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
4684fb4d8502Sjsg 		/* 1 - RLC_CGTT_MGCG_OVERRIDE */
4685fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
4686fb4d8502Sjsg 
46871bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 2, 1))
4688fb4d8502Sjsg 			data &= ~RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK;
4689fb4d8502Sjsg 
4690fb4d8502Sjsg 		data &= ~(RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |
4691fb4d8502Sjsg 			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |
4692fb4d8502Sjsg 			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK);
4693fb4d8502Sjsg 
4694fb4d8502Sjsg 		/* only for Vega10 & Raven1 */
4695fb4d8502Sjsg 		data |= RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK;
4696fb4d8502Sjsg 
4697fb4d8502Sjsg 		if (def != data)
4698fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
4699fb4d8502Sjsg 
4700fb4d8502Sjsg 		/* MGLS is a global flag to control all MGLS in GFX */
4701fb4d8502Sjsg 		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
4702fb4d8502Sjsg 			/* 2 - RLC memory Light sleep */
4703fb4d8502Sjsg 			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {
4704fb4d8502Sjsg 				def = data = RREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL);
4705fb4d8502Sjsg 				data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
4706fb4d8502Sjsg 				if (def != data)
4707fb4d8502Sjsg 					WREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL, data);
4708fb4d8502Sjsg 			}
4709fb4d8502Sjsg 			/* 3 - CP memory Light sleep */
4710fb4d8502Sjsg 			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
4711fb4d8502Sjsg 				def = data = RREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL);
4712fb4d8502Sjsg 				data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
4713fb4d8502Sjsg 				if (def != data)
4714fb4d8502Sjsg 					WREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL, data);
4715fb4d8502Sjsg 			}
4716fb4d8502Sjsg 		}
4717fb4d8502Sjsg 	} else {
4718fb4d8502Sjsg 		/* 1 - MGCG_OVERRIDE */
4719fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
4720fb4d8502Sjsg 
47211bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 2, 1))
4722fb4d8502Sjsg 			data |= RLC_CGTT_MGCG_OVERRIDE__CPF_CGTT_SCLK_OVERRIDE_MASK;
4723fb4d8502Sjsg 
4724fb4d8502Sjsg 		data |= (RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK |
4725fb4d8502Sjsg 			 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK |
4726fb4d8502Sjsg 			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK |
4727fb4d8502Sjsg 			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK);
4728fb4d8502Sjsg 
4729fb4d8502Sjsg 		if (def != data)
4730fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
4731fb4d8502Sjsg 
4732fb4d8502Sjsg 		/* 2 - disable MGLS in RLC */
4733fb4d8502Sjsg 		data = RREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL);
4734fb4d8502Sjsg 		if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) {
4735fb4d8502Sjsg 			data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
4736fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_MEM_SLP_CNTL, data);
4737fb4d8502Sjsg 		}
4738fb4d8502Sjsg 
4739fb4d8502Sjsg 		/* 3 - disable MGLS in CP */
4740fb4d8502Sjsg 		data = RREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL);
4741fb4d8502Sjsg 		if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) {
4742fb4d8502Sjsg 			data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
4743fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmCP_MEM_SLP_CNTL, data);
4744fb4d8502Sjsg 		}
4745fb4d8502Sjsg 	}
4746c349dbc7Sjsg 
4747f005ef32Sjsg 	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
4748fb4d8502Sjsg }
4749fb4d8502Sjsg 
gfx_v9_0_update_3d_clock_gating(struct amdgpu_device * adev,bool enable)4750fb4d8502Sjsg static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
4751fb4d8502Sjsg 					   bool enable)
4752fb4d8502Sjsg {
4753fb4d8502Sjsg 	uint32_t data, def;
4754fb4d8502Sjsg 
47555ca02815Sjsg 	if (!adev->gfx.num_gfx_rings)
4756c349dbc7Sjsg 		return;
4757c349dbc7Sjsg 
4758f005ef32Sjsg 	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
4759fb4d8502Sjsg 
4760fb4d8502Sjsg 	/* Enable 3D CGCG/CGLS */
4761ad8b1aafSjsg 	if (enable) {
4762fb4d8502Sjsg 		/* write cmd to clear cgcg/cgls ov */
4763fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
4764fb4d8502Sjsg 		/* unset CGCG override */
4765fb4d8502Sjsg 		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_GFX3D_CG_OVERRIDE_MASK;
4766fb4d8502Sjsg 		/* update CGCG and CGLS override bits */
4767fb4d8502Sjsg 		if (def != data)
4768fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
4769fb4d8502Sjsg 
4770fb4d8502Sjsg 		/* enable 3Dcgcg FSM(0x0000363f) */
4771fb4d8502Sjsg 		def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
4772fb4d8502Sjsg 
4773ad8b1aafSjsg 		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)
4774fb4d8502Sjsg 			data = (0x36 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
4775fb4d8502Sjsg 				RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK;
4776ad8b1aafSjsg 		else
4777ad8b1aafSjsg 			data = 0x0 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT;
4778ad8b1aafSjsg 
4779fb4d8502Sjsg 		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS)
4780fb4d8502Sjsg 			data |= (0x000F << RLC_CGCG_CGLS_CTRL_3D__CGLS_REP_COMPANSAT_DELAY__SHIFT) |
4781fb4d8502Sjsg 				RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK;
4782fb4d8502Sjsg 		if (def != data)
4783fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);
4784fb4d8502Sjsg 
4785fb4d8502Sjsg 		/* set IDLE_POLL_COUNT(0x00900100) */
4786fb4d8502Sjsg 		def = RREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL);
4787fb4d8502Sjsg 		data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) |
4788fb4d8502Sjsg 			(0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
4789fb4d8502Sjsg 		if (def != data)
4790fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL, data);
4791fb4d8502Sjsg 	} else {
4792fb4d8502Sjsg 		/* Disable CGCG/CGLS */
4793fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
4794fb4d8502Sjsg 		/* disable cgcg, cgls should be disabled */
4795fb4d8502Sjsg 		data &= ~(RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK |
4796fb4d8502Sjsg 			  RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK);
4797fb4d8502Sjsg 		/* disable cgcg and cgls in FSM */
4798fb4d8502Sjsg 		if (def != data)
4799fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);
4800fb4d8502Sjsg 	}
4801fb4d8502Sjsg 
4802f005ef32Sjsg 	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
4803fb4d8502Sjsg }
4804fb4d8502Sjsg 
gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device * adev,bool enable)4805fb4d8502Sjsg static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
4806fb4d8502Sjsg 						      bool enable)
4807fb4d8502Sjsg {
4808fb4d8502Sjsg 	uint32_t def, data;
4809fb4d8502Sjsg 
4810f005ef32Sjsg 	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
4811fb4d8502Sjsg 
4812fb4d8502Sjsg 	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
4813fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
4814fb4d8502Sjsg 		/* unset CGCG override */
4815fb4d8502Sjsg 		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGCG_OVERRIDE_MASK;
4816fb4d8502Sjsg 		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)
4817fb4d8502Sjsg 			data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK;
4818fb4d8502Sjsg 		else
4819fb4d8502Sjsg 			data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK;
4820fb4d8502Sjsg 		/* update CGCG and CGLS override bits */
4821fb4d8502Sjsg 		if (def != data)
4822fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE, data);
4823fb4d8502Sjsg 
4824fb4d8502Sjsg 		/* enable cgcg FSM(0x0000363F) */
4825fb4d8502Sjsg 		def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL);
4826fb4d8502Sjsg 
48271bb76ff1Sjsg 		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1))
4828c349dbc7Sjsg 			data = (0x2000 << RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
4829c349dbc7Sjsg 				RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;
4830c349dbc7Sjsg 		else
4831fb4d8502Sjsg 			data = (0x36 << RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
4832fb4d8502Sjsg 				RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;
4833fb4d8502Sjsg 		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS)
4834fb4d8502Sjsg 			data |= (0x000F << RLC_CGCG_CGLS_CTRL__CGLS_REP_COMPANSAT_DELAY__SHIFT) |
4835fb4d8502Sjsg 				RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
4836fb4d8502Sjsg 		if (def != data)
4837fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);
4838fb4d8502Sjsg 
4839fb4d8502Sjsg 		/* set IDLE_POLL_COUNT(0x00900100) */
4840fb4d8502Sjsg 		def = RREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL);
4841fb4d8502Sjsg 		data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) |
4842fb4d8502Sjsg 			(0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
4843fb4d8502Sjsg 		if (def != data)
4844fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_CNTL, data);
4845fb4d8502Sjsg 	} else {
4846fb4d8502Sjsg 		def = data = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL);
4847fb4d8502Sjsg 		/* reset CGCG/CGLS bits */
4848fb4d8502Sjsg 		data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
4849fb4d8502Sjsg 		/* disable cgcg and cgls in FSM */
4850fb4d8502Sjsg 		if (def != data)
4851fb4d8502Sjsg 			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);
4852fb4d8502Sjsg 	}
4853fb4d8502Sjsg 
4854f005ef32Sjsg 	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);
4855fb4d8502Sjsg }
4856fb4d8502Sjsg 
gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device * adev,bool enable)4857fb4d8502Sjsg static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,
4858fb4d8502Sjsg 					    bool enable)
4859fb4d8502Sjsg {
4860fb4d8502Sjsg 	if (enable) {
4861fb4d8502Sjsg 		/* CGCG/CGLS should be enabled after MGCG/MGLS
4862fb4d8502Sjsg 		 * ===  MGCG + MGLS ===
4863fb4d8502Sjsg 		 */
4864fb4d8502Sjsg 		gfx_v9_0_update_medium_grain_clock_gating(adev, enable);
4865fb4d8502Sjsg 		/* ===  CGCG /CGLS for GFX 3D Only === */
4866fb4d8502Sjsg 		gfx_v9_0_update_3d_clock_gating(adev, enable);
4867fb4d8502Sjsg 		/* ===  CGCG + CGLS === */
4868fb4d8502Sjsg 		gfx_v9_0_update_coarse_grain_clock_gating(adev, enable);
4869fb4d8502Sjsg 	} else {
4870fb4d8502Sjsg 		/* CGCG/CGLS should be disabled before MGCG/MGLS
4871fb4d8502Sjsg 		 * ===  CGCG + CGLS ===
4872fb4d8502Sjsg 		 */
4873fb4d8502Sjsg 		gfx_v9_0_update_coarse_grain_clock_gating(adev, enable);
4874fb4d8502Sjsg 		/* ===  CGCG /CGLS for GFX 3D Only === */
4875fb4d8502Sjsg 		gfx_v9_0_update_3d_clock_gating(adev, enable);
4876fb4d8502Sjsg 		/* ===  MGCG + MGLS === */
4877fb4d8502Sjsg 		gfx_v9_0_update_medium_grain_clock_gating(adev, enable);
4878fb4d8502Sjsg 	}
4879fb4d8502Sjsg 	return 0;
4880fb4d8502Sjsg }
4881fb4d8502Sjsg 
gfx_v9_0_update_spm_vmid_internal(struct amdgpu_device * adev,unsigned int vmid)4882f005ef32Sjsg static void gfx_v9_0_update_spm_vmid_internal(struct amdgpu_device *adev,
4883f005ef32Sjsg 					      unsigned int vmid)
4884c349dbc7Sjsg {
4885ad8b1aafSjsg 	u32 reg, data;
4886c349dbc7Sjsg 
4887ad8b1aafSjsg 	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL);
4888ad8b1aafSjsg 	if (amdgpu_sriov_is_pp_one_vf(adev))
4889ad8b1aafSjsg 		data = RREG32_NO_KIQ(reg);
4890ad8b1aafSjsg 	else
48911bb76ff1Sjsg 		data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL);
4892c349dbc7Sjsg 
4893c349dbc7Sjsg 	data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK;
4894c349dbc7Sjsg 	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT;
4895c349dbc7Sjsg 
4896ad8b1aafSjsg 	if (amdgpu_sriov_is_pp_one_vf(adev))
4897ad8b1aafSjsg 		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data);
4898ad8b1aafSjsg 	else
4899c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data);
4900f005ef32Sjsg }
4901f005ef32Sjsg 
gfx_v9_0_update_spm_vmid(struct amdgpu_device * adev,unsigned int vmid)4902f005ef32Sjsg static void gfx_v9_0_update_spm_vmid(struct amdgpu_device *adev, unsigned int vmid)
4903f005ef32Sjsg {
4904f005ef32Sjsg 	amdgpu_gfx_off_ctrl(adev, false);
4905f005ef32Sjsg 
4906f005ef32Sjsg 	gfx_v9_0_update_spm_vmid_internal(adev, vmid);
49071bb76ff1Sjsg 
49081bb76ff1Sjsg 	amdgpu_gfx_off_ctrl(adev, true);
4909c349dbc7Sjsg }
4910c349dbc7Sjsg 
gfx_v9_0_check_rlcg_range(struct amdgpu_device * adev,uint32_t offset,struct soc15_reg_rlcg * entries,int arr_size)4911c349dbc7Sjsg static bool gfx_v9_0_check_rlcg_range(struct amdgpu_device *adev,
4912c349dbc7Sjsg 					uint32_t offset,
4913c349dbc7Sjsg 					struct soc15_reg_rlcg *entries, int arr_size)
4914c349dbc7Sjsg {
4915c349dbc7Sjsg 	int i;
4916c349dbc7Sjsg 	uint32_t reg;
4917c349dbc7Sjsg 
4918c349dbc7Sjsg 	if (!entries)
4919c349dbc7Sjsg 		return false;
4920c349dbc7Sjsg 
4921c349dbc7Sjsg 	for (i = 0; i < arr_size; i++) {
4922c349dbc7Sjsg 		const struct soc15_reg_rlcg *entry;
4923c349dbc7Sjsg 
4924c349dbc7Sjsg 		entry = &entries[i];
4925c349dbc7Sjsg 		reg = adev->reg_offset[entry->hwip][entry->instance][entry->segment] + entry->reg;
4926c349dbc7Sjsg 		if (offset == reg)
4927c349dbc7Sjsg 			return true;
4928c349dbc7Sjsg 	}
4929c349dbc7Sjsg 
4930c349dbc7Sjsg 	return false;
4931c349dbc7Sjsg }
4932c349dbc7Sjsg 
gfx_v9_0_is_rlcg_access_range(struct amdgpu_device * adev,u32 offset)4933c349dbc7Sjsg static bool gfx_v9_0_is_rlcg_access_range(struct amdgpu_device *adev, u32 offset)
4934c349dbc7Sjsg {
4935c349dbc7Sjsg 	return gfx_v9_0_check_rlcg_range(adev, offset,
4936c349dbc7Sjsg 					(void *)rlcg_access_gc_9_0,
4937c349dbc7Sjsg 					ARRAY_SIZE(rlcg_access_gc_9_0));
4938c349dbc7Sjsg }
4939c349dbc7Sjsg 
4940fb4d8502Sjsg static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = {
4941c349dbc7Sjsg 	.is_rlc_enabled = gfx_v9_0_is_rlc_enabled,
4942c349dbc7Sjsg 	.set_safe_mode = gfx_v9_0_set_safe_mode,
4943c349dbc7Sjsg 	.unset_safe_mode = gfx_v9_0_unset_safe_mode,
4944c349dbc7Sjsg 	.init = gfx_v9_0_rlc_init,
4945c349dbc7Sjsg 	.get_csb_size = gfx_v9_0_get_csb_size,
4946c349dbc7Sjsg 	.get_csb_buffer = gfx_v9_0_get_csb_buffer,
4947c349dbc7Sjsg 	.get_cp_table_num = gfx_v9_0_cp_jump_table_num,
4948c349dbc7Sjsg 	.resume = gfx_v9_0_rlc_resume,
4949c349dbc7Sjsg 	.stop = gfx_v9_0_rlc_stop,
4950c349dbc7Sjsg 	.reset = gfx_v9_0_rlc_reset,
4951c349dbc7Sjsg 	.start = gfx_v9_0_rlc_start,
4952c349dbc7Sjsg 	.update_spm_vmid = gfx_v9_0_update_spm_vmid,
4953c349dbc7Sjsg 	.is_rlcg_access_range = gfx_v9_0_is_rlcg_access_range,
4954fb4d8502Sjsg };
4955fb4d8502Sjsg 
gfx_v9_0_set_powergating_state(void * handle,enum amd_powergating_state state)4956fb4d8502Sjsg static int gfx_v9_0_set_powergating_state(void *handle,
4957fb4d8502Sjsg 					  enum amd_powergating_state state)
4958fb4d8502Sjsg {
4959fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4960c349dbc7Sjsg 	bool enable = (state == AMD_PG_STATE_GATE);
4961fb4d8502Sjsg 
49621bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
49631bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
49641bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
49651bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
4966c349dbc7Sjsg 		if (!enable)
4967c349dbc7Sjsg 			amdgpu_gfx_off_ctrl(adev, false);
4968c349dbc7Sjsg 
4969fb4d8502Sjsg 		if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {
4970fb4d8502Sjsg 			gfx_v9_0_enable_sck_slow_down_on_power_up(adev, true);
4971fb4d8502Sjsg 			gfx_v9_0_enable_sck_slow_down_on_power_down(adev, true);
4972fb4d8502Sjsg 		} else {
4973fb4d8502Sjsg 			gfx_v9_0_enable_sck_slow_down_on_power_up(adev, false);
4974fb4d8502Sjsg 			gfx_v9_0_enable_sck_slow_down_on_power_down(adev, false);
4975fb4d8502Sjsg 		}
4976fb4d8502Sjsg 
4977fb4d8502Sjsg 		if (adev->pg_flags & AMD_PG_SUPPORT_CP)
4978fb4d8502Sjsg 			gfx_v9_0_enable_cp_power_gating(adev, true);
4979fb4d8502Sjsg 		else
4980fb4d8502Sjsg 			gfx_v9_0_enable_cp_power_gating(adev, false);
4981fb4d8502Sjsg 
4982fb4d8502Sjsg 		/* update gfx cgpg state */
4983fb4d8502Sjsg 		gfx_v9_0_update_gfx_cg_power_gating(adev, enable);
4984fb4d8502Sjsg 
4985fb4d8502Sjsg 		/* update mgcg state */
4986fb4d8502Sjsg 		gfx_v9_0_update_gfx_mg_power_gating(adev, enable);
4987fb4d8502Sjsg 
4988c349dbc7Sjsg 		if (enable)
4989c349dbc7Sjsg 			amdgpu_gfx_off_ctrl(adev, true);
4990fb4d8502Sjsg 		break;
49911bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
4992c349dbc7Sjsg 		amdgpu_gfx_off_ctrl(adev, enable);
4993fb4d8502Sjsg 		break;
4994fb4d8502Sjsg 	default:
4995fb4d8502Sjsg 		break;
4996fb4d8502Sjsg 	}
4997fb4d8502Sjsg 
4998fb4d8502Sjsg 	return 0;
4999fb4d8502Sjsg }
5000fb4d8502Sjsg 
gfx_v9_0_set_clockgating_state(void * handle,enum amd_clockgating_state state)5001fb4d8502Sjsg static int gfx_v9_0_set_clockgating_state(void *handle,
5002fb4d8502Sjsg 					  enum amd_clockgating_state state)
5003fb4d8502Sjsg {
5004fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5005fb4d8502Sjsg 
5006fb4d8502Sjsg 	if (amdgpu_sriov_vf(adev))
5007fb4d8502Sjsg 		return 0;
5008fb4d8502Sjsg 
50091bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
50101bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
50111bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
50121bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
50131bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
50141bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
50151bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
50161bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
50171bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
5018fb4d8502Sjsg 		gfx_v9_0_update_gfx_clock_gating(adev,
5019c349dbc7Sjsg 						 state == AMD_CG_STATE_GATE);
5020fb4d8502Sjsg 		break;
5021fb4d8502Sjsg 	default:
5022fb4d8502Sjsg 		break;
5023fb4d8502Sjsg 	}
5024fb4d8502Sjsg 	return 0;
5025fb4d8502Sjsg }
5026fb4d8502Sjsg 
gfx_v9_0_get_clockgating_state(void * handle,u64 * flags)50271bb76ff1Sjsg static void gfx_v9_0_get_clockgating_state(void *handle, u64 *flags)
5028fb4d8502Sjsg {
5029fb4d8502Sjsg 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5030fb4d8502Sjsg 	int data;
5031fb4d8502Sjsg 
5032fb4d8502Sjsg 	if (amdgpu_sriov_vf(adev))
5033fb4d8502Sjsg 		*flags = 0;
5034fb4d8502Sjsg 
5035fb4d8502Sjsg 	/* AMD_CG_SUPPORT_GFX_MGCG */
5036c349dbc7Sjsg 	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE));
5037fb4d8502Sjsg 	if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK))
5038fb4d8502Sjsg 		*flags |= AMD_CG_SUPPORT_GFX_MGCG;
5039fb4d8502Sjsg 
5040fb4d8502Sjsg 	/* AMD_CG_SUPPORT_GFX_CGCG */
5041c349dbc7Sjsg 	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL));
5042fb4d8502Sjsg 	if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK)
5043fb4d8502Sjsg 		*flags |= AMD_CG_SUPPORT_GFX_CGCG;
5044fb4d8502Sjsg 
5045fb4d8502Sjsg 	/* AMD_CG_SUPPORT_GFX_CGLS */
5046fb4d8502Sjsg 	if (data & RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK)
5047fb4d8502Sjsg 		*flags |= AMD_CG_SUPPORT_GFX_CGLS;
5048fb4d8502Sjsg 
5049fb4d8502Sjsg 	/* AMD_CG_SUPPORT_GFX_RLC_LS */
5050c349dbc7Sjsg 	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL));
5051fb4d8502Sjsg 	if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK)
5052fb4d8502Sjsg 		*flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS;
5053fb4d8502Sjsg 
5054fb4d8502Sjsg 	/* AMD_CG_SUPPORT_GFX_CP_LS */
5055c349dbc7Sjsg 	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL));
5056fb4d8502Sjsg 	if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK)
5057fb4d8502Sjsg 		*flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS;
5058fb4d8502Sjsg 
50591bb76ff1Sjsg 	if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 1)) {
5060fb4d8502Sjsg 		/* AMD_CG_SUPPORT_GFX_3D_CGCG */
5061c349dbc7Sjsg 		data = RREG32_KIQ(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D));
5062fb4d8502Sjsg 		if (data & RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK)
5063fb4d8502Sjsg 			*flags |= AMD_CG_SUPPORT_GFX_3D_CGCG;
5064fb4d8502Sjsg 
5065fb4d8502Sjsg 		/* AMD_CG_SUPPORT_GFX_3D_CGLS */
5066fb4d8502Sjsg 		if (data & RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK)
5067fb4d8502Sjsg 			*flags |= AMD_CG_SUPPORT_GFX_3D_CGLS;
5068fb4d8502Sjsg 	}
5069c349dbc7Sjsg }
5070fb4d8502Sjsg 
gfx_v9_0_ring_get_rptr_gfx(struct amdgpu_ring * ring)5071fb4d8502Sjsg static u64 gfx_v9_0_ring_get_rptr_gfx(struct amdgpu_ring *ring)
5072fb4d8502Sjsg {
50731bb76ff1Sjsg 	return *ring->rptr_cpu_addr; /* gfx9 is 32bit rptr*/
5074fb4d8502Sjsg }
5075fb4d8502Sjsg 
gfx_v9_0_ring_get_wptr_gfx(struct amdgpu_ring * ring)5076fb4d8502Sjsg static u64 gfx_v9_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)
5077fb4d8502Sjsg {
5078fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5079fb4d8502Sjsg 	u64 wptr;
5080fb4d8502Sjsg 
5081fb4d8502Sjsg 	/* XXX check if swapping is necessary on BE */
5082fb4d8502Sjsg 	if (ring->use_doorbell) {
50831bb76ff1Sjsg 		wptr = atomic64_read((atomic64_t *)ring->wptr_cpu_addr);
5084fb4d8502Sjsg 	} else {
5085fb4d8502Sjsg 		wptr = RREG32_SOC15(GC, 0, mmCP_RB0_WPTR);
5086fb4d8502Sjsg 		wptr += (u64)RREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI) << 32;
5087fb4d8502Sjsg 	}
5088fb4d8502Sjsg 
5089fb4d8502Sjsg 	return wptr;
5090fb4d8502Sjsg }
5091fb4d8502Sjsg 
gfx_v9_0_ring_set_wptr_gfx(struct amdgpu_ring * ring)5092fb4d8502Sjsg static void gfx_v9_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
5093fb4d8502Sjsg {
5094fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5095fb4d8502Sjsg 
5096fb4d8502Sjsg 	if (ring->use_doorbell) {
5097fb4d8502Sjsg 		/* XXX check if swapping is necessary on BE */
50981bb76ff1Sjsg 		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, ring->wptr);
5099fb4d8502Sjsg 		WDOORBELL64(ring->doorbell_index, ring->wptr);
5100fb4d8502Sjsg 	} else {
5101fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, lower_32_bits(ring->wptr));
5102fb4d8502Sjsg 		WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, upper_32_bits(ring->wptr));
5103fb4d8502Sjsg 	}
5104fb4d8502Sjsg }
5105fb4d8502Sjsg 
gfx_v9_0_ring_emit_hdp_flush(struct amdgpu_ring * ring)5106fb4d8502Sjsg static void gfx_v9_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
5107fb4d8502Sjsg {
5108fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5109fb4d8502Sjsg 	u32 ref_and_mask, reg_mem_engine;
5110c349dbc7Sjsg 	const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio.hdp_flush_reg;
5111fb4d8502Sjsg 
5112fb4d8502Sjsg 	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {
5113fb4d8502Sjsg 		switch (ring->me) {
5114fb4d8502Sjsg 		case 1:
5115fb4d8502Sjsg 			ref_and_mask = nbio_hf_reg->ref_and_mask_cp2 << ring->pipe;
5116fb4d8502Sjsg 			break;
5117fb4d8502Sjsg 		case 2:
5118fb4d8502Sjsg 			ref_and_mask = nbio_hf_reg->ref_and_mask_cp6 << ring->pipe;
5119fb4d8502Sjsg 			break;
5120fb4d8502Sjsg 		default:
5121fb4d8502Sjsg 			return;
5122fb4d8502Sjsg 		}
5123fb4d8502Sjsg 		reg_mem_engine = 0;
5124fb4d8502Sjsg 	} else {
5125fb4d8502Sjsg 		ref_and_mask = nbio_hf_reg->ref_and_mask_cp0;
5126fb4d8502Sjsg 		reg_mem_engine = 1; /* pfp */
5127fb4d8502Sjsg 	}
5128fb4d8502Sjsg 
5129fb4d8502Sjsg 	gfx_v9_0_wait_reg_mem(ring, reg_mem_engine, 0, 1,
5130c349dbc7Sjsg 			      adev->nbio.funcs->get_hdp_flush_req_offset(adev),
5131c349dbc7Sjsg 			      adev->nbio.funcs->get_hdp_flush_done_offset(adev),
5132fb4d8502Sjsg 			      ref_and_mask, ref_and_mask, 0x20);
5133fb4d8502Sjsg }
5134fb4d8502Sjsg 
gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring * ring,struct amdgpu_job * job,struct amdgpu_ib * ib,uint32_t flags)5135fb4d8502Sjsg static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
5136c349dbc7Sjsg 					struct amdgpu_job *job,
5137fb4d8502Sjsg 					struct amdgpu_ib *ib,
5138c349dbc7Sjsg 					uint32_t flags)
5139fb4d8502Sjsg {
5140c349dbc7Sjsg 	unsigned vmid = AMDGPU_JOB_GET_VMID(job);
5141fb4d8502Sjsg 	u32 header, control = 0;
5142fb4d8502Sjsg 
5143fb4d8502Sjsg 	if (ib->flags & AMDGPU_IB_FLAG_CE)
5144fb4d8502Sjsg 		header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
5145fb4d8502Sjsg 	else
5146fb4d8502Sjsg 		header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
5147fb4d8502Sjsg 
5148fb4d8502Sjsg 	control |= ib->length_dw | (vmid << 24);
5149fb4d8502Sjsg 
5150f005ef32Sjsg 	if (ib->flags & AMDGPU_IB_FLAG_PREEMPT) {
5151fb4d8502Sjsg 		control |= INDIRECT_BUFFER_PRE_ENB(1);
5152fb4d8502Sjsg 
5153f005ef32Sjsg 		if (flags & AMDGPU_IB_PREEMPTED)
5154f005ef32Sjsg 			control |= INDIRECT_BUFFER_PRE_RESUME(1);
5155f005ef32Sjsg 
5156c349dbc7Sjsg 		if (!(ib->flags & AMDGPU_IB_FLAG_CE) && vmid)
5157f005ef32Sjsg 			gfx_v9_0_ring_emit_de_meta(ring,
5158f005ef32Sjsg 						   (!amdgpu_sriov_vf(ring->adev) &&
5159f005ef32Sjsg 						   flags & AMDGPU_IB_PREEMPTED) ?
5160f005ef32Sjsg 						   true : false,
5161f005ef32Sjsg 						   job->gds_size > 0 && job->gds_base != 0);
5162fb4d8502Sjsg 	}
5163fb4d8502Sjsg 
5164fb4d8502Sjsg 	amdgpu_ring_write(ring, header);
5165fb4d8502Sjsg 	BUG_ON(ib->gpu_addr & 0x3); /* Dword align */
5166fb4d8502Sjsg 	amdgpu_ring_write(ring,
5167fb4d8502Sjsg #ifdef __BIG_ENDIAN
5168fb4d8502Sjsg 		(2 << 0) |
5169fb4d8502Sjsg #endif
5170fb4d8502Sjsg 		lower_32_bits(ib->gpu_addr));
5171fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
5172f005ef32Sjsg 	amdgpu_ring_ib_on_emit_cntl(ring);
5173fb4d8502Sjsg 	amdgpu_ring_write(ring, control);
5174fb4d8502Sjsg }
5175fb4d8502Sjsg 
gfx_v9_0_ring_patch_cntl(struct amdgpu_ring * ring,unsigned offset)5176f005ef32Sjsg static void gfx_v9_0_ring_patch_cntl(struct amdgpu_ring *ring,
5177f005ef32Sjsg 				     unsigned offset)
5178f005ef32Sjsg {
5179f005ef32Sjsg 	u32 control = ring->ring[offset];
5180f005ef32Sjsg 
5181f005ef32Sjsg 	control |= INDIRECT_BUFFER_PRE_RESUME(1);
5182f005ef32Sjsg 	ring->ring[offset] = control;
5183f005ef32Sjsg }
5184f005ef32Sjsg 
gfx_v9_0_ring_patch_ce_meta(struct amdgpu_ring * ring,unsigned offset)5185f005ef32Sjsg static void gfx_v9_0_ring_patch_ce_meta(struct amdgpu_ring *ring,
5186f005ef32Sjsg 					unsigned offset)
5187f005ef32Sjsg {
5188f005ef32Sjsg 	struct amdgpu_device *adev = ring->adev;
5189f005ef32Sjsg 	void *ce_payload_cpu_addr;
5190f005ef32Sjsg 	uint64_t payload_offset, payload_size;
5191f005ef32Sjsg 
5192f005ef32Sjsg 	payload_size = sizeof(struct v9_ce_ib_state);
5193f005ef32Sjsg 
5194f005ef32Sjsg 	if (ring->is_mes_queue) {
5195f005ef32Sjsg 		payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5196f005ef32Sjsg 					  gfx[0].gfx_meta_data) +
5197f005ef32Sjsg 			offsetof(struct v9_gfx_meta_data, ce_payload);
5198f005ef32Sjsg 		ce_payload_cpu_addr =
5199f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset);
5200f005ef32Sjsg 	} else {
5201f005ef32Sjsg 		payload_offset = offsetof(struct v9_gfx_meta_data, ce_payload);
5202f005ef32Sjsg 		ce_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset;
5203f005ef32Sjsg 	}
5204f005ef32Sjsg 
5205f005ef32Sjsg 	if (offset + (payload_size >> 2) <= ring->buf_mask + 1) {
5206f005ef32Sjsg 		memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr, payload_size);
5207f005ef32Sjsg 	} else {
5208f005ef32Sjsg 		memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr,
5209f005ef32Sjsg 		       (ring->buf_mask + 1 - offset) << 2);
5210f005ef32Sjsg 		payload_size -= (ring->buf_mask + 1 - offset) << 2;
5211f005ef32Sjsg 		memcpy((void *)&ring->ring[0],
5212f005ef32Sjsg 		       ce_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2),
5213f005ef32Sjsg 		       payload_size);
5214f005ef32Sjsg 	}
5215f005ef32Sjsg }
5216f005ef32Sjsg 
gfx_v9_0_ring_patch_de_meta(struct amdgpu_ring * ring,unsigned offset)5217f005ef32Sjsg static void gfx_v9_0_ring_patch_de_meta(struct amdgpu_ring *ring,
5218f005ef32Sjsg 					unsigned offset)
5219f005ef32Sjsg {
5220f005ef32Sjsg 	struct amdgpu_device *adev = ring->adev;
5221f005ef32Sjsg 	void *de_payload_cpu_addr;
5222f005ef32Sjsg 	uint64_t payload_offset, payload_size;
5223f005ef32Sjsg 
5224f005ef32Sjsg 	payload_size = sizeof(struct v9_de_ib_state);
5225f005ef32Sjsg 
5226f005ef32Sjsg 	if (ring->is_mes_queue) {
5227f005ef32Sjsg 		payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5228f005ef32Sjsg 					  gfx[0].gfx_meta_data) +
5229f005ef32Sjsg 			offsetof(struct v9_gfx_meta_data, de_payload);
5230f005ef32Sjsg 		de_payload_cpu_addr =
5231f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset);
5232f005ef32Sjsg 	} else {
5233f005ef32Sjsg 		payload_offset = offsetof(struct v9_gfx_meta_data, de_payload);
5234f005ef32Sjsg 		de_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset;
5235f005ef32Sjsg 	}
5236f005ef32Sjsg 
5237f005ef32Sjsg 	((struct v9_de_ib_state *)de_payload_cpu_addr)->ib_completion_status =
5238f005ef32Sjsg 		IB_COMPLETION_STATUS_PREEMPTED;
5239f005ef32Sjsg 
5240f005ef32Sjsg 	if (offset + (payload_size >> 2) <= ring->buf_mask + 1) {
5241f005ef32Sjsg 		memcpy((void *)&ring->ring[offset], de_payload_cpu_addr, payload_size);
5242f005ef32Sjsg 	} else {
5243f005ef32Sjsg 		memcpy((void *)&ring->ring[offset], de_payload_cpu_addr,
5244f005ef32Sjsg 		       (ring->buf_mask + 1 - offset) << 2);
5245f005ef32Sjsg 		payload_size -= (ring->buf_mask + 1 - offset) << 2;
5246f005ef32Sjsg 		memcpy((void *)&ring->ring[0],
5247f005ef32Sjsg 		       de_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2),
5248f005ef32Sjsg 		       payload_size);
5249f005ef32Sjsg 	}
5250f005ef32Sjsg }
5251f005ef32Sjsg 
gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring * ring,struct amdgpu_job * job,struct amdgpu_ib * ib,uint32_t flags)5252fb4d8502Sjsg static void gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
5253c349dbc7Sjsg 					  struct amdgpu_job *job,
5254fb4d8502Sjsg 					  struct amdgpu_ib *ib,
5255c349dbc7Sjsg 					  uint32_t flags)
5256fb4d8502Sjsg {
5257c349dbc7Sjsg 	unsigned vmid = AMDGPU_JOB_GET_VMID(job);
5258fb4d8502Sjsg 	u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
5259fb4d8502Sjsg 
5260c349dbc7Sjsg 	/* Currently, there is a high possibility to get wave ID mismatch
5261c349dbc7Sjsg 	 * between ME and GDS, leading to a hw deadlock, because ME generates
5262c349dbc7Sjsg 	 * different wave IDs than the GDS expects. This situation happens
5263c349dbc7Sjsg 	 * randomly when at least 5 compute pipes use GDS ordered append.
5264c349dbc7Sjsg 	 * The wave IDs generated by ME are also wrong after suspend/resume.
5265c349dbc7Sjsg 	 * Those are probably bugs somewhere else in the kernel driver.
5266c349dbc7Sjsg 	 *
5267c349dbc7Sjsg 	 * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME and
5268c349dbc7Sjsg 	 * GDS to 0 for this ring (me/pipe).
5269c349dbc7Sjsg 	 */
5270c349dbc7Sjsg 	if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) {
5271c349dbc7Sjsg 		amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
5272c349dbc7Sjsg 		amdgpu_ring_write(ring, mmGDS_COMPUTE_MAX_WAVE_ID);
5273c349dbc7Sjsg 		amdgpu_ring_write(ring, ring->adev->gds.gds_compute_max_wave_id);
5274c349dbc7Sjsg 	}
5275c349dbc7Sjsg 
5276fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
5277fb4d8502Sjsg 	BUG_ON(ib->gpu_addr & 0x3); /* Dword align */
5278fb4d8502Sjsg 	amdgpu_ring_write(ring,
5279fb4d8502Sjsg #ifdef __BIG_ENDIAN
5280fb4d8502Sjsg 				(2 << 0) |
5281fb4d8502Sjsg #endif
5282fb4d8502Sjsg 				lower_32_bits(ib->gpu_addr));
5283fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
5284fb4d8502Sjsg 	amdgpu_ring_write(ring, control);
5285fb4d8502Sjsg }
5286fb4d8502Sjsg 
gfx_v9_0_ring_emit_fence(struct amdgpu_ring * ring,u64 addr,u64 seq,unsigned flags)5287fb4d8502Sjsg static void gfx_v9_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
5288fb4d8502Sjsg 				     u64 seq, unsigned flags)
5289fb4d8502Sjsg {
5290fb4d8502Sjsg 	bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
5291fb4d8502Sjsg 	bool int_sel = flags & AMDGPU_FENCE_FLAG_INT;
5292fb4d8502Sjsg 	bool writeback = flags & AMDGPU_FENCE_FLAG_TC_WB_ONLY;
5293f005ef32Sjsg 	bool exec = flags & AMDGPU_FENCE_FLAG_EXEC;
5294f005ef32Sjsg 	uint32_t dw2 = 0;
5295fb4d8502Sjsg 
5296fb4d8502Sjsg 	/* RELEASE_MEM - flush caches, send int */
5297fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 6));
5298f005ef32Sjsg 
5299f005ef32Sjsg 	if (writeback) {
5300f005ef32Sjsg 		dw2 = EOP_TC_NC_ACTION_EN;
5301f005ef32Sjsg 	} else {
5302f005ef32Sjsg 		dw2 = EOP_TCL1_ACTION_EN | EOP_TC_ACTION_EN |
5303f005ef32Sjsg 				EOP_TC_MD_ACTION_EN;
5304f005ef32Sjsg 	}
5305f005ef32Sjsg 	dw2 |= EOP_TC_WB_ACTION_EN | EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) |
5306f005ef32Sjsg 				EVENT_INDEX(5);
5307f005ef32Sjsg 	if (exec)
5308f005ef32Sjsg 		dw2 |= EOP_EXEC;
5309f005ef32Sjsg 
5310f005ef32Sjsg 	amdgpu_ring_write(ring, dw2);
5311fb4d8502Sjsg 	amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));
5312fb4d8502Sjsg 
5313fb4d8502Sjsg 	/*
5314fb4d8502Sjsg 	 * the address should be Qword aligned if 64bit write, Dword
5315fb4d8502Sjsg 	 * aligned if only send 32bit data low (discard data high)
5316fb4d8502Sjsg 	 */
5317fb4d8502Sjsg 	if (write64bit)
5318fb4d8502Sjsg 		BUG_ON(addr & 0x7);
5319fb4d8502Sjsg 	else
5320fb4d8502Sjsg 		BUG_ON(addr & 0x3);
5321fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(addr));
5322fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(addr));
5323fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(seq));
5324fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(seq));
5325fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
5326fb4d8502Sjsg }
5327fb4d8502Sjsg 
gfx_v9_0_ring_emit_pipeline_sync(struct amdgpu_ring * ring)5328fb4d8502Sjsg static void gfx_v9_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
5329fb4d8502Sjsg {
5330fb4d8502Sjsg 	int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
5331fb4d8502Sjsg 	uint32_t seq = ring->fence_drv.sync_seq;
5332fb4d8502Sjsg 	uint64_t addr = ring->fence_drv.gpu_addr;
5333fb4d8502Sjsg 
5334fb4d8502Sjsg 	gfx_v9_0_wait_reg_mem(ring, usepfp, 1, 0,
5335fb4d8502Sjsg 			      lower_32_bits(addr), upper_32_bits(addr),
5336fb4d8502Sjsg 			      seq, 0xffffffff, 4);
5337fb4d8502Sjsg }
5338fb4d8502Sjsg 
gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring * ring,unsigned vmid,uint64_t pd_addr)5339fb4d8502Sjsg static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
5340fb4d8502Sjsg 					unsigned vmid, uint64_t pd_addr)
5341fb4d8502Sjsg {
5342fb4d8502Sjsg 	amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
5343fb4d8502Sjsg 
5344fb4d8502Sjsg 	/* compute doesn't have PFP */
5345fb4d8502Sjsg 	if (ring->funcs->type == AMDGPU_RING_TYPE_GFX) {
5346fb4d8502Sjsg 		/* sync PFP to ME, otherwise we might get invalid PFP reads */
5347fb4d8502Sjsg 		amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
5348fb4d8502Sjsg 		amdgpu_ring_write(ring, 0x0);
5349fb4d8502Sjsg 	}
5350fb4d8502Sjsg }
5351fb4d8502Sjsg 
gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring * ring)5352fb4d8502Sjsg static u64 gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring *ring)
5353fb4d8502Sjsg {
53541bb76ff1Sjsg 	return *ring->rptr_cpu_addr; /* gfx9 hardware is 32bit rptr */
5355fb4d8502Sjsg }
5356fb4d8502Sjsg 
gfx_v9_0_ring_get_wptr_compute(struct amdgpu_ring * ring)5357fb4d8502Sjsg static u64 gfx_v9_0_ring_get_wptr_compute(struct amdgpu_ring *ring)
5358fb4d8502Sjsg {
5359fb4d8502Sjsg 	u64 wptr;
5360fb4d8502Sjsg 
5361fb4d8502Sjsg 	/* XXX check if swapping is necessary on BE */
5362fb4d8502Sjsg 	if (ring->use_doorbell)
53631bb76ff1Sjsg 		wptr = atomic64_read((atomic64_t *)ring->wptr_cpu_addr);
5364fb4d8502Sjsg 	else
5365fb4d8502Sjsg 		BUG();
5366fb4d8502Sjsg 	return wptr;
5367fb4d8502Sjsg }
5368fb4d8502Sjsg 
gfx_v9_0_ring_set_wptr_compute(struct amdgpu_ring * ring)5369fb4d8502Sjsg static void gfx_v9_0_ring_set_wptr_compute(struct amdgpu_ring *ring)
5370fb4d8502Sjsg {
5371fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5372fb4d8502Sjsg 
5373fb4d8502Sjsg 	/* XXX check if swapping is necessary on BE */
5374fb4d8502Sjsg 	if (ring->use_doorbell) {
53751bb76ff1Sjsg 		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, ring->wptr);
5376fb4d8502Sjsg 		WDOORBELL64(ring->doorbell_index, ring->wptr);
5377fb4d8502Sjsg 	} else{
5378fb4d8502Sjsg 		BUG(); /* only DOORBELL method supported on gfx9 now */
5379fb4d8502Sjsg 	}
5380fb4d8502Sjsg }
5381fb4d8502Sjsg 
gfx_v9_0_ring_emit_fence_kiq(struct amdgpu_ring * ring,u64 addr,u64 seq,unsigned int flags)5382fb4d8502Sjsg static void gfx_v9_0_ring_emit_fence_kiq(struct amdgpu_ring *ring, u64 addr,
5383fb4d8502Sjsg 					 u64 seq, unsigned int flags)
5384fb4d8502Sjsg {
5385fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5386fb4d8502Sjsg 
5387fb4d8502Sjsg 	/* we only allocate 32bit for each seq wb address */
5388fb4d8502Sjsg 	BUG_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
5389fb4d8502Sjsg 
5390fb4d8502Sjsg 	/* write fence seq to the "addr" */
5391fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5392fb4d8502Sjsg 	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5393fb4d8502Sjsg 				 WRITE_DATA_DST_SEL(5) | WR_CONFIRM));
5394fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(addr));
5395fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(addr));
5396fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(seq));
5397fb4d8502Sjsg 
5398fb4d8502Sjsg 	if (flags & AMDGPU_FENCE_FLAG_INT) {
5399fb4d8502Sjsg 		/* set register to trigger INT */
5400fb4d8502Sjsg 		amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5401fb4d8502Sjsg 		amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
5402fb4d8502Sjsg 					 WRITE_DATA_DST_SEL(0) | WR_CONFIRM));
5403fb4d8502Sjsg 		amdgpu_ring_write(ring, SOC15_REG_OFFSET(GC, 0, mmCPC_INT_STATUS));
5404fb4d8502Sjsg 		amdgpu_ring_write(ring, 0);
5405fb4d8502Sjsg 		amdgpu_ring_write(ring, 0x20000000); /* src_id is 178 */
5406fb4d8502Sjsg 	}
5407fb4d8502Sjsg }
5408fb4d8502Sjsg 
gfx_v9_ring_emit_sb(struct amdgpu_ring * ring)5409fb4d8502Sjsg static void gfx_v9_ring_emit_sb(struct amdgpu_ring *ring)
5410fb4d8502Sjsg {
5411fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
5412fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
5413fb4d8502Sjsg }
5414fb4d8502Sjsg 
gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring * ring,bool resume)5415f005ef32Sjsg static void gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume)
5416fb4d8502Sjsg {
5417f005ef32Sjsg 	struct amdgpu_device *adev = ring->adev;
5418fb4d8502Sjsg 	struct v9_ce_ib_state ce_payload = {0};
5419f005ef32Sjsg 	uint64_t offset, ce_payload_gpu_addr;
5420f005ef32Sjsg 	void *ce_payload_cpu_addr;
5421fb4d8502Sjsg 	int cnt;
5422fb4d8502Sjsg 
5423fb4d8502Sjsg 	cnt = (sizeof(ce_payload) >> 2) + 4 - 2;
5424f005ef32Sjsg 
5425f005ef32Sjsg 	if (ring->is_mes_queue) {
5426f005ef32Sjsg 		offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5427f005ef32Sjsg 				  gfx[0].gfx_meta_data) +
5428f005ef32Sjsg 			offsetof(struct v9_gfx_meta_data, ce_payload);
5429f005ef32Sjsg 		ce_payload_gpu_addr =
5430f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset);
5431f005ef32Sjsg 		ce_payload_cpu_addr =
5432f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_cpu_addr(ring, offset);
5433f005ef32Sjsg 	} else {
5434f005ef32Sjsg 		offset = offsetof(struct v9_gfx_meta_data, ce_payload);
5435f005ef32Sjsg 		ce_payload_gpu_addr = amdgpu_csa_vaddr(ring->adev) + offset;
5436f005ef32Sjsg 		ce_payload_cpu_addr = adev->virt.csa_cpu_addr + offset;
5437f005ef32Sjsg 	}
5438fb4d8502Sjsg 
5439fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, cnt));
5440fb4d8502Sjsg 	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) |
5441fb4d8502Sjsg 				 WRITE_DATA_DST_SEL(8) |
5442fb4d8502Sjsg 				 WR_CONFIRM) |
5443fb4d8502Sjsg 				 WRITE_DATA_CACHE_POLICY(0));
5444f005ef32Sjsg 	amdgpu_ring_write(ring, lower_32_bits(ce_payload_gpu_addr));
5445f005ef32Sjsg 	amdgpu_ring_write(ring, upper_32_bits(ce_payload_gpu_addr));
5446f005ef32Sjsg 
5447f005ef32Sjsg 	amdgpu_ring_ib_on_emit_ce(ring);
5448f005ef32Sjsg 
5449f005ef32Sjsg 	if (resume)
5450f005ef32Sjsg 		amdgpu_ring_write_multiple(ring, ce_payload_cpu_addr,
5451f005ef32Sjsg 					   sizeof(ce_payload) >> 2);
5452f005ef32Sjsg 	else
5453f005ef32Sjsg 		amdgpu_ring_write_multiple(ring, (void *)&ce_payload,
5454f005ef32Sjsg 					   sizeof(ce_payload) >> 2);
5455fb4d8502Sjsg }
5456fb4d8502Sjsg 
gfx_v9_0_ring_preempt_ib(struct amdgpu_ring * ring)5457f005ef32Sjsg static int gfx_v9_0_ring_preempt_ib(struct amdgpu_ring *ring)
5458fb4d8502Sjsg {
5459f005ef32Sjsg 	int i, r = 0;
5460f005ef32Sjsg 	struct amdgpu_device *adev = ring->adev;
5461f005ef32Sjsg 	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
5462f005ef32Sjsg 	struct amdgpu_ring *kiq_ring = &kiq->ring;
5463f005ef32Sjsg 	unsigned long flags;
5464f005ef32Sjsg 
5465f005ef32Sjsg 	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
5466f005ef32Sjsg 		return -EINVAL;
5467f005ef32Sjsg 
5468f005ef32Sjsg 	spin_lock_irqsave(&kiq->ring_lock, flags);
5469f005ef32Sjsg 
5470f005ef32Sjsg 	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
5471f005ef32Sjsg 		spin_unlock_irqrestore(&kiq->ring_lock, flags);
5472f005ef32Sjsg 		return -ENOMEM;
5473f005ef32Sjsg 	}
5474f005ef32Sjsg 
5475f005ef32Sjsg 	/* assert preemption condition */
5476f005ef32Sjsg 	amdgpu_ring_set_preempt_cond_exec(ring, false);
5477f005ef32Sjsg 
5478f005ef32Sjsg 	ring->trail_seq += 1;
5479f005ef32Sjsg 	amdgpu_ring_alloc(ring, 13);
5480f005ef32Sjsg 	gfx_v9_0_ring_emit_fence(ring, ring->trail_fence_gpu_addr,
5481f005ef32Sjsg 				 ring->trail_seq, AMDGPU_FENCE_FLAG_EXEC | AMDGPU_FENCE_FLAG_INT);
5482f005ef32Sjsg 
5483f005ef32Sjsg 	/* assert IB preemption, emit the trailing fence */
5484f005ef32Sjsg 	kiq->pmf->kiq_unmap_queues(kiq_ring, ring, PREEMPT_QUEUES_NO_UNMAP,
5485f005ef32Sjsg 				   ring->trail_fence_gpu_addr,
5486f005ef32Sjsg 				   ring->trail_seq);
5487f005ef32Sjsg 
5488f005ef32Sjsg 	amdgpu_ring_commit(kiq_ring);
5489f005ef32Sjsg 	spin_unlock_irqrestore(&kiq->ring_lock, flags);
5490f005ef32Sjsg 
5491f005ef32Sjsg 	/* poll the trailing fence */
5492f005ef32Sjsg 	for (i = 0; i < adev->usec_timeout; i++) {
5493f005ef32Sjsg 		if (ring->trail_seq ==
5494f005ef32Sjsg 			le32_to_cpu(*ring->trail_fence_cpu_addr))
5495f005ef32Sjsg 			break;
5496f005ef32Sjsg 		udelay(1);
5497f005ef32Sjsg 	}
5498f005ef32Sjsg 
5499f005ef32Sjsg 	if (i >= adev->usec_timeout) {
5500f005ef32Sjsg 		r = -EINVAL;
5501f005ef32Sjsg 		DRM_WARN("ring %d timeout to preempt ib\n", ring->idx);
5502f005ef32Sjsg 	}
5503f005ef32Sjsg 
5504f005ef32Sjsg 	/*reset the CP_VMID_PREEMPT after trailing fence*/
5505f005ef32Sjsg 	amdgpu_ring_emit_wreg(ring,
5506f005ef32Sjsg 			      SOC15_REG_OFFSET(GC, 0, mmCP_VMID_PREEMPT),
5507f005ef32Sjsg 			      0x0);
5508f005ef32Sjsg 	amdgpu_ring_commit(ring);
5509f005ef32Sjsg 
5510f005ef32Sjsg 	/* deassert preemption condition */
5511f005ef32Sjsg 	amdgpu_ring_set_preempt_cond_exec(ring, true);
5512f005ef32Sjsg 	return r;
5513f005ef32Sjsg }
5514f005ef32Sjsg 
gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring * ring,bool resume,bool usegds)5515f005ef32Sjsg static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bool usegds)
5516f005ef32Sjsg {
5517f005ef32Sjsg 	struct amdgpu_device *adev = ring->adev;
5518fb4d8502Sjsg 	struct v9_de_ib_state de_payload = {0};
5519f005ef32Sjsg 	uint64_t offset, gds_addr, de_payload_gpu_addr;
5520f005ef32Sjsg 	void *de_payload_cpu_addr;
5521fb4d8502Sjsg 	int cnt;
5522fb4d8502Sjsg 
5523f005ef32Sjsg 	if (ring->is_mes_queue) {
5524f005ef32Sjsg 		offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5525f005ef32Sjsg 				  gfx[0].gfx_meta_data) +
5526f005ef32Sjsg 			offsetof(struct v9_gfx_meta_data, de_payload);
5527f005ef32Sjsg 		de_payload_gpu_addr =
5528f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset);
5529f005ef32Sjsg 		de_payload_cpu_addr =
5530f005ef32Sjsg 			amdgpu_mes_ctx_get_offs_cpu_addr(ring, offset);
5531f005ef32Sjsg 
5532f005ef32Sjsg 		offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5533f005ef32Sjsg 				  gfx[0].gds_backup) +
5534f005ef32Sjsg 			offsetof(struct v9_gfx_meta_data, de_payload);
5535f005ef32Sjsg 		gds_addr = amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset);
5536f005ef32Sjsg 	} else {
5537f005ef32Sjsg 		offset = offsetof(struct v9_gfx_meta_data, de_payload);
5538f005ef32Sjsg 		de_payload_gpu_addr = amdgpu_csa_vaddr(ring->adev) + offset;
5539f005ef32Sjsg 		de_payload_cpu_addr = adev->virt.csa_cpu_addr + offset;
5540f005ef32Sjsg 
5541f005ef32Sjsg 		gds_addr = ALIGN(amdgpu_csa_vaddr(ring->adev) +
5542f005ef32Sjsg 				 AMDGPU_CSA_SIZE - adev->gds.gds_size,
5543f005ef32Sjsg 				 PAGE_SIZE);
5544f005ef32Sjsg 	}
5545f005ef32Sjsg 
5546f005ef32Sjsg 	if (usegds) {
5547fb4d8502Sjsg 		de_payload.gds_backup_addrlo = lower_32_bits(gds_addr);
5548fb4d8502Sjsg 		de_payload.gds_backup_addrhi = upper_32_bits(gds_addr);
5549f005ef32Sjsg 	}
5550fb4d8502Sjsg 
5551fb4d8502Sjsg 	cnt = (sizeof(de_payload) >> 2) + 4 - 2;
5552fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, cnt));
5553fb4d8502Sjsg 	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
5554fb4d8502Sjsg 				 WRITE_DATA_DST_SEL(8) |
5555fb4d8502Sjsg 				 WR_CONFIRM) |
5556fb4d8502Sjsg 				 WRITE_DATA_CACHE_POLICY(0));
5557f005ef32Sjsg 	amdgpu_ring_write(ring, lower_32_bits(de_payload_gpu_addr));
5558f005ef32Sjsg 	amdgpu_ring_write(ring, upper_32_bits(de_payload_gpu_addr));
5559f005ef32Sjsg 
5560f005ef32Sjsg 	amdgpu_ring_ib_on_emit_de(ring);
5561f005ef32Sjsg 	if (resume)
5562f005ef32Sjsg 		amdgpu_ring_write_multiple(ring, de_payload_cpu_addr,
5563f005ef32Sjsg 					   sizeof(de_payload) >> 2);
5564f005ef32Sjsg 	else
5565f005ef32Sjsg 		amdgpu_ring_write_multiple(ring, (void *)&de_payload,
5566f005ef32Sjsg 					   sizeof(de_payload) >> 2);
5567fb4d8502Sjsg }
5568fb4d8502Sjsg 
gfx_v9_0_ring_emit_frame_cntl(struct amdgpu_ring * ring,bool start,bool secure)5569ad8b1aafSjsg static void gfx_v9_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start,
5570ad8b1aafSjsg 				   bool secure)
5571fb4d8502Sjsg {
5572ad8b1aafSjsg 	uint32_t v = secure ? FRAME_TMZ : 0;
5573ad8b1aafSjsg 
5574fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_FRAME_CONTROL, 0));
5575ad8b1aafSjsg 	amdgpu_ring_write(ring, v | FRAME_CMD(start ? 0 : 1));
5576fb4d8502Sjsg }
5577fb4d8502Sjsg 
gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring * ring,uint32_t flags)5578fb4d8502Sjsg static void gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)
5579fb4d8502Sjsg {
5580fb4d8502Sjsg 	uint32_t dw2 = 0;
5581fb4d8502Sjsg 
5582f005ef32Sjsg 	gfx_v9_0_ring_emit_ce_meta(ring,
5583f005ef32Sjsg 				   (!amdgpu_sriov_vf(ring->adev) &&
5584f005ef32Sjsg 				   flags & AMDGPU_IB_PREEMPTED) ? true : false);
5585fb4d8502Sjsg 
5586fb4d8502Sjsg 	dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */
5587fb4d8502Sjsg 	if (flags & AMDGPU_HAVE_CTX_SWITCH) {
5588fb4d8502Sjsg 		/* set load_global_config & load_global_uconfig */
5589fb4d8502Sjsg 		dw2 |= 0x8001;
5590fb4d8502Sjsg 		/* set load_cs_sh_regs */
5591fb4d8502Sjsg 		dw2 |= 0x01000000;
5592fb4d8502Sjsg 		/* set load_per_context_state & load_gfx_sh_regs for GFX */
5593fb4d8502Sjsg 		dw2 |= 0x10002;
5594fb4d8502Sjsg 
5595fb4d8502Sjsg 		/* set load_ce_ram if preamble presented */
5596fb4d8502Sjsg 		if (AMDGPU_PREAMBLE_IB_PRESENT & flags)
5597fb4d8502Sjsg 			dw2 |= 0x10000000;
5598fb4d8502Sjsg 	} else {
5599fb4d8502Sjsg 		/* still load_ce_ram if this is the first time preamble presented
5600fb4d8502Sjsg 		 * although there is no context switch happens.
5601fb4d8502Sjsg 		 */
5602fb4d8502Sjsg 		if (AMDGPU_PREAMBLE_IB_PRESENT_FIRST & flags)
5603fb4d8502Sjsg 			dw2 |= 0x10000000;
5604fb4d8502Sjsg 	}
5605fb4d8502Sjsg 
5606fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
5607fb4d8502Sjsg 	amdgpu_ring_write(ring, dw2);
5608fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
5609fb4d8502Sjsg }
5610fb4d8502Sjsg 
gfx_v9_0_ring_emit_init_cond_exec(struct amdgpu_ring * ring)5611fb4d8502Sjsg static unsigned gfx_v9_0_ring_emit_init_cond_exec(struct amdgpu_ring *ring)
5612fb4d8502Sjsg {
5613fb4d8502Sjsg 	unsigned ret;
5614fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_COND_EXEC, 3));
5615fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(ring->cond_exe_gpu_addr));
5616fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(ring->cond_exe_gpu_addr));
5617fb4d8502Sjsg 	amdgpu_ring_write(ring, 0); /* discard following DWs if *cond_exec_gpu_addr==0 */
5618fb4d8502Sjsg 	ret = ring->wptr & ring->buf_mask;
5619fb4d8502Sjsg 	amdgpu_ring_write(ring, 0x55aa55aa); /* patch dummy value later */
5620fb4d8502Sjsg 	return ret;
5621fb4d8502Sjsg }
5622fb4d8502Sjsg 
gfx_v9_0_ring_emit_patch_cond_exec(struct amdgpu_ring * ring,unsigned offset)5623fb4d8502Sjsg static void gfx_v9_0_ring_emit_patch_cond_exec(struct amdgpu_ring *ring, unsigned offset)
5624fb4d8502Sjsg {
5625fb4d8502Sjsg 	unsigned cur;
5626fb4d8502Sjsg 	BUG_ON(offset > ring->buf_mask);
5627fb4d8502Sjsg 	BUG_ON(ring->ring[offset] != 0x55aa55aa);
5628fb4d8502Sjsg 
56291bb76ff1Sjsg 	cur = (ring->wptr - 1) & ring->buf_mask;
5630fb4d8502Sjsg 	if (likely(cur > offset))
5631fb4d8502Sjsg 		ring->ring[offset] = cur - offset;
5632fb4d8502Sjsg 	else
5633fb4d8502Sjsg 		ring->ring[offset] = (ring->ring_size>>2) - offset + cur;
5634fb4d8502Sjsg }
5635fb4d8502Sjsg 
gfx_v9_0_ring_emit_rreg(struct amdgpu_ring * ring,uint32_t reg,uint32_t reg_val_offs)5636ad8b1aafSjsg static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg,
5637ad8b1aafSjsg 				    uint32_t reg_val_offs)
5638fb4d8502Sjsg {
5639fb4d8502Sjsg 	struct amdgpu_device *adev = ring->adev;
5640fb4d8502Sjsg 
5641fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));
5642fb4d8502Sjsg 	amdgpu_ring_write(ring, 0 |	/* src: register*/
5643fb4d8502Sjsg 				(5 << 8) |	/* dst: memory */
5644fb4d8502Sjsg 				(1 << 20));	/* write confirm */
5645fb4d8502Sjsg 	amdgpu_ring_write(ring, reg);
5646fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
5647fb4d8502Sjsg 	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr +
5648ad8b1aafSjsg 				reg_val_offs * 4));
5649fb4d8502Sjsg 	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr +
5650ad8b1aafSjsg 				reg_val_offs * 4));
5651fb4d8502Sjsg }
5652fb4d8502Sjsg 
gfx_v9_0_ring_emit_wreg(struct amdgpu_ring * ring,uint32_t reg,uint32_t val)5653fb4d8502Sjsg static void gfx_v9_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg,
5654fb4d8502Sjsg 				    uint32_t val)
5655fb4d8502Sjsg {
5656fb4d8502Sjsg 	uint32_t cmd = 0;
5657fb4d8502Sjsg 
5658fb4d8502Sjsg 	switch (ring->funcs->type) {
5659fb4d8502Sjsg 	case AMDGPU_RING_TYPE_GFX:
5660fb4d8502Sjsg 		cmd = WRITE_DATA_ENGINE_SEL(1) | WR_CONFIRM;
5661fb4d8502Sjsg 		break;
5662fb4d8502Sjsg 	case AMDGPU_RING_TYPE_KIQ:
5663fb4d8502Sjsg 		cmd = (1 << 16); /* no inc addr */
5664fb4d8502Sjsg 		break;
5665fb4d8502Sjsg 	default:
5666fb4d8502Sjsg 		cmd = WR_CONFIRM;
5667fb4d8502Sjsg 		break;
5668fb4d8502Sjsg 	}
5669fb4d8502Sjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
5670fb4d8502Sjsg 	amdgpu_ring_write(ring, cmd);
5671fb4d8502Sjsg 	amdgpu_ring_write(ring, reg);
5672fb4d8502Sjsg 	amdgpu_ring_write(ring, 0);
5673fb4d8502Sjsg 	amdgpu_ring_write(ring, val);
5674fb4d8502Sjsg }
5675fb4d8502Sjsg 
gfx_v9_0_ring_emit_reg_wait(struct amdgpu_ring * ring,uint32_t reg,uint32_t val,uint32_t mask)5676fb4d8502Sjsg static void gfx_v9_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
5677fb4d8502Sjsg 					uint32_t val, uint32_t mask)
5678fb4d8502Sjsg {
5679fb4d8502Sjsg 	gfx_v9_0_wait_reg_mem(ring, 0, 0, 0, reg, 0, val, mask, 0x20);
5680fb4d8502Sjsg }
5681fb4d8502Sjsg 
gfx_v9_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring * ring,uint32_t reg0,uint32_t reg1,uint32_t ref,uint32_t mask)5682fb4d8502Sjsg static void gfx_v9_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,
5683fb4d8502Sjsg 						  uint32_t reg0, uint32_t reg1,
5684fb4d8502Sjsg 						  uint32_t ref, uint32_t mask)
5685fb4d8502Sjsg {
5686fb4d8502Sjsg 	int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
5687c349dbc7Sjsg 	struct amdgpu_device *adev = ring->adev;
5688c349dbc7Sjsg 	bool fw_version_ok = (ring->funcs->type == AMDGPU_RING_TYPE_GFX) ?
5689c349dbc7Sjsg 		adev->gfx.me_fw_write_wait : adev->gfx.mec_fw_write_wait;
5690fb4d8502Sjsg 
5691c349dbc7Sjsg 	if (fw_version_ok)
5692fb4d8502Sjsg 		gfx_v9_0_wait_reg_mem(ring, usepfp, 0, 1, reg0, reg1,
5693fb4d8502Sjsg 				      ref, mask, 0x20);
5694fb4d8502Sjsg 	else
5695fb4d8502Sjsg 		amdgpu_ring_emit_reg_write_reg_wait_helper(ring, reg0, reg1,
5696fb4d8502Sjsg 							   ref, mask);
5697fb4d8502Sjsg }
5698fb4d8502Sjsg 
gfx_v9_0_ring_soft_recovery(struct amdgpu_ring * ring,unsigned vmid)5699c349dbc7Sjsg static void gfx_v9_0_ring_soft_recovery(struct amdgpu_ring *ring, unsigned vmid)
5700c349dbc7Sjsg {
5701c349dbc7Sjsg 	struct amdgpu_device *adev = ring->adev;
5702c349dbc7Sjsg 	uint32_t value = 0;
5703c349dbc7Sjsg 
5704c349dbc7Sjsg 	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03);
5705c349dbc7Sjsg 	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01);
5706c349dbc7Sjsg 	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1);
5707c349dbc7Sjsg 	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid);
5708c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmSQ_CMD, value);
5709c349dbc7Sjsg }
5710c349dbc7Sjsg 
gfx_v9_0_set_gfx_eop_interrupt_state(struct amdgpu_device * adev,enum amdgpu_interrupt_state state)5711fb4d8502Sjsg static void gfx_v9_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
5712fb4d8502Sjsg 						 enum amdgpu_interrupt_state state)
5713fb4d8502Sjsg {
5714fb4d8502Sjsg 	switch (state) {
5715fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_DISABLE:
5716fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_ENABLE:
5717fb4d8502Sjsg 		WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0,
5718fb4d8502Sjsg 			       TIME_STAMP_INT_ENABLE,
5719fb4d8502Sjsg 			       state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);
5720fb4d8502Sjsg 		break;
5721fb4d8502Sjsg 	default:
5722fb4d8502Sjsg 		break;
5723fb4d8502Sjsg 	}
5724fb4d8502Sjsg }
5725fb4d8502Sjsg 
gfx_v9_0_set_compute_eop_interrupt_state(struct amdgpu_device * adev,int me,int pipe,enum amdgpu_interrupt_state state)5726fb4d8502Sjsg static void gfx_v9_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
5727fb4d8502Sjsg 						     int me, int pipe,
5728fb4d8502Sjsg 						     enum amdgpu_interrupt_state state)
5729fb4d8502Sjsg {
5730fb4d8502Sjsg 	u32 mec_int_cntl, mec_int_cntl_reg;
5731fb4d8502Sjsg 
5732fb4d8502Sjsg 	/*
5733fb4d8502Sjsg 	 * amdgpu controls only the first MEC. That's why this function only
5734fb4d8502Sjsg 	 * handles the setting of interrupts for this specific MEC. All other
5735fb4d8502Sjsg 	 * pipes' interrupts are set by amdkfd.
5736fb4d8502Sjsg 	 */
5737fb4d8502Sjsg 
5738fb4d8502Sjsg 	if (me == 1) {
5739fb4d8502Sjsg 		switch (pipe) {
5740fb4d8502Sjsg 		case 0:
5741fb4d8502Sjsg 			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE0_INT_CNTL);
5742fb4d8502Sjsg 			break;
5743fb4d8502Sjsg 		case 1:
5744fb4d8502Sjsg 			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE1_INT_CNTL);
5745fb4d8502Sjsg 			break;
5746fb4d8502Sjsg 		case 2:
5747fb4d8502Sjsg 			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE2_INT_CNTL);
5748fb4d8502Sjsg 			break;
5749fb4d8502Sjsg 		case 3:
5750fb4d8502Sjsg 			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE3_INT_CNTL);
5751fb4d8502Sjsg 			break;
5752fb4d8502Sjsg 		default:
5753fb4d8502Sjsg 			DRM_DEBUG("invalid pipe %d\n", pipe);
5754fb4d8502Sjsg 			return;
5755fb4d8502Sjsg 		}
5756fb4d8502Sjsg 	} else {
5757fb4d8502Sjsg 		DRM_DEBUG("invalid me %d\n", me);
5758fb4d8502Sjsg 		return;
5759fb4d8502Sjsg 	}
5760fb4d8502Sjsg 
5761fb4d8502Sjsg 	switch (state) {
5762fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_DISABLE:
57631bb76ff1Sjsg 		mec_int_cntl = RREG32_SOC15_IP(GC,mec_int_cntl_reg);
5764fb4d8502Sjsg 		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
5765fb4d8502Sjsg 					     TIME_STAMP_INT_ENABLE, 0);
57661bb76ff1Sjsg 		WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl);
5767fb4d8502Sjsg 		break;
5768fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_ENABLE:
57691bb76ff1Sjsg 		mec_int_cntl = RREG32_SOC15_IP(GC, mec_int_cntl_reg);
5770fb4d8502Sjsg 		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
5771fb4d8502Sjsg 					     TIME_STAMP_INT_ENABLE, 1);
57721bb76ff1Sjsg 		WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl);
5773fb4d8502Sjsg 		break;
5774fb4d8502Sjsg 	default:
5775fb4d8502Sjsg 		break;
5776fb4d8502Sjsg 	}
5777fb4d8502Sjsg }
5778fb4d8502Sjsg 
gfx_v9_0_set_priv_reg_fault_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)5779fb4d8502Sjsg static int gfx_v9_0_set_priv_reg_fault_state(struct amdgpu_device *adev,
5780fb4d8502Sjsg 					     struct amdgpu_irq_src *source,
5781fb4d8502Sjsg 					     unsigned type,
5782fb4d8502Sjsg 					     enum amdgpu_interrupt_state state)
5783fb4d8502Sjsg {
5784fb4d8502Sjsg 	switch (state) {
5785fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_DISABLE:
5786fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_ENABLE:
5787fb4d8502Sjsg 		WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0,
5788fb4d8502Sjsg 			       PRIV_REG_INT_ENABLE,
5789fb4d8502Sjsg 			       state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);
5790fb4d8502Sjsg 		break;
5791fb4d8502Sjsg 	default:
5792fb4d8502Sjsg 		break;
5793fb4d8502Sjsg 	}
5794fb4d8502Sjsg 
5795fb4d8502Sjsg 	return 0;
5796fb4d8502Sjsg }
5797fb4d8502Sjsg 
gfx_v9_0_set_priv_inst_fault_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)5798fb4d8502Sjsg static int gfx_v9_0_set_priv_inst_fault_state(struct amdgpu_device *adev,
5799fb4d8502Sjsg 					      struct amdgpu_irq_src *source,
5800fb4d8502Sjsg 					      unsigned type,
5801fb4d8502Sjsg 					      enum amdgpu_interrupt_state state)
5802fb4d8502Sjsg {
5803fb4d8502Sjsg 	switch (state) {
5804fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_DISABLE:
5805fb4d8502Sjsg 	case AMDGPU_IRQ_STATE_ENABLE:
5806fb4d8502Sjsg 		WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0,
5807fb4d8502Sjsg 			       PRIV_INSTR_INT_ENABLE,
5808fb4d8502Sjsg 			       state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);
58095ca02815Sjsg 		break;
5810fb4d8502Sjsg 	default:
5811fb4d8502Sjsg 		break;
5812fb4d8502Sjsg 	}
5813fb4d8502Sjsg 
5814fb4d8502Sjsg 	return 0;
5815fb4d8502Sjsg }
5816fb4d8502Sjsg 
5817c349dbc7Sjsg #define ENABLE_ECC_ON_ME_PIPE(me, pipe)				\
5818c349dbc7Sjsg 	WREG32_FIELD15(GC, 0, CP_ME##me##_PIPE##pipe##_INT_CNTL,\
5819c349dbc7Sjsg 			CP_ECC_ERROR_INT_ENABLE, 1)
5820c349dbc7Sjsg 
5821c349dbc7Sjsg #define DISABLE_ECC_ON_ME_PIPE(me, pipe)			\
5822c349dbc7Sjsg 	WREG32_FIELD15(GC, 0, CP_ME##me##_PIPE##pipe##_INT_CNTL,\
5823c349dbc7Sjsg 			CP_ECC_ERROR_INT_ENABLE, 0)
5824c349dbc7Sjsg 
gfx_v9_0_set_cp_ecc_error_state(struct amdgpu_device * adev,struct amdgpu_irq_src * source,unsigned type,enum amdgpu_interrupt_state state)5825c349dbc7Sjsg static int gfx_v9_0_set_cp_ecc_error_state(struct amdgpu_device *adev,
5826c349dbc7Sjsg 					      struct amdgpu_irq_src *source,
5827c349dbc7Sjsg 					      unsigned type,
5828c349dbc7Sjsg 					      enum amdgpu_interrupt_state state)
5829c349dbc7Sjsg {
5830c349dbc7Sjsg 	switch (state) {
5831c349dbc7Sjsg 	case AMDGPU_IRQ_STATE_DISABLE:
5832c349dbc7Sjsg 		WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0,
5833c349dbc7Sjsg 				CP_ECC_ERROR_INT_ENABLE, 0);
5834c349dbc7Sjsg 		DISABLE_ECC_ON_ME_PIPE(1, 0);
5835c349dbc7Sjsg 		DISABLE_ECC_ON_ME_PIPE(1, 1);
5836c349dbc7Sjsg 		DISABLE_ECC_ON_ME_PIPE(1, 2);
5837c349dbc7Sjsg 		DISABLE_ECC_ON_ME_PIPE(1, 3);
5838c349dbc7Sjsg 		break;
5839c349dbc7Sjsg 
5840c349dbc7Sjsg 	case AMDGPU_IRQ_STATE_ENABLE:
5841c349dbc7Sjsg 		WREG32_FIELD15(GC, 0, CP_INT_CNTL_RING0,
5842c349dbc7Sjsg 				CP_ECC_ERROR_INT_ENABLE, 1);
5843c349dbc7Sjsg 		ENABLE_ECC_ON_ME_PIPE(1, 0);
5844c349dbc7Sjsg 		ENABLE_ECC_ON_ME_PIPE(1, 1);
5845c349dbc7Sjsg 		ENABLE_ECC_ON_ME_PIPE(1, 2);
5846c349dbc7Sjsg 		ENABLE_ECC_ON_ME_PIPE(1, 3);
5847c349dbc7Sjsg 		break;
5848c349dbc7Sjsg 	default:
5849c349dbc7Sjsg 		break;
5850c349dbc7Sjsg 	}
5851c349dbc7Sjsg 
5852c349dbc7Sjsg 	return 0;
5853c349dbc7Sjsg }
5854c349dbc7Sjsg 
5855c349dbc7Sjsg 
gfx_v9_0_set_eop_interrupt_state(struct amdgpu_device * adev,struct amdgpu_irq_src * src,unsigned type,enum amdgpu_interrupt_state state)5856fb4d8502Sjsg static int gfx_v9_0_set_eop_interrupt_state(struct amdgpu_device *adev,
5857fb4d8502Sjsg 					    struct amdgpu_irq_src *src,
5858fb4d8502Sjsg 					    unsigned type,
5859fb4d8502Sjsg 					    enum amdgpu_interrupt_state state)
5860fb4d8502Sjsg {
5861fb4d8502Sjsg 	switch (type) {
5862c349dbc7Sjsg 	case AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP:
5863fb4d8502Sjsg 		gfx_v9_0_set_gfx_eop_interrupt_state(adev, state);
5864fb4d8502Sjsg 		break;
5865fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP:
5866fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 1, 0, state);
5867fb4d8502Sjsg 		break;
5868fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP:
5869fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 1, 1, state);
5870fb4d8502Sjsg 		break;
5871fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE2_EOP:
5872fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 1, 2, state);
5873fb4d8502Sjsg 		break;
5874fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE3_EOP:
5875fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 1, 3, state);
5876fb4d8502Sjsg 		break;
5877fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE0_EOP:
5878fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 2, 0, state);
5879fb4d8502Sjsg 		break;
5880fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE1_EOP:
5881fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 2, 1, state);
5882fb4d8502Sjsg 		break;
5883fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE2_EOP:
5884fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 2, 2, state);
5885fb4d8502Sjsg 		break;
5886fb4d8502Sjsg 	case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE3_EOP:
5887fb4d8502Sjsg 		gfx_v9_0_set_compute_eop_interrupt_state(adev, 2, 3, state);
5888fb4d8502Sjsg 		break;
5889fb4d8502Sjsg 	default:
5890fb4d8502Sjsg 		break;
5891fb4d8502Sjsg 	}
5892fb4d8502Sjsg 	return 0;
5893fb4d8502Sjsg }
5894fb4d8502Sjsg 
gfx_v9_0_eop_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)5895fb4d8502Sjsg static int gfx_v9_0_eop_irq(struct amdgpu_device *adev,
5896fb4d8502Sjsg 			    struct amdgpu_irq_src *source,
5897fb4d8502Sjsg 			    struct amdgpu_iv_entry *entry)
5898fb4d8502Sjsg {
5899fb4d8502Sjsg 	int i;
5900fb4d8502Sjsg 	u8 me_id, pipe_id, queue_id;
5901fb4d8502Sjsg 	struct amdgpu_ring *ring;
5902fb4d8502Sjsg 
5903fb4d8502Sjsg 	DRM_DEBUG("IH: CP EOP\n");
5904fb4d8502Sjsg 	me_id = (entry->ring_id & 0x0c) >> 2;
5905fb4d8502Sjsg 	pipe_id = (entry->ring_id & 0x03) >> 0;
5906fb4d8502Sjsg 	queue_id = (entry->ring_id & 0x70) >> 4;
5907fb4d8502Sjsg 
5908fb4d8502Sjsg 	switch (me_id) {
5909fb4d8502Sjsg 	case 0:
5910f005ef32Sjsg 		if (adev->gfx.num_gfx_rings &&
5911f005ef32Sjsg 		    !amdgpu_mcbp_handle_trailing_fence_irq(&adev->gfx.muxer)) {
5912f005ef32Sjsg 			/* Fence signals are handled on the software rings*/
5913f005ef32Sjsg 			for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++)
5914f005ef32Sjsg 				amdgpu_fence_process(&adev->gfx.sw_gfx_ring[i]);
5915f005ef32Sjsg 		}
5916fb4d8502Sjsg 		break;
5917fb4d8502Sjsg 	case 1:
5918fb4d8502Sjsg 	case 2:
5919fb4d8502Sjsg 		for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5920fb4d8502Sjsg 			ring = &adev->gfx.compute_ring[i];
5921fb4d8502Sjsg 			/* Per-queue interrupt is supported for MEC starting from VI.
5922fb4d8502Sjsg 			  * The interrupt can only be enabled/disabled per pipe instead of per queue.
5923fb4d8502Sjsg 			  */
5924fb4d8502Sjsg 			if ((ring->me == me_id) && (ring->pipe == pipe_id) && (ring->queue == queue_id))
5925fb4d8502Sjsg 				amdgpu_fence_process(ring);
5926fb4d8502Sjsg 		}
5927fb4d8502Sjsg 		break;
5928fb4d8502Sjsg 	}
5929fb4d8502Sjsg 	return 0;
5930fb4d8502Sjsg }
5931fb4d8502Sjsg 
gfx_v9_0_fault(struct amdgpu_device * adev,struct amdgpu_iv_entry * entry)5932c349dbc7Sjsg static void gfx_v9_0_fault(struct amdgpu_device *adev,
5933c349dbc7Sjsg 			   struct amdgpu_iv_entry *entry)
5934c349dbc7Sjsg {
5935c349dbc7Sjsg 	u8 me_id, pipe_id, queue_id;
5936c349dbc7Sjsg 	struct amdgpu_ring *ring;
5937c349dbc7Sjsg 	int i;
5938c349dbc7Sjsg 
5939c349dbc7Sjsg 	me_id = (entry->ring_id & 0x0c) >> 2;
5940c349dbc7Sjsg 	pipe_id = (entry->ring_id & 0x03) >> 0;
5941c349dbc7Sjsg 	queue_id = (entry->ring_id & 0x70) >> 4;
5942c349dbc7Sjsg 
5943c349dbc7Sjsg 	switch (me_id) {
5944c349dbc7Sjsg 	case 0:
5945c349dbc7Sjsg 		drm_sched_fault(&adev->gfx.gfx_ring[0].sched);
5946c349dbc7Sjsg 		break;
5947c349dbc7Sjsg 	case 1:
5948c349dbc7Sjsg 	case 2:
5949c349dbc7Sjsg 		for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5950c349dbc7Sjsg 			ring = &adev->gfx.compute_ring[i];
5951c349dbc7Sjsg 			if (ring->me == me_id && ring->pipe == pipe_id &&
5952c349dbc7Sjsg 			    ring->queue == queue_id)
5953c349dbc7Sjsg 				drm_sched_fault(&ring->sched);
5954c349dbc7Sjsg 		}
5955c349dbc7Sjsg 		break;
5956c349dbc7Sjsg 	}
5957c349dbc7Sjsg }
5958c349dbc7Sjsg 
gfx_v9_0_priv_reg_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)5959fb4d8502Sjsg static int gfx_v9_0_priv_reg_irq(struct amdgpu_device *adev,
5960fb4d8502Sjsg 				 struct amdgpu_irq_src *source,
5961fb4d8502Sjsg 				 struct amdgpu_iv_entry *entry)
5962fb4d8502Sjsg {
5963fb4d8502Sjsg 	DRM_ERROR("Illegal register access in command stream\n");
5964c349dbc7Sjsg 	gfx_v9_0_fault(adev, entry);
5965fb4d8502Sjsg 	return 0;
5966fb4d8502Sjsg }
5967fb4d8502Sjsg 
gfx_v9_0_priv_inst_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)5968fb4d8502Sjsg static int gfx_v9_0_priv_inst_irq(struct amdgpu_device *adev,
5969fb4d8502Sjsg 				  struct amdgpu_irq_src *source,
5970fb4d8502Sjsg 				  struct amdgpu_iv_entry *entry)
5971fb4d8502Sjsg {
5972fb4d8502Sjsg 	DRM_ERROR("Illegal instruction in command stream\n");
5973c349dbc7Sjsg 	gfx_v9_0_fault(adev, entry);
5974fb4d8502Sjsg 	return 0;
5975fb4d8502Sjsg }
5976fb4d8502Sjsg 
5977c349dbc7Sjsg 
5978c349dbc7Sjsg static const struct soc15_ras_field_entry gfx_v9_0_ras_fields[] = {
5979c349dbc7Sjsg 	{ "CPC_SCRATCH", SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_SCRATCH_CNT),
5980c349dbc7Sjsg 	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, SEC_COUNT),
5981c349dbc7Sjsg 	  SOC15_REG_FIELD(CPC_EDC_SCRATCH_CNT, DED_COUNT)
5982c349dbc7Sjsg 	},
5983c349dbc7Sjsg 	{ "CPC_UCODE", SOC15_REG_ENTRY(GC, 0, mmCPC_EDC_UCODE_CNT),
5984c349dbc7Sjsg 	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, SEC_COUNT),
5985c349dbc7Sjsg 	  SOC15_REG_FIELD(CPC_EDC_UCODE_CNT, DED_COUNT)
5986c349dbc7Sjsg 	},
5987c349dbc7Sjsg 	{ "CPF_ROQ_ME1", SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_ROQ_CNT),
5988c349dbc7Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, COUNT_ME1),
5989c349dbc7Sjsg 	  0, 0
5990c349dbc7Sjsg 	},
5991c349dbc7Sjsg 	{ "CPF_ROQ_ME2", SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_ROQ_CNT),
5992c349dbc7Sjsg 	  SOC15_REG_FIELD(CPF_EDC_ROQ_CNT, COUNT_ME2),
5993c349dbc7Sjsg 	  0, 0
5994c349dbc7Sjsg 	},
5995c349dbc7Sjsg 	{ "CPF_TAG", SOC15_REG_ENTRY(GC, 0, mmCPF_EDC_TAG_CNT),
5996c349dbc7Sjsg 	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, SEC_COUNT),
5997c349dbc7Sjsg 	  SOC15_REG_FIELD(CPF_EDC_TAG_CNT, DED_COUNT)
5998c349dbc7Sjsg 	},
5999c349dbc7Sjsg 	{ "CPG_DMA_ROQ", SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_DMA_CNT),
6000c349dbc7Sjsg 	  SOC15_REG_FIELD(CPG_EDC_DMA_CNT, ROQ_COUNT),
6001c349dbc7Sjsg 	  0, 0
6002c349dbc7Sjsg 	},
6003c349dbc7Sjsg 	{ "CPG_DMA_TAG", SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_DMA_CNT),
6004c349dbc7Sjsg 	  SOC15_REG_FIELD(CPG_EDC_DMA_CNT, TAG_SEC_COUNT),
6005c349dbc7Sjsg 	  SOC15_REG_FIELD(CPG_EDC_DMA_CNT, TAG_DED_COUNT)
6006c349dbc7Sjsg 	},
6007c349dbc7Sjsg 	{ "CPG_TAG", SOC15_REG_ENTRY(GC, 0, mmCPG_EDC_TAG_CNT),
6008c349dbc7Sjsg 	  SOC15_REG_FIELD(CPG_EDC_TAG_CNT, SEC_COUNT),
6009c349dbc7Sjsg 	  SOC15_REG_FIELD(CPG_EDC_TAG_CNT, DED_COUNT)
6010c349dbc7Sjsg 	},
6011c349dbc7Sjsg 	{ "DC_CSINVOC", SOC15_REG_ENTRY(GC, 0, mmDC_EDC_CSINVOC_CNT),
6012c349dbc7Sjsg 	  SOC15_REG_FIELD(DC_EDC_CSINVOC_CNT, COUNT_ME1),
6013c349dbc7Sjsg 	  0, 0
6014c349dbc7Sjsg 	},
6015c349dbc7Sjsg 	{ "DC_RESTORE", SOC15_REG_ENTRY(GC, 0, mmDC_EDC_RESTORE_CNT),
6016c349dbc7Sjsg 	  SOC15_REG_FIELD(DC_EDC_RESTORE_CNT, COUNT_ME1),
6017c349dbc7Sjsg 	  0, 0
6018c349dbc7Sjsg 	},
6019c349dbc7Sjsg 	{ "DC_STATE", SOC15_REG_ENTRY(GC, 0, mmDC_EDC_STATE_CNT),
6020c349dbc7Sjsg 	  SOC15_REG_FIELD(DC_EDC_STATE_CNT, COUNT_ME1),
6021c349dbc7Sjsg 	  0, 0
6022c349dbc7Sjsg 	},
6023c349dbc7Sjsg 	{ "GDS_MEM", SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_CNT),
6024c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_SEC),
6025c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_MEM_DED)
6026c349dbc7Sjsg 	},
6027c349dbc7Sjsg 	{ "GDS_INPUT_QUEUE", SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_CNT),
6028c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_CNT, GDS_INPUT_QUEUE_SED),
6029c349dbc7Sjsg 	  0, 0
6030c349dbc7Sjsg 	},
6031c349dbc7Sjsg 	{ "GDS_ME0_CS_PIPE_MEM", SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT),
6032c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_SEC),
6033c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, ME0_CS_PIPE_MEM_DED)
6034c349dbc7Sjsg 	},
6035c349dbc7Sjsg 	{ "GDS_OA_PHY_PHY_CMD_RAM_MEM",
6036c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT),
6037c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_SEC),
6038c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_CMD_RAM_MEM_DED)
6039c349dbc7Sjsg 	},
6040c349dbc7Sjsg 	{ "GDS_OA_PHY_PHY_DATA_RAM_MEM",
6041c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PHY_CNT),
6042c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PHY_CNT, PHY_DATA_RAM_MEM_SED),
6043c349dbc7Sjsg 	  0, 0
6044c349dbc7Sjsg 	},
6045c349dbc7Sjsg 	{ "GDS_OA_PIPE_ME1_PIPE0_PIPE_MEM",
6046c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT),
6047c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_SEC),
6048c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE0_PIPE_MEM_DED)
6049c349dbc7Sjsg 	},
6050c349dbc7Sjsg 	{ "GDS_OA_PIPE_ME1_PIPE1_PIPE_MEM",
6051c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT),
6052c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_SEC),
6053c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE1_PIPE_MEM_DED)
6054c349dbc7Sjsg 	},
6055c349dbc7Sjsg 	{ "GDS_OA_PIPE_ME1_PIPE2_PIPE_MEM",
6056c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT),
6057c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_SEC),
6058c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE2_PIPE_MEM_DED)
6059c349dbc7Sjsg 	},
6060c349dbc7Sjsg 	{ "GDS_OA_PIPE_ME1_PIPE3_PIPE_MEM",
6061c349dbc7Sjsg 	  SOC15_REG_ENTRY(GC, 0, mmGDS_EDC_OA_PIPE_CNT),
6062c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_SEC),
6063c349dbc7Sjsg 	  SOC15_REG_FIELD(GDS_EDC_OA_PIPE_CNT, ME1_PIPE3_PIPE_MEM_DED)
6064c349dbc7Sjsg 	},
6065c349dbc7Sjsg 	{ "SPI_SR_MEM", SOC15_REG_ENTRY(GC, 0, mmSPI_EDC_CNT),
6066c349dbc7Sjsg 	  SOC15_REG_FIELD(SPI_EDC_CNT, SPI_SR_MEM_SED_COUNT),
6067c349dbc7Sjsg 	  0, 0
6068c349dbc7Sjsg 	},
6069c349dbc7Sjsg 	{ "TA_FS_DFIFO", SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT),
6070c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_SEC_COUNT),
6071c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_DFIFO_DED_COUNT)
6072c349dbc7Sjsg 	},
6073c349dbc7Sjsg 	{ "TA_FS_AFIFO", SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT),
6074c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_AFIFO_SED_COUNT),
6075c349dbc7Sjsg 	  0, 0
6076c349dbc7Sjsg 	},
6077c349dbc7Sjsg 	{ "TA_FL_LFIFO", SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT),
6078c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FL_LFIFO_SED_COUNT),
6079c349dbc7Sjsg 	  0, 0
6080c349dbc7Sjsg 	},
6081c349dbc7Sjsg 	{ "TA_FX_LFIFO", SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT),
6082c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FX_LFIFO_SED_COUNT),
6083c349dbc7Sjsg 	  0, 0
6084c349dbc7Sjsg 	},
6085c349dbc7Sjsg 	{ "TA_FS_CFIFO", SOC15_REG_ENTRY(GC, 0, mmTA_EDC_CNT),
6086c349dbc7Sjsg 	  SOC15_REG_FIELD(TA_EDC_CNT, TA_FS_CFIFO_SED_COUNT),
6087c349dbc7Sjsg 	  0, 0
6088c349dbc7Sjsg 	},
6089c349dbc7Sjsg 	{ "TCA_HOLE_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCA_EDC_CNT),
6090c349dbc7Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, HOLE_FIFO_SED_COUNT),
6091c349dbc7Sjsg 	  0, 0
6092c349dbc7Sjsg 	},
6093c349dbc7Sjsg 	{ "TCA_REQ_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCA_EDC_CNT),
6094c349dbc7Sjsg 	  SOC15_REG_FIELD(TCA_EDC_CNT, REQ_FIFO_SED_COUNT),
6095c349dbc7Sjsg 	  0, 0
6096c349dbc7Sjsg 	},
6097c349dbc7Sjsg 	{ "TCC_CACHE_DATA", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6098c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_SEC_COUNT),
6099c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DATA_DED_COUNT)
6100c349dbc7Sjsg 	},
6101c349dbc7Sjsg 	{ "TCC_CACHE_DIRTY", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6102c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_SEC_COUNT),
6103c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, CACHE_DIRTY_DED_COUNT)
6104c349dbc7Sjsg 	},
6105c349dbc7Sjsg 	{ "TCC_HIGH_RATE_TAG", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6106c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_SEC_COUNT),
6107c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, HIGH_RATE_TAG_DED_COUNT)
6108c349dbc7Sjsg 	},
6109c349dbc7Sjsg 	{ "TCC_LOW_RATE_TAG", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6110c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_SEC_COUNT),
6111c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LOW_RATE_TAG_DED_COUNT)
6112c349dbc7Sjsg 	},
6113c349dbc7Sjsg 	{ "TCC_SRC_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6114c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_SEC_COUNT),
6115c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, SRC_FIFO_DED_COUNT)
6116c349dbc7Sjsg 	},
6117c349dbc7Sjsg 	{ "TCC_IN_USE_DEC", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6118c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, IN_USE_DEC_SED_COUNT),
6119c349dbc7Sjsg 	  0, 0
6120c349dbc7Sjsg 	},
6121c349dbc7Sjsg 	{ "TCC_IN_USE_TRANSFER", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6122c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, IN_USE_TRANSFER_SED_COUNT),
6123c349dbc7Sjsg 	  0, 0
6124c349dbc7Sjsg 	},
6125c349dbc7Sjsg 	{ "TCC_LATENCY_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6126c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, LATENCY_FIFO_SED_COUNT),
6127c349dbc7Sjsg 	  0, 0
6128c349dbc7Sjsg 	},
6129c349dbc7Sjsg 	{ "TCC_RETURN_DATA", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6130c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, RETURN_DATA_SED_COUNT),
6131c349dbc7Sjsg 	  0, 0
6132c349dbc7Sjsg 	},
6133c349dbc7Sjsg 	{ "TCC_RETURN_CONTROL", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6134c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, RETURN_CONTROL_SED_COUNT),
6135c349dbc7Sjsg 	  0, 0
6136c349dbc7Sjsg 	},
6137c349dbc7Sjsg 	{ "TCC_UC_ATOMIC_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT),
6138c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT, UC_ATOMIC_FIFO_SED_COUNT),
6139c349dbc7Sjsg 	  0, 0
6140c349dbc7Sjsg 	},
6141c349dbc7Sjsg 	{ "TCC_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6142c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_RETURN_SED_COUNT),
6143c349dbc7Sjsg 	  0, 0
6144c349dbc7Sjsg 	},
6145c349dbc7Sjsg 	{ "TCC_WRITE_CACHE_READ", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6146c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRITE_CACHE_READ_SED_COUNT),
6147c349dbc7Sjsg 	  0, 0
6148c349dbc7Sjsg 	},
6149c349dbc7Sjsg 	{ "TCC_SRC_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6150c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, SRC_FIFO_NEXT_RAM_SED_COUNT),
6151c349dbc7Sjsg 	  0, 0
6152c349dbc7Sjsg 	},
6153c349dbc7Sjsg 	{ "TCC_LATENCY_FIFO_NEXT_RAM", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6154c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, LATENCY_FIFO_NEXT_RAM_SED_COUNT),
6155c349dbc7Sjsg 	  0, 0
6156c349dbc7Sjsg 	},
6157c349dbc7Sjsg 	{ "TCC_CACHE_TAG_PROBE_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6158c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, CACHE_TAG_PROBE_FIFO_SED_COUNT),
6159c349dbc7Sjsg 	  0, 0
6160c349dbc7Sjsg 	},
6161c349dbc7Sjsg 	{ "TCC_WRRET_TAG_WRITE_RETURN", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6162c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, WRRET_TAG_WRITE_RETURN_SED_COUNT),
6163c349dbc7Sjsg 	  0, 0
6164c349dbc7Sjsg 	},
6165c349dbc7Sjsg 	{ "TCC_ATOMIC_RETURN_BUFFER", SOC15_REG_ENTRY(GC, 0, mmTCC_EDC_CNT2),
6166c349dbc7Sjsg 	  SOC15_REG_FIELD(TCC_EDC_CNT2, ATOMIC_RETURN_BUFFER_SED_COUNT),
6167c349dbc7Sjsg 	  0, 0
6168c349dbc7Sjsg 	},
6169c349dbc7Sjsg 	{ "TCI_WRITE_RAM", SOC15_REG_ENTRY(GC, 0, mmTCI_EDC_CNT),
6170c349dbc7Sjsg 	  SOC15_REG_FIELD(TCI_EDC_CNT, WRITE_RAM_SED_COUNT),
6171c349dbc7Sjsg 	  0, 0
6172c349dbc7Sjsg 	},
6173c349dbc7Sjsg 	{ "TCP_CACHE_RAM", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6174c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_SEC_COUNT),
6175c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CACHE_RAM_DED_COUNT)
6176c349dbc7Sjsg 	},
6177c349dbc7Sjsg 	{ "TCP_LFIFO_RAM", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6178c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_SEC_COUNT),
6179c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, LFIFO_RAM_DED_COUNT)
6180c349dbc7Sjsg 	},
6181c349dbc7Sjsg 	{ "TCP_CMD_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6182c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, CMD_FIFO_SED_COUNT),
6183c349dbc7Sjsg 	  0, 0
6184c349dbc7Sjsg 	},
6185c349dbc7Sjsg 	{ "TCP_VM_FIFO", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6186c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, VM_FIFO_SEC_COUNT),
6187c349dbc7Sjsg 	  0, 0
6188c349dbc7Sjsg 	},
6189c349dbc7Sjsg 	{ "TCP_DB_RAM", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6190c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, DB_RAM_SED_COUNT),
6191c349dbc7Sjsg 	  0, 0
6192c349dbc7Sjsg 	},
6193c349dbc7Sjsg 	{ "TCP_UTCL1_LFIFO0", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6194c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_SEC_COUNT),
6195c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO0_DED_COUNT)
6196c349dbc7Sjsg 	},
6197c349dbc7Sjsg 	{ "TCP_UTCL1_LFIFO1", SOC15_REG_ENTRY(GC, 0, mmTCP_EDC_CNT_NEW),
6198c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_SEC_COUNT),
6199c349dbc7Sjsg 	  SOC15_REG_FIELD(TCP_EDC_CNT_NEW, UTCL1_LFIFO1_DED_COUNT)
6200c349dbc7Sjsg 	},
6201c349dbc7Sjsg 	{ "TD_SS_FIFO_LO", SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT),
6202c349dbc7Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_SEC_COUNT),
6203c349dbc7Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_LO_DED_COUNT)
6204c349dbc7Sjsg 	},
6205c349dbc7Sjsg 	{ "TD_SS_FIFO_HI", SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT),
6206c349dbc7Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_SEC_COUNT),
6207c349dbc7Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, SS_FIFO_HI_DED_COUNT)
6208c349dbc7Sjsg 	},
6209c349dbc7Sjsg 	{ "TD_CS_FIFO", SOC15_REG_ENTRY(GC, 0, mmTD_EDC_CNT),
6210c349dbc7Sjsg 	  SOC15_REG_FIELD(TD_EDC_CNT, CS_FIFO_SED_COUNT),
6211c349dbc7Sjsg 	  0, 0
6212c349dbc7Sjsg 	},
6213c349dbc7Sjsg 	{ "SQ_LDS_D", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6214c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_SEC_COUNT),
6215c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_D_DED_COUNT)
6216c349dbc7Sjsg 	},
6217c349dbc7Sjsg 	{ "SQ_LDS_I", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6218c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_SEC_COUNT),
6219c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, LDS_I_DED_COUNT)
6220c349dbc7Sjsg 	},
6221c349dbc7Sjsg 	{ "SQ_SGPR", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6222c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_SEC_COUNT),
6223c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, SGPR_DED_COUNT)
6224c349dbc7Sjsg 	},
6225c349dbc7Sjsg 	{ "SQ_VGPR0", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6226c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_SEC_COUNT),
6227c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR0_DED_COUNT)
6228c349dbc7Sjsg 	},
6229c349dbc7Sjsg 	{ "SQ_VGPR1", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6230c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_SEC_COUNT),
6231c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR1_DED_COUNT)
6232c349dbc7Sjsg 	},
6233c349dbc7Sjsg 	{ "SQ_VGPR2", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6234c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_SEC_COUNT),
6235c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR2_DED_COUNT)
6236c349dbc7Sjsg 	},
6237c349dbc7Sjsg 	{ "SQ_VGPR3", SOC15_REG_ENTRY(GC, 0, mmSQ_EDC_CNT),
6238c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_SEC_COUNT),
6239c349dbc7Sjsg 	  SOC15_REG_FIELD(SQ_EDC_CNT, VGPR3_DED_COUNT)
6240c349dbc7Sjsg 	},
6241c349dbc7Sjsg 	{ "SQC_DATA_CU0_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6242c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_SEC_COUNT),
6243c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_WRITE_DATA_BUF_DED_COUNT)
6244c349dbc7Sjsg 	},
6245c349dbc7Sjsg 	{ "SQC_DATA_CU0_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6246c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_SEC_COUNT),
6247c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU0_UTCL1_LFIFO_DED_COUNT)
6248c349dbc7Sjsg 	},
6249c349dbc7Sjsg 	{ "SQC_DATA_CU1_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6250c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_SEC_COUNT),
6251c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_WRITE_DATA_BUF_DED_COUNT)
6252c349dbc7Sjsg 	},
6253c349dbc7Sjsg 	{ "SQC_DATA_CU1_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6254c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_SEC_COUNT),
6255c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU1_UTCL1_LFIFO_DED_COUNT)
6256c349dbc7Sjsg 	},
6257c349dbc7Sjsg 	{ "SQC_DATA_CU2_WRITE_DATA_BUF", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6258c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_SEC_COUNT),
6259c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_WRITE_DATA_BUF_DED_COUNT)
6260c349dbc7Sjsg 	},
6261c349dbc7Sjsg 	{ "SQC_DATA_CU2_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT),
6262c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_SEC_COUNT),
6263c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT, DATA_CU2_UTCL1_LFIFO_DED_COUNT)
6264c349dbc7Sjsg 	},
6265c349dbc7Sjsg 	{ "SQC_INST_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6266c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_SEC_COUNT),
6267c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_TAG_RAM_DED_COUNT)
6268c349dbc7Sjsg 	},
6269c349dbc7Sjsg 	{ "SQC_INST_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6270c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_SEC_COUNT),
6271c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_BANK_RAM_DED_COUNT)
6272c349dbc7Sjsg 	},
6273c349dbc7Sjsg 	{ "SQC_DATA_BANKA_TAG_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6274c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_SEC_COUNT),
6275c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_TAG_RAM_DED_COUNT)
6276c349dbc7Sjsg 	},
6277c349dbc7Sjsg 	{ "SQC_DATA_BANKA_BANK_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6278c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_SEC_COUNT),
6279c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_BANK_RAM_DED_COUNT)
6280c349dbc7Sjsg 	},
6281c349dbc7Sjsg 	{ "SQC_INST_BANKA_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6282c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_UTCL1_MISS_FIFO_SED_COUNT),
6283c349dbc7Sjsg 	  0, 0
6284c349dbc7Sjsg 	},
6285c349dbc7Sjsg 	{ "SQC_INST_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6286c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_BANKA_MISS_FIFO_SED_COUNT),
6287c349dbc7Sjsg 	  0, 0
6288c349dbc7Sjsg 	},
6289c349dbc7Sjsg 	{ "SQC_DATA_BANKA_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6290c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_HIT_FIFO_SED_COUNT),
6291c349dbc7Sjsg 	  0, 0
6292c349dbc7Sjsg 	},
6293c349dbc7Sjsg 	{ "SQC_DATA_BANKA_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6294c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_MISS_FIFO_SED_COUNT),
6295c349dbc7Sjsg 	  0, 0
6296c349dbc7Sjsg 	},
6297c349dbc7Sjsg 	{ "SQC_DATA_BANKA_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6298c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, DATA_BANKA_DIRTY_BIT_RAM_SED_COUNT),
6299c349dbc7Sjsg 	  0, 0
6300c349dbc7Sjsg 	},
6301c349dbc7Sjsg 	{ "SQC_INST_UTCL1_LFIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT2),
6302c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_SEC_COUNT),
6303c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT2, INST_UTCL1_LFIFO_DED_COUNT)
6304c349dbc7Sjsg 	},
6305c349dbc7Sjsg 	{ "SQC_INST_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6306c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_SEC_COUNT),
6307c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_TAG_RAM_DED_COUNT)
6308c349dbc7Sjsg 	},
6309c349dbc7Sjsg 	{ "SQC_INST_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6310c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_SEC_COUNT),
6311c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_BANK_RAM_DED_COUNT)
6312c349dbc7Sjsg 	},
6313c349dbc7Sjsg 	{ "SQC_DATA_BANKB_TAG_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6314c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_SEC_COUNT),
6315c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_TAG_RAM_DED_COUNT)
6316c349dbc7Sjsg 	},
6317c349dbc7Sjsg 	{ "SQC_DATA_BANKB_BANK_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6318c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_SEC_COUNT),
6319c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_BANK_RAM_DED_COUNT)
6320c349dbc7Sjsg 	},
6321c349dbc7Sjsg 	{ "SQC_INST_BANKB_UTCL1_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6322c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_UTCL1_MISS_FIFO_SED_COUNT),
6323c349dbc7Sjsg 	  0, 0
6324c349dbc7Sjsg 	},
6325c349dbc7Sjsg 	{ "SQC_INST_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6326c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, INST_BANKB_MISS_FIFO_SED_COUNT),
6327c349dbc7Sjsg 	  0, 0
6328c349dbc7Sjsg 	},
6329c349dbc7Sjsg 	{ "SQC_DATA_BANKB_HIT_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6330c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_HIT_FIFO_SED_COUNT),
6331c349dbc7Sjsg 	  0, 0
6332c349dbc7Sjsg 	},
6333c349dbc7Sjsg 	{ "SQC_DATA_BANKB_MISS_FIFO", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6334c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_MISS_FIFO_SED_COUNT),
6335c349dbc7Sjsg 	  0, 0
6336c349dbc7Sjsg 	},
6337c349dbc7Sjsg 	{ "SQC_DATA_BANKB_DIRTY_BIT_RAM", SOC15_REG_ENTRY(GC, 0, mmSQC_EDC_CNT3),
6338c349dbc7Sjsg 	  SOC15_REG_FIELD(SQC_EDC_CNT3, DATA_BANKB_DIRTY_BIT_RAM_SED_COUNT),
6339c349dbc7Sjsg 	  0, 0
6340c349dbc7Sjsg 	},
6341c349dbc7Sjsg 	{ "EA_DRAMRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6342c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
6343c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT)
6344c349dbc7Sjsg 	},
6345c349dbc7Sjsg 	{ "EA_DRAMWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6346c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
6347c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT)
6348c349dbc7Sjsg 	},
6349c349dbc7Sjsg 	{ "EA_DRAMWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6350c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
6351c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT)
6352c349dbc7Sjsg 	},
6353c349dbc7Sjsg 	{ "EA_RRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6354c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
6355c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, RRET_TAGMEM_DED_COUNT)
6356c349dbc7Sjsg 	},
6357c349dbc7Sjsg 	{ "EA_WRET_TAGMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6358c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
6359c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, WRET_TAGMEM_DED_COUNT)
6360c349dbc7Sjsg 	},
6361c349dbc7Sjsg 	{ "EA_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6362c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
6363c349dbc7Sjsg 	  0, 0
6364c349dbc7Sjsg 	},
6365c349dbc7Sjsg 	{ "EA_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6366c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
6367c349dbc7Sjsg 	  0, 0
6368c349dbc7Sjsg 	},
6369c349dbc7Sjsg 	{ "EA_IORD_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6370c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IORD_CMDMEM_SED_COUNT),
6371c349dbc7Sjsg 	  0, 0
6372c349dbc7Sjsg 	},
6373c349dbc7Sjsg 	{ "EA_IOWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6374c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
6375c349dbc7Sjsg 	  0, 0
6376c349dbc7Sjsg 	},
6377c349dbc7Sjsg 	{ "EA_IOWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT),
6378c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
6379c349dbc7Sjsg 	  0, 0
6380c349dbc7Sjsg 	},
6381c349dbc7Sjsg 	{ "GMIRD_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6382c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
6383c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT)
6384c349dbc7Sjsg 	},
6385c349dbc7Sjsg 	{ "GMIWR_CMDMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6386c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
6387c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT)
6388c349dbc7Sjsg 	},
6389c349dbc7Sjsg 	{ "GMIWR_DATAMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6390c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
6391c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT)
6392c349dbc7Sjsg 	},
6393c349dbc7Sjsg 	{ "GMIRD_PAGEMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6394c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
6395c349dbc7Sjsg 	  0, 0
6396c349dbc7Sjsg 	},
6397c349dbc7Sjsg 	{ "GMIWR_PAGEMEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6398c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
6399c349dbc7Sjsg 	  0, 0
6400c349dbc7Sjsg 	},
6401c349dbc7Sjsg 	{ "MAM_D0MEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6402c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D0MEM_SED_COUNT),
6403c349dbc7Sjsg 	  0, 0
6404c349dbc7Sjsg 	},
6405c349dbc7Sjsg 	{ "MAM_D1MEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6406c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D1MEM_SED_COUNT),
6407c349dbc7Sjsg 	  0, 0
6408c349dbc7Sjsg 	},
6409c349dbc7Sjsg 	{ "MAM_D2MEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6410c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D2MEM_SED_COUNT),
6411c349dbc7Sjsg 	  0, 0
6412c349dbc7Sjsg 	},
6413c349dbc7Sjsg 	{ "MAM_D3MEM", SOC15_REG_ENTRY(GC, 0, mmGCEA_EDC_CNT2),
6414c349dbc7Sjsg 	  SOC15_REG_FIELD(GCEA_EDC_CNT2, MAM_D3MEM_SED_COUNT),
6415c349dbc7Sjsg 	  0, 0
6416c349dbc7Sjsg 	}
6417c349dbc7Sjsg };
6418c349dbc7Sjsg 
gfx_v9_0_ras_error_inject(struct amdgpu_device * adev,void * inject_if,uint32_t instance_mask)6419c349dbc7Sjsg static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev,
6420f005ef32Sjsg 				     void *inject_if, uint32_t instance_mask)
6421fb4d8502Sjsg {
6422c349dbc7Sjsg 	struct ras_inject_if *info = (struct ras_inject_if *)inject_if;
6423c349dbc7Sjsg 	int ret;
6424c349dbc7Sjsg 	struct ta_ras_trigger_error_input block_info = { 0 };
6425fb4d8502Sjsg 
6426c349dbc7Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
6427c349dbc7Sjsg 		return -EINVAL;
6428fb4d8502Sjsg 
6429c349dbc7Sjsg 	if (info->head.sub_block_index >= ARRAY_SIZE(ras_gfx_subblocks))
6430c349dbc7Sjsg 		return -EINVAL;
6431fb4d8502Sjsg 
6432c349dbc7Sjsg 	if (!ras_gfx_subblocks[info->head.sub_block_index].name)
6433c349dbc7Sjsg 		return -EPERM;
6434fb4d8502Sjsg 
6435c349dbc7Sjsg 	if (!(ras_gfx_subblocks[info->head.sub_block_index].hw_supported_error_type &
6436c349dbc7Sjsg 	      info->head.type)) {
6437c349dbc7Sjsg 		DRM_ERROR("GFX Subblock %s, hardware do not support type 0x%x\n",
6438c349dbc7Sjsg 			ras_gfx_subblocks[info->head.sub_block_index].name,
6439c349dbc7Sjsg 			info->head.type);
6440c349dbc7Sjsg 		return -EPERM;
6441fb4d8502Sjsg 	}
6442c349dbc7Sjsg 
6443c349dbc7Sjsg 	if (!(ras_gfx_subblocks[info->head.sub_block_index].sw_supported_error_type &
6444c349dbc7Sjsg 	      info->head.type)) {
6445c349dbc7Sjsg 		DRM_ERROR("GFX Subblock %s, driver do not support type 0x%x\n",
6446c349dbc7Sjsg 			ras_gfx_subblocks[info->head.sub_block_index].name,
6447c349dbc7Sjsg 			info->head.type);
6448c349dbc7Sjsg 		return -EPERM;
6449fb4d8502Sjsg 	}
6450c349dbc7Sjsg 
6451c349dbc7Sjsg 	block_info.block_id = amdgpu_ras_block_to_ta(info->head.block);
6452c349dbc7Sjsg 	block_info.sub_block_index =
6453c349dbc7Sjsg 		ras_gfx_subblocks[info->head.sub_block_index].ta_subblock;
6454c349dbc7Sjsg 	block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type);
6455c349dbc7Sjsg 	block_info.address = info->address;
6456c349dbc7Sjsg 	block_info.value = info->value;
6457c349dbc7Sjsg 
6458c349dbc7Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
6459f005ef32Sjsg 	ret = psp_ras_trigger_error(&adev->psp, &block_info, instance_mask);
6460c349dbc7Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
6461c349dbc7Sjsg 
6462c349dbc7Sjsg 	return ret;
6463c349dbc7Sjsg }
6464c349dbc7Sjsg 
6465c349dbc7Sjsg static const char *vml2_mems[] = {
6466c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_0_BIGK_MEM0",
6467c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_0_BIGK_MEM1",
6468c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_0_4K_MEM0",
6469c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_0_4K_MEM1",
6470c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_1_BIGK_MEM0",
6471c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_1_BIGK_MEM1",
6472c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_1_4K_MEM0",
6473c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_1_4K_MEM1",
6474c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_2_BIGK_MEM0",
6475c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_2_BIGK_MEM1",
6476c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_2_4K_MEM0",
6477c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_2_4K_MEM1",
6478c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_3_BIGK_MEM0",
6479c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_3_BIGK_MEM1",
6480c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_3_4K_MEM0",
6481c349dbc7Sjsg 	"UTC_VML2_BANK_CACHE_3_4K_MEM1",
6482c349dbc7Sjsg };
6483c349dbc7Sjsg 
6484c349dbc7Sjsg static const char *vml2_walker_mems[] = {
6485c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE0_MEM0",
6486c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE0_MEM1",
6487c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE1_MEM0",
6488c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE1_MEM1",
6489c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE2_MEM0",
6490c349dbc7Sjsg 	"UTC_VML2_CACHE_PDE2_MEM1",
6491c349dbc7Sjsg 	"UTC_VML2_RDIF_LOG_FIFO",
6492c349dbc7Sjsg };
6493c349dbc7Sjsg 
6494c349dbc7Sjsg static const char *atc_l2_cache_2m_mems[] = {
6495c349dbc7Sjsg 	"UTC_ATCL2_CACHE_2M_BANK0_WAY0_MEM",
6496c349dbc7Sjsg 	"UTC_ATCL2_CACHE_2M_BANK0_WAY1_MEM",
6497c349dbc7Sjsg 	"UTC_ATCL2_CACHE_2M_BANK1_WAY0_MEM",
6498c349dbc7Sjsg 	"UTC_ATCL2_CACHE_2M_BANK1_WAY1_MEM",
6499c349dbc7Sjsg };
6500c349dbc7Sjsg 
6501c349dbc7Sjsg static const char *atc_l2_cache_4k_mems[] = {
6502c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM0",
6503c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM1",
6504c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM2",
6505c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM3",
6506c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM4",
6507c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM5",
6508c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM6",
6509c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY0_MEM7",
6510c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM0",
6511c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM1",
6512c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM2",
6513c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM3",
6514c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM4",
6515c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM5",
6516c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM6",
6517c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK0_WAY1_MEM7",
6518c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM0",
6519c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM1",
6520c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM2",
6521c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM3",
6522c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM4",
6523c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM5",
6524c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM6",
6525c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY0_MEM7",
6526c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM0",
6527c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM1",
6528c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM2",
6529c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM3",
6530c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM4",
6531c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM5",
6532c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM6",
6533c349dbc7Sjsg 	"UTC_ATCL2_CACHE_4K_BANK1_WAY1_MEM7",
6534c349dbc7Sjsg };
6535c349dbc7Sjsg 
gfx_v9_0_query_utc_edc_status(struct amdgpu_device * adev,struct ras_err_data * err_data)6536c349dbc7Sjsg static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,
6537c349dbc7Sjsg 					 struct ras_err_data *err_data)
6538c349dbc7Sjsg {
6539c349dbc7Sjsg 	uint32_t i, data;
6540c349dbc7Sjsg 	uint32_t sec_count, ded_count;
6541c349dbc7Sjsg 
6542c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, 255);
6543c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_CNT, 0);
6544c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, 255);
6545c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_CNT, 0);
6546c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, 255);
6547c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_CNT, 0);
6548c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, 255);
6549c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_CNT, 0);
6550c349dbc7Sjsg 
6551c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(vml2_mems); i++) {
6552c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, i);
6553c349dbc7Sjsg 		data = RREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_CNT);
6554c349dbc7Sjsg 
6555c349dbc7Sjsg 		sec_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, SEC_COUNT);
6556c349dbc7Sjsg 		if (sec_count) {
6557ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6558ad8b1aafSjsg 				"SEC %d\n", i, vml2_mems[i], sec_count);
6559c349dbc7Sjsg 			err_data->ce_count += sec_count;
6560c349dbc7Sjsg 		}
6561c349dbc7Sjsg 
6562c349dbc7Sjsg 		ded_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, DED_COUNT);
6563c349dbc7Sjsg 		if (ded_count) {
6564ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6565ad8b1aafSjsg 				"DED %d\n", i, vml2_mems[i], ded_count);
6566c349dbc7Sjsg 			err_data->ue_count += ded_count;
6567c349dbc7Sjsg 		}
6568c349dbc7Sjsg 	}
6569c349dbc7Sjsg 
6570c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(vml2_walker_mems); i++) {
6571c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, i);
6572c349dbc7Sjsg 		data = RREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_CNT);
6573c349dbc7Sjsg 
6574c349dbc7Sjsg 		sec_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,
6575c349dbc7Sjsg 						SEC_COUNT);
6576c349dbc7Sjsg 		if (sec_count) {
6577ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6578ad8b1aafSjsg 				"SEC %d\n", i, vml2_walker_mems[i], sec_count);
6579c349dbc7Sjsg 			err_data->ce_count += sec_count;
6580c349dbc7Sjsg 		}
6581c349dbc7Sjsg 
6582c349dbc7Sjsg 		ded_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,
6583c349dbc7Sjsg 						DED_COUNT);
6584c349dbc7Sjsg 		if (ded_count) {
6585ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6586ad8b1aafSjsg 				"DED %d\n", i, vml2_walker_mems[i], ded_count);
6587c349dbc7Sjsg 			err_data->ue_count += ded_count;
6588c349dbc7Sjsg 		}
6589c349dbc7Sjsg 	}
6590c349dbc7Sjsg 
6591c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(atc_l2_cache_2m_mems); i++) {
6592c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, i);
6593c349dbc7Sjsg 		data = RREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_CNT);
6594c349dbc7Sjsg 
6595c349dbc7Sjsg 		sec_count = (data & 0x00006000L) >> 0xd;
6596c349dbc7Sjsg 		if (sec_count) {
6597ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6598ad8b1aafSjsg 				"SEC %d\n", i, atc_l2_cache_2m_mems[i],
6599ad8b1aafSjsg 				sec_count);
6600c349dbc7Sjsg 			err_data->ce_count += sec_count;
6601c349dbc7Sjsg 		}
6602c349dbc7Sjsg 	}
6603c349dbc7Sjsg 
6604c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(atc_l2_cache_4k_mems); i++) {
6605c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, i);
6606c349dbc7Sjsg 		data = RREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_CNT);
6607c349dbc7Sjsg 
6608c349dbc7Sjsg 		sec_count = (data & 0x00006000L) >> 0xd;
6609c349dbc7Sjsg 		if (sec_count) {
6610ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6611ad8b1aafSjsg 				"SEC %d\n", i, atc_l2_cache_4k_mems[i],
6612ad8b1aafSjsg 				sec_count);
6613c349dbc7Sjsg 			err_data->ce_count += sec_count;
6614c349dbc7Sjsg 		}
6615c349dbc7Sjsg 
6616c349dbc7Sjsg 		ded_count = (data & 0x00018000L) >> 0xf;
6617c349dbc7Sjsg 		if (ded_count) {
6618ad8b1aafSjsg 			dev_info(adev->dev, "Instance[%d]: SubBlock %s, "
6619ad8b1aafSjsg 				"DED %d\n", i, atc_l2_cache_4k_mems[i],
6620ad8b1aafSjsg 				ded_count);
6621c349dbc7Sjsg 			err_data->ue_count += ded_count;
6622c349dbc7Sjsg 		}
6623c349dbc7Sjsg 	}
6624c349dbc7Sjsg 
6625c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, 255);
6626c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, 255);
6627c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, 255);
6628c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, 255);
6629c349dbc7Sjsg 
6630fb4d8502Sjsg 	return 0;
6631fb4d8502Sjsg }
6632fb4d8502Sjsg 
gfx_v9_0_ras_error_count(struct amdgpu_device * adev,const struct soc15_reg_entry * reg,uint32_t se_id,uint32_t inst_id,uint32_t value,uint32_t * sec_count,uint32_t * ded_count)6633ad8b1aafSjsg static int gfx_v9_0_ras_error_count(struct amdgpu_device *adev,
6634ad8b1aafSjsg 	const struct soc15_reg_entry *reg,
6635c349dbc7Sjsg 	uint32_t se_id, uint32_t inst_id, uint32_t value,
6636c349dbc7Sjsg 	uint32_t *sec_count, uint32_t *ded_count)
6637fb4d8502Sjsg {
6638c349dbc7Sjsg 	uint32_t i;
6639c349dbc7Sjsg 	uint32_t sec_cnt, ded_cnt;
6640fb4d8502Sjsg 
6641c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_0_ras_fields); i++) {
6642c349dbc7Sjsg 		if(gfx_v9_0_ras_fields[i].reg_offset != reg->reg_offset ||
6643c349dbc7Sjsg 			gfx_v9_0_ras_fields[i].seg != reg->seg ||
6644c349dbc7Sjsg 			gfx_v9_0_ras_fields[i].inst != reg->inst)
6645c349dbc7Sjsg 			continue;
6646fb4d8502Sjsg 
6647c349dbc7Sjsg 		sec_cnt = (value &
6648c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].sec_count_mask) >>
6649c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].sec_count_shift;
6650c349dbc7Sjsg 		if (sec_cnt) {
6651ad8b1aafSjsg 			dev_info(adev->dev, "GFX SubBlock %s, "
6652ad8b1aafSjsg 				"Instance[%d][%d], SEC %d\n",
6653c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].name,
6654c349dbc7Sjsg 				se_id, inst_id,
6655c349dbc7Sjsg 				sec_cnt);
6656c349dbc7Sjsg 			*sec_count += sec_cnt;
6657c349dbc7Sjsg 		}
6658c349dbc7Sjsg 
6659c349dbc7Sjsg 		ded_cnt = (value &
6660c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].ded_count_mask) >>
6661c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].ded_count_shift;
6662c349dbc7Sjsg 		if (ded_cnt) {
6663ad8b1aafSjsg 			dev_info(adev->dev, "GFX SubBlock %s, "
6664ad8b1aafSjsg 				"Instance[%d][%d], DED %d\n",
6665c349dbc7Sjsg 				gfx_v9_0_ras_fields[i].name,
6666c349dbc7Sjsg 				se_id, inst_id,
6667c349dbc7Sjsg 				ded_cnt);
6668c349dbc7Sjsg 			*ded_count += ded_cnt;
6669c349dbc7Sjsg 		}
6670c349dbc7Sjsg 	}
6671c349dbc7Sjsg 
6672c349dbc7Sjsg 	return 0;
6673c349dbc7Sjsg }
6674c349dbc7Sjsg 
gfx_v9_0_reset_ras_error_count(struct amdgpu_device * adev)6675c349dbc7Sjsg static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev)
6676c349dbc7Sjsg {
6677c349dbc7Sjsg 	int i, j, k;
6678c349dbc7Sjsg 
6679c349dbc7Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
6680c349dbc7Sjsg 		return;
6681c349dbc7Sjsg 
6682c349dbc7Sjsg 	/* read back registers to clear the counters */
6683c349dbc7Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
6684c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_0_edc_counter_regs); i++) {
6685c349dbc7Sjsg 		for (j = 0; j < gfx_v9_0_edc_counter_regs[i].se_num; j++) {
6686c349dbc7Sjsg 			for (k = 0; k < gfx_v9_0_edc_counter_regs[i].instance; k++) {
6687f005ef32Sjsg 				amdgpu_gfx_select_se_sh(adev, j, 0x0, k, 0);
6688c349dbc7Sjsg 				RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));
6689c349dbc7Sjsg 			}
6690c349dbc7Sjsg 		}
6691c349dbc7Sjsg 	}
6692c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xe0000000);
6693c349dbc7Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
6694c349dbc7Sjsg 
6695c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, 255);
6696c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_CNT, 0);
6697c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, 255);
6698c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_CNT, 0);
6699c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, 255);
6700c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_CNT, 0);
6701c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, 255);
6702c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_CNT, 0);
6703c349dbc7Sjsg 
6704c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(vml2_mems); i++) {
6705c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, i);
6706c349dbc7Sjsg 		RREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_CNT);
6707c349dbc7Sjsg 	}
6708c349dbc7Sjsg 
6709c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(vml2_walker_mems); i++) {
6710c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, i);
6711c349dbc7Sjsg 		RREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_CNT);
6712c349dbc7Sjsg 	}
6713c349dbc7Sjsg 
6714c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(atc_l2_cache_2m_mems); i++) {
6715c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, i);
6716c349dbc7Sjsg 		RREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_CNT);
6717c349dbc7Sjsg 	}
6718c349dbc7Sjsg 
6719c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(atc_l2_cache_4k_mems); i++) {
6720c349dbc7Sjsg 		WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, i);
6721c349dbc7Sjsg 		RREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_CNT);
6722c349dbc7Sjsg 	}
6723c349dbc7Sjsg 
6724c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_MEM_ECC_INDEX, 255);
6725c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmVM_L2_WALKER_MEM_ECC_INDEX, 255);
6726c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_2M_EDC_INDEX, 255);
6727c349dbc7Sjsg 	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_EDC_INDEX, 255);
6728c349dbc7Sjsg }
6729c349dbc7Sjsg 
gfx_v9_0_query_ras_error_count(struct amdgpu_device * adev,void * ras_error_status)67301bb76ff1Sjsg static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,
6731c349dbc7Sjsg 					  void *ras_error_status)
6732c349dbc7Sjsg {
6733c349dbc7Sjsg 	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
6734c349dbc7Sjsg 	uint32_t sec_count = 0, ded_count = 0;
6735c349dbc7Sjsg 	uint32_t i, j, k;
6736c349dbc7Sjsg 	uint32_t reg_value;
6737c349dbc7Sjsg 
6738c349dbc7Sjsg 	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
67391bb76ff1Sjsg 		return;
6740c349dbc7Sjsg 
6741c349dbc7Sjsg 	err_data->ue_count = 0;
6742c349dbc7Sjsg 	err_data->ce_count = 0;
6743c349dbc7Sjsg 
6744c349dbc7Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
6745c349dbc7Sjsg 
6746c349dbc7Sjsg 	for (i = 0; i < ARRAY_SIZE(gfx_v9_0_edc_counter_regs); i++) {
6747c349dbc7Sjsg 		for (j = 0; j < gfx_v9_0_edc_counter_regs[i].se_num; j++) {
6748c349dbc7Sjsg 			for (k = 0; k < gfx_v9_0_edc_counter_regs[i].instance; k++) {
6749f005ef32Sjsg 				amdgpu_gfx_select_se_sh(adev, j, 0, k, 0);
6750c349dbc7Sjsg 				reg_value =
6751c349dbc7Sjsg 					RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));
6752c349dbc7Sjsg 				if (reg_value)
6753ad8b1aafSjsg 					gfx_v9_0_ras_error_count(adev,
6754ad8b1aafSjsg 						&gfx_v9_0_edc_counter_regs[i],
6755c349dbc7Sjsg 						j, k, reg_value,
6756c349dbc7Sjsg 						&sec_count, &ded_count);
6757c349dbc7Sjsg 			}
6758c349dbc7Sjsg 		}
6759c349dbc7Sjsg 	}
6760c349dbc7Sjsg 
6761c349dbc7Sjsg 	err_data->ce_count += sec_count;
6762c349dbc7Sjsg 	err_data->ue_count += ded_count;
6763c349dbc7Sjsg 
6764f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
6765c349dbc7Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
6766c349dbc7Sjsg 
6767c349dbc7Sjsg 	gfx_v9_0_query_utc_edc_status(adev, err_data);
6768fb4d8502Sjsg }
6769fb4d8502Sjsg 
gfx_v9_0_emit_mem_sync(struct amdgpu_ring * ring)6770ad8b1aafSjsg static void gfx_v9_0_emit_mem_sync(struct amdgpu_ring *ring)
6771ad8b1aafSjsg {
6772ad8b1aafSjsg 	const unsigned int cp_coher_cntl =
6773ad8b1aafSjsg 			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(1) |
6774ad8b1aafSjsg 			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(1) |
6775ad8b1aafSjsg 			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(1) |
6776ad8b1aafSjsg 			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(1) |
6777ad8b1aafSjsg 			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(1);
6778ad8b1aafSjsg 
6779ad8b1aafSjsg 	/* ACQUIRE_MEM -make one or more surfaces valid for use by the subsequent operations */
6780ad8b1aafSjsg 	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5));
6781ad8b1aafSjsg 	amdgpu_ring_write(ring, cp_coher_cntl); /* CP_COHER_CNTL */
6782ad8b1aafSjsg 	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */
6783ad8b1aafSjsg 	amdgpu_ring_write(ring, 0xffffff);  /* CP_COHER_SIZE_HI */
6784ad8b1aafSjsg 	amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */
6785ad8b1aafSjsg 	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE_HI */
6786ad8b1aafSjsg 	amdgpu_ring_write(ring, 0x0000000A); /* POLL_INTERVAL */
6787ad8b1aafSjsg }
6788ad8b1aafSjsg 
gfx_v9_0_emit_wave_limit_cs(struct amdgpu_ring * ring,uint32_t pipe,bool enable)67895ca02815Sjsg static void gfx_v9_0_emit_wave_limit_cs(struct amdgpu_ring *ring,
67905ca02815Sjsg 					uint32_t pipe, bool enable)
67915ca02815Sjsg {
67925ca02815Sjsg 	struct amdgpu_device *adev = ring->adev;
67935ca02815Sjsg 	uint32_t val;
67945ca02815Sjsg 	uint32_t wcl_cs_reg;
67955ca02815Sjsg 
67965ca02815Sjsg 	/* mmSPI_WCL_PIPE_PERCENT_CS[0-7]_DEFAULT values are same */
67975ca02815Sjsg 	val = enable ? 0x1 : mmSPI_WCL_PIPE_PERCENT_CS0_DEFAULT;
67985ca02815Sjsg 
67995ca02815Sjsg 	switch (pipe) {
68005ca02815Sjsg 	case 0:
68015ca02815Sjsg 		wcl_cs_reg = SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_CS0);
68025ca02815Sjsg 		break;
68035ca02815Sjsg 	case 1:
68045ca02815Sjsg 		wcl_cs_reg = SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_CS1);
68055ca02815Sjsg 		break;
68065ca02815Sjsg 	case 2:
68075ca02815Sjsg 		wcl_cs_reg = SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_CS2);
68085ca02815Sjsg 		break;
68095ca02815Sjsg 	case 3:
68105ca02815Sjsg 		wcl_cs_reg = SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_CS3);
68115ca02815Sjsg 		break;
68125ca02815Sjsg 	default:
68135ca02815Sjsg 		DRM_DEBUG("invalid pipe %d\n", pipe);
68145ca02815Sjsg 		return;
68155ca02815Sjsg 	}
68165ca02815Sjsg 
68175ca02815Sjsg 	amdgpu_ring_emit_wreg(ring, wcl_cs_reg, val);
68185ca02815Sjsg 
68195ca02815Sjsg }
gfx_v9_0_emit_wave_limit(struct amdgpu_ring * ring,bool enable)68205ca02815Sjsg static void gfx_v9_0_emit_wave_limit(struct amdgpu_ring *ring, bool enable)
68215ca02815Sjsg {
68225ca02815Sjsg 	struct amdgpu_device *adev = ring->adev;
68235ca02815Sjsg 	uint32_t val;
68245ca02815Sjsg 	int i;
68255ca02815Sjsg 
68265ca02815Sjsg 
68275ca02815Sjsg 	/* mmSPI_WCL_PIPE_PERCENT_GFX is 7 bit multiplier register to limit
68285ca02815Sjsg 	 * number of gfx waves. Setting 5 bit will make sure gfx only gets
68295ca02815Sjsg 	 * around 25% of gpu resources.
68305ca02815Sjsg 	 */
68315ca02815Sjsg 	val = enable ? 0x1f : mmSPI_WCL_PIPE_PERCENT_GFX_DEFAULT;
68325ca02815Sjsg 	amdgpu_ring_emit_wreg(ring,
68335ca02815Sjsg 			      SOC15_REG_OFFSET(GC, 0, mmSPI_WCL_PIPE_PERCENT_GFX),
68345ca02815Sjsg 			      val);
68355ca02815Sjsg 
68365ca02815Sjsg 	/* Restrict waves for normal/low priority compute queues as well
68375ca02815Sjsg 	 * to get best QoS for high priority compute jobs.
68385ca02815Sjsg 	 *
68395ca02815Sjsg 	 * amdgpu controls only 1st ME(0-3 CS pipes).
68405ca02815Sjsg 	 */
68415ca02815Sjsg 	for (i = 0; i < adev->gfx.mec.num_pipe_per_mec; i++) {
68425ca02815Sjsg 		if (i != ring->pipe)
68435ca02815Sjsg 			gfx_v9_0_emit_wave_limit_cs(ring, i, enable);
68445ca02815Sjsg 
68455ca02815Sjsg 	}
68465ca02815Sjsg }
68475ca02815Sjsg 
6848fb4d8502Sjsg static const struct amd_ip_funcs gfx_v9_0_ip_funcs = {
6849fb4d8502Sjsg 	.name = "gfx_v9_0",
6850fb4d8502Sjsg 	.early_init = gfx_v9_0_early_init,
6851fb4d8502Sjsg 	.late_init = gfx_v9_0_late_init,
6852fb4d8502Sjsg 	.sw_init = gfx_v9_0_sw_init,
6853fb4d8502Sjsg 	.sw_fini = gfx_v9_0_sw_fini,
6854fb4d8502Sjsg 	.hw_init = gfx_v9_0_hw_init,
6855fb4d8502Sjsg 	.hw_fini = gfx_v9_0_hw_fini,
6856fb4d8502Sjsg 	.suspend = gfx_v9_0_suspend,
6857fb4d8502Sjsg 	.resume = gfx_v9_0_resume,
6858fb4d8502Sjsg 	.is_idle = gfx_v9_0_is_idle,
6859fb4d8502Sjsg 	.wait_for_idle = gfx_v9_0_wait_for_idle,
6860fb4d8502Sjsg 	.soft_reset = gfx_v9_0_soft_reset,
6861fb4d8502Sjsg 	.set_clockgating_state = gfx_v9_0_set_clockgating_state,
6862fb4d8502Sjsg 	.set_powergating_state = gfx_v9_0_set_powergating_state,
6863fb4d8502Sjsg 	.get_clockgating_state = gfx_v9_0_get_clockgating_state,
6864fb4d8502Sjsg };
6865fb4d8502Sjsg 
6866fb4d8502Sjsg static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {
6867fb4d8502Sjsg 	.type = AMDGPU_RING_TYPE_GFX,
6868fb4d8502Sjsg 	.align_mask = 0xff,
6869fb4d8502Sjsg 	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
6870fb4d8502Sjsg 	.support_64bit_ptrs = true,
68711bb76ff1Sjsg 	.secure_submission_supported = true,
6872fb4d8502Sjsg 	.get_rptr = gfx_v9_0_ring_get_rptr_gfx,
6873fb4d8502Sjsg 	.get_wptr = gfx_v9_0_ring_get_wptr_gfx,
6874fb4d8502Sjsg 	.set_wptr = gfx_v9_0_ring_set_wptr_gfx,
6875fb4d8502Sjsg 	.emit_frame_size = /* totally 242 maximum if 16 IBs */
6876fb4d8502Sjsg 		5 +  /* COND_EXEC */
6877fb4d8502Sjsg 		7 +  /* PIPELINE_SYNC */
6878fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
6879fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
6880fb4d8502Sjsg 		2 + /* VM_FLUSH */
6881fb4d8502Sjsg 		8 +  /* FENCE for VM_FLUSH */
6882fb4d8502Sjsg 		20 + /* GDS switch */
6883fb4d8502Sjsg 		4 + /* double SWITCH_BUFFER,
6884fb4d8502Sjsg 		       the first COND_EXEC jump to the place just
6885fb4d8502Sjsg 			   prior to this double SWITCH_BUFFER  */
6886fb4d8502Sjsg 		5 + /* COND_EXEC */
6887fb4d8502Sjsg 		7 +	 /*	HDP_flush */
6888fb4d8502Sjsg 		4 +	 /*	VGT_flush */
6889fb4d8502Sjsg 		14 + /*	CE_META */
6890fb4d8502Sjsg 		31 + /*	DE_META */
6891fb4d8502Sjsg 		3 + /* CNTX_CTRL */
6892fb4d8502Sjsg 		5 + /* HDP_INVL */
6893fb4d8502Sjsg 		8 + 8 + /* FENCE x2 */
6894ad8b1aafSjsg 		2 + /* SWITCH_BUFFER */
6895ad8b1aafSjsg 		7, /* gfx_v9_0_emit_mem_sync */
6896fb4d8502Sjsg 	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_gfx */
6897fb4d8502Sjsg 	.emit_ib = gfx_v9_0_ring_emit_ib_gfx,
6898fb4d8502Sjsg 	.emit_fence = gfx_v9_0_ring_emit_fence,
6899fb4d8502Sjsg 	.emit_pipeline_sync = gfx_v9_0_ring_emit_pipeline_sync,
6900fb4d8502Sjsg 	.emit_vm_flush = gfx_v9_0_ring_emit_vm_flush,
6901fb4d8502Sjsg 	.emit_gds_switch = gfx_v9_0_ring_emit_gds_switch,
6902fb4d8502Sjsg 	.emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush,
6903fb4d8502Sjsg 	.test_ring = gfx_v9_0_ring_test_ring,
6904fb4d8502Sjsg 	.insert_nop = amdgpu_ring_insert_nop,
6905fb4d8502Sjsg 	.pad_ib = amdgpu_ring_generic_pad_ib,
6906fb4d8502Sjsg 	.emit_switch_buffer = gfx_v9_ring_emit_sb,
6907fb4d8502Sjsg 	.emit_cntxcntl = gfx_v9_ring_emit_cntxcntl,
6908fb4d8502Sjsg 	.init_cond_exec = gfx_v9_0_ring_emit_init_cond_exec,
6909fb4d8502Sjsg 	.patch_cond_exec = gfx_v9_0_ring_emit_patch_cond_exec,
6910f005ef32Sjsg 	.preempt_ib = gfx_v9_0_ring_preempt_ib,
6911f005ef32Sjsg 	.emit_frame_cntl = gfx_v9_0_ring_emit_frame_cntl,
6912f005ef32Sjsg 	.emit_wreg = gfx_v9_0_ring_emit_wreg,
6913f005ef32Sjsg 	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
6914f005ef32Sjsg 	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
6915f005ef32Sjsg 	.soft_recovery = gfx_v9_0_ring_soft_recovery,
6916f005ef32Sjsg 	.emit_mem_sync = gfx_v9_0_emit_mem_sync,
6917f005ef32Sjsg };
6918f005ef32Sjsg 
6919f005ef32Sjsg static const struct amdgpu_ring_funcs gfx_v9_0_sw_ring_funcs_gfx = {
6920f005ef32Sjsg 	.type = AMDGPU_RING_TYPE_GFX,
6921f005ef32Sjsg 	.align_mask = 0xff,
6922f005ef32Sjsg 	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
6923f005ef32Sjsg 	.support_64bit_ptrs = true,
6924f005ef32Sjsg 	.secure_submission_supported = true,
6925f005ef32Sjsg 	.get_rptr = amdgpu_sw_ring_get_rptr_gfx,
6926f005ef32Sjsg 	.get_wptr = amdgpu_sw_ring_get_wptr_gfx,
6927f005ef32Sjsg 	.set_wptr = amdgpu_sw_ring_set_wptr_gfx,
6928f005ef32Sjsg 	.emit_frame_size = /* totally 242 maximum if 16 IBs */
6929f005ef32Sjsg 		5 +  /* COND_EXEC */
6930f005ef32Sjsg 		7 +  /* PIPELINE_SYNC */
6931f005ef32Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
6932f005ef32Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
6933f005ef32Sjsg 		2 + /* VM_FLUSH */
6934f005ef32Sjsg 		8 +  /* FENCE for VM_FLUSH */
6935f005ef32Sjsg 		20 + /* GDS switch */
6936f005ef32Sjsg 		4 + /* double SWITCH_BUFFER,
6937f005ef32Sjsg 		     * the first COND_EXEC jump to the place just
6938f005ef32Sjsg 		     * prior to this double SWITCH_BUFFER
6939f005ef32Sjsg 		     */
6940f005ef32Sjsg 		5 + /* COND_EXEC */
6941f005ef32Sjsg 		7 +	 /*	HDP_flush */
6942f005ef32Sjsg 		4 +	 /*	VGT_flush */
6943f005ef32Sjsg 		14 + /*	CE_META */
6944f005ef32Sjsg 		31 + /*	DE_META */
6945f005ef32Sjsg 		3 + /* CNTX_CTRL */
6946f005ef32Sjsg 		5 + /* HDP_INVL */
6947f005ef32Sjsg 		8 + 8 + /* FENCE x2 */
6948f005ef32Sjsg 		2 + /* SWITCH_BUFFER */
6949f005ef32Sjsg 		7, /* gfx_v9_0_emit_mem_sync */
6950f005ef32Sjsg 	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_gfx */
6951f005ef32Sjsg 	.emit_ib = gfx_v9_0_ring_emit_ib_gfx,
6952f005ef32Sjsg 	.emit_fence = gfx_v9_0_ring_emit_fence,
6953f005ef32Sjsg 	.emit_pipeline_sync = gfx_v9_0_ring_emit_pipeline_sync,
6954f005ef32Sjsg 	.emit_vm_flush = gfx_v9_0_ring_emit_vm_flush,
6955f005ef32Sjsg 	.emit_gds_switch = gfx_v9_0_ring_emit_gds_switch,
6956f005ef32Sjsg 	.emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush,
6957f005ef32Sjsg 	.test_ring = gfx_v9_0_ring_test_ring,
6958f005ef32Sjsg 	.test_ib = gfx_v9_0_ring_test_ib,
6959f005ef32Sjsg 	.insert_nop = amdgpu_sw_ring_insert_nop,
6960f005ef32Sjsg 	.pad_ib = amdgpu_ring_generic_pad_ib,
6961f005ef32Sjsg 	.emit_switch_buffer = gfx_v9_ring_emit_sb,
6962f005ef32Sjsg 	.emit_cntxcntl = gfx_v9_ring_emit_cntxcntl,
6963f005ef32Sjsg 	.init_cond_exec = gfx_v9_0_ring_emit_init_cond_exec,
6964f005ef32Sjsg 	.patch_cond_exec = gfx_v9_0_ring_emit_patch_cond_exec,
6965ad8b1aafSjsg 	.emit_frame_cntl = gfx_v9_0_ring_emit_frame_cntl,
6966fb4d8502Sjsg 	.emit_wreg = gfx_v9_0_ring_emit_wreg,
6967fb4d8502Sjsg 	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
6968fb4d8502Sjsg 	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
6969c349dbc7Sjsg 	.soft_recovery = gfx_v9_0_ring_soft_recovery,
6970ad8b1aafSjsg 	.emit_mem_sync = gfx_v9_0_emit_mem_sync,
6971f005ef32Sjsg 	.patch_cntl = gfx_v9_0_ring_patch_cntl,
6972f005ef32Sjsg 	.patch_de = gfx_v9_0_ring_patch_de_meta,
6973f005ef32Sjsg 	.patch_ce = gfx_v9_0_ring_patch_ce_meta,
6974fb4d8502Sjsg };
6975fb4d8502Sjsg 
6976fb4d8502Sjsg static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
6977fb4d8502Sjsg 	.type = AMDGPU_RING_TYPE_COMPUTE,
6978fb4d8502Sjsg 	.align_mask = 0xff,
6979fb4d8502Sjsg 	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
6980fb4d8502Sjsg 	.support_64bit_ptrs = true,
6981fb4d8502Sjsg 	.get_rptr = gfx_v9_0_ring_get_rptr_compute,
6982fb4d8502Sjsg 	.get_wptr = gfx_v9_0_ring_get_wptr_compute,
6983fb4d8502Sjsg 	.set_wptr = gfx_v9_0_ring_set_wptr_compute,
6984fb4d8502Sjsg 	.emit_frame_size =
6985fb4d8502Sjsg 		20 + /* gfx_v9_0_ring_emit_gds_switch */
6986fb4d8502Sjsg 		7 + /* gfx_v9_0_ring_emit_hdp_flush */
6987fb4d8502Sjsg 		5 + /* hdp invalidate */
6988fb4d8502Sjsg 		7 + /* gfx_v9_0_ring_emit_pipeline_sync */
6989fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
6990fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
6991ad8b1aafSjsg 		8 + 8 + 8 + /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */
69925ca02815Sjsg 		7 + /* gfx_v9_0_emit_mem_sync */
69935ca02815Sjsg 		5 + /* gfx_v9_0_emit_wave_limit for updating mmSPI_WCL_PIPE_PERCENT_GFX register */
69945ca02815Sjsg 		15, /* for updating 3 mmSPI_WCL_PIPE_PERCENT_CS registers */
6995c349dbc7Sjsg 	.emit_ib_size =	7, /* gfx_v9_0_ring_emit_ib_compute */
6996fb4d8502Sjsg 	.emit_ib = gfx_v9_0_ring_emit_ib_compute,
6997fb4d8502Sjsg 	.emit_fence = gfx_v9_0_ring_emit_fence,
6998fb4d8502Sjsg 	.emit_pipeline_sync = gfx_v9_0_ring_emit_pipeline_sync,
6999fb4d8502Sjsg 	.emit_vm_flush = gfx_v9_0_ring_emit_vm_flush,
7000fb4d8502Sjsg 	.emit_gds_switch = gfx_v9_0_ring_emit_gds_switch,
7001fb4d8502Sjsg 	.emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush,
7002fb4d8502Sjsg 	.test_ring = gfx_v9_0_ring_test_ring,
7003fb4d8502Sjsg 	.test_ib = gfx_v9_0_ring_test_ib,
7004fb4d8502Sjsg 	.insert_nop = amdgpu_ring_insert_nop,
7005fb4d8502Sjsg 	.pad_ib = amdgpu_ring_generic_pad_ib,
7006fb4d8502Sjsg 	.emit_wreg = gfx_v9_0_ring_emit_wreg,
7007fb4d8502Sjsg 	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
7008fb4d8502Sjsg 	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
7009ad8b1aafSjsg 	.emit_mem_sync = gfx_v9_0_emit_mem_sync,
70105ca02815Sjsg 	.emit_wave_limit = gfx_v9_0_emit_wave_limit,
7011fb4d8502Sjsg };
7012fb4d8502Sjsg 
7013fb4d8502Sjsg static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
7014fb4d8502Sjsg 	.type = AMDGPU_RING_TYPE_KIQ,
7015fb4d8502Sjsg 	.align_mask = 0xff,
7016fb4d8502Sjsg 	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
7017fb4d8502Sjsg 	.support_64bit_ptrs = true,
7018fb4d8502Sjsg 	.get_rptr = gfx_v9_0_ring_get_rptr_compute,
7019fb4d8502Sjsg 	.get_wptr = gfx_v9_0_ring_get_wptr_compute,
7020fb4d8502Sjsg 	.set_wptr = gfx_v9_0_ring_set_wptr_compute,
7021fb4d8502Sjsg 	.emit_frame_size =
7022fb4d8502Sjsg 		20 + /* gfx_v9_0_ring_emit_gds_switch */
7023fb4d8502Sjsg 		7 + /* gfx_v9_0_ring_emit_hdp_flush */
7024fb4d8502Sjsg 		5 + /* hdp invalidate */
7025fb4d8502Sjsg 		7 + /* gfx_v9_0_ring_emit_pipeline_sync */
7026fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
7027fb4d8502Sjsg 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
7028fb4d8502Sjsg 		8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */
7029c349dbc7Sjsg 	.emit_ib_size =	7, /* gfx_v9_0_ring_emit_ib_compute */
7030fb4d8502Sjsg 	.emit_fence = gfx_v9_0_ring_emit_fence_kiq,
7031fb4d8502Sjsg 	.test_ring = gfx_v9_0_ring_test_ring,
7032fb4d8502Sjsg 	.insert_nop = amdgpu_ring_insert_nop,
7033fb4d8502Sjsg 	.pad_ib = amdgpu_ring_generic_pad_ib,
7034fb4d8502Sjsg 	.emit_rreg = gfx_v9_0_ring_emit_rreg,
7035fb4d8502Sjsg 	.emit_wreg = gfx_v9_0_ring_emit_wreg,
7036fb4d8502Sjsg 	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
7037fb4d8502Sjsg 	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
7038fb4d8502Sjsg };
7039fb4d8502Sjsg 
gfx_v9_0_set_ring_funcs(struct amdgpu_device * adev)7040fb4d8502Sjsg static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev)
7041fb4d8502Sjsg {
7042fb4d8502Sjsg 	int i;
7043fb4d8502Sjsg 
7044f005ef32Sjsg 	adev->gfx.kiq[0].ring.funcs = &gfx_v9_0_ring_funcs_kiq;
7045fb4d8502Sjsg 
7046fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_gfx_rings; i++)
7047fb4d8502Sjsg 		adev->gfx.gfx_ring[i].funcs = &gfx_v9_0_ring_funcs_gfx;
7048fb4d8502Sjsg 
7049f005ef32Sjsg 	if (adev->gfx.num_gfx_rings) {
7050f005ef32Sjsg 		for (i = 0; i < GFX9_NUM_SW_GFX_RINGS; i++)
7051f005ef32Sjsg 			adev->gfx.sw_gfx_ring[i].funcs = &gfx_v9_0_sw_ring_funcs_gfx;
7052f005ef32Sjsg 	}
7053f005ef32Sjsg 
7054fb4d8502Sjsg 	for (i = 0; i < adev->gfx.num_compute_rings; i++)
7055fb4d8502Sjsg 		adev->gfx.compute_ring[i].funcs = &gfx_v9_0_ring_funcs_compute;
7056fb4d8502Sjsg }
7057fb4d8502Sjsg 
7058fb4d8502Sjsg static const struct amdgpu_irq_src_funcs gfx_v9_0_eop_irq_funcs = {
7059fb4d8502Sjsg 	.set = gfx_v9_0_set_eop_interrupt_state,
7060fb4d8502Sjsg 	.process = gfx_v9_0_eop_irq,
7061fb4d8502Sjsg };
7062fb4d8502Sjsg 
7063fb4d8502Sjsg static const struct amdgpu_irq_src_funcs gfx_v9_0_priv_reg_irq_funcs = {
7064fb4d8502Sjsg 	.set = gfx_v9_0_set_priv_reg_fault_state,
7065fb4d8502Sjsg 	.process = gfx_v9_0_priv_reg_irq,
7066fb4d8502Sjsg };
7067fb4d8502Sjsg 
7068fb4d8502Sjsg static const struct amdgpu_irq_src_funcs gfx_v9_0_priv_inst_irq_funcs = {
7069fb4d8502Sjsg 	.set = gfx_v9_0_set_priv_inst_fault_state,
7070fb4d8502Sjsg 	.process = gfx_v9_0_priv_inst_irq,
7071fb4d8502Sjsg };
7072fb4d8502Sjsg 
7073c349dbc7Sjsg static const struct amdgpu_irq_src_funcs gfx_v9_0_cp_ecc_error_irq_funcs = {
7074c349dbc7Sjsg 	.set = gfx_v9_0_set_cp_ecc_error_state,
7075c349dbc7Sjsg 	.process = amdgpu_gfx_cp_ecc_error_irq,
7076c349dbc7Sjsg };
7077c349dbc7Sjsg 
7078c349dbc7Sjsg 
gfx_v9_0_set_irq_funcs(struct amdgpu_device * adev)7079fb4d8502Sjsg static void gfx_v9_0_set_irq_funcs(struct amdgpu_device *adev)
7080fb4d8502Sjsg {
7081fb4d8502Sjsg 	adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;
7082fb4d8502Sjsg 	adev->gfx.eop_irq.funcs = &gfx_v9_0_eop_irq_funcs;
7083fb4d8502Sjsg 
7084fb4d8502Sjsg 	adev->gfx.priv_reg_irq.num_types = 1;
7085fb4d8502Sjsg 	adev->gfx.priv_reg_irq.funcs = &gfx_v9_0_priv_reg_irq_funcs;
7086fb4d8502Sjsg 
7087fb4d8502Sjsg 	adev->gfx.priv_inst_irq.num_types = 1;
7088fb4d8502Sjsg 	adev->gfx.priv_inst_irq.funcs = &gfx_v9_0_priv_inst_irq_funcs;
7089fb4d8502Sjsg 
7090c349dbc7Sjsg 	adev->gfx.cp_ecc_error_irq.num_types = 2; /*C5 ECC error and C9 FUE error*/
7091c349dbc7Sjsg 	adev->gfx.cp_ecc_error_irq.funcs = &gfx_v9_0_cp_ecc_error_irq_funcs;
7092fb4d8502Sjsg }
7093fb4d8502Sjsg 
gfx_v9_0_set_rlc_funcs(struct amdgpu_device * adev)7094fb4d8502Sjsg static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev)
7095fb4d8502Sjsg {
70961bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
70971bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
70981bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
70991bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
71001bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
71011bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
71021bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
71031bb76ff1Sjsg 	case IP_VERSION(9, 3, 0):
71041bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
7105fb4d8502Sjsg 		adev->gfx.rlc.funcs = &gfx_v9_0_rlc_funcs;
7106fb4d8502Sjsg 		break;
7107fb4d8502Sjsg 	default:
7108fb4d8502Sjsg 		break;
7109fb4d8502Sjsg 	}
7110fb4d8502Sjsg }
7111fb4d8502Sjsg 
gfx_v9_0_set_gds_init(struct amdgpu_device * adev)7112fb4d8502Sjsg static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev)
7113fb4d8502Sjsg {
7114fb4d8502Sjsg 	/* init asci gds info */
71151bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
71161bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
71171bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
71181bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
7119c349dbc7Sjsg 		adev->gds.gds_size = 0x10000;
7120c349dbc7Sjsg 		break;
71211bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
71221bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
71231bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
7124c349dbc7Sjsg 		adev->gds.gds_size = 0x1000;
7125c349dbc7Sjsg 		break;
71261bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
71275ca02815Sjsg 		/* aldebaran removed all the GDS internal memory,
71285ca02815Sjsg 		 * only support GWS opcode in kernel, like barrier
71295ca02815Sjsg 		 * semaphore.etc */
71305ca02815Sjsg 		adev->gds.gds_size = 0;
71315ca02815Sjsg 		break;
7132c349dbc7Sjsg 	default:
7133c349dbc7Sjsg 		adev->gds.gds_size = 0x10000;
7134c349dbc7Sjsg 		break;
7135fb4d8502Sjsg 	}
7136c349dbc7Sjsg 
71371bb76ff1Sjsg 	switch (adev->ip_versions[GC_HWIP][0]) {
71381bb76ff1Sjsg 	case IP_VERSION(9, 0, 1):
71391bb76ff1Sjsg 	case IP_VERSION(9, 4, 0):
7140c349dbc7Sjsg 		adev->gds.gds_compute_max_wave_id = 0x7ff;
7141c349dbc7Sjsg 		break;
71421bb76ff1Sjsg 	case IP_VERSION(9, 2, 1):
7143c349dbc7Sjsg 		adev->gds.gds_compute_max_wave_id = 0x27f;
7144c349dbc7Sjsg 		break;
71451bb76ff1Sjsg 	case IP_VERSION(9, 2, 2):
71461bb76ff1Sjsg 	case IP_VERSION(9, 1, 0):
7147ad8b1aafSjsg 		if (adev->apu_flags & AMD_APU_IS_RAVEN2)
7148c349dbc7Sjsg 			adev->gds.gds_compute_max_wave_id = 0x77; /* raven2 */
7149c349dbc7Sjsg 		else
7150c349dbc7Sjsg 			adev->gds.gds_compute_max_wave_id = 0x15f; /* raven1 */
7151c349dbc7Sjsg 		break;
71521bb76ff1Sjsg 	case IP_VERSION(9, 4, 1):
7153c349dbc7Sjsg 		adev->gds.gds_compute_max_wave_id = 0xfff;
7154c349dbc7Sjsg 		break;
71551bb76ff1Sjsg 	case IP_VERSION(9, 4, 2):
71565ca02815Sjsg 		/* deprecated for Aldebaran, no usage at all */
71575ca02815Sjsg 		adev->gds.gds_compute_max_wave_id = 0;
71585ca02815Sjsg 		break;
7159c349dbc7Sjsg 	default:
7160c349dbc7Sjsg 		/* this really depends on the chip */
7161c349dbc7Sjsg 		adev->gds.gds_compute_max_wave_id = 0x7ff;
7162c349dbc7Sjsg 		break;
7163c349dbc7Sjsg 	}
7164c349dbc7Sjsg 
7165c349dbc7Sjsg 	adev->gds.gws_size = 64;
7166c349dbc7Sjsg 	adev->gds.oa_size = 16;
7167fb4d8502Sjsg }
7168fb4d8502Sjsg 
gfx_v9_0_set_user_cu_inactive_bitmap(struct amdgpu_device * adev,u32 bitmap)7169fb4d8502Sjsg static void gfx_v9_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,
7170fb4d8502Sjsg 						 u32 bitmap)
7171fb4d8502Sjsg {
7172fb4d8502Sjsg 	u32 data;
7173fb4d8502Sjsg 
7174fb4d8502Sjsg 	if (!bitmap)
7175fb4d8502Sjsg 		return;
7176fb4d8502Sjsg 
7177fb4d8502Sjsg 	data = bitmap << GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
7178fb4d8502Sjsg 	data &= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
7179fb4d8502Sjsg 
7180fb4d8502Sjsg 	WREG32_SOC15(GC, 0, mmGC_USER_SHADER_ARRAY_CONFIG, data);
7181fb4d8502Sjsg }
7182fb4d8502Sjsg 
gfx_v9_0_get_cu_active_bitmap(struct amdgpu_device * adev)7183fb4d8502Sjsg static u32 gfx_v9_0_get_cu_active_bitmap(struct amdgpu_device *adev)
7184fb4d8502Sjsg {
7185fb4d8502Sjsg 	u32 data, mask;
7186fb4d8502Sjsg 
7187fb4d8502Sjsg 	data = RREG32_SOC15(GC, 0, mmCC_GC_SHADER_ARRAY_CONFIG);
7188fb4d8502Sjsg 	data |= RREG32_SOC15(GC, 0, mmGC_USER_SHADER_ARRAY_CONFIG);
7189fb4d8502Sjsg 
7190fb4d8502Sjsg 	data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
7191fb4d8502Sjsg 	data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
7192fb4d8502Sjsg 
7193fb4d8502Sjsg 	mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_cu_per_sh);
7194fb4d8502Sjsg 
7195fb4d8502Sjsg 	return (~data) & mask;
7196fb4d8502Sjsg }
7197fb4d8502Sjsg 
gfx_v9_0_get_cu_info(struct amdgpu_device * adev,struct amdgpu_cu_info * cu_info)7198fb4d8502Sjsg static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,
7199fb4d8502Sjsg 				 struct amdgpu_cu_info *cu_info)
7200fb4d8502Sjsg {
7201fb4d8502Sjsg 	int i, j, k, counter, active_cu_number = 0;
7202fb4d8502Sjsg 	u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
7203c349dbc7Sjsg 	unsigned disable_masks[4 * 4];
7204fb4d8502Sjsg 
7205fb4d8502Sjsg 	if (!adev || !cu_info)
7206fb4d8502Sjsg 		return -EINVAL;
7207fb4d8502Sjsg 
7208c349dbc7Sjsg 	/*
7209c349dbc7Sjsg 	 * 16 comes from bitmap array size 4*4, and it can cover all gfx9 ASICs
7210c349dbc7Sjsg 	 */
7211c349dbc7Sjsg 	if (adev->gfx.config.max_shader_engines *
7212c349dbc7Sjsg 		adev->gfx.config.max_sh_per_se > 16)
7213c349dbc7Sjsg 		return -EINVAL;
7214c349dbc7Sjsg 
7215c349dbc7Sjsg 	amdgpu_gfx_parse_disable_cu(disable_masks,
7216c349dbc7Sjsg 				    adev->gfx.config.max_shader_engines,
7217c349dbc7Sjsg 				    adev->gfx.config.max_sh_per_se);
7218fb4d8502Sjsg 
7219fb4d8502Sjsg 	mutex_lock(&adev->grbm_idx_mutex);
7220fb4d8502Sjsg 	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
7221fb4d8502Sjsg 		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
7222fb4d8502Sjsg 			mask = 1;
7223fb4d8502Sjsg 			ao_bitmap = 0;
7224fb4d8502Sjsg 			counter = 0;
7225f005ef32Sjsg 			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);
7226fb4d8502Sjsg 			gfx_v9_0_set_user_cu_inactive_bitmap(
7227c349dbc7Sjsg 				adev, disable_masks[i * adev->gfx.config.max_sh_per_se + j]);
7228fb4d8502Sjsg 			bitmap = gfx_v9_0_get_cu_active_bitmap(adev);
7229c349dbc7Sjsg 
7230c349dbc7Sjsg 			/*
7231c349dbc7Sjsg 			 * The bitmap(and ao_cu_bitmap) in cu_info structure is
7232c349dbc7Sjsg 			 * 4x4 size array, and it's usually suitable for Vega
7233c349dbc7Sjsg 			 * ASICs which has 4*2 SE/SH layout.
7234c349dbc7Sjsg 			 * But for Arcturus, SE/SH layout is changed to 8*1.
7235c349dbc7Sjsg 			 * To mostly reduce the impact, we make it compatible
7236c349dbc7Sjsg 			 * with current bitmap array as below:
7237c349dbc7Sjsg 			 *    SE4,SH0 --> bitmap[0][1]
7238c349dbc7Sjsg 			 *    SE5,SH0 --> bitmap[1][1]
7239c349dbc7Sjsg 			 *    SE6,SH0 --> bitmap[2][1]
7240c349dbc7Sjsg 			 *    SE7,SH0 --> bitmap[3][1]
7241c349dbc7Sjsg 			 */
7242f005ef32Sjsg 			cu_info->bitmap[0][i % 4][j + i / 4] = bitmap;
7243fb4d8502Sjsg 
7244fb4d8502Sjsg 			for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {
7245fb4d8502Sjsg 				if (bitmap & mask) {
7246fb4d8502Sjsg 					if (counter < adev->gfx.config.max_cu_per_sh)
7247fb4d8502Sjsg 						ao_bitmap |= mask;
7248fb4d8502Sjsg 					counter ++;
7249fb4d8502Sjsg 				}
7250fb4d8502Sjsg 				mask <<= 1;
7251fb4d8502Sjsg 			}
7252fb4d8502Sjsg 			active_cu_number += counter;
7253fb4d8502Sjsg 			if (i < 2 && j < 2)
7254fb4d8502Sjsg 				ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
7255c349dbc7Sjsg 			cu_info->ao_cu_bitmap[i % 4][j + i / 4] = ao_bitmap;
7256fb4d8502Sjsg 		}
7257fb4d8502Sjsg 	}
7258f005ef32Sjsg 	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
7259fb4d8502Sjsg 	mutex_unlock(&adev->grbm_idx_mutex);
7260fb4d8502Sjsg 
7261fb4d8502Sjsg 	cu_info->number = active_cu_number;
7262fb4d8502Sjsg 	cu_info->ao_cu_mask = ao_cu_mask;
7263fb4d8502Sjsg 	cu_info->simd_per_cu = NUM_SIMD_PER_CU;
7264fb4d8502Sjsg 
7265fb4d8502Sjsg 	return 0;
7266fb4d8502Sjsg }
7267fb4d8502Sjsg 
7268fb4d8502Sjsg const struct amdgpu_ip_block_version gfx_v9_0_ip_block =
7269fb4d8502Sjsg {
7270fb4d8502Sjsg 	.type = AMD_IP_BLOCK_TYPE_GFX,
7271fb4d8502Sjsg 	.major = 9,
7272fb4d8502Sjsg 	.minor = 0,
7273fb4d8502Sjsg 	.rev = 0,
7274fb4d8502Sjsg 	.funcs = &gfx_v9_0_ip_funcs,
7275fb4d8502Sjsg };
7276