1fb4d8502Sjsg /*
2fb4d8502Sjsg * Copyright 2012 Advanced Micro Devices, Inc.
3fb4d8502Sjsg *
4fb4d8502Sjsg * Permission is hereby granted, free of charge, to any person obtaining a
5fb4d8502Sjsg * copy of this software and associated documentation files (the "Software"),
6fb4d8502Sjsg * to deal in the Software without restriction, including without limitation
7fb4d8502Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fb4d8502Sjsg * and/or sell copies of the Software, and to permit persons to whom the
9fb4d8502Sjsg * Software is furnished to do so, subject to the following conditions:
10fb4d8502Sjsg *
11fb4d8502Sjsg * The above copyright notice and this permission notice shall be included in
12fb4d8502Sjsg * all copies or substantial portions of the Software.
13fb4d8502Sjsg *
14fb4d8502Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fb4d8502Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fb4d8502Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17fb4d8502Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18fb4d8502Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19fb4d8502Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20fb4d8502Sjsg * OTHER DEALINGS IN THE SOFTWARE.
21fb4d8502Sjsg *
22fb4d8502Sjsg * Authors: Alex Deucher
23fb4d8502Sjsg */
24fb4d8502Sjsg #include <linux/firmware.h>
25fb4d8502Sjsg #include <linux/slab.h>
26fb4d8502Sjsg #include <linux/module.h>
27c349dbc7Sjsg #include <linux/pci.h>
28c349dbc7Sjsg
295ca02815Sjsg #include <drm/amdgpu_drm.h>
305ca02815Sjsg
31fb4d8502Sjsg #include "amdgpu.h"
32fb4d8502Sjsg #include "amdgpu_atombios.h"
33fb4d8502Sjsg #include "amdgpu_ih.h"
34fb4d8502Sjsg #include "amdgpu_uvd.h"
35fb4d8502Sjsg #include "amdgpu_vce.h"
36fb4d8502Sjsg #include "cikd.h"
37fb4d8502Sjsg #include "atom.h"
38fb4d8502Sjsg #include "amd_pcie.h"
39fb4d8502Sjsg
40fb4d8502Sjsg #include "cik.h"
41fb4d8502Sjsg #include "gmc_v7_0.h"
42fb4d8502Sjsg #include "cik_ih.h"
43fb4d8502Sjsg #include "dce_v8_0.h"
44fb4d8502Sjsg #include "gfx_v7_0.h"
45fb4d8502Sjsg #include "cik_sdma.h"
46fb4d8502Sjsg #include "uvd_v4_2.h"
47fb4d8502Sjsg #include "vce_v2_0.h"
48fb4d8502Sjsg #include "cik_dpm.h"
49fb4d8502Sjsg
50fb4d8502Sjsg #include "uvd/uvd_4_2_d.h"
51fb4d8502Sjsg
52fb4d8502Sjsg #include "smu/smu_7_0_1_d.h"
53fb4d8502Sjsg #include "smu/smu_7_0_1_sh_mask.h"
54fb4d8502Sjsg
55fb4d8502Sjsg #include "dce/dce_8_0_d.h"
56fb4d8502Sjsg #include "dce/dce_8_0_sh_mask.h"
57fb4d8502Sjsg
58fb4d8502Sjsg #include "bif/bif_4_1_d.h"
59fb4d8502Sjsg #include "bif/bif_4_1_sh_mask.h"
60fb4d8502Sjsg
61fb4d8502Sjsg #include "gca/gfx_7_2_d.h"
62fb4d8502Sjsg #include "gca/gfx_7_2_enum.h"
63fb4d8502Sjsg #include "gca/gfx_7_2_sh_mask.h"
64fb4d8502Sjsg
65fb4d8502Sjsg #include "gmc/gmc_7_1_d.h"
66fb4d8502Sjsg #include "gmc/gmc_7_1_sh_mask.h"
67fb4d8502Sjsg
68fb4d8502Sjsg #include "oss/oss_2_0_d.h"
69fb4d8502Sjsg #include "oss/oss_2_0_sh_mask.h"
70fb4d8502Sjsg
71fb4d8502Sjsg #include "amdgpu_dm.h"
72fb4d8502Sjsg #include "amdgpu_amdkfd.h"
735ca02815Sjsg #include "amdgpu_vkms.h"
745ca02815Sjsg
755ca02815Sjsg static const struct amdgpu_video_codec_info cik_video_codecs_encode_array[] =
765ca02815Sjsg {
775ca02815Sjsg {
785ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
795ca02815Sjsg .max_width = 2048,
805ca02815Sjsg .max_height = 1152,
815ca02815Sjsg .max_pixels_per_frame = 2048 * 1152,
825ca02815Sjsg .max_level = 0,
835ca02815Sjsg },
845ca02815Sjsg };
855ca02815Sjsg
865ca02815Sjsg static const struct amdgpu_video_codecs cik_video_codecs_encode =
875ca02815Sjsg {
885ca02815Sjsg .codec_count = ARRAY_SIZE(cik_video_codecs_encode_array),
895ca02815Sjsg .codec_array = cik_video_codecs_encode_array,
905ca02815Sjsg };
915ca02815Sjsg
925ca02815Sjsg static const struct amdgpu_video_codec_info cik_video_codecs_decode_array[] =
935ca02815Sjsg {
945ca02815Sjsg {
955ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
965ca02815Sjsg .max_width = 2048,
975ca02815Sjsg .max_height = 1152,
985ca02815Sjsg .max_pixels_per_frame = 2048 * 1152,
995ca02815Sjsg .max_level = 3,
1005ca02815Sjsg },
1015ca02815Sjsg {
1025ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
1035ca02815Sjsg .max_width = 2048,
1045ca02815Sjsg .max_height = 1152,
1055ca02815Sjsg .max_pixels_per_frame = 2048 * 1152,
1065ca02815Sjsg .max_level = 5,
1075ca02815Sjsg },
1085ca02815Sjsg {
1095ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1105ca02815Sjsg .max_width = 2048,
1115ca02815Sjsg .max_height = 1152,
1125ca02815Sjsg .max_pixels_per_frame = 2048 * 1152,
1135ca02815Sjsg .max_level = 41,
1145ca02815Sjsg },
1155ca02815Sjsg {
1165ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
1175ca02815Sjsg .max_width = 2048,
1185ca02815Sjsg .max_height = 1152,
1195ca02815Sjsg .max_pixels_per_frame = 2048 * 1152,
1205ca02815Sjsg .max_level = 4,
1215ca02815Sjsg },
1225ca02815Sjsg };
1235ca02815Sjsg
1245ca02815Sjsg static const struct amdgpu_video_codecs cik_video_codecs_decode =
1255ca02815Sjsg {
1265ca02815Sjsg .codec_count = ARRAY_SIZE(cik_video_codecs_decode_array),
1275ca02815Sjsg .codec_array = cik_video_codecs_decode_array,
1285ca02815Sjsg };
1295ca02815Sjsg
cik_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)1305ca02815Sjsg static int cik_query_video_codecs(struct amdgpu_device *adev, bool encode,
1315ca02815Sjsg const struct amdgpu_video_codecs **codecs)
1325ca02815Sjsg {
1335ca02815Sjsg switch (adev->asic_type) {
1345ca02815Sjsg case CHIP_BONAIRE:
1355ca02815Sjsg case CHIP_HAWAII:
1365ca02815Sjsg case CHIP_KAVERI:
1375ca02815Sjsg case CHIP_KABINI:
1385ca02815Sjsg case CHIP_MULLINS:
1395ca02815Sjsg if (encode)
1405ca02815Sjsg *codecs = &cik_video_codecs_encode;
1415ca02815Sjsg else
1425ca02815Sjsg *codecs = &cik_video_codecs_decode;
1435ca02815Sjsg return 0;
1445ca02815Sjsg default:
1455ca02815Sjsg return -EINVAL;
1465ca02815Sjsg }
1475ca02815Sjsg }
148fb4d8502Sjsg
149fb4d8502Sjsg /*
150fb4d8502Sjsg * Indirect registers accessor
151fb4d8502Sjsg */
cik_pcie_rreg(struct amdgpu_device * adev,u32 reg)152fb4d8502Sjsg static u32 cik_pcie_rreg(struct amdgpu_device *adev, u32 reg)
153fb4d8502Sjsg {
154fb4d8502Sjsg unsigned long flags;
155fb4d8502Sjsg u32 r;
156fb4d8502Sjsg
157fb4d8502Sjsg spin_lock_irqsave(&adev->pcie_idx_lock, flags);
158fb4d8502Sjsg WREG32(mmPCIE_INDEX, reg);
159fb4d8502Sjsg (void)RREG32(mmPCIE_INDEX);
160fb4d8502Sjsg r = RREG32(mmPCIE_DATA);
161fb4d8502Sjsg spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
162fb4d8502Sjsg return r;
163fb4d8502Sjsg }
164fb4d8502Sjsg
cik_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)165fb4d8502Sjsg static void cik_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
166fb4d8502Sjsg {
167fb4d8502Sjsg unsigned long flags;
168fb4d8502Sjsg
169fb4d8502Sjsg spin_lock_irqsave(&adev->pcie_idx_lock, flags);
170fb4d8502Sjsg WREG32(mmPCIE_INDEX, reg);
171fb4d8502Sjsg (void)RREG32(mmPCIE_INDEX);
172fb4d8502Sjsg WREG32(mmPCIE_DATA, v);
173fb4d8502Sjsg (void)RREG32(mmPCIE_DATA);
174fb4d8502Sjsg spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
175fb4d8502Sjsg }
176fb4d8502Sjsg
cik_smc_rreg(struct amdgpu_device * adev,u32 reg)177fb4d8502Sjsg static u32 cik_smc_rreg(struct amdgpu_device *adev, u32 reg)
178fb4d8502Sjsg {
179fb4d8502Sjsg unsigned long flags;
180fb4d8502Sjsg u32 r;
181fb4d8502Sjsg
182fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
183fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_0, (reg));
184fb4d8502Sjsg r = RREG32(mmSMC_IND_DATA_0);
185fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
186fb4d8502Sjsg return r;
187fb4d8502Sjsg }
188fb4d8502Sjsg
cik_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)189fb4d8502Sjsg static void cik_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
190fb4d8502Sjsg {
191fb4d8502Sjsg unsigned long flags;
192fb4d8502Sjsg
193fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
194fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_0, (reg));
195fb4d8502Sjsg WREG32(mmSMC_IND_DATA_0, (v));
196fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
197fb4d8502Sjsg }
198fb4d8502Sjsg
cik_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)199fb4d8502Sjsg static u32 cik_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
200fb4d8502Sjsg {
201fb4d8502Sjsg unsigned long flags;
202fb4d8502Sjsg u32 r;
203fb4d8502Sjsg
204fb4d8502Sjsg spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
205fb4d8502Sjsg WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
206fb4d8502Sjsg r = RREG32(mmUVD_CTX_DATA);
207fb4d8502Sjsg spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
208fb4d8502Sjsg return r;
209fb4d8502Sjsg }
210fb4d8502Sjsg
cik_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)211fb4d8502Sjsg static void cik_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
212fb4d8502Sjsg {
213fb4d8502Sjsg unsigned long flags;
214fb4d8502Sjsg
215fb4d8502Sjsg spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
216fb4d8502Sjsg WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
217fb4d8502Sjsg WREG32(mmUVD_CTX_DATA, (v));
218fb4d8502Sjsg spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
219fb4d8502Sjsg }
220fb4d8502Sjsg
cik_didt_rreg(struct amdgpu_device * adev,u32 reg)221fb4d8502Sjsg static u32 cik_didt_rreg(struct amdgpu_device *adev, u32 reg)
222fb4d8502Sjsg {
223fb4d8502Sjsg unsigned long flags;
224fb4d8502Sjsg u32 r;
225fb4d8502Sjsg
226fb4d8502Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
227fb4d8502Sjsg WREG32(mmDIDT_IND_INDEX, (reg));
228fb4d8502Sjsg r = RREG32(mmDIDT_IND_DATA);
229fb4d8502Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
230fb4d8502Sjsg return r;
231fb4d8502Sjsg }
232fb4d8502Sjsg
cik_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)233fb4d8502Sjsg static void cik_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
234fb4d8502Sjsg {
235fb4d8502Sjsg unsigned long flags;
236fb4d8502Sjsg
237fb4d8502Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
238fb4d8502Sjsg WREG32(mmDIDT_IND_INDEX, (reg));
239fb4d8502Sjsg WREG32(mmDIDT_IND_DATA, (v));
240fb4d8502Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
241fb4d8502Sjsg }
242fb4d8502Sjsg
243fb4d8502Sjsg static const u32 bonaire_golden_spm_registers[] =
244fb4d8502Sjsg {
245fb4d8502Sjsg 0xc200, 0xe0ffffff, 0xe0000000
246fb4d8502Sjsg };
247fb4d8502Sjsg
248fb4d8502Sjsg static const u32 bonaire_golden_common_registers[] =
249fb4d8502Sjsg {
250fb4d8502Sjsg 0x31dc, 0xffffffff, 0x00000800,
251fb4d8502Sjsg 0x31dd, 0xffffffff, 0x00000800,
252fb4d8502Sjsg 0x31e6, 0xffffffff, 0x00007fbf,
253fb4d8502Sjsg 0x31e7, 0xffffffff, 0x00007faf
254fb4d8502Sjsg };
255fb4d8502Sjsg
256fb4d8502Sjsg static const u32 bonaire_golden_registers[] =
257fb4d8502Sjsg {
258fb4d8502Sjsg 0xcd5, 0x00000333, 0x00000333,
259fb4d8502Sjsg 0xcd4, 0x000c0fc0, 0x00040200,
260fb4d8502Sjsg 0x2684, 0x00010000, 0x00058208,
261fb4d8502Sjsg 0xf000, 0xffff1fff, 0x00140000,
262fb4d8502Sjsg 0xf080, 0xfdfc0fff, 0x00000100,
263fb4d8502Sjsg 0xf08d, 0x40000000, 0x40000200,
264fb4d8502Sjsg 0x260c, 0xffffffff, 0x00000000,
265fb4d8502Sjsg 0x260d, 0xf00fffff, 0x00000400,
266fb4d8502Sjsg 0x260e, 0x0002021c, 0x00020200,
267fb4d8502Sjsg 0x31e, 0x00000080, 0x00000000,
268fb4d8502Sjsg 0x16ec, 0x000000f0, 0x00000070,
269fb4d8502Sjsg 0x16f0, 0xf0311fff, 0x80300000,
270fb4d8502Sjsg 0x263e, 0x73773777, 0x12010001,
271fb4d8502Sjsg 0xd43, 0x00810000, 0x408af000,
272fb4d8502Sjsg 0x1c0c, 0x31000111, 0x00000011,
273fb4d8502Sjsg 0xbd2, 0x73773777, 0x12010001,
274fb4d8502Sjsg 0x883, 0x00007fb6, 0x0021a1b1,
275fb4d8502Sjsg 0x884, 0x00007fb6, 0x002021b1,
276fb4d8502Sjsg 0x860, 0x00007fb6, 0x00002191,
277fb4d8502Sjsg 0x886, 0x00007fb6, 0x002121b1,
278fb4d8502Sjsg 0x887, 0x00007fb6, 0x002021b1,
279fb4d8502Sjsg 0x877, 0x00007fb6, 0x00002191,
280fb4d8502Sjsg 0x878, 0x00007fb6, 0x00002191,
281fb4d8502Sjsg 0xd8a, 0x0000003f, 0x0000000a,
282fb4d8502Sjsg 0xd8b, 0x0000003f, 0x0000000a,
283fb4d8502Sjsg 0xab9, 0x00073ffe, 0x000022a2,
284fb4d8502Sjsg 0x903, 0x000007ff, 0x00000000,
285fb4d8502Sjsg 0x2285, 0xf000003f, 0x00000007,
286fb4d8502Sjsg 0x22fc, 0x00002001, 0x00000001,
287fb4d8502Sjsg 0x22c9, 0xffffffff, 0x00ffffff,
288fb4d8502Sjsg 0xc281, 0x0000ff0f, 0x00000000,
289fb4d8502Sjsg 0xa293, 0x07ffffff, 0x06000000,
290fb4d8502Sjsg 0x136, 0x00000fff, 0x00000100,
291fb4d8502Sjsg 0xf9e, 0x00000001, 0x00000002,
292fb4d8502Sjsg 0x2440, 0x03000000, 0x0362c688,
293fb4d8502Sjsg 0x2300, 0x000000ff, 0x00000001,
294fb4d8502Sjsg 0x390, 0x00001fff, 0x00001fff,
295fb4d8502Sjsg 0x2418, 0x0000007f, 0x00000020,
296fb4d8502Sjsg 0x2542, 0x00010000, 0x00010000,
297fb4d8502Sjsg 0x2b05, 0x000003ff, 0x000000f3,
298fb4d8502Sjsg 0x2b03, 0xffffffff, 0x00001032
299fb4d8502Sjsg };
300fb4d8502Sjsg
301fb4d8502Sjsg static const u32 bonaire_mgcg_cgcg_init[] =
302fb4d8502Sjsg {
303fb4d8502Sjsg 0x3108, 0xffffffff, 0xfffffffc,
304fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
305fb4d8502Sjsg 0xf0a8, 0xffffffff, 0x00000100,
306fb4d8502Sjsg 0xf082, 0xffffffff, 0x00000100,
307fb4d8502Sjsg 0xf0b0, 0xffffffff, 0xc0000100,
308fb4d8502Sjsg 0xf0b2, 0xffffffff, 0xc0000100,
309fb4d8502Sjsg 0xf0b1, 0xffffffff, 0xc0000100,
310fb4d8502Sjsg 0x1579, 0xffffffff, 0x00600100,
311fb4d8502Sjsg 0xf0a0, 0xffffffff, 0x00000100,
312fb4d8502Sjsg 0xf085, 0xffffffff, 0x06000100,
313fb4d8502Sjsg 0xf088, 0xffffffff, 0x00000100,
314fb4d8502Sjsg 0xf086, 0xffffffff, 0x06000100,
315fb4d8502Sjsg 0xf081, 0xffffffff, 0x00000100,
316fb4d8502Sjsg 0xf0b8, 0xffffffff, 0x00000100,
317fb4d8502Sjsg 0xf089, 0xffffffff, 0x00000100,
318fb4d8502Sjsg 0xf080, 0xffffffff, 0x00000100,
319fb4d8502Sjsg 0xf08c, 0xffffffff, 0x00000100,
320fb4d8502Sjsg 0xf08d, 0xffffffff, 0x00000100,
321fb4d8502Sjsg 0xf094, 0xffffffff, 0x00000100,
322fb4d8502Sjsg 0xf095, 0xffffffff, 0x00000100,
323fb4d8502Sjsg 0xf096, 0xffffffff, 0x00000100,
324fb4d8502Sjsg 0xf097, 0xffffffff, 0x00000100,
325fb4d8502Sjsg 0xf098, 0xffffffff, 0x00000100,
326fb4d8502Sjsg 0xf09f, 0xffffffff, 0x00000100,
327fb4d8502Sjsg 0xf09e, 0xffffffff, 0x00000100,
328fb4d8502Sjsg 0xf084, 0xffffffff, 0x06000100,
329fb4d8502Sjsg 0xf0a4, 0xffffffff, 0x00000100,
330fb4d8502Sjsg 0xf09d, 0xffffffff, 0x00000100,
331fb4d8502Sjsg 0xf0ad, 0xffffffff, 0x00000100,
332fb4d8502Sjsg 0xf0ac, 0xffffffff, 0x00000100,
333fb4d8502Sjsg 0xf09c, 0xffffffff, 0x00000100,
334fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
335fb4d8502Sjsg 0xf008, 0xffffffff, 0x00010000,
336fb4d8502Sjsg 0xf009, 0xffffffff, 0x00030002,
337fb4d8502Sjsg 0xf00a, 0xffffffff, 0x00040007,
338fb4d8502Sjsg 0xf00b, 0xffffffff, 0x00060005,
339fb4d8502Sjsg 0xf00c, 0xffffffff, 0x00090008,
340fb4d8502Sjsg 0xf00d, 0xffffffff, 0x00010000,
341fb4d8502Sjsg 0xf00e, 0xffffffff, 0x00030002,
342fb4d8502Sjsg 0xf00f, 0xffffffff, 0x00040007,
343fb4d8502Sjsg 0xf010, 0xffffffff, 0x00060005,
344fb4d8502Sjsg 0xf011, 0xffffffff, 0x00090008,
345fb4d8502Sjsg 0xf012, 0xffffffff, 0x00010000,
346fb4d8502Sjsg 0xf013, 0xffffffff, 0x00030002,
347fb4d8502Sjsg 0xf014, 0xffffffff, 0x00040007,
348fb4d8502Sjsg 0xf015, 0xffffffff, 0x00060005,
349fb4d8502Sjsg 0xf016, 0xffffffff, 0x00090008,
350fb4d8502Sjsg 0xf017, 0xffffffff, 0x00010000,
351fb4d8502Sjsg 0xf018, 0xffffffff, 0x00030002,
352fb4d8502Sjsg 0xf019, 0xffffffff, 0x00040007,
353fb4d8502Sjsg 0xf01a, 0xffffffff, 0x00060005,
354fb4d8502Sjsg 0xf01b, 0xffffffff, 0x00090008,
355fb4d8502Sjsg 0xf01c, 0xffffffff, 0x00010000,
356fb4d8502Sjsg 0xf01d, 0xffffffff, 0x00030002,
357fb4d8502Sjsg 0xf01e, 0xffffffff, 0x00040007,
358fb4d8502Sjsg 0xf01f, 0xffffffff, 0x00060005,
359fb4d8502Sjsg 0xf020, 0xffffffff, 0x00090008,
360fb4d8502Sjsg 0xf021, 0xffffffff, 0x00010000,
361fb4d8502Sjsg 0xf022, 0xffffffff, 0x00030002,
362fb4d8502Sjsg 0xf023, 0xffffffff, 0x00040007,
363fb4d8502Sjsg 0xf024, 0xffffffff, 0x00060005,
364fb4d8502Sjsg 0xf025, 0xffffffff, 0x00090008,
365fb4d8502Sjsg 0xf026, 0xffffffff, 0x00010000,
366fb4d8502Sjsg 0xf027, 0xffffffff, 0x00030002,
367fb4d8502Sjsg 0xf028, 0xffffffff, 0x00040007,
368fb4d8502Sjsg 0xf029, 0xffffffff, 0x00060005,
369fb4d8502Sjsg 0xf02a, 0xffffffff, 0x00090008,
370fb4d8502Sjsg 0xf000, 0xffffffff, 0x96e00200,
371fb4d8502Sjsg 0x21c2, 0xffffffff, 0x00900100,
372fb4d8502Sjsg 0x3109, 0xffffffff, 0x0020003f,
373fb4d8502Sjsg 0xe, 0xffffffff, 0x0140001c,
374fb4d8502Sjsg 0xf, 0x000f0000, 0x000f0000,
375fb4d8502Sjsg 0x88, 0xffffffff, 0xc060000c,
376fb4d8502Sjsg 0x89, 0xc0000fff, 0x00000100,
377fb4d8502Sjsg 0x3e4, 0xffffffff, 0x00000100,
378fb4d8502Sjsg 0x3e6, 0x00000101, 0x00000000,
379fb4d8502Sjsg 0x82a, 0xffffffff, 0x00000104,
380fb4d8502Sjsg 0x1579, 0xff000fff, 0x00000100,
381fb4d8502Sjsg 0xc33, 0xc0000fff, 0x00000104,
382fb4d8502Sjsg 0x3079, 0x00000001, 0x00000001,
383fb4d8502Sjsg 0x3403, 0xff000ff0, 0x00000100,
384fb4d8502Sjsg 0x3603, 0xff000ff0, 0x00000100
385fb4d8502Sjsg };
386fb4d8502Sjsg
387fb4d8502Sjsg static const u32 spectre_golden_spm_registers[] =
388fb4d8502Sjsg {
389fb4d8502Sjsg 0xc200, 0xe0ffffff, 0xe0000000
390fb4d8502Sjsg };
391fb4d8502Sjsg
392fb4d8502Sjsg static const u32 spectre_golden_common_registers[] =
393fb4d8502Sjsg {
394fb4d8502Sjsg 0x31dc, 0xffffffff, 0x00000800,
395fb4d8502Sjsg 0x31dd, 0xffffffff, 0x00000800,
396fb4d8502Sjsg 0x31e6, 0xffffffff, 0x00007fbf,
397fb4d8502Sjsg 0x31e7, 0xffffffff, 0x00007faf
398fb4d8502Sjsg };
399fb4d8502Sjsg
400fb4d8502Sjsg static const u32 spectre_golden_registers[] =
401fb4d8502Sjsg {
402fb4d8502Sjsg 0xf000, 0xffff1fff, 0x96940200,
403fb4d8502Sjsg 0xf003, 0xffff0001, 0xff000000,
404fb4d8502Sjsg 0xf080, 0xfffc0fff, 0x00000100,
405fb4d8502Sjsg 0x1bb6, 0x00010101, 0x00010000,
406fb4d8502Sjsg 0x260d, 0xf00fffff, 0x00000400,
407fb4d8502Sjsg 0x260e, 0xfffffffc, 0x00020200,
408fb4d8502Sjsg 0x16ec, 0x000000f0, 0x00000070,
409fb4d8502Sjsg 0x16f0, 0xf0311fff, 0x80300000,
410fb4d8502Sjsg 0x263e, 0x73773777, 0x12010001,
411fb4d8502Sjsg 0x26df, 0x00ff0000, 0x00fc0000,
412fb4d8502Sjsg 0xbd2, 0x73773777, 0x12010001,
413fb4d8502Sjsg 0x2285, 0xf000003f, 0x00000007,
414fb4d8502Sjsg 0x22c9, 0xffffffff, 0x00ffffff,
415fb4d8502Sjsg 0xa0d4, 0x3f3f3fff, 0x00000082,
416fb4d8502Sjsg 0xa0d5, 0x0000003f, 0x00000000,
417fb4d8502Sjsg 0xf9e, 0x00000001, 0x00000002,
418fb4d8502Sjsg 0x244f, 0xffff03df, 0x00000004,
419fb4d8502Sjsg 0x31da, 0x00000008, 0x00000008,
420fb4d8502Sjsg 0x2300, 0x000008ff, 0x00000800,
421fb4d8502Sjsg 0x2542, 0x00010000, 0x00010000,
422fb4d8502Sjsg 0x2b03, 0xffffffff, 0x54763210,
423fb4d8502Sjsg 0x853e, 0x01ff01ff, 0x00000002,
424fb4d8502Sjsg 0x8526, 0x007ff800, 0x00200000,
425fb4d8502Sjsg 0x8057, 0xffffffff, 0x00000f40,
426fb4d8502Sjsg 0xc24d, 0xffffffff, 0x00000001
427fb4d8502Sjsg };
428fb4d8502Sjsg
429fb4d8502Sjsg static const u32 spectre_mgcg_cgcg_init[] =
430fb4d8502Sjsg {
431fb4d8502Sjsg 0x3108, 0xffffffff, 0xfffffffc,
432fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
433fb4d8502Sjsg 0xf0a8, 0xffffffff, 0x00000100,
434fb4d8502Sjsg 0xf082, 0xffffffff, 0x00000100,
435fb4d8502Sjsg 0xf0b0, 0xffffffff, 0x00000100,
436fb4d8502Sjsg 0xf0b2, 0xffffffff, 0x00000100,
437fb4d8502Sjsg 0xf0b1, 0xffffffff, 0x00000100,
438fb4d8502Sjsg 0x1579, 0xffffffff, 0x00600100,
439fb4d8502Sjsg 0xf0a0, 0xffffffff, 0x00000100,
440fb4d8502Sjsg 0xf085, 0xffffffff, 0x06000100,
441fb4d8502Sjsg 0xf088, 0xffffffff, 0x00000100,
442fb4d8502Sjsg 0xf086, 0xffffffff, 0x06000100,
443fb4d8502Sjsg 0xf081, 0xffffffff, 0x00000100,
444fb4d8502Sjsg 0xf0b8, 0xffffffff, 0x00000100,
445fb4d8502Sjsg 0xf089, 0xffffffff, 0x00000100,
446fb4d8502Sjsg 0xf080, 0xffffffff, 0x00000100,
447fb4d8502Sjsg 0xf08c, 0xffffffff, 0x00000100,
448fb4d8502Sjsg 0xf08d, 0xffffffff, 0x00000100,
449fb4d8502Sjsg 0xf094, 0xffffffff, 0x00000100,
450fb4d8502Sjsg 0xf095, 0xffffffff, 0x00000100,
451fb4d8502Sjsg 0xf096, 0xffffffff, 0x00000100,
452fb4d8502Sjsg 0xf097, 0xffffffff, 0x00000100,
453fb4d8502Sjsg 0xf098, 0xffffffff, 0x00000100,
454fb4d8502Sjsg 0xf09f, 0xffffffff, 0x00000100,
455fb4d8502Sjsg 0xf09e, 0xffffffff, 0x00000100,
456fb4d8502Sjsg 0xf084, 0xffffffff, 0x06000100,
457fb4d8502Sjsg 0xf0a4, 0xffffffff, 0x00000100,
458fb4d8502Sjsg 0xf09d, 0xffffffff, 0x00000100,
459fb4d8502Sjsg 0xf0ad, 0xffffffff, 0x00000100,
460fb4d8502Sjsg 0xf0ac, 0xffffffff, 0x00000100,
461fb4d8502Sjsg 0xf09c, 0xffffffff, 0x00000100,
462fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
463fb4d8502Sjsg 0xf008, 0xffffffff, 0x00010000,
464fb4d8502Sjsg 0xf009, 0xffffffff, 0x00030002,
465fb4d8502Sjsg 0xf00a, 0xffffffff, 0x00040007,
466fb4d8502Sjsg 0xf00b, 0xffffffff, 0x00060005,
467fb4d8502Sjsg 0xf00c, 0xffffffff, 0x00090008,
468fb4d8502Sjsg 0xf00d, 0xffffffff, 0x00010000,
469fb4d8502Sjsg 0xf00e, 0xffffffff, 0x00030002,
470fb4d8502Sjsg 0xf00f, 0xffffffff, 0x00040007,
471fb4d8502Sjsg 0xf010, 0xffffffff, 0x00060005,
472fb4d8502Sjsg 0xf011, 0xffffffff, 0x00090008,
473fb4d8502Sjsg 0xf012, 0xffffffff, 0x00010000,
474fb4d8502Sjsg 0xf013, 0xffffffff, 0x00030002,
475fb4d8502Sjsg 0xf014, 0xffffffff, 0x00040007,
476fb4d8502Sjsg 0xf015, 0xffffffff, 0x00060005,
477fb4d8502Sjsg 0xf016, 0xffffffff, 0x00090008,
478fb4d8502Sjsg 0xf017, 0xffffffff, 0x00010000,
479fb4d8502Sjsg 0xf018, 0xffffffff, 0x00030002,
480fb4d8502Sjsg 0xf019, 0xffffffff, 0x00040007,
481fb4d8502Sjsg 0xf01a, 0xffffffff, 0x00060005,
482fb4d8502Sjsg 0xf01b, 0xffffffff, 0x00090008,
483fb4d8502Sjsg 0xf01c, 0xffffffff, 0x00010000,
484fb4d8502Sjsg 0xf01d, 0xffffffff, 0x00030002,
485fb4d8502Sjsg 0xf01e, 0xffffffff, 0x00040007,
486fb4d8502Sjsg 0xf01f, 0xffffffff, 0x00060005,
487fb4d8502Sjsg 0xf020, 0xffffffff, 0x00090008,
488fb4d8502Sjsg 0xf021, 0xffffffff, 0x00010000,
489fb4d8502Sjsg 0xf022, 0xffffffff, 0x00030002,
490fb4d8502Sjsg 0xf023, 0xffffffff, 0x00040007,
491fb4d8502Sjsg 0xf024, 0xffffffff, 0x00060005,
492fb4d8502Sjsg 0xf025, 0xffffffff, 0x00090008,
493fb4d8502Sjsg 0xf026, 0xffffffff, 0x00010000,
494fb4d8502Sjsg 0xf027, 0xffffffff, 0x00030002,
495fb4d8502Sjsg 0xf028, 0xffffffff, 0x00040007,
496fb4d8502Sjsg 0xf029, 0xffffffff, 0x00060005,
497fb4d8502Sjsg 0xf02a, 0xffffffff, 0x00090008,
498fb4d8502Sjsg 0xf02b, 0xffffffff, 0x00010000,
499fb4d8502Sjsg 0xf02c, 0xffffffff, 0x00030002,
500fb4d8502Sjsg 0xf02d, 0xffffffff, 0x00040007,
501fb4d8502Sjsg 0xf02e, 0xffffffff, 0x00060005,
502fb4d8502Sjsg 0xf02f, 0xffffffff, 0x00090008,
503fb4d8502Sjsg 0xf000, 0xffffffff, 0x96e00200,
504fb4d8502Sjsg 0x21c2, 0xffffffff, 0x00900100,
505fb4d8502Sjsg 0x3109, 0xffffffff, 0x0020003f,
506fb4d8502Sjsg 0xe, 0xffffffff, 0x0140001c,
507fb4d8502Sjsg 0xf, 0x000f0000, 0x000f0000,
508fb4d8502Sjsg 0x88, 0xffffffff, 0xc060000c,
509fb4d8502Sjsg 0x89, 0xc0000fff, 0x00000100,
510fb4d8502Sjsg 0x3e4, 0xffffffff, 0x00000100,
511fb4d8502Sjsg 0x3e6, 0x00000101, 0x00000000,
512fb4d8502Sjsg 0x82a, 0xffffffff, 0x00000104,
513fb4d8502Sjsg 0x1579, 0xff000fff, 0x00000100,
514fb4d8502Sjsg 0xc33, 0xc0000fff, 0x00000104,
515fb4d8502Sjsg 0x3079, 0x00000001, 0x00000001,
516fb4d8502Sjsg 0x3403, 0xff000ff0, 0x00000100,
517fb4d8502Sjsg 0x3603, 0xff000ff0, 0x00000100
518fb4d8502Sjsg };
519fb4d8502Sjsg
520fb4d8502Sjsg static const u32 kalindi_golden_spm_registers[] =
521fb4d8502Sjsg {
522fb4d8502Sjsg 0xc200, 0xe0ffffff, 0xe0000000
523fb4d8502Sjsg };
524fb4d8502Sjsg
525fb4d8502Sjsg static const u32 kalindi_golden_common_registers[] =
526fb4d8502Sjsg {
527fb4d8502Sjsg 0x31dc, 0xffffffff, 0x00000800,
528fb4d8502Sjsg 0x31dd, 0xffffffff, 0x00000800,
529fb4d8502Sjsg 0x31e6, 0xffffffff, 0x00007fbf,
530fb4d8502Sjsg 0x31e7, 0xffffffff, 0x00007faf
531fb4d8502Sjsg };
532fb4d8502Sjsg
533fb4d8502Sjsg static const u32 kalindi_golden_registers[] =
534fb4d8502Sjsg {
535fb4d8502Sjsg 0xf000, 0xffffdfff, 0x6e944040,
536fb4d8502Sjsg 0x1579, 0xff607fff, 0xfc000100,
537fb4d8502Sjsg 0xf088, 0xff000fff, 0x00000100,
538fb4d8502Sjsg 0xf089, 0xff000fff, 0x00000100,
539fb4d8502Sjsg 0xf080, 0xfffc0fff, 0x00000100,
540fb4d8502Sjsg 0x1bb6, 0x00010101, 0x00010000,
541fb4d8502Sjsg 0x260c, 0xffffffff, 0x00000000,
542fb4d8502Sjsg 0x260d, 0xf00fffff, 0x00000400,
543fb4d8502Sjsg 0x16ec, 0x000000f0, 0x00000070,
544fb4d8502Sjsg 0x16f0, 0xf0311fff, 0x80300000,
545fb4d8502Sjsg 0x263e, 0x73773777, 0x12010001,
546fb4d8502Sjsg 0x263f, 0xffffffff, 0x00000010,
547fb4d8502Sjsg 0x26df, 0x00ff0000, 0x00fc0000,
548fb4d8502Sjsg 0x200c, 0x00001f0f, 0x0000100a,
549fb4d8502Sjsg 0xbd2, 0x73773777, 0x12010001,
550fb4d8502Sjsg 0x902, 0x000fffff, 0x000c007f,
551fb4d8502Sjsg 0x2285, 0xf000003f, 0x00000007,
552fb4d8502Sjsg 0x22c9, 0x3fff3fff, 0x00ffcfff,
553fb4d8502Sjsg 0xc281, 0x0000ff0f, 0x00000000,
554fb4d8502Sjsg 0xa293, 0x07ffffff, 0x06000000,
555fb4d8502Sjsg 0x136, 0x00000fff, 0x00000100,
556fb4d8502Sjsg 0xf9e, 0x00000001, 0x00000002,
557fb4d8502Sjsg 0x31da, 0x00000008, 0x00000008,
558fb4d8502Sjsg 0x2300, 0x000000ff, 0x00000003,
559fb4d8502Sjsg 0x853e, 0x01ff01ff, 0x00000002,
560fb4d8502Sjsg 0x8526, 0x007ff800, 0x00200000,
561fb4d8502Sjsg 0x8057, 0xffffffff, 0x00000f40,
562fb4d8502Sjsg 0x2231, 0x001f3ae3, 0x00000082,
563fb4d8502Sjsg 0x2235, 0x0000001f, 0x00000010,
564fb4d8502Sjsg 0xc24d, 0xffffffff, 0x00000000
565fb4d8502Sjsg };
566fb4d8502Sjsg
567fb4d8502Sjsg static const u32 kalindi_mgcg_cgcg_init[] =
568fb4d8502Sjsg {
569fb4d8502Sjsg 0x3108, 0xffffffff, 0xfffffffc,
570fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
571fb4d8502Sjsg 0xf0a8, 0xffffffff, 0x00000100,
572fb4d8502Sjsg 0xf082, 0xffffffff, 0x00000100,
573fb4d8502Sjsg 0xf0b0, 0xffffffff, 0x00000100,
574fb4d8502Sjsg 0xf0b2, 0xffffffff, 0x00000100,
575fb4d8502Sjsg 0xf0b1, 0xffffffff, 0x00000100,
576fb4d8502Sjsg 0x1579, 0xffffffff, 0x00600100,
577fb4d8502Sjsg 0xf0a0, 0xffffffff, 0x00000100,
578fb4d8502Sjsg 0xf085, 0xffffffff, 0x06000100,
579fb4d8502Sjsg 0xf088, 0xffffffff, 0x00000100,
580fb4d8502Sjsg 0xf086, 0xffffffff, 0x06000100,
581fb4d8502Sjsg 0xf081, 0xffffffff, 0x00000100,
582fb4d8502Sjsg 0xf0b8, 0xffffffff, 0x00000100,
583fb4d8502Sjsg 0xf089, 0xffffffff, 0x00000100,
584fb4d8502Sjsg 0xf080, 0xffffffff, 0x00000100,
585fb4d8502Sjsg 0xf08c, 0xffffffff, 0x00000100,
586fb4d8502Sjsg 0xf08d, 0xffffffff, 0x00000100,
587fb4d8502Sjsg 0xf094, 0xffffffff, 0x00000100,
588fb4d8502Sjsg 0xf095, 0xffffffff, 0x00000100,
589fb4d8502Sjsg 0xf096, 0xffffffff, 0x00000100,
590fb4d8502Sjsg 0xf097, 0xffffffff, 0x00000100,
591fb4d8502Sjsg 0xf098, 0xffffffff, 0x00000100,
592fb4d8502Sjsg 0xf09f, 0xffffffff, 0x00000100,
593fb4d8502Sjsg 0xf09e, 0xffffffff, 0x00000100,
594fb4d8502Sjsg 0xf084, 0xffffffff, 0x06000100,
595fb4d8502Sjsg 0xf0a4, 0xffffffff, 0x00000100,
596fb4d8502Sjsg 0xf09d, 0xffffffff, 0x00000100,
597fb4d8502Sjsg 0xf0ad, 0xffffffff, 0x00000100,
598fb4d8502Sjsg 0xf0ac, 0xffffffff, 0x00000100,
599fb4d8502Sjsg 0xf09c, 0xffffffff, 0x00000100,
600fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
601fb4d8502Sjsg 0xf008, 0xffffffff, 0x00010000,
602fb4d8502Sjsg 0xf009, 0xffffffff, 0x00030002,
603fb4d8502Sjsg 0xf00a, 0xffffffff, 0x00040007,
604fb4d8502Sjsg 0xf00b, 0xffffffff, 0x00060005,
605fb4d8502Sjsg 0xf00c, 0xffffffff, 0x00090008,
606fb4d8502Sjsg 0xf00d, 0xffffffff, 0x00010000,
607fb4d8502Sjsg 0xf00e, 0xffffffff, 0x00030002,
608fb4d8502Sjsg 0xf00f, 0xffffffff, 0x00040007,
609fb4d8502Sjsg 0xf010, 0xffffffff, 0x00060005,
610fb4d8502Sjsg 0xf011, 0xffffffff, 0x00090008,
611fb4d8502Sjsg 0xf000, 0xffffffff, 0x96e00200,
612fb4d8502Sjsg 0x21c2, 0xffffffff, 0x00900100,
613fb4d8502Sjsg 0x3109, 0xffffffff, 0x0020003f,
614fb4d8502Sjsg 0xe, 0xffffffff, 0x0140001c,
615fb4d8502Sjsg 0xf, 0x000f0000, 0x000f0000,
616fb4d8502Sjsg 0x88, 0xffffffff, 0xc060000c,
617fb4d8502Sjsg 0x89, 0xc0000fff, 0x00000100,
618fb4d8502Sjsg 0x82a, 0xffffffff, 0x00000104,
619fb4d8502Sjsg 0x1579, 0xff000fff, 0x00000100,
620fb4d8502Sjsg 0xc33, 0xc0000fff, 0x00000104,
621fb4d8502Sjsg 0x3079, 0x00000001, 0x00000001,
622fb4d8502Sjsg 0x3403, 0xff000ff0, 0x00000100,
623fb4d8502Sjsg 0x3603, 0xff000ff0, 0x00000100
624fb4d8502Sjsg };
625fb4d8502Sjsg
626fb4d8502Sjsg static const u32 hawaii_golden_spm_registers[] =
627fb4d8502Sjsg {
628fb4d8502Sjsg 0xc200, 0xe0ffffff, 0xe0000000
629fb4d8502Sjsg };
630fb4d8502Sjsg
631fb4d8502Sjsg static const u32 hawaii_golden_common_registers[] =
632fb4d8502Sjsg {
633fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
634fb4d8502Sjsg 0xa0d4, 0xffffffff, 0x3a00161a,
635fb4d8502Sjsg 0xa0d5, 0xffffffff, 0x0000002e,
636fb4d8502Sjsg 0x2684, 0xffffffff, 0x00018208,
637fb4d8502Sjsg 0x263e, 0xffffffff, 0x12011003
638fb4d8502Sjsg };
639fb4d8502Sjsg
640fb4d8502Sjsg static const u32 hawaii_golden_registers[] =
641fb4d8502Sjsg {
642fb4d8502Sjsg 0xcd5, 0x00000333, 0x00000333,
643fb4d8502Sjsg 0x2684, 0x00010000, 0x00058208,
644fb4d8502Sjsg 0x260c, 0xffffffff, 0x00000000,
645fb4d8502Sjsg 0x260d, 0xf00fffff, 0x00000400,
646fb4d8502Sjsg 0x260e, 0x0002021c, 0x00020200,
647fb4d8502Sjsg 0x31e, 0x00000080, 0x00000000,
648fb4d8502Sjsg 0x16ec, 0x000000f0, 0x00000070,
649fb4d8502Sjsg 0x16f0, 0xf0311fff, 0x80300000,
650fb4d8502Sjsg 0xd43, 0x00810000, 0x408af000,
651fb4d8502Sjsg 0x1c0c, 0x31000111, 0x00000011,
652fb4d8502Sjsg 0xbd2, 0x73773777, 0x12010001,
653fb4d8502Sjsg 0x848, 0x0000007f, 0x0000001b,
654fb4d8502Sjsg 0x877, 0x00007fb6, 0x00002191,
655fb4d8502Sjsg 0xd8a, 0x0000003f, 0x0000000a,
656fb4d8502Sjsg 0xd8b, 0x0000003f, 0x0000000a,
657fb4d8502Sjsg 0xab9, 0x00073ffe, 0x000022a2,
658fb4d8502Sjsg 0x903, 0x000007ff, 0x00000000,
659fb4d8502Sjsg 0x22fc, 0x00002001, 0x00000001,
660fb4d8502Sjsg 0x22c9, 0xffffffff, 0x00ffffff,
661fb4d8502Sjsg 0xc281, 0x0000ff0f, 0x00000000,
662fb4d8502Sjsg 0xa293, 0x07ffffff, 0x06000000,
663fb4d8502Sjsg 0xf9e, 0x00000001, 0x00000002,
664fb4d8502Sjsg 0x31da, 0x00000008, 0x00000008,
665fb4d8502Sjsg 0x31dc, 0x00000f00, 0x00000800,
666fb4d8502Sjsg 0x31dd, 0x00000f00, 0x00000800,
667fb4d8502Sjsg 0x31e6, 0x00ffffff, 0x00ff7fbf,
668fb4d8502Sjsg 0x31e7, 0x00ffffff, 0x00ff7faf,
669fb4d8502Sjsg 0x2300, 0x000000ff, 0x00000800,
670fb4d8502Sjsg 0x390, 0x00001fff, 0x00001fff,
671fb4d8502Sjsg 0x2418, 0x0000007f, 0x00000020,
672fb4d8502Sjsg 0x2542, 0x00010000, 0x00010000,
673fb4d8502Sjsg 0x2b80, 0x00100000, 0x000ff07c,
674fb4d8502Sjsg 0x2b05, 0x000003ff, 0x0000000f,
675fb4d8502Sjsg 0x2b04, 0xffffffff, 0x7564fdec,
676fb4d8502Sjsg 0x2b03, 0xffffffff, 0x3120b9a8,
677fb4d8502Sjsg 0x2b02, 0x20000000, 0x0f9c0000
678fb4d8502Sjsg };
679fb4d8502Sjsg
680fb4d8502Sjsg static const u32 hawaii_mgcg_cgcg_init[] =
681fb4d8502Sjsg {
682fb4d8502Sjsg 0x3108, 0xffffffff, 0xfffffffd,
683fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
684fb4d8502Sjsg 0xf0a8, 0xffffffff, 0x00000100,
685fb4d8502Sjsg 0xf082, 0xffffffff, 0x00000100,
686fb4d8502Sjsg 0xf0b0, 0xffffffff, 0x00000100,
687fb4d8502Sjsg 0xf0b2, 0xffffffff, 0x00000100,
688fb4d8502Sjsg 0xf0b1, 0xffffffff, 0x00000100,
689fb4d8502Sjsg 0x1579, 0xffffffff, 0x00200100,
690fb4d8502Sjsg 0xf0a0, 0xffffffff, 0x00000100,
691fb4d8502Sjsg 0xf085, 0xffffffff, 0x06000100,
692fb4d8502Sjsg 0xf088, 0xffffffff, 0x00000100,
693fb4d8502Sjsg 0xf086, 0xffffffff, 0x06000100,
694fb4d8502Sjsg 0xf081, 0xffffffff, 0x00000100,
695fb4d8502Sjsg 0xf0b8, 0xffffffff, 0x00000100,
696fb4d8502Sjsg 0xf089, 0xffffffff, 0x00000100,
697fb4d8502Sjsg 0xf080, 0xffffffff, 0x00000100,
698fb4d8502Sjsg 0xf08c, 0xffffffff, 0x00000100,
699fb4d8502Sjsg 0xf08d, 0xffffffff, 0x00000100,
700fb4d8502Sjsg 0xf094, 0xffffffff, 0x00000100,
701fb4d8502Sjsg 0xf095, 0xffffffff, 0x00000100,
702fb4d8502Sjsg 0xf096, 0xffffffff, 0x00000100,
703fb4d8502Sjsg 0xf097, 0xffffffff, 0x00000100,
704fb4d8502Sjsg 0xf098, 0xffffffff, 0x00000100,
705fb4d8502Sjsg 0xf09f, 0xffffffff, 0x00000100,
706fb4d8502Sjsg 0xf09e, 0xffffffff, 0x00000100,
707fb4d8502Sjsg 0xf084, 0xffffffff, 0x06000100,
708fb4d8502Sjsg 0xf0a4, 0xffffffff, 0x00000100,
709fb4d8502Sjsg 0xf09d, 0xffffffff, 0x00000100,
710fb4d8502Sjsg 0xf0ad, 0xffffffff, 0x00000100,
711fb4d8502Sjsg 0xf0ac, 0xffffffff, 0x00000100,
712fb4d8502Sjsg 0xf09c, 0xffffffff, 0x00000100,
713fb4d8502Sjsg 0xc200, 0xffffffff, 0xe0000000,
714fb4d8502Sjsg 0xf008, 0xffffffff, 0x00010000,
715fb4d8502Sjsg 0xf009, 0xffffffff, 0x00030002,
716fb4d8502Sjsg 0xf00a, 0xffffffff, 0x00040007,
717fb4d8502Sjsg 0xf00b, 0xffffffff, 0x00060005,
718fb4d8502Sjsg 0xf00c, 0xffffffff, 0x00090008,
719fb4d8502Sjsg 0xf00d, 0xffffffff, 0x00010000,
720fb4d8502Sjsg 0xf00e, 0xffffffff, 0x00030002,
721fb4d8502Sjsg 0xf00f, 0xffffffff, 0x00040007,
722fb4d8502Sjsg 0xf010, 0xffffffff, 0x00060005,
723fb4d8502Sjsg 0xf011, 0xffffffff, 0x00090008,
724fb4d8502Sjsg 0xf012, 0xffffffff, 0x00010000,
725fb4d8502Sjsg 0xf013, 0xffffffff, 0x00030002,
726fb4d8502Sjsg 0xf014, 0xffffffff, 0x00040007,
727fb4d8502Sjsg 0xf015, 0xffffffff, 0x00060005,
728fb4d8502Sjsg 0xf016, 0xffffffff, 0x00090008,
729fb4d8502Sjsg 0xf017, 0xffffffff, 0x00010000,
730fb4d8502Sjsg 0xf018, 0xffffffff, 0x00030002,
731fb4d8502Sjsg 0xf019, 0xffffffff, 0x00040007,
732fb4d8502Sjsg 0xf01a, 0xffffffff, 0x00060005,
733fb4d8502Sjsg 0xf01b, 0xffffffff, 0x00090008,
734fb4d8502Sjsg 0xf01c, 0xffffffff, 0x00010000,
735fb4d8502Sjsg 0xf01d, 0xffffffff, 0x00030002,
736fb4d8502Sjsg 0xf01e, 0xffffffff, 0x00040007,
737fb4d8502Sjsg 0xf01f, 0xffffffff, 0x00060005,
738fb4d8502Sjsg 0xf020, 0xffffffff, 0x00090008,
739fb4d8502Sjsg 0xf021, 0xffffffff, 0x00010000,
740fb4d8502Sjsg 0xf022, 0xffffffff, 0x00030002,
741fb4d8502Sjsg 0xf023, 0xffffffff, 0x00040007,
742fb4d8502Sjsg 0xf024, 0xffffffff, 0x00060005,
743fb4d8502Sjsg 0xf025, 0xffffffff, 0x00090008,
744fb4d8502Sjsg 0xf026, 0xffffffff, 0x00010000,
745fb4d8502Sjsg 0xf027, 0xffffffff, 0x00030002,
746fb4d8502Sjsg 0xf028, 0xffffffff, 0x00040007,
747fb4d8502Sjsg 0xf029, 0xffffffff, 0x00060005,
748fb4d8502Sjsg 0xf02a, 0xffffffff, 0x00090008,
749fb4d8502Sjsg 0xf02b, 0xffffffff, 0x00010000,
750fb4d8502Sjsg 0xf02c, 0xffffffff, 0x00030002,
751fb4d8502Sjsg 0xf02d, 0xffffffff, 0x00040007,
752fb4d8502Sjsg 0xf02e, 0xffffffff, 0x00060005,
753fb4d8502Sjsg 0xf02f, 0xffffffff, 0x00090008,
754fb4d8502Sjsg 0xf030, 0xffffffff, 0x00010000,
755fb4d8502Sjsg 0xf031, 0xffffffff, 0x00030002,
756fb4d8502Sjsg 0xf032, 0xffffffff, 0x00040007,
757fb4d8502Sjsg 0xf033, 0xffffffff, 0x00060005,
758fb4d8502Sjsg 0xf034, 0xffffffff, 0x00090008,
759fb4d8502Sjsg 0xf035, 0xffffffff, 0x00010000,
760fb4d8502Sjsg 0xf036, 0xffffffff, 0x00030002,
761fb4d8502Sjsg 0xf037, 0xffffffff, 0x00040007,
762fb4d8502Sjsg 0xf038, 0xffffffff, 0x00060005,
763fb4d8502Sjsg 0xf039, 0xffffffff, 0x00090008,
764fb4d8502Sjsg 0xf03a, 0xffffffff, 0x00010000,
765fb4d8502Sjsg 0xf03b, 0xffffffff, 0x00030002,
766fb4d8502Sjsg 0xf03c, 0xffffffff, 0x00040007,
767fb4d8502Sjsg 0xf03d, 0xffffffff, 0x00060005,
768fb4d8502Sjsg 0xf03e, 0xffffffff, 0x00090008,
769fb4d8502Sjsg 0x30c6, 0xffffffff, 0x00020200,
770fb4d8502Sjsg 0xcd4, 0xffffffff, 0x00000200,
771fb4d8502Sjsg 0x570, 0xffffffff, 0x00000400,
772fb4d8502Sjsg 0x157a, 0xffffffff, 0x00000000,
773fb4d8502Sjsg 0xbd4, 0xffffffff, 0x00000902,
774fb4d8502Sjsg 0xf000, 0xffffffff, 0x96940200,
775fb4d8502Sjsg 0x21c2, 0xffffffff, 0x00900100,
776fb4d8502Sjsg 0x3109, 0xffffffff, 0x0020003f,
777fb4d8502Sjsg 0xe, 0xffffffff, 0x0140001c,
778fb4d8502Sjsg 0xf, 0x000f0000, 0x000f0000,
779fb4d8502Sjsg 0x88, 0xffffffff, 0xc060000c,
780fb4d8502Sjsg 0x89, 0xc0000fff, 0x00000100,
781fb4d8502Sjsg 0x3e4, 0xffffffff, 0x00000100,
782fb4d8502Sjsg 0x3e6, 0x00000101, 0x00000000,
783fb4d8502Sjsg 0x82a, 0xffffffff, 0x00000104,
784fb4d8502Sjsg 0x1579, 0xff000fff, 0x00000100,
785fb4d8502Sjsg 0xc33, 0xc0000fff, 0x00000104,
786fb4d8502Sjsg 0x3079, 0x00000001, 0x00000001,
787fb4d8502Sjsg 0x3403, 0xff000ff0, 0x00000100,
788fb4d8502Sjsg 0x3603, 0xff000ff0, 0x00000100
789fb4d8502Sjsg };
790fb4d8502Sjsg
791fb4d8502Sjsg static const u32 godavari_golden_registers[] =
792fb4d8502Sjsg {
793fb4d8502Sjsg 0x1579, 0xff607fff, 0xfc000100,
794fb4d8502Sjsg 0x1bb6, 0x00010101, 0x00010000,
795fb4d8502Sjsg 0x260c, 0xffffffff, 0x00000000,
796fb4d8502Sjsg 0x260c0, 0xf00fffff, 0x00000400,
797fb4d8502Sjsg 0x184c, 0xffffffff, 0x00010000,
798fb4d8502Sjsg 0x16ec, 0x000000f0, 0x00000070,
799fb4d8502Sjsg 0x16f0, 0xf0311fff, 0x80300000,
800fb4d8502Sjsg 0x263e, 0x73773777, 0x12010001,
801fb4d8502Sjsg 0x263f, 0xffffffff, 0x00000010,
802fb4d8502Sjsg 0x200c, 0x00001f0f, 0x0000100a,
803fb4d8502Sjsg 0xbd2, 0x73773777, 0x12010001,
804fb4d8502Sjsg 0x902, 0x000fffff, 0x000c007f,
805fb4d8502Sjsg 0x2285, 0xf000003f, 0x00000007,
806fb4d8502Sjsg 0x22c9, 0xffffffff, 0x00ff0fff,
807fb4d8502Sjsg 0xc281, 0x0000ff0f, 0x00000000,
808fb4d8502Sjsg 0xa293, 0x07ffffff, 0x06000000,
809fb4d8502Sjsg 0x136, 0x00000fff, 0x00000100,
810fb4d8502Sjsg 0x3405, 0x00010000, 0x00810001,
811fb4d8502Sjsg 0x3605, 0x00010000, 0x00810001,
812fb4d8502Sjsg 0xf9e, 0x00000001, 0x00000002,
813fb4d8502Sjsg 0x31da, 0x00000008, 0x00000008,
814fb4d8502Sjsg 0x31dc, 0x00000f00, 0x00000800,
815fb4d8502Sjsg 0x31dd, 0x00000f00, 0x00000800,
816fb4d8502Sjsg 0x31e6, 0x00ffffff, 0x00ff7fbf,
817fb4d8502Sjsg 0x31e7, 0x00ffffff, 0x00ff7faf,
818fb4d8502Sjsg 0x2300, 0x000000ff, 0x00000001,
819fb4d8502Sjsg 0x853e, 0x01ff01ff, 0x00000002,
820fb4d8502Sjsg 0x8526, 0x007ff800, 0x00200000,
821fb4d8502Sjsg 0x8057, 0xffffffff, 0x00000f40,
822fb4d8502Sjsg 0x2231, 0x001f3ae3, 0x00000082,
823fb4d8502Sjsg 0x2235, 0x0000001f, 0x00000010,
824fb4d8502Sjsg 0xc24d, 0xffffffff, 0x00000000
825fb4d8502Sjsg };
826fb4d8502Sjsg
cik_init_golden_registers(struct amdgpu_device * adev)827fb4d8502Sjsg static void cik_init_golden_registers(struct amdgpu_device *adev)
828fb4d8502Sjsg {
829fb4d8502Sjsg /* Some of the registers might be dependent on GRBM_GFX_INDEX */
830fb4d8502Sjsg mutex_lock(&adev->grbm_idx_mutex);
831fb4d8502Sjsg
832fb4d8502Sjsg switch (adev->asic_type) {
833fb4d8502Sjsg case CHIP_BONAIRE:
834fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
835fb4d8502Sjsg bonaire_mgcg_cgcg_init,
836fb4d8502Sjsg ARRAY_SIZE(bonaire_mgcg_cgcg_init));
837fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
838fb4d8502Sjsg bonaire_golden_registers,
839fb4d8502Sjsg ARRAY_SIZE(bonaire_golden_registers));
840fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
841fb4d8502Sjsg bonaire_golden_common_registers,
842fb4d8502Sjsg ARRAY_SIZE(bonaire_golden_common_registers));
843fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
844fb4d8502Sjsg bonaire_golden_spm_registers,
845fb4d8502Sjsg ARRAY_SIZE(bonaire_golden_spm_registers));
846fb4d8502Sjsg break;
847fb4d8502Sjsg case CHIP_KABINI:
848fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
849fb4d8502Sjsg kalindi_mgcg_cgcg_init,
850fb4d8502Sjsg ARRAY_SIZE(kalindi_mgcg_cgcg_init));
851fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
852fb4d8502Sjsg kalindi_golden_registers,
853fb4d8502Sjsg ARRAY_SIZE(kalindi_golden_registers));
854fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
855fb4d8502Sjsg kalindi_golden_common_registers,
856fb4d8502Sjsg ARRAY_SIZE(kalindi_golden_common_registers));
857fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
858fb4d8502Sjsg kalindi_golden_spm_registers,
859fb4d8502Sjsg ARRAY_SIZE(kalindi_golden_spm_registers));
860fb4d8502Sjsg break;
861fb4d8502Sjsg case CHIP_MULLINS:
862fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
863fb4d8502Sjsg kalindi_mgcg_cgcg_init,
864fb4d8502Sjsg ARRAY_SIZE(kalindi_mgcg_cgcg_init));
865fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
866fb4d8502Sjsg godavari_golden_registers,
867fb4d8502Sjsg ARRAY_SIZE(godavari_golden_registers));
868fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
869fb4d8502Sjsg kalindi_golden_common_registers,
870fb4d8502Sjsg ARRAY_SIZE(kalindi_golden_common_registers));
871fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
872fb4d8502Sjsg kalindi_golden_spm_registers,
873fb4d8502Sjsg ARRAY_SIZE(kalindi_golden_spm_registers));
874fb4d8502Sjsg break;
875fb4d8502Sjsg case CHIP_KAVERI:
876fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
877fb4d8502Sjsg spectre_mgcg_cgcg_init,
878fb4d8502Sjsg ARRAY_SIZE(spectre_mgcg_cgcg_init));
879fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
880fb4d8502Sjsg spectre_golden_registers,
881fb4d8502Sjsg ARRAY_SIZE(spectre_golden_registers));
882fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
883fb4d8502Sjsg spectre_golden_common_registers,
884fb4d8502Sjsg ARRAY_SIZE(spectre_golden_common_registers));
885fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
886fb4d8502Sjsg spectre_golden_spm_registers,
887fb4d8502Sjsg ARRAY_SIZE(spectre_golden_spm_registers));
888fb4d8502Sjsg break;
889fb4d8502Sjsg case CHIP_HAWAII:
890fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
891fb4d8502Sjsg hawaii_mgcg_cgcg_init,
892fb4d8502Sjsg ARRAY_SIZE(hawaii_mgcg_cgcg_init));
893fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
894fb4d8502Sjsg hawaii_golden_registers,
895fb4d8502Sjsg ARRAY_SIZE(hawaii_golden_registers));
896fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
897fb4d8502Sjsg hawaii_golden_common_registers,
898fb4d8502Sjsg ARRAY_SIZE(hawaii_golden_common_registers));
899fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
900fb4d8502Sjsg hawaii_golden_spm_registers,
901fb4d8502Sjsg ARRAY_SIZE(hawaii_golden_spm_registers));
902fb4d8502Sjsg break;
903fb4d8502Sjsg default:
904fb4d8502Sjsg break;
905fb4d8502Sjsg }
906fb4d8502Sjsg mutex_unlock(&adev->grbm_idx_mutex);
907fb4d8502Sjsg }
908fb4d8502Sjsg
909fb4d8502Sjsg /**
910fb4d8502Sjsg * cik_get_xclk - get the xclk
911fb4d8502Sjsg *
912fb4d8502Sjsg * @adev: amdgpu_device pointer
913fb4d8502Sjsg *
914fb4d8502Sjsg * Returns the reference clock used by the gfx engine
915fb4d8502Sjsg * (CIK).
916fb4d8502Sjsg */
cik_get_xclk(struct amdgpu_device * adev)917fb4d8502Sjsg static u32 cik_get_xclk(struct amdgpu_device *adev)
918fb4d8502Sjsg {
919fb4d8502Sjsg u32 reference_clock = adev->clock.spll.reference_freq;
920fb4d8502Sjsg
921fb4d8502Sjsg if (adev->flags & AMD_IS_APU) {
922fb4d8502Sjsg if (RREG32_SMC(ixGENERAL_PWRMGT) & GENERAL_PWRMGT__GPU_COUNTER_CLK_MASK)
923fb4d8502Sjsg return reference_clock / 2;
924fb4d8502Sjsg } else {
925fb4d8502Sjsg if (RREG32_SMC(ixCG_CLKPIN_CNTL) & CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK)
926fb4d8502Sjsg return reference_clock / 4;
927fb4d8502Sjsg }
928fb4d8502Sjsg return reference_clock;
929fb4d8502Sjsg }
930fb4d8502Sjsg
931fb4d8502Sjsg /**
932fb4d8502Sjsg * cik_srbm_select - select specific register instances
933fb4d8502Sjsg *
934fb4d8502Sjsg * @adev: amdgpu_device pointer
935fb4d8502Sjsg * @me: selected ME (micro engine)
936fb4d8502Sjsg * @pipe: pipe
937fb4d8502Sjsg * @queue: queue
938fb4d8502Sjsg * @vmid: VMID
939fb4d8502Sjsg *
940fb4d8502Sjsg * Switches the currently active registers instances. Some
941fb4d8502Sjsg * registers are instanced per VMID, others are instanced per
942fb4d8502Sjsg * me/pipe/queue combination.
943fb4d8502Sjsg */
cik_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)944fb4d8502Sjsg void cik_srbm_select(struct amdgpu_device *adev,
945fb4d8502Sjsg u32 me, u32 pipe, u32 queue, u32 vmid)
946fb4d8502Sjsg {
947fb4d8502Sjsg u32 srbm_gfx_cntl =
948fb4d8502Sjsg (((pipe << SRBM_GFX_CNTL__PIPEID__SHIFT) & SRBM_GFX_CNTL__PIPEID_MASK)|
949fb4d8502Sjsg ((me << SRBM_GFX_CNTL__MEID__SHIFT) & SRBM_GFX_CNTL__MEID_MASK)|
950fb4d8502Sjsg ((vmid << SRBM_GFX_CNTL__VMID__SHIFT) & SRBM_GFX_CNTL__VMID_MASK)|
951fb4d8502Sjsg ((queue << SRBM_GFX_CNTL__QUEUEID__SHIFT) & SRBM_GFX_CNTL__QUEUEID_MASK));
952fb4d8502Sjsg WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
953fb4d8502Sjsg }
954fb4d8502Sjsg
cik_vga_set_state(struct amdgpu_device * adev,bool state)955fb4d8502Sjsg static void cik_vga_set_state(struct amdgpu_device *adev, bool state)
956fb4d8502Sjsg {
957fb4d8502Sjsg uint32_t tmp;
958fb4d8502Sjsg
959fb4d8502Sjsg tmp = RREG32(mmCONFIG_CNTL);
960fb4d8502Sjsg if (!state)
961fb4d8502Sjsg tmp |= CONFIG_CNTL__VGA_DIS_MASK;
962fb4d8502Sjsg else
963fb4d8502Sjsg tmp &= ~CONFIG_CNTL__VGA_DIS_MASK;
964fb4d8502Sjsg WREG32(mmCONFIG_CNTL, tmp);
965fb4d8502Sjsg }
966fb4d8502Sjsg
cik_read_disabled_bios(struct amdgpu_device * adev)967fb4d8502Sjsg static bool cik_read_disabled_bios(struct amdgpu_device *adev)
968fb4d8502Sjsg {
969fb4d8502Sjsg u32 bus_cntl;
970fb4d8502Sjsg u32 d1vga_control = 0;
971fb4d8502Sjsg u32 d2vga_control = 0;
972fb4d8502Sjsg u32 vga_render_control = 0;
973fb4d8502Sjsg u32 rom_cntl;
974fb4d8502Sjsg bool r;
975fb4d8502Sjsg
976fb4d8502Sjsg bus_cntl = RREG32(mmBUS_CNTL);
977fb4d8502Sjsg if (adev->mode_info.num_crtc) {
978fb4d8502Sjsg d1vga_control = RREG32(mmD1VGA_CONTROL);
979fb4d8502Sjsg d2vga_control = RREG32(mmD2VGA_CONTROL);
980fb4d8502Sjsg vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
981fb4d8502Sjsg }
982fb4d8502Sjsg rom_cntl = RREG32_SMC(ixROM_CNTL);
983fb4d8502Sjsg
984fb4d8502Sjsg /* enable the rom */
985fb4d8502Sjsg WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
986fb4d8502Sjsg if (adev->mode_info.num_crtc) {
987fb4d8502Sjsg /* Disable VGA mode */
988fb4d8502Sjsg WREG32(mmD1VGA_CONTROL,
989fb4d8502Sjsg (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
990fb4d8502Sjsg D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
991fb4d8502Sjsg WREG32(mmD2VGA_CONTROL,
992fb4d8502Sjsg (d2vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
993fb4d8502Sjsg D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
994fb4d8502Sjsg WREG32(mmVGA_RENDER_CONTROL,
995fb4d8502Sjsg (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
996fb4d8502Sjsg }
997fb4d8502Sjsg WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
998fb4d8502Sjsg
999fb4d8502Sjsg r = amdgpu_read_bios(adev);
1000fb4d8502Sjsg
1001fb4d8502Sjsg /* restore regs */
1002fb4d8502Sjsg WREG32(mmBUS_CNTL, bus_cntl);
1003fb4d8502Sjsg if (adev->mode_info.num_crtc) {
1004fb4d8502Sjsg WREG32(mmD1VGA_CONTROL, d1vga_control);
1005fb4d8502Sjsg WREG32(mmD2VGA_CONTROL, d2vga_control);
1006fb4d8502Sjsg WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
1007fb4d8502Sjsg }
1008fb4d8502Sjsg WREG32_SMC(ixROM_CNTL, rom_cntl);
1009fb4d8502Sjsg return r;
1010fb4d8502Sjsg }
1011fb4d8502Sjsg
cik_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)1012fb4d8502Sjsg static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
1013fb4d8502Sjsg u8 *bios, u32 length_bytes)
1014fb4d8502Sjsg {
1015fb4d8502Sjsg u32 *dw_ptr;
1016fb4d8502Sjsg unsigned long flags;
1017fb4d8502Sjsg u32 i, length_dw;
1018fb4d8502Sjsg
1019fb4d8502Sjsg if (bios == NULL)
1020fb4d8502Sjsg return false;
1021fb4d8502Sjsg if (length_bytes == 0)
1022fb4d8502Sjsg return false;
1023fb4d8502Sjsg /* APU vbios image is part of sbios image */
1024fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1025fb4d8502Sjsg return false;
1026fb4d8502Sjsg
1027fb4d8502Sjsg dw_ptr = (u32 *)bios;
1028*f005ef32Sjsg length_dw = ALIGN(length_bytes, 4) / 4;
1029fb4d8502Sjsg /* take the smc lock since we are using the smc index */
1030fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
1031fb4d8502Sjsg /* set rom index to 0 */
1032fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX);
1033fb4d8502Sjsg WREG32(mmSMC_IND_DATA_0, 0);
1034fb4d8502Sjsg /* set index to data for continous read */
1035fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_0, ixROM_DATA);
1036fb4d8502Sjsg for (i = 0; i < length_dw; i++)
1037fb4d8502Sjsg dw_ptr[i] = RREG32(mmSMC_IND_DATA_0);
1038fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
1039fb4d8502Sjsg
1040fb4d8502Sjsg return true;
1041fb4d8502Sjsg }
1042fb4d8502Sjsg
1043fb4d8502Sjsg static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
1044fb4d8502Sjsg {mmGRBM_STATUS},
1045c349dbc7Sjsg {mmGRBM_STATUS2},
1046c349dbc7Sjsg {mmGRBM_STATUS_SE0},
1047c349dbc7Sjsg {mmGRBM_STATUS_SE1},
1048c349dbc7Sjsg {mmGRBM_STATUS_SE2},
1049c349dbc7Sjsg {mmGRBM_STATUS_SE3},
1050c349dbc7Sjsg {mmSRBM_STATUS},
1051c349dbc7Sjsg {mmSRBM_STATUS2},
1052c349dbc7Sjsg {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
1053c349dbc7Sjsg {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
1054c349dbc7Sjsg {mmCP_STAT},
1055c349dbc7Sjsg {mmCP_STALLED_STAT1},
1056c349dbc7Sjsg {mmCP_STALLED_STAT2},
1057c349dbc7Sjsg {mmCP_STALLED_STAT3},
1058c349dbc7Sjsg {mmCP_CPF_BUSY_STAT},
1059c349dbc7Sjsg {mmCP_CPF_STALLED_STAT1},
1060c349dbc7Sjsg {mmCP_CPF_STATUS},
1061c349dbc7Sjsg {mmCP_CPC_BUSY_STAT},
1062c349dbc7Sjsg {mmCP_CPC_STALLED_STAT1},
1063c349dbc7Sjsg {mmCP_CPC_STATUS},
1064fb4d8502Sjsg {mmGB_ADDR_CONFIG},
1065fb4d8502Sjsg {mmMC_ARB_RAMCFG},
1066fb4d8502Sjsg {mmGB_TILE_MODE0},
1067fb4d8502Sjsg {mmGB_TILE_MODE1},
1068fb4d8502Sjsg {mmGB_TILE_MODE2},
1069fb4d8502Sjsg {mmGB_TILE_MODE3},
1070fb4d8502Sjsg {mmGB_TILE_MODE4},
1071fb4d8502Sjsg {mmGB_TILE_MODE5},
1072fb4d8502Sjsg {mmGB_TILE_MODE6},
1073fb4d8502Sjsg {mmGB_TILE_MODE7},
1074fb4d8502Sjsg {mmGB_TILE_MODE8},
1075fb4d8502Sjsg {mmGB_TILE_MODE9},
1076fb4d8502Sjsg {mmGB_TILE_MODE10},
1077fb4d8502Sjsg {mmGB_TILE_MODE11},
1078fb4d8502Sjsg {mmGB_TILE_MODE12},
1079fb4d8502Sjsg {mmGB_TILE_MODE13},
1080fb4d8502Sjsg {mmGB_TILE_MODE14},
1081fb4d8502Sjsg {mmGB_TILE_MODE15},
1082fb4d8502Sjsg {mmGB_TILE_MODE16},
1083fb4d8502Sjsg {mmGB_TILE_MODE17},
1084fb4d8502Sjsg {mmGB_TILE_MODE18},
1085fb4d8502Sjsg {mmGB_TILE_MODE19},
1086fb4d8502Sjsg {mmGB_TILE_MODE20},
1087fb4d8502Sjsg {mmGB_TILE_MODE21},
1088fb4d8502Sjsg {mmGB_TILE_MODE22},
1089fb4d8502Sjsg {mmGB_TILE_MODE23},
1090fb4d8502Sjsg {mmGB_TILE_MODE24},
1091fb4d8502Sjsg {mmGB_TILE_MODE25},
1092fb4d8502Sjsg {mmGB_TILE_MODE26},
1093fb4d8502Sjsg {mmGB_TILE_MODE27},
1094fb4d8502Sjsg {mmGB_TILE_MODE28},
1095fb4d8502Sjsg {mmGB_TILE_MODE29},
1096fb4d8502Sjsg {mmGB_TILE_MODE30},
1097fb4d8502Sjsg {mmGB_TILE_MODE31},
1098fb4d8502Sjsg {mmGB_MACROTILE_MODE0},
1099fb4d8502Sjsg {mmGB_MACROTILE_MODE1},
1100fb4d8502Sjsg {mmGB_MACROTILE_MODE2},
1101fb4d8502Sjsg {mmGB_MACROTILE_MODE3},
1102fb4d8502Sjsg {mmGB_MACROTILE_MODE4},
1103fb4d8502Sjsg {mmGB_MACROTILE_MODE5},
1104fb4d8502Sjsg {mmGB_MACROTILE_MODE6},
1105fb4d8502Sjsg {mmGB_MACROTILE_MODE7},
1106fb4d8502Sjsg {mmGB_MACROTILE_MODE8},
1107fb4d8502Sjsg {mmGB_MACROTILE_MODE9},
1108fb4d8502Sjsg {mmGB_MACROTILE_MODE10},
1109fb4d8502Sjsg {mmGB_MACROTILE_MODE11},
1110fb4d8502Sjsg {mmGB_MACROTILE_MODE12},
1111fb4d8502Sjsg {mmGB_MACROTILE_MODE13},
1112fb4d8502Sjsg {mmGB_MACROTILE_MODE14},
1113fb4d8502Sjsg {mmGB_MACROTILE_MODE15},
1114fb4d8502Sjsg {mmCC_RB_BACKEND_DISABLE, true},
1115fb4d8502Sjsg {mmGC_USER_RB_BACKEND_DISABLE, true},
1116fb4d8502Sjsg {mmGB_BACKEND_MAP, false},
1117fb4d8502Sjsg {mmPA_SC_RASTER_CONFIG, true},
1118fb4d8502Sjsg {mmPA_SC_RASTER_CONFIG_1, true},
1119fb4d8502Sjsg };
1120fb4d8502Sjsg
1121fb4d8502Sjsg
cik_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)1122fb4d8502Sjsg static uint32_t cik_get_register_value(struct amdgpu_device *adev,
1123fb4d8502Sjsg bool indexed, u32 se_num,
1124fb4d8502Sjsg u32 sh_num, u32 reg_offset)
1125fb4d8502Sjsg {
1126fb4d8502Sjsg if (indexed) {
1127fb4d8502Sjsg uint32_t val;
1128fb4d8502Sjsg unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
1129fb4d8502Sjsg unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
1130fb4d8502Sjsg
1131fb4d8502Sjsg switch (reg_offset) {
1132fb4d8502Sjsg case mmCC_RB_BACKEND_DISABLE:
1133fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
1134fb4d8502Sjsg case mmGC_USER_RB_BACKEND_DISABLE:
1135fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
1136fb4d8502Sjsg case mmPA_SC_RASTER_CONFIG:
1137fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
1138fb4d8502Sjsg case mmPA_SC_RASTER_CONFIG_1:
1139fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
1140fb4d8502Sjsg }
1141fb4d8502Sjsg
1142fb4d8502Sjsg mutex_lock(&adev->grbm_idx_mutex);
1143fb4d8502Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
1144*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
1145fb4d8502Sjsg
1146fb4d8502Sjsg val = RREG32(reg_offset);
1147fb4d8502Sjsg
1148fb4d8502Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
1149*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
1150fb4d8502Sjsg mutex_unlock(&adev->grbm_idx_mutex);
1151fb4d8502Sjsg return val;
1152fb4d8502Sjsg } else {
1153fb4d8502Sjsg unsigned idx;
1154fb4d8502Sjsg
1155fb4d8502Sjsg switch (reg_offset) {
1156fb4d8502Sjsg case mmGB_ADDR_CONFIG:
1157fb4d8502Sjsg return adev->gfx.config.gb_addr_config;
1158fb4d8502Sjsg case mmMC_ARB_RAMCFG:
1159fb4d8502Sjsg return adev->gfx.config.mc_arb_ramcfg;
1160fb4d8502Sjsg case mmGB_TILE_MODE0:
1161fb4d8502Sjsg case mmGB_TILE_MODE1:
1162fb4d8502Sjsg case mmGB_TILE_MODE2:
1163fb4d8502Sjsg case mmGB_TILE_MODE3:
1164fb4d8502Sjsg case mmGB_TILE_MODE4:
1165fb4d8502Sjsg case mmGB_TILE_MODE5:
1166fb4d8502Sjsg case mmGB_TILE_MODE6:
1167fb4d8502Sjsg case mmGB_TILE_MODE7:
1168fb4d8502Sjsg case mmGB_TILE_MODE8:
1169fb4d8502Sjsg case mmGB_TILE_MODE9:
1170fb4d8502Sjsg case mmGB_TILE_MODE10:
1171fb4d8502Sjsg case mmGB_TILE_MODE11:
1172fb4d8502Sjsg case mmGB_TILE_MODE12:
1173fb4d8502Sjsg case mmGB_TILE_MODE13:
1174fb4d8502Sjsg case mmGB_TILE_MODE14:
1175fb4d8502Sjsg case mmGB_TILE_MODE15:
1176fb4d8502Sjsg case mmGB_TILE_MODE16:
1177fb4d8502Sjsg case mmGB_TILE_MODE17:
1178fb4d8502Sjsg case mmGB_TILE_MODE18:
1179fb4d8502Sjsg case mmGB_TILE_MODE19:
1180fb4d8502Sjsg case mmGB_TILE_MODE20:
1181fb4d8502Sjsg case mmGB_TILE_MODE21:
1182fb4d8502Sjsg case mmGB_TILE_MODE22:
1183fb4d8502Sjsg case mmGB_TILE_MODE23:
1184fb4d8502Sjsg case mmGB_TILE_MODE24:
1185fb4d8502Sjsg case mmGB_TILE_MODE25:
1186fb4d8502Sjsg case mmGB_TILE_MODE26:
1187fb4d8502Sjsg case mmGB_TILE_MODE27:
1188fb4d8502Sjsg case mmGB_TILE_MODE28:
1189fb4d8502Sjsg case mmGB_TILE_MODE29:
1190fb4d8502Sjsg case mmGB_TILE_MODE30:
1191fb4d8502Sjsg case mmGB_TILE_MODE31:
1192fb4d8502Sjsg idx = (reg_offset - mmGB_TILE_MODE0);
1193fb4d8502Sjsg return adev->gfx.config.tile_mode_array[idx];
1194fb4d8502Sjsg case mmGB_MACROTILE_MODE0:
1195fb4d8502Sjsg case mmGB_MACROTILE_MODE1:
1196fb4d8502Sjsg case mmGB_MACROTILE_MODE2:
1197fb4d8502Sjsg case mmGB_MACROTILE_MODE3:
1198fb4d8502Sjsg case mmGB_MACROTILE_MODE4:
1199fb4d8502Sjsg case mmGB_MACROTILE_MODE5:
1200fb4d8502Sjsg case mmGB_MACROTILE_MODE6:
1201fb4d8502Sjsg case mmGB_MACROTILE_MODE7:
1202fb4d8502Sjsg case mmGB_MACROTILE_MODE8:
1203fb4d8502Sjsg case mmGB_MACROTILE_MODE9:
1204fb4d8502Sjsg case mmGB_MACROTILE_MODE10:
1205fb4d8502Sjsg case mmGB_MACROTILE_MODE11:
1206fb4d8502Sjsg case mmGB_MACROTILE_MODE12:
1207fb4d8502Sjsg case mmGB_MACROTILE_MODE13:
1208fb4d8502Sjsg case mmGB_MACROTILE_MODE14:
1209fb4d8502Sjsg case mmGB_MACROTILE_MODE15:
1210fb4d8502Sjsg idx = (reg_offset - mmGB_MACROTILE_MODE0);
1211fb4d8502Sjsg return adev->gfx.config.macrotile_mode_array[idx];
1212fb4d8502Sjsg default:
1213fb4d8502Sjsg return RREG32(reg_offset);
1214fb4d8502Sjsg }
1215fb4d8502Sjsg }
1216fb4d8502Sjsg }
1217fb4d8502Sjsg
cik_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)1218fb4d8502Sjsg static int cik_read_register(struct amdgpu_device *adev, u32 se_num,
1219fb4d8502Sjsg u32 sh_num, u32 reg_offset, u32 *value)
1220fb4d8502Sjsg {
1221fb4d8502Sjsg uint32_t i;
1222fb4d8502Sjsg
1223fb4d8502Sjsg *value = 0;
1224fb4d8502Sjsg for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) {
1225fb4d8502Sjsg bool indexed = cik_allowed_read_registers[i].grbm_indexed;
1226fb4d8502Sjsg
1227fb4d8502Sjsg if (reg_offset != cik_allowed_read_registers[i].reg_offset)
1228fb4d8502Sjsg continue;
1229fb4d8502Sjsg
1230fb4d8502Sjsg *value = cik_get_register_value(adev, indexed, se_num, sh_num,
1231fb4d8502Sjsg reg_offset);
1232fb4d8502Sjsg return 0;
1233fb4d8502Sjsg }
1234fb4d8502Sjsg return -EINVAL;
1235fb4d8502Sjsg }
1236fb4d8502Sjsg
1237fb4d8502Sjsg struct kv_reset_save_regs {
1238fb4d8502Sjsg u32 gmcon_reng_execute;
1239fb4d8502Sjsg u32 gmcon_misc;
1240fb4d8502Sjsg u32 gmcon_misc3;
1241fb4d8502Sjsg };
1242fb4d8502Sjsg
kv_save_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1243fb4d8502Sjsg static void kv_save_regs_for_reset(struct amdgpu_device *adev,
1244fb4d8502Sjsg struct kv_reset_save_regs *save)
1245fb4d8502Sjsg {
1246fb4d8502Sjsg save->gmcon_reng_execute = RREG32(mmGMCON_RENG_EXECUTE);
1247fb4d8502Sjsg save->gmcon_misc = RREG32(mmGMCON_MISC);
1248fb4d8502Sjsg save->gmcon_misc3 = RREG32(mmGMCON_MISC3);
1249fb4d8502Sjsg
1250fb4d8502Sjsg WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute &
1251fb4d8502Sjsg ~GMCON_RENG_EXECUTE__RENG_EXECUTE_ON_PWR_UP_MASK);
1252fb4d8502Sjsg WREG32(mmGMCON_MISC, save->gmcon_misc &
1253fb4d8502Sjsg ~(GMCON_MISC__RENG_EXECUTE_ON_REG_UPDATE_MASK |
1254fb4d8502Sjsg GMCON_MISC__STCTRL_STUTTER_EN_MASK));
1255fb4d8502Sjsg }
1256fb4d8502Sjsg
kv_restore_regs_for_reset(struct amdgpu_device * adev,struct kv_reset_save_regs * save)1257fb4d8502Sjsg static void kv_restore_regs_for_reset(struct amdgpu_device *adev,
1258fb4d8502Sjsg struct kv_reset_save_regs *save)
1259fb4d8502Sjsg {
1260fb4d8502Sjsg int i;
1261fb4d8502Sjsg
1262fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1263fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x200010ff);
1264fb4d8502Sjsg
1265fb4d8502Sjsg for (i = 0; i < 5; i++)
1266fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1267fb4d8502Sjsg
1268fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1269fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x300010ff);
1270fb4d8502Sjsg
1271fb4d8502Sjsg for (i = 0; i < 5; i++)
1272fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1273fb4d8502Sjsg
1274fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x210000);
1275fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0xa00010ff);
1276fb4d8502Sjsg
1277fb4d8502Sjsg for (i = 0; i < 5; i++)
1278fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1279fb4d8502Sjsg
1280fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x21003);
1281fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0xb00010ff);
1282fb4d8502Sjsg
1283fb4d8502Sjsg for (i = 0; i < 5; i++)
1284fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1285fb4d8502Sjsg
1286fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x2b00);
1287fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0xc00010ff);
1288fb4d8502Sjsg
1289fb4d8502Sjsg for (i = 0; i < 5; i++)
1290fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1291fb4d8502Sjsg
1292fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1293fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0xd00010ff);
1294fb4d8502Sjsg
1295fb4d8502Sjsg for (i = 0; i < 5; i++)
1296fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1297fb4d8502Sjsg
1298fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x420000);
1299fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x100010ff);
1300fb4d8502Sjsg
1301fb4d8502Sjsg for (i = 0; i < 5; i++)
1302fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1303fb4d8502Sjsg
1304fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x120202);
1305fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x500010ff);
1306fb4d8502Sjsg
1307fb4d8502Sjsg for (i = 0; i < 5; i++)
1308fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1309fb4d8502Sjsg
1310fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x3e3e36);
1311fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x600010ff);
1312fb4d8502Sjsg
1313fb4d8502Sjsg for (i = 0; i < 5; i++)
1314fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1315fb4d8502Sjsg
1316fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x373f3e);
1317fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0x700010ff);
1318fb4d8502Sjsg
1319fb4d8502Sjsg for (i = 0; i < 5; i++)
1320fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0);
1321fb4d8502Sjsg
1322fb4d8502Sjsg WREG32(mmGMCON_PGFSM_WRITE, 0x3e1332);
1323fb4d8502Sjsg WREG32(mmGMCON_PGFSM_CONFIG, 0xe00010ff);
1324fb4d8502Sjsg
1325fb4d8502Sjsg WREG32(mmGMCON_MISC3, save->gmcon_misc3);
1326fb4d8502Sjsg WREG32(mmGMCON_MISC, save->gmcon_misc);
1327fb4d8502Sjsg WREG32(mmGMCON_RENG_EXECUTE, save->gmcon_reng_execute);
1328fb4d8502Sjsg }
1329fb4d8502Sjsg
13305ca02815Sjsg /**
13315ca02815Sjsg * cik_asic_pci_config_reset - soft reset GPU
13325ca02815Sjsg *
13335ca02815Sjsg * @adev: amdgpu_device pointer
13345ca02815Sjsg *
13355ca02815Sjsg * Use PCI Config method to reset the GPU.
13365ca02815Sjsg *
13375ca02815Sjsg * Returns 0 for success.
13385ca02815Sjsg */
cik_asic_pci_config_reset(struct amdgpu_device * adev)13395ca02815Sjsg static int cik_asic_pci_config_reset(struct amdgpu_device *adev)
1340fb4d8502Sjsg {
1341fb4d8502Sjsg struct kv_reset_save_regs kv_save = { 0 };
1342fb4d8502Sjsg u32 i;
1343fb4d8502Sjsg int r = -EINVAL;
1344fb4d8502Sjsg
13455ca02815Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, true);
1346fb4d8502Sjsg
1347fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1348fb4d8502Sjsg kv_save_regs_for_reset(adev, &kv_save);
1349fb4d8502Sjsg
1350fb4d8502Sjsg /* disable BM */
1351fb4d8502Sjsg pci_clear_master(adev->pdev);
1352fb4d8502Sjsg /* reset */
1353fb4d8502Sjsg amdgpu_device_pci_config_reset(adev);
1354fb4d8502Sjsg
1355fb4d8502Sjsg udelay(100);
1356fb4d8502Sjsg
1357fb4d8502Sjsg /* wait for asic to come out of reset */
1358fb4d8502Sjsg for (i = 0; i < adev->usec_timeout; i++) {
1359fb4d8502Sjsg if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
1360fb4d8502Sjsg /* enable BM */
1361fb4d8502Sjsg pci_set_master(adev->pdev);
1362fb4d8502Sjsg adev->has_hw_reset = true;
1363fb4d8502Sjsg r = 0;
1364fb4d8502Sjsg break;
1365fb4d8502Sjsg }
1366fb4d8502Sjsg udelay(1);
1367fb4d8502Sjsg }
1368fb4d8502Sjsg
1369fb4d8502Sjsg /* does asic init need to be run first??? */
1370fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1371fb4d8502Sjsg kv_restore_regs_for_reset(adev, &kv_save);
1372fb4d8502Sjsg
1373c349dbc7Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, false);
1374c349dbc7Sjsg
1375c349dbc7Sjsg return r;
1376c349dbc7Sjsg }
1377c349dbc7Sjsg
cik_asic_supports_baco(struct amdgpu_device * adev)1378c349dbc7Sjsg static bool cik_asic_supports_baco(struct amdgpu_device *adev)
1379c349dbc7Sjsg {
1380c349dbc7Sjsg switch (adev->asic_type) {
1381c349dbc7Sjsg case CHIP_BONAIRE:
1382c349dbc7Sjsg case CHIP_HAWAII:
1383c349dbc7Sjsg return amdgpu_dpm_is_baco_supported(adev);
1384c349dbc7Sjsg default:
1385c349dbc7Sjsg return false;
1386c349dbc7Sjsg }
1387c349dbc7Sjsg }
1388c349dbc7Sjsg
1389c349dbc7Sjsg static enum amd_reset_method
cik_asic_reset_method(struct amdgpu_device * adev)1390c349dbc7Sjsg cik_asic_reset_method(struct amdgpu_device *adev)
1391c349dbc7Sjsg {
1392c349dbc7Sjsg bool baco_reset;
1393c349dbc7Sjsg
1394ad8b1aafSjsg if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
1395ad8b1aafSjsg amdgpu_reset_method == AMD_RESET_METHOD_BACO)
1396ad8b1aafSjsg return amdgpu_reset_method;
1397ad8b1aafSjsg
1398ad8b1aafSjsg if (amdgpu_reset_method != -1)
1399ad8b1aafSjsg dev_warn(adev->dev, "Specified reset:%d isn't supported, using AUTO instead.\n",
1400ad8b1aafSjsg amdgpu_reset_method);
1401ad8b1aafSjsg
1402c349dbc7Sjsg switch (adev->asic_type) {
1403c349dbc7Sjsg case CHIP_BONAIRE:
1404ad8b1aafSjsg case CHIP_HAWAII:
1405ad8b1aafSjsg baco_reset = cik_asic_supports_baco(adev);
1406ad8b1aafSjsg break;
1407c349dbc7Sjsg default:
1408c349dbc7Sjsg baco_reset = false;
1409c349dbc7Sjsg break;
1410c349dbc7Sjsg }
1411c349dbc7Sjsg
1412c349dbc7Sjsg if (baco_reset)
1413c349dbc7Sjsg return AMD_RESET_METHOD_BACO;
1414c349dbc7Sjsg else
1415c349dbc7Sjsg return AMD_RESET_METHOD_LEGACY;
1416c349dbc7Sjsg }
1417c349dbc7Sjsg
1418c349dbc7Sjsg /**
1419fb4d8502Sjsg * cik_asic_reset - soft reset GPU
1420fb4d8502Sjsg *
1421fb4d8502Sjsg * @adev: amdgpu_device pointer
1422fb4d8502Sjsg *
1423fb4d8502Sjsg * Look up which blocks are hung and attempt
1424fb4d8502Sjsg * to reset them.
1425fb4d8502Sjsg * Returns 0 for success.
1426fb4d8502Sjsg */
cik_asic_reset(struct amdgpu_device * adev)1427fb4d8502Sjsg static int cik_asic_reset(struct amdgpu_device *adev)
1428fb4d8502Sjsg {
1429fb4d8502Sjsg int r;
1430fb4d8502Sjsg
14311b8cb181Sjsg /* APUs don't have full asic reset */
14321b8cb181Sjsg if (adev->flags & AMD_IS_APU)
14331b8cb181Sjsg return 0;
14341b8cb181Sjsg
1435c349dbc7Sjsg if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
1436ad8b1aafSjsg dev_info(adev->dev, "BACO reset\n");
1437c349dbc7Sjsg r = amdgpu_dpm_baco_reset(adev);
1438c349dbc7Sjsg } else {
1439ad8b1aafSjsg dev_info(adev->dev, "PCI CONFIG reset\n");
1440c349dbc7Sjsg r = cik_asic_pci_config_reset(adev);
1441c349dbc7Sjsg }
1442fb4d8502Sjsg
1443fb4d8502Sjsg return r;
1444fb4d8502Sjsg }
1445fb4d8502Sjsg
cik_get_config_memsize(struct amdgpu_device * adev)1446fb4d8502Sjsg static u32 cik_get_config_memsize(struct amdgpu_device *adev)
1447fb4d8502Sjsg {
1448fb4d8502Sjsg return RREG32(mmCONFIG_MEMSIZE);
1449fb4d8502Sjsg }
1450fb4d8502Sjsg
cik_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)1451fb4d8502Sjsg static int cik_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
1452fb4d8502Sjsg u32 cntl_reg, u32 status_reg)
1453fb4d8502Sjsg {
1454fb4d8502Sjsg int r, i;
1455fb4d8502Sjsg struct atom_clock_dividers dividers;
1456fb4d8502Sjsg uint32_t tmp;
1457fb4d8502Sjsg
1458fb4d8502Sjsg r = amdgpu_atombios_get_clock_dividers(adev,
1459fb4d8502Sjsg COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1460fb4d8502Sjsg clock, false, ÷rs);
1461fb4d8502Sjsg if (r)
1462fb4d8502Sjsg return r;
1463fb4d8502Sjsg
1464fb4d8502Sjsg tmp = RREG32_SMC(cntl_reg);
1465fb4d8502Sjsg tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1466fb4d8502Sjsg CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1467fb4d8502Sjsg tmp |= dividers.post_divider;
1468fb4d8502Sjsg WREG32_SMC(cntl_reg, tmp);
1469fb4d8502Sjsg
1470fb4d8502Sjsg for (i = 0; i < 100; i++) {
1471fb4d8502Sjsg if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1472fb4d8502Sjsg break;
1473fb4d8502Sjsg mdelay(10);
1474fb4d8502Sjsg }
1475fb4d8502Sjsg if (i == 100)
1476fb4d8502Sjsg return -ETIMEDOUT;
1477fb4d8502Sjsg
1478fb4d8502Sjsg return 0;
1479fb4d8502Sjsg }
1480fb4d8502Sjsg
cik_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1481fb4d8502Sjsg static int cik_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1482fb4d8502Sjsg {
1483fb4d8502Sjsg int r = 0;
1484fb4d8502Sjsg
1485fb4d8502Sjsg r = cik_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1486fb4d8502Sjsg if (r)
1487fb4d8502Sjsg return r;
1488fb4d8502Sjsg
1489fb4d8502Sjsg r = cik_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1490fb4d8502Sjsg return r;
1491fb4d8502Sjsg }
1492fb4d8502Sjsg
cik_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1493fb4d8502Sjsg static int cik_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1494fb4d8502Sjsg {
1495fb4d8502Sjsg int r, i;
1496fb4d8502Sjsg struct atom_clock_dividers dividers;
1497fb4d8502Sjsg u32 tmp;
1498fb4d8502Sjsg
1499fb4d8502Sjsg r = amdgpu_atombios_get_clock_dividers(adev,
1500fb4d8502Sjsg COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1501fb4d8502Sjsg ecclk, false, ÷rs);
1502fb4d8502Sjsg if (r)
1503fb4d8502Sjsg return r;
1504fb4d8502Sjsg
1505fb4d8502Sjsg for (i = 0; i < 100; i++) {
1506fb4d8502Sjsg if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1507fb4d8502Sjsg break;
1508fb4d8502Sjsg mdelay(10);
1509fb4d8502Sjsg }
1510fb4d8502Sjsg if (i == 100)
1511fb4d8502Sjsg return -ETIMEDOUT;
1512fb4d8502Sjsg
1513fb4d8502Sjsg tmp = RREG32_SMC(ixCG_ECLK_CNTL);
1514fb4d8502Sjsg tmp &= ~(CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK |
1515fb4d8502Sjsg CG_ECLK_CNTL__ECLK_DIVIDER_MASK);
1516fb4d8502Sjsg tmp |= dividers.post_divider;
1517fb4d8502Sjsg WREG32_SMC(ixCG_ECLK_CNTL, tmp);
1518fb4d8502Sjsg
1519fb4d8502Sjsg for (i = 0; i < 100; i++) {
1520fb4d8502Sjsg if (RREG32_SMC(ixCG_ECLK_STATUS) & CG_ECLK_STATUS__ECLK_STATUS_MASK)
1521fb4d8502Sjsg break;
1522fb4d8502Sjsg mdelay(10);
1523fb4d8502Sjsg }
1524fb4d8502Sjsg if (i == 100)
1525fb4d8502Sjsg return -ETIMEDOUT;
1526fb4d8502Sjsg
1527fb4d8502Sjsg return 0;
1528fb4d8502Sjsg }
1529fb4d8502Sjsg
cik_pcie_gen3_enable(struct amdgpu_device * adev)1530fb4d8502Sjsg static void cik_pcie_gen3_enable(struct amdgpu_device *adev)
1531fb4d8502Sjsg {
1532fb4d8502Sjsg struct pci_dev *root = adev->pdev->bus->self;
1533fb4d8502Sjsg u32 speed_cntl, current_data_rate;
1534fb4d8502Sjsg int i;
1535fb4d8502Sjsg u16 tmp16;
1536fb4d8502Sjsg
1537fb4d8502Sjsg if (pci_is_root_bus(adev->pdev->bus))
1538fb4d8502Sjsg return;
1539fb4d8502Sjsg
1540fb4d8502Sjsg if (amdgpu_pcie_gen2 == 0)
1541fb4d8502Sjsg return;
1542fb4d8502Sjsg
1543fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1544fb4d8502Sjsg return;
1545fb4d8502Sjsg
1546fb4d8502Sjsg if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
1547fb4d8502Sjsg CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
1548fb4d8502Sjsg return;
1549fb4d8502Sjsg
1550fb4d8502Sjsg speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1551fb4d8502Sjsg current_data_rate = (speed_cntl & PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK) >>
1552fb4d8502Sjsg PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT;
1553fb4d8502Sjsg if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1554fb4d8502Sjsg if (current_data_rate == 2) {
1555fb4d8502Sjsg DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1556fb4d8502Sjsg return;
1557fb4d8502Sjsg }
1558fb4d8502Sjsg DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1559fb4d8502Sjsg } else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
1560fb4d8502Sjsg if (current_data_rate == 1) {
1561fb4d8502Sjsg DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1562fb4d8502Sjsg return;
1563fb4d8502Sjsg }
1564fb4d8502Sjsg DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1565fb4d8502Sjsg }
1566fb4d8502Sjsg
1567c349dbc7Sjsg if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
1568fb4d8502Sjsg return;
1569fb4d8502Sjsg
1570fb4d8502Sjsg if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
1571fb4d8502Sjsg /* re-try equalization if gen3 is not already enabled */
1572fb4d8502Sjsg if (current_data_rate != 2) {
1573fb4d8502Sjsg u16 bridge_cfg, gpu_cfg;
1574fb4d8502Sjsg u16 bridge_cfg2, gpu_cfg2;
1575fb4d8502Sjsg u32 max_lw, current_lw, tmp;
1576fb4d8502Sjsg
1577a311475eSjsg pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1578a311475eSjsg pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
1579fb4d8502Sjsg
1580fb4d8502Sjsg tmp = RREG32_PCIE(ixPCIE_LC_STATUS1);
1581fb4d8502Sjsg max_lw = (tmp & PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH_MASK) >>
1582fb4d8502Sjsg PCIE_LC_STATUS1__LC_DETECTED_LINK_WIDTH__SHIFT;
1583fb4d8502Sjsg current_lw = (tmp & PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH_MASK)
1584fb4d8502Sjsg >> PCIE_LC_STATUS1__LC_OPERATING_LINK_WIDTH__SHIFT;
1585fb4d8502Sjsg
1586fb4d8502Sjsg if (current_lw < max_lw) {
1587fb4d8502Sjsg tmp = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1588fb4d8502Sjsg if (tmp & PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATION_SUPPORT_MASK) {
1589fb4d8502Sjsg tmp &= ~(PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_MASK |
1590fb4d8502Sjsg PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_DIS_MASK);
1591fb4d8502Sjsg tmp |= (max_lw <<
1592fb4d8502Sjsg PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH__SHIFT);
1593fb4d8502Sjsg tmp |= PCIE_LC_LINK_WIDTH_CNTL__LC_UPCONFIGURE_SUPPORT_MASK |
1594fb4d8502Sjsg PCIE_LC_LINK_WIDTH_CNTL__LC_RENEGOTIATE_EN_MASK |
1595fb4d8502Sjsg PCIE_LC_LINK_WIDTH_CNTL__LC_RECONFIG_NOW_MASK;
1596fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, tmp);
1597fb4d8502Sjsg }
1598fb4d8502Sjsg }
1599fb4d8502Sjsg
1600fb4d8502Sjsg for (i = 0; i < 10; i++) {
1601fb4d8502Sjsg /* check status */
1602c349dbc7Sjsg pcie_capability_read_word(adev->pdev,
1603c349dbc7Sjsg PCI_EXP_DEVSTA,
1604c349dbc7Sjsg &tmp16);
1605fb4d8502Sjsg if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1606fb4d8502Sjsg break;
1607fb4d8502Sjsg
1608c349dbc7Sjsg pcie_capability_read_word(root, PCI_EXP_LNKCTL,
1609c349dbc7Sjsg &bridge_cfg);
1610c349dbc7Sjsg pcie_capability_read_word(adev->pdev,
1611c349dbc7Sjsg PCI_EXP_LNKCTL,
1612c349dbc7Sjsg &gpu_cfg);
1613fb4d8502Sjsg
1614c349dbc7Sjsg pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1615c349dbc7Sjsg &bridge_cfg2);
1616c349dbc7Sjsg pcie_capability_read_word(adev->pdev,
1617c349dbc7Sjsg PCI_EXP_LNKCTL2,
1618c349dbc7Sjsg &gpu_cfg2);
1619fb4d8502Sjsg
1620fb4d8502Sjsg tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1621fb4d8502Sjsg tmp |= PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1622fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1623fb4d8502Sjsg
1624fb4d8502Sjsg tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1625fb4d8502Sjsg tmp |= PCIE_LC_CNTL4__LC_REDO_EQ_MASK;
1626fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1627fb4d8502Sjsg
1628fb4d8502Sjsg drm_msleep(100);
1629fb4d8502Sjsg
1630fb4d8502Sjsg /* linkctl */
1631a311475eSjsg pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
1632a311475eSjsg PCI_EXP_LNKCTL_HAWD,
1633a311475eSjsg bridge_cfg &
1634a311475eSjsg PCI_EXP_LNKCTL_HAWD);
1635a311475eSjsg pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
1636a311475eSjsg PCI_EXP_LNKCTL_HAWD,
1637a311475eSjsg gpu_cfg &
1638a311475eSjsg PCI_EXP_LNKCTL_HAWD);
1639fb4d8502Sjsg
1640fb4d8502Sjsg /* linkctl2 */
1641c349dbc7Sjsg pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
1642c349dbc7Sjsg &tmp16);
1643c349dbc7Sjsg tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1644c349dbc7Sjsg PCI_EXP_LNKCTL2_TX_MARGIN);
1645c349dbc7Sjsg tmp16 |= (bridge_cfg2 &
1646c349dbc7Sjsg (PCI_EXP_LNKCTL2_ENTER_COMP |
1647c349dbc7Sjsg PCI_EXP_LNKCTL2_TX_MARGIN));
1648c349dbc7Sjsg pcie_capability_write_word(root,
1649c349dbc7Sjsg PCI_EXP_LNKCTL2,
1650c349dbc7Sjsg tmp16);
1651fb4d8502Sjsg
1652c349dbc7Sjsg pcie_capability_read_word(adev->pdev,
1653c349dbc7Sjsg PCI_EXP_LNKCTL2,
1654c349dbc7Sjsg &tmp16);
1655c349dbc7Sjsg tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
1656c349dbc7Sjsg PCI_EXP_LNKCTL2_TX_MARGIN);
1657c349dbc7Sjsg tmp16 |= (gpu_cfg2 &
1658c349dbc7Sjsg (PCI_EXP_LNKCTL2_ENTER_COMP |
1659c349dbc7Sjsg PCI_EXP_LNKCTL2_TX_MARGIN));
1660c349dbc7Sjsg pcie_capability_write_word(adev->pdev,
1661c349dbc7Sjsg PCI_EXP_LNKCTL2,
1662c349dbc7Sjsg tmp16);
1663fb4d8502Sjsg
1664fb4d8502Sjsg tmp = RREG32_PCIE(ixPCIE_LC_CNTL4);
1665fb4d8502Sjsg tmp &= ~PCIE_LC_CNTL4__LC_SET_QUIESCE_MASK;
1666fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL4, tmp);
1667fb4d8502Sjsg }
1668fb4d8502Sjsg }
1669fb4d8502Sjsg }
1670fb4d8502Sjsg
1671fb4d8502Sjsg /* set the link speed */
1672fb4d8502Sjsg speed_cntl |= PCIE_LC_SPEED_CNTL__LC_FORCE_EN_SW_SPEED_CHANGE_MASK |
1673fb4d8502Sjsg PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_HW_SPEED_CHANGE_MASK;
1674fb4d8502Sjsg speed_cntl &= ~PCIE_LC_SPEED_CNTL__LC_FORCE_DIS_SW_SPEED_CHANGE_MASK;
1675fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1676fb4d8502Sjsg
1677c349dbc7Sjsg pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
1678c349dbc7Sjsg tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
1679c349dbc7Sjsg
1680fb4d8502Sjsg if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
1681c349dbc7Sjsg tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
1682fb4d8502Sjsg else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
1683c349dbc7Sjsg tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
1684fb4d8502Sjsg else
1685c349dbc7Sjsg tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
1686c349dbc7Sjsg pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
1687fb4d8502Sjsg
1688fb4d8502Sjsg speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1689fb4d8502Sjsg speed_cntl |= PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK;
1690fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_SPEED_CNTL, speed_cntl);
1691fb4d8502Sjsg
1692fb4d8502Sjsg for (i = 0; i < adev->usec_timeout; i++) {
1693fb4d8502Sjsg speed_cntl = RREG32_PCIE(ixPCIE_LC_SPEED_CNTL);
1694fb4d8502Sjsg if ((speed_cntl & PCIE_LC_SPEED_CNTL__LC_INITIATE_LINK_SPEED_CHANGE_MASK) == 0)
1695fb4d8502Sjsg break;
1696fb4d8502Sjsg udelay(1);
1697fb4d8502Sjsg }
1698fb4d8502Sjsg }
1699fb4d8502Sjsg
cik_program_aspm(struct amdgpu_device * adev)1700fb4d8502Sjsg static void cik_program_aspm(struct amdgpu_device *adev)
1701fb4d8502Sjsg {
1702fb4d8502Sjsg u32 data, orig;
1703fb4d8502Sjsg bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1704fb4d8502Sjsg bool disable_clkreq = false;
1705fb4d8502Sjsg
1706a9d9cd9cSjsg if (!amdgpu_device_should_use_aspm(adev))
1707fb4d8502Sjsg return;
1708fb4d8502Sjsg
1709fb4d8502Sjsg if (pci_is_root_bus(adev->pdev->bus))
1710fb4d8502Sjsg return;
1711fb4d8502Sjsg
1712fb4d8502Sjsg /* XXX double check APUs */
1713fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1714fb4d8502Sjsg return;
1715fb4d8502Sjsg
1716fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1717fb4d8502Sjsg data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
1718fb4d8502Sjsg data |= (0x24 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT) |
1719fb4d8502Sjsg PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
1720fb4d8502Sjsg if (orig != data)
1721fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
1722fb4d8502Sjsg
1723fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
1724fb4d8502Sjsg data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
1725fb4d8502Sjsg if (orig != data)
1726fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL3, data);
1727fb4d8502Sjsg
1728fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
1729fb4d8502Sjsg data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
1730fb4d8502Sjsg if (orig != data)
1731fb4d8502Sjsg WREG32_PCIE(ixPCIE_P_CNTL, data);
1732fb4d8502Sjsg
1733fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1734fb4d8502Sjsg data &= ~(PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK |
1735fb4d8502Sjsg PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK);
1736fb4d8502Sjsg data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1737fb4d8502Sjsg if (!disable_l0s)
1738fb4d8502Sjsg data |= (7 << PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT);
1739fb4d8502Sjsg
1740fb4d8502Sjsg if (!disable_l1) {
1741fb4d8502Sjsg data |= (7 << PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT);
1742fb4d8502Sjsg data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
1743fb4d8502Sjsg if (orig != data)
1744fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
1745fb4d8502Sjsg
1746fb4d8502Sjsg if (!disable_plloff_in_l1) {
1747fb4d8502Sjsg bool clk_req_support;
1748fb4d8502Sjsg
1749fb4d8502Sjsg orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_0);
1750fb4d8502Sjsg data &= ~(PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1751fb4d8502Sjsg PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1752fb4d8502Sjsg data |= (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1753fb4d8502Sjsg (7 << PB0_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1754fb4d8502Sjsg if (orig != data)
1755fb4d8502Sjsg WREG32_PCIE(ixPB0_PIF_PWRDOWN_0, data);
1756fb4d8502Sjsg
1757fb4d8502Sjsg orig = data = RREG32_PCIE(ixPB0_PIF_PWRDOWN_1);
1758fb4d8502Sjsg data &= ~(PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1759fb4d8502Sjsg PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1760fb4d8502Sjsg data |= (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1761fb4d8502Sjsg (7 << PB0_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1762fb4d8502Sjsg if (orig != data)
1763fb4d8502Sjsg WREG32_PCIE(ixPB0_PIF_PWRDOWN_1, data);
1764fb4d8502Sjsg
1765fb4d8502Sjsg orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_0);
1766fb4d8502Sjsg data &= ~(PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0_MASK |
1767fb4d8502Sjsg PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0_MASK);
1768fb4d8502Sjsg data |= (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_OFF_0__SHIFT) |
1769fb4d8502Sjsg (7 << PB1_PIF_PWRDOWN_0__PLL_POWER_STATE_IN_TXS2_0__SHIFT);
1770fb4d8502Sjsg if (orig != data)
1771fb4d8502Sjsg WREG32_PCIE(ixPB1_PIF_PWRDOWN_0, data);
1772fb4d8502Sjsg
1773fb4d8502Sjsg orig = data = RREG32_PCIE(ixPB1_PIF_PWRDOWN_1);
1774fb4d8502Sjsg data &= ~(PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1_MASK |
1775fb4d8502Sjsg PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1_MASK);
1776fb4d8502Sjsg data |= (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_OFF_1__SHIFT) |
1777fb4d8502Sjsg (7 << PB1_PIF_PWRDOWN_1__PLL_POWER_STATE_IN_TXS2_1__SHIFT);
1778fb4d8502Sjsg if (orig != data)
1779fb4d8502Sjsg WREG32_PCIE(ixPB1_PIF_PWRDOWN_1, data);
1780fb4d8502Sjsg
1781fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
1782fb4d8502Sjsg data &= ~PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
1783fb4d8502Sjsg data |= ~(3 << PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE__SHIFT);
1784fb4d8502Sjsg if (orig != data)
1785fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
1786fb4d8502Sjsg
1787fb4d8502Sjsg if (!disable_clkreq) {
1788fb4d8502Sjsg struct pci_dev *root = adev->pdev->bus->self;
1789fb4d8502Sjsg u32 lnkcap;
1790fb4d8502Sjsg
1791fb4d8502Sjsg clk_req_support = false;
1792fb4d8502Sjsg pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1793fb4d8502Sjsg if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1794fb4d8502Sjsg clk_req_support = true;
1795fb4d8502Sjsg } else {
1796fb4d8502Sjsg clk_req_support = false;
1797fb4d8502Sjsg }
1798fb4d8502Sjsg
1799fb4d8502Sjsg if (clk_req_support) {
1800fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
1801fb4d8502Sjsg data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK |
1802fb4d8502Sjsg PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
1803fb4d8502Sjsg if (orig != data)
1804fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL2, data);
1805fb4d8502Sjsg
1806fb4d8502Sjsg orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
1807fb4d8502Sjsg data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK |
1808fb4d8502Sjsg THM_CLK_CNTL__TMON_CLK_SEL_MASK);
1809fb4d8502Sjsg data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
1810fb4d8502Sjsg (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
1811fb4d8502Sjsg if (orig != data)
1812fb4d8502Sjsg WREG32_SMC(ixTHM_CLK_CNTL, data);
1813fb4d8502Sjsg
1814fb4d8502Sjsg orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
1815fb4d8502Sjsg data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
1816fb4d8502Sjsg MISC_CLK_CTRL__ZCLK_SEL_MASK);
1817fb4d8502Sjsg data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
1818fb4d8502Sjsg (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
1819fb4d8502Sjsg if (orig != data)
1820fb4d8502Sjsg WREG32_SMC(ixMISC_CLK_CTRL, data);
1821fb4d8502Sjsg
1822fb4d8502Sjsg orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
1823fb4d8502Sjsg data &= ~CG_CLKPIN_CNTL__BCLK_AS_XCLK_MASK;
1824fb4d8502Sjsg if (orig != data)
1825fb4d8502Sjsg WREG32_SMC(ixCG_CLKPIN_CNTL, data);
1826fb4d8502Sjsg
1827fb4d8502Sjsg orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
1828fb4d8502Sjsg data &= ~CG_CLKPIN_CNTL_2__FORCE_BIF_REFCLK_EN_MASK;
1829fb4d8502Sjsg if (orig != data)
1830fb4d8502Sjsg WREG32_SMC(ixCG_CLKPIN_CNTL_2, data);
1831fb4d8502Sjsg
1832fb4d8502Sjsg orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
1833fb4d8502Sjsg data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
1834fb4d8502Sjsg data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
1835fb4d8502Sjsg if (orig != data)
1836fb4d8502Sjsg WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
1837fb4d8502Sjsg }
1838fb4d8502Sjsg }
1839fb4d8502Sjsg } else {
1840fb4d8502Sjsg if (orig != data)
1841fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
1842fb4d8502Sjsg }
1843fb4d8502Sjsg
1844fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_CNTL2);
1845fb4d8502Sjsg data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1846fb4d8502Sjsg PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1847fb4d8502Sjsg PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1848fb4d8502Sjsg if (orig != data)
1849fb4d8502Sjsg WREG32_PCIE(ixPCIE_CNTL2, data);
1850fb4d8502Sjsg
1851fb4d8502Sjsg if (!disable_l0s) {
1852fb4d8502Sjsg data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
1853fb4d8502Sjsg if ((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) ==
1854fb4d8502Sjsg PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) {
1855fb4d8502Sjsg data = RREG32_PCIE(ixPCIE_LC_STATUS1);
1856fb4d8502Sjsg if ((data & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK) &&
1857fb4d8502Sjsg (data & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK)) {
1858fb4d8502Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
1859fb4d8502Sjsg data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
1860fb4d8502Sjsg if (orig != data)
1861fb4d8502Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
1862fb4d8502Sjsg }
1863fb4d8502Sjsg }
1864fb4d8502Sjsg }
1865fb4d8502Sjsg }
1866fb4d8502Sjsg
cik_get_rev_id(struct amdgpu_device * adev)1867fb4d8502Sjsg static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1868fb4d8502Sjsg {
1869fb4d8502Sjsg return (RREG32(mmCC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1870fb4d8502Sjsg >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1871fb4d8502Sjsg }
1872fb4d8502Sjsg
cik_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1873fb4d8502Sjsg static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1874fb4d8502Sjsg {
1875fb4d8502Sjsg if (!ring || !ring->funcs->emit_wreg) {
1876fb4d8502Sjsg WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1877fb4d8502Sjsg RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1878fb4d8502Sjsg } else {
1879fb4d8502Sjsg amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1880fb4d8502Sjsg }
1881fb4d8502Sjsg }
1882fb4d8502Sjsg
cik_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1883fb4d8502Sjsg static void cik_invalidate_hdp(struct amdgpu_device *adev,
1884fb4d8502Sjsg struct amdgpu_ring *ring)
1885fb4d8502Sjsg {
1886fb4d8502Sjsg if (!ring || !ring->funcs->emit_wreg) {
1887fb4d8502Sjsg WREG32(mmHDP_DEBUG0, 1);
1888fb4d8502Sjsg RREG32(mmHDP_DEBUG0);
1889fb4d8502Sjsg } else {
1890fb4d8502Sjsg amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1891fb4d8502Sjsg }
1892fb4d8502Sjsg }
1893fb4d8502Sjsg
cik_need_full_reset(struct amdgpu_device * adev)1894fb4d8502Sjsg static bool cik_need_full_reset(struct amdgpu_device *adev)
1895fb4d8502Sjsg {
1896fb4d8502Sjsg /* change this when we support soft reset */
1897fb4d8502Sjsg return true;
1898fb4d8502Sjsg }
1899fb4d8502Sjsg
cik_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1900c349dbc7Sjsg static void cik_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1901c349dbc7Sjsg uint64_t *count1)
1902c349dbc7Sjsg {
1903c349dbc7Sjsg uint32_t perfctr = 0;
1904c349dbc7Sjsg uint64_t cnt0_of, cnt1_of;
1905c349dbc7Sjsg int tmp;
1906c349dbc7Sjsg
1907c349dbc7Sjsg /* This reports 0 on APUs, so return to avoid writing/reading registers
1908c349dbc7Sjsg * that may or may not be different from their GPU counterparts
1909c349dbc7Sjsg */
1910c349dbc7Sjsg if (adev->flags & AMD_IS_APU)
1911c349dbc7Sjsg return;
1912c349dbc7Sjsg
1913c349dbc7Sjsg /* Set the 2 events that we wish to watch, defined above */
1914c349dbc7Sjsg /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1915c349dbc7Sjsg perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1916c349dbc7Sjsg perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1917c349dbc7Sjsg
1918c349dbc7Sjsg /* Write to enable desired perf counters */
1919c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1920c349dbc7Sjsg /* Zero out and enable the perf counters
1921c349dbc7Sjsg * Write 0x5:
1922c349dbc7Sjsg * Bit 0 = Start all counters(1)
1923c349dbc7Sjsg * Bit 2 = Global counter reset enable(1)
1924c349dbc7Sjsg */
1925c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1926c349dbc7Sjsg
1927c349dbc7Sjsg drm_msleep(1000);
1928c349dbc7Sjsg
1929c349dbc7Sjsg /* Load the shadow and disable the perf counters
1930c349dbc7Sjsg * Write 0x2:
1931c349dbc7Sjsg * Bit 0 = Stop counters(0)
1932c349dbc7Sjsg * Bit 1 = Load the shadow counters(1)
1933c349dbc7Sjsg */
1934c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1935c349dbc7Sjsg
1936c349dbc7Sjsg /* Read register values to get any >32bit overflow */
1937c349dbc7Sjsg tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1938c349dbc7Sjsg cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1939c349dbc7Sjsg cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1940c349dbc7Sjsg
1941c349dbc7Sjsg /* Get the values and add the overflow */
1942c349dbc7Sjsg *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1943c349dbc7Sjsg *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1944c349dbc7Sjsg }
1945c349dbc7Sjsg
cik_need_reset_on_init(struct amdgpu_device * adev)1946c349dbc7Sjsg static bool cik_need_reset_on_init(struct amdgpu_device *adev)
1947c349dbc7Sjsg {
1948c349dbc7Sjsg u32 clock_cntl, pc;
1949c349dbc7Sjsg
1950c349dbc7Sjsg if (adev->flags & AMD_IS_APU)
1951c349dbc7Sjsg return false;
1952c349dbc7Sjsg
1953c349dbc7Sjsg /* check if the SMC is already running */
1954c349dbc7Sjsg clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
1955c349dbc7Sjsg pc = RREG32_SMC(ixSMC_PC_C);
1956c349dbc7Sjsg if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
1957c349dbc7Sjsg (0x20100 <= pc))
1958c349dbc7Sjsg return true;
1959c349dbc7Sjsg
1960c349dbc7Sjsg return false;
1961c349dbc7Sjsg }
1962c349dbc7Sjsg
cik_get_pcie_replay_count(struct amdgpu_device * adev)1963c349dbc7Sjsg static uint64_t cik_get_pcie_replay_count(struct amdgpu_device *adev)
1964c349dbc7Sjsg {
1965c349dbc7Sjsg uint64_t nak_r, nak_g;
1966c349dbc7Sjsg
1967c349dbc7Sjsg /* Get the number of NAKs received and generated */
1968c349dbc7Sjsg nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1969c349dbc7Sjsg nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1970c349dbc7Sjsg
1971c349dbc7Sjsg /* Add the total number of NAKs, i.e the number of replays */
1972c349dbc7Sjsg return (nak_r + nak_g);
1973c349dbc7Sjsg }
1974c349dbc7Sjsg
cik_pre_asic_init(struct amdgpu_device * adev)1975ad8b1aafSjsg static void cik_pre_asic_init(struct amdgpu_device *adev)
1976ad8b1aafSjsg {
1977ad8b1aafSjsg }
1978ad8b1aafSjsg
1979fb4d8502Sjsg static const struct amdgpu_asic_funcs cik_asic_funcs =
1980fb4d8502Sjsg {
1981fb4d8502Sjsg .read_disabled_bios = &cik_read_disabled_bios,
1982fb4d8502Sjsg .read_bios_from_rom = &cik_read_bios_from_rom,
1983fb4d8502Sjsg .read_register = &cik_read_register,
1984fb4d8502Sjsg .reset = &cik_asic_reset,
1985c349dbc7Sjsg .reset_method = &cik_asic_reset_method,
1986fb4d8502Sjsg .set_vga_state = &cik_vga_set_state,
1987fb4d8502Sjsg .get_xclk = &cik_get_xclk,
1988fb4d8502Sjsg .set_uvd_clocks = &cik_set_uvd_clocks,
1989fb4d8502Sjsg .set_vce_clocks = &cik_set_vce_clocks,
1990fb4d8502Sjsg .get_config_memsize = &cik_get_config_memsize,
1991fb4d8502Sjsg .flush_hdp = &cik_flush_hdp,
1992fb4d8502Sjsg .invalidate_hdp = &cik_invalidate_hdp,
1993fb4d8502Sjsg .need_full_reset = &cik_need_full_reset,
1994c349dbc7Sjsg .init_doorbell_index = &legacy_doorbell_index_init,
1995c349dbc7Sjsg .get_pcie_usage = &cik_get_pcie_usage,
1996c349dbc7Sjsg .need_reset_on_init = &cik_need_reset_on_init,
1997c349dbc7Sjsg .get_pcie_replay_count = &cik_get_pcie_replay_count,
1998c349dbc7Sjsg .supports_baco = &cik_asic_supports_baco,
1999ad8b1aafSjsg .pre_asic_init = &cik_pre_asic_init,
20005ca02815Sjsg .query_video_codecs = &cik_query_video_codecs,
2001fb4d8502Sjsg };
2002fb4d8502Sjsg
cik_common_early_init(void * handle)2003fb4d8502Sjsg static int cik_common_early_init(void *handle)
2004fb4d8502Sjsg {
2005fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2006fb4d8502Sjsg
2007fb4d8502Sjsg adev->smc_rreg = &cik_smc_rreg;
2008fb4d8502Sjsg adev->smc_wreg = &cik_smc_wreg;
2009fb4d8502Sjsg adev->pcie_rreg = &cik_pcie_rreg;
2010fb4d8502Sjsg adev->pcie_wreg = &cik_pcie_wreg;
2011fb4d8502Sjsg adev->uvd_ctx_rreg = &cik_uvd_ctx_rreg;
2012fb4d8502Sjsg adev->uvd_ctx_wreg = &cik_uvd_ctx_wreg;
2013fb4d8502Sjsg adev->didt_rreg = &cik_didt_rreg;
2014fb4d8502Sjsg adev->didt_wreg = &cik_didt_wreg;
2015fb4d8502Sjsg
2016fb4d8502Sjsg adev->asic_funcs = &cik_asic_funcs;
2017fb4d8502Sjsg
2018fb4d8502Sjsg adev->rev_id = cik_get_rev_id(adev);
2019fb4d8502Sjsg adev->external_rev_id = 0xFF;
2020fb4d8502Sjsg switch (adev->asic_type) {
2021fb4d8502Sjsg case CHIP_BONAIRE:
2022fb4d8502Sjsg adev->cg_flags =
2023fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
2024fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
2025fb4d8502Sjsg /*AMD_CG_SUPPORT_GFX_CGCG |*/
2026fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
2027fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
2028fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
2029fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
2030fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
2031fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
2032fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
2033fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
2034fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
2035fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG |
2036fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
2037fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
2038fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG;
2039fb4d8502Sjsg adev->pg_flags = 0;
2040fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x14;
2041fb4d8502Sjsg break;
2042fb4d8502Sjsg case CHIP_HAWAII:
2043fb4d8502Sjsg adev->cg_flags =
2044fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
2045fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
2046fb4d8502Sjsg /*AMD_CG_SUPPORT_GFX_CGCG |*/
2047fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
2048fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
2049fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
2050fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
2051fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
2052fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
2053fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
2054fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
2055fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG |
2056fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
2057fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
2058fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG;
2059fb4d8502Sjsg adev->pg_flags = 0;
2060fb4d8502Sjsg adev->external_rev_id = 0x28;
2061fb4d8502Sjsg break;
2062fb4d8502Sjsg case CHIP_KAVERI:
2063fb4d8502Sjsg adev->cg_flags =
2064fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
2065fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
2066fb4d8502Sjsg /*AMD_CG_SUPPORT_GFX_CGCG |*/
2067fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
2068fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
2069fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
2070fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
2071fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
2072fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
2073fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
2074fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG |
2075fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
2076fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
2077fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG;
2078fb4d8502Sjsg adev->pg_flags =
2079fb4d8502Sjsg /*AMD_PG_SUPPORT_GFX_PG |
2080fb4d8502Sjsg AMD_PG_SUPPORT_GFX_SMG |
2081fb4d8502Sjsg AMD_PG_SUPPORT_GFX_DMG |*/
2082fb4d8502Sjsg AMD_PG_SUPPORT_UVD |
2083fb4d8502Sjsg AMD_PG_SUPPORT_VCE |
2084fb4d8502Sjsg /* AMD_PG_SUPPORT_CP |
2085fb4d8502Sjsg AMD_PG_SUPPORT_GDS |
2086fb4d8502Sjsg AMD_PG_SUPPORT_RLC_SMU_HS |
2087fb4d8502Sjsg AMD_PG_SUPPORT_ACP |
2088fb4d8502Sjsg AMD_PG_SUPPORT_SAMU |*/
2089fb4d8502Sjsg 0;
2090fb4d8502Sjsg if (adev->pdev->device == 0x1312 ||
2091fb4d8502Sjsg adev->pdev->device == 0x1316 ||
2092fb4d8502Sjsg adev->pdev->device == 0x1317)
2093fb4d8502Sjsg adev->external_rev_id = 0x41;
2094fb4d8502Sjsg else
2095fb4d8502Sjsg adev->external_rev_id = 0x1;
2096fb4d8502Sjsg break;
2097fb4d8502Sjsg case CHIP_KABINI:
2098fb4d8502Sjsg case CHIP_MULLINS:
2099fb4d8502Sjsg adev->cg_flags =
2100fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
2101fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
2102fb4d8502Sjsg /*AMD_CG_SUPPORT_GFX_CGCG |*/
2103fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
2104fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
2105fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
2106fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
2107fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
2108fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
2109fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
2110fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG |
2111fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
2112fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
2113fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG;
2114fb4d8502Sjsg adev->pg_flags =
2115fb4d8502Sjsg /*AMD_PG_SUPPORT_GFX_PG |
2116fb4d8502Sjsg AMD_PG_SUPPORT_GFX_SMG | */
2117fb4d8502Sjsg AMD_PG_SUPPORT_UVD |
2118fb4d8502Sjsg /*AMD_PG_SUPPORT_VCE |
2119fb4d8502Sjsg AMD_PG_SUPPORT_CP |
2120fb4d8502Sjsg AMD_PG_SUPPORT_GDS |
2121fb4d8502Sjsg AMD_PG_SUPPORT_RLC_SMU_HS |
2122fb4d8502Sjsg AMD_PG_SUPPORT_SAMU |*/
2123fb4d8502Sjsg 0;
2124fb4d8502Sjsg if (adev->asic_type == CHIP_KABINI) {
2125fb4d8502Sjsg if (adev->rev_id == 0)
2126fb4d8502Sjsg adev->external_rev_id = 0x81;
2127fb4d8502Sjsg else if (adev->rev_id == 1)
2128fb4d8502Sjsg adev->external_rev_id = 0x82;
2129fb4d8502Sjsg else if (adev->rev_id == 2)
2130fb4d8502Sjsg adev->external_rev_id = 0x85;
2131fb4d8502Sjsg } else
2132fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0xa1;
2133fb4d8502Sjsg break;
2134fb4d8502Sjsg default:
2135fb4d8502Sjsg /* FIXME: not supported yet */
2136fb4d8502Sjsg return -EINVAL;
2137fb4d8502Sjsg }
2138fb4d8502Sjsg
2139fb4d8502Sjsg return 0;
2140fb4d8502Sjsg }
2141fb4d8502Sjsg
cik_common_sw_init(void * handle)2142fb4d8502Sjsg static int cik_common_sw_init(void *handle)
2143fb4d8502Sjsg {
2144fb4d8502Sjsg return 0;
2145fb4d8502Sjsg }
2146fb4d8502Sjsg
cik_common_sw_fini(void * handle)2147fb4d8502Sjsg static int cik_common_sw_fini(void *handle)
2148fb4d8502Sjsg {
2149fb4d8502Sjsg return 0;
2150fb4d8502Sjsg }
2151fb4d8502Sjsg
cik_common_hw_init(void * handle)2152fb4d8502Sjsg static int cik_common_hw_init(void *handle)
2153fb4d8502Sjsg {
2154fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2155fb4d8502Sjsg
2156fb4d8502Sjsg /* move the golden regs per IP block */
2157fb4d8502Sjsg cik_init_golden_registers(adev);
2158fb4d8502Sjsg /* enable pcie gen2/3 link */
2159fb4d8502Sjsg cik_pcie_gen3_enable(adev);
2160fb4d8502Sjsg /* enable aspm */
2161fb4d8502Sjsg cik_program_aspm(adev);
2162fb4d8502Sjsg
2163fb4d8502Sjsg return 0;
2164fb4d8502Sjsg }
2165fb4d8502Sjsg
cik_common_hw_fini(void * handle)2166fb4d8502Sjsg static int cik_common_hw_fini(void *handle)
2167fb4d8502Sjsg {
2168fb4d8502Sjsg return 0;
2169fb4d8502Sjsg }
2170fb4d8502Sjsg
cik_common_suspend(void * handle)2171fb4d8502Sjsg static int cik_common_suspend(void *handle)
2172fb4d8502Sjsg {
2173fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2174fb4d8502Sjsg
2175fb4d8502Sjsg return cik_common_hw_fini(adev);
2176fb4d8502Sjsg }
2177fb4d8502Sjsg
cik_common_resume(void * handle)2178fb4d8502Sjsg static int cik_common_resume(void *handle)
2179fb4d8502Sjsg {
2180fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2181fb4d8502Sjsg
2182fb4d8502Sjsg return cik_common_hw_init(adev);
2183fb4d8502Sjsg }
2184fb4d8502Sjsg
cik_common_is_idle(void * handle)2185fb4d8502Sjsg static bool cik_common_is_idle(void *handle)
2186fb4d8502Sjsg {
2187fb4d8502Sjsg return true;
2188fb4d8502Sjsg }
2189fb4d8502Sjsg
cik_common_wait_for_idle(void * handle)2190fb4d8502Sjsg static int cik_common_wait_for_idle(void *handle)
2191fb4d8502Sjsg {
2192fb4d8502Sjsg return 0;
2193fb4d8502Sjsg }
2194fb4d8502Sjsg
cik_common_soft_reset(void * handle)2195fb4d8502Sjsg static int cik_common_soft_reset(void *handle)
2196fb4d8502Sjsg {
2197fb4d8502Sjsg /* XXX hard reset?? */
2198fb4d8502Sjsg return 0;
2199fb4d8502Sjsg }
2200fb4d8502Sjsg
cik_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)2201fb4d8502Sjsg static int cik_common_set_clockgating_state(void *handle,
2202fb4d8502Sjsg enum amd_clockgating_state state)
2203fb4d8502Sjsg {
2204fb4d8502Sjsg return 0;
2205fb4d8502Sjsg }
2206fb4d8502Sjsg
cik_common_set_powergating_state(void * handle,enum amd_powergating_state state)2207fb4d8502Sjsg static int cik_common_set_powergating_state(void *handle,
2208fb4d8502Sjsg enum amd_powergating_state state)
2209fb4d8502Sjsg {
2210fb4d8502Sjsg return 0;
2211fb4d8502Sjsg }
2212fb4d8502Sjsg
2213fb4d8502Sjsg static const struct amd_ip_funcs cik_common_ip_funcs = {
2214fb4d8502Sjsg .name = "cik_common",
2215fb4d8502Sjsg .early_init = cik_common_early_init,
2216fb4d8502Sjsg .late_init = NULL,
2217fb4d8502Sjsg .sw_init = cik_common_sw_init,
2218fb4d8502Sjsg .sw_fini = cik_common_sw_fini,
2219fb4d8502Sjsg .hw_init = cik_common_hw_init,
2220fb4d8502Sjsg .hw_fini = cik_common_hw_fini,
2221fb4d8502Sjsg .suspend = cik_common_suspend,
2222fb4d8502Sjsg .resume = cik_common_resume,
2223fb4d8502Sjsg .is_idle = cik_common_is_idle,
2224fb4d8502Sjsg .wait_for_idle = cik_common_wait_for_idle,
2225fb4d8502Sjsg .soft_reset = cik_common_soft_reset,
2226fb4d8502Sjsg .set_clockgating_state = cik_common_set_clockgating_state,
2227fb4d8502Sjsg .set_powergating_state = cik_common_set_powergating_state,
2228fb4d8502Sjsg };
2229fb4d8502Sjsg
2230fb4d8502Sjsg static const struct amdgpu_ip_block_version cik_common_ip_block =
2231fb4d8502Sjsg {
2232fb4d8502Sjsg .type = AMD_IP_BLOCK_TYPE_COMMON,
2233fb4d8502Sjsg .major = 1,
2234fb4d8502Sjsg .minor = 0,
2235fb4d8502Sjsg .rev = 0,
2236fb4d8502Sjsg .funcs = &cik_common_ip_funcs,
2237fb4d8502Sjsg };
2238fb4d8502Sjsg
cik_set_ip_blocks(struct amdgpu_device * adev)2239fb4d8502Sjsg int cik_set_ip_blocks(struct amdgpu_device *adev)
2240fb4d8502Sjsg {
2241fb4d8502Sjsg switch (adev->asic_type) {
2242fb4d8502Sjsg case CHIP_BONAIRE:
2243fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2244fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2245fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2246c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
2247c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2248fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2249fb4d8502Sjsg if (adev->enable_virtual_display)
22505ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2251fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2252fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2253fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2254fb4d8502Sjsg #endif
2255fb4d8502Sjsg else
2256fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
2257fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2258fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2259fb4d8502Sjsg break;
2260fb4d8502Sjsg case CHIP_HAWAII:
2261fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2262fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2263fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2264c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
2265c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2266fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2267fb4d8502Sjsg if (adev->enable_virtual_display)
22685ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2269fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2270fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2271fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2272fb4d8502Sjsg #endif
2273fb4d8502Sjsg else
2274fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
2275fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2276fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2277fb4d8502Sjsg break;
2278fb4d8502Sjsg case CHIP_KAVERI:
2279fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2280fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2281fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2282c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
2283c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2284fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2285fb4d8502Sjsg if (adev->enable_virtual_display)
22865ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2287fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2288fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2289fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2290fb4d8502Sjsg #endif
2291fb4d8502Sjsg else
2292fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
2293c349dbc7Sjsg
2294fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2295fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2296fb4d8502Sjsg break;
2297fb4d8502Sjsg case CHIP_KABINI:
2298fb4d8502Sjsg case CHIP_MULLINS:
2299fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
2300fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
2301fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
2302c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
2303c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
2304fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
2305fb4d8502Sjsg if (adev->enable_virtual_display)
23065ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2307fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2308fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2309fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2310fb4d8502Sjsg #endif
2311fb4d8502Sjsg else
2312fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
2313fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
2314fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
2315fb4d8502Sjsg break;
2316fb4d8502Sjsg default:
2317fb4d8502Sjsg /* FIXME: not supported yet */
2318fb4d8502Sjsg return -EINVAL;
2319fb4d8502Sjsg }
2320fb4d8502Sjsg return 0;
2321fb4d8502Sjsg }
2322