1a2e73f56SAlex Deucher /*
2a2e73f56SAlex Deucher * Copyright 2012 Advanced Micro Devices, Inc.
3a2e73f56SAlex Deucher *
4a2e73f56SAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a
5a2e73f56SAlex Deucher * copy of this software and associated documentation files (the "Software"),
6a2e73f56SAlex Deucher * to deal in the Software without restriction, including without limitation
7a2e73f56SAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a2e73f56SAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the
9a2e73f56SAlex Deucher * Software is furnished to do so, subject to the following conditions:
10a2e73f56SAlex Deucher *
11a2e73f56SAlex Deucher * The above copyright notice and this permission notice shall be included in
12a2e73f56SAlex Deucher * all copies or substantial portions of the Software.
13a2e73f56SAlex Deucher *
14a2e73f56SAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15a2e73f56SAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16a2e73f56SAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17a2e73f56SAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18a2e73f56SAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19a2e73f56SAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20a2e73f56SAlex Deucher * OTHER DEALINGS IN THE SOFTWARE.
21a2e73f56SAlex Deucher *
22a2e73f56SAlex Deucher * Authors: Alex Deucher
23a2e73f56SAlex Deucher */
24a2e73f56SAlex Deucher #include <linux/firmware.h>
25a2e73f56SAlex Deucher #include <linux/slab.h>
26a2e73f56SAlex Deucher #include <linux/module.h>
2747b757fbSSam Ravnborg #include <linux/pci.h>
2847b757fbSSam Ravnborg
296f786950SAlex Deucher #include <drm/amdgpu_drm.h>
306f786950SAlex Deucher
31a2e73f56SAlex Deucher #include "amdgpu.h"
32a2e73f56SAlex Deucher #include "amdgpu_atombios.h"
33a2e73f56SAlex Deucher #include "amdgpu_ih.h"
34a2e73f56SAlex Deucher #include "amdgpu_uvd.h"
35a2e73f56SAlex Deucher #include "amdgpu_vce.h"
36a2e73f56SAlex Deucher #include "cikd.h"
37a2e73f56SAlex Deucher #include "atom.h"
38d0dd7f0cSAlex Deucher #include "amd_pcie.h"
39a2e73f56SAlex Deucher
40a2e73f56SAlex Deucher #include "cik.h"
41a2e73f56SAlex Deucher #include "gmc_v7_0.h"
42a2e73f56SAlex Deucher #include "cik_ih.h"
43a2e73f56SAlex Deucher #include "dce_v8_0.h"
44a2e73f56SAlex Deucher #include "gfx_v7_0.h"
45a2e73f56SAlex Deucher #include "cik_sdma.h"
46a2e73f56SAlex Deucher #include "uvd_v4_2.h"
47a2e73f56SAlex Deucher #include "vce_v2_0.h"
48a2e73f56SAlex Deucher #include "cik_dpm.h"
49a2e73f56SAlex Deucher
50a2e73f56SAlex Deucher #include "uvd/uvd_4_2_d.h"
51a2e73f56SAlex Deucher
52a2e73f56SAlex Deucher #include "smu/smu_7_0_1_d.h"
53a2e73f56SAlex Deucher #include "smu/smu_7_0_1_sh_mask.h"
54a2e73f56SAlex Deucher
55a2e73f56SAlex Deucher #include "dce/dce_8_0_d.h"
56a2e73f56SAlex Deucher #include "dce/dce_8_0_sh_mask.h"
57a2e73f56SAlex Deucher
58a2e73f56SAlex Deucher #include "bif/bif_4_1_d.h"
59a2e73f56SAlex Deucher #include "bif/bif_4_1_sh_mask.h"
60a2e73f56SAlex Deucher
61a2e73f56SAlex Deucher #include "gca/gfx_7_2_d.h"
62a2e73f56SAlex Deucher #include "gca/gfx_7_2_enum.h"
63a2e73f56SAlex Deucher #include "gca/gfx_7_2_sh_mask.h"
64a2e73f56SAlex Deucher
65a2e73f56SAlex Deucher #include "gmc/gmc_7_1_d.h"
66a2e73f56SAlex Deucher #include "gmc/gmc_7_1_sh_mask.h"
67a2e73f56SAlex Deucher
68a2e73f56SAlex Deucher #include "oss/oss_2_0_d.h"
69a2e73f56SAlex Deucher #include "oss/oss_2_0_sh_mask.h"
70a2e73f56SAlex Deucher
714562236bSHarry Wentland #include "amdgpu_dm.h"
72130e0371SOded Gabbay #include "amdgpu_amdkfd.h"
73733ee71aSRyan Taylor #include "amdgpu_vkms.h"
74130e0371SOded Gabbay
753b246e8bSAlex Deucher static const struct amdgpu_video_codec_info cik_video_codecs_encode_array[] =
763b246e8bSAlex Deucher {
773b246e8bSAlex Deucher {
786f786950SAlex Deucher .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
793b246e8bSAlex Deucher .max_width = 2048,
803b246e8bSAlex Deucher .max_height = 1152,
813b246e8bSAlex Deucher .max_pixels_per_frame = 2048 * 1152,
823b246e8bSAlex Deucher .max_level = 0,
833b246e8bSAlex Deucher },
843b246e8bSAlex Deucher };
853b246e8bSAlex Deucher
863b246e8bSAlex Deucher static const struct amdgpu_video_codecs cik_video_codecs_encode =
873b246e8bSAlex Deucher {
883b246e8bSAlex Deucher .codec_count = ARRAY_SIZE(cik_video_codecs_encode_array),
893b246e8bSAlex Deucher .codec_array = cik_video_codecs_encode_array,
903b246e8bSAlex Deucher };
913b246e8bSAlex Deucher
923b246e8bSAlex Deucher static const struct amdgpu_video_codec_info cik_video_codecs_decode_array[] =
933b246e8bSAlex Deucher {
943b246e8bSAlex Deucher {
956f786950SAlex Deucher .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
963b246e8bSAlex Deucher .max_width = 2048,
973b246e8bSAlex Deucher .max_height = 1152,
983b246e8bSAlex Deucher .max_pixels_per_frame = 2048 * 1152,
993b246e8bSAlex Deucher .max_level = 3,
1003b246e8bSAlex Deucher },
1013b246e8bSAlex Deucher {
1026f786950SAlex Deucher .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
1033b246e8bSAlex Deucher .max_width = 2048,
1043b246e8bSAlex Deucher .max_height = 1152,
1053b246e8bSAlex Deucher .max_pixels_per_frame = 2048 * 1152,
1063b246e8bSAlex Deucher .max_level = 5,
1073b246e8bSAlex Deucher },
1083b246e8bSAlex Deucher {
1096f786950SAlex Deucher .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1103b246e8bSAlex Deucher .max_width = 2048,
1113b246e8bSAlex Deucher .max_height = 1152,
1123b246e8bSAlex Deucher .max_pixels_per_frame = 2048 * 1152,
1133b246e8bSAlex Deucher .max_level = 41,
1143b246e8bSAlex Deucher },
1153b246e8bSAlex Deucher {
1166f786950SAlex Deucher .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
1173b246e8bSAlex Deucher .max_width = 2048,
1183b246e8bSAlex Deucher .max_height = 1152,
1193b246e8bSAlex Deucher .max_pixels_per_frame = 2048 * 1152,
1203b246e8bSAlex Deucher .max_level = 4,
1213b246e8bSAlex Deucher },
1223b246e8bSAlex Deucher };
1233b246e8bSAlex Deucher
1243b246e8bSAlex Deucher static const struct amdgpu_video_codecs cik_video_codecs_decode =
1253b246e8bSAlex Deucher {
1263b246e8bSAlex Deucher .codec_count = ARRAY_SIZE(cik_video_codecs_decode_array),
1273b246e8bSAlex Deucher .codec_array = cik_video_codecs_decode_array,
1283b246e8bSAlex Deucher };
1293b246e8bSAlex Deucher
cik_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)1303b246e8bSAlex Deucher static int cik_query_video_codecs(struct amdgpu_device *adev, bool encode,
1313b246e8bSAlex Deucher const struct amdgpu_video_codecs **codecs)
1323b246e8bSAlex Deucher {
1333b246e8bSAlex Deucher switch (adev->asic_type) {
1343b246e8bSAlex Deucher case CHIP_BONAIRE:
1353b246e8bSAlex Deucher case CHIP_HAWAII:
1363b246e8bSAlex Deucher case CHIP_KAVERI:
1373b246e8bSAlex Deucher case CHIP_KABINI:
1383b246e8bSAlex Deucher case CHIP_MULLINS:
1393b246e8bSAlex Deucher if (encode)
1403b246e8bSAlex Deucher *codecs = &cik_video_codecs_encode;
1413b246e8bSAlex Deucher else
1423b246e8bSAlex Deucher *codecs = &cik_video_codecs_decode;
1433b246e8bSAlex Deucher return 0;
1443b246e8bSAlex Deucher default:
1453b246e8bSAlex Deucher return -EINVAL;
1463b246e8bSAlex Deucher }
1473b246e8bSAlex Deucher }
1483b246e8bSAlex Deucher
149a2e73f56SAlex Deucher /*
150a2e73f56SAlex Deucher * Indirect registers accessor
151a2e73f56SAlex Deucher */
cik_pcie_rreg(struct amdgpu_device * adev,u32 reg)152a2e73f56SAlex Deucher static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
153a2e73f56SAlex Deucher {
154a2e73f56SAlex Deucher unsigned long flags;
155a2e73f56SAlex Deucher u32 r;
156a2e73f56SAlex Deucher
157a2e73f56SAlex Deucher spin_lock_irqsave(&adev->pcie_idx_lock, flags);
158a2e73f56SAlex Deucher WREG32(mmPCIE_INDEX, reg);
159a2e73f56SAlex Deucher (void)RREG32(mmPCIE_INDEX);
160a2e73f56SAlex Deucher r = RREG32(mmPCIE_DATA);
161a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
162a2e73f56SAlex Deucher return r;
163a2e73f56SAlex Deucher }
164a2e73f56SAlex Deucher
cik_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)165a2e73f56SAlex Deucher static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
166a2e73f56SAlex Deucher {
167a2e73f56SAlex Deucher unsigned long flags;
168a2e73f56SAlex Deucher
169a2e73f56SAlex Deucher spin_lock_irqsave(&adev->pcie_idx_lock, flags);
170a2e73f56SAlex Deucher WREG32(mmPCIE_INDEX, reg);
171a2e73f56SAlex Deucher (void)RREG32(mmPCIE_INDEX);
172a2e73f56SAlex Deucher WREG32(mmPCIE_DATA, v);
173a2e73f56SAlex Deucher (void)RREG32(mmPCIE_DATA);
174a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
175a2e73f56SAlex Deucher }
176a2e73f56SAlex Deucher
cik_smc_rreg(struct amdgpu_device * adev,u32 reg)177a2e73f56SAlex Deucher static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
178a2e73f56SAlex Deucher {
179a2e73f56SAlex Deucher unsigned long flags;
180a2e73f56SAlex Deucher u32 r;
181a2e73f56SAlex Deucher
182a2e73f56SAlex Deucher spin_lock_irqsave(&adev->smc_idx_lock, flags);
183a2e73f56SAlex Deucher WREG32(mmSMC_IND_INDEX_0, (reg));
184a2e73f56SAlex Deucher r = RREG32(mmSMC_IND_DATA_0);
185a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
186a2e73f56SAlex Deucher return r;
187a2e73f56SAlex Deucher }
188a2e73f56SAlex Deucher
cik_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)189a2e73f56SAlex Deucher static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
190a2e73f56SAlex Deucher {
191a2e73f56SAlex Deucher unsigned long flags;
192a2e73f56SAlex Deucher
193a2e73f56SAlex Deucher spin_lock_irqsave(&adev->smc_idx_lock, flags);
194a2e73f56SAlex Deucher WREG32(mmSMC_IND_INDEX_0, (reg));
195a2e73f56SAlex Deucher WREG32(mmSMC_IND_DATA_0, (v));
196a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
197a2e73f56SAlex Deucher }
198a2e73f56SAlex Deucher
cik_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)199a2e73f56SAlex Deucher static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
200a2e73f56SAlex Deucher {
201a2e73f56SAlex Deucher unsigned long flags;
202a2e73f56SAlex Deucher u32 r;
203a2e73f56SAlex Deucher
204a2e73f56SAlex Deucher spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
205a2e73f56SAlex Deucher WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
206a2e73f56SAlex Deucher r = RREG32(mmUVD_CTX_DATA);
207a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
208a2e73f56SAlex Deucher return r;
209a2e73f56SAlex Deucher }
210a2e73f56SAlex Deucher
cik_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)211a2e73f56SAlex Deucher static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
212a2e73f56SAlex Deucher {
213a2e73f56SAlex Deucher unsigned long flags;
214a2e73f56SAlex Deucher
215a2e73f56SAlex Deucher spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
216a2e73f56SAlex Deucher WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
217a2e73f56SAlex Deucher WREG32(mmUVD_CTX_DATA, (v));
218a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
219a2e73f56SAlex Deucher }
220a2e73f56SAlex Deucher
cik_didt_rreg(struct amdgpu_device * adev,u32 reg)221a2e73f56SAlex Deucher static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
222a2e73f56SAlex Deucher {
223a2e73f56SAlex Deucher unsigned long flags;
224a2e73f56SAlex Deucher u32 r;
225a2e73f56SAlex Deucher
226a2e73f56SAlex Deucher spin_lock_irqsave(&adev->didt_idx_lock, flags);
227a2e73f56SAlex Deucher WREG32(mmDIDT_IND_INDEX, (reg));
228a2e73f56SAlex Deucher r = RREG32(mmDIDT_IND_DATA);
229a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
230a2e73f56SAlex Deucher return r;
231a2e73f56SAlex Deucher }
232a2e73f56SAlex Deucher
cik_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)233a2e73f56SAlex Deucher static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
234a2e73f56SAlex Deucher {
235a2e73f56SAlex Deucher unsigned long flags;
236a2e73f56SAlex Deucher
237a2e73f56SAlex Deucher spin_lock_irqsave(&adev->didt_idx_lock, flags);
238a2e73f56SAlex Deucher WREG32(mmDIDT_IND_INDEX, (reg));
239a2e73f56SAlex Deucher WREG32(mmDIDT_IND_DATA, (v));
240a2e73f56SAlex Deucher spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
241a2e73f56SAlex Deucher }
242a2e73f56SAlex Deucher
243a2e73f56SAlex Deucher static const u32 bonaire_golden_spm_registers[] =
244a2e73f56SAlex Deucher {
245a2e73f56SAlex Deucher 0xc200, 0xe0ffffff, 0xe0000000
246a2e73f56SAlex Deucher };
247a2e73f56SAlex Deucher
248a2e73f56SAlex Deucher static const u32 bonaire_golden_common_registers[] =
249a2e73f56SAlex Deucher {
250a2e73f56SAlex Deucher 0x31dc, 0xffffffff, 0x00000800,
251a2e73f56SAlex Deucher 0x31dd, 0xffffffff, 0x00000800,
252a2e73f56SAlex Deucher 0x31e6, 0xffffffff, 0x00007fbf,
253a2e73f56SAlex Deucher 0x31e7, 0xffffffff, 0x00007faf
254a2e73f56SAlex Deucher };
255a2e73f56SAlex Deucher
256a2e73f56SAlex Deucher static const u32 bonaire_golden_registers[] =
257a2e73f56SAlex Deucher {
258a2e73f56SAlex Deucher 0xcd5, 0x00000333, 0x00000333,
259a2e73f56SAlex Deucher 0xcd4, 0x000c0fc0, 0x00040200,
260a2e73f56SAlex Deucher 0x2684, 0x00010000, 0x00058208,
261a2e73f56SAlex Deucher 0xf000, 0xffff1fff, 0x00140000,
262a2e73f56SAlex Deucher 0xf080, 0xfdfc0fff, 0x00000100,
263a2e73f56SAlex Deucher 0xf08d, 0x40000000, 0x40000200,
264a2e73f56SAlex Deucher 0x260c, 0xffffffff, 0x00000000,
265a2e73f56SAlex Deucher 0x260d, 0xf00fffff, 0x00000400,
266a2e73f56SAlex Deucher 0x260e, 0x0002021c, 0x00020200,
267a2e73f56SAlex Deucher 0x31e, 0x00000080, 0x00000000,
268a2e73f56SAlex Deucher 0x16ec, 0x000000f0, 0x00000070,
269a2e73f56SAlex Deucher 0x16f0, 0xf0311fff, 0x80300000,
270a2e73f56SAlex Deucher 0x263e, 0x73773777, 0x12010001,
271a2e73f56SAlex Deucher 0xd43, 0x00810000, 0x408af000,
272a2e73f56SAlex Deucher 0x1c0c, 0x31000111, 0x00000011,
273a2e73f56SAlex Deucher 0xbd2, 0x73773777, 0x12010001,
274a2e73f56SAlex Deucher 0x883, 0x00007fb6, 0x0021a1b1,
275a2e73f56SAlex Deucher 0x884, 0x00007fb6, 0x002021b1,
276a2e73f56SAlex Deucher 0x860, 0x00007fb6, 0x00002191,
277a2e73f56SAlex Deucher 0x886, 0x00007fb6, 0x002121b1,
278a2e73f56SAlex Deucher 0x887, 0x00007fb6, 0x002021b1,
279a2e73f56SAlex Deucher 0x877, 0x00007fb6, 0x00002191,
280a2e73f56SAlex Deucher 0x878, 0x00007fb6, 0x00002191,
281a2e73f56SAlex Deucher 0xd8a, 0x0000003f, 0x0000000a,
282a2e73f56SAlex Deucher 0xd8b, 0x0000003f, 0x0000000a,
283a2e73f56SAlex Deucher 0xab9, 0x00073ffe, 0x000022a2,
284a2e73f56SAlex Deucher 0x903, 0x000007ff, 0x00000000,
285a2e73f56SAlex Deucher 0x2285, 0xf000003f, 0x00000007,
286a2e73f56SAlex Deucher 0x22fc, 0x00002001, 0x00000001,
287a2e73f56SAlex Deucher 0x22c9, 0xffffffff, 0x00ffffff,
288a2e73f56SAlex Deucher 0xc281, 0x0000ff0f, 0x00000000,
289a2e73f56SAlex Deucher 0xa293, 0x07ffffff, 0x06000000,
290a2e73f56SAlex Deucher 0x136, 0x00000fff, 0x00000100,
291a2e73f56SAlex Deucher 0xf9e, 0x00000001, 0x00000002,
292a2e73f56SAlex Deucher 0x2440, 0x03000000, 0x0362c688,
293a2e73f56SAlex Deucher 0x2300, 0x000000ff, 0x00000001,
294a2e73f56SAlex Deucher 0x390, 0x00001fff, 0x00001fff,
295a2e73f56SAlex Deucher 0x2418, 0x0000007f, 0x00000020,
296a2e73f56SAlex Deucher 0x2542, 0x00010000, 0x00010000,
297a2e73f56SAlex Deucher 0x2b05, 0x000003ff, 0x000000f3,
298a2e73f56SAlex Deucher 0x2b03, 0xffffffff, 0x00001032
299a2e73f56SAlex Deucher };
300a2e73f56SAlex Deucher
301a2e73f56SAlex Deucher static const u32 bonaire_mgcg_cgcg_init[] =
302a2e73f56SAlex Deucher {
303a2e73f56SAlex Deucher 0x3108, 0xffffffff, 0xfffffffc,
304a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
305a2e73f56SAlex Deucher 0xf0a8, 0xffffffff, 0x00000100,
306a2e73f56SAlex Deucher 0xf082, 0xffffffff, 0x00000100,
307a2e73f56SAlex Deucher 0xf0b0, 0xffffffff, 0xc0000100,
308a2e73f56SAlex Deucher 0xf0b2, 0xffffffff, 0xc0000100,
309a2e73f56SAlex Deucher 0xf0b1, 0xffffffff, 0xc0000100,
310a2e73f56SAlex Deucher 0x1579, 0xffffffff, 0x00600100,
311a2e73f56SAlex Deucher 0xf0a0, 0xffffffff, 0x00000100,
312a2e73f56SAlex Deucher 0xf085, 0xffffffff, 0x06000100,
313a2e73f56SAlex Deucher 0xf088, 0xffffffff, 0x00000100,
314a2e73f56SAlex Deucher 0xf086, 0xffffffff, 0x06000100,
315a2e73f56SAlex Deucher 0xf081, 0xffffffff, 0x00000100,
316a2e73f56SAlex Deucher 0xf0b8, 0xffffffff, 0x00000100,
317a2e73f56SAlex Deucher 0xf089, 0xffffffff, 0x00000100,
318a2e73f56SAlex Deucher 0xf080, 0xffffffff, 0x00000100,
319a2e73f56SAlex Deucher 0xf08c, 0xffffffff, 0x00000100,
320a2e73f56SAlex Deucher 0xf08d, 0xffffffff, 0x00000100,
321a2e73f56SAlex Deucher 0xf094, 0xffffffff, 0x00000100,
322a2e73f56SAlex Deucher 0xf095, 0xffffffff, 0x00000100,
323a2e73f56SAlex Deucher 0xf096, 0xffffffff, 0x00000100,
324a2e73f56SAlex Deucher 0xf097, 0xffffffff, 0x00000100,
325a2e73f56SAlex Deucher 0xf098, 0xffffffff, 0x00000100,
326a2e73f56SAlex Deucher 0xf09f, 0xffffffff, 0x00000100,
327a2e73f56SAlex Deucher 0xf09e, 0xffffffff, 0x00000100,
328a2e73f56SAlex Deucher 0xf084, 0xffffffff, 0x06000100,
329a2e73f56SAlex Deucher 0xf0a4, 0xffffffff, 0x00000100,
330a2e73f56SAlex Deucher 0xf09d, 0xffffffff, 0x00000100,
331a2e73f56SAlex Deucher 0xf0ad, 0xffffffff, 0x00000100,
332a2e73f56SAlex Deucher 0xf0ac, 0xffffffff, 0x00000100,
333a2e73f56SAlex Deucher 0xf09c, 0xffffffff, 0x00000100,
334a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
335a2e73f56SAlex Deucher 0xf008, 0xffffffff, 0x00010000,
336a2e73f56SAlex Deucher 0xf009, 0xffffffff, 0x00030002,
337a2e73f56SAlex Deucher 0xf00a, 0xffffffff, 0x00040007,
338a2e73f56SAlex Deucher 0xf00b, 0xffffffff, 0x00060005,
339a2e73f56SAlex Deucher 0xf00c, 0xffffffff, 0x00090008,
340a2e73f56SAlex Deucher 0xf00d, 0xffffffff, 0x00010000,
341a2e73f56SAlex Deucher 0xf00e, 0xffffffff, 0x00030002,
342a2e73f56SAlex Deucher 0xf00f, 0xffffffff, 0x00040007,
343a2e73f56SAlex Deucher 0xf010, 0xffffffff, 0x00060005,
344a2e73f56SAlex Deucher 0xf011, 0xffffffff, 0x00090008,
345a2e73f56SAlex Deucher 0xf012, 0xffffffff, 0x00010000,
346a2e73f56SAlex Deucher 0xf013, 0xffffffff, 0x00030002,
347a2e73f56SAlex Deucher 0xf014, 0xffffffff, 0x00040007,
348a2e73f56SAlex Deucher 0xf015, 0xffffffff, 0x00060005,
349a2e73f56SAlex Deucher 0xf016, 0xffffffff, 0x00090008,
350a2e73f56SAlex Deucher 0xf017, 0xffffffff, 0x00010000,
351a2e73f56SAlex Deucher 0xf018, 0xffffffff, 0x00030002,
352a2e73f56SAlex Deucher 0xf019, 0xffffffff, 0x00040007,
353a2e73f56SAlex Deucher 0xf01a, 0xffffffff, 0x00060005,
354a2e73f56SAlex Deucher 0xf01b, 0xffffffff, 0x00090008,
355a2e73f56SAlex Deucher 0xf01c, 0xffffffff, 0x00010000,
356a2e73f56SAlex Deucher 0xf01d, 0xffffffff, 0x00030002,
357a2e73f56SAlex Deucher 0xf01e, 0xffffffff, 0x00040007,
358a2e73f56SAlex Deucher 0xf01f, 0xffffffff, 0x00060005,
359a2e73f56SAlex Deucher 0xf020, 0xffffffff, 0x00090008,
360a2e73f56SAlex Deucher 0xf021, 0xffffffff, 0x00010000,
361a2e73f56SAlex Deucher 0xf022, 0xffffffff, 0x00030002,
362a2e73f56SAlex Deucher 0xf023, 0xffffffff, 0x00040007,
363a2e73f56SAlex Deucher 0xf024, 0xffffffff, 0x00060005,
364a2e73f56SAlex Deucher 0xf025, 0xffffffff, 0x00090008,
365a2e73f56SAlex Deucher 0xf026, 0xffffffff, 0x00010000,
366a2e73f56SAlex Deucher 0xf027, 0xffffffff, 0x00030002,
367a2e73f56SAlex Deucher 0xf028, 0xffffffff, 0x00040007,
368a2e73f56SAlex Deucher 0xf029, 0xffffffff, 0x00060005,
369a2e73f56SAlex Deucher 0xf02a, 0xffffffff, 0x00090008,
370a2e73f56SAlex Deucher 0xf000, 0xffffffff, 0x96e00200,
371a2e73f56SAlex Deucher 0x21c2, 0xffffffff, 0x00900100,
372a2e73f56SAlex Deucher 0x3109, 0xffffffff, 0x0020003f,
373a2e73f56SAlex Deucher 0xe, 0xffffffff, 0x0140001c,
374a2e73f56SAlex Deucher 0xf, 0x000f0000, 0x000f0000,
375a2e73f56SAlex Deucher 0x88, 0xffffffff, 0xc060000c,
376a2e73f56SAlex Deucher 0x89, 0xc0000fff, 0x00000100,
377a2e73f56SAlex Deucher 0x3e4, 0xffffffff, 0x00000100,
378a2e73f56SAlex Deucher 0x3e6, 0x00000101, 0x00000000,
379a2e73f56SAlex Deucher 0x82a, 0xffffffff, 0x00000104,
380a2e73f56SAlex Deucher 0x1579, 0xff000fff, 0x00000100,
381a2e73f56SAlex Deucher 0xc33, 0xc0000fff, 0x00000104,
382a2e73f56SAlex Deucher 0x3079, 0x00000001, 0x00000001,
383a2e73f56SAlex Deucher 0x3403, 0xff000ff0, 0x00000100,
384a2e73f56SAlex Deucher 0x3603, 0xff000ff0, 0x00000100
385a2e73f56SAlex Deucher };
386a2e73f56SAlex Deucher
387a2e73f56SAlex Deucher static const u32 spectre_golden_spm_registers[] =
388a2e73f56SAlex Deucher {
389a2e73f56SAlex Deucher 0xc200, 0xe0ffffff, 0xe0000000
390a2e73f56SAlex Deucher };
391a2e73f56SAlex Deucher
392a2e73f56SAlex Deucher static const u32 spectre_golden_common_registers[] =
393a2e73f56SAlex Deucher {
394a2e73f56SAlex Deucher 0x31dc, 0xffffffff, 0x00000800,
395a2e73f56SAlex Deucher 0x31dd, 0xffffffff, 0x00000800,
396a2e73f56SAlex Deucher 0x31e6, 0xffffffff, 0x00007fbf,
397a2e73f56SAlex Deucher 0x31e7, 0xffffffff, 0x00007faf
398a2e73f56SAlex Deucher };
399a2e73f56SAlex Deucher
400a2e73f56SAlex Deucher static const u32 spectre_golden_registers[] =
401a2e73f56SAlex Deucher {
402a2e73f56SAlex Deucher 0xf000, 0xffff1fff, 0x96940200,
403a2e73f56SAlex Deucher 0xf003, 0xffff0001, 0xff000000,
404a2e73f56SAlex Deucher 0xf080, 0xfffc0fff, 0x00000100,
405a2e73f56SAlex Deucher 0x1bb6, 0x00010101, 0x00010000,
406a2e73f56SAlex Deucher 0x260d, 0xf00fffff, 0x00000400,
407a2e73f56SAlex Deucher 0x260e, 0xfffffffc, 0x00020200,
408a2e73f56SAlex Deucher 0x16ec, 0x000000f0, 0x00000070,
409a2e73f56SAlex Deucher 0x16f0, 0xf0311fff, 0x80300000,
410a2e73f56SAlex Deucher 0x263e, 0x73773777, 0x12010001,
411a2e73f56SAlex Deucher 0x26df, 0x00ff0000, 0x00fc0000,
412a2e73f56SAlex Deucher 0xbd2, 0x73773777, 0x12010001,
413a2e73f56SAlex Deucher 0x2285, 0xf000003f, 0x00000007,
414a2e73f56SAlex Deucher 0x22c9, 0xffffffff, 0x00ffffff,
415a2e73f56SAlex Deucher 0xa0d4, 0x3f3f3fff, 0x00000082,
416a2e73f56SAlex Deucher 0xa0d5, 0x0000003f, 0x00000000,
417a2e73f56SAlex Deucher 0xf9e, 0x00000001, 0x00000002,
418a2e73f56SAlex Deucher 0x244f, 0xffff03df, 0x00000004,
419a2e73f56SAlex Deucher 0x31da, 0x00000008, 0x00000008,
420a2e73f56SAlex Deucher 0x2300, 0x000008ff, 0x00000800,
421a2e73f56SAlex Deucher 0x2542, 0x00010000, 0x00010000,
422a2e73f56SAlex Deucher 0x2b03, 0xffffffff, 0x54763210,
423a2e73f56SAlex Deucher 0x853e, 0x01ff01ff, 0x00000002,
424a2e73f56SAlex Deucher 0x8526, 0x007ff800, 0x00200000,
425a2e73f56SAlex Deucher 0x8057, 0xffffffff, 0x00000f40,
426a2e73f56SAlex Deucher 0xc24d, 0xffffffff, 0x00000001
427a2e73f56SAlex Deucher };
428a2e73f56SAlex Deucher
429a2e73f56SAlex Deucher static const u32 spectre_mgcg_cgcg_init[] =
430a2e73f56SAlex Deucher {
431a2e73f56SAlex Deucher 0x3108, 0xffffffff, 0xfffffffc,
432a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
433a2e73f56SAlex Deucher 0xf0a8, 0xffffffff, 0x00000100,
434a2e73f56SAlex Deucher 0xf082, 0xffffffff, 0x00000100,
435a2e73f56SAlex Deucher 0xf0b0, 0xffffffff, 0x00000100,
436a2e73f56SAlex Deucher 0xf0b2, 0xffffffff, 0x00000100,
437a2e73f56SAlex Deucher 0xf0b1, 0xffffffff, 0x00000100,
438a2e73f56SAlex Deucher 0x1579, 0xffffffff, 0x00600100,
439a2e73f56SAlex Deucher 0xf0a0, 0xffffffff, 0x00000100,
440a2e73f56SAlex Deucher 0xf085, 0xffffffff, 0x06000100,
441a2e73f56SAlex Deucher 0xf088, 0xffffffff, 0x00000100,
442a2e73f56SAlex Deucher 0xf086, 0xffffffff, 0x06000100,
443a2e73f56SAlex Deucher 0xf081, 0xffffffff, 0x00000100,
444a2e73f56SAlex Deucher 0xf0b8, 0xffffffff, 0x00000100,
445a2e73f56SAlex Deucher 0xf089, 0xffffffff, 0x00000100,
446a2e73f56SAlex Deucher 0xf080, 0xffffffff, 0x00000100,
447a2e73f56SAlex Deucher 0xf08c, 0xffffffff, 0x00000100,
448a2e73f56SAlex Deucher 0xf08d, 0xffffffff, 0x00000100,
449a2e73f56SAlex Deucher 0xf094, 0xffffffff, 0x00000100,
450a2e73f56SAlex Deucher 0xf095, 0xffffffff, 0x00000100,
451a2e73f56SAlex Deucher 0xf096, 0xffffffff, 0x00000100,
452a2e73f56SAlex Deucher 0xf097, 0xffffffff, 0x00000100,
453a2e73f56SAlex Deucher 0xf098, 0xffffffff, 0x00000100,
454a2e73f56SAlex Deucher 0xf09f, 0xffffffff, 0x00000100,
455a2e73f56SAlex Deucher 0xf09e, 0xffffffff, 0x00000100,
456a2e73f56SAlex Deucher 0xf084, 0xffffffff, 0x06000100,
457a2e73f56SAlex Deucher 0xf0a4, 0xffffffff, 0x00000100,
458a2e73f56SAlex Deucher 0xf09d, 0xffffffff, 0x00000100,
459a2e73f56SAlex Deucher 0xf0ad, 0xffffffff, 0x00000100,
460a2e73f56SAlex Deucher 0xf0ac, 0xffffffff, 0x00000100,
461a2e73f56SAlex Deucher 0xf09c, 0xffffffff, 0x00000100,
462a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
463a2e73f56SAlex Deucher 0xf008, 0xffffffff, 0x00010000,
464a2e73f56SAlex Deucher 0xf009, 0xffffffff, 0x00030002,
465a2e73f56SAlex Deucher 0xf00a, 0xffffffff, 0x00040007,
466a2e73f56SAlex Deucher 0xf00b, 0xffffffff, 0x00060005,
467a2e73f56SAlex Deucher 0xf00c, 0xffffffff, 0x00090008,
468a2e73f56SAlex Deucher 0xf00d, 0xffffffff, 0x00010000,
469a2e73f56SAlex Deucher 0xf00e, 0xffffffff, 0x00030002,
470a2e73f56SAlex Deucher 0xf00f, 0xffffffff, 0x00040007,
471a2e73f56SAlex Deucher 0xf010, 0xffffffff, 0x00060005,
472a2e73f56SAlex Deucher 0xf011, 0xffffffff, 0x00090008,
473a2e73f56SAlex Deucher 0xf012, 0xffffffff, 0x00010000,
474a2e73f56SAlex Deucher 0xf013, 0xffffffff, 0x00030002,
475a2e73f56SAlex Deucher 0xf014, 0xffffffff, 0x00040007,
476a2e73f56SAlex Deucher 0xf015, 0xffffffff, 0x00060005,
477a2e73f56SAlex Deucher 0xf016, 0xffffffff, 0x00090008,
478a2e73f56SAlex Deucher 0xf017, 0xffffffff, 0x00010000,
479a2e73f56SAlex Deucher 0xf018, 0xffffffff, 0x00030002,
480a2e73f56SAlex Deucher 0xf019, 0xffffffff, 0x00040007,
481a2e73f56SAlex Deucher 0xf01a, 0xffffffff, 0x00060005,
482a2e73f56SAlex Deucher 0xf01b, 0xffffffff, 0x00090008,
483a2e73f56SAlex Deucher 0xf01c, 0xffffffff, 0x00010000,
484a2e73f56SAlex Deucher 0xf01d, 0xffffffff, 0x00030002,
485a2e73f56SAlex Deucher 0xf01e, 0xffffffff, 0x00040007,
486a2e73f56SAlex Deucher 0xf01f, 0xffffffff, 0x00060005,
487a2e73f56SAlex Deucher 0xf020, 0xffffffff, 0x00090008,
488a2e73f56SAlex Deucher 0xf021, 0xffffffff, 0x00010000,
489a2e73f56SAlex Deucher 0xf022, 0xffffffff, 0x00030002,
490a2e73f56SAlex Deucher 0xf023, 0xffffffff, 0x00040007,
491a2e73f56SAlex Deucher 0xf024, 0xffffffff, 0x00060005,
492a2e73f56SAlex Deucher 0xf025, 0xffffffff, 0x00090008,
493a2e73f56SAlex Deucher 0xf026, 0xffffffff, 0x00010000,
494a2e73f56SAlex Deucher 0xf027, 0xffffffff, 0x00030002,
495a2e73f56SAlex Deucher 0xf028, 0xffffffff, 0x00040007,
496a2e73f56SAlex Deucher 0xf029, 0xffffffff, 0x00060005,
497a2e73f56SAlex Deucher 0xf02a, 0xffffffff, 0x00090008,
498a2e73f56SAlex Deucher 0xf02b, 0xffffffff, 0x00010000,
499a2e73f56SAlex Deucher 0xf02c, 0xffffffff, 0x00030002,
500a2e73f56SAlex Deucher 0xf02d, 0xffffffff, 0x00040007,
501a2e73f56SAlex Deucher 0xf02e, 0xffffffff, 0x00060005,
502a2e73f56SAlex Deucher 0xf02f, 0xffffffff, 0x00090008,
503a2e73f56SAlex Deucher 0xf000, 0xffffffff, 0x96e00200,
504a2e73f56SAlex Deucher 0x21c2, 0xffffffff, 0x00900100,
505a2e73f56SAlex Deucher 0x3109, 0xffffffff, 0x0020003f,
506a2e73f56SAlex Deucher 0xe, 0xffffffff, 0x0140001c,
507a2e73f56SAlex Deucher 0xf, 0x000f0000, 0x000f0000,
508a2e73f56SAlex Deucher 0x88, 0xffffffff, 0xc060000c,
509a2e73f56SAlex Deucher 0x89, 0xc0000fff, 0x00000100,
510a2e73f56SAlex Deucher 0x3e4, 0xffffffff, 0x00000100,
511a2e73f56SAlex Deucher 0x3e6, 0x00000101, 0x00000000,
512a2e73f56SAlex Deucher 0x82a, 0xffffffff, 0x00000104,
513a2e73f56SAlex Deucher 0x1579, 0xff000fff, 0x00000100,
514a2e73f56SAlex Deucher 0xc33, 0xc0000fff, 0x00000104,
515a2e73f56SAlex Deucher 0x3079, 0x00000001, 0x00000001,
516a2e73f56SAlex Deucher 0x3403, 0xff000ff0, 0x00000100,
517a2e73f56SAlex Deucher 0x3603, 0xff000ff0, 0x00000100
518a2e73f56SAlex Deucher };
519a2e73f56SAlex Deucher
520a2e73f56SAlex Deucher static const u32 kalindi_golden_spm_registers[] =
521a2e73f56SAlex Deucher {
522a2e73f56SAlex Deucher 0xc200, 0xe0ffffff, 0xe0000000
523a2e73f56SAlex Deucher };
524a2e73f56SAlex Deucher
525a2e73f56SAlex Deucher static const u32 kalindi_golden_common_registers[] =
526a2e73f56SAlex Deucher {
527a2e73f56SAlex Deucher 0x31dc, 0xffffffff, 0x00000800,
528a2e73f56SAlex Deucher 0x31dd, 0xffffffff, 0x00000800,
529a2e73f56SAlex Deucher 0x31e6, 0xffffffff, 0x00007fbf,
530a2e73f56SAlex Deucher 0x31e7, 0xffffffff, 0x00007faf
531a2e73f56SAlex Deucher };
532a2e73f56SAlex Deucher
533a2e73f56SAlex Deucher static const u32 kalindi_golden_registers[] =
534a2e73f56SAlex Deucher {
535a2e73f56SAlex Deucher 0xf000, 0xffffdfff, 0x6e944040,
536a2e73f56SAlex Deucher 0x1579, 0xff607fff, 0xfc000100,
537a2e73f56SAlex Deucher 0xf088, 0xff000fff, 0x00000100,
538a2e73f56SAlex Deucher 0xf089, 0xff000fff, 0x00000100,
539a2e73f56SAlex Deucher 0xf080, 0xfffc0fff, 0x00000100,
540a2e73f56SAlex Deucher 0x1bb6, 0x00010101, 0x00010000,
541a2e73f56SAlex Deucher 0x260c, 0xffffffff, 0x00000000,
542a2e73f56SAlex Deucher 0x260d, 0xf00fffff, 0x00000400,
543a2e73f56SAlex Deucher 0x16ec, 0x000000f0, 0x00000070,
544a2e73f56SAlex Deucher 0x16f0, 0xf0311fff, 0x80300000,
545a2e73f56SAlex Deucher 0x263e, 0x73773777, 0x12010001,
546a2e73f56SAlex Deucher 0x263f, 0xffffffff, 0x00000010,
547a2e73f56SAlex Deucher 0x26df, 0x00ff0000, 0x00fc0000,
548a2e73f56SAlex Deucher 0x200c, 0x00001f0f, 0x0000100a,
549a2e73f56SAlex Deucher 0xbd2, 0x73773777, 0x12010001,
550a2e73f56SAlex Deucher 0x902, 0x000fffff, 0x000c007f,
551a2e73f56SAlex Deucher 0x2285, 0xf000003f, 0x00000007,
552a2e73f56SAlex Deucher 0x22c9, 0x3fff3fff, 0x00ffcfff,
553a2e73f56SAlex Deucher 0xc281, 0x0000ff0f, 0x00000000,
554a2e73f56SAlex Deucher 0xa293, 0x07ffffff, 0x06000000,
555a2e73f56SAlex Deucher 0x136, 0x00000fff, 0x00000100,
556a2e73f56SAlex Deucher 0xf9e, 0x00000001, 0x00000002,
557a2e73f56SAlex Deucher 0x31da, 0x00000008, 0x00000008,
558a2e73f56SAlex Deucher 0x2300, 0x000000ff, 0x00000003,
559a2e73f56SAlex Deucher 0x853e, 0x01ff01ff, 0x00000002,
560a2e73f56SAlex Deucher 0x8526, 0x007ff800, 0x00200000,
561a2e73f56SAlex Deucher 0x8057, 0xffffffff, 0x00000f40,
562a2e73f56SAlex Deucher 0x2231, 0x001f3ae3, 0x00000082,
563a2e73f56SAlex Deucher 0x2235, 0x0000001f, 0x00000010,
564a2e73f56SAlex Deucher 0xc24d, 0xffffffff, 0x00000000
565a2e73f56SAlex Deucher };
566a2e73f56SAlex Deucher
567a2e73f56SAlex Deucher static const u32 kalindi_mgcg_cgcg_init[] =
568a2e73f56SAlex Deucher {
569a2e73f56SAlex Deucher 0x3108, 0xffffffff, 0xfffffffc,
570a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
571a2e73f56SAlex Deucher 0xf0a8, 0xffffffff, 0x00000100,
572a2e73f56SAlex Deucher 0xf082, 0xffffffff, 0x00000100,
573a2e73f56SAlex Deucher 0xf0b0, 0xffffffff, 0x00000100,
574a2e73f56SAlex Deucher 0xf0b2, 0xffffffff, 0x00000100,
575a2e73f56SAlex Deucher 0xf0b1, 0xffffffff, 0x00000100,
576a2e73f56SAlex Deucher 0x1579, 0xffffffff, 0x00600100,
577a2e73f56SAlex Deucher 0xf0a0, 0xffffffff, 0x00000100,
578a2e73f56SAlex Deucher 0xf085, 0xffffffff, 0x06000100,
579a2e73f56SAlex Deucher 0xf088, 0xffffffff, 0x00000100,
580a2e73f56SAlex Deucher 0xf086, 0xffffffff, 0x06000100,
581a2e73f56SAlex Deucher 0xf081, 0xffffffff, 0x00000100,
582a2e73f56SAlex Deucher 0xf0b8, 0xffffffff, 0x00000100,
583a2e73f56SAlex Deucher 0xf089, 0xffffffff, 0x00000100,
584a2e73f56SAlex Deucher 0xf080, 0xffffffff, 0x00000100,
585a2e73f56SAlex Deucher 0xf08c, 0xffffffff, 0x00000100,
586a2e73f56SAlex Deucher 0xf08d, 0xffffffff, 0x00000100,
587a2e73f56SAlex Deucher 0xf094, 0xffffffff, 0x00000100,
588a2e73f56SAlex Deucher 0xf095, 0xffffffff, 0x00000100,
589a2e73f56SAlex Deucher 0xf096, 0xffffffff, 0x00000100,
590a2e73f56SAlex Deucher 0xf097, 0xffffffff, 0x00000100,
591a2e73f56SAlex Deucher 0xf098, 0xffffffff, 0x00000100,
592a2e73f56SAlex Deucher 0xf09f, 0xffffffff, 0x00000100,
593a2e73f56SAlex Deucher 0xf09e, 0xffffffff, 0x00000100,
594a2e73f56SAlex Deucher 0xf084, 0xffffffff, 0x06000100,
595a2e73f56SAlex Deucher 0xf0a4, 0xffffffff, 0x00000100,
596a2e73f56SAlex Deucher 0xf09d, 0xffffffff, 0x00000100,
597a2e73f56SAlex Deucher 0xf0ad, 0xffffffff, 0x00000100,
598a2e73f56SAlex Deucher 0xf0ac, 0xffffffff, 0x00000100,
599a2e73f56SAlex Deucher 0xf09c, 0xffffffff, 0x00000100,
600a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
601a2e73f56SAlex Deucher 0xf008, 0xffffffff, 0x00010000,
602a2e73f56SAlex Deucher 0xf009, 0xffffffff, 0x00030002,
603a2e73f56SAlex Deucher 0xf00a, 0xffffffff, 0x00040007,
604a2e73f56SAlex Deucher 0xf00b, 0xffffffff, 0x00060005,
605a2e73f56SAlex Deucher 0xf00c, 0xffffffff, 0x00090008,
606a2e73f56SAlex Deucher 0xf00d, 0xffffffff, 0x00010000,
607a2e73f56SAlex Deucher 0xf00e, 0xffffffff, 0x00030002,
608a2e73f56SAlex Deucher 0xf00f, 0xffffffff, 0x00040007,
609a2e73f56SAlex Deucher 0xf010, 0xffffffff, 0x00060005,
610a2e73f56SAlex Deucher 0xf011, 0xffffffff, 0x00090008,
611a2e73f56SAlex Deucher 0xf000, 0xffffffff, 0x96e00200,
612a2e73f56SAlex Deucher 0x21c2, 0xffffffff, 0x00900100,
613a2e73f56SAlex Deucher 0x3109, 0xffffffff, 0x0020003f,
614a2e73f56SAlex Deucher 0xe, 0xffffffff, 0x0140001c,
615a2e73f56SAlex Deucher 0xf, 0x000f0000, 0x000f0000,
616a2e73f56SAlex Deucher 0x88, 0xffffffff, 0xc060000c,
617a2e73f56SAlex Deucher 0x89, 0xc0000fff, 0x00000100,
618a2e73f56SAlex Deucher 0x82a, 0xffffffff, 0x00000104,
619a2e73f56SAlex Deucher 0x1579, 0xff000fff, 0x00000100,
620a2e73f56SAlex Deucher 0xc33, 0xc0000fff, 0x00000104,
621a2e73f56SAlex Deucher 0x3079, 0x00000001, 0x00000001,
622a2e73f56SAlex Deucher 0x3403, 0xff000ff0, 0x00000100,
623a2e73f56SAlex Deucher 0x3603, 0xff000ff0, 0x00000100
624a2e73f56SAlex Deucher };
625a2e73f56SAlex Deucher
626a2e73f56SAlex Deucher static const u32 hawaii_golden_spm_registers[] =
627a2e73f56SAlex Deucher {
628a2e73f56SAlex Deucher 0xc200, 0xe0ffffff, 0xe0000000
629a2e73f56SAlex Deucher };
630a2e73f56SAlex Deucher
631a2e73f56SAlex Deucher static const u32 hawaii_golden_common_registers[] =
632a2e73f56SAlex Deucher {
633a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
634a2e73f56SAlex Deucher 0xa0d4, 0xffffffff, 0x3a00161a,
635a2e73f56SAlex Deucher 0xa0d5, 0xffffffff, 0x0000002e,
636a2e73f56SAlex Deucher 0x2684, 0xffffffff, 0x00018208,
637a2e73f56SAlex Deucher 0x263e, 0xffffffff, 0x12011003
638a2e73f56SAlex Deucher };
639a2e73f56SAlex Deucher
640a2e73f56SAlex Deucher static const u32 hawaii_golden_registers[] =
641a2e73f56SAlex Deucher {
642a2e73f56SAlex Deucher 0xcd5, 0x00000333, 0x00000333,
643a2e73f56SAlex Deucher 0x2684, 0x00010000, 0x00058208,
644a2e73f56SAlex Deucher 0x260c, 0xffffffff, 0x00000000,
645a2e73f56SAlex Deucher 0x260d, 0xf00fffff, 0x00000400,
646a2e73f56SAlex Deucher 0x260e, 0x0002021c, 0x00020200,
647a2e73f56SAlex Deucher 0x31e, 0x00000080, 0x00000000,
648a2e73f56SAlex Deucher 0x16ec, 0x000000f0, 0x00000070,
649a2e73f56SAlex Deucher 0x16f0, 0xf0311fff, 0x80300000,
650a2e73f56SAlex Deucher 0xd43, 0x00810000, 0x408af000,
651a2e73f56SAlex Deucher 0x1c0c, 0x31000111, 0x00000011,
652a2e73f56SAlex Deucher 0xbd2, 0x73773777, 0x12010001,
653a2e73f56SAlex Deucher 0x848, 0x0000007f, 0x0000001b,
654a2e73f56SAlex Deucher 0x877, 0x00007fb6, 0x00002191,
655a2e73f56SAlex Deucher 0xd8a, 0x0000003f, 0x0000000a,
656a2e73f56SAlex Deucher 0xd8b, 0x0000003f, 0x0000000a,
657a2e73f56SAlex Deucher 0xab9, 0x00073ffe, 0x000022a2,
658a2e73f56SAlex Deucher 0x903, 0x000007ff, 0x00000000,
659a2e73f56SAlex Deucher 0x22fc, 0x00002001, 0x00000001,
660a2e73f56SAlex Deucher 0x22c9, 0xffffffff, 0x00ffffff,
661a2e73f56SAlex Deucher 0xc281, 0x0000ff0f, 0x00000000,
662a2e73f56SAlex Deucher 0xa293, 0x07ffffff, 0x06000000,
663a2e73f56SAlex Deucher 0xf9e, 0x00000001, 0x00000002,
664a2e73f56SAlex Deucher 0x31da, 0x00000008, 0x00000008,
665a2e73f56SAlex Deucher 0x31dc, 0x00000f00, 0x00000800,
666a2e73f56SAlex Deucher 0x31dd, 0x00000f00, 0x00000800,
667a2e73f56SAlex Deucher 0x31e6, 0x00ffffff, 0x00ff7fbf,
668a2e73f56SAlex Deucher 0x31e7, 0x00ffffff, 0x00ff7faf,
669a2e73f56SAlex Deucher 0x2300, 0x000000ff, 0x00000800,
670a2e73f56SAlex Deucher 0x390, 0x00001fff, 0x00001fff,
671a2e73f56SAlex Deucher 0x2418, 0x0000007f, 0x00000020,
672a2e73f56SAlex Deucher 0x2542, 0x00010000, 0x00010000,
673a2e73f56SAlex Deucher 0x2b80, 0x00100000, 0x000ff07c,
674a2e73f56SAlex Deucher 0x2b05, 0x000003ff, 0x0000000f,
675a2e73f56SAlex Deucher 0x2b04, 0xffffffff, 0x7564fdec,
676a2e73f56SAlex Deucher 0x2b03, 0xffffffff, 0x3120b9a8,
677a2e73f56SAlex Deucher 0x2b02, 0x20000000, 0x0f9c0000
678a2e73f56SAlex Deucher };
679a2e73f56SAlex Deucher
680a2e73f56SAlex Deucher static const u32 hawaii_mgcg_cgcg_init[] =
681a2e73f56SAlex Deucher {
682a2e73f56SAlex Deucher 0x3108, 0xffffffff, 0xfffffffd,
683a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
684a2e73f56SAlex Deucher 0xf0a8, 0xffffffff, 0x00000100,
685a2e73f56SAlex Deucher 0xf082, 0xffffffff, 0x00000100,
686a2e73f56SAlex Deucher 0xf0b0, 0xffffffff, 0x00000100,
687a2e73f56SAlex Deucher 0xf0b2, 0xffffffff, 0x00000100,
688a2e73f56SAlex Deucher 0xf0b1, 0xffffffff, 0x00000100,
689a2e73f56SAlex Deucher 0x1579, 0xffffffff, 0x00200100,
690a2e73f56SAlex Deucher 0xf0a0, 0xffffffff, 0x00000100,
691a2e73f56SAlex Deucher 0xf085, 0xffffffff, 0x06000100,
692a2e73f56SAlex Deucher 0xf088, 0xffffffff, 0x00000100,
693a2e73f56SAlex Deucher 0xf086, 0xffffffff, 0x06000100,
694a2e73f56SAlex Deucher 0xf081, 0xffffffff, 0x00000100,
695a2e73f56SAlex Deucher 0xf0b8, 0xffffffff, 0x00000100,
696a2e73f56SAlex Deucher 0xf089, 0xffffffff, 0x00000100,
697a2e73f56SAlex Deucher 0xf080, 0xffffffff, 0x00000100,
698a2e73f56SAlex Deucher 0xf08c, 0xffffffff, 0x00000100,
699a2e73f56SAlex Deucher 0xf08d, 0xffffffff, 0x00000100,
700a2e73f56SAlex Deucher 0xf094, 0xffffffff, 0x00000100,
701a2e73f56SAlex Deucher 0xf095, 0xffffffff, 0x00000100,
702a2e73f56SAlex Deucher 0xf096, 0xffffffff, 0x00000100,
703a2e73f56SAlex Deucher 0xf097, 0xffffffff, 0x00000100,
704a2e73f56SAlex Deucher 0xf098, 0xffffffff, 0x00000100,
705a2e73f56SAlex Deucher 0xf09f, 0xffffffff, 0x00000100,
706a2e73f56SAlex Deucher 0xf09e, 0xffffffff, 0x00000100,
707a2e73f56SAlex Deucher 0xf084, 0xffffffff, 0x06000100,
708a2e73f56SAlex Deucher 0xf0a4, 0xffffffff, 0x00000100,
709a2e73f56SAlex Deucher 0xf09d, 0xffffffff, 0x00000100,
710a2e73f56SAlex Deucher 0xf0ad, 0xffffffff, 0x00000100,
711a2e73f56SAlex Deucher 0xf0ac, 0xffffffff, 0x00000100,
712a2e73f56SAlex Deucher 0xf09c, 0xffffffff, 0x00000100,
713a2e73f56SAlex Deucher 0xc200, 0xffffffff, 0xe0000000,
714a2e73f56SAlex Deucher 0xf008, 0xffffffff, 0x00010000,
715a2e73f56SAlex Deucher 0xf009, 0xffffffff, 0x00030002,
716a2e73f56SAlex Deucher 0xf00a, 0xffffffff, 0x00040007,
717a2e73f56SAlex Deucher 0xf00b, 0xffffffff, 0x00060005,
718a2e73f56SAlex Deucher 0xf00c, 0xffffffff, 0x00090008,
719a2e73f56SAlex Deucher 0xf00d, 0xffffffff, 0x00010000,
720a2e73f56SAlex Deucher 0xf00e, 0xffffffff, 0x00030002,
721a2e73f56SAlex Deucher 0xf00f, 0xffffffff, 0x00040007,
722a2e73f56SAlex Deucher 0xf010, 0xffffffff, 0x00060005,
723a2e73f56SAlex Deucher 0xf011, 0xffffffff, 0x00090008,
724a2e73f56SAlex Deucher 0xf012, 0xffffffff, 0x00010000,
725a2e73f56SAlex Deucher 0xf013, 0xffffffff, 0x00030002,
726a2e73f56SAlex Deucher 0xf014, 0xffffffff, 0x00040007,
727a2e73f56SAlex Deucher 0xf015, 0xffffffff, 0x00060005,
728a2e73f56SAlex Deucher 0xf016, 0xffffffff, 0x00090008,
729a2e73f56SAlex Deucher 0xf017, 0xffffffff, 0x00010000,
730a2e73f56SAlex Deucher 0xf018, 0xffffffff, 0x00030002,
731a2e73f56SAlex Deucher 0xf019, 0xffffffff, 0x00040007,
732a2e73f56SAlex Deucher 0xf01a, 0xffffffff, 0x00060005,
733a2e73f56SAlex Deucher 0xf01b, 0xffffffff, 0x00090008,
734a2e73f56SAlex Deucher 0xf01c, 0xffffffff, 0x00010000,
735a2e73f56SAlex Deucher 0xf01d, 0xffffffff, 0x00030002,
736a2e73f56SAlex Deucher 0xf01e, 0xffffffff, 0x00040007,
737a2e73f56SAlex Deucher 0xf01f, 0xffffffff, 0x00060005,
738a2e73f56SAlex Deucher 0xf020, 0xffffffff, 0x00090008,
739a2e73f56SAlex Deucher 0xf021, 0xffffffff, 0x00010000,
740a2e73f56SAlex Deucher 0xf022, 0xffffffff, 0x00030002,
741a2e73f56SAlex Deucher 0xf023, 0xffffffff, 0x00040007,
742a2e73f56SAlex Deucher 0xf024, 0xffffffff, 0x00060005,
743a2e73f56SAlex Deucher 0xf025, 0xffffffff, 0x00090008,
744a2e73f56SAlex Deucher 0xf026, 0xffffffff, 0x00010000,
745a2e73f56SAlex Deucher 0xf027, 0xffffffff, 0x00030002,
746a2e73f56SAlex Deucher 0xf028, 0xffffffff, 0x00040007,
747a2e73f56SAlex Deucher 0xf029, 0xffffffff, 0x00060005,
748a2e73f56SAlex Deucher 0xf02a, 0xffffffff, 0x00090008,
749a2e73f56SAlex Deucher 0xf02b, 0xffffffff, 0x00010000,
750a2e73f56SAlex Deucher 0xf02c, 0xffffffff, 0x00030002,
751a2e73f56SAlex Deucher 0xf02d, 0xffffffff, 0x00040007,
752a2e73f56SAlex Deucher 0xf02e, 0xffffffff, 0x00060005,
753a2e73f56SAlex Deucher 0xf02f, 0xffffffff, 0x00090008,
754a2e73f56SAlex Deucher 0xf030, 0xffffffff, 0x00010000,
755a2e73f56SAlex Deucher 0xf031, 0xffffffff, 0x00030002,
756a2e73f56SAlex Deucher 0xf032, 0xffffffff, 0x00040007,
757a2e73f56SAlex Deucher 0xf033, 0xffffffff, 0x00060005,
758a2e73f56SAlex Deucher 0xf034, 0xffffffff, 0x00090008,
759a2e73f56SAlex Deucher 0xf035, 0xffffffff, 0x00010000,
760a2e73f56SAlex Deucher 0xf036, 0xffffffff, 0x00030002,
761a2e73f56SAlex Deucher 0xf037, 0xffffffff, 0x00040007,
762a2e73f56SAlex Deucher 0xf038, 0xffffffff, 0x00060005,
763a2e73f56SAlex Deucher 0xf039, 0xffffffff, 0x00090008,
764a2e73f56SAlex Deucher 0xf03a, 0xffffffff, 0x00010000,
765a2e73f56SAlex Deucher 0xf03b, 0xffffffff, 0x00030002,
766a2e73f56SAlex Deucher 0xf03c, 0xffffffff, 0x00040007,
767a2e73f56SAlex Deucher 0xf03d, 0xffffffff, 0x00060005,
768a2e73f56SAlex Deucher 0xf03e, 0xffffffff, 0x00090008,
769a2e73f56SAlex Deucher 0x30c6, 0xffffffff, 0x00020200,
770a2e73f56SAlex Deucher 0xcd4, 0xffffffff, 0x00000200,
771a2e73f56SAlex Deucher 0x570, 0xffffffff, 0x00000400,
772a2e73f56SAlex Deucher 0x157a, 0xffffffff, 0x00000000,
773a2e73f56SAlex Deucher 0xbd4, 0xffffffff, 0x00000902,
774a2e73f56SAlex Deucher 0xf000, 0xffffffff, 0x96940200,
775a2e73f56SAlex Deucher 0x21c2, 0xffffffff, 0x00900100,
776a2e73f56SAlex Deucher 0x3109, 0xffffffff, 0x0020003f,
777a2e73f56SAlex Deucher 0xe, 0xffffffff, 0x0140001c,
778a2e73f56SAlex Deucher 0xf, 0x000f0000, 0x000f0000,
779a2e73f56SAlex Deucher 0x88, 0xffffffff, 0xc060000c,
780a2e73f56SAlex Deucher 0x89, 0xc0000fff, 0x00000100,
781a2e73f56SAlex Deucher 0x3e4, 0xffffffff, 0x00000100,
782a2e73f56SAlex Deucher 0x3e6, 0x00000101, 0x00000000,
783a2e73f56SAlex Deucher 0x82a, 0xffffffff, 0x00000104,
784a2e73f56SAlex Deucher 0x1579, 0xff000fff, 0x00000100,
785a2e73f56SAlex Deucher 0xc33, 0xc0000fff, 0x00000104,
786a2e73f56SAlex Deucher 0x3079, 0x00000001, 0x00000001,
787a2e73f56SAlex Deucher 0x3403, 0xff000ff0, 0x00000100,
788a2e73f56SAlex Deucher 0x3603, 0xff000ff0, 0x00000100
789a2e73f56SAlex Deucher };
790a2e73f56SAlex Deucher
791a2e73f56SAlex Deucher static const u32 godavari_golden_registers[] =
792a2e73f56SAlex Deucher {
793a2e73f56SAlex Deucher 0x1579, 0xff607fff, 0xfc000100,
794a2e73f56SAlex Deucher 0x1bb6, 0x00010101, 0x00010000,
795a2e73f56SAlex Deucher 0x260c, 0xffffffff, 0x00000000,
796a2e73f56SAlex Deucher 0x260c0, 0xf00fffff, 0x00000400,
797a2e73f56SAlex Deucher 0x184c, 0xffffffff, 0x00010000,
798a2e73f56SAlex Deucher 0x16ec, 0x000000f0, 0x00000070,
799a2e73f56SAlex Deucher 0x16f0, 0xf0311fff, 0x80300000,
800a2e73f56SAlex Deucher 0x263e, 0x73773777, 0x12010001,
801a2e73f56SAlex Deucher 0x263f, 0xffffffff, 0x00000010,
802a2e73f56SAlex Deucher 0x200c, 0x00001f0f, 0x0000100a,
803a2e73f56SAlex Deucher 0xbd2, 0x73773777, 0x12010001,
804a2e73f56SAlex Deucher 0x902, 0x000fffff, 0x000c007f,
805a2e73f56SAlex Deucher 0x2285, 0xf000003f, 0x00000007,
806a2e73f56SAlex Deucher 0x22c9, 0xffffffff, 0x00ff0fff,
807a2e73f56SAlex Deucher 0xc281, 0x0000ff0f, 0x00000000,
808a2e73f56SAlex Deucher 0xa293, 0x07ffffff, 0x06000000,
809a2e73f56SAlex Deucher 0x136, 0x00000fff, 0x00000100,
810a2e73f56SAlex Deucher 0x3405, 0x00010000, 0x00810001,
811a2e73f56SAlex Deucher 0x3605, 0x00010000, 0x00810001,
812a2e73f56SAlex Deucher 0xf9e, 0x00000001, 0x00000002,
813a2e73f56SAlex Deucher 0x31da, 0x00000008, 0x00000008,
814a2e73f56SAlex Deucher 0x31dc, 0x00000f00, 0x00000800,
815a2e73f56SAlex Deucher 0x31dd, 0x00000f00, 0x00000800,
816a2e73f56SAlex Deucher 0x31e6, 0x00ffffff, 0x00ff7fbf,
817a2e73f56SAlex Deucher 0x31e7, 0x00ffffff, 0x00ff7faf,
818a2e73f56SAlex Deucher 0x2300, 0x000000ff, 0x00000001,
819a2e73f56SAlex Deucher 0x853e, 0x01ff01ff, 0x00000002,
820a2e73f56SAlex Deucher 0x8526, 0x007ff800, 0x00200000,
821a2e73f56SAlex Deucher 0x8057, 0xffffffff, 0x00000f40,
822a2e73f56SAlex Deucher 0x2231, 0x001f3ae3, 0x00000082,
823a2e73f56SAlex Deucher 0x2235, 0x0000001f, 0x00000010,
824a2e73f56SAlex Deucher 0xc24d, 0xffffffff, 0x00000000
825a2e73f56SAlex Deucher };
826a2e73f56SAlex Deucher
cik_init_golden_registers(struct amdgpu_device * adev)827a2e73f56SAlex Deucher static void cik_init_golden_registers(struct amdgpu_device *adev)
828a2e73f56SAlex Deucher {
829a2e73f56SAlex Deucher /* Some of the registers might be dependent on GRBM_GFX_INDEX */
830a2e73f56SAlex Deucher mutex_lock(&adev->grbm_idx_mutex);
831a2e73f56SAlex Deucher
832a2e73f56SAlex Deucher switch (adev->asic_type) {
833a2e73f56SAlex Deucher case CHIP_BONAIRE:
8349c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
835a2e73f56SAlex Deucher bonaire_mgcg_cgcg_init,
836c47b41a7SChristian König ARRAY_SIZE(bonaire_mgcg_cgcg_init));
8379c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
838a2e73f56SAlex Deucher bonaire_golden_registers,
839c47b41a7SChristian König ARRAY_SIZE(bonaire_golden_registers));
8409c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
841a2e73f56SAlex Deucher bonaire_golden_common_registers,
842c47b41a7SChristian König ARRAY_SIZE(bonaire_golden_common_registers));
8439c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
844a2e73f56SAlex Deucher bonaire_golden_spm_registers,
845c47b41a7SChristian König ARRAY_SIZE(bonaire_golden_spm_registers));
846a2e73f56SAlex Deucher break;
847a2e73f56SAlex Deucher case CHIP_KABINI:
8489c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
849a2e73f56SAlex Deucher kalindi_mgcg_cgcg_init,
850c47b41a7SChristian König ARRAY_SIZE(kalindi_mgcg_cgcg_init));
8519c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
852a2e73f56SAlex Deucher kalindi_golden_registers,
853c47b41a7SChristian König ARRAY_SIZE(kalindi_golden_registers));
8549c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
855a2e73f56SAlex Deucher kalindi_golden_common_registers,
856c47b41a7SChristian König ARRAY_SIZE(kalindi_golden_common_registers));
8579c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
858a2e73f56SAlex Deucher kalindi_golden_spm_registers,
859c47b41a7SChristian König ARRAY_SIZE(kalindi_golden_spm_registers));
860a2e73f56SAlex Deucher break;
861a2e73f56SAlex Deucher case CHIP_MULLINS:
8629c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
863a2e73f56SAlex Deucher kalindi_mgcg_cgcg_init,
864c47b41a7SChristian König ARRAY_SIZE(kalindi_mgcg_cgcg_init));
8659c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
866a2e73f56SAlex Deucher godavari_golden_registers,
867c47b41a7SChristian König ARRAY_SIZE(godavari_golden_registers));
8689c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
869a2e73f56SAlex Deucher kalindi_golden_common_registers,
870c47b41a7SChristian König ARRAY_SIZE(kalindi_golden_common_registers));
8719c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
872a2e73f56SAlex Deucher kalindi_golden_spm_registers,
873c47b41a7SChristian König ARRAY_SIZE(kalindi_golden_spm_registers));
874a2e73f56SAlex Deucher break;
875a2e73f56SAlex Deucher case CHIP_KAVERI:
8769c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
877a2e73f56SAlex Deucher spectre_mgcg_cgcg_init,
878c47b41a7SChristian König ARRAY_SIZE(spectre_mgcg_cgcg_init));
8799c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
880a2e73f56SAlex Deucher spectre_golden_registers,
881c47b41a7SChristian König ARRAY_SIZE(spectre_golden_registers));
8829c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
883a2e73f56SAlex Deucher spectre_golden_common_registers,
884c47b41a7SChristian König ARRAY_SIZE(spectre_golden_common_registers));
8859c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
886a2e73f56SAlex Deucher spectre_golden_spm_registers,
887c47b41a7SChristian König ARRAY_SIZE(spectre_golden_spm_registers));
888a2e73f56SAlex Deucher break;
889a2e73f56SAlex Deucher case CHIP_HAWAII:
8909c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
891a2e73f56SAlex Deucher hawaii_mgcg_cgcg_init,
892c47b41a7SChristian König ARRAY_SIZE(hawaii_mgcg_cgcg_init));
8939c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
894a2e73f56SAlex Deucher hawaii_golden_registers,
895c47b41a7SChristian König ARRAY_SIZE(hawaii_golden_registers));
8969c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
897a2e73f56SAlex Deucher hawaii_golden_common_registers,
898c47b41a7SChristian König ARRAY_SIZE(hawaii_golden_common_registers));
8999c3f2b54SAlex Deucher amdgpu_device_program_register_sequence(adev,
900a2e73f56SAlex Deucher hawaii_golden_spm_registers,
901c47b41a7SChristian König ARRAY_SIZE(hawaii_golden_spm_registers));
902a2e73f56SAlex Deucher break;
903a2e73f56SAlex Deucher default:
904a2e73f56SAlex Deucher break;
905a2e73f56SAlex Deucher }
906a2e73f56SAlex Deucher mutex_unlock(&adev->grbm_idx_mutex);
907a2e73f56SAlex Deucher }
908a2e73f56SAlex Deucher
909a2e73f56SAlex Deucher /**
910a2e73f56SAlex Deucher * cik_get_xclk - get the xclk
911a2e73f56SAlex Deucher *
912a2e73f56SAlex Deucher * @adev: amdgpu_device pointer
913a2e73f56SAlex Deucher *
914a2e73f56SAlex Deucher * Returns the reference clock used by the gfx engine
915a2e73f56SAlex Deucher * (CIK).
916a2e73f56SAlex Deucher */
cik_get_xclk(struct amdgpu_device * adev)917a2e73f56SAlex Deucher static u32 cik_get_xclk(struct amdgpu_device *adev)
918a2e73f56SAlex Deucher {
919a2e73f56SAlex Deucher u32 reference_clock = adev->clock.spll.reference_freq;
920a2e73f56SAlex Deucher
9212f7d10b3SJammy Zhou if (adev->flags & AMD_IS_APU) {
922a2e73f56SAlex Deucher if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
923a2e73f56SAlex Deucher return reference_clock / 2;
924a2e73f56SAlex Deucher } else {
925a2e73f56SAlex Deucher if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
926a2e73f56SAlex Deucher return reference_clock / 4;
927a2e73f56SAlex Deucher }
928a2e73f56SAlex Deucher return reference_clock;
929a2e73f56SAlex Deucher }
930a2e73f56SAlex Deucher
931a2e73f56SAlex Deucher /**
932a2e73f56SAlex Deucher * cik_srbm_select - select specific register instances
933a2e73f56SAlex Deucher *
934a2e73f56SAlex Deucher * @adev: amdgpu_device pointer
935a2e73f56SAlex Deucher * @me: selected ME (micro engine)
936a2e73f56SAlex Deucher * @pipe: pipe
937a2e73f56SAlex Deucher * @queue: queue
938a2e73f56SAlex Deucher * @vmid: VMID
939a2e73f56SAlex Deucher *
940a2e73f56SAlex Deucher * Switches the currently active registers instances. Some
941a2e73f56SAlex Deucher * registers are instanced per VMID, others are instanced per
942a2e73f56SAlex Deucher * me/pipe/queue combination.
943a2e73f56SAlex Deucher */
cik_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)944a2e73f56SAlex Deucher void cik_srbm_select(struct amdgpu_device *adev,
945a2e73f56SAlex Deucher u32 me, u32 pipe, u32 queue, u32 vmid)
946a2e73f56SAlex Deucher {
947a2e73f56SAlex Deucher u32 srbm_gfx_cntl =
948a2e73f56SAlex Deucher (((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
949a2e73f56SAlex Deucher ((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
950a2e73f56SAlex Deucher ((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
951a2e73f56SAlex Deucher ((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
952a2e73f56SAlex Deucher WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
953a2e73f56SAlex Deucher }
954a2e73f56SAlex Deucher
cik_vga_set_state(struct amdgpu_device * adev,bool state)955a2e73f56SAlex Deucher static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
956a2e73f56SAlex Deucher {
957a2e73f56SAlex Deucher uint32_t tmp;
958a2e73f56SAlex Deucher
959a2e73f56SAlex Deucher tmp = RREG32(mmCONFIG_CNTL);
960004e29ccSEdward O'Callaghan if (!state)
961a2e73f56SAlex Deucher tmp |= CONFIG_CNTL__VGA_DIS_MASK;
962a2e73f56SAlex Deucher else
963a2e73f56SAlex Deucher tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
964a2e73f56SAlex Deucher WREG32(mmCONFIG_CNTL, tmp);
965a2e73f56SAlex Deucher }
966a2e73f56SAlex Deucher
cik_read_disabled_bios(struct amdgpu_device * adev)967a2e73f56SAlex Deucher static bool cik_read_disabled_bios(struct amdgpu_device *adev)
968a2e73f56SAlex Deucher {
969a2e73f56SAlex Deucher u32 bus_cntl;
970a2e73f56SAlex Deucher u32 d1vga_control = 0;
971a2e73f56SAlex Deucher u32 d2vga_control = 0;
972a2e73f56SAlex Deucher u32 vga_render_control = 0;
973a2e73f56SAlex Deucher u32 rom_cntl;
974a2e73f56SAlex Deucher bool r;
975a2e73f56SAlex Deucher
976a2e73f56SAlex Deucher bus_cntl = RREG32(mmBUS_CNTL);
977a2e73f56SAlex Deucher if (adev->mode_info.num_crtc) {
978a2e73f56SAlex Deucher d1vga_control = RREG32(mmD1VGA_CONTROL);
979a2e73f56SAlex Deucher d2vga_control = RREG32(mmD2VGA_CONTROL);
980a2e73f56SAlex Deucher vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
981a2e73f56SAlex Deucher }
982a2e73f56SAlex Deucher rom_cntl = RREG32_SMC(ixROM_CNTL);
983a2e73f56SAlex Deucher
984a2e73f56SAlex Deucher /* enable the rom */
985a2e73f56SAlex Deucher WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
986a2e73f56SAlex Deucher if (adev->mode_info.num_crtc) {
987a2e73f56SAlex Deucher /* Disable VGA mode */
988a2e73f56SAlex Deucher WREG32(mmD1VGA_CONTROL,
989a2e73f56SAlex Deucher (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
990a2e73f56SAlex Deucher D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
991a2e73f56SAlex Deucher WREG32(mmD2VGA_CONTROL,
992a2e73f56SAlex Deucher (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
993a2e73f56SAlex Deucher D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
994a2e73f56SAlex Deucher WREG32(mmVGA_RENDER_CONTROL,
995a2e73f56SAlex Deucher (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
996a2e73f56SAlex Deucher }
997a2e73f56SAlex Deucher WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
998a2e73f56SAlex Deucher
999a2e73f56SAlex Deucher r = amdgpu_read_bios(adev);
1000a2e73f56SAlex Deucher
1001a2e73f56SAlex Deucher /* restore regs */
1002a2e73f56SAlex Deucher WREG32(mmBUS_CNTL, bus_cntl);
1003a2e73f56SAlex Deucher if (adev->mode_info.num_crtc) {
1004a2e73f56SAlex Deucher WREG32(mmD1VGA_CONTROL, d1vga_control);
1005a2e73f56SAlex Deucher WREG32(mmD2VGA_CONTROL, d2vga_control);
1006a2e73f56SAlex Deucher WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
1007a2e73f56SAlex Deucher }
1008a2e73f56SAlex Deucher WREG32_SMC(ixROM_CNTL, rom_cntl);
1009a2e73f56SAlex Deucher return r;
1010a2e73f56SAlex Deucher }
1011a2e73f56SAlex Deucher
cik_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)10121eb22bd3SAlex Deucher static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
10131eb22bd3SAlex Deucher u8 *bios, u32 length_bytes)
10141eb22bd3SAlex Deucher {
10151eb22bd3SAlex Deucher u32 *dw_ptr;
10161eb22bd3SAlex Deucher unsigned long flags;
10171eb22bd3SAlex Deucher u32 i, length_dw;
10181eb22bd3SAlex Deucher
10191eb22bd3SAlex Deucher if (bios == NULL)
10201eb22bd3SAlex Deucher return false;
10211eb22bd3SAlex Deucher if (length_bytes == 0)
10221eb22bd3SAlex Deucher return false;
10231eb22bd3SAlex Deucher /* APU vbios image is part of sbios image */
10241eb22bd3SAlex Deucher if (adev->flags & AMD_IS_APU)
10251eb22bd3SAlex Deucher return false;
10261eb22bd3SAlex Deucher
10271eb22bd3SAlex Deucher dw_ptr = (u32 *)bios;
10281eb22bd3SAlex Deucher length_dw = ALIGN(length_bytes, 4) / 4;
10291eb22bd3SAlex Deucher /* take the smc lock since we are using the smc index */
10301eb22bd3SAlex Deucher spin_lock_irqsave(&adev->smc_idx_lock, flags);
10311eb22bd3SAlex Deucher /* set rom index to 0 */
10321eb22bd3SAlex Deucher WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
10331eb22bd3SAlex Deucher WREG32(mmSMC_IND_DATA_0, 0);
10341eb22bd3SAlex Deucher /* set index to data for continous read */
10351eb22bd3SAlex Deucher WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
10361eb22bd3SAlex Deucher for (i = 0; i < length_dw; i++)
10371eb22bd3SAlex Deucher dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
10381eb22bd3SAlex Deucher spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
10391eb22bd3SAlex Deucher
10401eb22bd3SAlex Deucher return true;
10411eb22bd3SAlex Deucher }
10421eb22bd3SAlex Deucher
1043eca2240fSNils Wallménius static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
104497fcc76bSChristian König {mmGRBM_STATUS},
1045664fe85aSMarek Olšák {mmGRBM_STATUS2},
1046664fe85aSMarek Olšák {mmGRBM_STATUS_SE0},
1047664fe85aSMarek Olšák {mmGRBM_STATUS_SE1},
1048664fe85aSMarek Olšák {mmGRBM_STATUS_SE2},
1049664fe85aSMarek Olšák {mmGRBM_STATUS_SE3},
1050664fe85aSMarek Olšák {mmSRBM_STATUS},
1051664fe85aSMarek Olšák {mmSRBM_STATUS2},
1052664fe85aSMarek Olšák {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
1053664fe85aSMarek Olšák {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
1054664fe85aSMarek Olšák {mmCP_STAT},
1055664fe85aSMarek Olšák {mmCP_STALLED_STAT1},
1056664fe85aSMarek Olšák {mmCP_STALLED_STAT2},
1057664fe85aSMarek Olšák {mmCP_STALLED_STAT3},
1058664fe85aSMarek Olšák {mmCP_CPF_BUSY_STAT},
1059664fe85aSMarek Olšák {mmCP_CPF_STALLED_STAT1},
1060664fe85aSMarek Olšák {mmCP_CPF_STATUS},
1061664fe85aSMarek Olšák {mmCP_CPC_BUSY_STAT},
1062664fe85aSMarek Olšák {mmCP_CPC_STALLED_STAT1},
1063664fe85aSMarek Olšák {mmCP_CPC_STATUS},
106497fcc76bSChristian König {mmGB_ADDR_CONFIG},
106597fcc76bSChristian König {mmMC_ARB_RAMCFG},
106697fcc76bSChristian König {mmGB_TILE_MODE0},
106797fcc76bSChristian König {mmGB_TILE_MODE1},
106897fcc76bSChristian König {mmGB_TILE_MODE2},
106997fcc76bSChristian König {mmGB_TILE_MODE3},
107097fcc76bSChristian König {mmGB_TILE_MODE4},
107197fcc76bSChristian König {mmGB_TILE_MODE5},
107297fcc76bSChristian König {mmGB_TILE_MODE6},
107397fcc76bSChristian König {mmGB_TILE_MODE7},
107497fcc76bSChristian König {mmGB_TILE_MODE8},
107597fcc76bSChristian König {mmGB_TILE_MODE9},
107697fcc76bSChristian König {mmGB_TILE_MODE10},
107797fcc76bSChristian König {mmGB_TILE_MODE11},
107897fcc76bSChristian König {mmGB_TILE_MODE12},
107997fcc76bSChristian König {mmGB_TILE_MODE13},
108097fcc76bSChristian König {mmGB_TILE_MODE14},
108197fcc76bSChristian König {mmGB_TILE_MODE15},
108297fcc76bSChristian König {mmGB_TILE_MODE16},
108397fcc76bSChristian König {mmGB_TILE_MODE17},
108497fcc76bSChristian König {mmGB_TILE_MODE18},
108597fcc76bSChristian König {mmGB_TILE_MODE19},
108697fcc76bSChristian König {mmGB_TILE_MODE20},
108797fcc76bSChristian König {mmGB_TILE_MODE21},
108897fcc76bSChristian König {mmGB_TILE_MODE22},
108997fcc76bSChristian König {mmGB_TILE_MODE23},
109097fcc76bSChristian König {mmGB_TILE_MODE24},
109197fcc76bSChristian König {mmGB_TILE_MODE25},
109297fcc76bSChristian König {mmGB_TILE_MODE26},
109397fcc76bSChristian König {mmGB_TILE_MODE27},
109497fcc76bSChristian König {mmGB_TILE_MODE28},
109597fcc76bSChristian König {mmGB_TILE_MODE29},
109697fcc76bSChristian König {mmGB_TILE_MODE30},
109797fcc76bSChristian König {mmGB_TILE_MODE31},
109897fcc76bSChristian König {mmGB_MACROTILE_MODE0},
109997fcc76bSChristian König {mmGB_MACROTILE_MODE1},
110097fcc76bSChristian König {mmGB_MACROTILE_MODE2},
110197fcc76bSChristian König {mmGB_MACROTILE_MODE3},
110297fcc76bSChristian König {mmGB_MACROTILE_MODE4},
110397fcc76bSChristian König {mmGB_MACROTILE_MODE5},
110497fcc76bSChristian König {mmGB_MACROTILE_MODE6},
110597fcc76bSChristian König {mmGB_MACROTILE_MODE7},
110697fcc76bSChristian König {mmGB_MACROTILE_MODE8},
110797fcc76bSChristian König {mmGB_MACROTILE_MODE9},
110897fcc76bSChristian König {mmGB_MACROTILE_MODE10},
110997fcc76bSChristian König {mmGB_MACROTILE_MODE11},
111097fcc76bSChristian König {mmGB_MACROTILE_MODE12},
111197fcc76bSChristian König {mmGB_MACROTILE_MODE13},
111297fcc76bSChristian König {mmGB_MACROTILE_MODE14},
111397fcc76bSChristian König {mmGB_MACROTILE_MODE15},
111497fcc76bSChristian König {mmCC_RB_BACKEND_DISABLE, true},
111597fcc76bSChristian König {mmGC_USER_RB_BACKEND_DISABLE, true},
111697fcc76bSChristian König {mmGB_BACKEND_MAP, false},
111797fcc76bSChristian König {mmPA_SC_RASTER_CONFIG, true},
111897fcc76bSChristian König {mmPA_SC_RASTER_CONFIG_1, true},
1119a2e73f56SAlex Deucher };
1120a2e73f56SAlex Deucher
1121aca31681SAlex Deucher
cik_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)1122aca31681SAlex Deucher static uint32_t cik_get_register_value(struct amdgpu_device *adev,
1123aca31681SAlex Deucher bool indexed, u32 se_num,
1124aca31681SAlex Deucher u32 sh_num, u32 reg_offset)
1125a2e73f56SAlex Deucher {
1126aca31681SAlex Deucher if (indexed) {
1127a2e73f56SAlex Deucher uint32_t val;
1128aca31681SAlex Deucher unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1129aca31681SAlex Deucher unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1130aca31681SAlex Deucher
1131aca31681SAlex Deucher switch (reg_offset) {
1132aca31681SAlex Deucher case mmCC_RB_BACKEND_DISABLE:
1133aca31681SAlex Deucher return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1134aca31681SAlex Deucher case mmGC_USER_RB_BACKEND_DISABLE:
1135aca31681SAlex Deucher return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1136aca31681SAlex Deucher case mmPA_SC_RASTER_CONFIG:
1137aca31681SAlex Deucher return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1138aca31681SAlex Deucher case mmPA_SC_RASTER_CONFIG_1:
1139aca31681SAlex Deucher return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
1140aca31681SAlex Deucher }
1141a2e73f56SAlex Deucher
1142a2e73f56SAlex Deucher mutex_lock(&adev->grbm_idx_mutex);
1143a2e73f56SAlex Deucher if (se_num != 0xffffffff || sh_num != 0xffffffff)
1144d51ac6d0SLe Ma amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
1145a2e73f56SAlex Deucher
1146a2e73f56SAlex Deucher val = RREG32(reg_offset);
1147a2e73f56SAlex Deucher
1148a2e73f56SAlex Deucher if (se_num != 0xffffffff || sh_num != 0xffffffff)
1149d51ac6d0SLe Ma amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1150a2e73f56SAlex Deucher mutex_unlock(&adev->grbm_idx_mutex);
1151a2e73f56SAlex Deucher return val;
1152aca31681SAlex Deucher } else {
1153aca31681SAlex Deucher unsigned idx;
1154aca31681SAlex Deucher
1155aca31681SAlex Deucher switch (reg_offset) {
1156aca31681SAlex Deucher case mmGB_ADDR_CONFIG:
1157aca31681SAlex Deucher return adev->gfx.config.gb_addr_config;
1158aca31681SAlex Deucher case mmMC_ARB_RAMCFG:
1159aca31681SAlex Deucher return adev->gfx.config.mc_arb_ramcfg;
1160aca31681SAlex Deucher case mmGB_TILE_MODE0:
1161aca31681SAlex Deucher case mmGB_TILE_MODE1:
1162aca31681SAlex Deucher case mmGB_TILE_MODE2:
1163aca31681SAlex Deucher case mmGB_TILE_MODE3:
1164aca31681SAlex Deucher case mmGB_TILE_MODE4:
1165aca31681SAlex Deucher case mmGB_TILE_MODE5:
1166aca31681SAlex Deucher case mmGB_TILE_MODE6:
1167aca31681SAlex Deucher case mmGB_TILE_MODE7:
1168aca31681SAlex Deucher case mmGB_TILE_MODE8:
1169aca31681SAlex Deucher case mmGB_TILE_MODE9:
1170aca31681SAlex Deucher case mmGB_TILE_MODE10:
1171aca31681SAlex Deucher case mmGB_TILE_MODE11:
1172aca31681SAlex Deucher case mmGB_TILE_MODE12:
1173aca31681SAlex Deucher case mmGB_TILE_MODE13:
1174aca31681SAlex Deucher case mmGB_TILE_MODE14:
1175aca31681SAlex Deucher case mmGB_TILE_MODE15:
1176aca31681SAlex Deucher case mmGB_TILE_MODE16:
1177aca31681SAlex Deucher case mmGB_TILE_MODE17:
1178aca31681SAlex Deucher case mmGB_TILE_MODE18:
1179aca31681SAlex Deucher case mmGB_TILE_MODE19:
1180aca31681SAlex Deucher case mmGB_TILE_MODE20:
1181aca31681SAlex Deucher case mmGB_TILE_MODE21:
1182aca31681SAlex Deucher case mmGB_TILE_MODE22:
1183aca31681SAlex Deucher case mmGB_TILE_MODE23:
1184aca31681SAlex Deucher case mmGB_TILE_MODE24:
1185aca31681SAlex Deucher case mmGB_TILE_MODE25:
1186aca31681SAlex Deucher case mmGB_TILE_MODE26:
1187aca31681SAlex Deucher case mmGB_TILE_MODE27:
1188aca31681SAlex Deucher case mmGB_TILE_MODE28:
1189aca31681SAlex Deucher case mmGB_TILE_MODE29:
1190aca31681SAlex Deucher case mmGB_TILE_MODE30:
1191aca31681SAlex Deucher case mmGB_TILE_MODE31:
1192aca31681SAlex Deucher idx = (reg_offset - mmGB_TILE_MODE0);
1193aca31681SAlex Deucher return adev->gfx.config.tile_mode_array[idx];
1194aca31681SAlex Deucher case mmGB_MACROTILE_MODE0:
1195aca31681SAlex Deucher case mmGB_MACROTILE_MODE1:
1196aca31681SAlex Deucher case mmGB_MACROTILE_MODE2:
1197aca31681SAlex Deucher case mmGB_MACROTILE_MODE3:
1198aca31681SAlex Deucher case mmGB_MACROTILE_MODE4:
1199aca31681SAlex Deucher case mmGB_MACROTILE_MODE5:
1200aca31681SAlex Deucher case mmGB_MACROTILE_MODE6:
1201aca31681SAlex Deucher case mmGB_MACROTILE_MODE7:
1202aca31681SAlex Deucher case mmGB_MACROTILE_MODE8:
1203aca31681SAlex Deucher case mmGB_MACROTILE_MODE9:
1204aca31681SAlex Deucher case mmGB_MACROTILE_MODE10:
1205aca31681SAlex Deucher case mmGB_MACROTILE_MODE11:
1206aca31681SAlex Deucher case mmGB_MACROTILE_MODE12:
1207aca31681SAlex Deucher case mmGB_MACROTILE_MODE13:
1208aca31681SAlex Deucher case mmGB_MACROTILE_MODE14:
1209aca31681SAlex Deucher case mmGB_MACROTILE_MODE15:
1210aca31681SAlex Deucher idx = (reg_offset - mmGB_MACROTILE_MODE0);
1211aca31681SAlex Deucher return adev->gfx.config.macrotile_mode_array[idx];
1212aca31681SAlex Deucher default:
1213aca31681SAlex Deucher return RREG32(reg_offset);
1214aca31681SAlex Deucher }
1215aca31681SAlex Deucher }
1216a2e73f56SAlex Deucher }
1217a2e73f56SAlex Deucher
cik_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1218a2e73f56SAlex Deucher static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1219a2e73f56SAlex Deucher u32 sh_num, u32 reg_offset, u32 *value)
1220a2e73f56SAlex Deucher {
1221a2e73f56SAlex Deucher uint32_t i;
1222a2e73f56SAlex Deucher
1223a2e73f56SAlex Deucher *value = 0;
1224a2e73f56SAlex Deucher for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
1225aca31681SAlex Deucher bool indexed = cik_allowed_read_registers[i].grbm_indexed;
1226aca31681SAlex Deucher
1227a2e73f56SAlex Deucher if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1228a2e73f56SAlex Deucher continue;
1229a2e73f56SAlex Deucher
1230aca31681SAlex Deucher *value = cik_get_register_value(adev, indexed, se_num, sh_num,
1231aca31681SAlex Deucher reg_offset);
1232a2e73f56SAlex Deucher return 0;
1233a2e73f56SAlex Deucher }
1234a2e73f56SAlex Deucher return -EINVAL;
1235a2e73f56SAlex Deucher }
1236a2e73f56SAlex Deucher
1237a2e73f56SAlex Deucher struct kv_reset_save_regs {
1238a2e73f56SAlex Deucher u32 gmcon_reng_execute;
1239a2e73f56SAlex Deucher u32 gmcon_misc;
1240a2e73f56SAlex Deucher u32 gmcon_misc3;
1241a2e73f56SAlex Deucher };
1242a2e73f56SAlex Deucher
kv_save_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1243a2e73f56SAlex Deucher static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1244a2e73f56SAlex Deucher struct kv_reset_save_regs *save)
1245a2e73f56SAlex Deucher {
1246a2e73f56SAlex Deucher save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1247a2e73f56SAlex Deucher save->gmcon_misc = RREG32(mmGMCON_MISC);
1248a2e73f56SAlex Deucher save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1249a2e73f56SAlex Deucher
1250a2e73f56SAlex Deucher WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1251a2e73f56SAlex Deucher ~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1252a2e73f56SAlex Deucher WREG32(mmGMCON_MISC, save->gmcon_misc &
1253a2e73f56SAlex Deucher ~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1254a2e73f56SAlex Deucher GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1255a2e73f56SAlex Deucher }
1256a2e73f56SAlex Deucher
kv_restore_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1257a2e73f56SAlex Deucher static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1258a2e73f56SAlex Deucher struct kv_reset_save_regs *save)
1259a2e73f56SAlex Deucher {
1260a2e73f56SAlex Deucher int i;
1261a2e73f56SAlex Deucher
1262a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1263a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1264a2e73f56SAlex Deucher
1265a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1266a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1267a2e73f56SAlex Deucher
1268a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1269a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1270a2e73f56SAlex Deucher
1271a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1272a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1273a2e73f56SAlex Deucher
1274a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1275a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1276a2e73f56SAlex Deucher
1277a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1278a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1279a2e73f56SAlex Deucher
1280a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1281a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1282a2e73f56SAlex Deucher
1283a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1284a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1285a2e73f56SAlex Deucher
1286a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1287a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1288a2e73f56SAlex Deucher
1289a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1290a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1291a2e73f56SAlex Deucher
1292a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1293a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1294a2e73f56SAlex Deucher
1295a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1296a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1297a2e73f56SAlex Deucher
1298a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1299a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1300a2e73f56SAlex Deucher
1301a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1302a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1303a2e73f56SAlex Deucher
1304a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1305a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1306a2e73f56SAlex Deucher
1307a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1308a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1309a2e73f56SAlex Deucher
1310a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1311a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1312a2e73f56SAlex Deucher
1313a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1314a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1315a2e73f56SAlex Deucher
1316a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1317a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1318a2e73f56SAlex Deucher
1319a2e73f56SAlex Deucher for (i = 0; i < 5; i++)
1320a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0);
1321a2e73f56SAlex Deucher
1322a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1323a2e73f56SAlex Deucher WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1324a2e73f56SAlex Deucher
1325a2e73f56SAlex Deucher WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1326a2e73f56SAlex Deucher WREG32(mmGMCON_MISC, save->gmcon_misc);
1327a2e73f56SAlex Deucher WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1328a2e73f56SAlex Deucher }
1329a2e73f56SAlex Deucher
133044ab8bb0SAlex Deucher /**
133144ab8bb0SAlex Deucher * cik_asic_pci_config_reset - soft reset GPU
133244ab8bb0SAlex Deucher *
133344ab8bb0SAlex Deucher * @adev: amdgpu_device pointer
133444ab8bb0SAlex Deucher *
133544ab8bb0SAlex Deucher * Use PCI Config method to reset the GPU.
133644ab8bb0SAlex Deucher *
133744ab8bb0SAlex Deucher * Returns 0 for success.
133844ab8bb0SAlex Deucher */
cik_asic_pci_config_reset(struct amdgpu_device * adev)133944ab8bb0SAlex Deucher static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
1340a2e73f56SAlex Deucher {
1341a2e73f56SAlex Deucher struct kv_reset_save_regs kv_save = { 0 };
1342ceb5bc86SAlex Deucher u32 i;
134389a31827SChunming Zhou int r = -EINVAL;
1344a2e73f56SAlex Deucher
134544ab8bb0SAlex Deucher amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1346a2e73f56SAlex Deucher
13472f7d10b3SJammy Zhou if (adev->flags & AMD_IS_APU)
1348a2e73f56SAlex Deucher kv_save_regs_for_reset(adev, &kv_save);
1349a2e73f56SAlex Deucher
1350a2e73f56SAlex Deucher /* disable BM */
1351a2e73f56SAlex Deucher pci_clear_master(adev->pdev);
1352a2e73f56SAlex Deucher /* reset */
13538111c387SAlex Deucher amdgpu_device_pci_config_reset(adev);
1354a2e73f56SAlex Deucher
1355a2e73f56SAlex Deucher udelay(100);
1356a2e73f56SAlex Deucher
1357a2e73f56SAlex Deucher /* wait for asic to come out of reset */
1358a2e73f56SAlex Deucher for (i = 0; i < adev->usec_timeout; i++) {
135989a31827SChunming Zhou if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1360b314f9a9SChunming Zhou /* enable BM */
1361b314f9a9SChunming Zhou pci_set_master(adev->pdev);
1362c836fec5SJim Qu adev->has_hw_reset = true;
136389a31827SChunming Zhou r = 0;
1364a2e73f56SAlex Deucher break;
136589a31827SChunming Zhou }
1366a2e73f56SAlex Deucher udelay(1);
1367a2e73f56SAlex Deucher }
1368a2e73f56SAlex Deucher
1369a2e73f56SAlex Deucher /* does asic init need to be run first??? */
13702f7d10b3SJammy Zhou if (adev->flags & AMD_IS_APU)
1371a2e73f56SAlex Deucher kv_restore_regs_for_reset(adev, &kv_save);
137289a31827SChunming Zhou
137372a57438SAlex Deucher amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1374a2e73f56SAlex Deucher
137589a31827SChunming Zhou return r;
1376a2e73f56SAlex Deucher }
1377a2e73f56SAlex Deucher
cik_asic_supports_baco(struct amdgpu_device * adev)1378b2207dc6SMa Jun static int cik_asic_supports_baco(struct amdgpu_device *adev)
13790d0c07eeSAlex Deucher {
13800d0c07eeSAlex Deucher switch (adev->asic_type) {
13810d0c07eeSAlex Deucher case CHIP_BONAIRE:
13820d0c07eeSAlex Deucher case CHIP_HAWAII:
13839530273eSEvan Quan return amdgpu_dpm_is_baco_supported(adev);
13840d0c07eeSAlex Deucher default:
1385b2207dc6SMa Jun return 0;
13860d0c07eeSAlex Deucher }
13870d0c07eeSAlex Deucher }
13880d0c07eeSAlex Deucher
13896d0f50daSAlex Deucher static enum amd_reset_method
cik_asic_reset_method(struct amdgpu_device * adev)13906d0f50daSAlex Deucher cik_asic_reset_method(struct amdgpu_device *adev)
13916d0f50daSAlex Deucher {
139297c002beSAlex Deucher bool baco_reset;
139397c002beSAlex Deucher
1394273da6ffSWenhui Sheng if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
1395273da6ffSWenhui Sheng amdgpu_reset_method == AMD_RESET_METHOD_BACO)
1396273da6ffSWenhui Sheng return amdgpu_reset_method;
1397273da6ffSWenhui Sheng
1398273da6ffSWenhui Sheng if (amdgpu_reset_method != -1)
1399273da6ffSWenhui Sheng dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
1400273da6ffSWenhui Sheng amdgpu_reset_method);
1401273da6ffSWenhui Sheng
140297c002beSAlex Deucher switch (adev->asic_type) {
140397c002beSAlex Deucher case CHIP_BONAIRE:
14040134022fSEvan Quan case CHIP_HAWAII:
14050134022fSEvan Quan baco_reset = cik_asic_supports_baco(adev);
14060134022fSEvan Quan break;
140797c002beSAlex Deucher default:
140897c002beSAlex Deucher baco_reset = false;
140997c002beSAlex Deucher break;
141097c002beSAlex Deucher }
141197c002beSAlex Deucher
141297c002beSAlex Deucher if (baco_reset)
141397c002beSAlex Deucher return AMD_RESET_METHOD_BACO;
141497c002beSAlex Deucher else
14156d0f50daSAlex Deucher return AMD_RESET_METHOD_LEGACY;
14166d0f50daSAlex Deucher }
14176d0f50daSAlex Deucher
141897c002beSAlex Deucher /**
141997c002beSAlex Deucher * cik_asic_reset - soft reset GPU
142097c002beSAlex Deucher *
142197c002beSAlex Deucher * @adev: amdgpu_device pointer
142297c002beSAlex Deucher *
142397c002beSAlex Deucher * Look up which blocks are hung and attempt
142497c002beSAlex Deucher * to reset them.
142597c002beSAlex Deucher * Returns 0 for success.
142697c002beSAlex Deucher */
cik_asic_reset(struct amdgpu_device * adev)142797c002beSAlex Deucher static int cik_asic_reset(struct amdgpu_device *adev)
142897c002beSAlex Deucher {
142997c002beSAlex Deucher int r;
143097c002beSAlex Deucher
1431e8309d50SAlex Deucher /* APUs don't have full asic reset */
1432e8309d50SAlex Deucher if (adev->flags & AMD_IS_APU)
1433e8309d50SAlex Deucher return 0;
1434e8309d50SAlex Deucher
1435dea8b900SAlex Deucher if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
143611043b7aSAlex Deucher dev_info(adev->dev, "BACO reset\n");
14379530273eSEvan Quan r = amdgpu_dpm_baco_reset(adev);
1438dea8b900SAlex Deucher } else {
143911043b7aSAlex Deucher dev_info(adev->dev, "PCI CONFIG reset\n");
144097c002beSAlex Deucher r = cik_asic_pci_config_reset(adev);
1441dea8b900SAlex Deucher }
144297c002beSAlex Deucher
144397c002beSAlex Deucher return r;
144497c002beSAlex Deucher }
144597c002beSAlex Deucher
cik_get_config_memsize(struct amdgpu_device * adev)1446bbf282d8SAlex Deucher static u32 cik_get_config_memsize(struct amdgpu_device *adev)
1447bbf282d8SAlex Deucher {
1448bbf282d8SAlex Deucher return RREG32(mmCONFIG_MEMSIZE);
1449bbf282d8SAlex Deucher }
1450bbf282d8SAlex Deucher
cik_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)1451a2e73f56SAlex Deucher static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1452a2e73f56SAlex Deucher u32 cntl_reg, u32 status_reg)
1453a2e73f56SAlex Deucher {
1454a2e73f56SAlex Deucher int r, i;
1455a2e73f56SAlex Deucher struct atom_clock_dividers dividers;
1456a2e73f56SAlex Deucher uint32_t tmp;
1457a2e73f56SAlex Deucher
1458a2e73f56SAlex Deucher r = amdgpu_atombios_get_clock_dividers(adev,
1459a2e73f56SAlex Deucher COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1460a2e73f56SAlex Deucher clock, false, ÷rs);
1461a2e73f56SAlex Deucher if (r)
1462a2e73f56SAlex Deucher return r;
1463a2e73f56SAlex Deucher
1464a2e73f56SAlex Deucher tmp = RREG32_SMC(cntl_reg);
1465a2e73f56SAlex Deucher tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1466a2e73f56SAlex Deucher CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1467a2e73f56SAlex Deucher tmp |= dividers.post_divider;
1468a2e73f56SAlex Deucher WREG32_SMC(cntl_reg, tmp);
1469a2e73f56SAlex Deucher
1470a2e73f56SAlex Deucher for (i = 0; i < 100; i++) {
1471a2e73f56SAlex Deucher if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1472a2e73f56SAlex Deucher break;
1473a2e73f56SAlex Deucher mdelay(10);
1474a2e73f56SAlex Deucher }
1475a2e73f56SAlex Deucher if (i == 100)
1476a2e73f56SAlex Deucher return -ETIMEDOUT;
1477a2e73f56SAlex Deucher
1478a2e73f56SAlex Deucher return 0;
1479a2e73f56SAlex Deucher }
1480a2e73f56SAlex Deucher
cik_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1481a2e73f56SAlex Deucher static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1482a2e73f56SAlex Deucher {
1483a2e73f56SAlex Deucher int r = 0;
1484a2e73f56SAlex Deucher
1485a2e73f56SAlex Deucher r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1486a2e73f56SAlex Deucher if (r)
1487a2e73f56SAlex Deucher return r;
1488a2e73f56SAlex Deucher
1489a2e73f56SAlex Deucher r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1490a2e73f56SAlex Deucher return r;
1491a2e73f56SAlex Deucher }
1492a2e73f56SAlex Deucher
cik_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1493a2e73f56SAlex Deucher static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1494a2e73f56SAlex Deucher {
1495a2e73f56SAlex Deucher int r, i;
1496a2e73f56SAlex Deucher struct atom_clock_dividers dividers;
1497a2e73f56SAlex Deucher u32 tmp;
1498a2e73f56SAlex Deucher
1499a2e73f56SAlex Deucher r = amdgpu_atombios_get_clock_dividers(adev,
1500a2e73f56SAlex Deucher COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1501a2e73f56SAlex Deucher ecclk, false, ÷rs);
1502a2e73f56SAlex Deucher if (r)
1503a2e73f56SAlex Deucher return r;
1504a2e73f56SAlex Deucher
1505a2e73f56SAlex Deucher for (i = 0; i < 100; i++) {
1506a2e73f56SAlex Deucher if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1507a2e73f56SAlex Deucher break;
1508a2e73f56SAlex Deucher mdelay(10);
1509a2e73f56SAlex Deucher }
1510a2e73f56SAlex Deucher if (i == 100)
1511a2e73f56SAlex Deucher return -ETIMEDOUT;
1512a2e73f56SAlex Deucher
1513a2e73f56SAlex Deucher tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1514a2e73f56SAlex Deucher tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1515a2e73f56SAlex Deucher CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1516a2e73f56SAlex Deucher tmp |= dividers.post_divider;
1517a2e73f56SAlex Deucher WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1518a2e73f56SAlex Deucher
1519a2e73f56SAlex Deucher for (i = 0; i < 100; i++) {
1520a2e73f56SAlex Deucher if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1521a2e73f56SAlex Deucher break;
1522a2e73f56SAlex Deucher mdelay(10);
1523a2e73f56SAlex Deucher }
1524a2e73f56SAlex Deucher if (i == 100)
1525a2e73f56SAlex Deucher return -ETIMEDOUT;
1526a2e73f56SAlex Deucher
1527a2e73f56SAlex Deucher return 0;
1528a2e73f56SAlex Deucher }
1529a2e73f56SAlex Deucher
cik_pcie_gen3_enable(struct amdgpu_device * adev)1530a2e73f56SAlex Deucher static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1531a2e73f56SAlex Deucher {
1532a2e73f56SAlex Deucher struct pci_dev *root = adev->pdev->bus->self;
1533d0dd7f0cSAlex Deucher u32 speed_cntl, current_data_rate;
1534d0dd7f0cSAlex Deucher int i;
1535a2e73f56SAlex Deucher u16 tmp16;
1536a2e73f56SAlex Deucher
1537e79d5c08SAlex Deucher if (pci_is_root_bus(adev->pdev->bus))
1538e79d5c08SAlex Deucher return;
1539e79d5c08SAlex Deucher
1540a2e73f56SAlex Deucher if (amdgpu_pcie_gen2 == 0)
1541a2e73f56SAlex Deucher return;
1542a2e73f56SAlex Deucher
15432f7d10b3SJammy Zhou if (adev->flags & AMD_IS_APU)
1544a2e73f56SAlex Deucher return;
1545a2e73f56SAlex Deucher
1546d0dd7f0cSAlex Deucher if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1547d0dd7f0cSAlex Deucher CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1548a2e73f56SAlex Deucher return;
1549a2e73f56SAlex Deucher
1550a2e73f56SAlex Deucher speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1551a2e73f56SAlex Deucher current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1552a2e73f56SAlex Deucher PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1553d0dd7f0cSAlex Deucher if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1554a2e73f56SAlex Deucher if (current_data_rate == 2) {
1555a2e73f56SAlex Deucher DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1556a2e73f56SAlex Deucher return;
1557a2e73f56SAlex Deucher }
1558a2e73f56SAlex Deucher DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1559d0dd7f0cSAlex Deucher } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1560a2e73f56SAlex Deucher if (current_data_rate == 1) {
1561a2e73f56SAlex Deucher DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1562a2e73f56SAlex Deucher return;
1563a2e73f56SAlex Deucher }
1564a2e73f56SAlex Deucher DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1565a2e73f56SAlex Deucher }
1566a2e73f56SAlex Deucher
156788027c89SFrederick Lawler if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1568a2e73f56SAlex Deucher return;
1569a2e73f56SAlex Deucher
1570d0dd7f0cSAlex Deucher if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1571a2e73f56SAlex Deucher /* re-try equalization if gen3 is not already enabled */
1572a2e73f56SAlex Deucher if (current_data_rate != 2) {
1573a2e73f56SAlex Deucher u16 bridge_cfg, gpu_cfg;
1574a2e73f56SAlex Deucher u16 bridge_cfg2, gpu_cfg2;
1575a2e73f56SAlex Deucher u32 max_lw, current_lw, tmp;
1576a2e73f56SAlex Deucher
1577ce7d8811SIlpo Järvinen pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1578ce7d8811SIlpo Järvinen pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1579a2e73f56SAlex Deucher
1580a2e73f56SAlex Deucher tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1581a2e73f56SAlex Deucher max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1582a2e73f56SAlex Deucher PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1583a2e73f56SAlex Deucher current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1584a2e73f56SAlex Deucher >> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1585a2e73f56SAlex Deucher
1586a2e73f56SAlex Deucher if (current_lw < max_lw) {
1587a2e73f56SAlex Deucher tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1588a2e73f56SAlex Deucher if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1589a2e73f56SAlex Deucher tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1590a2e73f56SAlex Deucher PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1591a2e73f56SAlex Deucher tmp |= (max_lw <<
1592a2e73f56SAlex Deucher PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1593a2e73f56SAlex Deucher tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1594a2e73f56SAlex Deucher PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1595a2e73f56SAlex Deucher PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1596a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1597a2e73f56SAlex Deucher }
1598a2e73f56SAlex Deucher }
1599a2e73f56SAlex Deucher
1600a2e73f56SAlex Deucher for (i = 0; i < 10; i++) {
1601a2e73f56SAlex Deucher /* check status */
160288027c89SFrederick Lawler pcie_capability_read_word(adev->pdev,
160388027c89SFrederick Lawler PCI_EXP_DEVSTA,
160488027c89SFrederick Lawler &tmp16);
1605a2e73f56SAlex Deucher if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1606a2e73f56SAlex Deucher break;
1607a2e73f56SAlex Deucher
160888027c89SFrederick Lawler pcie_capability_read_word(root, PCI_EXP_LNKCTL,
160988027c89SFrederick Lawler &bridge_cfg);
161088027c89SFrederick Lawler pcie_capability_read_word(adev->pdev,
161188027c89SFrederick Lawler PCI_EXP_LNKCTL,
161288027c89SFrederick Lawler &gpu_cfg);
1613a2e73f56SAlex Deucher
161488027c89SFrederick Lawler pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
161588027c89SFrederick Lawler &bridge_cfg2);
161688027c89SFrederick Lawler pcie_capability_read_word(adev->pdev,
161788027c89SFrederick Lawler PCI_EXP_LNKCTL2,
161888027c89SFrederick Lawler &gpu_cfg2);
1619a2e73f56SAlex Deucher
1620a2e73f56SAlex Deucher tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1621a2e73f56SAlex Deucher tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1622a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1623a2e73f56SAlex Deucher
1624a2e73f56SAlex Deucher tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1625a2e73f56SAlex Deucher tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1626a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1627a2e73f56SAlex Deucher
1628586092abSJia-Ju Bai msleep(100);
1629a2e73f56SAlex Deucher
1630a2e73f56SAlex Deucher /* linkctl */
1631ce7d8811SIlpo Järvinen pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
1632ce7d8811SIlpo Järvinen PCI_EXP_LNKCTL_HAWD,
1633ce7d8811SIlpo Järvinen bridge_cfg &
1634ce7d8811SIlpo Järvinen PCI_EXP_LNKCTL_HAWD);
1635ce7d8811SIlpo Järvinen pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
1636ce7d8811SIlpo Järvinen PCI_EXP_LNKCTL_HAWD,
1637ce7d8811SIlpo Järvinen gpu_cfg &
1638ce7d8811SIlpo Järvinen PCI_EXP_LNKCTL_HAWD);
1639a2e73f56SAlex Deucher
1640a2e73f56SAlex Deucher /* linkctl2 */
1641bb87e511SIlpo Järvinen pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL2,
1642bb87e511SIlpo Järvinen PCI_EXP_LNKCTL2_ENTER_COMP |
1643bb87e511SIlpo Järvinen PCI_EXP_LNKCTL2_TX_MARGIN,
1644bb87e511SIlpo Järvinen bridge_cfg2 &
164535e768e2SBjorn Helgaas (PCI_EXP_LNKCTL2_ENTER_COMP |
164635e768e2SBjorn Helgaas PCI_EXP_LNKCTL2_TX_MARGIN));
1647bb87e511SIlpo Järvinen pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL2,
1648bb87e511SIlpo Järvinen PCI_EXP_LNKCTL2_ENTER_COMP |
1649bb87e511SIlpo Järvinen PCI_EXP_LNKCTL2_TX_MARGIN,
1650bb87e511SIlpo Järvinen gpu_cfg2 &
165135e768e2SBjorn Helgaas (PCI_EXP_LNKCTL2_ENTER_COMP |
165235e768e2SBjorn Helgaas PCI_EXP_LNKCTL2_TX_MARGIN));
1653a2e73f56SAlex Deucher
1654a2e73f56SAlex Deucher tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1655a2e73f56SAlex Deucher tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1656a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1657a2e73f56SAlex Deucher }
1658a2e73f56SAlex Deucher }
1659a2e73f56SAlex Deucher }
1660a2e73f56SAlex Deucher
1661a2e73f56SAlex Deucher /* set the link speed */
1662a2e73f56SAlex Deucher speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1663a2e73f56SAlex Deucher PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1664a2e73f56SAlex Deucher speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1665a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1666a2e73f56SAlex Deucher
1667bb87e511SIlpo Järvinen tmp16 = 0;
1668d0dd7f0cSAlex Deucher if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
166935e768e2SBjorn Helgaas tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
1670d0dd7f0cSAlex Deucher else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
167135e768e2SBjorn Helgaas tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1672a2e73f56SAlex Deucher else
167335e768e2SBjorn Helgaas tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
1674bb87e511SIlpo Järvinen pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL2,
1675bb87e511SIlpo Järvinen PCI_EXP_LNKCTL2_TLS, tmp16);
1676a2e73f56SAlex Deucher
1677a2e73f56SAlex Deucher speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1678a2e73f56SAlex Deucher speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1679a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1680a2e73f56SAlex Deucher
1681a2e73f56SAlex Deucher for (i = 0; i < adev->usec_timeout; i++) {
1682a2e73f56SAlex Deucher speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1683a2e73f56SAlex Deucher if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1684a2e73f56SAlex Deucher break;
1685a2e73f56SAlex Deucher udelay(1);
1686a2e73f56SAlex Deucher }
1687a2e73f56SAlex Deucher }
1688a2e73f56SAlex Deucher
cik_program_aspm(struct amdgpu_device * adev)1689a2e73f56SAlex Deucher static void cik_program_aspm(struct amdgpu_device *adev)
1690a2e73f56SAlex Deucher {
1691a2e73f56SAlex Deucher u32 data, orig;
1692a2e73f56SAlex Deucher bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1693a2e73f56SAlex Deucher bool disable_clkreq = false;
1694a2e73f56SAlex Deucher
16950ab5d711SMario Limonciello if (!amdgpu_device_should_use_aspm(adev))
1696a2e73f56SAlex Deucher return;
1697a2e73f56SAlex Deucher
169876ecb2c7SAlex Deucher if (pci_is_root_bus(adev->pdev->bus))
169976ecb2c7SAlex Deucher return;
170076ecb2c7SAlex Deucher
1701a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1702a2e73f56SAlex Deucher data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1703a2e73f56SAlex Deucher data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1704a2e73f56SAlex Deucher PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1705a2e73f56SAlex Deucher if (orig != data)
1706a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1707a2e73f56SAlex Deucher
1708a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1709a2e73f56SAlex Deucher data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1710a2e73f56SAlex Deucher if (orig != data)
1711a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1712a2e73f56SAlex Deucher
1713a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1714a2e73f56SAlex Deucher data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1715a2e73f56SAlex Deucher if (orig != data)
1716a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_P_CNTL, data);
1717a2e73f56SAlex Deucher
1718a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1719a2e73f56SAlex Deucher data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1720a2e73f56SAlex Deucher PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1721a2e73f56SAlex Deucher data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1722a2e73f56SAlex Deucher if (!disable_l0s)
1723a2e73f56SAlex Deucher data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1724a2e73f56SAlex Deucher
1725a2e73f56SAlex Deucher if (!disable_l1) {
1726a2e73f56SAlex Deucher data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1727a2e73f56SAlex Deucher data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1728a2e73f56SAlex Deucher if (orig != data)
1729a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL, data);
1730a2e73f56SAlex Deucher
1731a2e73f56SAlex Deucher if (!disable_plloff_in_l1) {
1732a2e73f56SAlex Deucher bool clk_req_support;
1733a2e73f56SAlex Deucher
1734a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1735a2e73f56SAlex Deucher data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1736a2e73f56SAlex Deucher PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1737a2e73f56SAlex Deucher data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1738a2e73f56SAlex Deucher (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1739a2e73f56SAlex Deucher if (orig != data)
1740a2e73f56SAlex Deucher WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1741a2e73f56SAlex Deucher
1742a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1743a2e73f56SAlex Deucher data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1744a2e73f56SAlex Deucher PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1745a2e73f56SAlex Deucher data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1746a2e73f56SAlex Deucher (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1747a2e73f56SAlex Deucher if (orig != data)
1748a2e73f56SAlex Deucher WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1749a2e73f56SAlex Deucher
1750a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1751a2e73f56SAlex Deucher data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1752a2e73f56SAlex Deucher PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1753a2e73f56SAlex Deucher data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1754a2e73f56SAlex Deucher (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1755a2e73f56SAlex Deucher if (orig != data)
1756a2e73f56SAlex Deucher WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1757a2e73f56SAlex Deucher
1758a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1759a2e73f56SAlex Deucher data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1760a2e73f56SAlex Deucher PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1761a2e73f56SAlex Deucher data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1762a2e73f56SAlex Deucher (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1763a2e73f56SAlex Deucher if (orig != data)
1764a2e73f56SAlex Deucher WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1765a2e73f56SAlex Deucher
1766a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1767a2e73f56SAlex Deucher data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1768a2e73f56SAlex Deucher data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1769a2e73f56SAlex Deucher if (orig != data)
1770a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1771a2e73f56SAlex Deucher
1772a2e73f56SAlex Deucher if (!disable_clkreq) {
1773a2e73f56SAlex Deucher struct pci_dev *root = adev->pdev->bus->self;
1774a2e73f56SAlex Deucher u32 lnkcap;
1775a2e73f56SAlex Deucher
1776a2e73f56SAlex Deucher clk_req_support = false;
1777a2e73f56SAlex Deucher pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1778a2e73f56SAlex Deucher if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1779a2e73f56SAlex Deucher clk_req_support = true;
1780a2e73f56SAlex Deucher } else {
1781a2e73f56SAlex Deucher clk_req_support = false;
1782a2e73f56SAlex Deucher }
1783a2e73f56SAlex Deucher
1784a2e73f56SAlex Deucher if (clk_req_support) {
1785a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1786a2e73f56SAlex Deucher data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1787a2e73f56SAlex Deucher PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1788a2e73f56SAlex Deucher if (orig != data)
1789a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1790a2e73f56SAlex Deucher
1791a2e73f56SAlex Deucher orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1792a2e73f56SAlex Deucher data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1793a2e73f56SAlex Deucher THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1794a2e73f56SAlex Deucher data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1795a2e73f56SAlex Deucher (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1796a2e73f56SAlex Deucher if (orig != data)
1797a2e73f56SAlex Deucher WREG32_SMC(ixTHM_CLK_CNTL, data);
1798a2e73f56SAlex Deucher
1799a2e73f56SAlex Deucher orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1800a2e73f56SAlex Deucher data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1801a2e73f56SAlex Deucher MISC_CLK_CTRL__ZCLK_SEL_MASK);
1802a2e73f56SAlex Deucher data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1803a2e73f56SAlex Deucher (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1804a2e73f56SAlex Deucher if (orig != data)
1805a2e73f56SAlex Deucher WREG32_SMC(ixMISC_CLK_CTRL, data);
1806a2e73f56SAlex Deucher
1807a2e73f56SAlex Deucher orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1808a2e73f56SAlex Deucher data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1809a2e73f56SAlex Deucher if (orig != data)
1810a2e73f56SAlex Deucher WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1811a2e73f56SAlex Deucher
1812a2e73f56SAlex Deucher orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1813a2e73f56SAlex Deucher data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1814a2e73f56SAlex Deucher if (orig != data)
1815a2e73f56SAlex Deucher WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1816a2e73f56SAlex Deucher
1817a2e73f56SAlex Deucher orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1818a2e73f56SAlex Deucher data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1819a2e73f56SAlex Deucher data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1820a2e73f56SAlex Deucher if (orig != data)
1821a2e73f56SAlex Deucher WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1822a2e73f56SAlex Deucher }
1823a2e73f56SAlex Deucher }
1824a2e73f56SAlex Deucher } else {
1825a2e73f56SAlex Deucher if (orig != data)
1826a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL, data);
1827a2e73f56SAlex Deucher }
1828a2e73f56SAlex Deucher
1829a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1830a2e73f56SAlex Deucher data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1831a2e73f56SAlex Deucher PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1832a2e73f56SAlex Deucher PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1833a2e73f56SAlex Deucher if (orig != data)
1834a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_CNTL2, data);
1835a2e73f56SAlex Deucher
1836a2e73f56SAlex Deucher if (!disable_l0s) {
1837a2e73f56SAlex Deucher data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1838a2e73f56SAlex Deucher if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1839a2e73f56SAlex Deucher PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1840a2e73f56SAlex Deucher data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1841a2e73f56SAlex Deucher if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1842a2e73f56SAlex Deucher (data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1843a2e73f56SAlex Deucher orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1844a2e73f56SAlex Deucher data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1845a2e73f56SAlex Deucher if (orig != data)
1846a2e73f56SAlex Deucher WREG32_PCIE(ixPCIE_LC_CNTL, data);
1847a2e73f56SAlex Deucher }
1848a2e73f56SAlex Deucher }
1849a2e73f56SAlex Deucher }
1850a2e73f56SAlex Deucher }
1851a2e73f56SAlex Deucher
cik_get_rev_id(struct amdgpu_device * adev)1852a2e73f56SAlex Deucher static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1853a2e73f56SAlex Deucher {
1854a2e73f56SAlex Deucher return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1855a2e73f56SAlex Deucher >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1856a2e73f56SAlex Deucher }
1857a2e73f56SAlex Deucher
cik_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)185869882565SChristian König static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
185913854c60SAlex Deucher {
186069882565SChristian König if (!ring || !ring->funcs->emit_wreg) {
186113854c60SAlex Deucher WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
186213854c60SAlex Deucher RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
186369882565SChristian König } else {
186469882565SChristian König amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
186569882565SChristian König }
186613854c60SAlex Deucher }
186713854c60SAlex Deucher
cik_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)186869882565SChristian König static void cik_invalidate_hdp(struct amdgpu_device *adev,
186969882565SChristian König struct amdgpu_ring *ring)
187013854c60SAlex Deucher {
187169882565SChristian König if (!ring || !ring->funcs->emit_wreg) {
187213854c60SAlex Deucher WREG32(mmHDP_DEBUG0, 1);
187313854c60SAlex Deucher RREG32(mmHDP_DEBUG0);
187469882565SChristian König } else {
187569882565SChristian König amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
187669882565SChristian König }
187713854c60SAlex Deucher }
187813854c60SAlex Deucher
cik_need_full_reset(struct amdgpu_device * adev)1879b7acb46fSAlex Deucher static bool cik_need_full_reset(struct amdgpu_device *adev)
1880b7acb46fSAlex Deucher {
1881b7acb46fSAlex Deucher /* change this when we support soft reset */
1882b7acb46fSAlex Deucher return true;
1883b7acb46fSAlex Deucher }
1884b7acb46fSAlex Deucher
cik_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1885b45e18acSKent Russell static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1886b45e18acSKent Russell uint64_t *count1)
1887b45e18acSKent Russell {
1888b45e18acSKent Russell uint32_t perfctr = 0;
1889b45e18acSKent Russell uint64_t cnt0_of, cnt1_of;
1890b45e18acSKent Russell int tmp;
1891b45e18acSKent Russell
1892b45e18acSKent Russell /* This reports 0 on APUs, so return to avoid writing/reading registers
1893b45e18acSKent Russell * that may or may not be different from their GPU counterparts
1894b45e18acSKent Russell */
1895b45e18acSKent Russell if (adev->flags & AMD_IS_APU)
1896b45e18acSKent Russell return;
1897b45e18acSKent Russell
1898b45e18acSKent Russell /* Set the 2 events that we wish to watch, defined above */
1899b45e18acSKent Russell /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1900b45e18acSKent Russell perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1901b45e18acSKent Russell perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1902b45e18acSKent Russell
1903b45e18acSKent Russell /* Write to enable desired perf counters */
1904b45e18acSKent Russell WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1905b45e18acSKent Russell /* Zero out and enable the perf counters
1906b45e18acSKent Russell * Write 0x5:
1907b45e18acSKent Russell * Bit 0 = Start all counters(1)
1908b45e18acSKent Russell * Bit 2 = Global counter reset enable(1)
1909b45e18acSKent Russell */
1910b45e18acSKent Russell WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1911b45e18acSKent Russell
1912b45e18acSKent Russell msleep(1000);
1913b45e18acSKent Russell
1914b45e18acSKent Russell /* Load the shadow and disable the perf counters
1915b45e18acSKent Russell * Write 0x2:
1916b45e18acSKent Russell * Bit 0 = Stop counters(0)
1917b45e18acSKent Russell * Bit 1 = Load the shadow counters(1)
1918b45e18acSKent Russell */
1919b45e18acSKent Russell WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1920b45e18acSKent Russell
1921b45e18acSKent Russell /* Read register values to get any >32bit overflow */
1922b45e18acSKent Russell tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1923b45e18acSKent Russell cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1924b45e18acSKent Russell cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1925b45e18acSKent Russell
1926b45e18acSKent Russell /* Get the values and add the overflow */
1927b45e18acSKent Russell *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1928b45e18acSKent Russell *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1929b45e18acSKent Russell }
1930b45e18acSKent Russell
cik_need_reset_on_init(struct amdgpu_device * adev)19313fcc10d7SAlex Deucher static bool cik_need_reset_on_init(struct amdgpu_device *adev)
19323fcc10d7SAlex Deucher {
19333fcc10d7SAlex Deucher u32 clock_cntl, pc;
19343fcc10d7SAlex Deucher
19353fcc10d7SAlex Deucher if (adev->flags & AMD_IS_APU)
19363fcc10d7SAlex Deucher return false;
19373fcc10d7SAlex Deucher
19383fcc10d7SAlex Deucher /* check if the SMC is already running */
19393fcc10d7SAlex Deucher clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
19403fcc10d7SAlex Deucher pc = RREG32_SMC(ixSMC_PC_C);
19413fcc10d7SAlex Deucher if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
19423fcc10d7SAlex Deucher (0x20100 <= pc))
19433fcc10d7SAlex Deucher return true;
19443fcc10d7SAlex Deucher
19453fcc10d7SAlex Deucher return false;
19463fcc10d7SAlex Deucher }
19473fcc10d7SAlex Deucher
cik_get_pcie_replay_count(struct amdgpu_device * adev)1948dcea6e65SKent Russell static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
1949dcea6e65SKent Russell {
1950dcea6e65SKent Russell uint64_t nak_r, nak_g;
1951dcea6e65SKent Russell
1952dcea6e65SKent Russell /* Get the number of NAKs received and generated */
1953dcea6e65SKent Russell nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1954dcea6e65SKent Russell nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1955dcea6e65SKent Russell
1956dcea6e65SKent Russell /* Add the total number of NAKs, i.e the number of replays */
1957dcea6e65SKent Russell return (nak_r + nak_g);
1958dcea6e65SKent Russell }
1959dcea6e65SKent Russell
cik_pre_asic_init(struct amdgpu_device * adev)1960819515c7SAlex Deucher static void cik_pre_asic_init(struct amdgpu_device *adev)
1961819515c7SAlex Deucher {
1962819515c7SAlex Deucher }
1963819515c7SAlex Deucher
1964a2e73f56SAlex Deucher static const struct amdgpu_asic_funcs cik_asic_funcs =
1965a2e73f56SAlex Deucher {
1966a2e73f56SAlex Deucher .read_disabled_bios = &cik_read_disabled_bios,
19671eb22bd3SAlex Deucher .read_bios_from_rom = &cik_read_bios_from_rom,
1968a2e73f56SAlex Deucher .read_register = &cik_read_register,
1969a2e73f56SAlex Deucher .reset = &cik_asic_reset,
19706d0f50daSAlex Deucher .reset_method = &cik_asic_reset_method,
1971a2e73f56SAlex Deucher .set_vga_state = &cik_vga_set_state,
1972a2e73f56SAlex Deucher .get_xclk = &cik_get_xclk,
1973a2e73f56SAlex Deucher .set_uvd_clocks = &cik_set_uvd_clocks,
1974a2e73f56SAlex Deucher .set_vce_clocks = &cik_set_vce_clocks,
1975bbf282d8SAlex Deucher .get_config_memsize = &cik_get_config_memsize,
197613854c60SAlex Deucher .flush_hdp = &cik_flush_hdp,
197713854c60SAlex Deucher .invalidate_hdp = &cik_invalidate_hdp,
1978b7acb46fSAlex Deucher .need_full_reset = &cik_need_full_reset,
19794e2c1ac2SOak Zeng .init_doorbell_index = &legacy_doorbell_index_init,
1980b45e18acSKent Russell .get_pcie_usage = &cik_get_pcie_usage,
19813fcc10d7SAlex Deucher .need_reset_on_init = &cik_need_reset_on_init,
1982dcea6e65SKent Russell .get_pcie_replay_count = &cik_get_pcie_replay_count,
19830d0c07eeSAlex Deucher .supports_baco = &cik_asic_supports_baco,
1984819515c7SAlex Deucher .pre_asic_init = &cik_pre_asic_init,
19853b246e8bSAlex Deucher .query_video_codecs = &cik_query_video_codecs,
1986a2e73f56SAlex Deucher };
1987a2e73f56SAlex Deucher
cik_common_early_init(struct amdgpu_ip_block * ip_block)1988146b085eSSunil Khatri static int cik_common_early_init(struct amdgpu_ip_block *ip_block)
1989a2e73f56SAlex Deucher {
1990146b085eSSunil Khatri struct amdgpu_device *adev = ip_block->adev;
19915fc3aeebSyanyang1
1992a2e73f56SAlex Deucher adev->smc_rreg = &cik_smc_rreg;
1993a2e73f56SAlex Deucher adev->smc_wreg = &cik_smc_wreg;
1994a2e73f56SAlex Deucher adev->pcie_rreg = &cik_pcie_rreg;
1995a2e73f56SAlex Deucher adev->pcie_wreg = &cik_pcie_wreg;
1996a2e73f56SAlex Deucher adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
1997a2e73f56SAlex Deucher adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
1998a2e73f56SAlex Deucher adev->didt_rreg = &cik_didt_rreg;
1999a2e73f56SAlex Deucher adev->didt_wreg = &cik_didt_wreg;
2000a2e73f56SAlex Deucher
2001a2e73f56SAlex Deucher adev->asic_funcs = &cik_asic_funcs;
2002a2e73f56SAlex Deucher
2003a2e73f56SAlex Deucher adev->rev_id = cik_get_rev_id(adev);
2004a2e73f56SAlex Deucher adev->external_rev_id = 0xFF;
2005a2e73f56SAlex Deucher switch (adev->asic_type) {
2006a2e73f56SAlex Deucher case CHIP_BONAIRE:
2007a2e73f56SAlex Deucher adev->cg_flags =
2008e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGCG |
2009e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGLS |
2010e3b04bc7SAlex Deucher /*AMD_CG_SUPPORT_GFX_CGCG |*/
2011e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGLS |
2012e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS |
2013e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS_LS |
2014e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CP_LS |
2015e3b04bc7SAlex Deucher AMD_CG_SUPPORT_MC_LS |
2016e3b04bc7SAlex Deucher AMD_CG_SUPPORT_MC_MGCG |
2017e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_MGCG |
2018e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_LS |
2019e3b04bc7SAlex Deucher AMD_CG_SUPPORT_BIF_LS |
2020e3b04bc7SAlex Deucher AMD_CG_SUPPORT_VCE_MGCG |
2021e3b04bc7SAlex Deucher AMD_CG_SUPPORT_UVD_MGCG |
2022e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_LS |
2023e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_MGCG;
2024a2e73f56SAlex Deucher adev->pg_flags = 0;
2025a2e73f56SAlex Deucher adev->external_rev_id = adev->rev_id + 0x14;
2026a2e73f56SAlex Deucher break;
2027a2e73f56SAlex Deucher case CHIP_HAWAII:
2028a2e73f56SAlex Deucher adev->cg_flags =
2029e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGCG |
2030e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGLS |
2031e3b04bc7SAlex Deucher /*AMD_CG_SUPPORT_GFX_CGCG |*/
2032e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGLS |
2033e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS |
2034e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CP_LS |
2035e3b04bc7SAlex Deucher AMD_CG_SUPPORT_MC_LS |
2036e3b04bc7SAlex Deucher AMD_CG_SUPPORT_MC_MGCG |
2037e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_MGCG |
2038e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_LS |
2039e3b04bc7SAlex Deucher AMD_CG_SUPPORT_BIF_LS |
2040e3b04bc7SAlex Deucher AMD_CG_SUPPORT_VCE_MGCG |
2041e3b04bc7SAlex Deucher AMD_CG_SUPPORT_UVD_MGCG |
2042e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_LS |
2043e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_MGCG;
2044a2e73f56SAlex Deucher adev->pg_flags = 0;
2045a2e73f56SAlex Deucher adev->external_rev_id = 0x28;
2046a2e73f56SAlex Deucher break;
2047a2e73f56SAlex Deucher case CHIP_KAVERI:
2048a2e73f56SAlex Deucher adev->cg_flags =
2049e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGCG |
2050e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGLS |
2051e3b04bc7SAlex Deucher /*AMD_CG_SUPPORT_GFX_CGCG |*/
2052e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGLS |
2053e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS |
2054e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS_LS |
2055e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CP_LS |
2056e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_MGCG |
2057e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_LS |
2058e3b04bc7SAlex Deucher AMD_CG_SUPPORT_BIF_LS |
2059e3b04bc7SAlex Deucher AMD_CG_SUPPORT_VCE_MGCG |
2060e3b04bc7SAlex Deucher AMD_CG_SUPPORT_UVD_MGCG |
2061e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_LS |
2062e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_MGCG;
2063a2e73f56SAlex Deucher adev->pg_flags =
2064e3b04bc7SAlex Deucher /*AMD_PG_SUPPORT_GFX_PG |
2065e3b04bc7SAlex Deucher AMD_PG_SUPPORT_GFX_SMG |
2066e3b04bc7SAlex Deucher AMD_PG_SUPPORT_GFX_DMG |*/
2067e3b04bc7SAlex Deucher AMD_PG_SUPPORT_UVD |
2068ca6d3503SRex Zhu AMD_PG_SUPPORT_VCE |
2069ca6d3503SRex Zhu /* AMD_PG_SUPPORT_CP |
2070e3b04bc7SAlex Deucher AMD_PG_SUPPORT_GDS |
2071e3b04bc7SAlex Deucher AMD_PG_SUPPORT_RLC_SMU_HS |
2072e3b04bc7SAlex Deucher AMD_PG_SUPPORT_ACP |
2073e3b04bc7SAlex Deucher AMD_PG_SUPPORT_SAMU |*/
2074a2e73f56SAlex Deucher 0;
2075a2e73f56SAlex Deucher if (adev->pdev->device == 0x1312 ||
2076a2e73f56SAlex Deucher adev->pdev->device == 0x1316 ||
2077a2e73f56SAlex Deucher adev->pdev->device == 0x1317)
2078a2e73f56SAlex Deucher adev->external_rev_id = 0x41;
2079a2e73f56SAlex Deucher else
2080a2e73f56SAlex Deucher adev->external_rev_id = 0x1;
2081a2e73f56SAlex Deucher break;
2082a2e73f56SAlex Deucher case CHIP_KABINI:
2083a2e73f56SAlex Deucher case CHIP_MULLINS:
2084a2e73f56SAlex Deucher adev->cg_flags =
2085e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGCG |
2086e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_MGLS |
2087e3b04bc7SAlex Deucher /*AMD_CG_SUPPORT_GFX_CGCG |*/
2088e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGLS |
2089e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS |
2090e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CGTS_LS |
2091e3b04bc7SAlex Deucher AMD_CG_SUPPORT_GFX_CP_LS |
2092e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_MGCG |
2093e3b04bc7SAlex Deucher AMD_CG_SUPPORT_SDMA_LS |
2094e3b04bc7SAlex Deucher AMD_CG_SUPPORT_BIF_LS |
2095e3b04bc7SAlex Deucher AMD_CG_SUPPORT_VCE_MGCG |
2096e3b04bc7SAlex Deucher AMD_CG_SUPPORT_UVD_MGCG |
2097e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_LS |
2098e3b04bc7SAlex Deucher AMD_CG_SUPPORT_HDP_MGCG;
2099a2e73f56SAlex Deucher adev->pg_flags =
2100e3b04bc7SAlex Deucher /*AMD_PG_SUPPORT_GFX_PG |
2101e3b04bc7SAlex Deucher AMD_PG_SUPPORT_GFX_SMG | */
2102e3b04bc7SAlex Deucher AMD_PG_SUPPORT_UVD |
2103e3b04bc7SAlex Deucher /*AMD_PG_SUPPORT_VCE |
2104e3b04bc7SAlex Deucher AMD_PG_SUPPORT_CP |
2105e3b04bc7SAlex Deucher AMD_PG_SUPPORT_GDS |
2106e3b04bc7SAlex Deucher AMD_PG_SUPPORT_RLC_SMU_HS |
2107e3b04bc7SAlex Deucher AMD_PG_SUPPORT_SAMU |*/
2108a2e73f56SAlex Deucher 0;
2109a2e73f56SAlex Deucher if (adev->asic_type == CHIP_KABINI) {
2110a2e73f56SAlex Deucher if (adev->rev_id == 0)
2111a2e73f56SAlex Deucher adev->external_rev_id = 0x81;
2112a2e73f56SAlex Deucher else if (adev->rev_id == 1)
2113a2e73f56SAlex Deucher adev->external_rev_id = 0x82;
2114a2e73f56SAlex Deucher else if (adev->rev_id == 2)
2115a2e73f56SAlex Deucher adev->external_rev_id = 0x85;
2116a2e73f56SAlex Deucher } else
2117a2e73f56SAlex Deucher adev->external_rev_id = adev->rev_id + 0xa1;
2118a2e73f56SAlex Deucher break;
2119a2e73f56SAlex Deucher default:
2120a2e73f56SAlex Deucher /* FIXME: not supported yet */
2121a2e73f56SAlex Deucher return -EINVAL;
2122a2e73f56SAlex Deucher }
2123a2e73f56SAlex Deucher
2124a2e73f56SAlex Deucher return 0;
2125a2e73f56SAlex Deucher }
2126a2e73f56SAlex Deucher
cik_common_hw_init(struct amdgpu_ip_block * ip_block)212758608034SSunil Khatri static int cik_common_hw_init(struct amdgpu_ip_block *ip_block)
2128a2e73f56SAlex Deucher {
212958608034SSunil Khatri struct amdgpu_device *adev = ip_block->adev;
21305fc3aeebSyanyang1
2131a2e73f56SAlex Deucher /* move the golden regs per IP block */
2132a2e73f56SAlex Deucher cik_init_golden_registers(adev);
2133a2e73f56SAlex Deucher /* enable pcie gen2/3 link */
2134a2e73f56SAlex Deucher cik_pcie_gen3_enable(adev);
2135a2e73f56SAlex Deucher /* enable aspm */
2136a2e73f56SAlex Deucher cik_program_aspm(adev);
2137a2e73f56SAlex Deucher
2138a2e73f56SAlex Deucher return 0;
2139a2e73f56SAlex Deucher }
2140a2e73f56SAlex Deucher
cik_common_hw_fini(struct amdgpu_ip_block * ip_block)2141692d2cd1SSunil Khatri static int cik_common_hw_fini(struct amdgpu_ip_block *ip_block)
2142a2e73f56SAlex Deucher {
2143a2e73f56SAlex Deucher return 0;
2144a2e73f56SAlex Deucher }
2145a2e73f56SAlex Deucher
cik_common_resume(struct amdgpu_ip_block * ip_block)21467feb4f3aSSunil Khatri static int cik_common_resume(struct amdgpu_ip_block *ip_block)
2147a2e73f56SAlex Deucher {
214858608034SSunil Khatri return cik_common_hw_init(ip_block);
2149a2e73f56SAlex Deucher }
2150a2e73f56SAlex Deucher
cik_common_is_idle(struct amdgpu_ip_block * ip_block)2151*7dc34054SSunil Khatri static bool cik_common_is_idle(struct amdgpu_ip_block *ip_block)
2152a2e73f56SAlex Deucher {
2153a2e73f56SAlex Deucher return true;
2154a2e73f56SAlex Deucher }
2155a2e73f56SAlex Deucher
2156f13c7da1SSunil Khatri
2157a2e73f56SAlex Deucher
cik_common_soft_reset(struct amdgpu_ip_block * ip_block)21580ef2a1e7SSunil Khatri static int cik_common_soft_reset(struct amdgpu_ip_block *ip_block)
2159a2e73f56SAlex Deucher {
2160a2e73f56SAlex Deucher /* XXX hard reset?? */
2161a2e73f56SAlex Deucher return 0;
2162a2e73f56SAlex Deucher }
2163a2e73f56SAlex Deucher
cik_common_set_clockgating_state(struct amdgpu_ip_block * ip_block,enum amd_clockgating_state state)2164f2ba8c3dSBoyuan Zhang static int cik_common_set_clockgating_state(struct amdgpu_ip_block *ip_block,
21655fc3aeebSyanyang1 enum amd_clockgating_state state)
2166a2e73f56SAlex Deucher {
2167a2e73f56SAlex Deucher return 0;
2168a2e73f56SAlex Deucher }
2169a2e73f56SAlex Deucher
cik_common_set_powergating_state(struct amdgpu_ip_block * ip_block,enum amd_powergating_state state)217080d80511SBoyuan Zhang static int cik_common_set_powergating_state(struct amdgpu_ip_block *ip_block,
21715fc3aeebSyanyang1 enum amd_powergating_state state)
2172a2e73f56SAlex Deucher {
2173a2e73f56SAlex Deucher return 0;
2174a2e73f56SAlex Deucher }
2175a2e73f56SAlex Deucher
2176a1255107SAlex Deucher static const struct amd_ip_funcs cik_common_ip_funcs = {
217788a907d6STom St Denis .name = "cik_common",
2178a2e73f56SAlex Deucher .early_init = cik_common_early_init,
2179a2e73f56SAlex Deucher .hw_init = cik_common_hw_init,
2180a2e73f56SAlex Deucher .hw_fini = cik_common_hw_fini,
2181a2e73f56SAlex Deucher .resume = cik_common_resume,
2182a2e73f56SAlex Deucher .is_idle = cik_common_is_idle,
2183a2e73f56SAlex Deucher .soft_reset = cik_common_soft_reset,
2184a2e73f56SAlex Deucher .set_clockgating_state = cik_common_set_clockgating_state,
2185a2e73f56SAlex Deucher .set_powergating_state = cik_common_set_powergating_state,
2186a2e73f56SAlex Deucher };
2187a1255107SAlex Deucher
2188a1255107SAlex Deucher static const struct amdgpu_ip_block_version cik_common_ip_block =
2189a1255107SAlex Deucher {
2190a1255107SAlex Deucher .type = AMD_IP_BLOCK_TYPE_COMMON,
2191a1255107SAlex Deucher .major = 1,
2192a1255107SAlex Deucher .minor = 0,
2193a1255107SAlex Deucher .rev = 0,
2194a1255107SAlex Deucher .funcs = &cik_common_ip_funcs,
2195a1255107SAlex Deucher };
2196a1255107SAlex Deucher
cik_set_ip_blocks(struct amdgpu_device * adev)2197a1255107SAlex Deucher int cik_set_ip_blocks(struct amdgpu_device *adev)
2198a1255107SAlex Deucher {
2199a1255107SAlex Deucher switch (adev->asic_type) {
2200a1255107SAlex Deucher case CHIP_BONAIRE:
22012990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22022990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22032990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22043089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
22053089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2206b905090dSRex Zhu amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2207a1255107SAlex Deucher if (adev->enable_virtual_display)
2208733ee71aSRyan Taylor amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22094562236bSHarry Wentland #if defined(CONFIG_DRM_AMD_DC)
22104562236bSHarry Wentland else if (amdgpu_device_has_dc_support(adev))
22112990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dm_ip_block);
22124562236bSHarry Wentland #endif
2213a1255107SAlex Deucher else
22142990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
22152990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22162990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2217a1255107SAlex Deucher break;
2218a1255107SAlex Deucher case CHIP_HAWAII:
22192990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22202990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22212990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22223089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
22233089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2224b905090dSRex Zhu amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2225a1255107SAlex Deucher if (adev->enable_virtual_display)
2226733ee71aSRyan Taylor amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22274562236bSHarry Wentland #if defined(CONFIG_DRM_AMD_DC)
22284562236bSHarry Wentland else if (amdgpu_device_has_dc_support(adev))
22292990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dm_ip_block);
22304562236bSHarry Wentland #endif
2231a1255107SAlex Deucher else
22322990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
22332990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22342990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2235a1255107SAlex Deucher break;
2236a1255107SAlex Deucher case CHIP_KAVERI:
22372990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22382990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22392990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22403089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
22413089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2242b905090dSRex Zhu amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2243a1255107SAlex Deucher if (adev->enable_virtual_display)
2244733ee71aSRyan Taylor amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22459355c0e8SAlex Deucher #if defined(CONFIG_DRM_AMD_DC)
22469355c0e8SAlex Deucher else if (amdgpu_device_has_dc_support(adev))
22472990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dm_ip_block);
22489355c0e8SAlex Deucher #endif
2249a1255107SAlex Deucher else
22502990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
22513089aa22SRex Zhu
22522990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22532990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2254a1255107SAlex Deucher break;
2255a1255107SAlex Deucher case CHIP_KABINI:
2256a1255107SAlex Deucher case CHIP_MULLINS:
22572990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
22582990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
22592990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
22603089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
22613089aa22SRex Zhu amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2262b905090dSRex Zhu amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2263a1255107SAlex Deucher if (adev->enable_virtual_display)
2264733ee71aSRyan Taylor amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
22659355c0e8SAlex Deucher #if defined(CONFIG_DRM_AMD_DC)
22669355c0e8SAlex Deucher else if (amdgpu_device_has_dc_support(adev))
22672990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dm_ip_block);
22689355c0e8SAlex Deucher #endif
2269a1255107SAlex Deucher else
22702990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
22712990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
22722990a1fcSAlex Deucher amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2273a1255107SAlex Deucher break;
2274a1255107SAlex Deucher default:
2275a1255107SAlex Deucher /* FIXME: not supported yet */
2276a1255107SAlex Deucher return -EINVAL;
2277a1255107SAlex Deucher }
2278a1255107SAlex Deucher return 0;
2279a1255107SAlex Deucher }
2280