xref: /linux-6.15/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c (revision 5c0a1cdd)
1ab71ac56SXiangliang Yu /*
2ab71ac56SXiangliang Yu  * Copyright 2017 Advanced Micro Devices, Inc.
3ab71ac56SXiangliang Yu  *
4ab71ac56SXiangliang Yu  * Permission is hereby granted, free of charge, to any person obtaining a
5ab71ac56SXiangliang Yu  * copy of this software and associated documentation files (the "Software"),
6ab71ac56SXiangliang Yu  * to deal in the Software without restriction, including without limitation
7ab71ac56SXiangliang Yu  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ab71ac56SXiangliang Yu  * and/or sell copies of the Software, and to permit persons to whom the
9ab71ac56SXiangliang Yu  * Software is furnished to do so, subject to the following conditions:
10ab71ac56SXiangliang Yu  *
11ab71ac56SXiangliang Yu  * The above copyright notice and this permission notice shall be included in
12ab71ac56SXiangliang Yu  * all copies or substantial portions of the Software.
13ab71ac56SXiangliang Yu  *
14ab71ac56SXiangliang Yu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ab71ac56SXiangliang Yu  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ab71ac56SXiangliang Yu  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17ab71ac56SXiangliang Yu  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18ab71ac56SXiangliang Yu  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ab71ac56SXiangliang Yu  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20ab71ac56SXiangliang Yu  * OTHER DEALINGS IN THE SOFTWARE.
21ab71ac56SXiangliang Yu  *
22ab71ac56SXiangliang Yu  * Authors: [email protected]
23ab71ac56SXiangliang Yu  */
24ab71ac56SXiangliang Yu 
25ab71ac56SXiangliang Yu #include "amdgpu.h"
26ab71ac56SXiangliang Yu #include "vi.h"
27ab71ac56SXiangliang Yu #include "bif/bif_5_0_d.h"
28ab71ac56SXiangliang Yu #include "bif/bif_5_0_sh_mask.h"
29ab71ac56SXiangliang Yu #include "vid.h"
30ab71ac56SXiangliang Yu #include "gca/gfx_8_0_d.h"
31ab71ac56SXiangliang Yu #include "gca/gfx_8_0_sh_mask.h"
32ab71ac56SXiangliang Yu #include "gmc_v8_0.h"
33ab71ac56SXiangliang Yu #include "gfx_v8_0.h"
34ab71ac56SXiangliang Yu #include "sdma_v3_0.h"
35ab71ac56SXiangliang Yu #include "tonga_ih.h"
36ab71ac56SXiangliang Yu #include "gmc/gmc_8_2_d.h"
37ab71ac56SXiangliang Yu #include "gmc/gmc_8_2_sh_mask.h"
38ab71ac56SXiangliang Yu #include "oss/oss_3_0_d.h"
39ab71ac56SXiangliang Yu #include "oss/oss_3_0_sh_mask.h"
40ab71ac56SXiangliang Yu #include "dce/dce_10_0_d.h"
41ab71ac56SXiangliang Yu #include "dce/dce_10_0_sh_mask.h"
42ab71ac56SXiangliang Yu #include "smu/smu_7_1_3_d.h"
43ab71ac56SXiangliang Yu #include "mxgpu_vi.h"
44ab71ac56SXiangliang Yu 
45cfbb6b00SAndrey Grodzovsky #include "amdgpu_reset.h"
46cfbb6b00SAndrey Grodzovsky 
47ab71ac56SXiangliang Yu /* VI golden setting */
48ab71ac56SXiangliang Yu static const u32 xgpu_fiji_mgcg_cgcg_init[] = {
49ab71ac56SXiangliang Yu 	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xffffffff,
50ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
51ab71ac56SXiangliang Yu 	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
52ab71ac56SXiangliang Yu 	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
53ab71ac56SXiangliang Yu 	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
54ab71ac56SXiangliang Yu 	mmCGTT_CPC_CLK_CTRL, 0xffffffff, 0x00000100,
55ab71ac56SXiangliang Yu 	mmCGTT_CPF_CLK_CTRL, 0xffffffff, 0x40000100,
56ab71ac56SXiangliang Yu 	mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
57ab71ac56SXiangliang Yu 	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
58ab71ac56SXiangliang Yu 	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
59ab71ac56SXiangliang Yu 	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
60ab71ac56SXiangliang Yu 	mmCGTT_WD_CLK_CTRL, 0xffffffff, 0x06000100,
61ab71ac56SXiangliang Yu 	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
62ab71ac56SXiangliang Yu 	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
63ab71ac56SXiangliang Yu 	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
64ab71ac56SXiangliang Yu 	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
65ab71ac56SXiangliang Yu 	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
66ab71ac56SXiangliang Yu 	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
67ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
68ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
69ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
70ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
71ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL4, 0xffffffff, 0x00000100,
72ab71ac56SXiangliang Yu 	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
73ab71ac56SXiangliang Yu 	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
74ab71ac56SXiangliang Yu 	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
75ab71ac56SXiangliang Yu 	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
76ab71ac56SXiangliang Yu 	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
77ab71ac56SXiangliang Yu 	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
78ab71ac56SXiangliang Yu 	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
79ab71ac56SXiangliang Yu 	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
80ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
81ab71ac56SXiangliang Yu 	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96e00200,
82ab71ac56SXiangliang Yu 	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
83ab71ac56SXiangliang Yu 	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003c,
84ab71ac56SXiangliang Yu 	mmPCIE_INDEX, 0xffffffff, 0x0140001c,
85ab71ac56SXiangliang Yu 	mmPCIE_DATA, 0x000f0000, 0x00000000,
86ab71ac56SXiangliang Yu 	mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
87ab71ac56SXiangliang Yu 	mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
88ab71ac56SXiangliang Yu 	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
89ab71ac56SXiangliang Yu 	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
90ab71ac56SXiangliang Yu 	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
91ab71ac56SXiangliang Yu 	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
92ab71ac56SXiangliang Yu 	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
93ab71ac56SXiangliang Yu 	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
94ab71ac56SXiangliang Yu 	mmSDMA0_CLK_CTRL, 0xff000ff0, 0x00000100,
95ab71ac56SXiangliang Yu 	mmSDMA1_CLK_CTRL, 0xff000ff0, 0x00000100,
96ab71ac56SXiangliang Yu };
97ab71ac56SXiangliang Yu 
98ab71ac56SXiangliang Yu static const u32 xgpu_fiji_golden_settings_a10[] = {
99ab71ac56SXiangliang Yu 	mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
100ab71ac56SXiangliang Yu 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
101ab71ac56SXiangliang Yu 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
102ab71ac56SXiangliang Yu 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
103ab71ac56SXiangliang Yu 	mmFBC_MISC, 0x1f311fff, 0x12300000,
104ab71ac56SXiangliang Yu 	mmHDMI_CONTROL, 0x31000111, 0x00000011,
105ab71ac56SXiangliang Yu 	mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
106ab71ac56SXiangliang Yu 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
107ab71ac56SXiangliang Yu 	mmSDMA0_CHICKEN_BITS, 0xfc910007, 0x00810007,
108ab71ac56SXiangliang Yu 	mmSDMA0_GFX_IB_CNTL, 0x800f0111, 0x00000100,
109ab71ac56SXiangliang Yu 	mmSDMA0_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
110ab71ac56SXiangliang Yu 	mmSDMA0_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
111ab71ac56SXiangliang Yu 	mmSDMA1_CHICKEN_BITS, 0xfc910007, 0x00810007,
112ab71ac56SXiangliang Yu 	mmSDMA1_GFX_IB_CNTL, 0x800f0111, 0x00000100,
113ab71ac56SXiangliang Yu 	mmSDMA1_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
114ab71ac56SXiangliang Yu 	mmSDMA1_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
115ab71ac56SXiangliang Yu 	mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
116ab71ac56SXiangliang Yu 	mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
117ab71ac56SXiangliang Yu 	mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
118ab71ac56SXiangliang Yu 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000ff,
119ab71ac56SXiangliang Yu 	mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
120ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
121ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
122ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
123ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
124ab71ac56SXiangliang Yu };
125ab71ac56SXiangliang Yu 
126ab71ac56SXiangliang Yu static const u32 xgpu_fiji_golden_common_all[] = {
127ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
128ab71ac56SXiangliang Yu 	mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x3a00161a,
129ab71ac56SXiangliang Yu 	mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002e,
130ab71ac56SXiangliang Yu 	mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
131ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
132ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
133ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
134ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF,
135ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
136ab71ac56SXiangliang Yu 	mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x00000009,
137ab71ac56SXiangliang Yu };
138ab71ac56SXiangliang Yu 
139ab71ac56SXiangliang Yu static const u32 xgpu_tonga_mgcg_cgcg_init[] = {
140ab71ac56SXiangliang Yu 	mmRLC_CGTT_MGCG_OVERRIDE,   0xffffffff, 0xffffffff,
141ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX,           0xffffffff, 0xe0000000,
142ab71ac56SXiangliang Yu 	mmCB_CGTT_SCLK_CTRL,        0xffffffff, 0x00000100,
143ab71ac56SXiangliang Yu 	mmCGTT_BCI_CLK_CTRL,        0xffffffff, 0x00000100,
144ab71ac56SXiangliang Yu 	mmCGTT_CP_CLK_CTRL,         0xffffffff, 0x00000100,
145ab71ac56SXiangliang Yu 	mmCGTT_CPC_CLK_CTRL,        0xffffffff, 0x00000100,
146ab71ac56SXiangliang Yu 	mmCGTT_CPF_CLK_CTRL,        0xffffffff, 0x40000100,
147ab71ac56SXiangliang Yu 	mmCGTT_DRM_CLK_CTRL0,       0xffffffff, 0x00600100,
148ab71ac56SXiangliang Yu 	mmCGTT_GDS_CLK_CTRL,        0xffffffff, 0x00000100,
149ab71ac56SXiangliang Yu 	mmCGTT_IA_CLK_CTRL,         0xffffffff, 0x06000100,
150ab71ac56SXiangliang Yu 	mmCGTT_PA_CLK_CTRL,         0xffffffff, 0x00000100,
151ab71ac56SXiangliang Yu 	mmCGTT_WD_CLK_CTRL,         0xffffffff, 0x06000100,
152ab71ac56SXiangliang Yu 	mmCGTT_PC_CLK_CTRL,         0xffffffff, 0x00000100,
153ab71ac56SXiangliang Yu 	mmCGTT_RLC_CLK_CTRL,        0xffffffff, 0x00000100,
154ab71ac56SXiangliang Yu 	mmCGTT_SC_CLK_CTRL,         0xffffffff, 0x00000100,
155ab71ac56SXiangliang Yu 	mmCGTT_SPI_CLK_CTRL,        0xffffffff, 0x00000100,
156ab71ac56SXiangliang Yu 	mmCGTT_SQ_CLK_CTRL,         0xffffffff, 0x00000100,
157ab71ac56SXiangliang Yu 	mmCGTT_SQG_CLK_CTRL,        0xffffffff, 0x00000100,
158ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL0,        0xffffffff, 0x00000100,
159ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL1,        0xffffffff, 0x00000100,
160ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL2,        0xffffffff, 0x00000100,
161ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL3,        0xffffffff, 0x00000100,
162ab71ac56SXiangliang Yu 	mmCGTT_SX_CLK_CTRL4,        0xffffffff, 0x00000100,
163ab71ac56SXiangliang Yu 	mmCGTT_TCI_CLK_CTRL,        0xffffffff, 0x00000100,
164ab71ac56SXiangliang Yu 	mmCGTT_TCP_CLK_CTRL,        0xffffffff, 0x00000100,
165ab71ac56SXiangliang Yu 	mmCGTT_VGT_CLK_CTRL,        0xffffffff, 0x06000100,
166ab71ac56SXiangliang Yu 	mmDB_CGTT_CLK_CTRL_0,       0xffffffff, 0x00000100,
167ab71ac56SXiangliang Yu 	mmTA_CGTT_CTRL,             0xffffffff, 0x00000100,
168ab71ac56SXiangliang Yu 	mmTCA_CGTT_SCLK_CTRL,       0xffffffff, 0x00000100,
169ab71ac56SXiangliang Yu 	mmTCC_CGTT_SCLK_CTRL,       0xffffffff, 0x00000100,
170ab71ac56SXiangliang Yu 	mmTD_CGTT_CTRL,             0xffffffff, 0x00000100,
171ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX,           0xffffffff, 0xe0000000,
172ab71ac56SXiangliang Yu 	mmCGTS_CU0_SP0_CTRL_REG,    0xffffffff, 0x00010000,
173ab71ac56SXiangliang Yu 	mmCGTS_CU0_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
174ab71ac56SXiangliang Yu 	mmCGTS_CU0_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
175ab71ac56SXiangliang Yu 	mmCGTS_CU0_SP1_CTRL_REG,    0xffffffff, 0x00060005,
176ab71ac56SXiangliang Yu 	mmCGTS_CU0_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
177ab71ac56SXiangliang Yu 	mmCGTS_CU1_SP0_CTRL_REG,    0xffffffff, 0x00010000,
178ab71ac56SXiangliang Yu 	mmCGTS_CU1_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
179ab71ac56SXiangliang Yu 	mmCGTS_CU1_TA_CTRL_REG,     0xffffffff, 0x00040007,
180ab71ac56SXiangliang Yu 	mmCGTS_CU1_SP1_CTRL_REG,    0xffffffff, 0x00060005,
181ab71ac56SXiangliang Yu 	mmCGTS_CU1_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
182ab71ac56SXiangliang Yu 	mmCGTS_CU2_SP0_CTRL_REG,    0xffffffff, 0x00010000,
183ab71ac56SXiangliang Yu 	mmCGTS_CU2_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
184ab71ac56SXiangliang Yu 	mmCGTS_CU2_TA_CTRL_REG,     0xffffffff, 0x00040007,
185ab71ac56SXiangliang Yu 	mmCGTS_CU2_SP1_CTRL_REG,    0xffffffff, 0x00060005,
186ab71ac56SXiangliang Yu 	mmCGTS_CU2_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
187ab71ac56SXiangliang Yu 	mmCGTS_CU3_SP0_CTRL_REG,    0xffffffff, 0x00010000,
188ab71ac56SXiangliang Yu 	mmCGTS_CU3_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
189ab71ac56SXiangliang Yu 	mmCGTS_CU3_TA_CTRL_REG,     0xffffffff, 0x00040007,
190ab71ac56SXiangliang Yu 	mmCGTS_CU3_SP1_CTRL_REG,    0xffffffff, 0x00060005,
191ab71ac56SXiangliang Yu 	mmCGTS_CU3_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
192ab71ac56SXiangliang Yu 	mmCGTS_CU4_SP0_CTRL_REG,    0xffffffff, 0x00010000,
193ab71ac56SXiangliang Yu 	mmCGTS_CU4_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
194ab71ac56SXiangliang Yu 	mmCGTS_CU4_TA_SQC_CTRL_REG, 0xffffffff, 0x00040007,
195ab71ac56SXiangliang Yu 	mmCGTS_CU4_SP1_CTRL_REG,    0xffffffff, 0x00060005,
196ab71ac56SXiangliang Yu 	mmCGTS_CU4_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
197ab71ac56SXiangliang Yu 	mmCGTS_CU5_SP0_CTRL_REG,    0xffffffff, 0x00010000,
198ab71ac56SXiangliang Yu 	mmCGTS_CU5_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
199ab71ac56SXiangliang Yu 	mmCGTS_CU5_TA_CTRL_REG,     0xffffffff, 0x00040007,
200ab71ac56SXiangliang Yu 	mmCGTS_CU5_SP1_CTRL_REG,    0xffffffff, 0x00060005,
201ab71ac56SXiangliang Yu 	mmCGTS_CU5_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
202ab71ac56SXiangliang Yu 	mmCGTS_CU6_SP0_CTRL_REG,    0xffffffff, 0x00010000,
203ab71ac56SXiangliang Yu 	mmCGTS_CU6_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
204ab71ac56SXiangliang Yu 	mmCGTS_CU6_TA_CTRL_REG,     0xffffffff, 0x00040007,
205ab71ac56SXiangliang Yu 	mmCGTS_CU6_SP1_CTRL_REG,    0xffffffff, 0x00060005,
206ab71ac56SXiangliang Yu 	mmCGTS_CU6_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
207ab71ac56SXiangliang Yu 	mmCGTS_CU7_SP0_CTRL_REG,    0xffffffff, 0x00010000,
208ab71ac56SXiangliang Yu 	mmCGTS_CU7_LDS_SQ_CTRL_REG, 0xffffffff, 0x00030002,
209ab71ac56SXiangliang Yu 	mmCGTS_CU7_TA_CTRL_REG,     0xffffffff, 0x00040007,
210ab71ac56SXiangliang Yu 	mmCGTS_CU7_SP1_CTRL_REG,    0xffffffff, 0x00060005,
211ab71ac56SXiangliang Yu 	mmCGTS_CU7_TD_TCP_CTRL_REG, 0xffffffff, 0x00090008,
212ab71ac56SXiangliang Yu 	mmCGTS_SM_CTRL_REG,         0xffffffff, 0x96e00200,
213ab71ac56SXiangliang Yu 	mmCP_RB_WPTR_POLL_CNTL,     0xffffffff, 0x00900100,
214ab71ac56SXiangliang Yu 	mmRLC_CGCG_CGLS_CTRL,       0xffffffff, 0x0020003c,
215ab71ac56SXiangliang Yu 	mmPCIE_INDEX,               0xffffffff, 0x0140001c,
216ab71ac56SXiangliang Yu 	mmPCIE_DATA,                0x000f0000, 0x00000000,
217ab71ac56SXiangliang Yu 	mmSMC_IND_INDEX_4,          0xffffffff, 0xC060000C,
218ab71ac56SXiangliang Yu 	mmSMC_IND_DATA_4,           0xc0000fff, 0x00000100,
219ab71ac56SXiangliang Yu 	mmXDMA_CLOCK_GATING_CNTL,   0xffffffff, 0x00000100,
220ab71ac56SXiangliang Yu 	mmXDMA_MEM_POWER_CNTL,      0x00000101, 0x00000000,
221ab71ac56SXiangliang Yu 	mmMC_MEM_POWER_LS,          0xffffffff, 0x00000104,
222ab71ac56SXiangliang Yu 	mmCGTT_DRM_CLK_CTRL0,       0xff000fff, 0x00000100,
223ab71ac56SXiangliang Yu 	mmHDP_XDP_CGTT_BLK_CTRL,    0xc0000fff, 0x00000104,
224ab71ac56SXiangliang Yu 	mmCP_MEM_SLP_CNTL,          0x00000001, 0x00000001,
225ab71ac56SXiangliang Yu 	mmSDMA0_CLK_CTRL,           0xff000ff0, 0x00000100,
226ab71ac56SXiangliang Yu 	mmSDMA1_CLK_CTRL,           0xff000ff0, 0x00000100,
227ab71ac56SXiangliang Yu };
228ab71ac56SXiangliang Yu 
229ab71ac56SXiangliang Yu static const u32 xgpu_tonga_golden_settings_a11[] = {
230ab71ac56SXiangliang Yu 	mmCB_HW_CONTROL, 0xfffdf3cf, 0x00007208,
231ab71ac56SXiangliang Yu 	mmCB_HW_CONTROL_3, 0x00000040, 0x00000040,
232ab71ac56SXiangliang Yu 	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
233ab71ac56SXiangliang Yu 	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
234ab71ac56SXiangliang Yu 	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
235ab71ac56SXiangliang Yu 	mmFBC_MISC, 0x1f311fff, 0x12300000,
236ab71ac56SXiangliang Yu 	mmGB_GPU_ID, 0x0000000f, 0x00000000,
237ab71ac56SXiangliang Yu 	mmHDMI_CONTROL, 0x31000111, 0x00000011,
238ab71ac56SXiangliang Yu 	mmMC_ARB_WTM_GRPWT_RD, 0x00000003, 0x00000000,
239ab71ac56SXiangliang Yu 	mmMC_HUB_RDREQ_DMIF_LIMIT, 0x0000007f, 0x00000028,
240ab71ac56SXiangliang Yu 	mmMC_HUB_WDP_UMC, 0x00007fb6, 0x00000991,
241ab71ac56SXiangliang Yu 	mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
242ab71ac56SXiangliang Yu 	mmPA_SC_FIFO_DEPTH_CNTL, 0x000003ff, 0x000000fc,
243ab71ac56SXiangliang Yu 	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
244ab71ac56SXiangliang Yu 	mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0000003c,
245ab71ac56SXiangliang Yu 	mmSDMA0_CHICKEN_BITS, 0xfc910007, 0x00810007,
246ab71ac56SXiangliang Yu 	mmSDMA0_CLK_CTRL, 0xff000fff, 0x00000000,
247ab71ac56SXiangliang Yu 	mmSDMA0_GFX_IB_CNTL, 0x800f0111, 0x00000100,
248ab71ac56SXiangliang Yu 	mmSDMA0_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
249ab71ac56SXiangliang Yu 	mmSDMA0_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
250ab71ac56SXiangliang Yu 	mmSDMA1_CHICKEN_BITS, 0xfc910007, 0x00810007,
251ab71ac56SXiangliang Yu 	mmSDMA1_CLK_CTRL, 0xff000fff, 0x00000000,
252ab71ac56SXiangliang Yu 	mmSDMA1_GFX_IB_CNTL, 0x800f0111, 0x00000100,
253ab71ac56SXiangliang Yu 	mmSDMA1_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
254ab71ac56SXiangliang Yu 	mmSDMA1_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
255ab71ac56SXiangliang Yu 	mmSQ_RANDOM_WAVE_PRI, 0x001fffff, 0x000006fd,
256ab71ac56SXiangliang Yu 	mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
257ab71ac56SXiangliang Yu 	mmTCC_CTRL, 0x00100000, 0xf31fff7f,
258ab71ac56SXiangliang Yu 	mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
259ab71ac56SXiangliang Yu 	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000002fb,
260ab71ac56SXiangliang Yu 	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
261ab71ac56SXiangliang Yu 	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
262ab71ac56SXiangliang Yu 	mmVGT_RESET_DEBUG, 0x00000004, 0x00000004,
263ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
264ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
265ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
266ab71ac56SXiangliang Yu 	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
267ab71ac56SXiangliang Yu };
268ab71ac56SXiangliang Yu 
269ab71ac56SXiangliang Yu static const u32 xgpu_tonga_golden_common_all[] = {
270ab71ac56SXiangliang Yu 	mmGRBM_GFX_INDEX,               0xffffffff, 0xe0000000,
271ab71ac56SXiangliang Yu 	mmPA_SC_RASTER_CONFIG,          0xffffffff, 0x16000012,
272ab71ac56SXiangliang Yu 	mmPA_SC_RASTER_CONFIG_1,        0xffffffff, 0x0000002A,
273ab71ac56SXiangliang Yu 	mmGB_ADDR_CONFIG,               0xffffffff, 0x22011002,
274ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_CU_0,    0xffffffff, 0x00000800,
275ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_CU_1,    0xffffffff, 0x00000800,
276ab71ac56SXiangliang Yu 	mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
277ab71ac56SXiangliang Yu };
278ab71ac56SXiangliang Yu 
xgpu_vi_init_golden_registers(struct amdgpu_device * adev)279ab71ac56SXiangliang Yu void xgpu_vi_init_golden_registers(struct amdgpu_device *adev)
280ab71ac56SXiangliang Yu {
281ab71ac56SXiangliang Yu 	switch (adev->asic_type) {
282ab71ac56SXiangliang Yu 	case CHIP_FIJI:
2839c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
284ab71ac56SXiangliang Yu 							xgpu_fiji_mgcg_cgcg_init,
285c47b41a7SChristian König 							ARRAY_SIZE(
286ab71ac56SXiangliang Yu 								xgpu_fiji_mgcg_cgcg_init));
2879c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
288ab71ac56SXiangliang Yu 							xgpu_fiji_golden_settings_a10,
289c47b41a7SChristian König 							ARRAY_SIZE(
290ab71ac56SXiangliang Yu 								xgpu_fiji_golden_settings_a10));
2919c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
292ab71ac56SXiangliang Yu 							xgpu_fiji_golden_common_all,
293c47b41a7SChristian König 							ARRAY_SIZE(
294ab71ac56SXiangliang Yu 								xgpu_fiji_golden_common_all));
295ab71ac56SXiangliang Yu 		break;
296ab71ac56SXiangliang Yu 	case CHIP_TONGA:
2979c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
298ab71ac56SXiangliang Yu 							xgpu_tonga_mgcg_cgcg_init,
299c47b41a7SChristian König 							ARRAY_SIZE(
300ab71ac56SXiangliang Yu 								xgpu_tonga_mgcg_cgcg_init));
3019c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
302ab71ac56SXiangliang Yu 							xgpu_tonga_golden_settings_a11,
303c47b41a7SChristian König 							ARRAY_SIZE(
304ab71ac56SXiangliang Yu 								xgpu_tonga_golden_settings_a11));
3059c3f2b54SAlex Deucher 		amdgpu_device_program_register_sequence(adev,
306ab71ac56SXiangliang Yu 							xgpu_tonga_golden_common_all,
307c47b41a7SChristian König 							ARRAY_SIZE(
308ab71ac56SXiangliang Yu 								xgpu_tonga_golden_common_all));
309ab71ac56SXiangliang Yu 		break;
310ab71ac56SXiangliang Yu 	default:
311ab71ac56SXiangliang Yu 		BUG_ON("Doesn't support chip type.\n");
312ab71ac56SXiangliang Yu 		break;
313ab71ac56SXiangliang Yu 	}
314ab71ac56SXiangliang Yu }
315ab71ac56SXiangliang Yu 
316ab71ac56SXiangliang Yu /*
317ab71ac56SXiangliang Yu  * Mailbox communication between GPU hypervisor and VFs
318ab71ac56SXiangliang Yu  */
xgpu_vi_mailbox_send_ack(struct amdgpu_device * adev)319ab71ac56SXiangliang Yu static void xgpu_vi_mailbox_send_ack(struct amdgpu_device *adev)
320ab71ac56SXiangliang Yu {
321ab71ac56SXiangliang Yu 	u32 reg;
322562fe45cSKen Xue 	int timeout = VI_MAILBOX_TIMEDOUT;
323562fe45cSKen Xue 	u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID);
324ab71ac56SXiangliang Yu 
3254a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
326ab71ac56SXiangliang Yu 	reg = REG_SET_FIELD(reg, MAILBOX_CONTROL, RCV_MSG_ACK, 1);
3274a370955SMonk Liu 	WREG32_NO_KIQ(mmMAILBOX_CONTROL, reg);
328562fe45cSKen Xue 
329562fe45cSKen Xue 	/*Wait for RCV_MSG_VALID to be 0*/
3304a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
331562fe45cSKen Xue 	while (reg & mask) {
332562fe45cSKen Xue 		if (timeout <= 0) {
333562fe45cSKen Xue 			pr_err("RCV_MSG_VALID is not cleared\n");
334562fe45cSKen Xue 			break;
335562fe45cSKen Xue 		}
336562fe45cSKen Xue 		mdelay(1);
337562fe45cSKen Xue 		timeout -= 1;
338562fe45cSKen Xue 
3394a370955SMonk Liu 		reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
340562fe45cSKen Xue 	}
341ab71ac56SXiangliang Yu }
342ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_set_valid(struct amdgpu_device * adev,bool val)343ab71ac56SXiangliang Yu static void xgpu_vi_mailbox_set_valid(struct amdgpu_device *adev, bool val)
344ab71ac56SXiangliang Yu {
345ab71ac56SXiangliang Yu 	u32 reg;
346ab71ac56SXiangliang Yu 
3474a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
348ab71ac56SXiangliang Yu 	reg = REG_SET_FIELD(reg, MAILBOX_CONTROL,
349ab71ac56SXiangliang Yu 			    TRN_MSG_VALID, val ? 1 : 0);
3504a370955SMonk Liu 	WREG32_NO_KIQ(mmMAILBOX_CONTROL, reg);
351ab71ac56SXiangliang Yu }
352ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_trans_msg(struct amdgpu_device * adev,enum idh_request req)353ab71ac56SXiangliang Yu static void xgpu_vi_mailbox_trans_msg(struct amdgpu_device *adev,
354d1aad4d8SXiangliang Yu 				      enum idh_request req)
355ab71ac56SXiangliang Yu {
356ab71ac56SXiangliang Yu 	u32 reg;
357ab71ac56SXiangliang Yu 
3584a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW0);
359ab71ac56SXiangliang Yu 	reg = REG_SET_FIELD(reg, MAILBOX_MSGBUF_TRN_DW0,
360d1aad4d8SXiangliang Yu 			    MSGBUF_DATA, req);
3614a370955SMonk Liu 	WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW0, reg);
362ab71ac56SXiangliang Yu 
363ab71ac56SXiangliang Yu 	xgpu_vi_mailbox_set_valid(adev, true);
364ab71ac56SXiangliang Yu }
365ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_rcv_msg(struct amdgpu_device * adev,enum idh_event event)366ab71ac56SXiangliang Yu static int xgpu_vi_mailbox_rcv_msg(struct amdgpu_device *adev,
367ab71ac56SXiangliang Yu 				   enum idh_event event)
368ab71ac56SXiangliang Yu {
369ab71ac56SXiangliang Yu 	u32 reg;
370562fe45cSKen Xue 	u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, RCV_MSG_VALID);
371562fe45cSKen Xue 
372ee73164aSPixel Ding 	/* workaround: host driver doesn't set VALID for CMPL now */
373ee73164aSPixel Ding 	if (event != IDH_FLR_NOTIFICATION_CMPL) {
3744a370955SMonk Liu 		reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
375562fe45cSKen Xue 		if (!(reg & mask))
376562fe45cSKen Xue 			return -ENOENT;
377ee73164aSPixel Ding 	}
378ab71ac56SXiangliang Yu 
3794a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0);
380ab71ac56SXiangliang Yu 	if (reg != event)
381ab71ac56SXiangliang Yu 		return -ENOENT;
382ab71ac56SXiangliang Yu 
383ab71ac56SXiangliang Yu 	/* send ack to PF */
384ab71ac56SXiangliang Yu 	xgpu_vi_mailbox_send_ack(adev);
385ab71ac56SXiangliang Yu 
386ab71ac56SXiangliang Yu 	return 0;
387ab71ac56SXiangliang Yu }
388ab71ac56SXiangliang Yu 
xgpu_vi_poll_ack(struct amdgpu_device * adev)389ab71ac56SXiangliang Yu static int xgpu_vi_poll_ack(struct amdgpu_device *adev)
390ab71ac56SXiangliang Yu {
391ab71ac56SXiangliang Yu 	int r = 0, timeout = VI_MAILBOX_TIMEDOUT;
392ab71ac56SXiangliang Yu 	u32 mask = REG_FIELD_MASK(MAILBOX_CONTROL, TRN_MSG_ACK);
393ab71ac56SXiangliang Yu 	u32 reg;
394ab71ac56SXiangliang Yu 
3954a370955SMonk Liu 	reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
396ab71ac56SXiangliang Yu 	while (!(reg & mask)) {
397ab71ac56SXiangliang Yu 		if (timeout <= 0) {
398ab71ac56SXiangliang Yu 			pr_err("Doesn't get ack from pf.\n");
399ab71ac56SXiangliang Yu 			r = -ETIME;
400ab71ac56SXiangliang Yu 			break;
401ab71ac56SXiangliang Yu 		}
40217b2e332SMonk Liu 		mdelay(5);
40317b2e332SMonk Liu 		timeout -= 5;
404ab71ac56SXiangliang Yu 
4054a370955SMonk Liu 		reg = RREG32_NO_KIQ(mmMAILBOX_CONTROL);
406ab71ac56SXiangliang Yu 	}
407ab71ac56SXiangliang Yu 
408ab71ac56SXiangliang Yu 	return r;
409ab71ac56SXiangliang Yu }
410ab71ac56SXiangliang Yu 
xgpu_vi_poll_msg(struct amdgpu_device * adev,enum idh_event event)411ab71ac56SXiangliang Yu static int xgpu_vi_poll_msg(struct amdgpu_device *adev, enum idh_event event)
412ab71ac56SXiangliang Yu {
413ab71ac56SXiangliang Yu 	int r = 0, timeout = VI_MAILBOX_TIMEDOUT;
414ab71ac56SXiangliang Yu 
415ab71ac56SXiangliang Yu 	r = xgpu_vi_mailbox_rcv_msg(adev, event);
416ab71ac56SXiangliang Yu 	while (r) {
417ab71ac56SXiangliang Yu 		if (timeout <= 0) {
418ab71ac56SXiangliang Yu 			pr_err("Doesn't get ack from pf.\n");
419ab71ac56SXiangliang Yu 			r = -ETIME;
420ab71ac56SXiangliang Yu 			break;
421ab71ac56SXiangliang Yu 		}
42217b2e332SMonk Liu 		mdelay(5);
42317b2e332SMonk Liu 		timeout -= 5;
424ab71ac56SXiangliang Yu 
425ab71ac56SXiangliang Yu 		r = xgpu_vi_mailbox_rcv_msg(adev, event);
426ab71ac56SXiangliang Yu 	}
427ab71ac56SXiangliang Yu 
428ab71ac56SXiangliang Yu 	return r;
429ab71ac56SXiangliang Yu }
430ab71ac56SXiangliang Yu 
xgpu_vi_send_access_requests(struct amdgpu_device * adev,enum idh_request request)431ab71ac56SXiangliang Yu static int xgpu_vi_send_access_requests(struct amdgpu_device *adev,
432ab71ac56SXiangliang Yu 					enum idh_request request)
433ab71ac56SXiangliang Yu {
434ab71ac56SXiangliang Yu 	int r;
435ab71ac56SXiangliang Yu 
436ab71ac56SXiangliang Yu 	xgpu_vi_mailbox_trans_msg(adev, request);
437ab71ac56SXiangliang Yu 
438ab71ac56SXiangliang Yu 	/* start to poll ack */
439ab71ac56SXiangliang Yu 	r = xgpu_vi_poll_ack(adev);
440ab71ac56SXiangliang Yu 	if (r)
441ab71ac56SXiangliang Yu 		return r;
442ab71ac56SXiangliang Yu 
443ab71ac56SXiangliang Yu 	xgpu_vi_mailbox_set_valid(adev, false);
444ab71ac56SXiangliang Yu 
445ab71ac56SXiangliang Yu 	/* start to check msg if request is idh_req_gpu_init_access */
446562fe45cSKen Xue 	if (request == IDH_REQ_GPU_INIT_ACCESS ||
447562fe45cSKen Xue 		request == IDH_REQ_GPU_FINI_ACCESS ||
448562fe45cSKen Xue 		request == IDH_REQ_GPU_RESET_ACCESS) {
449ab71ac56SXiangliang Yu 		r = xgpu_vi_poll_msg(adev, IDH_READY_TO_ACCESS_GPU);
450f4711033Spding 		if (r) {
451f4711033Spding 			pr_err("Doesn't get ack from pf, give up\n");
452f4711033Spding 			return r;
453f4711033Spding 		}
454ab71ac56SXiangliang Yu 	}
455ab71ac56SXiangliang Yu 
456ab71ac56SXiangliang Yu 	return 0;
457ab71ac56SXiangliang Yu }
458ab71ac56SXiangliang Yu 
xgpu_vi_request_reset(struct amdgpu_device * adev)459ab71ac56SXiangliang Yu static int xgpu_vi_request_reset(struct amdgpu_device *adev)
460ab71ac56SXiangliang Yu {
461ab71ac56SXiangliang Yu 	return xgpu_vi_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
462ab71ac56SXiangliang Yu }
463ab71ac56SXiangliang Yu 
xgpu_vi_wait_reset_cmpl(struct amdgpu_device * adev)464b5914238Spding static int xgpu_vi_wait_reset_cmpl(struct amdgpu_device *adev)
465b5914238Spding {
466b5914238Spding 	return xgpu_vi_poll_msg(adev, IDH_FLR_NOTIFICATION_CMPL);
467b5914238Spding }
468b5914238Spding 
xgpu_vi_request_full_gpu_access(struct amdgpu_device * adev,bool init)469ab71ac56SXiangliang Yu static int xgpu_vi_request_full_gpu_access(struct amdgpu_device *adev,
470ab71ac56SXiangliang Yu 					   bool init)
471ab71ac56SXiangliang Yu {
472d1aad4d8SXiangliang Yu 	enum idh_request req;
473ab71ac56SXiangliang Yu 
474d1aad4d8SXiangliang Yu 	req = init ? IDH_REQ_GPU_INIT_ACCESS : IDH_REQ_GPU_FINI_ACCESS;
475d1aad4d8SXiangliang Yu 	return xgpu_vi_send_access_requests(adev, req);
476ab71ac56SXiangliang Yu }
477ab71ac56SXiangliang Yu 
xgpu_vi_release_full_gpu_access(struct amdgpu_device * adev,bool init)478ab71ac56SXiangliang Yu static int xgpu_vi_release_full_gpu_access(struct amdgpu_device *adev,
479ab71ac56SXiangliang Yu 					   bool init)
480ab71ac56SXiangliang Yu {
481d1aad4d8SXiangliang Yu 	enum idh_request req;
482ab71ac56SXiangliang Yu 	int r = 0;
483ab71ac56SXiangliang Yu 
484d1aad4d8SXiangliang Yu 	req = init ? IDH_REL_GPU_INIT_ACCESS : IDH_REL_GPU_FINI_ACCESS;
485d1aad4d8SXiangliang Yu 	r = xgpu_vi_send_access_requests(adev, req);
486ab71ac56SXiangliang Yu 
487ab71ac56SXiangliang Yu 	return r;
488ab71ac56SXiangliang Yu }
489ab71ac56SXiangliang Yu 
490ab71ac56SXiangliang Yu /* add support mailbox interrupts */
xgpu_vi_mailbox_ack_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)491ab71ac56SXiangliang Yu static int xgpu_vi_mailbox_ack_irq(struct amdgpu_device *adev,
492ab71ac56SXiangliang Yu 				   struct amdgpu_irq_src *source,
493ab71ac56SXiangliang Yu 				   struct amdgpu_iv_entry *entry)
494ab71ac56SXiangliang Yu {
495ab71ac56SXiangliang Yu 	DRM_DEBUG("get ack intr and do nothing.\n");
496ab71ac56SXiangliang Yu 	return 0;
497ab71ac56SXiangliang Yu }
498ab71ac56SXiangliang Yu 
xgpu_vi_set_mailbox_ack_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * src,unsigned type,enum amdgpu_interrupt_state state)499ab71ac56SXiangliang Yu static int xgpu_vi_set_mailbox_ack_irq(struct amdgpu_device *adev,
500ab71ac56SXiangliang Yu 				       struct amdgpu_irq_src *src,
501ab71ac56SXiangliang Yu 				       unsigned type,
502ab71ac56SXiangliang Yu 				       enum amdgpu_interrupt_state state)
503ab71ac56SXiangliang Yu {
5044a370955SMonk Liu 	u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL);
505ab71ac56SXiangliang Yu 
506ab71ac56SXiangliang Yu 	tmp = REG_SET_FIELD(tmp, MAILBOX_INT_CNTL, ACK_INT_EN,
507ab71ac56SXiangliang Yu 			    (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0);
5084a370955SMonk Liu 	WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp);
509ab71ac56SXiangliang Yu 
510ab71ac56SXiangliang Yu 	return 0;
511ab71ac56SXiangliang Yu }
512ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_flr_work(struct work_struct * work)513ab71ac56SXiangliang Yu static void xgpu_vi_mailbox_flr_work(struct work_struct *work)
514ab71ac56SXiangliang Yu {
515480da262SMonk Liu 	struct amdgpu_virt *virt = container_of(work, struct amdgpu_virt, flr_work);
516480da262SMonk Liu 	struct amdgpu_device *adev = container_of(virt, struct amdgpu_device, virt);
517ab71ac56SXiangliang Yu 
518480da262SMonk Liu 	/* Trigger recovery due to world switch failure */
519f1549c09SLikun Gao 	if (amdgpu_device_should_recover_gpu(adev)) {
520f1549c09SLikun Gao 		struct amdgpu_reset_context reset_context;
521f1549c09SLikun Gao 		memset(&reset_context, 0, sizeof(reset_context));
522f1549c09SLikun Gao 
523f1549c09SLikun Gao 		reset_context.method = AMD_RESET_METHOD_NONE;
524f1549c09SLikun Gao 		reset_context.reset_req_dev = adev;
525f1549c09SLikun Gao 		clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
526*25c01191SYunxiang Li 		set_bit(AMDGPU_HOST_FLR, &reset_context.flags);
527f1549c09SLikun Gao 
528f1549c09SLikun Gao 		amdgpu_device_gpu_recover(adev, NULL, &reset_context);
529f1549c09SLikun Gao 	}
530ab71ac56SXiangliang Yu }
531ab71ac56SXiangliang Yu 
xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * src,unsigned type,enum amdgpu_interrupt_state state)532ab71ac56SXiangliang Yu static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev,
533ab71ac56SXiangliang Yu 				       struct amdgpu_irq_src *src,
534ab71ac56SXiangliang Yu 				       unsigned type,
535ab71ac56SXiangliang Yu 				       enum amdgpu_interrupt_state state)
536ab71ac56SXiangliang Yu {
5374a370955SMonk Liu 	u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL);
538ab71ac56SXiangliang Yu 
539ab71ac56SXiangliang Yu 	tmp = REG_SET_FIELD(tmp, MAILBOX_INT_CNTL, VALID_INT_EN,
540ab71ac56SXiangliang Yu 			    (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0);
5414a370955SMonk Liu 	WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp);
542ab71ac56SXiangliang Yu 
543ab71ac56SXiangliang Yu 	return 0;
544ab71ac56SXiangliang Yu }
545ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_rcv_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)546ab71ac56SXiangliang Yu static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device *adev,
547ab71ac56SXiangliang Yu 				   struct amdgpu_irq_src *source,
548ab71ac56SXiangliang Yu 				   struct amdgpu_iv_entry *entry)
549ab71ac56SXiangliang Yu {
550ab71ac56SXiangliang Yu 	int r;
551ab71ac56SXiangliang Yu 
5521ec5a443Stangmeng 	/* trigger gpu-reset by hypervisor only if TDR disabled */
5538854695aSAndrey Grodzovsky 	if (!amdgpu_gpu_recovery) {
554480da262SMonk Liu 		/* see what event we get */
555ab71ac56SXiangliang Yu 		r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION);
556ab71ac56SXiangliang Yu 
557480da262SMonk Liu 		/* only handle FLR_NOTIFY now */
558f4322b9fSYunxiang Li 		if (!r)
559cfbb6b00SAndrey Grodzovsky 			WARN_ONCE(!amdgpu_reset_domain_schedule(adev->reset_domain,
56002599bc7SAndrey Grodzovsky 								&adev->virt.flr_work),
56102599bc7SAndrey Grodzovsky 				  "Failed to queue work! at %s",
56202599bc7SAndrey Grodzovsky 				  __func__);
5630c63e113SMonk Liu 	}
564ab71ac56SXiangliang Yu 
565ab71ac56SXiangliang Yu 	return 0;
566ab71ac56SXiangliang Yu }
567ab71ac56SXiangliang Yu 
568ab71ac56SXiangliang Yu static const struct amdgpu_irq_src_funcs xgpu_vi_mailbox_ack_irq_funcs = {
569ab71ac56SXiangliang Yu 	.set = xgpu_vi_set_mailbox_ack_irq,
570ab71ac56SXiangliang Yu 	.process = xgpu_vi_mailbox_ack_irq,
571ab71ac56SXiangliang Yu };
572ab71ac56SXiangliang Yu 
573ab71ac56SXiangliang Yu static const struct amdgpu_irq_src_funcs xgpu_vi_mailbox_rcv_irq_funcs = {
574ab71ac56SXiangliang Yu 	.set = xgpu_vi_set_mailbox_rcv_irq,
575ab71ac56SXiangliang Yu 	.process = xgpu_vi_mailbox_rcv_irq,
576ab71ac56SXiangliang Yu };
577ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_set_irq_funcs(struct amdgpu_device * adev)578ab71ac56SXiangliang Yu void xgpu_vi_mailbox_set_irq_funcs(struct amdgpu_device *adev)
579ab71ac56SXiangliang Yu {
580ab71ac56SXiangliang Yu 	adev->virt.ack_irq.num_types = 1;
581ab71ac56SXiangliang Yu 	adev->virt.ack_irq.funcs = &xgpu_vi_mailbox_ack_irq_funcs;
582ab71ac56SXiangliang Yu 	adev->virt.rcv_irq.num_types = 1;
583ab71ac56SXiangliang Yu 	adev->virt.rcv_irq.funcs = &xgpu_vi_mailbox_rcv_irq_funcs;
584ab71ac56SXiangliang Yu }
585ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_add_irq_id(struct amdgpu_device * adev)586ab71ac56SXiangliang Yu int xgpu_vi_mailbox_add_irq_id(struct amdgpu_device *adev)
587ab71ac56SXiangliang Yu {
588ab71ac56SXiangliang Yu 	int r;
589ab71ac56SXiangliang Yu 
5901ffdeca6SChristian König 	r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 135, &adev->virt.rcv_irq);
591ab71ac56SXiangliang Yu 	if (r)
592ab71ac56SXiangliang Yu 		return r;
593ab71ac56SXiangliang Yu 
5941ffdeca6SChristian König 	r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 138, &adev->virt.ack_irq);
595ab71ac56SXiangliang Yu 	if (r) {
596ab71ac56SXiangliang Yu 		amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
597ab71ac56SXiangliang Yu 		return r;
598ab71ac56SXiangliang Yu 	}
599ab71ac56SXiangliang Yu 
600ab71ac56SXiangliang Yu 	return 0;
601ab71ac56SXiangliang Yu }
602ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_get_irq(struct amdgpu_device * adev)603ab71ac56SXiangliang Yu int xgpu_vi_mailbox_get_irq(struct amdgpu_device *adev)
604ab71ac56SXiangliang Yu {
605ab71ac56SXiangliang Yu 	int r;
606ab71ac56SXiangliang Yu 
607ab71ac56SXiangliang Yu 	r = amdgpu_irq_get(adev, &adev->virt.rcv_irq, 0);
608ab71ac56SXiangliang Yu 	if (r)
609ab71ac56SXiangliang Yu 		return r;
610ab71ac56SXiangliang Yu 	r = amdgpu_irq_get(adev, &adev->virt.ack_irq, 0);
611ab71ac56SXiangliang Yu 	if (r) {
612ab71ac56SXiangliang Yu 		amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
613ab71ac56SXiangliang Yu 		return r;
614ab71ac56SXiangliang Yu 	}
615ab71ac56SXiangliang Yu 
616480da262SMonk Liu 	INIT_WORK(&adev->virt.flr_work, xgpu_vi_mailbox_flr_work);
617ab71ac56SXiangliang Yu 
618ab71ac56SXiangliang Yu 	return 0;
619ab71ac56SXiangliang Yu }
620ab71ac56SXiangliang Yu 
xgpu_vi_mailbox_put_irq(struct amdgpu_device * adev)621ab71ac56SXiangliang Yu void xgpu_vi_mailbox_put_irq(struct amdgpu_device *adev)
622ab71ac56SXiangliang Yu {
623ab71ac56SXiangliang Yu 	amdgpu_irq_put(adev, &adev->virt.ack_irq, 0);
624ab71ac56SXiangliang Yu 	amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
625ab71ac56SXiangliang Yu }
626ab71ac56SXiangliang Yu 
627ab71ac56SXiangliang Yu const struct amdgpu_virt_ops xgpu_vi_virt_ops = {
628ab71ac56SXiangliang Yu 	.req_full_gpu		= xgpu_vi_request_full_gpu_access,
629ab71ac56SXiangliang Yu 	.rel_full_gpu		= xgpu_vi_release_full_gpu_access,
630ab71ac56SXiangliang Yu 	.reset_gpu		= xgpu_vi_request_reset,
631b5914238Spding 	.wait_reset             = xgpu_vi_wait_reset_cmpl,
63289041940SGavin Wan 	.trans_msg		= NULL, /* Does not need to trans VF errors to host. */
633ab71ac56SXiangliang Yu };
634