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