]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/gpu/drm/amd/amdgpu/si.c
Merge tag 'amd-drm-next-5.10-2020-09-03' of git://people.freedesktop.org/~agd5f/linux...
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / amd / amdgpu / si.c
CommitLineData
62a37553
KW
1/*
2 * Copyright 2015 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/firmware.h>
25#include <linux/slab.h>
26#include <linux/module.h>
47b757fb
SR
27#include <linux/pci.h>
28
62a37553
KW
29#include "amdgpu.h"
30#include "amdgpu_atombios.h"
31#include "amdgpu_ih.h"
32#include "amdgpu_uvd.h"
33#include "amdgpu_vce.h"
34#include "atom.h"
0bf67185 35#include "amd_pcie.h"
b905090d 36#include "si_dpm.h"
689957b1 37#include "sid.h"
62a37553
KW
38#include "si_ih.h"
39#include "gfx_v6_0.h"
40#include "gmc_v6_0.h"
41#include "si_dma.h"
42#include "dce_v6_0.h"
43#include "si.h"
d375615c 44#include "uvd_v3_1.h"
2120df47 45#include "dce_virtual.h"
78bbe771
TSD
46#include "gca/gfx_6_0_d.h"
47#include "oss/oss_1_0_d.h"
9c39d77c 48#include "oss/oss_1_0_sh_mask.h"
78bbe771
TSD
49#include "gmc/gmc_6_0_d.h"
50#include "dce/dce_6_0_d.h"
51#include "uvd/uvd_4_0_d.h"
bbf282d8 52#include "bif/bif_3_0_d.h"
b45e18ac 53#include "bif/bif_3_0_sh_mask.h"
62a37553 54
64200c46
MR
55#include "amdgpu_dm.h"
56
62a37553
KW
57static const u32 tahiti_golden_registers[] =
58{
78bbe771
TSD
59 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
60 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
61 mmDB_DEBUG, 0xffffffff, 0x00000000,
62 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
63 mmDB_DEBUG3, 0x0002021c, 0x00020200,
64 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
7c0a705e
FC
65 0x340c, 0x000000c0, 0x00800040,
66 0x360c, 0x000000c0, 0x00800040,
78bbe771
TSD
67 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
68 mmFBC_MISC, 0x00200000, 0x50100000,
69 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
70 mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
71 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
72 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
73 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
74 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
75 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
76 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
7c0a705e 77 0x000c, 0xffffffff, 0x0040,
62a37553 78 0x000d, 0x00000040, 0x00004040,
78bbe771
TSD
79 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
80 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
81 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
82 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
83 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
84 mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
85 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
86 mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
87 mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
88 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
89 mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
90 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
91 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
92 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
93 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
94 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
62a37553
KW
95};
96
97static const u32 tahiti_golden_registers2[] =
98{
78bbe771 99 mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
62a37553
KW
100};
101
102static const u32 tahiti_golden_rlc_registers[] =
103{
78bbe771
TSD
104 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
105 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
62a37553
KW
106 0x311f, 0xffffffff, 0x10104040,
107 0x3122, 0xffffffff, 0x0100000a,
78bbe771
TSD
108 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
109 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
110 mmUVD_CGC_GATE, 0x00000008, 0x00000000,
62a37553
KW
111};
112
113static const u32 pitcairn_golden_registers[] =
114{
78bbe771
TSD
115 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
116 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
117 mmDB_DEBUG, 0xffffffff, 0x00000000,
118 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
119 mmDB_DEBUG3, 0x0002021c, 0x00020200,
120 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
62a37553
KW
121 0x340c, 0x000300c0, 0x00800040,
122 0x360c, 0x000300c0, 0x00800040,
78bbe771
TSD
123 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
124 mmFBC_MISC, 0x00200000, 0x50100000,
125 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
126 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
127 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
128 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
129 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
130 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
131 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
132 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
1245a694 133 0x000c, 0xffffffff, 0x0040,
62a37553 134 0x000d, 0x00000040, 0x00004040,
78bbe771
TSD
135 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
136 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
137 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
138 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
139 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
140 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
141 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
142 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
143 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
144 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
145 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
146 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
62a37553
KW
147};
148
149static const u32 pitcairn_golden_rlc_registers[] =
150{
78bbe771
TSD
151 mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
152 mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
62a37553
KW
153 0x311f, 0xffffffff, 0x10102020,
154 0x3122, 0xffffffff, 0x01000020,
78bbe771
TSD
155 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
156 mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
62a37553
KW
157};
158
159static const u32 verde_pg_init[] =
160{
78bbe771
TSD
161 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
162 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
163 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
164 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
165 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
166 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
167 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
168 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
169 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
170 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
171 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
172 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
173 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
174 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
175 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
176 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
177 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
178 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
179 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
180 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
181 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
182 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
183 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
184 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
185 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
186 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
187 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
188 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
189 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
190 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
191 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
192 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
193 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
194 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
195 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
196 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
197 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
198 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
199 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
200 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
201 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
202 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
203 mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
204 mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
205 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
206 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
207 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
208 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
209 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
210 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
211 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
212 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
213 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
214 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
215 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
216 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
217 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
218 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
219 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
220 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
221 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
222 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
223 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
224 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
225 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
226 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
227 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
228 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
229 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
230 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
231 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
232 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
233 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
234 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
235 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
236 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
237 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
238 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
239 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
240 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
241 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
242 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
243 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
244 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
245 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
246 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
247 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
248 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
249 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
250 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
251 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
252 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
253 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
254 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
255 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
256 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
257 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
258 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
259 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
260 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
261 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
262 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
263 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
264 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
265 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
266 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
267 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
268 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
269 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
270 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
271 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
272 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
273 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
274 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
275 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
276 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
277 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
278 mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
279 mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
280 mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
281 mmGMCON_MISC2, 0xfc00, 0x2000,
282 mmGMCON_MISC3, 0xffffffff, 0xfc0,
283 mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
62a37553
KW
284};
285
286static const u32 verde_golden_rlc_registers[] =
287{
78bbe771
TSD
288 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
289 mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
62a37553
KW
290 0x311f, 0xffffffff, 0x10808020,
291 0x3122, 0xffffffff, 0x00800008,
78bbe771
TSD
292 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
293 mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
62a37553
KW
294};
295
296static const u32 verde_golden_registers[] =
297{
78bbe771
TSD
298 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
299 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
300 mmDB_DEBUG, 0xffffffff, 0x00000000,
301 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
302 mmDB_DEBUG3, 0x0002021c, 0x00020200,
303 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
62a37553 304 0x340c, 0x000300c0, 0x00800040,
62a37553 305 0x360c, 0x000300c0, 0x00800040,
78bbe771
TSD
306 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
307 mmFBC_MISC, 0x00200000, 0x50100000,
308 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
309 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
310 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
311 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
312 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
313 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
314 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
315 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
dae5c298 316 0x000c, 0xffffffff, 0x0040,
62a37553 317 0x000d, 0x00000040, 0x00004040,
78bbe771
TSD
318 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
319 mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
320 mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
321 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
322 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
323 mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
324 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
325 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
326 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
327 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
328 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
329 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
330 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
331 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
62a37553
KW
332};
333
334static const u32 oland_golden_registers[] =
335{
78bbe771
TSD
336 mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
337 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
338 mmDB_DEBUG, 0xffffffff, 0x00000000,
339 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
340 mmDB_DEBUG3, 0x0002021c, 0x00020200,
341 mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
62a37553
KW
342 0x340c, 0x000300c0, 0x00800040,
343 0x360c, 0x000300c0, 0x00800040,
78bbe771
TSD
344 mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
345 mmFBC_MISC, 0x00200000, 0x50100000,
346 mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
347 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
348 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
349 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
350 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
351 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
352 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
353 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
6b7985ef 354 0x000c, 0xffffffff, 0x0040,
62a37553 355 0x000d, 0x00000040, 0x00004040,
78bbe771
TSD
356 mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
357 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
358 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
359 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
360 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
361 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
362 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
363 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
364 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
365 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
366 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
367 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
368
62a37553
KW
369};
370
371static const u32 oland_golden_rlc_registers[] =
372{
78bbe771
TSD
373 mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
374 mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
62a37553
KW
375 0x311f, 0xffffffff, 0x10104040,
376 0x3122, 0xffffffff, 0x0100000a,
78bbe771
TSD
377 mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
378 mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
62a37553
KW
379};
380
381static const u32 hainan_golden_registers[] =
382{
bd27b678 383 0x17bc, 0x00000030, 0x00000011,
78bbe771
TSD
384 mmCB_HW_CONTROL, 0x00010000, 0x00018208,
385 mmDB_DEBUG, 0xffffffff, 0x00000000,
386 mmDB_DEBUG2, 0xf00fffff, 0x00000400,
387 mmDB_DEBUG3, 0x0002021c, 0x00020200,
bd27b678
FC
388 0x031e, 0x00000080, 0x00000000,
389 0x3430, 0xff000fff, 0x00000100,
62a37553
KW
390 0x340c, 0x000300c0, 0x00800040,
391 0x3630, 0xff000fff, 0x00000100,
392 0x360c, 0x000300c0, 0x00800040,
bd27b678
FC
393 0x16ec, 0x000000f0, 0x00000070,
394 0x16f0, 0x00200000, 0x50100000,
395 0x1c0c, 0x31000311, 0x00000011,
78bbe771
TSD
396 mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
397 mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
398 mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
399 mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
400 mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
401 mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
402 mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
bd27b678 403 0x000c, 0xffffffff, 0x0040,
62a37553 404 0x000d, 0x00000040, 0x00004040,
78bbe771
TSD
405 mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
406 mmSX_DEBUG_1, 0x0000007f, 0x00000020,
407 mmTA_CNTL_AUX, 0x00010000, 0x00010000,
408 mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
409 mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
410 mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
411 mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
412 mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
413 mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
414 mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
415 mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
416 mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
62a37553
KW
417};
418
419static const u32 hainan_golden_registers2[] =
420{
78bbe771 421 mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
62a37553
KW
422};
423
424static const u32 tahiti_mgcg_cgcg_init[] =
425{
78bbe771
TSD
426 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
427 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
428 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
429 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
430 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
431 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
432 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
433 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
434 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
435 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
436 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
437 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
438 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
439 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
440 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
441 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
442 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
443 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
444 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
445 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
446 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
447 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
448 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
449 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
450 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
451 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
452 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
62a37553
KW
453 0x2458, 0xffffffff, 0x00010000,
454 0x2459, 0xffffffff, 0x00030002,
455 0x245a, 0xffffffff, 0x00040007,
456 0x245b, 0xffffffff, 0x00060005,
457 0x245c, 0xffffffff, 0x00090008,
458 0x245d, 0xffffffff, 0x00020001,
459 0x245e, 0xffffffff, 0x00040003,
460 0x245f, 0xffffffff, 0x00000007,
461 0x2460, 0xffffffff, 0x00060005,
462 0x2461, 0xffffffff, 0x00090008,
463 0x2462, 0xffffffff, 0x00030002,
464 0x2463, 0xffffffff, 0x00050004,
465 0x2464, 0xffffffff, 0x00000008,
466 0x2465, 0xffffffff, 0x00070006,
467 0x2466, 0xffffffff, 0x000a0009,
468 0x2467, 0xffffffff, 0x00040003,
469 0x2468, 0xffffffff, 0x00060005,
470 0x2469, 0xffffffff, 0x00000009,
471 0x246a, 0xffffffff, 0x00080007,
472 0x246b, 0xffffffff, 0x000b000a,
473 0x246c, 0xffffffff, 0x00050004,
474 0x246d, 0xffffffff, 0x00070006,
475 0x246e, 0xffffffff, 0x0008000b,
476 0x246f, 0xffffffff, 0x000a0009,
477 0x2470, 0xffffffff, 0x000d000c,
478 0x2471, 0xffffffff, 0x00060005,
479 0x2472, 0xffffffff, 0x00080007,
480 0x2473, 0xffffffff, 0x0000000b,
481 0x2474, 0xffffffff, 0x000a0009,
482 0x2475, 0xffffffff, 0x000d000c,
483 0x2476, 0xffffffff, 0x00070006,
484 0x2477, 0xffffffff, 0x00090008,
485 0x2478, 0xffffffff, 0x0000000c,
486 0x2479, 0xffffffff, 0x000b000a,
487 0x247a, 0xffffffff, 0x000e000d,
488 0x247b, 0xffffffff, 0x00080007,
489 0x247c, 0xffffffff, 0x000a0009,
490 0x247d, 0xffffffff, 0x0000000d,
491 0x247e, 0xffffffff, 0x000c000b,
492 0x247f, 0xffffffff, 0x000f000e,
493 0x2480, 0xffffffff, 0x00090008,
494 0x2481, 0xffffffff, 0x000b000a,
495 0x2482, 0xffffffff, 0x000c000f,
496 0x2483, 0xffffffff, 0x000e000d,
497 0x2484, 0xffffffff, 0x00110010,
498 0x2485, 0xffffffff, 0x000a0009,
499 0x2486, 0xffffffff, 0x000c000b,
500 0x2487, 0xffffffff, 0x0000000f,
501 0x2488, 0xffffffff, 0x000e000d,
502 0x2489, 0xffffffff, 0x00110010,
503 0x248a, 0xffffffff, 0x000b000a,
504 0x248b, 0xffffffff, 0x000d000c,
505 0x248c, 0xffffffff, 0x00000010,
506 0x248d, 0xffffffff, 0x000f000e,
507 0x248e, 0xffffffff, 0x00120011,
508 0x248f, 0xffffffff, 0x000c000b,
509 0x2490, 0xffffffff, 0x000e000d,
510 0x2491, 0xffffffff, 0x00000011,
511 0x2492, 0xffffffff, 0x0010000f,
512 0x2493, 0xffffffff, 0x00130012,
513 0x2494, 0xffffffff, 0x000d000c,
514 0x2495, 0xffffffff, 0x000f000e,
515 0x2496, 0xffffffff, 0x00100013,
516 0x2497, 0xffffffff, 0x00120011,
517 0x2498, 0xffffffff, 0x00150014,
518 0x2499, 0xffffffff, 0x000e000d,
519 0x249a, 0xffffffff, 0x0010000f,
520 0x249b, 0xffffffff, 0x00000013,
521 0x249c, 0xffffffff, 0x00120011,
522 0x249d, 0xffffffff, 0x00150014,
523 0x249e, 0xffffffff, 0x000f000e,
524 0x249f, 0xffffffff, 0x00110010,
525 0x24a0, 0xffffffff, 0x00000014,
526 0x24a1, 0xffffffff, 0x00130012,
527 0x24a2, 0xffffffff, 0x00160015,
528 0x24a3, 0xffffffff, 0x0010000f,
529 0x24a4, 0xffffffff, 0x00120011,
530 0x24a5, 0xffffffff, 0x00000015,
531 0x24a6, 0xffffffff, 0x00140013,
532 0x24a7, 0xffffffff, 0x00170016,
78bbe771
TSD
533 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
534 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
535 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
536 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
7c0a705e
FC
537 0x000c, 0xffffffff, 0x0000001c,
538 0x000d, 0x000f0000, 0x000f0000,
539 0x0583, 0xffffffff, 0x00000100,
78bbe771
TSD
540 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
541 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
542 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
543 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
544 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
545 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
62a37553 546 0x157a, 0x00000001, 0x00000001,
78bbe771
TSD
547 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
548 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
549 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
62a37553 550 0x3430, 0xfffffff0, 0x00000100,
78bbe771 551 0x3630, 0xfffffff0, 0x00000100,
62a37553
KW
552};
553static const u32 pitcairn_mgcg_cgcg_init[] =
554{
78bbe771
TSD
555 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
556 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
557 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
558 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
559 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
560 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
561 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
562 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
563 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
564 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
565 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
566 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
567 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
568 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
569 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
570 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
571 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
572 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
573 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
574 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
575 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
576 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
577 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
578 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
579 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
580 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
581 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
62a37553
KW
582 0x2458, 0xffffffff, 0x00010000,
583 0x2459, 0xffffffff, 0x00030002,
584 0x245a, 0xffffffff, 0x00040007,
585 0x245b, 0xffffffff, 0x00060005,
586 0x245c, 0xffffffff, 0x00090008,
587 0x245d, 0xffffffff, 0x00020001,
588 0x245e, 0xffffffff, 0x00040003,
589 0x245f, 0xffffffff, 0x00000007,
590 0x2460, 0xffffffff, 0x00060005,
591 0x2461, 0xffffffff, 0x00090008,
592 0x2462, 0xffffffff, 0x00030002,
593 0x2463, 0xffffffff, 0x00050004,
594 0x2464, 0xffffffff, 0x00000008,
595 0x2465, 0xffffffff, 0x00070006,
596 0x2466, 0xffffffff, 0x000a0009,
597 0x2467, 0xffffffff, 0x00040003,
598 0x2468, 0xffffffff, 0x00060005,
599 0x2469, 0xffffffff, 0x00000009,
600 0x246a, 0xffffffff, 0x00080007,
601 0x246b, 0xffffffff, 0x000b000a,
602 0x246c, 0xffffffff, 0x00050004,
603 0x246d, 0xffffffff, 0x00070006,
604 0x246e, 0xffffffff, 0x0008000b,
605 0x246f, 0xffffffff, 0x000a0009,
606 0x2470, 0xffffffff, 0x000d000c,
607 0x2480, 0xffffffff, 0x00090008,
608 0x2481, 0xffffffff, 0x000b000a,
609 0x2482, 0xffffffff, 0x000c000f,
610 0x2483, 0xffffffff, 0x000e000d,
611 0x2484, 0xffffffff, 0x00110010,
612 0x2485, 0xffffffff, 0x000a0009,
613 0x2486, 0xffffffff, 0x000c000b,
614 0x2487, 0xffffffff, 0x0000000f,
615 0x2488, 0xffffffff, 0x000e000d,
616 0x2489, 0xffffffff, 0x00110010,
617 0x248a, 0xffffffff, 0x000b000a,
618 0x248b, 0xffffffff, 0x000d000c,
619 0x248c, 0xffffffff, 0x00000010,
620 0x248d, 0xffffffff, 0x000f000e,
621 0x248e, 0xffffffff, 0x00120011,
622 0x248f, 0xffffffff, 0x000c000b,
623 0x2490, 0xffffffff, 0x000e000d,
624 0x2491, 0xffffffff, 0x00000011,
625 0x2492, 0xffffffff, 0x0010000f,
626 0x2493, 0xffffffff, 0x00130012,
627 0x2494, 0xffffffff, 0x000d000c,
628 0x2495, 0xffffffff, 0x000f000e,
629 0x2496, 0xffffffff, 0x00100013,
630 0x2497, 0xffffffff, 0x00120011,
631 0x2498, 0xffffffff, 0x00150014,
78bbe771
TSD
632 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
633 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
634 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
635 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
1245a694
FC
636 0x000c, 0xffffffff, 0x0000001c,
637 0x000d, 0x000f0000, 0x000f0000,
638 0x0583, 0xffffffff, 0x00000100,
78bbe771
TSD
639 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
640 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
641 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
642 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
62a37553 643 0x157a, 0x00000001, 0x00000001,
78bbe771
TSD
644 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
645 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
646 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
62a37553 647 0x3430, 0xfffffff0, 0x00000100,
78bbe771 648 0x3630, 0xfffffff0, 0x00000100,
62a37553 649};
78bbe771 650
62a37553
KW
651static const u32 verde_mgcg_cgcg_init[] =
652{
78bbe771
TSD
653 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
654 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
655 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
656 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
657 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
658 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
659 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
660 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
661 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
662 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
663 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
664 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
665 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
666 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
667 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
668 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
669 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
670 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
671 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
672 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
673 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
674 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
675 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
676 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
677 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
678 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
679 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
62a37553
KW
680 0x2458, 0xffffffff, 0x00010000,
681 0x2459, 0xffffffff, 0x00030002,
682 0x245a, 0xffffffff, 0x00040007,
683 0x245b, 0xffffffff, 0x00060005,
684 0x245c, 0xffffffff, 0x00090008,
685 0x245d, 0xffffffff, 0x00020001,
686 0x245e, 0xffffffff, 0x00040003,
687 0x245f, 0xffffffff, 0x00000007,
688 0x2460, 0xffffffff, 0x00060005,
689 0x2461, 0xffffffff, 0x00090008,
690 0x2462, 0xffffffff, 0x00030002,
691 0x2463, 0xffffffff, 0x00050004,
692 0x2464, 0xffffffff, 0x00000008,
693 0x2465, 0xffffffff, 0x00070006,
694 0x2466, 0xffffffff, 0x000a0009,
695 0x2467, 0xffffffff, 0x00040003,
696 0x2468, 0xffffffff, 0x00060005,
697 0x2469, 0xffffffff, 0x00000009,
698 0x246a, 0xffffffff, 0x00080007,
699 0x246b, 0xffffffff, 0x000b000a,
700 0x246c, 0xffffffff, 0x00050004,
701 0x246d, 0xffffffff, 0x00070006,
702 0x246e, 0xffffffff, 0x0008000b,
703 0x246f, 0xffffffff, 0x000a0009,
704 0x2470, 0xffffffff, 0x000d000c,
705 0x2480, 0xffffffff, 0x00090008,
706 0x2481, 0xffffffff, 0x000b000a,
707 0x2482, 0xffffffff, 0x000c000f,
708 0x2483, 0xffffffff, 0x000e000d,
709 0x2484, 0xffffffff, 0x00110010,
710 0x2485, 0xffffffff, 0x000a0009,
711 0x2486, 0xffffffff, 0x000c000b,
712 0x2487, 0xffffffff, 0x0000000f,
713 0x2488, 0xffffffff, 0x000e000d,
714 0x2489, 0xffffffff, 0x00110010,
715 0x248a, 0xffffffff, 0x000b000a,
716 0x248b, 0xffffffff, 0x000d000c,
717 0x248c, 0xffffffff, 0x00000010,
718 0x248d, 0xffffffff, 0x000f000e,
719 0x248e, 0xffffffff, 0x00120011,
720 0x248f, 0xffffffff, 0x000c000b,
721 0x2490, 0xffffffff, 0x000e000d,
722 0x2491, 0xffffffff, 0x00000011,
723 0x2492, 0xffffffff, 0x0010000f,
724 0x2493, 0xffffffff, 0x00130012,
725 0x2494, 0xffffffff, 0x000d000c,
726 0x2495, 0xffffffff, 0x000f000e,
727 0x2496, 0xffffffff, 0x00100013,
728 0x2497, 0xffffffff, 0x00120011,
729 0x2498, 0xffffffff, 0x00150014,
78bbe771
TSD
730 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
731 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
732 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
733 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
dae5c298
FC
734 0x000c, 0xffffffff, 0x0000001c,
735 0x000d, 0x000f0000, 0x000f0000,
736 0x0583, 0xffffffff, 0x00000100,
78bbe771
TSD
737 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
738 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
739 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
740 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
741 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
742 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
62a37553 743 0x157a, 0x00000001, 0x00000001,
78bbe771
TSD
744 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
745 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
746 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
62a37553 747 0x3430, 0xfffffff0, 0x00000100,
78bbe771 748 0x3630, 0xfffffff0, 0x00000100,
62a37553 749};
78bbe771 750
62a37553
KW
751static const u32 oland_mgcg_cgcg_init[] =
752{
78bbe771
TSD
753 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
754 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
755 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
756 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
757 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
758 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
759 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
760 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
761 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
762 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
763 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
764 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
765 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
766 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
767 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
768 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
769 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
770 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
771 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
772 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
773 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
774 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
775 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
776 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
777 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
778 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
779 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
62a37553
KW
780 0x2458, 0xffffffff, 0x00010000,
781 0x2459, 0xffffffff, 0x00030002,
782 0x245a, 0xffffffff, 0x00040007,
783 0x245b, 0xffffffff, 0x00060005,
784 0x245c, 0xffffffff, 0x00090008,
785 0x245d, 0xffffffff, 0x00020001,
786 0x245e, 0xffffffff, 0x00040003,
787 0x245f, 0xffffffff, 0x00000007,
788 0x2460, 0xffffffff, 0x00060005,
789 0x2461, 0xffffffff, 0x00090008,
790 0x2462, 0xffffffff, 0x00030002,
791 0x2463, 0xffffffff, 0x00050004,
792 0x2464, 0xffffffff, 0x00000008,
793 0x2465, 0xffffffff, 0x00070006,
794 0x2466, 0xffffffff, 0x000a0009,
795 0x2467, 0xffffffff, 0x00040003,
796 0x2468, 0xffffffff, 0x00060005,
797 0x2469, 0xffffffff, 0x00000009,
798 0x246a, 0xffffffff, 0x00080007,
799 0x246b, 0xffffffff, 0x000b000a,
800 0x246c, 0xffffffff, 0x00050004,
801 0x246d, 0xffffffff, 0x00070006,
802 0x246e, 0xffffffff, 0x0008000b,
803 0x246f, 0xffffffff, 0x000a0009,
804 0x2470, 0xffffffff, 0x000d000c,
805 0x2471, 0xffffffff, 0x00060005,
806 0x2472, 0xffffffff, 0x00080007,
807 0x2473, 0xffffffff, 0x0000000b,
808 0x2474, 0xffffffff, 0x000a0009,
809 0x2475, 0xffffffff, 0x000d000c,
78bbe771
TSD
810 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
811 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
812 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
813 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
6b7985ef
FC
814 0x000c, 0xffffffff, 0x0000001c,
815 0x000d, 0x000f0000, 0x000f0000,
816 0x0583, 0xffffffff, 0x00000100,
78bbe771
TSD
817 mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
818 mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
819 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
820 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
821 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
822 mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
62a37553 823 0x157a, 0x00000001, 0x00000001,
78bbe771
TSD
824 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
825 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
826 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
62a37553 827 0x3430, 0xfffffff0, 0x00000100,
78bbe771 828 0x3630, 0xfffffff0, 0x00000100,
62a37553 829};
78bbe771 830
62a37553
KW
831static const u32 hainan_mgcg_cgcg_init[] =
832{
78bbe771
TSD
833 mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
834 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
835 mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
836 mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
837 mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
838 mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
839 mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
840 mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
841 mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
842 mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
843 mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
844 mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
845 mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
846 mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
847 mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
848 mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
849 mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
850 mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
851 mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
852 mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
853 mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
854 mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
855 mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
856 mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
857 mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
858 mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
859 mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
62a37553
KW
860 0x2458, 0xffffffff, 0x00010000,
861 0x2459, 0xffffffff, 0x00030002,
862 0x245a, 0xffffffff, 0x00040007,
863 0x245b, 0xffffffff, 0x00060005,
864 0x245c, 0xffffffff, 0x00090008,
865 0x245d, 0xffffffff, 0x00020001,
866 0x245e, 0xffffffff, 0x00040003,
867 0x245f, 0xffffffff, 0x00000007,
868 0x2460, 0xffffffff, 0x00060005,
869 0x2461, 0xffffffff, 0x00090008,
870 0x2462, 0xffffffff, 0x00030002,
871 0x2463, 0xffffffff, 0x00050004,
872 0x2464, 0xffffffff, 0x00000008,
873 0x2465, 0xffffffff, 0x00070006,
874 0x2466, 0xffffffff, 0x000a0009,
875 0x2467, 0xffffffff, 0x00040003,
876 0x2468, 0xffffffff, 0x00060005,
877 0x2469, 0xffffffff, 0x00000009,
878 0x246a, 0xffffffff, 0x00080007,
879 0x246b, 0xffffffff, 0x000b000a,
880 0x246c, 0xffffffff, 0x00050004,
881 0x246d, 0xffffffff, 0x00070006,
882 0x246e, 0xffffffff, 0x0008000b,
883 0x246f, 0xffffffff, 0x000a0009,
884 0x2470, 0xffffffff, 0x000d000c,
885 0x2471, 0xffffffff, 0x00060005,
886 0x2472, 0xffffffff, 0x00080007,
887 0x2473, 0xffffffff, 0x0000000b,
888 0x2474, 0xffffffff, 0x000a0009,
889 0x2475, 0xffffffff, 0x000d000c,
78bbe771
TSD
890 mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
891 mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
892 mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
893 mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
bd27b678
FC
894 0x000c, 0xffffffff, 0x0000001c,
895 0x000d, 0x000f0000, 0x000f0000,
896 0x0583, 0xffffffff, 0x00000100,
897 0x0409, 0xffffffff, 0x00000100,
78bbe771
TSD
898 mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
899 mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
900 mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
901 mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
902 mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
903 mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
62a37553 904 0x3430, 0xfffffff0, 0x00000100,
78bbe771 905 0x3630, 0xfffffff0, 0x00000100,
62a37553
KW
906};
907
908static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
909{
910 unsigned long flags;
911 u32 r;
912
913 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
914 WREG32(AMDGPU_PCIE_INDEX, reg);
915 (void)RREG32(AMDGPU_PCIE_INDEX);
916 r = RREG32(AMDGPU_PCIE_DATA);
917 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
918 return r;
919}
920
921static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
922{
923 unsigned long flags;
924
925 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
926 WREG32(AMDGPU_PCIE_INDEX, reg);
927 (void)RREG32(AMDGPU_PCIE_INDEX);
928 WREG32(AMDGPU_PCIE_DATA, v);
929 (void)RREG32(AMDGPU_PCIE_DATA);
930 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
931}
932
d1936cc2 933static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
36b9a952
HR
934{
935 unsigned long flags;
936 u32 r;
937
938 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
939 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
940 (void)RREG32(PCIE_PORT_INDEX);
941 r = RREG32(PCIE_PORT_DATA);
942 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
943 return r;
944}
945
d1936cc2 946static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
36b9a952
HR
947{
948 unsigned long flags;
949
950 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
951 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
952 (void)RREG32(PCIE_PORT_INDEX);
953 WREG32(PCIE_PORT_DATA, (v));
954 (void)RREG32(PCIE_PORT_DATA);
955 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
956}
957
62a37553
KW
958static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
959{
960 unsigned long flags;
961 u32 r;
962
963 spin_lock_irqsave(&adev->smc_idx_lock, flags);
964 WREG32(SMC_IND_INDEX_0, (reg));
965 r = RREG32(SMC_IND_DATA_0);
966 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
967 return r;
968}
969
970static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
971{
972 unsigned long flags;
973
974 spin_lock_irqsave(&adev->smc_idx_lock, flags);
975 WREG32(SMC_IND_INDEX_0, (reg));
976 WREG32(SMC_IND_DATA_0, (v));
977 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
978}
979
80533a85
SJ
980static u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
981{
982 unsigned long flags;
983 u32 r;
984
985 spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
986 WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
987 r = RREG32(mmUVD_CTX_DATA);
988 spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
989 return r;
990}
991
992static void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
993{
994 unsigned long flags;
995
996 spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
997 WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
998 WREG32(mmUVD_CTX_DATA, (v));
999 spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
1000}
1001
62a37553 1002static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
97fcc76b 1003 {GRBM_STATUS},
664fe85a
MO
1004 {mmGRBM_STATUS2},
1005 {mmGRBM_STATUS_SE0},
1006 {mmGRBM_STATUS_SE1},
1007 {mmSRBM_STATUS},
1008 {mmSRBM_STATUS2},
1009 {DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
1010 {DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
1011 {mmCP_STAT},
1012 {mmCP_STALLED_STAT1},
1013 {mmCP_STALLED_STAT2},
1014 {mmCP_STALLED_STAT3},
97fcc76b
CK
1015 {GB_ADDR_CONFIG},
1016 {MC_ARB_RAMCFG},
1017 {GB_TILE_MODE0},
1018 {GB_TILE_MODE1},
1019 {GB_TILE_MODE2},
1020 {GB_TILE_MODE3},
1021 {GB_TILE_MODE4},
1022 {GB_TILE_MODE5},
1023 {GB_TILE_MODE6},
1024 {GB_TILE_MODE7},
1025 {GB_TILE_MODE8},
1026 {GB_TILE_MODE9},
1027 {GB_TILE_MODE10},
1028 {GB_TILE_MODE11},
1029 {GB_TILE_MODE12},
1030 {GB_TILE_MODE13},
1031 {GB_TILE_MODE14},
1032 {GB_TILE_MODE15},
1033 {GB_TILE_MODE16},
1034 {GB_TILE_MODE17},
1035 {GB_TILE_MODE18},
1036 {GB_TILE_MODE19},
1037 {GB_TILE_MODE20},
1038 {GB_TILE_MODE21},
1039 {GB_TILE_MODE22},
1040 {GB_TILE_MODE23},
1041 {GB_TILE_MODE24},
1042 {GB_TILE_MODE25},
1043 {GB_TILE_MODE26},
1044 {GB_TILE_MODE27},
1045 {GB_TILE_MODE28},
1046 {GB_TILE_MODE29},
1047 {GB_TILE_MODE30},
1048 {GB_TILE_MODE31},
1049 {CC_RB_BACKEND_DISABLE, true},
1050 {GC_USER_RB_BACKEND_DISABLE, true},
1051 {PA_SC_RASTER_CONFIG, true},
62a37553
KW
1052};
1053
dd5dfa61
FC
1054static uint32_t si_get_register_value(struct amdgpu_device *adev,
1055 bool indexed, u32 se_num,
1056 u32 sh_num, u32 reg_offset)
62a37553 1057{
dd5dfa61
FC
1058 if (indexed) {
1059 uint32_t val;
1060 unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1061 unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
62a37553 1062
dd5dfa61
FC
1063 switch (reg_offset) {
1064 case mmCC_RB_BACKEND_DISABLE:
1065 return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1066 case mmGC_USER_RB_BACKEND_DISABLE:
1067 return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1068 case mmPA_SC_RASTER_CONFIG:
1069 return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1070 }
62a37553 1071
dd5dfa61
FC
1072 mutex_lock(&adev->grbm_idx_mutex);
1073 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1074 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
62a37553 1075
dd5dfa61
FC
1076 val = RREG32(reg_offset);
1077
1078 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1079 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1080 mutex_unlock(&adev->grbm_idx_mutex);
1081 return val;
1082 } else {
1083 unsigned idx;
62a37553 1084
dd5dfa61
FC
1085 switch (reg_offset) {
1086 case mmGB_ADDR_CONFIG:
1087 return adev->gfx.config.gb_addr_config;
1088 case mmMC_ARB_RAMCFG:
1089 return adev->gfx.config.mc_arb_ramcfg;
1090 case mmGB_TILE_MODE0:
1091 case mmGB_TILE_MODE1:
1092 case mmGB_TILE_MODE2:
1093 case mmGB_TILE_MODE3:
1094 case mmGB_TILE_MODE4:
1095 case mmGB_TILE_MODE5:
1096 case mmGB_TILE_MODE6:
1097 case mmGB_TILE_MODE7:
1098 case mmGB_TILE_MODE8:
1099 case mmGB_TILE_MODE9:
1100 case mmGB_TILE_MODE10:
1101 case mmGB_TILE_MODE11:
1102 case mmGB_TILE_MODE12:
1103 case mmGB_TILE_MODE13:
1104 case mmGB_TILE_MODE14:
1105 case mmGB_TILE_MODE15:
1106 case mmGB_TILE_MODE16:
1107 case mmGB_TILE_MODE17:
1108 case mmGB_TILE_MODE18:
1109 case mmGB_TILE_MODE19:
1110 case mmGB_TILE_MODE20:
1111 case mmGB_TILE_MODE21:
1112 case mmGB_TILE_MODE22:
1113 case mmGB_TILE_MODE23:
1114 case mmGB_TILE_MODE24:
1115 case mmGB_TILE_MODE25:
1116 case mmGB_TILE_MODE26:
1117 case mmGB_TILE_MODE27:
1118 case mmGB_TILE_MODE28:
1119 case mmGB_TILE_MODE29:
1120 case mmGB_TILE_MODE30:
1121 case mmGB_TILE_MODE31:
1122 idx = (reg_offset - mmGB_TILE_MODE0);
1123 return adev->gfx.config.tile_mode_array[idx];
1124 default:
1125 return RREG32(reg_offset);
1126 }
1127 }
1128}
62a37553
KW
1129static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1130 u32 sh_num, u32 reg_offset, u32 *value)
1131{
1132 uint32_t i;
1133
1134 *value = 0;
1135 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
97fcc76b
CK
1136 bool indexed = si_allowed_read_registers[i].grbm_indexed;
1137
62a37553
KW
1138 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1139 continue;
1140
97fcc76b
CK
1141 *value = si_get_register_value(adev, indexed, se_num, sh_num,
1142 reg_offset);
62a37553
KW
1143 return 0;
1144 }
1145 return -EINVAL;
1146}
1147
1148static bool si_read_disabled_bios(struct amdgpu_device *adev)
1149{
1150 u32 bus_cntl;
1151 u32 d1vga_control = 0;
1152 u32 d2vga_control = 0;
1153 u32 vga_render_control = 0;
1154 u32 rom_cntl;
1155 bool r;
1156
1157 bus_cntl = RREG32(R600_BUS_CNTL);
1158 if (adev->mode_info.num_crtc) {
1159 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1160 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1161 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1162 }
1163 rom_cntl = RREG32(R600_ROM_CNTL);
1164
1165 /* enable the rom */
1166 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1167 if (adev->mode_info.num_crtc) {
1168 /* Disable VGA mode */
1169 WREG32(AVIVO_D1VGA_CONTROL,
1170 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1171 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1172 WREG32(AVIVO_D2VGA_CONTROL,
1173 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1174 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1175 WREG32(VGA_RENDER_CONTROL,
1176 (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1177 }
1178 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1179
1180 r = amdgpu_read_bios(adev);
1181
1182 /* restore regs */
1183 WREG32(R600_BUS_CNTL, bus_cntl);
1184 if (adev->mode_info.num_crtc) {
1185 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1186 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1187 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1188 }
1189 WREG32(R600_ROM_CNTL, rom_cntl);
1190 return r;
1191}
1192
6d949d24
AD
1193#define mmROM_INDEX 0x2A
1194#define mmROM_DATA 0x2B
1195
1196static bool si_read_bios_from_rom(struct amdgpu_device *adev,
1197 u8 *bios, u32 length_bytes)
1198{
1199 u32 *dw_ptr;
1200 u32 i, length_dw;
1201
1202 if (bios == NULL)
1203 return false;
1204 if (length_bytes == 0)
1205 return false;
1206 /* APU vbios image is part of sbios image */
1207 if (adev->flags & AMD_IS_APU)
1208 return false;
1209
1210 dw_ptr = (u32 *)bios;
1211 length_dw = ALIGN(length_bytes, 4) / 4;
1212 /* set rom index to 0 */
1213 WREG32(mmROM_INDEX, 0);
1214 for (i = 0; i < length_dw; i++)
1215 dw_ptr[i] = RREG32(mmROM_DATA);
1216
1217 return true;
1218}
1219
6cd3c679
AD
1220static void si_set_clk_bypass_mode(struct amdgpu_device *adev)
1221{
1222 u32 tmp, i;
1223
1224 tmp = RREG32(CG_SPLL_FUNC_CNTL);
1225 tmp |= SPLL_BYPASS_EN;
1226 WREG32(CG_SPLL_FUNC_CNTL, tmp);
1227
1228 tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1229 tmp |= SPLL_CTLREQ_CHG;
1230 WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1231
1232 for (i = 0; i < adev->usec_timeout; i++) {
1233 if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
1234 break;
1235 udelay(1);
1236 }
1237
1238 tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1239 tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
1240 WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1241
1242 tmp = RREG32(MPLL_CNTL_MODE);
1243 tmp &= ~MPLL_MCLK_SEL;
1244 WREG32(MPLL_CNTL_MODE, tmp);
1245}
1246
1247static void si_spll_powerdown(struct amdgpu_device *adev)
1248{
1249 u32 tmp;
1250
1251 tmp = RREG32(SPLL_CNTL_MODE);
1252 tmp |= SPLL_SW_DIR_CONTROL;
1253 WREG32(SPLL_CNTL_MODE, tmp);
1254
1255 tmp = RREG32(CG_SPLL_FUNC_CNTL);
1256 tmp |= SPLL_RESET;
1257 WREG32(CG_SPLL_FUNC_CNTL, tmp);
1258
1259 tmp = RREG32(CG_SPLL_FUNC_CNTL);
1260 tmp |= SPLL_SLEEP;
1261 WREG32(CG_SPLL_FUNC_CNTL, tmp);
1262
1263 tmp = RREG32(SPLL_CNTL_MODE);
1264 tmp &= ~SPLL_SW_DIR_CONTROL;
1265 WREG32(SPLL_CNTL_MODE, tmp);
1266}
1267
1268static int si_gpu_pci_config_reset(struct amdgpu_device *adev)
1269{
1270 u32 i;
1271 int r = -EINVAL;
1272
1273 dev_info(adev->dev, "GPU pci config reset\n");
1274
1275 /* set mclk/sclk to bypass */
1276 si_set_clk_bypass_mode(adev);
1277 /* powerdown spll */
1278 si_spll_powerdown(adev);
1279 /* disable BM */
1280 pci_clear_master(adev->pdev);
1281 /* reset */
1282 amdgpu_device_pci_config_reset(adev);
1283
1284 udelay(100);
1285
1286 /* wait for asic to come out of reset */
1287 for (i = 0; i < adev->usec_timeout; i++) {
1288 if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1289 /* enable BM */
1290 pci_set_master(adev->pdev);
1291 adev->has_hw_reset = true;
1292 r = 0;
1293 break;
1294 }
1295 udelay(1);
1296 }
1297
1298 return r;
1299}
1300
62a37553
KW
1301static int si_asic_reset(struct amdgpu_device *adev)
1302{
6cd3c679
AD
1303 int r;
1304
11043b7a
AD
1305 dev_info(adev->dev, "PCI CONFIG reset\n");
1306
6cd3c679
AD
1307 amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1308
1309 r = si_gpu_pci_config_reset(adev);
1310
1311 amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1312
1313 return r;
62a37553
KW
1314}
1315
3670c242
AD
1316static bool si_asic_supports_baco(struct amdgpu_device *adev)
1317{
1318 return false;
1319}
1320
dd81eede
AD
1321static enum amd_reset_method
1322si_asic_reset_method(struct amdgpu_device *adev)
1323{
273da6ff
WS
1324 if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
1325 amdgpu_reset_method != -1)
1326 dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
1327 amdgpu_reset_method);
1328
dd81eede
AD
1329 return AMD_RESET_METHOD_LEGACY;
1330}
1331
bbf282d8
AD
1332static u32 si_get_config_memsize(struct amdgpu_device *adev)
1333{
1334 return RREG32(mmCONFIG_MEMSIZE);
1335}
1336
62a37553
KW
1337static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1338{
1339 uint32_t temp;
1340
1341 temp = RREG32(CONFIG_CNTL);
1342 if (state == false) {
1343 temp &= ~(1<<0);
1344 temp |= (1<<1);
1345 } else {
1346 temp &= ~(1<<1);
1347 }
1348 WREG32(CONFIG_CNTL, temp);
1349}
1350
1351static u32 si_get_xclk(struct amdgpu_device *adev)
1352{
1353 u32 reference_clock = adev->clock.spll.reference_freq;
1354 u32 tmp;
1355
1356 tmp = RREG32(CG_CLKPIN_CNTL_2);
1357 if (tmp & MUX_TCLK_TO_XCLK)
1358 return TCLK;
1359
1360 tmp = RREG32(CG_CLKPIN_CNTL);
1361 if (tmp & XTALIN_DIVIDE)
1362 return reference_clock / 4;
1363
1364 return reference_clock;
1365}
1919696e 1366
69882565 1367static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
2d5e0807 1368{
69882565
CK
1369 if (!ring || !ring->funcs->emit_wreg) {
1370 WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1371 RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1372 } else {
1373 amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1374 }
2d5e0807
AD
1375}
1376
69882565
CK
1377static void si_invalidate_hdp(struct amdgpu_device *adev,
1378 struct amdgpu_ring *ring)
2d5e0807 1379{
69882565
CK
1380 if (!ring || !ring->funcs->emit_wreg) {
1381 WREG32(mmHDP_DEBUG0, 1);
1382 RREG32(mmHDP_DEBUG0);
1383 } else {
1384 amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1385 }
2d5e0807
AD
1386}
1387
0a881af8
AD
1388static bool si_need_full_reset(struct amdgpu_device *adev)
1389{
1390 /* change this when we support soft reset */
1391 return true;
1392}
1393
7450bbe7
AD
1394static bool si_need_reset_on_init(struct amdgpu_device *adev)
1395{
1396 return false;
1397}
1398
20ca25e8
AD
1399static int si_get_pcie_lanes(struct amdgpu_device *adev)
1400{
1401 u32 link_width_cntl;
1402
1403 if (adev->flags & AMD_IS_APU)
1404 return 0;
1405
1406 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1407
1408 switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
1409 case LC_LINK_WIDTH_X1:
1410 return 1;
1411 case LC_LINK_WIDTH_X2:
1412 return 2;
1413 case LC_LINK_WIDTH_X4:
1414 return 4;
1415 case LC_LINK_WIDTH_X8:
1416 return 8;
1417 case LC_LINK_WIDTH_X0:
1418 case LC_LINK_WIDTH_X16:
1419 default:
1420 return 16;
1421 }
1422}
1423
1424static void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
1425{
1426 u32 link_width_cntl, mask;
1427
1428 if (adev->flags & AMD_IS_APU)
1429 return;
1430
1431 switch (lanes) {
1432 case 0:
1433 mask = LC_LINK_WIDTH_X0;
1434 break;
1435 case 1:
1436 mask = LC_LINK_WIDTH_X1;
1437 break;
1438 case 2:
1439 mask = LC_LINK_WIDTH_X2;
1440 break;
1441 case 4:
1442 mask = LC_LINK_WIDTH_X4;
1443 break;
1444 case 8:
1445 mask = LC_LINK_WIDTH_X8;
1446 break;
1447 case 16:
1448 mask = LC_LINK_WIDTH_X16;
1449 break;
1450 default:
1451 DRM_ERROR("invalid pcie lane request: %d\n", lanes);
1452 return;
1453 }
1454
1455 link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1456 link_width_cntl &= ~LC_LINK_WIDTH_MASK;
1457 link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
1458 link_width_cntl |= (LC_RECONFIG_NOW |
1459 LC_RECONFIG_ARC_MISSING_ESCAPE);
1460
1461 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1462}
1463
b45e18ac
KR
1464static void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1465 uint64_t *count1)
1466{
1467 uint32_t perfctr = 0;
1468 uint64_t cnt0_of, cnt1_of;
1469 int tmp;
1470
1471 /* This reports 0 on APUs, so return to avoid writing/reading registers
1472 * that may or may not be different from their GPU counterparts
1473 */
0172591e
ES
1474 if (adev->flags & AMD_IS_APU)
1475 return;
b45e18ac
KR
1476
1477 /* Set the 2 events that we wish to watch, defined above */
1478 /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1479 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1480 perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1481
1482 /* Write to enable desired perf counters */
1483 WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1484 /* Zero out and enable the perf counters
1485 * Write 0x5:
1486 * Bit 0 = Start all counters(1)
1487 * Bit 2 = Global counter reset enable(1)
1488 */
1489 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1490
1491 msleep(1000);
1492
1493 /* Load the shadow and disable the perf counters
1494 * Write 0x2:
1495 * Bit 0 = Stop counters(0)
1496 * Bit 1 = Load the shadow counters(1)
1497 */
1498 WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1499
1500 /* Read register values to get any >32bit overflow */
1501 tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1502 cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1503 cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1504
1505 /* Get the values and add the overflow */
1506 *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1507 *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1508}
1509
dcea6e65
KR
1510static uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
1511{
1512 uint64_t nak_r, nak_g;
1513
1514 /* Get the number of NAKs received and generated */
1515 nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1516 nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1517
1518 /* Add the total number of NAKs, i.e the number of replays */
1519 return (nak_r + nak_g);
1520}
1521
3b0627a4
AJ
1522static int si_uvd_send_upll_ctlreq(struct amdgpu_device *adev,
1523 unsigned cg_upll_func_cntl)
1524{
1525 unsigned i;
1526
1527 /* Make sure UPLL_CTLREQ is deasserted */
1528 WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1529
1530 mdelay(10);
1531
1532 /* Assert UPLL_CTLREQ */
1533 WREG32_P(cg_upll_func_cntl, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1534
1535 /* Wait for CTLACK and CTLACK2 to get asserted */
1536 for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1537 uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1538
1539 if ((RREG32(cg_upll_func_cntl) & mask) == mask)
1540 break;
1541 mdelay(10);
1542 }
1543
1544 /* Deassert UPLL_CTLREQ */
1545 WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
1546
1547 if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1548 DRM_ERROR("Timeout setting UVD clocks!\n");
1549 return -ETIMEDOUT;
1550 }
1551
1552 return 0;
1553}
1554
1555static unsigned si_uvd_calc_upll_post_div(unsigned vco_freq,
1556 unsigned target_freq,
1557 unsigned pd_min,
1558 unsigned pd_even)
1559{
1560 unsigned post_div = vco_freq / target_freq;
1561
1562 /* Adjust to post divider minimum value */
1563 if (post_div < pd_min)
1564 post_div = pd_min;
1565
1566 /* We alway need a frequency less than or equal the target */
1567 if ((vco_freq / post_div) > target_freq)
1568 post_div += 1;
1569
1570 /* Post dividers above a certain value must be even */
1571 if (post_div > pd_even && post_div % 2)
1572 post_div += 1;
1573
1574 return post_div;
1575}
1576
1577/**
1578 * si_calc_upll_dividers - calc UPLL clock dividers
1579 *
1580 * @adev: amdgpu_device pointer
1581 * @vclk: wanted VCLK
1582 * @dclk: wanted DCLK
1583 * @vco_min: minimum VCO frequency
1584 * @vco_max: maximum VCO frequency
1585 * @fb_factor: factor to multiply vco freq with
1586 * @fb_mask: limit and bitmask for feedback divider
1587 * @pd_min: post divider minimum
1588 * @pd_max: post divider maximum
1589 * @pd_even: post divider must be even above this value
1590 * @optimal_fb_div: resulting feedback divider
1591 * @optimal_vclk_div: resulting vclk post divider
1592 * @optimal_dclk_div: resulting dclk post divider
1593 *
1594 * Calculate dividers for UVDs UPLL (except APUs).
1595 * Returns zero on success; -EINVAL on error.
1596 */
1597static int si_calc_upll_dividers(struct amdgpu_device *adev,
1598 unsigned vclk, unsigned dclk,
1599 unsigned vco_min, unsigned vco_max,
1600 unsigned fb_factor, unsigned fb_mask,
1601 unsigned pd_min, unsigned pd_max,
1602 unsigned pd_even,
1603 unsigned *optimal_fb_div,
1604 unsigned *optimal_vclk_div,
1605 unsigned *optimal_dclk_div)
1606{
1607 unsigned vco_freq, ref_freq = adev->clock.spll.reference_freq;
1608
1609 /* Start off with something large */
1610 unsigned optimal_score = ~0;
1611
1612 /* Loop through vco from low to high */
1613 vco_min = max(max(vco_min, vclk), dclk);
1614 for (vco_freq = vco_min; vco_freq <= vco_max; vco_freq += 100) {
1615 uint64_t fb_div = (uint64_t)vco_freq * fb_factor;
1616 unsigned vclk_div, dclk_div, score;
1617
1618 do_div(fb_div, ref_freq);
1619
1620 /* fb div out of range ? */
1621 if (fb_div > fb_mask)
1622 break; /* It can oly get worse */
1623
1624 fb_div &= fb_mask;
1625
1626 /* Calc vclk divider with current vco freq */
1627 vclk_div = si_uvd_calc_upll_post_div(vco_freq, vclk,
1628 pd_min, pd_even);
1629 if (vclk_div > pd_max)
1630 break; /* vco is too big, it has to stop */
1631
1632 /* Calc dclk divider with current vco freq */
1633 dclk_div = si_uvd_calc_upll_post_div(vco_freq, dclk,
1634 pd_min, pd_even);
1635 if (dclk_div > pd_max)
1636 break; /* vco is too big, it has to stop */
1637
1638 /* Calc score with current vco freq */
1639 score = vclk - (vco_freq / vclk_div) + dclk - (vco_freq / dclk_div);
1640
1641 /* Determine if this vco setting is better than current optimal settings */
1642 if (score < optimal_score) {
1643 *optimal_fb_div = fb_div;
1644 *optimal_vclk_div = vclk_div;
1645 *optimal_dclk_div = dclk_div;
1646 optimal_score = score;
1647 if (optimal_score == 0)
1648 break; /* It can't get better than this */
1649 }
1650 }
1651
1652 /* Did we found a valid setup ? */
1653 if (optimal_score == ~0)
1654 return -EINVAL;
1655
1656 return 0;
1657}
1658
1659static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1660{
1661 unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1662 int r;
1663
1664 /* Bypass vclk and dclk with bclk */
1665 WREG32_P(CG_UPLL_FUNC_CNTL_2,
1666 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1667 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1668
1669 /* Put PLL in bypass mode */
1670 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1671
1672 if (!vclk || !dclk) {
1673 /* Keep the Bypass mode */
1674 return 0;
1675 }
1676
1677 r = si_calc_upll_dividers(adev, vclk, dclk, 125000, 250000,
1678 16384, 0x03FFFFFF, 0, 128, 5,
1679 &fb_div, &vclk_div, &dclk_div);
1680 if (r)
1681 return r;
1682
1683 /* Set RESET_ANTI_MUX to 0 */
1684 WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1685
1686 /* Set VCO_MODE to 1 */
1687 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1688
1689 /* Disable sleep mode */
1690 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1691
1692 /* Deassert UPLL_RESET */
1693 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1694
1695 mdelay(1);
1696
1697 r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1698 if (r)
1699 return r;
1700
1701 /* Assert UPLL_RESET again */
1702 WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1703
1704 /* Disable spread spectrum. */
1705 WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1706
1707 /* Set feedback divider */
1708 WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1709
1710 /* Set ref divider to 0 */
1711 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1712
1713 if (fb_div < 307200)
1714 WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1715 else
1716 WREG32_P(CG_UPLL_FUNC_CNTL_4,
1717 UPLL_SPARE_ISPARE9,
1718 ~UPLL_SPARE_ISPARE9);
1719
1720 /* Set PDIV_A and PDIV_B */
1721 WREG32_P(CG_UPLL_FUNC_CNTL_2,
1722 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1723 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1724
1725 /* Give the PLL some time to settle */
1726 mdelay(15);
1727
1728 /* Deassert PLL_RESET */
1729 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1730
1731 mdelay(15);
1732
1733 /* Switch from bypass mode to normal mode */
1734 WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1735
1736 r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
1737 if (r)
1738 return r;
1739
1740 /* Switch VCLK and DCLK selection */
1741 WREG32_P(CG_UPLL_FUNC_CNTL_2,
1742 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1743 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1744
1745 mdelay(100);
1746
1747 return 0;
1748}
1749
fb40bceb
AJ
1750static int si_vce_send_vcepll_ctlreq(struct amdgpu_device *adev)
1751{
1752 unsigned i;
1753
1754 /* Make sure VCEPLL_CTLREQ is deasserted */
1755 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1756
1757 mdelay(10);
1758
1759 /* Assert UPLL_CTLREQ */
1760 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
1761
1762 /* Wait for CTLACK and CTLACK2 to get asserted */
1763 for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
1764 uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
1765
1766 if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
1767 break;
1768 mdelay(10);
1769 }
1770
1771 /* Deassert UPLL_CTLREQ */
1772 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
1773
1774 if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
1775 DRM_ERROR("Timeout setting UVD clocks!\n");
1776 return -ETIMEDOUT;
1777 }
1778
1779 return 0;
1780}
1781
1782static int si_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1783{
1784 unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
1785 int r;
1786
1787 /* Bypass evclk and ecclk with bclk */
1788 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1789 EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
1790 ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1791
1792 /* Put PLL in bypass mode */
1793 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
1794 ~VCEPLL_BYPASS_EN_MASK);
1795
1796 if (!evclk || !ecclk) {
1797 /* Keep the Bypass mode, put PLL to sleep */
1798 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1799 ~VCEPLL_SLEEP_MASK);
1800 return 0;
1801 }
1802
1803 r = si_calc_upll_dividers(adev, evclk, ecclk, 125000, 250000,
1804 16384, 0x03FFFFFF, 0, 128, 5,
1805 &fb_div, &evclk_div, &ecclk_div);
1806 if (r)
1807 return r;
1808
1809 /* Set RESET_ANTI_MUX to 0 */
1810 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
1811
1812 /* Set VCO_MODE to 1 */
1813 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
1814 ~VCEPLL_VCO_MODE_MASK);
1815
1816 /* Toggle VCEPLL_SLEEP to 1 then back to 0 */
1817 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
1818 ~VCEPLL_SLEEP_MASK);
1819 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
1820
1821 /* Deassert VCEPLL_RESET */
1822 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1823
1824 mdelay(1);
1825
1826 r = si_vce_send_vcepll_ctlreq(adev);
1827 if (r)
1828 return r;
1829
1830 /* Assert VCEPLL_RESET again */
1831 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
1832
1833 /* Disable spread spectrum. */
1834 WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1835
1836 /* Set feedback divider */
1837 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3,
1838 VCEPLL_FB_DIV(fb_div),
1839 ~VCEPLL_FB_DIV_MASK);
1840
1841 /* Set ref divider to 0 */
1842 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
1843
1844 /* Set PDIV_A and PDIV_B */
1845 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1846 VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
1847 ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
1848
1849 /* Give the PLL some time to settle */
1850 mdelay(15);
1851
1852 /* Deassert PLL_RESET */
1853 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
1854
1855 mdelay(15);
1856
1857 /* Switch from bypass mode to normal mode */
1858 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
1859
1860 r = si_vce_send_vcepll_ctlreq(adev);
1861 if (r)
1862 return r;
1863
1864 /* Switch VCLK and DCLK selection */
1865 WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
1866 EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
1867 ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
1868
1869 mdelay(100);
1870
1871 return 0;
1872}
1873
632d9f94
AD
1874static void si_pre_asic_init(struct amdgpu_device *adev)
1875{
1876}
1877
62a37553
KW
1878static const struct amdgpu_asic_funcs si_asic_funcs =
1879{
1880 .read_disabled_bios = &si_read_disabled_bios,
6d949d24 1881 .read_bios_from_rom = &si_read_bios_from_rom,
62a37553
KW
1882 .read_register = &si_read_register,
1883 .reset = &si_asic_reset,
dd81eede 1884 .reset_method = &si_asic_reset_method,
62a37553
KW
1885 .set_vga_state = &si_vga_set_state,
1886 .get_xclk = &si_get_xclk,
1887 .set_uvd_clocks = &si_set_uvd_clocks,
fb40bceb 1888 .set_vce_clocks = &si_set_vce_clocks,
20ca25e8
AD
1889 .get_pcie_lanes = &si_get_pcie_lanes,
1890 .set_pcie_lanes = &si_set_pcie_lanes,
bbf282d8 1891 .get_config_memsize = &si_get_config_memsize,
2d5e0807
AD
1892 .flush_hdp = &si_flush_hdp,
1893 .invalidate_hdp = &si_invalidate_hdp,
0a881af8 1894 .need_full_reset = &si_need_full_reset,
b45e18ac 1895 .get_pcie_usage = &si_get_pcie_usage,
7450bbe7 1896 .need_reset_on_init = &si_need_reset_on_init,
dcea6e65 1897 .get_pcie_replay_count = &si_get_pcie_replay_count,
3670c242 1898 .supports_baco = &si_asic_supports_baco,
632d9f94 1899 .pre_asic_init = &si_pre_asic_init,
62a37553
KW
1900};
1901
1902static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1903{
1904 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1905 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1906}
1907
1908static int si_common_early_init(void *handle)
1909{
1910 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1911
1912 adev->smc_rreg = &si_smc_rreg;
1913 adev->smc_wreg = &si_smc_wreg;
1914 adev->pcie_rreg = &si_pcie_rreg;
1915 adev->pcie_wreg = &si_pcie_wreg;
36b9a952
HR
1916 adev->pciep_rreg = &si_pciep_rreg;
1917 adev->pciep_wreg = &si_pciep_wreg;
80533a85
SJ
1918 adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
1919 adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
62a37553
KW
1920 adev->didt_rreg = NULL;
1921 adev->didt_wreg = NULL;
1922
1923 adev->asic_funcs = &si_asic_funcs;
1924
1925 adev->rev_id = si_get_rev_id(adev);
1926 adev->external_rev_id = 0xFF;
1927 switch (adev->asic_type) {
1928 case CHIP_TAHITI:
1929 adev->cg_flags =
1930 AMD_CG_SUPPORT_GFX_MGCG |
1931 AMD_CG_SUPPORT_GFX_MGLS |
1932 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1933 AMD_CG_SUPPORT_GFX_CGLS |
1934 AMD_CG_SUPPORT_GFX_CGTS |
1935 AMD_CG_SUPPORT_GFX_CP_LS |
1936 AMD_CG_SUPPORT_MC_MGCG |
1937 AMD_CG_SUPPORT_SDMA_MGCG |
1938 AMD_CG_SUPPORT_BIF_LS |
1939 AMD_CG_SUPPORT_VCE_MGCG |
1940 AMD_CG_SUPPORT_UVD_MGCG |
1941 AMD_CG_SUPPORT_HDP_LS |
1942 AMD_CG_SUPPORT_HDP_MGCG;
9b49c197 1943 adev->pg_flags = 0;
7c0a705e
FC
1944 adev->external_rev_id = (adev->rev_id == 0) ? 1 :
1945 (adev->rev_id == 1) ? 5 : 6;
62a37553
KW
1946 break;
1947 case CHIP_PITCAIRN:
1948 adev->cg_flags =
1949 AMD_CG_SUPPORT_GFX_MGCG |
1950 AMD_CG_SUPPORT_GFX_MGLS |
1951 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1952 AMD_CG_SUPPORT_GFX_CGLS |
1953 AMD_CG_SUPPORT_GFX_CGTS |
1954 AMD_CG_SUPPORT_GFX_CP_LS |
1955 AMD_CG_SUPPORT_GFX_RLC_LS |
1956 AMD_CG_SUPPORT_MC_LS |
1957 AMD_CG_SUPPORT_MC_MGCG |
1958 AMD_CG_SUPPORT_SDMA_MGCG |
1959 AMD_CG_SUPPORT_BIF_LS |
1960 AMD_CG_SUPPORT_VCE_MGCG |
1961 AMD_CG_SUPPORT_UVD_MGCG |
1962 AMD_CG_SUPPORT_HDP_LS |
1963 AMD_CG_SUPPORT_HDP_MGCG;
1964 adev->pg_flags = 0;
e285a9a6 1965 adev->external_rev_id = adev->rev_id + 20;
62a37553
KW
1966 break;
1967
1968 case CHIP_VERDE:
1969 adev->cg_flags =
1970 AMD_CG_SUPPORT_GFX_MGCG |
1971 AMD_CG_SUPPORT_GFX_MGLS |
1972 AMD_CG_SUPPORT_GFX_CGLS |
1973 AMD_CG_SUPPORT_GFX_CGTS |
1974 AMD_CG_SUPPORT_GFX_CGTS_LS |
1975 AMD_CG_SUPPORT_GFX_CP_LS |
1976 AMD_CG_SUPPORT_MC_LS |
1977 AMD_CG_SUPPORT_MC_MGCG |
1978 AMD_CG_SUPPORT_SDMA_MGCG |
1979 AMD_CG_SUPPORT_SDMA_LS |
1980 AMD_CG_SUPPORT_BIF_LS |
1981 AMD_CG_SUPPORT_VCE_MGCG |
1982 AMD_CG_SUPPORT_UVD_MGCG |
1983 AMD_CG_SUPPORT_HDP_LS |
1984 AMD_CG_SUPPORT_HDP_MGCG;
1985 adev->pg_flags = 0;
1986 //???
f815b29c 1987 adev->external_rev_id = adev->rev_id + 40;
62a37553
KW
1988 break;
1989 case CHIP_OLAND:
1990 adev->cg_flags =
1991 AMD_CG_SUPPORT_GFX_MGCG |
1992 AMD_CG_SUPPORT_GFX_MGLS |
1993 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1994 AMD_CG_SUPPORT_GFX_CGLS |
1995 AMD_CG_SUPPORT_GFX_CGTS |
1996 AMD_CG_SUPPORT_GFX_CP_LS |
1997 AMD_CG_SUPPORT_GFX_RLC_LS |
1998 AMD_CG_SUPPORT_MC_LS |
1999 AMD_CG_SUPPORT_MC_MGCG |
2000 AMD_CG_SUPPORT_SDMA_MGCG |
2001 AMD_CG_SUPPORT_BIF_LS |
2002 AMD_CG_SUPPORT_UVD_MGCG |
2003 AMD_CG_SUPPORT_HDP_LS |
2004 AMD_CG_SUPPORT_HDP_MGCG;
2005 adev->pg_flags = 0;
8fd74cb4 2006 adev->external_rev_id = 60;
62a37553
KW
2007 break;
2008 case CHIP_HAINAN:
2009 adev->cg_flags =
2010 AMD_CG_SUPPORT_GFX_MGCG |
2011 AMD_CG_SUPPORT_GFX_MGLS |
2012 /*AMD_CG_SUPPORT_GFX_CGCG |*/
2013 AMD_CG_SUPPORT_GFX_CGLS |
2014 AMD_CG_SUPPORT_GFX_CGTS |
2015 AMD_CG_SUPPORT_GFX_CP_LS |
2016 AMD_CG_SUPPORT_GFX_RLC_LS |
2017 AMD_CG_SUPPORT_MC_LS |
2018 AMD_CG_SUPPORT_MC_MGCG |
2019 AMD_CG_SUPPORT_SDMA_MGCG |
2020 AMD_CG_SUPPORT_BIF_LS |
2021 AMD_CG_SUPPORT_HDP_LS |
2022 AMD_CG_SUPPORT_HDP_MGCG;
2023 adev->pg_flags = 0;
05319478 2024 adev->external_rev_id = 70;
62a37553
KW
2025 break;
2026
2027 default:
2028 return -EINVAL;
2029 }
2030
2031 return 0;
2032}
2033
2034static int si_common_sw_init(void *handle)
2035{
2036 return 0;
2037}
2038
2039static int si_common_sw_fini(void *handle)
2040{
2041 return 0;
2042}
2043
2044
2045static void si_init_golden_registers(struct amdgpu_device *adev)
2046{
2047 switch (adev->asic_type) {
2048 case CHIP_TAHITI:
9c3f2b54
AD
2049 amdgpu_device_program_register_sequence(adev,
2050 tahiti_golden_registers,
2051 ARRAY_SIZE(tahiti_golden_registers));
2052 amdgpu_device_program_register_sequence(adev,
2053 tahiti_golden_rlc_registers,
2054 ARRAY_SIZE(tahiti_golden_rlc_registers));
2055 amdgpu_device_program_register_sequence(adev,
2056 tahiti_mgcg_cgcg_init,
2057 ARRAY_SIZE(tahiti_mgcg_cgcg_init));
2058 amdgpu_device_program_register_sequence(adev,
2059 tahiti_golden_registers2,
2060 ARRAY_SIZE(tahiti_golden_registers2));
62a37553
KW
2061 break;
2062 case CHIP_PITCAIRN:
9c3f2b54
AD
2063 amdgpu_device_program_register_sequence(adev,
2064 pitcairn_golden_registers,
2065 ARRAY_SIZE(pitcairn_golden_registers));
2066 amdgpu_device_program_register_sequence(adev,
2067 pitcairn_golden_rlc_registers,
2068 ARRAY_SIZE(pitcairn_golden_rlc_registers));
2069 amdgpu_device_program_register_sequence(adev,
2070 pitcairn_mgcg_cgcg_init,
2071 ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
5694785c 2072 break;
62a37553 2073 case CHIP_VERDE:
9c3f2b54
AD
2074 amdgpu_device_program_register_sequence(adev,
2075 verde_golden_registers,
2076 ARRAY_SIZE(verde_golden_registers));
2077 amdgpu_device_program_register_sequence(adev,
2078 verde_golden_rlc_registers,
2079 ARRAY_SIZE(verde_golden_rlc_registers));
2080 amdgpu_device_program_register_sequence(adev,
2081 verde_mgcg_cgcg_init,
2082 ARRAY_SIZE(verde_mgcg_cgcg_init));
2083 amdgpu_device_program_register_sequence(adev,
2084 verde_pg_init,
2085 ARRAY_SIZE(verde_pg_init));
62a37553
KW
2086 break;
2087 case CHIP_OLAND:
9c3f2b54
AD
2088 amdgpu_device_program_register_sequence(adev,
2089 oland_golden_registers,
2090 ARRAY_SIZE(oland_golden_registers));
2091 amdgpu_device_program_register_sequence(adev,
2092 oland_golden_rlc_registers,
2093 ARRAY_SIZE(oland_golden_rlc_registers));
2094 amdgpu_device_program_register_sequence(adev,
2095 oland_mgcg_cgcg_init,
2096 ARRAY_SIZE(oland_mgcg_cgcg_init));
5694785c 2097 break;
62a37553 2098 case CHIP_HAINAN:
9c3f2b54
AD
2099 amdgpu_device_program_register_sequence(adev,
2100 hainan_golden_registers,
2101 ARRAY_SIZE(hainan_golden_registers));
2102 amdgpu_device_program_register_sequence(adev,
2103 hainan_golden_registers2,
2104 ARRAY_SIZE(hainan_golden_registers2));
2105 amdgpu_device_program_register_sequence(adev,
2106 hainan_mgcg_cgcg_init,
2107 ARRAY_SIZE(hainan_mgcg_cgcg_init));
62a37553
KW
2108 break;
2109
2110
2111 default:
2112 BUG();
2113 }
2114}
2115
62a37553
KW
2116static void si_pcie_gen3_enable(struct amdgpu_device *adev)
2117{
2118 struct pci_dev *root = adev->pdev->bus->self;
0bf67185
AD
2119 u32 speed_cntl, current_data_rate;
2120 int i;
62a37553
KW
2121 u16 tmp16;
2122
2123 if (pci_is_root_bus(adev->pdev->bus))
2124 return;
2125
2126 if (amdgpu_pcie_gen2 == 0)
2127 return;
2128
2129 if (adev->flags & AMD_IS_APU)
2130 return;
2131
0bf67185
AD
2132 if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
2133 CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
62a37553
KW
2134 return;
2135
36b9a952 2136 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
62a37553
KW
2137 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
2138 LC_CURRENT_DATA_RATE_SHIFT;
0bf67185 2139 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
62a37553
KW
2140 if (current_data_rate == 2) {
2141 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
2142 return;
2143 }
2144 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
0bf67185 2145 } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
62a37553
KW
2146 if (current_data_rate == 1) {
2147 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
2148 return;
2149 }
2150 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
2151 }
2152
88027c89 2153 if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
62a37553
KW
2154 return;
2155
0bf67185 2156 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
62a37553
KW
2157 if (current_data_rate != 2) {
2158 u16 bridge_cfg, gpu_cfg;
2159 u16 bridge_cfg2, gpu_cfg2;
2160 u32 max_lw, current_lw, tmp;
2161
88027c89
FL
2162 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2163 &bridge_cfg);
2164 pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
2165 &gpu_cfg);
62a37553
KW
2166
2167 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
88027c89 2168 pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
62a37553
KW
2169
2170 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
88027c89
FL
2171 pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
2172 tmp16);
62a37553
KW
2173
2174 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
2175 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
2176 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
2177
2178 if (current_lw < max_lw) {
36b9a952 2179 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
62a37553
KW
2180 if (tmp & LC_RENEGOTIATION_SUPPORT) {
2181 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
2182 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
2183 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
36b9a952 2184 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
62a37553
KW
2185 }
2186 }
2187
2188 for (i = 0; i < 10; i++) {
88027c89
FL
2189 pcie_capability_read_word(adev->pdev,
2190 PCI_EXP_DEVSTA,
2191 &tmp16);
62a37553
KW
2192 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
2193 break;
2194
88027c89
FL
2195 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2196 &bridge_cfg);
2197 pcie_capability_read_word(adev->pdev,
2198 PCI_EXP_LNKCTL,
2199 &gpu_cfg);
62a37553 2200
88027c89
FL
2201 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2202 &bridge_cfg2);
2203 pcie_capability_read_word(adev->pdev,
2204 PCI_EXP_LNKCTL2,
2205 &gpu_cfg2);
62a37553 2206
36b9a952 2207 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
62a37553 2208 tmp |= LC_SET_QUIESCE;
36b9a952 2209 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
62a37553 2210
36b9a952 2211 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
62a37553 2212 tmp |= LC_REDO_EQ;
36b9a952 2213 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
62a37553
KW
2214
2215 mdelay(100);
2216
88027c89
FL
2217 pcie_capability_read_word(root, PCI_EXP_LNKCTL,
2218 &tmp16);
62a37553
KW
2219 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2220 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
88027c89
FL
2221 pcie_capability_write_word(root, PCI_EXP_LNKCTL,
2222 tmp16);
62a37553 2223
88027c89
FL
2224 pcie_capability_read_word(adev->pdev,
2225 PCI_EXP_LNKCTL,
2226 &tmp16);
62a37553
KW
2227 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
2228 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
88027c89
FL
2229 pcie_capability_write_word(adev->pdev,
2230 PCI_EXP_LNKCTL,
2231 tmp16);
62a37553 2232
88027c89
FL
2233 pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
2234 &tmp16);
35e768e2
BH
2235 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2236 PCI_EXP_LNKCTL2_TX_MARGIN);
2237 tmp16 |= (bridge_cfg2 &
2238 (PCI_EXP_LNKCTL2_ENTER_COMP |
2239 PCI_EXP_LNKCTL2_TX_MARGIN));
88027c89
FL
2240 pcie_capability_write_word(root,
2241 PCI_EXP_LNKCTL2,
2242 tmp16);
62a37553 2243
88027c89
FL
2244 pcie_capability_read_word(adev->pdev,
2245 PCI_EXP_LNKCTL2,
2246 &tmp16);
35e768e2
BH
2247 tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
2248 PCI_EXP_LNKCTL2_TX_MARGIN);
2249 tmp16 |= (gpu_cfg2 &
2250 (PCI_EXP_LNKCTL2_ENTER_COMP |
2251 PCI_EXP_LNKCTL2_TX_MARGIN));
88027c89
FL
2252 pcie_capability_write_word(adev->pdev,
2253 PCI_EXP_LNKCTL2,
2254 tmp16);
62a37553 2255
36b9a952 2256 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
62a37553 2257 tmp &= ~LC_SET_QUIESCE;
36b9a952 2258 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
62a37553
KW
2259 }
2260 }
2261 }
2262
2263 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
2264 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
36b9a952 2265 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
62a37553 2266
88027c89 2267 pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
35e768e2 2268 tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
88027c89 2269
0bf67185 2270 if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
35e768e2 2271 tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
0bf67185 2272 else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
35e768e2 2273 tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
62a37553 2274 else
35e768e2 2275 tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
88027c89 2276 pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
62a37553 2277
36b9a952 2278 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
62a37553 2279 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
36b9a952 2280 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
62a37553
KW
2281
2282 for (i = 0; i < adev->usec_timeout; i++) {
36b9a952 2283 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
62a37553
KW
2284 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
2285 break;
2286 udelay(1);
2287 }
2288}
2289
2290static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
2291{
2292 unsigned long flags;
2293 u32 r;
2294
2295 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2296 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2297 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
2298 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2299 return r;
2300}
2301
2302static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2303{
2304 unsigned long flags;
2305
2306 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2307 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2308 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
2309 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2310}
2311
2312static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
2313{
2314 unsigned long flags;
2315 u32 r;
2316
2317 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2318 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2319 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
2320 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2321 return r;
2322}
2323
2324static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
2325{
2326 unsigned long flags;
2327
2328 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
2329 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2330 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
2331 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
2332}
2333static void si_program_aspm(struct amdgpu_device *adev)
2334{
2335 u32 data, orig;
2336 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
2337 bool disable_clkreq = false;
2338
2339 if (amdgpu_aspm == 0)
2340 return;
2341
2342 if (adev->flags & AMD_IS_APU)
2343 return;
36b9a952 2344 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
62a37553
KW
2345 data &= ~LC_XMIT_N_FTS_MASK;
2346 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
2347 if (orig != data)
36b9a952 2348 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
62a37553 2349
36b9a952 2350 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
62a37553
KW
2351 data |= LC_GO_TO_RECOVERY;
2352 if (orig != data)
36b9a952 2353 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
62a37553
KW
2354
2355 orig = data = RREG32_PCIE(PCIE_P_CNTL);
2356 data |= P_IGNORE_EDB_ERR;
2357 if (orig != data)
2358 WREG32_PCIE(PCIE_P_CNTL, data);
2359
36b9a952 2360 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
62a37553
KW
2361 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
2362 data |= LC_PMI_TO_L1_DIS;
2363 if (!disable_l0s)
2364 data |= LC_L0S_INACTIVITY(7);
2365
2366 if (!disable_l1) {
2367 data |= LC_L1_INACTIVITY(7);
2368 data &= ~LC_PMI_TO_L1_DIS;
2369 if (orig != data)
36b9a952 2370 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
62a37553
KW
2371
2372 if (!disable_plloff_in_l1) {
2373 bool clk_req_support;
2374
2375 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2376 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2377 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2378 if (orig != data)
2379 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2380
2381 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2382 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2383 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2384 if (orig != data)
2385 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2386
2387 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2388 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
2389 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
2390 if (orig != data)
2391 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2392
2393 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2394 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
2395 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
2396 if (orig != data)
2397 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2398
77efe48a 2399 if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
62a37553
KW
2400 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
2401 data &= ~PLL_RAMP_UP_TIME_0_MASK;
2402 if (orig != data)
2403 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
2404
2405 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
2406 data &= ~PLL_RAMP_UP_TIME_1_MASK;
2407 if (orig != data)
2408 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
2409
2410 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
2411 data &= ~PLL_RAMP_UP_TIME_2_MASK;
2412 if (orig != data)
2413 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
2414
2415 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
2416 data &= ~PLL_RAMP_UP_TIME_3_MASK;
2417 if (orig != data)
2418 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
2419
2420 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
2421 data &= ~PLL_RAMP_UP_TIME_0_MASK;
2422 if (orig != data)
2423 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
2424
2425 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
2426 data &= ~PLL_RAMP_UP_TIME_1_MASK;
2427 if (orig != data)
2428 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
2429
2430 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
2431 data &= ~PLL_RAMP_UP_TIME_2_MASK;
2432 if (orig != data)
2433 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
2434
2435 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
2436 data &= ~PLL_RAMP_UP_TIME_3_MASK;
2437 if (orig != data)
2438 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
2439 }
36b9a952 2440 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
62a37553
KW
2441 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
2442 data |= LC_DYN_LANES_PWR_STATE(3);
2443 if (orig != data)
36b9a952 2444 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
62a37553
KW
2445
2446 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
2447 data &= ~LS2_EXIT_TIME_MASK;
77efe48a 2448 if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
62a37553
KW
2449 data |= LS2_EXIT_TIME(5);
2450 if (orig != data)
2451 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
2452
2453 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
2454 data &= ~LS2_EXIT_TIME_MASK;
77efe48a 2455 if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
62a37553
KW
2456 data |= LS2_EXIT_TIME(5);
2457 if (orig != data)
2458 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
2459
2460 if (!disable_clkreq &&
2461 !pci_is_root_bus(adev->pdev->bus)) {
2462 struct pci_dev *root = adev->pdev->bus->self;
2463 u32 lnkcap;
2464
2465 clk_req_support = false;
2466 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
2467 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
2468 clk_req_support = true;
2469 } else {
2470 clk_req_support = false;
2471 }
2472
2473 if (clk_req_support) {
36b9a952 2474 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
62a37553
KW
2475 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
2476 if (orig != data)
36b9a952 2477 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
62a37553
KW
2478
2479 orig = data = RREG32(THM_CLK_CNTL);
2480 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
2481 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
2482 if (orig != data)
2483 WREG32(THM_CLK_CNTL, data);
2484
2485 orig = data = RREG32(MISC_CLK_CNTL);
2486 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
2487 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
2488 if (orig != data)
2489 WREG32(MISC_CLK_CNTL, data);
2490
2491 orig = data = RREG32(CG_CLKPIN_CNTL);
2492 data &= ~BCLK_AS_XCLK;
2493 if (orig != data)
2494 WREG32(CG_CLKPIN_CNTL, data);
2495
2496 orig = data = RREG32(CG_CLKPIN_CNTL_2);
2497 data &= ~FORCE_BIF_REFCLK_EN;
2498 if (orig != data)
2499 WREG32(CG_CLKPIN_CNTL_2, data);
2500
2501 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
2502 data &= ~MPLL_CLKOUT_SEL_MASK;
2503 data |= MPLL_CLKOUT_SEL(4);
2504 if (orig != data)
2505 WREG32(MPLL_BYPASSCLK_SEL, data);
2506
2507 orig = data = RREG32(SPLL_CNTL_MODE);
2508 data &= ~SPLL_REFCLK_SEL_MASK;
2509 if (orig != data)
2510 WREG32(SPLL_CNTL_MODE, data);
2511 }
2512 }
2513 } else {
2514 if (orig != data)
36b9a952 2515 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
62a37553
KW
2516 }
2517
2518 orig = data = RREG32_PCIE(PCIE_CNTL2);
2519 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
2520 if (orig != data)
2521 WREG32_PCIE(PCIE_CNTL2, data);
2522
2523 if (!disable_l0s) {
36b9a952 2524 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
62a37553
KW
2525 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
2526 data = RREG32_PCIE(PCIE_LC_STATUS1);
2527 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
36b9a952 2528 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
62a37553
KW
2529 data &= ~LC_L0S_INACTIVITY_MASK;
2530 if (orig != data)
36b9a952 2531 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
62a37553
KW
2532 }
2533 }
2534 }
2535}
2536
2537static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
2538{
2539 int readrq;
2540 u16 v;
2541
2542 readrq = pcie_get_readrq(adev->pdev);
2543 v = ffs(readrq) - 8;
2544 if ((v == 0) || (v == 6) || (v == 7))
2545 pcie_set_readrq(adev->pdev, 512);
2546}
2547
2548static int si_common_hw_init(void *handle)
2549{
2550 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2551
2552 si_fix_pci_max_read_req_size(adev);
2553 si_init_golden_registers(adev);
2554 si_pcie_gen3_enable(adev);
2555 si_program_aspm(adev);
2556
2557 return 0;
2558}
2559
2560static int si_common_hw_fini(void *handle)
2561{
2562 return 0;
2563}
2564
2565static int si_common_suspend(void *handle)
2566{
2567 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2568
2569 return si_common_hw_fini(adev);
2570}
2571
2572static int si_common_resume(void *handle)
2573{
2574 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2575
2576 return si_common_hw_init(adev);
2577}
2578
2579static bool si_common_is_idle(void *handle)
2580{
2581 return true;
2582}
2583
2584static int si_common_wait_for_idle(void *handle)
2585{
2586 return 0;
2587}
2588
2589static int si_common_soft_reset(void *handle)
2590{
2591 return 0;
2592}
2593
2594static int si_common_set_clockgating_state(void *handle,
2595 enum amd_clockgating_state state)
2596{
2597 return 0;
2598}
2599
2600static int si_common_set_powergating_state(void *handle,
2601 enum amd_powergating_state state)
2602{
2603 return 0;
2604}
2605
a1255107 2606static const struct amd_ip_funcs si_common_ip_funcs = {
62a37553
KW
2607 .name = "si_common",
2608 .early_init = si_common_early_init,
2609 .late_init = NULL,
2610 .sw_init = si_common_sw_init,
2611 .sw_fini = si_common_sw_fini,
2612 .hw_init = si_common_hw_init,
2613 .hw_fini = si_common_hw_fini,
2614 .suspend = si_common_suspend,
2615 .resume = si_common_resume,
2616 .is_idle = si_common_is_idle,
2617 .wait_for_idle = si_common_wait_for_idle,
2618 .soft_reset = si_common_soft_reset,
2619 .set_clockgating_state = si_common_set_clockgating_state,
2620 .set_powergating_state = si_common_set_powergating_state,
2621};
2622
a1255107 2623static const struct amdgpu_ip_block_version si_common_ip_block =
62a37553 2624{
a1255107
AD
2625 .type = AMD_IP_BLOCK_TYPE_COMMON,
2626 .major = 1,
2627 .minor = 0,
2628 .rev = 0,
2629 .funcs = &si_common_ip_funcs,
2120df47
AD
2630};
2631
62a37553
KW
2632int si_set_ip_blocks(struct amdgpu_device *adev)
2633{
2634 switch (adev->asic_type) {
2635 case CHIP_VERDE:
2636 case CHIP_TAHITI:
2637 case CHIP_PITCAIRN:
2990a1fc
AD
2638 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2639 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2640 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
3089aa22
RZ
2641 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2642 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
b905090d 2643 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
a1255107 2644 if (adev->enable_virtual_display)
2990a1fc 2645 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
64200c46
MR
2646#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2647 else if (amdgpu_device_has_dc_support(adev))
2648 amdgpu_device_ip_block_add(adev, &dm_ip_block);
2649#endif
a1255107 2650 else
2990a1fc 2651 amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
ee2e74f7 2652 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2990a1fc 2653 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
a1255107 2654 break;
62a37553 2655 case CHIP_OLAND:
2990a1fc
AD
2656 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2657 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2658 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
3089aa22
RZ
2659 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2660 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
b905090d 2661 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
a1255107 2662 if (adev->enable_virtual_display)
2990a1fc 2663 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
64200c46
MR
2664#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
2665 else if (amdgpu_device_has_dc_support(adev))
2666 amdgpu_device_ip_block_add(adev, &dm_ip_block);
2667#endif
a1255107 2668 else
2990a1fc 2669 amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
d375615c 2670 amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
2990a1fc 2671 /* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
62a37553
KW
2672 break;
2673 case CHIP_HAINAN:
2990a1fc
AD
2674 amdgpu_device_ip_block_add(adev, &si_common_ip_block);
2675 amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
2676 amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
3089aa22
RZ
2677 amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
2678 amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
b905090d 2679 amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
a1255107 2680 if (adev->enable_virtual_display)
2990a1fc 2681 amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
62a37553
KW
2682 break;
2683 default:
2684 BUG();
2685 }
2686 return 0;
2687}
2688