xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c (revision 00c5a72cc0dc2869b6fc26af10a952c47809cc9d)
1*00c5a72cSmrg /*	$NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $	*/
2e144ff40Sriastradh 
3e144ff40Sriastradh /*
4e144ff40Sriastradh  * Copyright 2012 Advanced Micro Devices, Inc.
5e144ff40Sriastradh  *
6e144ff40Sriastradh  * Permission is hereby granted, free of charge, to any person obtaining a
7e144ff40Sriastradh  * copy of this software and associated documentation files (the "Software"),
8e144ff40Sriastradh  * to deal in the Software without restriction, including without limitation
9e144ff40Sriastradh  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10e144ff40Sriastradh  * and/or sell copies of the Software, and to permit persons to whom the
11e144ff40Sriastradh  * Software is furnished to do so, subject to the following conditions:
12e144ff40Sriastradh  *
13e144ff40Sriastradh  * The above copyright notice and this permission notice shall be included in
14e144ff40Sriastradh  * all copies or substantial portions of the Software.
15e144ff40Sriastradh  *
16e144ff40Sriastradh  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17e144ff40Sriastradh  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18e144ff40Sriastradh  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19e144ff40Sriastradh  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20e144ff40Sriastradh  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21e144ff40Sriastradh  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22e144ff40Sriastradh  * OTHER DEALINGS IN THE SOFTWARE.
23e144ff40Sriastradh  *
24e144ff40Sriastradh  * Authors: Alex Deucher
25e144ff40Sriastradh  */
26e144ff40Sriastradh #include <sys/cdefs.h>
27*00c5a72cSmrg __KERNEL_RCSID(0, "$NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $");
28e144ff40Sriastradh 
29e144ff40Sriastradh #include <linux/firmware.h>
30e144ff40Sriastradh #include <linux/slab.h>
31e144ff40Sriastradh #include <linux/module.h>
3241ec0267Sriastradh #include <linux/pci.h>
3341ec0267Sriastradh 
34e144ff40Sriastradh #include "amdgpu.h"
35e144ff40Sriastradh #include "amdgpu_atombios.h"
36e144ff40Sriastradh #include "amdgpu_ih.h"
37e144ff40Sriastradh #include "amdgpu_uvd.h"
38e144ff40Sriastradh #include "amdgpu_vce.h"
39e144ff40Sriastradh #include "cikd.h"
40e144ff40Sriastradh #include "atom.h"
4141ec0267Sriastradh #include "amd_pcie.h"
42e144ff40Sriastradh 
43e144ff40Sriastradh #include "cik.h"
44e144ff40Sriastradh #include "gmc_v7_0.h"
45e144ff40Sriastradh #include "cik_ih.h"
46e144ff40Sriastradh #include "dce_v8_0.h"
47e144ff40Sriastradh #include "gfx_v7_0.h"
48e144ff40Sriastradh #include "cik_sdma.h"
49e144ff40Sriastradh #include "uvd_v4_2.h"
50e144ff40Sriastradh #include "vce_v2_0.h"
51e144ff40Sriastradh #include "cik_dpm.h"
52e144ff40Sriastradh 
53e144ff40Sriastradh #include "uvd/uvd_4_2_d.h"
54e144ff40Sriastradh 
55e144ff40Sriastradh #include "smu/smu_7_0_1_d.h"
56e144ff40Sriastradh #include "smu/smu_7_0_1_sh_mask.h"
57e144ff40Sriastradh 
58e144ff40Sriastradh #include "dce/dce_8_0_d.h"
59e144ff40Sriastradh #include "dce/dce_8_0_sh_mask.h"
60e144ff40Sriastradh 
61e144ff40Sriastradh #include "bif/bif_4_1_d.h"
62e144ff40Sriastradh #include "bif/bif_4_1_sh_mask.h"
63e144ff40Sriastradh 
64e144ff40Sriastradh #include "gca/gfx_7_2_d.h"
65e144ff40Sriastradh #include "gca/gfx_7_2_enum.h"
66e144ff40Sriastradh #include "gca/gfx_7_2_sh_mask.h"
67e144ff40Sriastradh 
68e144ff40Sriastradh #include "gmc/gmc_7_1_d.h"
69e144ff40Sriastradh #include "gmc/gmc_7_1_sh_mask.h"
70e144ff40Sriastradh 
71e144ff40Sriastradh #include "oss/oss_2_0_d.h"
72e144ff40Sriastradh #include "oss/oss_2_0_sh_mask.h"
73e144ff40Sriastradh 
7441ec0267Sriastradh #include "amdgpu_dm.h"
75e144ff40Sriastradh #include "amdgpu_amdkfd.h"
7641ec0267Sriastradh #include "dce_virtual.h"
77e144ff40Sriastradh 
78e4a580baSriastradh #include <linux/nbsd-namespace.h>
79e4a580baSriastradh 
80e144ff40Sriastradh /*
81e144ff40Sriastradh  * Indirect registers accessor
82e144ff40Sriastradh  */
cik_pcie_rreg(struct amdgpu_device * adev,u32 reg)83e144ff40Sriastradh static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
84e144ff40Sriastradh {
85e144ff40Sriastradh 	unsigned long flags;
86e144ff40Sriastradh 	u32 r;
87e144ff40Sriastradh 
88e144ff40Sriastradh 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
89e144ff40Sriastradh 	WREG32(mmPCIE_INDEX, reg);
90e144ff40Sriastradh 	(void)RREG32(mmPCIE_INDEX);
91e144ff40Sriastradh 	r = RREG32(mmPCIE_DATA);
92e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
93e144ff40Sriastradh 	return r;
94e144ff40Sriastradh }
95e144ff40Sriastradh 
cik_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)96e144ff40Sriastradh static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
97e144ff40Sriastradh {
98e144ff40Sriastradh 	unsigned long flags;
99e144ff40Sriastradh 
100e144ff40Sriastradh 	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
101e144ff40Sriastradh 	WREG32(mmPCIE_INDEX, reg);
102e144ff40Sriastradh 	(void)RREG32(mmPCIE_INDEX);
103e144ff40Sriastradh 	WREG32(mmPCIE_DATA, v);
104e144ff40Sriastradh 	(void)RREG32(mmPCIE_DATA);
105e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
106e144ff40Sriastradh }
107e144ff40Sriastradh 
cik_smc_rreg(struct amdgpu_device * adev,u32 reg)108e144ff40Sriastradh static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
109e144ff40Sriastradh {
110e144ff40Sriastradh 	unsigned long flags;
111e144ff40Sriastradh 	u32 r;
112e144ff40Sriastradh 
113e144ff40Sriastradh 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
114e144ff40Sriastradh 	WREG32(mmSMC_IND_INDEX_0, (reg));
115e144ff40Sriastradh 	r = RREG32(mmSMC_IND_DATA_0);
116e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
117e144ff40Sriastradh 	return r;
118e144ff40Sriastradh }
119e144ff40Sriastradh 
cik_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)120e144ff40Sriastradh static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
121e144ff40Sriastradh {
122e144ff40Sriastradh 	unsigned long flags;
123e144ff40Sriastradh 
124e144ff40Sriastradh 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
125e144ff40Sriastradh 	WREG32(mmSMC_IND_INDEX_0, (reg));
126e144ff40Sriastradh 	WREG32(mmSMC_IND_DATA_0, (v));
127e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
128e144ff40Sriastradh }
129e144ff40Sriastradh 
cik_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)130e144ff40Sriastradh static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
131e144ff40Sriastradh {
132e144ff40Sriastradh 	unsigned long flags;
133e144ff40Sriastradh 	u32 r;
134e144ff40Sriastradh 
135e144ff40Sriastradh 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
136e144ff40Sriastradh 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
137e144ff40Sriastradh 	r = RREG32(mmUVD_CTX_DATA);
138e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
139e144ff40Sriastradh 	return r;
140e144ff40Sriastradh }
141e144ff40Sriastradh 
cik_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)142e144ff40Sriastradh static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
143e144ff40Sriastradh {
144e144ff40Sriastradh 	unsigned long flags;
145e144ff40Sriastradh 
146e144ff40Sriastradh 	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
147e144ff40Sriastradh 	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
148e144ff40Sriastradh 	WREG32(mmUVD_CTX_DATA, (v));
149e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
150e144ff40Sriastradh }
151e144ff40Sriastradh 
cik_didt_rreg(struct amdgpu_device * adev,u32 reg)152e144ff40Sriastradh static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
153e144ff40Sriastradh {
154e144ff40Sriastradh 	unsigned long flags;
155e144ff40Sriastradh 	u32 r;
156e144ff40Sriastradh 
157e144ff40Sriastradh 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
158e144ff40Sriastradh 	WREG32(mmDIDT_IND_INDEX, (reg));
159e144ff40Sriastradh 	r = RREG32(mmDIDT_IND_DATA);
160e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
161e144ff40Sriastradh 	return r;
162e144ff40Sriastradh }
163e144ff40Sriastradh 
cik_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)164e144ff40Sriastradh static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
165e144ff40Sriastradh {
166e144ff40Sriastradh 	unsigned long flags;
167e144ff40Sriastradh 
168e144ff40Sriastradh 	spin_lock_irqsave(&adev->didt_idx_lock, flags);
169e144ff40Sriastradh 	WREG32(mmDIDT_IND_INDEX, (reg));
170e144ff40Sriastradh 	WREG32(mmDIDT_IND_DATA, (v));
171e144ff40Sriastradh 	spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
172e144ff40Sriastradh }
173e144ff40Sriastradh 
174e144ff40Sriastradh static const u32 bonaire_golden_spm_registers[] =
175e144ff40Sriastradh {
176e144ff40Sriastradh 	0xc200, 0xe0ffffff, 0xe0000000
177e144ff40Sriastradh };
178e144ff40Sriastradh 
179e144ff40Sriastradh static const u32 bonaire_golden_common_registers[] =
180e144ff40Sriastradh {
181e144ff40Sriastradh 	0x31dc, 0xffffffff, 0x00000800,
182e144ff40Sriastradh 	0x31dd, 0xffffffff, 0x00000800,
183e144ff40Sriastradh 	0x31e6, 0xffffffff, 0x00007fbf,
184e144ff40Sriastradh 	0x31e7, 0xffffffff, 0x00007faf
185e144ff40Sriastradh };
186e144ff40Sriastradh 
187e144ff40Sriastradh static const u32 bonaire_golden_registers[] =
188e144ff40Sriastradh {
189e144ff40Sriastradh 	0xcd5, 0x00000333, 0x00000333,
190e144ff40Sriastradh 	0xcd4, 0x000c0fc0, 0x00040200,
191e144ff40Sriastradh 	0x2684, 0x00010000, 0x00058208,
192e144ff40Sriastradh 	0xf000, 0xffff1fff, 0x00140000,
193e144ff40Sriastradh 	0xf080, 0xfdfc0fff, 0x00000100,
194e144ff40Sriastradh 	0xf08d, 0x40000000, 0x40000200,
195e144ff40Sriastradh 	0x260c, 0xffffffff, 0x00000000,
196e144ff40Sriastradh 	0x260d, 0xf00fffff, 0x00000400,
197e144ff40Sriastradh 	0x260e, 0x0002021c, 0x00020200,
198e144ff40Sriastradh 	0x31e, 0x00000080, 0x00000000,
199e144ff40Sriastradh 	0x16ec, 0x000000f0, 0x00000070,
200e144ff40Sriastradh 	0x16f0, 0xf0311fff, 0x80300000,
201e144ff40Sriastradh 	0x263e, 0x73773777, 0x12010001,
202e144ff40Sriastradh 	0xd43, 0x00810000, 0x408af000,
203e144ff40Sriastradh 	0x1c0c, 0x31000111, 0x00000011,
204e144ff40Sriastradh 	0xbd2, 0x73773777, 0x12010001,
205e144ff40Sriastradh 	0x883, 0x00007fb6, 0x0021a1b1,
206e144ff40Sriastradh 	0x884, 0x00007fb6, 0x002021b1,
207e144ff40Sriastradh 	0x860, 0x00007fb6, 0x00002191,
208e144ff40Sriastradh 	0x886, 0x00007fb6, 0x002121b1,
209e144ff40Sriastradh 	0x887, 0x00007fb6, 0x002021b1,
210e144ff40Sriastradh 	0x877, 0x00007fb6, 0x00002191,
211e144ff40Sriastradh 	0x878, 0x00007fb6, 0x00002191,
212e144ff40Sriastradh 	0xd8a, 0x0000003f, 0x0000000a,
213e144ff40Sriastradh 	0xd8b, 0x0000003f, 0x0000000a,
214e144ff40Sriastradh 	0xab9, 0x00073ffe, 0x000022a2,
215e144ff40Sriastradh 	0x903, 0x000007ff, 0x00000000,
216e144ff40Sriastradh 	0x2285, 0xf000003f, 0x00000007,
217e144ff40Sriastradh 	0x22fc, 0x00002001, 0x00000001,
218e144ff40Sriastradh 	0x22c9, 0xffffffff, 0x00ffffff,
219e144ff40Sriastradh 	0xc281, 0x0000ff0f, 0x00000000,
220e144ff40Sriastradh 	0xa293, 0x07ffffff, 0x06000000,
221e144ff40Sriastradh 	0x136, 0x00000fff, 0x00000100,
222e144ff40Sriastradh 	0xf9e, 0x00000001, 0x00000002,
223e144ff40Sriastradh 	0x2440, 0x03000000, 0x0362c688,
224e144ff40Sriastradh 	0x2300, 0x000000ff, 0x00000001,
225e144ff40Sriastradh 	0x390, 0x00001fff, 0x00001fff,
226e144ff40Sriastradh 	0x2418, 0x0000007f, 0x00000020,
227e144ff40Sriastradh 	0x2542, 0x00010000, 0x00010000,
228e144ff40Sriastradh 	0x2b05, 0x000003ff, 0x000000f3,
229e144ff40Sriastradh 	0x2b03, 0xffffffff, 0x00001032
230e144ff40Sriastradh };
231e144ff40Sriastradh 
232e144ff40Sriastradh static const u32 bonaire_mgcg_cgcg_init[] =
233e144ff40Sriastradh {
234e144ff40Sriastradh 	0x3108, 0xffffffff, 0xfffffffc,
235e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
236e144ff40Sriastradh 	0xf0a8, 0xffffffff, 0x00000100,
237e144ff40Sriastradh 	0xf082, 0xffffffff, 0x00000100,
238e144ff40Sriastradh 	0xf0b0, 0xffffffff, 0xc0000100,
239e144ff40Sriastradh 	0xf0b2, 0xffffffff, 0xc0000100,
240e144ff40Sriastradh 	0xf0b1, 0xffffffff, 0xc0000100,
241e144ff40Sriastradh 	0x1579, 0xffffffff, 0x00600100,
242e144ff40Sriastradh 	0xf0a0, 0xffffffff, 0x00000100,
243e144ff40Sriastradh 	0xf085, 0xffffffff, 0x06000100,
244e144ff40Sriastradh 	0xf088, 0xffffffff, 0x00000100,
245e144ff40Sriastradh 	0xf086, 0xffffffff, 0x06000100,
246e144ff40Sriastradh 	0xf081, 0xffffffff, 0x00000100,
247e144ff40Sriastradh 	0xf0b8, 0xffffffff, 0x00000100,
248e144ff40Sriastradh 	0xf089, 0xffffffff, 0x00000100,
249e144ff40Sriastradh 	0xf080, 0xffffffff, 0x00000100,
250e144ff40Sriastradh 	0xf08c, 0xffffffff, 0x00000100,
251e144ff40Sriastradh 	0xf08d, 0xffffffff, 0x00000100,
252e144ff40Sriastradh 	0xf094, 0xffffffff, 0x00000100,
253e144ff40Sriastradh 	0xf095, 0xffffffff, 0x00000100,
254e144ff40Sriastradh 	0xf096, 0xffffffff, 0x00000100,
255e144ff40Sriastradh 	0xf097, 0xffffffff, 0x00000100,
256e144ff40Sriastradh 	0xf098, 0xffffffff, 0x00000100,
257e144ff40Sriastradh 	0xf09f, 0xffffffff, 0x00000100,
258e144ff40Sriastradh 	0xf09e, 0xffffffff, 0x00000100,
259e144ff40Sriastradh 	0xf084, 0xffffffff, 0x06000100,
260e144ff40Sriastradh 	0xf0a4, 0xffffffff, 0x00000100,
261e144ff40Sriastradh 	0xf09d, 0xffffffff, 0x00000100,
262e144ff40Sriastradh 	0xf0ad, 0xffffffff, 0x00000100,
263e144ff40Sriastradh 	0xf0ac, 0xffffffff, 0x00000100,
264e144ff40Sriastradh 	0xf09c, 0xffffffff, 0x00000100,
265e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
266e144ff40Sriastradh 	0xf008, 0xffffffff, 0x00010000,
267e144ff40Sriastradh 	0xf009, 0xffffffff, 0x00030002,
268e144ff40Sriastradh 	0xf00a, 0xffffffff, 0x00040007,
269e144ff40Sriastradh 	0xf00b, 0xffffffff, 0x00060005,
270e144ff40Sriastradh 	0xf00c, 0xffffffff, 0x00090008,
271e144ff40Sriastradh 	0xf00d, 0xffffffff, 0x00010000,
272e144ff40Sriastradh 	0xf00e, 0xffffffff, 0x00030002,
273e144ff40Sriastradh 	0xf00f, 0xffffffff, 0x00040007,
274e144ff40Sriastradh 	0xf010, 0xffffffff, 0x00060005,
275e144ff40Sriastradh 	0xf011, 0xffffffff, 0x00090008,
276e144ff40Sriastradh 	0xf012, 0xffffffff, 0x00010000,
277e144ff40Sriastradh 	0xf013, 0xffffffff, 0x00030002,
278e144ff40Sriastradh 	0xf014, 0xffffffff, 0x00040007,
279e144ff40Sriastradh 	0xf015, 0xffffffff, 0x00060005,
280e144ff40Sriastradh 	0xf016, 0xffffffff, 0x00090008,
281e144ff40Sriastradh 	0xf017, 0xffffffff, 0x00010000,
282e144ff40Sriastradh 	0xf018, 0xffffffff, 0x00030002,
283e144ff40Sriastradh 	0xf019, 0xffffffff, 0x00040007,
284e144ff40Sriastradh 	0xf01a, 0xffffffff, 0x00060005,
285e144ff40Sriastradh 	0xf01b, 0xffffffff, 0x00090008,
286e144ff40Sriastradh 	0xf01c, 0xffffffff, 0x00010000,
287e144ff40Sriastradh 	0xf01d, 0xffffffff, 0x00030002,
288e144ff40Sriastradh 	0xf01e, 0xffffffff, 0x00040007,
289e144ff40Sriastradh 	0xf01f, 0xffffffff, 0x00060005,
290e144ff40Sriastradh 	0xf020, 0xffffffff, 0x00090008,
291e144ff40Sriastradh 	0xf021, 0xffffffff, 0x00010000,
292e144ff40Sriastradh 	0xf022, 0xffffffff, 0x00030002,
293e144ff40Sriastradh 	0xf023, 0xffffffff, 0x00040007,
294e144ff40Sriastradh 	0xf024, 0xffffffff, 0x00060005,
295e144ff40Sriastradh 	0xf025, 0xffffffff, 0x00090008,
296e144ff40Sriastradh 	0xf026, 0xffffffff, 0x00010000,
297e144ff40Sriastradh 	0xf027, 0xffffffff, 0x00030002,
298e144ff40Sriastradh 	0xf028, 0xffffffff, 0x00040007,
299e144ff40Sriastradh 	0xf029, 0xffffffff, 0x00060005,
300e144ff40Sriastradh 	0xf02a, 0xffffffff, 0x00090008,
301e144ff40Sriastradh 	0xf000, 0xffffffff, 0x96e00200,
302e144ff40Sriastradh 	0x21c2, 0xffffffff, 0x00900100,
303e144ff40Sriastradh 	0x3109, 0xffffffff, 0x0020003f,
304e144ff40Sriastradh 	0xe, 0xffffffff, 0x0140001c,
305e144ff40Sriastradh 	0xf, 0x000f0000, 0x000f0000,
306e144ff40Sriastradh 	0x88, 0xffffffff, 0xc060000c,
307e144ff40Sriastradh 	0x89, 0xc0000fff, 0x00000100,
308e144ff40Sriastradh 	0x3e4, 0xffffffff, 0x00000100,
309e144ff40Sriastradh 	0x3e6, 0x00000101, 0x00000000,
310e144ff40Sriastradh 	0x82a, 0xffffffff, 0x00000104,
311e144ff40Sriastradh 	0x1579, 0xff000fff, 0x00000100,
312e144ff40Sriastradh 	0xc33, 0xc0000fff, 0x00000104,
313e144ff40Sriastradh 	0x3079, 0x00000001, 0x00000001,
314e144ff40Sriastradh 	0x3403, 0xff000ff0, 0x00000100,
315e144ff40Sriastradh 	0x3603, 0xff000ff0, 0x00000100
316e144ff40Sriastradh };
317e144ff40Sriastradh 
318e144ff40Sriastradh static const u32 spectre_golden_spm_registers[] =
319e144ff40Sriastradh {
320e144ff40Sriastradh 	0xc200, 0xe0ffffff, 0xe0000000
321e144ff40Sriastradh };
322e144ff40Sriastradh 
323e144ff40Sriastradh static const u32 spectre_golden_common_registers[] =
324e144ff40Sriastradh {
325e144ff40Sriastradh 	0x31dc, 0xffffffff, 0x00000800,
326e144ff40Sriastradh 	0x31dd, 0xffffffff, 0x00000800,
327e144ff40Sriastradh 	0x31e6, 0xffffffff, 0x00007fbf,
328e144ff40Sriastradh 	0x31e7, 0xffffffff, 0x00007faf
329e144ff40Sriastradh };
330e144ff40Sriastradh 
331e144ff40Sriastradh static const u32 spectre_golden_registers[] =
332e144ff40Sriastradh {
333e144ff40Sriastradh 	0xf000, 0xffff1fff, 0x96940200,
334e144ff40Sriastradh 	0xf003, 0xffff0001, 0xff000000,
335e144ff40Sriastradh 	0xf080, 0xfffc0fff, 0x00000100,
336e144ff40Sriastradh 	0x1bb6, 0x00010101, 0x00010000,
337e144ff40Sriastradh 	0x260d, 0xf00fffff, 0x00000400,
338e144ff40Sriastradh 	0x260e, 0xfffffffc, 0x00020200,
339e144ff40Sriastradh 	0x16ec, 0x000000f0, 0x00000070,
340e144ff40Sriastradh 	0x16f0, 0xf0311fff, 0x80300000,
341e144ff40Sriastradh 	0x263e, 0x73773777, 0x12010001,
342e144ff40Sriastradh 	0x26df, 0x00ff0000, 0x00fc0000,
343e144ff40Sriastradh 	0xbd2, 0x73773777, 0x12010001,
344e144ff40Sriastradh 	0x2285, 0xf000003f, 0x00000007,
345e144ff40Sriastradh 	0x22c9, 0xffffffff, 0x00ffffff,
346e144ff40Sriastradh 	0xa0d4, 0x3f3f3fff, 0x00000082,
347e144ff40Sriastradh 	0xa0d5, 0x0000003f, 0x00000000,
348e144ff40Sriastradh 	0xf9e, 0x00000001, 0x00000002,
349e144ff40Sriastradh 	0x244f, 0xffff03df, 0x00000004,
350e144ff40Sriastradh 	0x31da, 0x00000008, 0x00000008,
351e144ff40Sriastradh 	0x2300, 0x000008ff, 0x00000800,
352e144ff40Sriastradh 	0x2542, 0x00010000, 0x00010000,
353e144ff40Sriastradh 	0x2b03, 0xffffffff, 0x54763210,
354e144ff40Sriastradh 	0x853e, 0x01ff01ff, 0x00000002,
355e144ff40Sriastradh 	0x8526, 0x007ff800, 0x00200000,
356e144ff40Sriastradh 	0x8057, 0xffffffff, 0x00000f40,
357e144ff40Sriastradh 	0xc24d, 0xffffffff, 0x00000001
358e144ff40Sriastradh };
359e144ff40Sriastradh 
360e144ff40Sriastradh static const u32 spectre_mgcg_cgcg_init[] =
361e144ff40Sriastradh {
362e144ff40Sriastradh 	0x3108, 0xffffffff, 0xfffffffc,
363e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
364e144ff40Sriastradh 	0xf0a8, 0xffffffff, 0x00000100,
365e144ff40Sriastradh 	0xf082, 0xffffffff, 0x00000100,
366e144ff40Sriastradh 	0xf0b0, 0xffffffff, 0x00000100,
367e144ff40Sriastradh 	0xf0b2, 0xffffffff, 0x00000100,
368e144ff40Sriastradh 	0xf0b1, 0xffffffff, 0x00000100,
369e144ff40Sriastradh 	0x1579, 0xffffffff, 0x00600100,
370e144ff40Sriastradh 	0xf0a0, 0xffffffff, 0x00000100,
371e144ff40Sriastradh 	0xf085, 0xffffffff, 0x06000100,
372e144ff40Sriastradh 	0xf088, 0xffffffff, 0x00000100,
373e144ff40Sriastradh 	0xf086, 0xffffffff, 0x06000100,
374e144ff40Sriastradh 	0xf081, 0xffffffff, 0x00000100,
375e144ff40Sriastradh 	0xf0b8, 0xffffffff, 0x00000100,
376e144ff40Sriastradh 	0xf089, 0xffffffff, 0x00000100,
377e144ff40Sriastradh 	0xf080, 0xffffffff, 0x00000100,
378e144ff40Sriastradh 	0xf08c, 0xffffffff, 0x00000100,
379e144ff40Sriastradh 	0xf08d, 0xffffffff, 0x00000100,
380e144ff40Sriastradh 	0xf094, 0xffffffff, 0x00000100,
381e144ff40Sriastradh 	0xf095, 0xffffffff, 0x00000100,
382e144ff40Sriastradh 	0xf096, 0xffffffff, 0x00000100,
383e144ff40Sriastradh 	0xf097, 0xffffffff, 0x00000100,
384e144ff40Sriastradh 	0xf098, 0xffffffff, 0x00000100,
385e144ff40Sriastradh 	0xf09f, 0xffffffff, 0x00000100,
386e144ff40Sriastradh 	0xf09e, 0xffffffff, 0x00000100,
387e144ff40Sriastradh 	0xf084, 0xffffffff, 0x06000100,
388e144ff40Sriastradh 	0xf0a4, 0xffffffff, 0x00000100,
389e144ff40Sriastradh 	0xf09d, 0xffffffff, 0x00000100,
390e144ff40Sriastradh 	0xf0ad, 0xffffffff, 0x00000100,
391e144ff40Sriastradh 	0xf0ac, 0xffffffff, 0x00000100,
392e144ff40Sriastradh 	0xf09c, 0xffffffff, 0x00000100,
393e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
394e144ff40Sriastradh 	0xf008, 0xffffffff, 0x00010000,
395e144ff40Sriastradh 	0xf009, 0xffffffff, 0x00030002,
396e144ff40Sriastradh 	0xf00a, 0xffffffff, 0x00040007,
397e144ff40Sriastradh 	0xf00b, 0xffffffff, 0x00060005,
398e144ff40Sriastradh 	0xf00c, 0xffffffff, 0x00090008,
399e144ff40Sriastradh 	0xf00d, 0xffffffff, 0x00010000,
400e144ff40Sriastradh 	0xf00e, 0xffffffff, 0x00030002,
401e144ff40Sriastradh 	0xf00f, 0xffffffff, 0x00040007,
402e144ff40Sriastradh 	0xf010, 0xffffffff, 0x00060005,
403e144ff40Sriastradh 	0xf011, 0xffffffff, 0x00090008,
404e144ff40Sriastradh 	0xf012, 0xffffffff, 0x00010000,
405e144ff40Sriastradh 	0xf013, 0xffffffff, 0x00030002,
406e144ff40Sriastradh 	0xf014, 0xffffffff, 0x00040007,
407e144ff40Sriastradh 	0xf015, 0xffffffff, 0x00060005,
408e144ff40Sriastradh 	0xf016, 0xffffffff, 0x00090008,
409e144ff40Sriastradh 	0xf017, 0xffffffff, 0x00010000,
410e144ff40Sriastradh 	0xf018, 0xffffffff, 0x00030002,
411e144ff40Sriastradh 	0xf019, 0xffffffff, 0x00040007,
412e144ff40Sriastradh 	0xf01a, 0xffffffff, 0x00060005,
413e144ff40Sriastradh 	0xf01b, 0xffffffff, 0x00090008,
414e144ff40Sriastradh 	0xf01c, 0xffffffff, 0x00010000,
415e144ff40Sriastradh 	0xf01d, 0xffffffff, 0x00030002,
416e144ff40Sriastradh 	0xf01e, 0xffffffff, 0x00040007,
417e144ff40Sriastradh 	0xf01f, 0xffffffff, 0x00060005,
418e144ff40Sriastradh 	0xf020, 0xffffffff, 0x00090008,
419e144ff40Sriastradh 	0xf021, 0xffffffff, 0x00010000,
420e144ff40Sriastradh 	0xf022, 0xffffffff, 0x00030002,
421e144ff40Sriastradh 	0xf023, 0xffffffff, 0x00040007,
422e144ff40Sriastradh 	0xf024, 0xffffffff, 0x00060005,
423e144ff40Sriastradh 	0xf025, 0xffffffff, 0x00090008,
424e144ff40Sriastradh 	0xf026, 0xffffffff, 0x00010000,
425e144ff40Sriastradh 	0xf027, 0xffffffff, 0x00030002,
426e144ff40Sriastradh 	0xf028, 0xffffffff, 0x00040007,
427e144ff40Sriastradh 	0xf029, 0xffffffff, 0x00060005,
428e144ff40Sriastradh 	0xf02a, 0xffffffff, 0x00090008,
429e144ff40Sriastradh 	0xf02b, 0xffffffff, 0x00010000,
430e144ff40Sriastradh 	0xf02c, 0xffffffff, 0x00030002,
431e144ff40Sriastradh 	0xf02d, 0xffffffff, 0x00040007,
432e144ff40Sriastradh 	0xf02e, 0xffffffff, 0x00060005,
433e144ff40Sriastradh 	0xf02f, 0xffffffff, 0x00090008,
434e144ff40Sriastradh 	0xf000, 0xffffffff, 0x96e00200,
435e144ff40Sriastradh 	0x21c2, 0xffffffff, 0x00900100,
436e144ff40Sriastradh 	0x3109, 0xffffffff, 0x0020003f,
437e144ff40Sriastradh 	0xe, 0xffffffff, 0x0140001c,
438e144ff40Sriastradh 	0xf, 0x000f0000, 0x000f0000,
439e144ff40Sriastradh 	0x88, 0xffffffff, 0xc060000c,
440e144ff40Sriastradh 	0x89, 0xc0000fff, 0x00000100,
441e144ff40Sriastradh 	0x3e4, 0xffffffff, 0x00000100,
442e144ff40Sriastradh 	0x3e6, 0x00000101, 0x00000000,
443e144ff40Sriastradh 	0x82a, 0xffffffff, 0x00000104,
444e144ff40Sriastradh 	0x1579, 0xff000fff, 0x00000100,
445e144ff40Sriastradh 	0xc33, 0xc0000fff, 0x00000104,
446e144ff40Sriastradh 	0x3079, 0x00000001, 0x00000001,
447e144ff40Sriastradh 	0x3403, 0xff000ff0, 0x00000100,
448e144ff40Sriastradh 	0x3603, 0xff000ff0, 0x00000100
449e144ff40Sriastradh };
450e144ff40Sriastradh 
451e144ff40Sriastradh static const u32 kalindi_golden_spm_registers[] =
452e144ff40Sriastradh {
453e144ff40Sriastradh 	0xc200, 0xe0ffffff, 0xe0000000
454e144ff40Sriastradh };
455e144ff40Sriastradh 
456e144ff40Sriastradh static const u32 kalindi_golden_common_registers[] =
457e144ff40Sriastradh {
458e144ff40Sriastradh 	0x31dc, 0xffffffff, 0x00000800,
459e144ff40Sriastradh 	0x31dd, 0xffffffff, 0x00000800,
460e144ff40Sriastradh 	0x31e6, 0xffffffff, 0x00007fbf,
461e144ff40Sriastradh 	0x31e7, 0xffffffff, 0x00007faf
462e144ff40Sriastradh };
463e144ff40Sriastradh 
464e144ff40Sriastradh static const u32 kalindi_golden_registers[] =
465e144ff40Sriastradh {
466e144ff40Sriastradh 	0xf000, 0xffffdfff, 0x6e944040,
467e144ff40Sriastradh 	0x1579, 0xff607fff, 0xfc000100,
468e144ff40Sriastradh 	0xf088, 0xff000fff, 0x00000100,
469e144ff40Sriastradh 	0xf089, 0xff000fff, 0x00000100,
470e144ff40Sriastradh 	0xf080, 0xfffc0fff, 0x00000100,
471e144ff40Sriastradh 	0x1bb6, 0x00010101, 0x00010000,
472e144ff40Sriastradh 	0x260c, 0xffffffff, 0x00000000,
473e144ff40Sriastradh 	0x260d, 0xf00fffff, 0x00000400,
474e144ff40Sriastradh 	0x16ec, 0x000000f0, 0x00000070,
475e144ff40Sriastradh 	0x16f0, 0xf0311fff, 0x80300000,
476e144ff40Sriastradh 	0x263e, 0x73773777, 0x12010001,
477e144ff40Sriastradh 	0x263f, 0xffffffff, 0x00000010,
478e144ff40Sriastradh 	0x26df, 0x00ff0000, 0x00fc0000,
479e144ff40Sriastradh 	0x200c, 0x00001f0f, 0x0000100a,
480e144ff40Sriastradh 	0xbd2, 0x73773777, 0x12010001,
481e144ff40Sriastradh 	0x902, 0x000fffff, 0x000c007f,
482e144ff40Sriastradh 	0x2285, 0xf000003f, 0x00000007,
483e144ff40Sriastradh 	0x22c9, 0x3fff3fff, 0x00ffcfff,
484e144ff40Sriastradh 	0xc281, 0x0000ff0f, 0x00000000,
485e144ff40Sriastradh 	0xa293, 0x07ffffff, 0x06000000,
486e144ff40Sriastradh 	0x136, 0x00000fff, 0x00000100,
487e144ff40Sriastradh 	0xf9e, 0x00000001, 0x00000002,
488e144ff40Sriastradh 	0x31da, 0x00000008, 0x00000008,
489e144ff40Sriastradh 	0x2300, 0x000000ff, 0x00000003,
490e144ff40Sriastradh 	0x853e, 0x01ff01ff, 0x00000002,
491e144ff40Sriastradh 	0x8526, 0x007ff800, 0x00200000,
492e144ff40Sriastradh 	0x8057, 0xffffffff, 0x00000f40,
493e144ff40Sriastradh 	0x2231, 0x001f3ae3, 0x00000082,
494e144ff40Sriastradh 	0x2235, 0x0000001f, 0x00000010,
495e144ff40Sriastradh 	0xc24d, 0xffffffff, 0x00000000
496e144ff40Sriastradh };
497e144ff40Sriastradh 
498e144ff40Sriastradh static const u32 kalindi_mgcg_cgcg_init[] =
499e144ff40Sriastradh {
500e144ff40Sriastradh 	0x3108, 0xffffffff, 0xfffffffc,
501e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
502e144ff40Sriastradh 	0xf0a8, 0xffffffff, 0x00000100,
503e144ff40Sriastradh 	0xf082, 0xffffffff, 0x00000100,
504e144ff40Sriastradh 	0xf0b0, 0xffffffff, 0x00000100,
505e144ff40Sriastradh 	0xf0b2, 0xffffffff, 0x00000100,
506e144ff40Sriastradh 	0xf0b1, 0xffffffff, 0x00000100,
507e144ff40Sriastradh 	0x1579, 0xffffffff, 0x00600100,
508e144ff40Sriastradh 	0xf0a0, 0xffffffff, 0x00000100,
509e144ff40Sriastradh 	0xf085, 0xffffffff, 0x06000100,
510e144ff40Sriastradh 	0xf088, 0xffffffff, 0x00000100,
511e144ff40Sriastradh 	0xf086, 0xffffffff, 0x06000100,
512e144ff40Sriastradh 	0xf081, 0xffffffff, 0x00000100,
513e144ff40Sriastradh 	0xf0b8, 0xffffffff, 0x00000100,
514e144ff40Sriastradh 	0xf089, 0xffffffff, 0x00000100,
515e144ff40Sriastradh 	0xf080, 0xffffffff, 0x00000100,
516e144ff40Sriastradh 	0xf08c, 0xffffffff, 0x00000100,
517e144ff40Sriastradh 	0xf08d, 0xffffffff, 0x00000100,
518e144ff40Sriastradh 	0xf094, 0xffffffff, 0x00000100,
519e144ff40Sriastradh 	0xf095, 0xffffffff, 0x00000100,
520e144ff40Sriastradh 	0xf096, 0xffffffff, 0x00000100,
521e144ff40Sriastradh 	0xf097, 0xffffffff, 0x00000100,
522e144ff40Sriastradh 	0xf098, 0xffffffff, 0x00000100,
523e144ff40Sriastradh 	0xf09f, 0xffffffff, 0x00000100,
524e144ff40Sriastradh 	0xf09e, 0xffffffff, 0x00000100,
525e144ff40Sriastradh 	0xf084, 0xffffffff, 0x06000100,
526e144ff40Sriastradh 	0xf0a4, 0xffffffff, 0x00000100,
527e144ff40Sriastradh 	0xf09d, 0xffffffff, 0x00000100,
528e144ff40Sriastradh 	0xf0ad, 0xffffffff, 0x00000100,
529e144ff40Sriastradh 	0xf0ac, 0xffffffff, 0x00000100,
530e144ff40Sriastradh 	0xf09c, 0xffffffff, 0x00000100,
531e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
532e144ff40Sriastradh 	0xf008, 0xffffffff, 0x00010000,
533e144ff40Sriastradh 	0xf009, 0xffffffff, 0x00030002,
534e144ff40Sriastradh 	0xf00a, 0xffffffff, 0x00040007,
535e144ff40Sriastradh 	0xf00b, 0xffffffff, 0x00060005,
536e144ff40Sriastradh 	0xf00c, 0xffffffff, 0x00090008,
537e144ff40Sriastradh 	0xf00d, 0xffffffff, 0x00010000,
538e144ff40Sriastradh 	0xf00e, 0xffffffff, 0x00030002,
539e144ff40Sriastradh 	0xf00f, 0xffffffff, 0x00040007,
540e144ff40Sriastradh 	0xf010, 0xffffffff, 0x00060005,
541e144ff40Sriastradh 	0xf011, 0xffffffff, 0x00090008,
542e144ff40Sriastradh 	0xf000, 0xffffffff, 0x96e00200,
543e144ff40Sriastradh 	0x21c2, 0xffffffff, 0x00900100,
544e144ff40Sriastradh 	0x3109, 0xffffffff, 0x0020003f,
545e144ff40Sriastradh 	0xe, 0xffffffff, 0x0140001c,
546e144ff40Sriastradh 	0xf, 0x000f0000, 0x000f0000,
547e144ff40Sriastradh 	0x88, 0xffffffff, 0xc060000c,
548e144ff40Sriastradh 	0x89, 0xc0000fff, 0x00000100,
549e144ff40Sriastradh 	0x82a, 0xffffffff, 0x00000104,
550e144ff40Sriastradh 	0x1579, 0xff000fff, 0x00000100,
551e144ff40Sriastradh 	0xc33, 0xc0000fff, 0x00000104,
552e144ff40Sriastradh 	0x3079, 0x00000001, 0x00000001,
553e144ff40Sriastradh 	0x3403, 0xff000ff0, 0x00000100,
554e144ff40Sriastradh 	0x3603, 0xff000ff0, 0x00000100
555e144ff40Sriastradh };
556e144ff40Sriastradh 
557e144ff40Sriastradh static const u32 hawaii_golden_spm_registers[] =
558e144ff40Sriastradh {
559e144ff40Sriastradh 	0xc200, 0xe0ffffff, 0xe0000000
560e144ff40Sriastradh };
561e144ff40Sriastradh 
562e144ff40Sriastradh static const u32 hawaii_golden_common_registers[] =
563e144ff40Sriastradh {
564e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
565e144ff40Sriastradh 	0xa0d4, 0xffffffff, 0x3a00161a,
566e144ff40Sriastradh 	0xa0d5, 0xffffffff, 0x0000002e,
567e144ff40Sriastradh 	0x2684, 0xffffffff, 0x00018208,
568e144ff40Sriastradh 	0x263e, 0xffffffff, 0x12011003
569e144ff40Sriastradh };
570e144ff40Sriastradh 
571e144ff40Sriastradh static const u32 hawaii_golden_registers[] =
572e144ff40Sriastradh {
573e144ff40Sriastradh 	0xcd5, 0x00000333, 0x00000333,
574e144ff40Sriastradh 	0x2684, 0x00010000, 0x00058208,
575e144ff40Sriastradh 	0x260c, 0xffffffff, 0x00000000,
576e144ff40Sriastradh 	0x260d, 0xf00fffff, 0x00000400,
577e144ff40Sriastradh 	0x260e, 0x0002021c, 0x00020200,
578e144ff40Sriastradh 	0x31e, 0x00000080, 0x00000000,
579e144ff40Sriastradh 	0x16ec, 0x000000f0, 0x00000070,
580e144ff40Sriastradh 	0x16f0, 0xf0311fff, 0x80300000,
581e144ff40Sriastradh 	0xd43, 0x00810000, 0x408af000,
582e144ff40Sriastradh 	0x1c0c, 0x31000111, 0x00000011,
583e144ff40Sriastradh 	0xbd2, 0x73773777, 0x12010001,
584e144ff40Sriastradh 	0x848, 0x0000007f, 0x0000001b,
585e144ff40Sriastradh 	0x877, 0x00007fb6, 0x00002191,
586e144ff40Sriastradh 	0xd8a, 0x0000003f, 0x0000000a,
587e144ff40Sriastradh 	0xd8b, 0x0000003f, 0x0000000a,
588e144ff40Sriastradh 	0xab9, 0x00073ffe, 0x000022a2,
589e144ff40Sriastradh 	0x903, 0x000007ff, 0x00000000,
590e144ff40Sriastradh 	0x22fc, 0x00002001, 0x00000001,
591e144ff40Sriastradh 	0x22c9, 0xffffffff, 0x00ffffff,
592e144ff40Sriastradh 	0xc281, 0x0000ff0f, 0x00000000,
593e144ff40Sriastradh 	0xa293, 0x07ffffff, 0x06000000,
594e144ff40Sriastradh 	0xf9e, 0x00000001, 0x00000002,
595e144ff40Sriastradh 	0x31da, 0x00000008, 0x00000008,
596e144ff40Sriastradh 	0x31dc, 0x00000f00, 0x00000800,
597e144ff40Sriastradh 	0x31dd, 0x00000f00, 0x00000800,
598e144ff40Sriastradh 	0x31e6, 0x00ffffff, 0x00ff7fbf,
599e144ff40Sriastradh 	0x31e7, 0x00ffffff, 0x00ff7faf,
600e144ff40Sriastradh 	0x2300, 0x000000ff, 0x00000800,
601e144ff40Sriastradh 	0x390, 0x00001fff, 0x00001fff,
602e144ff40Sriastradh 	0x2418, 0x0000007f, 0x00000020,
603e144ff40Sriastradh 	0x2542, 0x00010000, 0x00010000,
604e144ff40Sriastradh 	0x2b80, 0x00100000, 0x000ff07c,
605e144ff40Sriastradh 	0x2b05, 0x000003ff, 0x0000000f,
606e144ff40Sriastradh 	0x2b04, 0xffffffff, 0x7564fdec,
607e144ff40Sriastradh 	0x2b03, 0xffffffff, 0x3120b9a8,
608e144ff40Sriastradh 	0x2b02, 0x20000000, 0x0f9c0000
609e144ff40Sriastradh };
610e144ff40Sriastradh 
611e144ff40Sriastradh static const u32 hawaii_mgcg_cgcg_init[] =
612e144ff40Sriastradh {
613e144ff40Sriastradh 	0x3108, 0xffffffff, 0xfffffffd,
614e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
615e144ff40Sriastradh 	0xf0a8, 0xffffffff, 0x00000100,
616e144ff40Sriastradh 	0xf082, 0xffffffff, 0x00000100,
617e144ff40Sriastradh 	0xf0b0, 0xffffffff, 0x00000100,
618e144ff40Sriastradh 	0xf0b2, 0xffffffff, 0x00000100,
619e144ff40Sriastradh 	0xf0b1, 0xffffffff, 0x00000100,
620e144ff40Sriastradh 	0x1579, 0xffffffff, 0x00200100,
621e144ff40Sriastradh 	0xf0a0, 0xffffffff, 0x00000100,
622e144ff40Sriastradh 	0xf085, 0xffffffff, 0x06000100,
623e144ff40Sriastradh 	0xf088, 0xffffffff, 0x00000100,
624e144ff40Sriastradh 	0xf086, 0xffffffff, 0x06000100,
625e144ff40Sriastradh 	0xf081, 0xffffffff, 0x00000100,
626e144ff40Sriastradh 	0xf0b8, 0xffffffff, 0x00000100,
627e144ff40Sriastradh 	0xf089, 0xffffffff, 0x00000100,
628e144ff40Sriastradh 	0xf080, 0xffffffff, 0x00000100,
629e144ff40Sriastradh 	0xf08c, 0xffffffff, 0x00000100,
630e144ff40Sriastradh 	0xf08d, 0xffffffff, 0x00000100,
631e144ff40Sriastradh 	0xf094, 0xffffffff, 0x00000100,
632e144ff40Sriastradh 	0xf095, 0xffffffff, 0x00000100,
633e144ff40Sriastradh 	0xf096, 0xffffffff, 0x00000100,
634e144ff40Sriastradh 	0xf097, 0xffffffff, 0x00000100,
635e144ff40Sriastradh 	0xf098, 0xffffffff, 0x00000100,
636e144ff40Sriastradh 	0xf09f, 0xffffffff, 0x00000100,
637e144ff40Sriastradh 	0xf09e, 0xffffffff, 0x00000100,
638e144ff40Sriastradh 	0xf084, 0xffffffff, 0x06000100,
639e144ff40Sriastradh 	0xf0a4, 0xffffffff, 0x00000100,
640e144ff40Sriastradh 	0xf09d, 0xffffffff, 0x00000100,
641e144ff40Sriastradh 	0xf0ad, 0xffffffff, 0x00000100,
642e144ff40Sriastradh 	0xf0ac, 0xffffffff, 0x00000100,
643e144ff40Sriastradh 	0xf09c, 0xffffffff, 0x00000100,
644e144ff40Sriastradh 	0xc200, 0xffffffff, 0xe0000000,
645e144ff40Sriastradh 	0xf008, 0xffffffff, 0x00010000,
646e144ff40Sriastradh 	0xf009, 0xffffffff, 0x00030002,
647e144ff40Sriastradh 	0xf00a, 0xffffffff, 0x00040007,
648e144ff40Sriastradh 	0xf00b, 0xffffffff, 0x00060005,
649e144ff40Sriastradh 	0xf00c, 0xffffffff, 0x00090008,
650e144ff40Sriastradh 	0xf00d, 0xffffffff, 0x00010000,
651e144ff40Sriastradh 	0xf00e, 0xffffffff, 0x00030002,
652e144ff40Sriastradh 	0xf00f, 0xffffffff, 0x00040007,
653e144ff40Sriastradh 	0xf010, 0xffffffff, 0x00060005,
654e144ff40Sriastradh 	0xf011, 0xffffffff, 0x00090008,
655e144ff40Sriastradh 	0xf012, 0xffffffff, 0x00010000,
656e144ff40Sriastradh 	0xf013, 0xffffffff, 0x00030002,
657e144ff40Sriastradh 	0xf014, 0xffffffff, 0x00040007,
658e144ff40Sriastradh 	0xf015, 0xffffffff, 0x00060005,
659e144ff40Sriastradh 	0xf016, 0xffffffff, 0x00090008,
660e144ff40Sriastradh 	0xf017, 0xffffffff, 0x00010000,
661e144ff40Sriastradh 	0xf018, 0xffffffff, 0x00030002,
662e144ff40Sriastradh 	0xf019, 0xffffffff, 0x00040007,
663e144ff40Sriastradh 	0xf01a, 0xffffffff, 0x00060005,
664e144ff40Sriastradh 	0xf01b, 0xffffffff, 0x00090008,
665e144ff40Sriastradh 	0xf01c, 0xffffffff, 0x00010000,
666e144ff40Sriastradh 	0xf01d, 0xffffffff, 0x00030002,
667e144ff40Sriastradh 	0xf01e, 0xffffffff, 0x00040007,
668e144ff40Sriastradh 	0xf01f, 0xffffffff, 0x00060005,
669e144ff40Sriastradh 	0xf020, 0xffffffff, 0x00090008,
670e144ff40Sriastradh 	0xf021, 0xffffffff, 0x00010000,
671e144ff40Sriastradh 	0xf022, 0xffffffff, 0x00030002,
672e144ff40Sriastradh 	0xf023, 0xffffffff, 0x00040007,
673e144ff40Sriastradh 	0xf024, 0xffffffff, 0x00060005,
674e144ff40Sriastradh 	0xf025, 0xffffffff, 0x00090008,
675e144ff40Sriastradh 	0xf026, 0xffffffff, 0x00010000,
676e144ff40Sriastradh 	0xf027, 0xffffffff, 0x00030002,
677e144ff40Sriastradh 	0xf028, 0xffffffff, 0x00040007,
678e144ff40Sriastradh 	0xf029, 0xffffffff, 0x00060005,
679e144ff40Sriastradh 	0xf02a, 0xffffffff, 0x00090008,
680e144ff40Sriastradh 	0xf02b, 0xffffffff, 0x00010000,
681e144ff40Sriastradh 	0xf02c, 0xffffffff, 0x00030002,
682e144ff40Sriastradh 	0xf02d, 0xffffffff, 0x00040007,
683e144ff40Sriastradh 	0xf02e, 0xffffffff, 0x00060005,
684e144ff40Sriastradh 	0xf02f, 0xffffffff, 0x00090008,
685e144ff40Sriastradh 	0xf030, 0xffffffff, 0x00010000,
686e144ff40Sriastradh 	0xf031, 0xffffffff, 0x00030002,
687e144ff40Sriastradh 	0xf032, 0xffffffff, 0x00040007,
688e144ff40Sriastradh 	0xf033, 0xffffffff, 0x00060005,
689e144ff40Sriastradh 	0xf034, 0xffffffff, 0x00090008,
690e144ff40Sriastradh 	0xf035, 0xffffffff, 0x00010000,
691e144ff40Sriastradh 	0xf036, 0xffffffff, 0x00030002,
692e144ff40Sriastradh 	0xf037, 0xffffffff, 0x00040007,
693e144ff40Sriastradh 	0xf038, 0xffffffff, 0x00060005,
694e144ff40Sriastradh 	0xf039, 0xffffffff, 0x00090008,
695e144ff40Sriastradh 	0xf03a, 0xffffffff, 0x00010000,
696e144ff40Sriastradh 	0xf03b, 0xffffffff, 0x00030002,
697e144ff40Sriastradh 	0xf03c, 0xffffffff, 0x00040007,
698e144ff40Sriastradh 	0xf03d, 0xffffffff, 0x00060005,
699e144ff40Sriastradh 	0xf03e, 0xffffffff, 0x00090008,
700e144ff40Sriastradh 	0x30c6, 0xffffffff, 0x00020200,
701e144ff40Sriastradh 	0xcd4, 0xffffffff, 0x00000200,
702e144ff40Sriastradh 	0x570, 0xffffffff, 0x00000400,
703e144ff40Sriastradh 	0x157a, 0xffffffff, 0x00000000,
704e144ff40Sriastradh 	0xbd4, 0xffffffff, 0x00000902,
705e144ff40Sriastradh 	0xf000, 0xffffffff, 0x96940200,
706e144ff40Sriastradh 	0x21c2, 0xffffffff, 0x00900100,
707e144ff40Sriastradh 	0x3109, 0xffffffff, 0x0020003f,
708e144ff40Sriastradh 	0xe, 0xffffffff, 0x0140001c,
709e144ff40Sriastradh 	0xf, 0x000f0000, 0x000f0000,
710e144ff40Sriastradh 	0x88, 0xffffffff, 0xc060000c,
711e144ff40Sriastradh 	0x89, 0xc0000fff, 0x00000100,
712e144ff40Sriastradh 	0x3e4, 0xffffffff, 0x00000100,
713e144ff40Sriastradh 	0x3e6, 0x00000101, 0x00000000,
714e144ff40Sriastradh 	0x82a, 0xffffffff, 0x00000104,
715e144ff40Sriastradh 	0x1579, 0xff000fff, 0x00000100,
716e144ff40Sriastradh 	0xc33, 0xc0000fff, 0x00000104,
717e144ff40Sriastradh 	0x3079, 0x00000001, 0x00000001,
718e144ff40Sriastradh 	0x3403, 0xff000ff0, 0x00000100,
719e144ff40Sriastradh 	0x3603, 0xff000ff0, 0x00000100
720e144ff40Sriastradh };
721e144ff40Sriastradh 
722e144ff40Sriastradh static const u32 godavari_golden_registers[] =
723e144ff40Sriastradh {
724e144ff40Sriastradh 	0x1579, 0xff607fff, 0xfc000100,
725e144ff40Sriastradh 	0x1bb6, 0x00010101, 0x00010000,
726e144ff40Sriastradh 	0x260c, 0xffffffff, 0x00000000,
727e144ff40Sriastradh 	0x260c0, 0xf00fffff, 0x00000400,
728e144ff40Sriastradh 	0x184c, 0xffffffff, 0x00010000,
729e144ff40Sriastradh 	0x16ec, 0x000000f0, 0x00000070,
730e144ff40Sriastradh 	0x16f0, 0xf0311fff, 0x80300000,
731e144ff40Sriastradh 	0x263e, 0x73773777, 0x12010001,
732e144ff40Sriastradh 	0x263f, 0xffffffff, 0x00000010,
733e144ff40Sriastradh 	0x200c, 0x00001f0f, 0x0000100a,
734e144ff40Sriastradh 	0xbd2, 0x73773777, 0x12010001,
735e144ff40Sriastradh 	0x902, 0x000fffff, 0x000c007f,
736e144ff40Sriastradh 	0x2285, 0xf000003f, 0x00000007,
737e144ff40Sriastradh 	0x22c9, 0xffffffff, 0x00ff0fff,
738e144ff40Sriastradh 	0xc281, 0x0000ff0f, 0x00000000,
739e144ff40Sriastradh 	0xa293, 0x07ffffff, 0x06000000,
740e144ff40Sriastradh 	0x136, 0x00000fff, 0x00000100,
741e144ff40Sriastradh 	0x3405, 0x00010000, 0x00810001,
742e144ff40Sriastradh 	0x3605, 0x00010000, 0x00810001,
743e144ff40Sriastradh 	0xf9e, 0x00000001, 0x00000002,
744e144ff40Sriastradh 	0x31da, 0x00000008, 0x00000008,
745e144ff40Sriastradh 	0x31dc, 0x00000f00, 0x00000800,
746e144ff40Sriastradh 	0x31dd, 0x00000f00, 0x00000800,
747e144ff40Sriastradh 	0x31e6, 0x00ffffff, 0x00ff7fbf,
748e144ff40Sriastradh 	0x31e7, 0x00ffffff, 0x00ff7faf,
749e144ff40Sriastradh 	0x2300, 0x000000ff, 0x00000001,
750e144ff40Sriastradh 	0x853e, 0x01ff01ff, 0x00000002,
751e144ff40Sriastradh 	0x8526, 0x007ff800, 0x00200000,
752e144ff40Sriastradh 	0x8057, 0xffffffff, 0x00000f40,
753e144ff40Sriastradh 	0x2231, 0x001f3ae3, 0x00000082,
754e144ff40Sriastradh 	0x2235, 0x0000001f, 0x00000010,
755e144ff40Sriastradh 	0xc24d, 0xffffffff, 0x00000000
756e144ff40Sriastradh };
757e144ff40Sriastradh 
cik_init_golden_registers(struct amdgpu_device * adev)758e144ff40Sriastradh static void cik_init_golden_registers(struct amdgpu_device *adev)
759e144ff40Sriastradh {
760e144ff40Sriastradh 	/* Some of the registers might be dependent on GRBM_GFX_INDEX */
761e144ff40Sriastradh 	mutex_lock(&adev->grbm_idx_mutex);
762e144ff40Sriastradh 
763e144ff40Sriastradh 	switch (adev->asic_type) {
764e144ff40Sriastradh 	case CHIP_BONAIRE:
76541ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
766e144ff40Sriastradh 							bonaire_mgcg_cgcg_init,
76741ec0267Sriastradh 							ARRAY_SIZE(bonaire_mgcg_cgcg_init));
76841ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
769e144ff40Sriastradh 							bonaire_golden_registers,
77041ec0267Sriastradh 							ARRAY_SIZE(bonaire_golden_registers));
77141ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
772e144ff40Sriastradh 							bonaire_golden_common_registers,
77341ec0267Sriastradh 							ARRAY_SIZE(bonaire_golden_common_registers));
77441ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
775e144ff40Sriastradh 							bonaire_golden_spm_registers,
77641ec0267Sriastradh 							ARRAY_SIZE(bonaire_golden_spm_registers));
777e144ff40Sriastradh 		break;
778e144ff40Sriastradh 	case CHIP_KABINI:
77941ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
780e144ff40Sriastradh 							kalindi_mgcg_cgcg_init,
78141ec0267Sriastradh 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
78241ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
783e144ff40Sriastradh 							kalindi_golden_registers,
78441ec0267Sriastradh 							ARRAY_SIZE(kalindi_golden_registers));
78541ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
786e144ff40Sriastradh 							kalindi_golden_common_registers,
78741ec0267Sriastradh 							ARRAY_SIZE(kalindi_golden_common_registers));
78841ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
789e144ff40Sriastradh 							kalindi_golden_spm_registers,
79041ec0267Sriastradh 							ARRAY_SIZE(kalindi_golden_spm_registers));
791e144ff40Sriastradh 		break;
792e144ff40Sriastradh 	case CHIP_MULLINS:
79341ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
794e144ff40Sriastradh 							kalindi_mgcg_cgcg_init,
79541ec0267Sriastradh 							ARRAY_SIZE(kalindi_mgcg_cgcg_init));
79641ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
797e144ff40Sriastradh 							godavari_golden_registers,
79841ec0267Sriastradh 							ARRAY_SIZE(godavari_golden_registers));
79941ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
800e144ff40Sriastradh 							kalindi_golden_common_registers,
80141ec0267Sriastradh 							ARRAY_SIZE(kalindi_golden_common_registers));
80241ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
803e144ff40Sriastradh 							kalindi_golden_spm_registers,
80441ec0267Sriastradh 							ARRAY_SIZE(kalindi_golden_spm_registers));
805e144ff40Sriastradh 		break;
806e144ff40Sriastradh 	case CHIP_KAVERI:
80741ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
808e144ff40Sriastradh 							spectre_mgcg_cgcg_init,
80941ec0267Sriastradh 							ARRAY_SIZE(spectre_mgcg_cgcg_init));
81041ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
811e144ff40Sriastradh 							spectre_golden_registers,
81241ec0267Sriastradh 							ARRAY_SIZE(spectre_golden_registers));
81341ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
814e144ff40Sriastradh 							spectre_golden_common_registers,
81541ec0267Sriastradh 							ARRAY_SIZE(spectre_golden_common_registers));
81641ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
817e144ff40Sriastradh 							spectre_golden_spm_registers,
81841ec0267Sriastradh 							ARRAY_SIZE(spectre_golden_spm_registers));
819e144ff40Sriastradh 		break;
820e144ff40Sriastradh 	case CHIP_HAWAII:
82141ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
822e144ff40Sriastradh 							hawaii_mgcg_cgcg_init,
82341ec0267Sriastradh 							ARRAY_SIZE(hawaii_mgcg_cgcg_init));
82441ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
825e144ff40Sriastradh 							hawaii_golden_registers,
82641ec0267Sriastradh 							ARRAY_SIZE(hawaii_golden_registers));
82741ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
828e144ff40Sriastradh 							hawaii_golden_common_registers,
82941ec0267Sriastradh 							ARRAY_SIZE(hawaii_golden_common_registers));
83041ec0267Sriastradh 		amdgpu_device_program_register_sequence(adev,
831e144ff40Sriastradh 							hawaii_golden_spm_registers,
83241ec0267Sriastradh 							ARRAY_SIZE(hawaii_golden_spm_registers));
833e144ff40Sriastradh 		break;
834e144ff40Sriastradh 	default:
835e144ff40Sriastradh 		break;
836e144ff40Sriastradh 	}
837e144ff40Sriastradh 	mutex_unlock(&adev->grbm_idx_mutex);
838e144ff40Sriastradh }
839e144ff40Sriastradh 
840e144ff40Sriastradh /**
841e144ff40Sriastradh  * cik_get_xclk - get the xclk
842e144ff40Sriastradh  *
843e144ff40Sriastradh  * @adev: amdgpu_device pointer
844e144ff40Sriastradh  *
845e144ff40Sriastradh  * Returns the reference clock used by the gfx engine
846e144ff40Sriastradh  * (CIK).
847e144ff40Sriastradh  */
cik_get_xclk(struct amdgpu_device * adev)848e144ff40Sriastradh static u32 cik_get_xclk(struct amdgpu_device *adev)
849e144ff40Sriastradh {
850e144ff40Sriastradh 	u32 reference_clock = adev->clock.spll.reference_freq;
851e144ff40Sriastradh 
852e144ff40Sriastradh 	if (adev->flags & AMD_IS_APU) {
853e144ff40Sriastradh 		if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
854e144ff40Sriastradh 			return reference_clock / 2;
855e144ff40Sriastradh 	} else {
856e144ff40Sriastradh 		if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
857e144ff40Sriastradh 			return reference_clock / 4;
858e144ff40Sriastradh 	}
859e144ff40Sriastradh 	return reference_clock;
860e144ff40Sriastradh }
861e144ff40Sriastradh 
862e144ff40Sriastradh /**
863e144ff40Sriastradh  * cik_srbm_select - select specific register instances
864e144ff40Sriastradh  *
865e144ff40Sriastradh  * @adev: amdgpu_device pointer
866e144ff40Sriastradh  * @me: selected ME (micro engine)
867e144ff40Sriastradh  * @pipe: pipe
868e144ff40Sriastradh  * @queue: queue
869e144ff40Sriastradh  * @vmid: VMID
870e144ff40Sriastradh  *
871e144ff40Sriastradh  * Switches the currently active registers instances.  Some
872e144ff40Sriastradh  * registers are instanced per VMID, others are instanced per
873e144ff40Sriastradh  * me/pipe/queue combination.
874e144ff40Sriastradh  */
cik_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)875e144ff40Sriastradh void cik_srbm_select(struct amdgpu_device *adev,
876e144ff40Sriastradh 		     u32 me, u32 pipe, u32 queue, u32 vmid)
877e144ff40Sriastradh {
878e144ff40Sriastradh 	u32 srbm_gfx_cntl =
879e144ff40Sriastradh 		(((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
880e144ff40Sriastradh 		((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
881e144ff40Sriastradh 		((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
882e144ff40Sriastradh 		((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
883e144ff40Sriastradh 	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
884e144ff40Sriastradh }
885e144ff40Sriastradh 
cik_vga_set_state(struct amdgpu_device * adev,bool state)886e144ff40Sriastradh static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
887e144ff40Sriastradh {
888e144ff40Sriastradh 	uint32_t tmp;
889e144ff40Sriastradh 
890e144ff40Sriastradh 	tmp = RREG32(mmCONFIG_CNTL);
89141ec0267Sriastradh 	if (!state)
892e144ff40Sriastradh 		tmp |= CONFIG_CNTL__VGA_DIS_MASK;
893e144ff40Sriastradh 	else
894e144ff40Sriastradh 		tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
895e144ff40Sriastradh 	WREG32(mmCONFIG_CNTL, tmp);
896e144ff40Sriastradh }
897e144ff40Sriastradh 
cik_read_disabled_bios(struct amdgpu_device * adev)898e144ff40Sriastradh static bool cik_read_disabled_bios(struct amdgpu_device *adev)
899e144ff40Sriastradh {
900e144ff40Sriastradh 	u32 bus_cntl;
901e144ff40Sriastradh 	u32 d1vga_control = 0;
902e144ff40Sriastradh 	u32 d2vga_control = 0;
903e144ff40Sriastradh 	u32 vga_render_control = 0;
904e144ff40Sriastradh 	u32 rom_cntl;
905e144ff40Sriastradh 	bool r;
906e144ff40Sriastradh 
907e144ff40Sriastradh 	bus_cntl = RREG32(mmBUS_CNTL);
908e144ff40Sriastradh 	if (adev->mode_info.num_crtc) {
909e144ff40Sriastradh 		d1vga_control = RREG32(mmD1VGA_CONTROL);
910e144ff40Sriastradh 		d2vga_control = RREG32(mmD2VGA_CONTROL);
911e144ff40Sriastradh 		vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
912e144ff40Sriastradh 	}
913e144ff40Sriastradh 	rom_cntl = RREG32_SMC(ixROM_CNTL);
914e144ff40Sriastradh 
915e144ff40Sriastradh 	/* enable the rom */
916e144ff40Sriastradh 	WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
917e144ff40Sriastradh 	if (adev->mode_info.num_crtc) {
918e144ff40Sriastradh 		/* Disable VGA mode */
919e144ff40Sriastradh 		WREG32(mmD1VGA_CONTROL,
920e144ff40Sriastradh 		       (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
921e144ff40Sriastradh 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
922e144ff40Sriastradh 		WREG32(mmD2VGA_CONTROL,
923e144ff40Sriastradh 		       (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
924e144ff40Sriastradh 					  D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
925e144ff40Sriastradh 		WREG32(mmVGA_RENDER_CONTROL,
926e144ff40Sriastradh 		       (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
927e144ff40Sriastradh 	}
928e144ff40Sriastradh 	WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
929e144ff40Sriastradh 
930e144ff40Sriastradh 	r = amdgpu_read_bios(adev);
931e144ff40Sriastradh 
932e144ff40Sriastradh 	/* restore regs */
933e144ff40Sriastradh 	WREG32(mmBUS_CNTL, bus_cntl);
934e144ff40Sriastradh 	if (adev->mode_info.num_crtc) {
935e144ff40Sriastradh 		WREG32(mmD1VGA_CONTROL, d1vga_control);
936e144ff40Sriastradh 		WREG32(mmD2VGA_CONTROL, d2vga_control);
937e144ff40Sriastradh 		WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
938e144ff40Sriastradh 	}
939e144ff40Sriastradh 	WREG32_SMC(ixROM_CNTL, rom_cntl);
940e144ff40Sriastradh 	return r;
941e144ff40Sriastradh }
942e144ff40Sriastradh 
cik_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)94341ec0267Sriastradh static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
94441ec0267Sriastradh 				   u8 *bios, u32 length_bytes)
94541ec0267Sriastradh {
94641ec0267Sriastradh 	u32 *dw_ptr;
94741ec0267Sriastradh 	unsigned long flags;
94841ec0267Sriastradh 	u32 i, length_dw;
94941ec0267Sriastradh 
95041ec0267Sriastradh 	if (bios == NULL)
95141ec0267Sriastradh 		return false;
95241ec0267Sriastradh 	if (length_bytes == 0)
95341ec0267Sriastradh 		return false;
95441ec0267Sriastradh 	/* APU vbios image is part of sbios image */
95541ec0267Sriastradh 	if (adev->flags & AMD_IS_APU)
95641ec0267Sriastradh 		return false;
95741ec0267Sriastradh 
95841ec0267Sriastradh 	dw_ptr = (u32 *)bios;
95941ec0267Sriastradh 	length_dw = ALIGN(length_bytes, 4) / 4;
96041ec0267Sriastradh 	/* take the smc lock since we are using the smc index */
96141ec0267Sriastradh 	spin_lock_irqsave(&adev->smc_idx_lock, flags);
96241ec0267Sriastradh 	/* set rom index to 0 */
96341ec0267Sriastradh 	WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
96441ec0267Sriastradh 	WREG32(mmSMC_IND_DATA_0, 0);
96541ec0267Sriastradh 	/* set index to data for continous read */
96641ec0267Sriastradh 	WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
96741ec0267Sriastradh 	for (i = 0; i < length_dw; i++)
96841ec0267Sriastradh 		dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
96941ec0267Sriastradh 	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
97041ec0267Sriastradh 
97141ec0267Sriastradh 	return true;
97241ec0267Sriastradh }
97341ec0267Sriastradh 
97441ec0267Sriastradh static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
97541ec0267Sriastradh 	{mmGRBM_STATUS},
97641ec0267Sriastradh 	{mmGRBM_STATUS2},
97741ec0267Sriastradh 	{mmGRBM_STATUS_SE0},
97841ec0267Sriastradh 	{mmGRBM_STATUS_SE1},
97941ec0267Sriastradh 	{mmGRBM_STATUS_SE2},
98041ec0267Sriastradh 	{mmGRBM_STATUS_SE3},
98141ec0267Sriastradh 	{mmSRBM_STATUS},
98241ec0267Sriastradh 	{mmSRBM_STATUS2},
98341ec0267Sriastradh 	{mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
98441ec0267Sriastradh 	{mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
98541ec0267Sriastradh 	{mmCP_STAT},
98641ec0267Sriastradh 	{mmCP_STALLED_STAT1},
98741ec0267Sriastradh 	{mmCP_STALLED_STAT2},
98841ec0267Sriastradh 	{mmCP_STALLED_STAT3},
98941ec0267Sriastradh 	{mmCP_CPF_BUSY_STAT},
99041ec0267Sriastradh 	{mmCP_CPF_STALLED_STAT1},
99141ec0267Sriastradh 	{mmCP_CPF_STATUS},
99241ec0267Sriastradh 	{mmCP_CPC_BUSY_STAT},
99341ec0267Sriastradh 	{mmCP_CPC_STALLED_STAT1},
99441ec0267Sriastradh 	{mmCP_CPC_STATUS},
99541ec0267Sriastradh 	{mmGB_ADDR_CONFIG},
99641ec0267Sriastradh 	{mmMC_ARB_RAMCFG},
99741ec0267Sriastradh 	{mmGB_TILE_MODE0},
99841ec0267Sriastradh 	{mmGB_TILE_MODE1},
99941ec0267Sriastradh 	{mmGB_TILE_MODE2},
100041ec0267Sriastradh 	{mmGB_TILE_MODE3},
100141ec0267Sriastradh 	{mmGB_TILE_MODE4},
100241ec0267Sriastradh 	{mmGB_TILE_MODE5},
100341ec0267Sriastradh 	{mmGB_TILE_MODE6},
100441ec0267Sriastradh 	{mmGB_TILE_MODE7},
100541ec0267Sriastradh 	{mmGB_TILE_MODE8},
100641ec0267Sriastradh 	{mmGB_TILE_MODE9},
100741ec0267Sriastradh 	{mmGB_TILE_MODE10},
100841ec0267Sriastradh 	{mmGB_TILE_MODE11},
100941ec0267Sriastradh 	{mmGB_TILE_MODE12},
101041ec0267Sriastradh 	{mmGB_TILE_MODE13},
101141ec0267Sriastradh 	{mmGB_TILE_MODE14},
101241ec0267Sriastradh 	{mmGB_TILE_MODE15},
101341ec0267Sriastradh 	{mmGB_TILE_MODE16},
101441ec0267Sriastradh 	{mmGB_TILE_MODE17},
101541ec0267Sriastradh 	{mmGB_TILE_MODE18},
101641ec0267Sriastradh 	{mmGB_TILE_MODE19},
101741ec0267Sriastradh 	{mmGB_TILE_MODE20},
101841ec0267Sriastradh 	{mmGB_TILE_MODE21},
101941ec0267Sriastradh 	{mmGB_TILE_MODE22},
102041ec0267Sriastradh 	{mmGB_TILE_MODE23},
102141ec0267Sriastradh 	{mmGB_TILE_MODE24},
102241ec0267Sriastradh 	{mmGB_TILE_MODE25},
102341ec0267Sriastradh 	{mmGB_TILE_MODE26},
102441ec0267Sriastradh 	{mmGB_TILE_MODE27},
102541ec0267Sriastradh 	{mmGB_TILE_MODE28},
102641ec0267Sriastradh 	{mmGB_TILE_MODE29},
102741ec0267Sriastradh 	{mmGB_TILE_MODE30},
102841ec0267Sriastradh 	{mmGB_TILE_MODE31},
102941ec0267Sriastradh 	{mmGB_MACROTILE_MODE0},
103041ec0267Sriastradh 	{mmGB_MACROTILE_MODE1},
103141ec0267Sriastradh 	{mmGB_MACROTILE_MODE2},
103241ec0267Sriastradh 	{mmGB_MACROTILE_MODE3},
103341ec0267Sriastradh 	{mmGB_MACROTILE_MODE4},
103441ec0267Sriastradh 	{mmGB_MACROTILE_MODE5},
103541ec0267Sriastradh 	{mmGB_MACROTILE_MODE6},
103641ec0267Sriastradh 	{mmGB_MACROTILE_MODE7},
103741ec0267Sriastradh 	{mmGB_MACROTILE_MODE8},
103841ec0267Sriastradh 	{mmGB_MACROTILE_MODE9},
103941ec0267Sriastradh 	{mmGB_MACROTILE_MODE10},
104041ec0267Sriastradh 	{mmGB_MACROTILE_MODE11},
104141ec0267Sriastradh 	{mmGB_MACROTILE_MODE12},
104241ec0267Sriastradh 	{mmGB_MACROTILE_MODE13},
104341ec0267Sriastradh 	{mmGB_MACROTILE_MODE14},
104441ec0267Sriastradh 	{mmGB_MACROTILE_MODE15},
104541ec0267Sriastradh 	{mmCC_RB_BACKEND_DISABLE, true},
104641ec0267Sriastradh 	{mmGC_USER_RB_BACKEND_DISABLE, true},
104741ec0267Sriastradh 	{mmGB_BACKEND_MAP, false},
104841ec0267Sriastradh 	{mmPA_SC_RASTER_CONFIG, true},
104941ec0267Sriastradh 	{mmPA_SC_RASTER_CONFIG_1, true},
1050e144ff40Sriastradh };
1051e144ff40Sriastradh 
105241ec0267Sriastradh 
cik_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)105341ec0267Sriastradh static uint32_t cik_get_register_value(struct amdgpu_device *adev,
105441ec0267Sriastradh 				       bool indexed, u32 se_num,
105541ec0267Sriastradh 				       u32 sh_num, u32 reg_offset)
1056e144ff40Sriastradh {
105741ec0267Sriastradh 	if (indexed) {
1058e144ff40Sriastradh 		uint32_t val;
105941ec0267Sriastradh 		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
106041ec0267Sriastradh 		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
106141ec0267Sriastradh 
106241ec0267Sriastradh 		switch (reg_offset) {
106341ec0267Sriastradh 		case mmCC_RB_BACKEND_DISABLE:
106441ec0267Sriastradh 			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
106541ec0267Sriastradh 		case mmGC_USER_RB_BACKEND_DISABLE:
106641ec0267Sriastradh 			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
106741ec0267Sriastradh 		case mmPA_SC_RASTER_CONFIG:
106841ec0267Sriastradh 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
106941ec0267Sriastradh 		case mmPA_SC_RASTER_CONFIG_1:
107041ec0267Sriastradh 			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
107141ec0267Sriastradh 		}
1072e144ff40Sriastradh 
1073e144ff40Sriastradh 		mutex_lock(&adev->grbm_idx_mutex);
1074e144ff40Sriastradh 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
107541ec0267Sriastradh 			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1076e144ff40Sriastradh 
1077e144ff40Sriastradh 		val = RREG32(reg_offset);
1078e144ff40Sriastradh 
1079e144ff40Sriastradh 		if (se_num != 0xffffffff || sh_num != 0xffffffff)
108041ec0267Sriastradh 			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1081e144ff40Sriastradh 		mutex_unlock(&adev->grbm_idx_mutex);
1082e144ff40Sriastradh 		return val;
108341ec0267Sriastradh 	} else {
108441ec0267Sriastradh 		unsigned idx;
108541ec0267Sriastradh 
108641ec0267Sriastradh 		switch (reg_offset) {
108741ec0267Sriastradh 		case mmGB_ADDR_CONFIG:
108841ec0267Sriastradh 			return adev->gfx.config.gb_addr_config;
108941ec0267Sriastradh 		case mmMC_ARB_RAMCFG:
109041ec0267Sriastradh 			return adev->gfx.config.mc_arb_ramcfg;
109141ec0267Sriastradh 		case mmGB_TILE_MODE0:
109241ec0267Sriastradh 		case mmGB_TILE_MODE1:
109341ec0267Sriastradh 		case mmGB_TILE_MODE2:
109441ec0267Sriastradh 		case mmGB_TILE_MODE3:
109541ec0267Sriastradh 		case mmGB_TILE_MODE4:
109641ec0267Sriastradh 		case mmGB_TILE_MODE5:
109741ec0267Sriastradh 		case mmGB_TILE_MODE6:
109841ec0267Sriastradh 		case mmGB_TILE_MODE7:
109941ec0267Sriastradh 		case mmGB_TILE_MODE8:
110041ec0267Sriastradh 		case mmGB_TILE_MODE9:
110141ec0267Sriastradh 		case mmGB_TILE_MODE10:
110241ec0267Sriastradh 		case mmGB_TILE_MODE11:
110341ec0267Sriastradh 		case mmGB_TILE_MODE12:
110441ec0267Sriastradh 		case mmGB_TILE_MODE13:
110541ec0267Sriastradh 		case mmGB_TILE_MODE14:
110641ec0267Sriastradh 		case mmGB_TILE_MODE15:
110741ec0267Sriastradh 		case mmGB_TILE_MODE16:
110841ec0267Sriastradh 		case mmGB_TILE_MODE17:
110941ec0267Sriastradh 		case mmGB_TILE_MODE18:
111041ec0267Sriastradh 		case mmGB_TILE_MODE19:
111141ec0267Sriastradh 		case mmGB_TILE_MODE20:
111241ec0267Sriastradh 		case mmGB_TILE_MODE21:
111341ec0267Sriastradh 		case mmGB_TILE_MODE22:
111441ec0267Sriastradh 		case mmGB_TILE_MODE23:
111541ec0267Sriastradh 		case mmGB_TILE_MODE24:
111641ec0267Sriastradh 		case mmGB_TILE_MODE25:
111741ec0267Sriastradh 		case mmGB_TILE_MODE26:
111841ec0267Sriastradh 		case mmGB_TILE_MODE27:
111941ec0267Sriastradh 		case mmGB_TILE_MODE28:
112041ec0267Sriastradh 		case mmGB_TILE_MODE29:
112141ec0267Sriastradh 		case mmGB_TILE_MODE30:
112241ec0267Sriastradh 		case mmGB_TILE_MODE31:
112341ec0267Sriastradh 			idx = (reg_offset - mmGB_TILE_MODE0);
112441ec0267Sriastradh 			return adev->gfx.config.tile_mode_array[idx];
112541ec0267Sriastradh 		case mmGB_MACROTILE_MODE0:
112641ec0267Sriastradh 		case mmGB_MACROTILE_MODE1:
112741ec0267Sriastradh 		case mmGB_MACROTILE_MODE2:
112841ec0267Sriastradh 		case mmGB_MACROTILE_MODE3:
112941ec0267Sriastradh 		case mmGB_MACROTILE_MODE4:
113041ec0267Sriastradh 		case mmGB_MACROTILE_MODE5:
113141ec0267Sriastradh 		case mmGB_MACROTILE_MODE6:
113241ec0267Sriastradh 		case mmGB_MACROTILE_MODE7:
113341ec0267Sriastradh 		case mmGB_MACROTILE_MODE8:
113441ec0267Sriastradh 		case mmGB_MACROTILE_MODE9:
113541ec0267Sriastradh 		case mmGB_MACROTILE_MODE10:
113641ec0267Sriastradh 		case mmGB_MACROTILE_MODE11:
113741ec0267Sriastradh 		case mmGB_MACROTILE_MODE12:
113841ec0267Sriastradh 		case mmGB_MACROTILE_MODE13:
113941ec0267Sriastradh 		case mmGB_MACROTILE_MODE14:
114041ec0267Sriastradh 		case mmGB_MACROTILE_MODE15:
114141ec0267Sriastradh 			idx = (reg_offset - mmGB_MACROTILE_MODE0);
114241ec0267Sriastradh 			return adev->gfx.config.macrotile_mode_array[idx];
114341ec0267Sriastradh 		default:
114441ec0267Sriastradh 			return RREG32(reg_offset);
114541ec0267Sriastradh 		}
114641ec0267Sriastradh 	}
1147e144ff40Sriastradh }
1148e144ff40Sriastradh 
cik_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1149e144ff40Sriastradh static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1150e144ff40Sriastradh 			     u32 sh_num, u32 reg_offset, u32 *value)
1151e144ff40Sriastradh {
1152e144ff40Sriastradh 	uint32_t i;
1153e144ff40Sriastradh 
1154e144ff40Sriastradh 	*value = 0;
1155e144ff40Sriastradh 	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
115641ec0267Sriastradh 		bool indexed = cik_allowed_read_registers[i].grbm_indexed;
115741ec0267Sriastradh 
1158e144ff40Sriastradh 		if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1159e144ff40Sriastradh 			continue;
1160e144ff40Sriastradh 
116141ec0267Sriastradh 		*value = cik_get_register_value(adev, indexed, se_num, sh_num,
116241ec0267Sriastradh 						reg_offset);
1163e144ff40Sriastradh 		return 0;
1164e144ff40Sriastradh 	}
1165e144ff40Sriastradh 	return -EINVAL;
1166e144ff40Sriastradh }
1167e144ff40Sriastradh 
1168e144ff40Sriastradh struct kv_reset_save_regs {
1169e144ff40Sriastradh 	u32 gmcon_reng_execute;
1170e144ff40Sriastradh 	u32 gmcon_misc;
1171e144ff40Sriastradh 	u32 gmcon_misc3;
1172e144ff40Sriastradh };
1173e144ff40Sriastradh 
kv_save_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1174e144ff40Sriastradh static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1175e144ff40Sriastradh 				   struct kv_reset_save_regs *save)
1176e144ff40Sriastradh {
1177e144ff40Sriastradh 	save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1178e144ff40Sriastradh 	save->gmcon_misc = RREG32(mmGMCON_MISC);
1179e144ff40Sriastradh 	save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1180e144ff40Sriastradh 
1181e144ff40Sriastradh 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1182e144ff40Sriastradh 		~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1183e144ff40Sriastradh 	WREG32(mmGMCON_MISC, save->gmcon_misc &
1184e144ff40Sriastradh 		~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1185e144ff40Sriastradh 			GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1186e144ff40Sriastradh }
1187e144ff40Sriastradh 
kv_restore_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1188e144ff40Sriastradh static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1189e144ff40Sriastradh 				      struct kv_reset_save_regs *save)
1190e144ff40Sriastradh {
1191e144ff40Sriastradh 	int i;
1192e144ff40Sriastradh 
1193e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1194e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1195e144ff40Sriastradh 
1196e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1197e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1198e144ff40Sriastradh 
1199e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1200e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1201e144ff40Sriastradh 
1202e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1203e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1204e144ff40Sriastradh 
1205e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1206e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1207e144ff40Sriastradh 
1208e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1209e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1210e144ff40Sriastradh 
1211e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1212e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1213e144ff40Sriastradh 
1214e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1215e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1216e144ff40Sriastradh 
1217e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1218e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1219e144ff40Sriastradh 
1220e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1221e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1222e144ff40Sriastradh 
1223e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0);
1224e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1225e144ff40Sriastradh 
1226e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1227e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1228e144ff40Sriastradh 
1229e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1230e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1231e144ff40Sriastradh 
1232e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1233e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1234e144ff40Sriastradh 
1235e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1236e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1237e144ff40Sriastradh 
1238e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1239e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1240e144ff40Sriastradh 
1241e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1242e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1243e144ff40Sriastradh 
1244e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1245e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1246e144ff40Sriastradh 
1247e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1248e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1249e144ff40Sriastradh 
1250e144ff40Sriastradh 	for (i = 0; i < 5; i++)
1251e144ff40Sriastradh 		WREG32(mmGMCON_PGFSM_WRITE, 0);
1252e144ff40Sriastradh 
1253e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1254e144ff40Sriastradh 	WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1255e144ff40Sriastradh 
1256e144ff40Sriastradh 	WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1257e144ff40Sriastradh 	WREG32(mmGMCON_MISC, save->gmcon_misc);
1258e144ff40Sriastradh 	WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1259e144ff40Sriastradh }
1260e144ff40Sriastradh 
cik_gpu_pci_config_reset(struct amdgpu_device * adev)126141ec0267Sriastradh static int cik_gpu_pci_config_reset(struct amdgpu_device *adev)
1262e144ff40Sriastradh {
1263e144ff40Sriastradh 	struct kv_reset_save_regs kv_save = { 0 };
126441ec0267Sriastradh 	u32 i;
126541ec0267Sriastradh 	int r = -EINVAL;
1266e144ff40Sriastradh 
1267e144ff40Sriastradh 	dev_info(adev->dev, "GPU pci config reset\n");
1268e144ff40Sriastradh 
1269e144ff40Sriastradh 	if (adev->flags & AMD_IS_APU)
1270e144ff40Sriastradh 		kv_save_regs_for_reset(adev, &kv_save);
1271e144ff40Sriastradh 
1272e144ff40Sriastradh 	/* disable BM */
1273e144ff40Sriastradh 	pci_clear_master(adev->pdev);
1274e144ff40Sriastradh 	/* reset */
127541ec0267Sriastradh 	amdgpu_device_pci_config_reset(adev);
1276e144ff40Sriastradh 
1277e144ff40Sriastradh 	udelay(100);
1278e144ff40Sriastradh 
1279e144ff40Sriastradh 	/* wait for asic to come out of reset */
1280e144ff40Sriastradh 	for (i = 0; i < adev->usec_timeout; i++) {
128141ec0267Sriastradh 		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
128241ec0267Sriastradh 			/* enable BM */
128341ec0267Sriastradh 			pci_set_master(adev->pdev);
128441ec0267Sriastradh 			adev->has_hw_reset = true;
128541ec0267Sriastradh 			r = 0;
1286e144ff40Sriastradh 			break;
128741ec0267Sriastradh 		}
1288e144ff40Sriastradh 		udelay(1);
1289e144ff40Sriastradh 	}
1290e144ff40Sriastradh 
1291e144ff40Sriastradh 	/* does asic init need to be run first??? */
1292e144ff40Sriastradh 	if (adev->flags & AMD_IS_APU)
1293e144ff40Sriastradh 		kv_restore_regs_for_reset(adev, &kv_save);
129441ec0267Sriastradh 
129541ec0267Sriastradh 	return r;
1296e144ff40Sriastradh }
1297e144ff40Sriastradh 
129841ec0267Sriastradh /**
129941ec0267Sriastradh  * cik_asic_pci_config_reset - soft reset GPU
130041ec0267Sriastradh  *
130141ec0267Sriastradh  * @adev: amdgpu_device pointer
130241ec0267Sriastradh  *
130341ec0267Sriastradh  * Use PCI Config method to reset the GPU.
130441ec0267Sriastradh  *
130541ec0267Sriastradh  * Returns 0 for success.
130641ec0267Sriastradh  */
cik_asic_pci_config_reset(struct amdgpu_device * adev)130741ec0267Sriastradh static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
1308e144ff40Sriastradh {
130941ec0267Sriastradh 	int r;
1310e144ff40Sriastradh 
131141ec0267Sriastradh 	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
131241ec0267Sriastradh 
131341ec0267Sriastradh 	r = cik_gpu_pci_config_reset(adev);
131441ec0267Sriastradh 
131541ec0267Sriastradh 	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
131641ec0267Sriastradh 
131741ec0267Sriastradh 	return r;
131841ec0267Sriastradh }
131941ec0267Sriastradh 
cik_asic_supports_baco(struct amdgpu_device * adev)132041ec0267Sriastradh static bool cik_asic_supports_baco(struct amdgpu_device *adev)
132141ec0267Sriastradh {
132241ec0267Sriastradh 	switch (adev->asic_type) {
132341ec0267Sriastradh 	case CHIP_BONAIRE:
132441ec0267Sriastradh 	case CHIP_HAWAII:
132541ec0267Sriastradh 		return amdgpu_dpm_is_baco_supported(adev);
132641ec0267Sriastradh 	default:
132741ec0267Sriastradh 		return false;
132841ec0267Sriastradh 	}
132941ec0267Sriastradh }
133041ec0267Sriastradh 
133141ec0267Sriastradh static enum amd_reset_method
cik_asic_reset_method(struct amdgpu_device * adev)133241ec0267Sriastradh cik_asic_reset_method(struct amdgpu_device *adev)
133341ec0267Sriastradh {
133441ec0267Sriastradh 	bool baco_reset;
133541ec0267Sriastradh 
133641ec0267Sriastradh 	switch (adev->asic_type) {
133741ec0267Sriastradh 	case CHIP_BONAIRE:
133841ec0267Sriastradh 	case CHIP_HAWAII:
133941ec0267Sriastradh 		/* disable baco reset until it works */
134041ec0267Sriastradh 		/* smu7_asic_get_baco_capability(adev, &baco_reset); */
134141ec0267Sriastradh 		baco_reset = false;
134241ec0267Sriastradh 		break;
134341ec0267Sriastradh 	default:
134441ec0267Sriastradh 		baco_reset = false;
134541ec0267Sriastradh 		break;
134641ec0267Sriastradh 	}
134741ec0267Sriastradh 
134841ec0267Sriastradh 	if (baco_reset)
134941ec0267Sriastradh 		return AMD_RESET_METHOD_BACO;
1350e144ff40Sriastradh 	else
135141ec0267Sriastradh 		return AMD_RESET_METHOD_LEGACY;
1352e144ff40Sriastradh }
1353e144ff40Sriastradh 
1354e144ff40Sriastradh /**
1355e144ff40Sriastradh  * cik_asic_reset - soft reset GPU
1356e144ff40Sriastradh  *
1357e144ff40Sriastradh  * @adev: amdgpu_device pointer
1358e144ff40Sriastradh  *
1359e144ff40Sriastradh  * Look up which blocks are hung and attempt
1360e144ff40Sriastradh  * to reset them.
1361e144ff40Sriastradh  * Returns 0 for success.
1362e144ff40Sriastradh  */
cik_asic_reset(struct amdgpu_device * adev)1363e144ff40Sriastradh static int cik_asic_reset(struct amdgpu_device *adev)
1364e144ff40Sriastradh {
136541ec0267Sriastradh 	int r;
1366e144ff40Sriastradh 
136741ec0267Sriastradh 	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
136841ec0267Sriastradh 		if (!adev->in_suspend)
136941ec0267Sriastradh 			amdgpu_inc_vram_lost(adev);
137041ec0267Sriastradh 		r = amdgpu_dpm_baco_reset(adev);
137141ec0267Sriastradh 	} else {
137241ec0267Sriastradh 		r = cik_asic_pci_config_reset(adev);
137341ec0267Sriastradh 	}
1374e144ff40Sriastradh 
137541ec0267Sriastradh 	return r;
137641ec0267Sriastradh }
1377e144ff40Sriastradh 
cik_get_config_memsize(struct amdgpu_device * adev)137841ec0267Sriastradh static u32 cik_get_config_memsize(struct amdgpu_device *adev)
137941ec0267Sriastradh {
138041ec0267Sriastradh 	return RREG32(mmCONFIG_MEMSIZE);
1381e144ff40Sriastradh }
1382e144ff40Sriastradh 
cik_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)1383e144ff40Sriastradh static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1384e144ff40Sriastradh 			      u32 cntl_reg, u32 status_reg)
1385e144ff40Sriastradh {
1386e144ff40Sriastradh 	int r, i;
1387e144ff40Sriastradh 	struct atom_clock_dividers dividers;
1388e144ff40Sriastradh 	uint32_t tmp;
1389e144ff40Sriastradh 
1390e144ff40Sriastradh 	r = amdgpu_atombios_get_clock_dividers(adev,
1391e144ff40Sriastradh 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1392e144ff40Sriastradh 					       clock, false, &dividers);
1393e144ff40Sriastradh 	if (r)
1394e144ff40Sriastradh 		return r;
1395e144ff40Sriastradh 
1396e144ff40Sriastradh 	tmp = RREG32_SMC(cntl_reg);
1397e144ff40Sriastradh 	tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1398e144ff40Sriastradh 		CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1399e144ff40Sriastradh 	tmp |= dividers.post_divider;
1400e144ff40Sriastradh 	WREG32_SMC(cntl_reg, tmp);
1401e144ff40Sriastradh 
1402e144ff40Sriastradh 	for (i = 0; i < 100; i++) {
1403e144ff40Sriastradh 		if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1404e144ff40Sriastradh 			break;
1405e144ff40Sriastradh 		mdelay(10);
1406e144ff40Sriastradh 	}
1407e144ff40Sriastradh 	if (i == 100)
1408e144ff40Sriastradh 		return -ETIMEDOUT;
1409e144ff40Sriastradh 
1410e144ff40Sriastradh 	return 0;
1411e144ff40Sriastradh }
1412e144ff40Sriastradh 
cik_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1413e144ff40Sriastradh static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1414e144ff40Sriastradh {
1415e144ff40Sriastradh 	int r = 0;
1416e144ff40Sriastradh 
1417e144ff40Sriastradh 	r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1418e144ff40Sriastradh 	if (r)
1419e144ff40Sriastradh 		return r;
1420e144ff40Sriastradh 
1421e144ff40Sriastradh 	r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1422e144ff40Sriastradh 	return r;
1423e144ff40Sriastradh }
1424e144ff40Sriastradh 
cik_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1425e144ff40Sriastradh static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1426e144ff40Sriastradh {
1427e144ff40Sriastradh 	int r, i;
1428e144ff40Sriastradh 	struct atom_clock_dividers dividers;
1429e144ff40Sriastradh 	u32 tmp;
1430e144ff40Sriastradh 
1431e144ff40Sriastradh 	r = amdgpu_atombios_get_clock_dividers(adev,
1432e144ff40Sriastradh 					       COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1433e144ff40Sriastradh 					       ecclk, false, &dividers);
1434e144ff40Sriastradh 	if (r)
1435e144ff40Sriastradh 		return r;
1436e144ff40Sriastradh 
1437e144ff40Sriastradh 	for (i = 0; i < 100; i++) {
1438e144ff40Sriastradh 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1439e144ff40Sriastradh 			break;
1440e144ff40Sriastradh 		mdelay(10);
1441e144ff40Sriastradh 	}
1442e144ff40Sriastradh 	if (i == 100)
1443e144ff40Sriastradh 		return -ETIMEDOUT;
1444e144ff40Sriastradh 
1445e144ff40Sriastradh 	tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1446e144ff40Sriastradh 	tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1447e144ff40Sriastradh 		CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1448e144ff40Sriastradh 	tmp |= dividers.post_divider;
1449e144ff40Sriastradh 	WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1450e144ff40Sriastradh 
1451e144ff40Sriastradh 	for (i = 0; i < 100; i++) {
1452e144ff40Sriastradh 		if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1453e144ff40Sriastradh 			break;
1454e144ff40Sriastradh 		mdelay(10);
1455e144ff40Sriastradh 	}
1456e144ff40Sriastradh 	if (i == 100)
1457e144ff40Sriastradh 		return -ETIMEDOUT;
1458e144ff40Sriastradh 
1459e144ff40Sriastradh 	return 0;
1460e144ff40Sriastradh }
1461e144ff40Sriastradh 
cik_pcie_gen3_enable(struct amdgpu_device * adev)1462e144ff40Sriastradh static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1463e144ff40Sriastradh {
1464e144ff40Sriastradh 	struct pci_dev *root = adev->pdev->bus->self;
146541ec0267Sriastradh 	u32 speed_cntl, current_data_rate;
146641ec0267Sriastradh 	int i;
1467e144ff40Sriastradh 	u16 tmp16;
1468e144ff40Sriastradh 
1469e144ff40Sriastradh 	if (pci_is_root_bus(adev->pdev->bus))
1470e144ff40Sriastradh 		return;
1471e144ff40Sriastradh 
1472e144ff40Sriastradh 	if (amdgpu_pcie_gen2 == 0)
1473e144ff40Sriastradh 		return;
1474e144ff40Sriastradh 
1475e144ff40Sriastradh 	if (adev->flags & AMD_IS_APU)
1476e144ff40Sriastradh 		return;
1477e144ff40Sriastradh 
147841ec0267Sriastradh 	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
147941ec0267Sriastradh 					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1480e144ff40Sriastradh 		return;
1481e144ff40Sriastradh 
1482e144ff40Sriastradh 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1483e144ff40Sriastradh 	current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1484e144ff40Sriastradh 		PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
148541ec0267Sriastradh 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1486e144ff40Sriastradh 		if (current_data_rate == 2) {
1487e144ff40Sriastradh 			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1488e144ff40Sriastradh 			return;
1489e144ff40Sriastradh 		}
1490e144ff40Sriastradh 		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
149141ec0267Sriastradh 	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1492e144ff40Sriastradh 		if (current_data_rate == 1) {
1493e144ff40Sriastradh 			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1494e144ff40Sriastradh 			return;
1495e144ff40Sriastradh 		}
1496e144ff40Sriastradh 		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1497e144ff40Sriastradh 	}
1498e144ff40Sriastradh 
149941ec0267Sriastradh 	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1500e144ff40Sriastradh 		return;
1501e144ff40Sriastradh 
150241ec0267Sriastradh 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1503e144ff40Sriastradh 		/* re-try equalization if gen3 is not already enabled */
1504e144ff40Sriastradh 		if (current_data_rate != 2) {
1505e144ff40Sriastradh 			u16 bridge_cfg, gpu_cfg;
1506e144ff40Sriastradh 			u16 bridge_cfg2, gpu_cfg2;
1507e144ff40Sriastradh 			u32 max_lw, current_lw, tmp;
1508e144ff40Sriastradh 
150941ec0267Sriastradh 			pcie_capability_read_word(root, PCI_EXP_LNKCTL,
151041ec0267Sriastradh 						  &bridge_cfg);
151141ec0267Sriastradh 			pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL,
151241ec0267Sriastradh 						  &gpu_cfg);
1513e144ff40Sriastradh 
1514e144ff40Sriastradh 			tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
151541ec0267Sriastradh 			pcie_capability_write_word(root, PCI_EXP_LNKCTL, tmp16);
1516e144ff40Sriastradh 
1517e144ff40Sriastradh 			tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
151841ec0267Sriastradh 			pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL,
151941ec0267Sriastradh 						   tmp16);
1520e144ff40Sriastradh 
1521e144ff40Sriastradh 			tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1522e144ff40Sriastradh 			max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1523e144ff40Sriastradh 				PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1524e144ff40Sriastradh 			current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1525e144ff40Sriastradh 				>> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1526e144ff40Sriastradh 
1527e144ff40Sriastradh 			if (current_lw < max_lw) {
1528e144ff40Sriastradh 				tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1529e144ff40Sriastradh 				if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1530e144ff40Sriastradh 					tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1531e144ff40Sriastradh 						PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1532e144ff40Sriastradh 					tmp |= (max_lw <<
1533e144ff40Sriastradh 						PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1534e144ff40Sriastradh 					tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1535e144ff40Sriastradh 					PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1536e144ff40Sriastradh 					PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1537e144ff40Sriastradh 					WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1538e144ff40Sriastradh 				}
1539e144ff40Sriastradh 			}
1540e144ff40Sriastradh 
1541e144ff40Sriastradh 			for (i = 0; i < 10; i++) {
1542e144ff40Sriastradh 				/* check status */
154341ec0267Sriastradh 				pcie_capability_read_word(adev->pdev,
154441ec0267Sriastradh 							  PCI_EXP_DEVSTA,
154541ec0267Sriastradh 							  &tmp16);
1546e144ff40Sriastradh 				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1547e144ff40Sriastradh 					break;
1548e144ff40Sriastradh 
154941ec0267Sriastradh 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
155041ec0267Sriastradh 							  &bridge_cfg);
155141ec0267Sriastradh 				pcie_capability_read_word(adev->pdev,
155241ec0267Sriastradh 							  PCI_EXP_LNKCTL,
155341ec0267Sriastradh 							  &gpu_cfg);
1554e144ff40Sriastradh 
155541ec0267Sriastradh 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
155641ec0267Sriastradh 							  &bridge_cfg2);
155741ec0267Sriastradh 				pcie_capability_read_word(adev->pdev,
155841ec0267Sriastradh 							  PCI_EXP_LNKCTL2,
155941ec0267Sriastradh 							  &gpu_cfg2);
1560e144ff40Sriastradh 
1561e144ff40Sriastradh 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1562e144ff40Sriastradh 				tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1563e144ff40Sriastradh 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1564e144ff40Sriastradh 
1565e144ff40Sriastradh 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1566e144ff40Sriastradh 				tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1567e144ff40Sriastradh 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1568e144ff40Sriastradh 
156941ec0267Sriastradh 				msleep(100);
1570e144ff40Sriastradh 
1571e144ff40Sriastradh 				/* linkctl */
157241ec0267Sriastradh 				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
157341ec0267Sriastradh 							  &tmp16);
1574e144ff40Sriastradh 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1575e144ff40Sriastradh 				tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
157641ec0267Sriastradh 				pcie_capability_write_word(root, PCI_EXP_LNKCTL,
157741ec0267Sriastradh 							   tmp16);
1578e144ff40Sriastradh 
157941ec0267Sriastradh 				pcie_capability_read_word(adev->pdev,
158041ec0267Sriastradh 							  PCI_EXP_LNKCTL,
158141ec0267Sriastradh 							  &tmp16);
1582e144ff40Sriastradh 				tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1583e144ff40Sriastradh 				tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
158441ec0267Sriastradh 				pcie_capability_write_word(adev->pdev,
158541ec0267Sriastradh 							   PCI_EXP_LNKCTL,
158641ec0267Sriastradh 							   tmp16);
1587e144ff40Sriastradh 
1588e144ff40Sriastradh 				/* linkctl2 */
158941ec0267Sriastradh 				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
159041ec0267Sriastradh 							  &tmp16);
159141ec0267Sriastradh 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
159241ec0267Sriastradh 					   PCI_EXP_LNKCTL2_TX_MARGIN);
159341ec0267Sriastradh 				tmp16 |= (bridge_cfg2 &
159441ec0267Sriastradh 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
159541ec0267Sriastradh 					   PCI_EXP_LNKCTL2_TX_MARGIN));
159641ec0267Sriastradh 				pcie_capability_write_word(root,
159741ec0267Sriastradh 							   PCI_EXP_LNKCTL2,
159841ec0267Sriastradh 							   tmp16);
1599e144ff40Sriastradh 
160041ec0267Sriastradh 				pcie_capability_read_word(adev->pdev,
160141ec0267Sriastradh 							  PCI_EXP_LNKCTL2,
160241ec0267Sriastradh 							  &tmp16);
160341ec0267Sriastradh 				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
160441ec0267Sriastradh 					   PCI_EXP_LNKCTL2_TX_MARGIN);
160541ec0267Sriastradh 				tmp16 |= (gpu_cfg2 &
160641ec0267Sriastradh 					  (PCI_EXP_LNKCTL2_ENTER_COMP |
160741ec0267Sriastradh 					   PCI_EXP_LNKCTL2_TX_MARGIN));
160841ec0267Sriastradh 				pcie_capability_write_word(adev->pdev,
160941ec0267Sriastradh 							   PCI_EXP_LNKCTL2,
161041ec0267Sriastradh 							   tmp16);
1611e144ff40Sriastradh 
1612e144ff40Sriastradh 				tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1613e144ff40Sriastradh 				tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1614e144ff40Sriastradh 				WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1615e144ff40Sriastradh 			}
1616e144ff40Sriastradh 		}
1617e144ff40Sriastradh 	}
1618e144ff40Sriastradh 
1619e144ff40Sriastradh 	/* set the link speed */
1620e144ff40Sriastradh 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1621e144ff40Sriastradh 		PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1622e144ff40Sriastradh 	speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1623e144ff40Sriastradh 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1624e144ff40Sriastradh 
162541ec0267Sriastradh 	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
162641ec0267Sriastradh 	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
162741ec0267Sriastradh 
162841ec0267Sriastradh 	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
162941ec0267Sriastradh 		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
163041ec0267Sriastradh 	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
163141ec0267Sriastradh 		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1632e144ff40Sriastradh 	else
163341ec0267Sriastradh 		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
163441ec0267Sriastradh 	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
1635e144ff40Sriastradh 
1636e144ff40Sriastradh 	speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1637e144ff40Sriastradh 	speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1638e144ff40Sriastradh 	WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1639e144ff40Sriastradh 
1640e144ff40Sriastradh 	for (i = 0; i < adev->usec_timeout; i++) {
1641e144ff40Sriastradh 		speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1642e144ff40Sriastradh 		if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1643e144ff40Sriastradh 			break;
1644e144ff40Sriastradh 		udelay(1);
1645e144ff40Sriastradh 	}
1646e144ff40Sriastradh }
1647e144ff40Sriastradh 
cik_program_aspm(struct amdgpu_device * adev)1648e144ff40Sriastradh static void cik_program_aspm(struct amdgpu_device *adev)
1649e144ff40Sriastradh {
1650e144ff40Sriastradh 	u32 data, orig;
1651e144ff40Sriastradh 	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1652e144ff40Sriastradh 	bool disable_clkreq = false;
1653e144ff40Sriastradh 
1654e144ff40Sriastradh 	if (amdgpu_aspm == 0)
1655e144ff40Sriastradh 		return;
1656e144ff40Sriastradh 
165741ec0267Sriastradh 	if (pci_is_root_bus(adev->pdev->bus))
165841ec0267Sriastradh 		return;
165941ec0267Sriastradh 
1660e144ff40Sriastradh 	/* XXX double check APUs */
1661e144ff40Sriastradh 	if (adev->flags & AMD_IS_APU)
1662e144ff40Sriastradh 		return;
1663e144ff40Sriastradh 
1664e144ff40Sriastradh 	orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1665e144ff40Sriastradh 	data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1666e144ff40Sriastradh 	data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1667e144ff40Sriastradh 		PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1668e144ff40Sriastradh 	if (orig != data)
1669e144ff40Sriastradh 		WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1670e144ff40Sriastradh 
1671e144ff40Sriastradh 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1672e144ff40Sriastradh 	data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1673e144ff40Sriastradh 	if (orig != data)
1674e144ff40Sriastradh 		WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1675e144ff40Sriastradh 
1676e144ff40Sriastradh 	orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1677e144ff40Sriastradh 	data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1678e144ff40Sriastradh 	if (orig != data)
1679e144ff40Sriastradh 		WREG32_PCIE(ixPCIE_P_CNTL, data);
1680e144ff40Sriastradh 
1681e144ff40Sriastradh 	orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1682e144ff40Sriastradh 	data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1683e144ff40Sriastradh 		PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1684e144ff40Sriastradh 	data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1685e144ff40Sriastradh 	if (!disable_l0s)
1686e144ff40Sriastradh 		data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1687e144ff40Sriastradh 
1688e144ff40Sriastradh 	if (!disable_l1) {
1689e144ff40Sriastradh 		data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1690e144ff40Sriastradh 		data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1691e144ff40Sriastradh 		if (orig != data)
1692e144ff40Sriastradh 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1693e144ff40Sriastradh 
1694e144ff40Sriastradh 		if (!disable_plloff_in_l1) {
1695e144ff40Sriastradh 			bool clk_req_support;
1696e144ff40Sriastradh 
1697e144ff40Sriastradh 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1698e144ff40Sriastradh 			data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1699e144ff40Sriastradh 				PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1700e144ff40Sriastradh 			data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1701e144ff40Sriastradh 				(7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1702e144ff40Sriastradh 			if (orig != data)
1703e144ff40Sriastradh 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1704e144ff40Sriastradh 
1705e144ff40Sriastradh 			orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1706e144ff40Sriastradh 			data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1707e144ff40Sriastradh 				PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1708e144ff40Sriastradh 			data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1709e144ff40Sriastradh 				(7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1710e144ff40Sriastradh 			if (orig != data)
1711e144ff40Sriastradh 				WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1712e144ff40Sriastradh 
1713e144ff40Sriastradh 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1714e144ff40Sriastradh 			data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1715e144ff40Sriastradh 				PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1716e144ff40Sriastradh 			data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1717e144ff40Sriastradh 				(7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1718e144ff40Sriastradh 			if (orig != data)
1719e144ff40Sriastradh 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1720e144ff40Sriastradh 
1721e144ff40Sriastradh 			orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1722e144ff40Sriastradh 			data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1723e144ff40Sriastradh 				PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1724e144ff40Sriastradh 			data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1725e144ff40Sriastradh 				(7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1726e144ff40Sriastradh 			if (orig != data)
1727e144ff40Sriastradh 				WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1728e144ff40Sriastradh 
1729e144ff40Sriastradh 			orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1730e144ff40Sriastradh 			data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1731e144ff40Sriastradh 			data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1732e144ff40Sriastradh 			if (orig != data)
1733e144ff40Sriastradh 				WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1734e144ff40Sriastradh 
1735e144ff40Sriastradh 			if (!disable_clkreq) {
1736e144ff40Sriastradh 				struct pci_dev *root = adev->pdev->bus->self;
1737e144ff40Sriastradh 				u32 lnkcap;
1738e144ff40Sriastradh 
1739e144ff40Sriastradh 				clk_req_support = false;
1740e144ff40Sriastradh 				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1741e144ff40Sriastradh 				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1742e144ff40Sriastradh 					clk_req_support = true;
1743e144ff40Sriastradh 			} else {
1744e144ff40Sriastradh 				clk_req_support = false;
1745e144ff40Sriastradh 			}
1746e144ff40Sriastradh 
1747e144ff40Sriastradh 			if (clk_req_support) {
1748e144ff40Sriastradh 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1749e144ff40Sriastradh 				data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1750e144ff40Sriastradh 					PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1751e144ff40Sriastradh 				if (orig != data)
1752e144ff40Sriastradh 					WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1753e144ff40Sriastradh 
1754e144ff40Sriastradh 				orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1755e144ff40Sriastradh 				data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1756e144ff40Sriastradh 					THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1757e144ff40Sriastradh 				data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1758e144ff40Sriastradh 					(1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1759e144ff40Sriastradh 				if (orig != data)
1760e144ff40Sriastradh 					WREG32_SMC(ixTHM_CLK_CNTL, data);
1761e144ff40Sriastradh 
1762e144ff40Sriastradh 				orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1763e144ff40Sriastradh 				data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1764e144ff40Sriastradh 					MISC_CLK_CTRL__ZCLK_SEL_MASK);
1765e144ff40Sriastradh 				data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1766e144ff40Sriastradh 					(1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1767e144ff40Sriastradh 				if (orig != data)
1768e144ff40Sriastradh 					WREG32_SMC(ixMISC_CLK_CTRL, data);
1769e144ff40Sriastradh 
1770e144ff40Sriastradh 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1771e144ff40Sriastradh 				data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1772e144ff40Sriastradh 				if (orig != data)
1773e144ff40Sriastradh 					WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1774e144ff40Sriastradh 
1775e144ff40Sriastradh 				orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1776e144ff40Sriastradh 				data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1777e144ff40Sriastradh 				if (orig != data)
1778e144ff40Sriastradh 					WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1779e144ff40Sriastradh 
1780e144ff40Sriastradh 				orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1781e144ff40Sriastradh 				data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1782e144ff40Sriastradh 				data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1783e144ff40Sriastradh 				if (orig != data)
1784e144ff40Sriastradh 					WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1785e144ff40Sriastradh 			}
1786e144ff40Sriastradh 		}
1787e144ff40Sriastradh 	} else {
1788e144ff40Sriastradh 		if (orig != data)
1789e144ff40Sriastradh 			WREG32_PCIE(ixPCIE_LC_CNTL, data);
1790e144ff40Sriastradh 	}
1791e144ff40Sriastradh 
1792e144ff40Sriastradh 	orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1793e144ff40Sriastradh 	data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1794e144ff40Sriastradh 		PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1795e144ff40Sriastradh 		PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1796e144ff40Sriastradh 	if (orig != data)
1797e144ff40Sriastradh 		WREG32_PCIE(ixPCIE_CNTL2, data);
1798e144ff40Sriastradh 
1799e144ff40Sriastradh 	if (!disable_l0s) {
1800e144ff40Sriastradh 		data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1801e144ff40Sriastradh 		if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1802e144ff40Sriastradh 				PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1803e144ff40Sriastradh 			data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1804e144ff40Sriastradh 			if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1805e144ff40Sriastradh 			(data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1806e144ff40Sriastradh 				orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1807e144ff40Sriastradh 				data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1808e144ff40Sriastradh 				if (orig != data)
1809e144ff40Sriastradh 					WREG32_PCIE(ixPCIE_LC_CNTL, data);
1810e144ff40Sriastradh 			}
1811e144ff40Sriastradh 		}
1812e144ff40Sriastradh 	}
1813e144ff40Sriastradh }
1814e144ff40Sriastradh 
cik_get_rev_id(struct amdgpu_device * adev)1815e144ff40Sriastradh static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1816e144ff40Sriastradh {
1817e144ff40Sriastradh 	return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1818e144ff40Sriastradh 		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1819e144ff40Sriastradh }
1820e144ff40Sriastradh 
cik_detect_hw_virtualization(struct amdgpu_device * adev)182141ec0267Sriastradh static void cik_detect_hw_virtualization(struct amdgpu_device *adev)
1822e144ff40Sriastradh {
182341ec0267Sriastradh 	if (is_virtual_machine()) /* passthrough mode */
182441ec0267Sriastradh 		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
1825e144ff40Sriastradh }
1826e144ff40Sriastradh 
cik_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)182741ec0267Sriastradh static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
182841ec0267Sriastradh {
182941ec0267Sriastradh 	if (!ring || !ring->funcs->emit_wreg) {
183041ec0267Sriastradh 		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
183141ec0267Sriastradh 		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
183241ec0267Sriastradh 	} else {
183341ec0267Sriastradh 		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
183441ec0267Sriastradh 	}
183541ec0267Sriastradh }
183641ec0267Sriastradh 
cik_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)183741ec0267Sriastradh static void cik_invalidate_hdp(struct amdgpu_device *adev,
183841ec0267Sriastradh 			       struct amdgpu_ring *ring)
183941ec0267Sriastradh {
184041ec0267Sriastradh 	if (!ring || !ring->funcs->emit_wreg) {
184141ec0267Sriastradh 		WREG32(mmHDP_DEBUG0, 1);
184241ec0267Sriastradh 		RREG32(mmHDP_DEBUG0);
184341ec0267Sriastradh 	} else {
184441ec0267Sriastradh 		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
184541ec0267Sriastradh 	}
184641ec0267Sriastradh }
184741ec0267Sriastradh 
cik_need_full_reset(struct amdgpu_device * adev)184841ec0267Sriastradh static bool cik_need_full_reset(struct amdgpu_device *adev)
184941ec0267Sriastradh {
185041ec0267Sriastradh 	/* change this when we support soft reset */
185141ec0267Sriastradh 	return true;
185241ec0267Sriastradh }
185341ec0267Sriastradh 
cik_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)185441ec0267Sriastradh static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
185541ec0267Sriastradh 			       uint64_t *count1)
185641ec0267Sriastradh {
185741ec0267Sriastradh 	uint32_t perfctr = 0;
185841ec0267Sriastradh 	uint64_t cnt0_of, cnt1_of;
185941ec0267Sriastradh 	int tmp;
186041ec0267Sriastradh 
186141ec0267Sriastradh 	/* This reports 0 on APUs, so return to avoid writing/reading registers
186241ec0267Sriastradh 	 * that may or may not be different from their GPU counterparts
186341ec0267Sriastradh 	 */
186441ec0267Sriastradh 	if (adev->flags & AMD_IS_APU)
186541ec0267Sriastradh 		return;
186641ec0267Sriastradh 
186741ec0267Sriastradh 	/* Set the 2 events that we wish to watch, defined above */
186841ec0267Sriastradh 	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
186941ec0267Sriastradh 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
187041ec0267Sriastradh 	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
187141ec0267Sriastradh 
187241ec0267Sriastradh 	/* Write to enable desired perf counters */
187341ec0267Sriastradh 	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
187441ec0267Sriastradh 	/* Zero out and enable the perf counters
187541ec0267Sriastradh 	 * Write 0x5:
187641ec0267Sriastradh 	 * Bit 0 = Start all counters(1)
187741ec0267Sriastradh 	 * Bit 2 = Global counter reset enable(1)
187841ec0267Sriastradh 	 */
187941ec0267Sriastradh 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
188041ec0267Sriastradh 
188141ec0267Sriastradh 	msleep(1000);
188241ec0267Sriastradh 
188341ec0267Sriastradh 	/* Load the shadow and disable the perf counters
188441ec0267Sriastradh 	 * Write 0x2:
188541ec0267Sriastradh 	 * Bit 0 = Stop counters(0)
188641ec0267Sriastradh 	 * Bit 1 = Load the shadow counters(1)
188741ec0267Sriastradh 	 */
188841ec0267Sriastradh 	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
188941ec0267Sriastradh 
189041ec0267Sriastradh 	/* Read register values to get any >32bit overflow */
189141ec0267Sriastradh 	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
189241ec0267Sriastradh 	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
189341ec0267Sriastradh 	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
189441ec0267Sriastradh 
189541ec0267Sriastradh 	/* Get the values and add the overflow */
189641ec0267Sriastradh 	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
189741ec0267Sriastradh 	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
189841ec0267Sriastradh }
189941ec0267Sriastradh 
cik_need_reset_on_init(struct amdgpu_device * adev)190041ec0267Sriastradh static bool cik_need_reset_on_init(struct amdgpu_device *adev)
190141ec0267Sriastradh {
190241ec0267Sriastradh 	u32 clock_cntl, pc;
190341ec0267Sriastradh 
190441ec0267Sriastradh 	if (adev->flags & AMD_IS_APU)
190541ec0267Sriastradh 		return false;
190641ec0267Sriastradh 
190741ec0267Sriastradh 	/* check if the SMC is already running */
190841ec0267Sriastradh 	clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
190941ec0267Sriastradh 	pc = RREG32_SMC(ixSMC_PC_C);
191041ec0267Sriastradh 	if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
191141ec0267Sriastradh 	    (0x20100 <= pc))
191241ec0267Sriastradh 		return true;
191341ec0267Sriastradh 
191441ec0267Sriastradh 	return false;
191541ec0267Sriastradh }
191641ec0267Sriastradh 
cik_get_pcie_replay_count(struct amdgpu_device * adev)191741ec0267Sriastradh static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
191841ec0267Sriastradh {
191941ec0267Sriastradh 	uint64_t nak_r, nak_g;
192041ec0267Sriastradh 
192141ec0267Sriastradh 	/* Get the number of NAKs received and generated */
192241ec0267Sriastradh 	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
192341ec0267Sriastradh 	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
192441ec0267Sriastradh 
192541ec0267Sriastradh 	/* Add the total number of NAKs, i.e the number of replays */
192641ec0267Sriastradh 	return (nak_r + nak_g);
1927e144ff40Sriastradh }
1928e144ff40Sriastradh 
1929e144ff40Sriastradh static const struct amdgpu_asic_funcs cik_asic_funcs =
1930e144ff40Sriastradh {
1931e144ff40Sriastradh 	.read_disabled_bios = &cik_read_disabled_bios,
193241ec0267Sriastradh 	.read_bios_from_rom = &cik_read_bios_from_rom,
1933e144ff40Sriastradh 	.read_register = &cik_read_register,
1934e144ff40Sriastradh 	.reset = &cik_asic_reset,
193541ec0267Sriastradh 	.reset_method = &cik_asic_reset_method,
1936e144ff40Sriastradh 	.set_vga_state = &cik_vga_set_state,
1937e144ff40Sriastradh 	.get_xclk = &cik_get_xclk,
1938e144ff40Sriastradh 	.set_uvd_clocks = &cik_set_uvd_clocks,
1939e144ff40Sriastradh 	.set_vce_clocks = &cik_set_vce_clocks,
194041ec0267Sriastradh 	.get_config_memsize = &cik_get_config_memsize,
194141ec0267Sriastradh 	.flush_hdp = &cik_flush_hdp,
194241ec0267Sriastradh 	.invalidate_hdp = &cik_invalidate_hdp,
194341ec0267Sriastradh 	.need_full_reset = &cik_need_full_reset,
194441ec0267Sriastradh 	.init_doorbell_index = &legacy_doorbell_index_init,
194541ec0267Sriastradh 	.get_pcie_usage = &cik_get_pcie_usage,
194641ec0267Sriastradh 	.need_reset_on_init = &cik_need_reset_on_init,
194741ec0267Sriastradh 	.get_pcie_replay_count = &cik_get_pcie_replay_count,
194841ec0267Sriastradh 	.supports_baco = &cik_asic_supports_baco,
1949e144ff40Sriastradh };
1950e144ff40Sriastradh 
cik_common_early_init(void * handle)1951e144ff40Sriastradh static int cik_common_early_init(void *handle)
1952e144ff40Sriastradh {
1953e144ff40Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1954e144ff40Sriastradh 
1955e144ff40Sriastradh 	adev->smc_rreg = &cik_smc_rreg;
1956e144ff40Sriastradh 	adev->smc_wreg = &cik_smc_wreg;
1957e144ff40Sriastradh 	adev->pcie_rreg = &cik_pcie_rreg;
1958e144ff40Sriastradh 	adev->pcie_wreg = &cik_pcie_wreg;
1959e144ff40Sriastradh 	adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
1960e144ff40Sriastradh 	adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
1961e144ff40Sriastradh 	adev->didt_rreg = &cik_didt_rreg;
1962e144ff40Sriastradh 	adev->didt_wreg = &cik_didt_wreg;
1963e144ff40Sriastradh 
1964e144ff40Sriastradh 	adev->asic_funcs = &cik_asic_funcs;
1965e144ff40Sriastradh 
1966e144ff40Sriastradh 	adev->rev_id = cik_get_rev_id(adev);
1967e144ff40Sriastradh 	adev->external_rev_id = 0xFF;
1968e144ff40Sriastradh 	switch (adev->asic_type) {
1969e144ff40Sriastradh 	case CHIP_BONAIRE:
1970e144ff40Sriastradh 		adev->cg_flags =
197141ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGCG |
197241ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGLS |
197341ec0267Sriastradh 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
197441ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGLS |
197541ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS |
197641ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS_LS |
197741ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CP_LS |
197841ec0267Sriastradh 			AMD_CG_SUPPORT_MC_LS |
197941ec0267Sriastradh 			AMD_CG_SUPPORT_MC_MGCG |
198041ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_MGCG |
198141ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_LS |
198241ec0267Sriastradh 			AMD_CG_SUPPORT_BIF_LS |
198341ec0267Sriastradh 			AMD_CG_SUPPORT_VCE_MGCG |
198441ec0267Sriastradh 			AMD_CG_SUPPORT_UVD_MGCG |
198541ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_LS |
198641ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_MGCG;
1987e144ff40Sriastradh 		adev->pg_flags = 0;
1988e144ff40Sriastradh 		adev->external_rev_id = adev->rev_id + 0x14;
1989e144ff40Sriastradh 		break;
1990e144ff40Sriastradh 	case CHIP_HAWAII:
1991e144ff40Sriastradh 		adev->cg_flags =
199241ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGCG |
199341ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGLS |
199441ec0267Sriastradh 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
199541ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGLS |
199641ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS |
199741ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CP_LS |
199841ec0267Sriastradh 			AMD_CG_SUPPORT_MC_LS |
199941ec0267Sriastradh 			AMD_CG_SUPPORT_MC_MGCG |
200041ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_MGCG |
200141ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_LS |
200241ec0267Sriastradh 			AMD_CG_SUPPORT_BIF_LS |
200341ec0267Sriastradh 			AMD_CG_SUPPORT_VCE_MGCG |
200441ec0267Sriastradh 			AMD_CG_SUPPORT_UVD_MGCG |
200541ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_LS |
200641ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_MGCG;
2007e144ff40Sriastradh 		adev->pg_flags = 0;
2008e144ff40Sriastradh 		adev->external_rev_id = 0x28;
2009e144ff40Sriastradh 		break;
2010e144ff40Sriastradh 	case CHIP_KAVERI:
2011e144ff40Sriastradh 		adev->cg_flags =
201241ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGCG |
201341ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGLS |
201441ec0267Sriastradh 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
201541ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGLS |
201641ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS |
201741ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS_LS |
201841ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CP_LS |
201941ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_MGCG |
202041ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_LS |
202141ec0267Sriastradh 			AMD_CG_SUPPORT_BIF_LS |
202241ec0267Sriastradh 			AMD_CG_SUPPORT_VCE_MGCG |
202341ec0267Sriastradh 			AMD_CG_SUPPORT_UVD_MGCG |
202441ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_LS |
202541ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_MGCG;
2026e144ff40Sriastradh 		adev->pg_flags =
202741ec0267Sriastradh 			/*AMD_PG_SUPPORT_GFX_PG |
202841ec0267Sriastradh 			  AMD_PG_SUPPORT_GFX_SMG |
202941ec0267Sriastradh 			  AMD_PG_SUPPORT_GFX_DMG |*/
203041ec0267Sriastradh 			AMD_PG_SUPPORT_UVD |
203141ec0267Sriastradh 			AMD_PG_SUPPORT_VCE |
203241ec0267Sriastradh 			/*  AMD_PG_SUPPORT_CP |
203341ec0267Sriastradh 			  AMD_PG_SUPPORT_GDS |
203441ec0267Sriastradh 			  AMD_PG_SUPPORT_RLC_SMU_HS |
203541ec0267Sriastradh 			  AMD_PG_SUPPORT_ACP |
203641ec0267Sriastradh 			  AMD_PG_SUPPORT_SAMU |*/
2037e144ff40Sriastradh 			0;
2038e144ff40Sriastradh 		if (adev->pdev->device == 0x1312 ||
2039e144ff40Sriastradh 			adev->pdev->device == 0x1316 ||
2040e144ff40Sriastradh 			adev->pdev->device == 0x1317)
2041e144ff40Sriastradh 			adev->external_rev_id = 0x41;
2042e144ff40Sriastradh 		else
2043e144ff40Sriastradh 			adev->external_rev_id = 0x1;
2044e144ff40Sriastradh 		break;
2045e144ff40Sriastradh 	case CHIP_KABINI:
2046e144ff40Sriastradh 	case CHIP_MULLINS:
2047e144ff40Sriastradh 		adev->cg_flags =
204841ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGCG |
204941ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_MGLS |
205041ec0267Sriastradh 			/*AMD_CG_SUPPORT_GFX_CGCG |*/
205141ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGLS |
205241ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS |
205341ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CGTS_LS |
205441ec0267Sriastradh 			AMD_CG_SUPPORT_GFX_CP_LS |
205541ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_MGCG |
205641ec0267Sriastradh 			AMD_CG_SUPPORT_SDMA_LS |
205741ec0267Sriastradh 			AMD_CG_SUPPORT_BIF_LS |
205841ec0267Sriastradh 			AMD_CG_SUPPORT_VCE_MGCG |
205941ec0267Sriastradh 			AMD_CG_SUPPORT_UVD_MGCG |
206041ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_LS |
206141ec0267Sriastradh 			AMD_CG_SUPPORT_HDP_MGCG;
2062e144ff40Sriastradh 		adev->pg_flags =
206341ec0267Sriastradh 			/*AMD_PG_SUPPORT_GFX_PG |
206441ec0267Sriastradh 			  AMD_PG_SUPPORT_GFX_SMG | */
206541ec0267Sriastradh 			AMD_PG_SUPPORT_UVD |
206641ec0267Sriastradh 			/*AMD_PG_SUPPORT_VCE |
206741ec0267Sriastradh 			  AMD_PG_SUPPORT_CP |
206841ec0267Sriastradh 			  AMD_PG_SUPPORT_GDS |
206941ec0267Sriastradh 			  AMD_PG_SUPPORT_RLC_SMU_HS |
207041ec0267Sriastradh 			  AMD_PG_SUPPORT_SAMU |*/
2071e144ff40Sriastradh 			0;
2072e144ff40Sriastradh 		if (adev->asic_type == CHIP_KABINI) {
2073e144ff40Sriastradh 			if (adev->rev_id == 0)
2074e144ff40Sriastradh 				adev->external_rev_id = 0x81;
2075e144ff40Sriastradh 			else if (adev->rev_id == 1)
2076e144ff40Sriastradh 				adev->external_rev_id = 0x82;
2077e144ff40Sriastradh 			else if (adev->rev_id == 2)
2078e144ff40Sriastradh 				adev->external_rev_id = 0x85;
2079e144ff40Sriastradh 		} else
2080e144ff40Sriastradh 			adev->external_rev_id = adev->rev_id + 0xa1;
2081e144ff40Sriastradh 		break;
2082e144ff40Sriastradh 	default:
2083e144ff40Sriastradh 		/* FIXME: not supported yet */
2084e144ff40Sriastradh 		return -EINVAL;
2085e144ff40Sriastradh 	}
2086e144ff40Sriastradh 
2087e144ff40Sriastradh 	return 0;
2088e144ff40Sriastradh }
2089e144ff40Sriastradh 
cik_common_sw_init(void * handle)2090e144ff40Sriastradh static int cik_common_sw_init(void *handle)
2091e144ff40Sriastradh {
2092e144ff40Sriastradh 	return 0;
2093e144ff40Sriastradh }
2094e144ff40Sriastradh 
cik_common_sw_fini(void * handle)2095e144ff40Sriastradh static int cik_common_sw_fini(void *handle)
2096e144ff40Sriastradh {
2097e144ff40Sriastradh 	return 0;
2098e144ff40Sriastradh }
2099e144ff40Sriastradh 
cik_common_hw_init(void * handle)2100e144ff40Sriastradh static int cik_common_hw_init(void *handle)
2101e144ff40Sriastradh {
2102e144ff40Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2103e144ff40Sriastradh 
2104e144ff40Sriastradh 	/* move the golden regs per IP block */
2105e144ff40Sriastradh 	cik_init_golden_registers(adev);
2106e144ff40Sriastradh 	/* enable pcie gen2/3 link */
2107e144ff40Sriastradh 	cik_pcie_gen3_enable(adev);
2108e144ff40Sriastradh 	/* enable aspm */
2109e144ff40Sriastradh 	cik_program_aspm(adev);
2110e144ff40Sriastradh 
2111e144ff40Sriastradh 	return 0;
2112e144ff40Sriastradh }
2113e144ff40Sriastradh 
cik_common_hw_fini(void * handle)2114e144ff40Sriastradh static int cik_common_hw_fini(void *handle)
2115e144ff40Sriastradh {
2116e144ff40Sriastradh 	return 0;
2117e144ff40Sriastradh }
2118e144ff40Sriastradh 
cik_common_suspend(void * handle)2119e144ff40Sriastradh static int cik_common_suspend(void *handle)
2120e144ff40Sriastradh {
2121e144ff40Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2122e144ff40Sriastradh 
2123e144ff40Sriastradh 	return cik_common_hw_fini(adev);
2124e144ff40Sriastradh }
2125e144ff40Sriastradh 
cik_common_resume(void * handle)2126e144ff40Sriastradh static int cik_common_resume(void *handle)
2127e144ff40Sriastradh {
2128e144ff40Sriastradh 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2129e144ff40Sriastradh 
213041ec0267Sriastradh 	return cik_common_hw_init(adev);
2131e144ff40Sriastradh }
2132e144ff40Sriastradh 
cik_common_is_idle(void * handle)2133e144ff40Sriastradh static bool cik_common_is_idle(void *handle)
2134e144ff40Sriastradh {
2135e144ff40Sriastradh 	return true;
2136e144ff40Sriastradh }
2137e144ff40Sriastradh 
cik_common_wait_for_idle(void * handle)2138e144ff40Sriastradh static int cik_common_wait_for_idle(void *handle)
2139e144ff40Sriastradh {
2140e144ff40Sriastradh 	return 0;
2141e144ff40Sriastradh }
2142e144ff40Sriastradh 
cik_common_soft_reset(void * handle)2143e144ff40Sriastradh static int cik_common_soft_reset(void *handle)
2144e144ff40Sriastradh {
2145e144ff40Sriastradh 	/* XXX hard reset?? */
2146e144ff40Sriastradh 	return 0;
2147e144ff40Sriastradh }
2148e144ff40Sriastradh 
cik_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)2149e144ff40Sriastradh static int cik_common_set_clockgating_state(void *handle,
2150e144ff40Sriastradh 					    enum amd_clockgating_state state)
2151e144ff40Sriastradh {
2152e144ff40Sriastradh 	return 0;
2153e144ff40Sriastradh }
2154e144ff40Sriastradh 
cik_common_set_powergating_state(void * handle,enum amd_powergating_state state)2155e144ff40Sriastradh static int cik_common_set_powergating_state(void *handle,
2156e144ff40Sriastradh 					    enum amd_powergating_state state)
2157e144ff40Sriastradh {
2158e144ff40Sriastradh 	return 0;
2159e144ff40Sriastradh }
2160e144ff40Sriastradh 
216141ec0267Sriastradh static const struct amd_ip_funcs cik_common_ip_funcs = {
216241ec0267Sriastradh 	.name = "cik_common",
2163e144ff40Sriastradh 	.early_init = cik_common_early_init,
2164e144ff40Sriastradh 	.late_init = NULL,
2165e144ff40Sriastradh 	.sw_init = cik_common_sw_init,
2166e144ff40Sriastradh 	.sw_fini = cik_common_sw_fini,
2167e144ff40Sriastradh 	.hw_init = cik_common_hw_init,
2168e144ff40Sriastradh 	.hw_fini = cik_common_hw_fini,
2169e144ff40Sriastradh 	.suspend = cik_common_suspend,
2170e144ff40Sriastradh 	.resume = cik_common_resume,
2171e144ff40Sriastradh 	.is_idle = cik_common_is_idle,
2172e144ff40Sriastradh 	.wait_for_idle = cik_common_wait_for_idle,
2173e144ff40Sriastradh 	.soft_reset = cik_common_soft_reset,
2174e144ff40Sriastradh 	.set_clockgating_state = cik_common_set_clockgating_state,
2175e144ff40Sriastradh 	.set_powergating_state = cik_common_set_powergating_state,
2176e144ff40Sriastradh };
217741ec0267Sriastradh 
217841ec0267Sriastradh static const struct amdgpu_ip_block_version cik_common_ip_block =
217941ec0267Sriastradh {
218041ec0267Sriastradh 	.type = AMD_IP_BLOCK_TYPE_COMMON,
218141ec0267Sriastradh 	.major = 1,
218241ec0267Sriastradh 	.minor = 0,
218341ec0267Sriastradh 	.rev = 0,
218441ec0267Sriastradh 	.funcs = &cik_common_ip_funcs,
218541ec0267Sriastradh };
218641ec0267Sriastradh 
cik_set_ip_blocks(struct amdgpu_device * adev)218741ec0267Sriastradh int cik_set_ip_blocks(struct amdgpu_device *adev)
218841ec0267Sriastradh {
218941ec0267Sriastradh 	cik_detect_hw_virtualization(adev);
219041ec0267Sriastradh 
219141ec0267Sriastradh 	switch (adev->asic_type) {
219241ec0267Sriastradh 	case CHIP_BONAIRE:
219341ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
219441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
219541ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
219641ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
219741ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
219841ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
219941ec0267Sriastradh 		if (adev->enable_virtual_display)
220041ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
220141ec0267Sriastradh #if defined(CONFIG_DRM_AMD_DC)
220241ec0267Sriastradh 		else if (amdgpu_device_has_dc_support(adev))
220341ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
220441ec0267Sriastradh #endif
220541ec0267Sriastradh 		else
220641ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
220741ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
220841ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
220941ec0267Sriastradh 		break;
221041ec0267Sriastradh 	case CHIP_HAWAII:
221141ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
221241ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
221341ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
221441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
221541ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
221641ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
221741ec0267Sriastradh 		if (adev->enable_virtual_display)
221841ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
221941ec0267Sriastradh #if defined(CONFIG_DRM_AMD_DC)
222041ec0267Sriastradh 		else if (amdgpu_device_has_dc_support(adev))
222141ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
222241ec0267Sriastradh #endif
222341ec0267Sriastradh 		else
222441ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
222541ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
222641ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
222741ec0267Sriastradh 		break;
222841ec0267Sriastradh 	case CHIP_KAVERI:
222941ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
223041ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
223141ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
223241ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
223341ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
223441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
223541ec0267Sriastradh 		if (adev->enable_virtual_display)
223641ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
223741ec0267Sriastradh #if defined(CONFIG_DRM_AMD_DC)
223841ec0267Sriastradh 		else if (amdgpu_device_has_dc_support(adev))
223941ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
224041ec0267Sriastradh #endif
224141ec0267Sriastradh 		else
224241ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
224341ec0267Sriastradh 
224441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
224541ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
224641ec0267Sriastradh 		break;
224741ec0267Sriastradh 	case CHIP_KABINI:
224841ec0267Sriastradh 	case CHIP_MULLINS:
224941ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
225041ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
225141ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
225241ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
225341ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
225441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
225541ec0267Sriastradh 		if (adev->enable_virtual_display)
225641ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
225741ec0267Sriastradh #if defined(CONFIG_DRM_AMD_DC)
225841ec0267Sriastradh 		else if (amdgpu_device_has_dc_support(adev))
225941ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dm_ip_block);
226041ec0267Sriastradh #endif
226141ec0267Sriastradh 		else
226241ec0267Sriastradh 			amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
226341ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
226441ec0267Sriastradh 		amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
226541ec0267Sriastradh 		break;
226641ec0267Sriastradh 	default:
226741ec0267Sriastradh 		/* FIXME: not supported yet */
226841ec0267Sriastradh 		return -EINVAL;
226941ec0267Sriastradh 	}
227041ec0267Sriastradh 	return 0;
227141ec0267Sriastradh }
2272