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, ÷rs);
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, ÷rs);
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