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