1fb4d8502Sjsg /*
2fb4d8502Sjsg * Copyright 2014 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 */
23c349dbc7Sjsg
24c349dbc7Sjsg #include <linux/pci.h>
25fb4d8502Sjsg #include <linux/slab.h>
26c349dbc7Sjsg
275ca02815Sjsg #include <drm/amdgpu_drm.h>
285ca02815Sjsg
29fb4d8502Sjsg #include "amdgpu.h"
30fb4d8502Sjsg #include "amdgpu_atombios.h"
31fb4d8502Sjsg #include "amdgpu_ih.h"
32fb4d8502Sjsg #include "amdgpu_uvd.h"
33fb4d8502Sjsg #include "amdgpu_vce.h"
34fb4d8502Sjsg #include "amdgpu_ucode.h"
35fb4d8502Sjsg #include "atom.h"
36fb4d8502Sjsg #include "amd_pcie.h"
37fb4d8502Sjsg
38fb4d8502Sjsg #include "gmc/gmc_8_1_d.h"
39fb4d8502Sjsg #include "gmc/gmc_8_1_sh_mask.h"
40fb4d8502Sjsg
41fb4d8502Sjsg #include "oss/oss_3_0_d.h"
42fb4d8502Sjsg #include "oss/oss_3_0_sh_mask.h"
43fb4d8502Sjsg
44fb4d8502Sjsg #include "bif/bif_5_0_d.h"
45fb4d8502Sjsg #include "bif/bif_5_0_sh_mask.h"
46fb4d8502Sjsg
47fb4d8502Sjsg #include "gca/gfx_8_0_d.h"
48fb4d8502Sjsg #include "gca/gfx_8_0_sh_mask.h"
49fb4d8502Sjsg
50fb4d8502Sjsg #include "smu/smu_7_1_1_d.h"
51fb4d8502Sjsg #include "smu/smu_7_1_1_sh_mask.h"
52fb4d8502Sjsg
53fb4d8502Sjsg #include "uvd/uvd_5_0_d.h"
54fb4d8502Sjsg #include "uvd/uvd_5_0_sh_mask.h"
55fb4d8502Sjsg
56fb4d8502Sjsg #include "vce/vce_3_0_d.h"
57fb4d8502Sjsg #include "vce/vce_3_0_sh_mask.h"
58fb4d8502Sjsg
59fb4d8502Sjsg #include "dce/dce_10_0_d.h"
60fb4d8502Sjsg #include "dce/dce_10_0_sh_mask.h"
61fb4d8502Sjsg
62fb4d8502Sjsg #include "vid.h"
63fb4d8502Sjsg #include "vi.h"
64fb4d8502Sjsg #include "gmc_v8_0.h"
65fb4d8502Sjsg #include "gmc_v7_0.h"
66fb4d8502Sjsg #include "gfx_v8_0.h"
67fb4d8502Sjsg #include "sdma_v2_4.h"
68fb4d8502Sjsg #include "sdma_v3_0.h"
69fb4d8502Sjsg #include "dce_v10_0.h"
70fb4d8502Sjsg #include "dce_v11_0.h"
71fb4d8502Sjsg #include "iceland_ih.h"
72fb4d8502Sjsg #include "tonga_ih.h"
73fb4d8502Sjsg #include "cz_ih.h"
74fb4d8502Sjsg #include "uvd_v5_0.h"
75fb4d8502Sjsg #include "uvd_v6_0.h"
76fb4d8502Sjsg #include "vce_v3_0.h"
77fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_ACP)
78fb4d8502Sjsg #include "amdgpu_acp.h"
79fb4d8502Sjsg #endif
805ca02815Sjsg #include "amdgpu_vkms.h"
81fb4d8502Sjsg #include "mxgpu_vi.h"
82fb4d8502Sjsg #include "amdgpu_dm.h"
83fb4d8502Sjsg
845ca02815Sjsg #define ixPCIE_LC_L1_PM_SUBSTATE 0x100100C6
855ca02815Sjsg #define PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK 0x00000001L
865ca02815Sjsg #define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK 0x00000002L
875ca02815Sjsg #define PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_1_OVERRIDE_MASK 0x00000004L
885ca02815Sjsg #define PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_2_OVERRIDE_MASK 0x00000008L
895ca02815Sjsg #define PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_1_OVERRIDE_MASK 0x00000010L
905ca02815Sjsg #define ixPCIE_L1_PM_SUB_CNTL 0x378
915ca02815Sjsg #define PCIE_L1_PM_SUB_CNTL__ASPM_L1_2_EN_MASK 0x00000004L
925ca02815Sjsg #define PCIE_L1_PM_SUB_CNTL__ASPM_L1_1_EN_MASK 0x00000008L
935ca02815Sjsg #define PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_2_EN_MASK 0x00000001L
945ca02815Sjsg #define PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_1_EN_MASK 0x00000002L
955ca02815Sjsg #define PCIE_LC_CNTL6__LC_L1_POWERDOWN_MASK 0x00200000L
965ca02815Sjsg #define LINK_CAP 0x64
975ca02815Sjsg #define PCIE_LINK_CAP__CLOCK_POWER_MANAGEMENT_MASK 0x00040000L
985ca02815Sjsg #define ixCPM_CONTROL 0x1400118
995ca02815Sjsg #define ixPCIE_LC_CNTL7 0x100100BC
1005ca02815Sjsg #define PCIE_LC_CNTL7__LC_L1_SIDEBAND_CLKREQ_PDWN_EN_MASK 0x00000400L
1015ca02815Sjsg #define PCIE_LC_CNTL__LC_L0S_INACTIVITY_DEFAULT 0x00000007
1025ca02815Sjsg #define PCIE_LC_CNTL__LC_L1_INACTIVITY_DEFAULT 0x00000009
1035ca02815Sjsg #define CPM_CONTROL__CLKREQb_UNGATE_TXCLK_ENABLE_MASK 0x01000000L
1045ca02815Sjsg #define PCIE_L1_PM_SUB_CNTL 0x378
1055ca02815Sjsg #define ASIC_IS_P22(asic_type, rid) ((asic_type >= CHIP_POLARIS10) && \
1065ca02815Sjsg (asic_type <= CHIP_POLARIS12) && \
1075ca02815Sjsg (rid >= 0x6E))
1085ca02815Sjsg /* Topaz */
1095ca02815Sjsg static const struct amdgpu_video_codecs topaz_video_codecs_encode =
1105ca02815Sjsg {
1115ca02815Sjsg .codec_count = 0,
1125ca02815Sjsg .codec_array = NULL,
1135ca02815Sjsg };
1145ca02815Sjsg
1155ca02815Sjsg /* Tonga, CZ, ST, Fiji */
1165ca02815Sjsg static const struct amdgpu_video_codec_info tonga_video_codecs_encode_array[] =
1175ca02815Sjsg {
1185ca02815Sjsg {
1195ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1205ca02815Sjsg .max_width = 4096,
1215ca02815Sjsg .max_height = 2304,
1225ca02815Sjsg .max_pixels_per_frame = 4096 * 2304,
1235ca02815Sjsg .max_level = 0,
1245ca02815Sjsg },
1255ca02815Sjsg };
1265ca02815Sjsg
1275ca02815Sjsg static const struct amdgpu_video_codecs tonga_video_codecs_encode =
1285ca02815Sjsg {
1295ca02815Sjsg .codec_count = ARRAY_SIZE(tonga_video_codecs_encode_array),
1305ca02815Sjsg .codec_array = tonga_video_codecs_encode_array,
1315ca02815Sjsg };
1325ca02815Sjsg
1335ca02815Sjsg /* Polaris */
1345ca02815Sjsg static const struct amdgpu_video_codec_info polaris_video_codecs_encode_array[] =
1355ca02815Sjsg {
1365ca02815Sjsg {
1375ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1385ca02815Sjsg .max_width = 4096,
1395ca02815Sjsg .max_height = 2304,
1405ca02815Sjsg .max_pixels_per_frame = 4096 * 2304,
1415ca02815Sjsg .max_level = 0,
1425ca02815Sjsg },
1435ca02815Sjsg {
1445ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
1455ca02815Sjsg .max_width = 4096,
1465ca02815Sjsg .max_height = 2304,
1475ca02815Sjsg .max_pixels_per_frame = 4096 * 2304,
1485ca02815Sjsg .max_level = 0,
1495ca02815Sjsg },
1505ca02815Sjsg };
1515ca02815Sjsg
1525ca02815Sjsg static const struct amdgpu_video_codecs polaris_video_codecs_encode =
1535ca02815Sjsg {
1545ca02815Sjsg .codec_count = ARRAY_SIZE(polaris_video_codecs_encode_array),
1555ca02815Sjsg .codec_array = polaris_video_codecs_encode_array,
1565ca02815Sjsg };
1575ca02815Sjsg
1585ca02815Sjsg /* Topaz */
1595ca02815Sjsg static const struct amdgpu_video_codecs topaz_video_codecs_decode =
1605ca02815Sjsg {
1615ca02815Sjsg .codec_count = 0,
1625ca02815Sjsg .codec_array = NULL,
1635ca02815Sjsg };
1645ca02815Sjsg
1655ca02815Sjsg /* Tonga */
1665ca02815Sjsg static const struct amdgpu_video_codec_info tonga_video_codecs_decode_array[] =
1675ca02815Sjsg {
1685ca02815Sjsg {
1695ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
1705ca02815Sjsg .max_width = 4096,
1715ca02815Sjsg .max_height = 4096,
1725ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
1735ca02815Sjsg .max_level = 3,
1745ca02815Sjsg },
1755ca02815Sjsg {
1765ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
1775ca02815Sjsg .max_width = 4096,
1785ca02815Sjsg .max_height = 4096,
1795ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
1805ca02815Sjsg .max_level = 5,
1815ca02815Sjsg },
1825ca02815Sjsg {
1835ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
1845ca02815Sjsg .max_width = 4096,
1855ca02815Sjsg .max_height = 4096,
1865ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
1875ca02815Sjsg .max_level = 52,
1885ca02815Sjsg },
1895ca02815Sjsg {
1905ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
1915ca02815Sjsg .max_width = 4096,
1925ca02815Sjsg .max_height = 4096,
1935ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
1945ca02815Sjsg .max_level = 4,
1955ca02815Sjsg },
1965ca02815Sjsg };
1975ca02815Sjsg
1985ca02815Sjsg static const struct amdgpu_video_codecs tonga_video_codecs_decode =
1995ca02815Sjsg {
2005ca02815Sjsg .codec_count = ARRAY_SIZE(tonga_video_codecs_decode_array),
2015ca02815Sjsg .codec_array = tonga_video_codecs_decode_array,
2025ca02815Sjsg };
2035ca02815Sjsg
2045ca02815Sjsg /* CZ, ST, Fiji, Polaris */
2055ca02815Sjsg static const struct amdgpu_video_codec_info cz_video_codecs_decode_array[] =
2065ca02815Sjsg {
2075ca02815Sjsg {
2085ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
2095ca02815Sjsg .max_width = 4096,
2105ca02815Sjsg .max_height = 4096,
2115ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2125ca02815Sjsg .max_level = 3,
2135ca02815Sjsg },
2145ca02815Sjsg {
2155ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
2165ca02815Sjsg .max_width = 4096,
2175ca02815Sjsg .max_height = 4096,
2185ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2195ca02815Sjsg .max_level = 5,
2205ca02815Sjsg },
2215ca02815Sjsg {
2225ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
2235ca02815Sjsg .max_width = 4096,
2245ca02815Sjsg .max_height = 4096,
2255ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2265ca02815Sjsg .max_level = 52,
2275ca02815Sjsg },
2285ca02815Sjsg {
2295ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
2305ca02815Sjsg .max_width = 4096,
2315ca02815Sjsg .max_height = 4096,
2325ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2335ca02815Sjsg .max_level = 4,
2345ca02815Sjsg },
2355ca02815Sjsg {
2365ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC,
2375ca02815Sjsg .max_width = 4096,
2385ca02815Sjsg .max_height = 4096,
2395ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2405ca02815Sjsg .max_level = 186,
2415ca02815Sjsg },
2425ca02815Sjsg {
2435ca02815Sjsg .codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG,
2445ca02815Sjsg .max_width = 4096,
2455ca02815Sjsg .max_height = 4096,
2465ca02815Sjsg .max_pixels_per_frame = 4096 * 4096,
2475ca02815Sjsg .max_level = 0,
2485ca02815Sjsg },
2495ca02815Sjsg };
2505ca02815Sjsg
2515ca02815Sjsg static const struct amdgpu_video_codecs cz_video_codecs_decode =
2525ca02815Sjsg {
2535ca02815Sjsg .codec_count = ARRAY_SIZE(cz_video_codecs_decode_array),
2545ca02815Sjsg .codec_array = cz_video_codecs_decode_array,
2555ca02815Sjsg };
2565ca02815Sjsg
vi_query_video_codecs(struct amdgpu_device * adev,bool encode,const struct amdgpu_video_codecs ** codecs)2575ca02815Sjsg static int vi_query_video_codecs(struct amdgpu_device *adev, bool encode,
2585ca02815Sjsg const struct amdgpu_video_codecs **codecs)
2595ca02815Sjsg {
2605ca02815Sjsg switch (adev->asic_type) {
2615ca02815Sjsg case CHIP_TOPAZ:
2625ca02815Sjsg if (encode)
2635ca02815Sjsg *codecs = &topaz_video_codecs_encode;
2645ca02815Sjsg else
2655ca02815Sjsg *codecs = &topaz_video_codecs_decode;
2665ca02815Sjsg return 0;
2675ca02815Sjsg case CHIP_TONGA:
2685ca02815Sjsg if (encode)
2695ca02815Sjsg *codecs = &tonga_video_codecs_encode;
2705ca02815Sjsg else
2715ca02815Sjsg *codecs = &tonga_video_codecs_decode;
2725ca02815Sjsg return 0;
2735ca02815Sjsg case CHIP_POLARIS10:
2745ca02815Sjsg case CHIP_POLARIS11:
2755ca02815Sjsg case CHIP_POLARIS12:
2765ca02815Sjsg case CHIP_VEGAM:
2775ca02815Sjsg if (encode)
2785ca02815Sjsg *codecs = &polaris_video_codecs_encode;
2795ca02815Sjsg else
2805ca02815Sjsg *codecs = &cz_video_codecs_decode;
2815ca02815Sjsg return 0;
2825ca02815Sjsg case CHIP_FIJI:
2835ca02815Sjsg case CHIP_CARRIZO:
2845ca02815Sjsg case CHIP_STONEY:
2855ca02815Sjsg if (encode)
2865ca02815Sjsg *codecs = &tonga_video_codecs_encode;
2875ca02815Sjsg else
2885ca02815Sjsg *codecs = &cz_video_codecs_decode;
2895ca02815Sjsg return 0;
2905ca02815Sjsg default:
2915ca02815Sjsg return -EINVAL;
2925ca02815Sjsg }
2935ca02815Sjsg }
2945ca02815Sjsg
295fb4d8502Sjsg /*
296fb4d8502Sjsg * Indirect registers accessor
297fb4d8502Sjsg */
vi_pcie_rreg(struct amdgpu_device * adev,u32 reg)298fb4d8502Sjsg static u32 vi_pcie_rreg(struct amdgpu_device *adev, u32 reg)
299fb4d8502Sjsg {
300fb4d8502Sjsg unsigned long flags;
301fb4d8502Sjsg u32 r;
302fb4d8502Sjsg
303fb4d8502Sjsg spin_lock_irqsave(&adev->pcie_idx_lock, flags);
304c349dbc7Sjsg WREG32_NO_KIQ(mmPCIE_INDEX, reg);
305c349dbc7Sjsg (void)RREG32_NO_KIQ(mmPCIE_INDEX);
306c349dbc7Sjsg r = RREG32_NO_KIQ(mmPCIE_DATA);
307fb4d8502Sjsg spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
308fb4d8502Sjsg return r;
309fb4d8502Sjsg }
310fb4d8502Sjsg
vi_pcie_wreg(struct amdgpu_device * adev,u32 reg,u32 v)311fb4d8502Sjsg static void vi_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
312fb4d8502Sjsg {
313fb4d8502Sjsg unsigned long flags;
314fb4d8502Sjsg
315fb4d8502Sjsg spin_lock_irqsave(&adev->pcie_idx_lock, flags);
316c349dbc7Sjsg WREG32_NO_KIQ(mmPCIE_INDEX, reg);
317c349dbc7Sjsg (void)RREG32_NO_KIQ(mmPCIE_INDEX);
318c349dbc7Sjsg WREG32_NO_KIQ(mmPCIE_DATA, v);
319c349dbc7Sjsg (void)RREG32_NO_KIQ(mmPCIE_DATA);
320fb4d8502Sjsg spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
321fb4d8502Sjsg }
322fb4d8502Sjsg
vi_smc_rreg(struct amdgpu_device * adev,u32 reg)323fb4d8502Sjsg static u32 vi_smc_rreg(struct amdgpu_device *adev, u32 reg)
324fb4d8502Sjsg {
325fb4d8502Sjsg unsigned long flags;
326fb4d8502Sjsg u32 r;
327fb4d8502Sjsg
328fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
329fb4d8502Sjsg WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
330fb4d8502Sjsg r = RREG32_NO_KIQ(mmSMC_IND_DATA_11);
331fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
332fb4d8502Sjsg return r;
333fb4d8502Sjsg }
334fb4d8502Sjsg
vi_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)335fb4d8502Sjsg static void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
336fb4d8502Sjsg {
337fb4d8502Sjsg unsigned long flags;
338fb4d8502Sjsg
339fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
340c349dbc7Sjsg WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg));
341c349dbc7Sjsg WREG32_NO_KIQ(mmSMC_IND_DATA_11, (v));
342fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
343fb4d8502Sjsg }
344fb4d8502Sjsg
345fb4d8502Sjsg /* smu_8_0_d.h */
346fb4d8502Sjsg #define mmMP0PUB_IND_INDEX 0x180
347fb4d8502Sjsg #define mmMP0PUB_IND_DATA 0x181
348fb4d8502Sjsg
cz_smc_rreg(struct amdgpu_device * adev,u32 reg)349fb4d8502Sjsg static u32 cz_smc_rreg(struct amdgpu_device *adev, u32 reg)
350fb4d8502Sjsg {
351fb4d8502Sjsg unsigned long flags;
352fb4d8502Sjsg u32 r;
353fb4d8502Sjsg
354fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
355fb4d8502Sjsg WREG32(mmMP0PUB_IND_INDEX, (reg));
356fb4d8502Sjsg r = RREG32(mmMP0PUB_IND_DATA);
357fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
358fb4d8502Sjsg return r;
359fb4d8502Sjsg }
360fb4d8502Sjsg
cz_smc_wreg(struct amdgpu_device * adev,u32 reg,u32 v)361fb4d8502Sjsg static void cz_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
362fb4d8502Sjsg {
363fb4d8502Sjsg unsigned long flags;
364fb4d8502Sjsg
365fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
366fb4d8502Sjsg WREG32(mmMP0PUB_IND_INDEX, (reg));
367fb4d8502Sjsg WREG32(mmMP0PUB_IND_DATA, (v));
368fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
369fb4d8502Sjsg }
370fb4d8502Sjsg
vi_uvd_ctx_rreg(struct amdgpu_device * adev,u32 reg)371fb4d8502Sjsg static u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
372fb4d8502Sjsg {
373fb4d8502Sjsg unsigned long flags;
374fb4d8502Sjsg u32 r;
375fb4d8502Sjsg
376fb4d8502Sjsg spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
377fb4d8502Sjsg WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
378fb4d8502Sjsg r = RREG32(mmUVD_CTX_DATA);
379fb4d8502Sjsg spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
380fb4d8502Sjsg return r;
381fb4d8502Sjsg }
382fb4d8502Sjsg
vi_uvd_ctx_wreg(struct amdgpu_device * adev,u32 reg,u32 v)383fb4d8502Sjsg static void vi_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
384fb4d8502Sjsg {
385fb4d8502Sjsg unsigned long flags;
386fb4d8502Sjsg
387fb4d8502Sjsg spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
388fb4d8502Sjsg WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
389fb4d8502Sjsg WREG32(mmUVD_CTX_DATA, (v));
390fb4d8502Sjsg spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
391fb4d8502Sjsg }
392fb4d8502Sjsg
vi_didt_rreg(struct amdgpu_device * adev,u32 reg)393fb4d8502Sjsg static u32 vi_didt_rreg(struct amdgpu_device *adev, u32 reg)
394fb4d8502Sjsg {
395fb4d8502Sjsg unsigned long flags;
396fb4d8502Sjsg u32 r;
397fb4d8502Sjsg
398fb4d8502Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
399fb4d8502Sjsg WREG32(mmDIDT_IND_INDEX, (reg));
400fb4d8502Sjsg r = RREG32(mmDIDT_IND_DATA);
401fb4d8502Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
402fb4d8502Sjsg return r;
403fb4d8502Sjsg }
404fb4d8502Sjsg
vi_didt_wreg(struct amdgpu_device * adev,u32 reg,u32 v)405fb4d8502Sjsg static void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
406fb4d8502Sjsg {
407fb4d8502Sjsg unsigned long flags;
408fb4d8502Sjsg
409fb4d8502Sjsg spin_lock_irqsave(&adev->didt_idx_lock, flags);
410fb4d8502Sjsg WREG32(mmDIDT_IND_INDEX, (reg));
411fb4d8502Sjsg WREG32(mmDIDT_IND_DATA, (v));
412fb4d8502Sjsg spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
413fb4d8502Sjsg }
414fb4d8502Sjsg
vi_gc_cac_rreg(struct amdgpu_device * adev,u32 reg)415fb4d8502Sjsg static u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg)
416fb4d8502Sjsg {
417fb4d8502Sjsg unsigned long flags;
418fb4d8502Sjsg u32 r;
419fb4d8502Sjsg
420fb4d8502Sjsg spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
421fb4d8502Sjsg WREG32(mmGC_CAC_IND_INDEX, (reg));
422fb4d8502Sjsg r = RREG32(mmGC_CAC_IND_DATA);
423fb4d8502Sjsg spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
424fb4d8502Sjsg return r;
425fb4d8502Sjsg }
426fb4d8502Sjsg
vi_gc_cac_wreg(struct amdgpu_device * adev,u32 reg,u32 v)427fb4d8502Sjsg static void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
428fb4d8502Sjsg {
429fb4d8502Sjsg unsigned long flags;
430fb4d8502Sjsg
431fb4d8502Sjsg spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
432fb4d8502Sjsg WREG32(mmGC_CAC_IND_INDEX, (reg));
433fb4d8502Sjsg WREG32(mmGC_CAC_IND_DATA, (v));
434fb4d8502Sjsg spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
435fb4d8502Sjsg }
436fb4d8502Sjsg
437fb4d8502Sjsg
438fb4d8502Sjsg static const u32 tonga_mgcg_cgcg_init[] =
439fb4d8502Sjsg {
440fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
441fb4d8502Sjsg mmPCIE_INDEX, 0xffffffff, 0x0140001c,
442fb4d8502Sjsg mmPCIE_DATA, 0x000f0000, 0x00000000,
443fb4d8502Sjsg mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
444fb4d8502Sjsg mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
445fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
446fb4d8502Sjsg mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
447fb4d8502Sjsg };
448fb4d8502Sjsg
449fb4d8502Sjsg static const u32 fiji_mgcg_cgcg_init[] =
450fb4d8502Sjsg {
451fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
452fb4d8502Sjsg mmPCIE_INDEX, 0xffffffff, 0x0140001c,
453fb4d8502Sjsg mmPCIE_DATA, 0x000f0000, 0x00000000,
454fb4d8502Sjsg mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C,
455fb4d8502Sjsg mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
456fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
457fb4d8502Sjsg mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
458fb4d8502Sjsg };
459fb4d8502Sjsg
460fb4d8502Sjsg static const u32 iceland_mgcg_cgcg_init[] =
461fb4d8502Sjsg {
462fb4d8502Sjsg mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2,
463fb4d8502Sjsg mmPCIE_DATA, 0x000f0000, 0x00000000,
464fb4d8502Sjsg mmSMC_IND_INDEX_4, 0xffffffff, ixCGTT_ROM_CLK_CTRL0,
465fb4d8502Sjsg mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100,
466fb4d8502Sjsg mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
467fb4d8502Sjsg };
468fb4d8502Sjsg
469fb4d8502Sjsg static const u32 cz_mgcg_cgcg_init[] =
470fb4d8502Sjsg {
471fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
472fb4d8502Sjsg mmPCIE_INDEX, 0xffffffff, 0x0140001c,
473fb4d8502Sjsg mmPCIE_DATA, 0x000f0000, 0x00000000,
474fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
475fb4d8502Sjsg mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
476fb4d8502Sjsg };
477fb4d8502Sjsg
478fb4d8502Sjsg static const u32 stoney_mgcg_cgcg_init[] =
479fb4d8502Sjsg {
480fb4d8502Sjsg mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100,
481fb4d8502Sjsg mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104,
482fb4d8502Sjsg mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027,
483fb4d8502Sjsg };
484fb4d8502Sjsg
vi_init_golden_registers(struct amdgpu_device * adev)485fb4d8502Sjsg static void vi_init_golden_registers(struct amdgpu_device *adev)
486fb4d8502Sjsg {
487fb4d8502Sjsg /* Some of the registers might be dependent on GRBM_GFX_INDEX */
488fb4d8502Sjsg mutex_lock(&adev->grbm_idx_mutex);
489fb4d8502Sjsg
490fb4d8502Sjsg if (amdgpu_sriov_vf(adev)) {
491fb4d8502Sjsg xgpu_vi_init_golden_registers(adev);
492fb4d8502Sjsg mutex_unlock(&adev->grbm_idx_mutex);
493fb4d8502Sjsg return;
494fb4d8502Sjsg }
495fb4d8502Sjsg
496fb4d8502Sjsg switch (adev->asic_type) {
497fb4d8502Sjsg case CHIP_TOPAZ:
498fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
499fb4d8502Sjsg iceland_mgcg_cgcg_init,
500fb4d8502Sjsg ARRAY_SIZE(iceland_mgcg_cgcg_init));
501fb4d8502Sjsg break;
502fb4d8502Sjsg case CHIP_FIJI:
503fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
504fb4d8502Sjsg fiji_mgcg_cgcg_init,
505fb4d8502Sjsg ARRAY_SIZE(fiji_mgcg_cgcg_init));
506fb4d8502Sjsg break;
507fb4d8502Sjsg case CHIP_TONGA:
508fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
509fb4d8502Sjsg tonga_mgcg_cgcg_init,
510fb4d8502Sjsg ARRAY_SIZE(tonga_mgcg_cgcg_init));
511fb4d8502Sjsg break;
512fb4d8502Sjsg case CHIP_CARRIZO:
513fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
514fb4d8502Sjsg cz_mgcg_cgcg_init,
515fb4d8502Sjsg ARRAY_SIZE(cz_mgcg_cgcg_init));
516fb4d8502Sjsg break;
517fb4d8502Sjsg case CHIP_STONEY:
518fb4d8502Sjsg amdgpu_device_program_register_sequence(adev,
519fb4d8502Sjsg stoney_mgcg_cgcg_init,
520fb4d8502Sjsg ARRAY_SIZE(stoney_mgcg_cgcg_init));
521fb4d8502Sjsg break;
522fb4d8502Sjsg case CHIP_POLARIS10:
523fb4d8502Sjsg case CHIP_POLARIS11:
524fb4d8502Sjsg case CHIP_POLARIS12:
525fb4d8502Sjsg case CHIP_VEGAM:
526fb4d8502Sjsg default:
527fb4d8502Sjsg break;
528fb4d8502Sjsg }
529fb4d8502Sjsg mutex_unlock(&adev->grbm_idx_mutex);
530fb4d8502Sjsg }
531fb4d8502Sjsg
532fb4d8502Sjsg /**
533fb4d8502Sjsg * vi_get_xclk - get the xclk
534fb4d8502Sjsg *
535fb4d8502Sjsg * @adev: amdgpu_device pointer
536fb4d8502Sjsg *
537fb4d8502Sjsg * Returns the reference clock used by the gfx engine
538fb4d8502Sjsg * (VI).
539fb4d8502Sjsg */
vi_get_xclk(struct amdgpu_device * adev)540fb4d8502Sjsg static u32 vi_get_xclk(struct amdgpu_device *adev)
541fb4d8502Sjsg {
542fb4d8502Sjsg u32 reference_clock = adev->clock.spll.reference_freq;
543fb4d8502Sjsg u32 tmp;
544fb4d8502Sjsg
545920f24aeSjsg if (adev->flags & AMD_IS_APU) {
546920f24aeSjsg switch (adev->asic_type) {
547920f24aeSjsg case CHIP_STONEY:
548920f24aeSjsg /* vbios says 48Mhz, but the actual freq is 100Mhz */
549920f24aeSjsg return 10000;
550920f24aeSjsg default:
551fb4d8502Sjsg return reference_clock;
552920f24aeSjsg }
553920f24aeSjsg }
554fb4d8502Sjsg
555fb4d8502Sjsg tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
556fb4d8502Sjsg if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK))
557fb4d8502Sjsg return 1000;
558fb4d8502Sjsg
559fb4d8502Sjsg tmp = RREG32_SMC(ixCG_CLKPIN_CNTL);
560fb4d8502Sjsg if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL, XTALIN_DIVIDE))
561fb4d8502Sjsg return reference_clock / 4;
562fb4d8502Sjsg
563fb4d8502Sjsg return reference_clock;
564fb4d8502Sjsg }
565fb4d8502Sjsg
566fb4d8502Sjsg /**
567fb4d8502Sjsg * vi_srbm_select - select specific register instances
568fb4d8502Sjsg *
569fb4d8502Sjsg * @adev: amdgpu_device pointer
570fb4d8502Sjsg * @me: selected ME (micro engine)
571fb4d8502Sjsg * @pipe: pipe
572fb4d8502Sjsg * @queue: queue
573fb4d8502Sjsg * @vmid: VMID
574fb4d8502Sjsg *
575fb4d8502Sjsg * Switches the currently active registers instances. Some
576fb4d8502Sjsg * registers are instanced per VMID, others are instanced per
577fb4d8502Sjsg * me/pipe/queue combination.
578fb4d8502Sjsg */
vi_srbm_select(struct amdgpu_device * adev,u32 me,u32 pipe,u32 queue,u32 vmid)579fb4d8502Sjsg void vi_srbm_select(struct amdgpu_device *adev,
580fb4d8502Sjsg u32 me, u32 pipe, u32 queue, u32 vmid)
581fb4d8502Sjsg {
582fb4d8502Sjsg u32 srbm_gfx_cntl = 0;
583fb4d8502Sjsg srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, PIPEID, pipe);
584fb4d8502Sjsg srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, MEID, me);
585fb4d8502Sjsg srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, VMID, vmid);
586fb4d8502Sjsg srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, QUEUEID, queue);
587fb4d8502Sjsg WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);
588fb4d8502Sjsg }
589fb4d8502Sjsg
vi_read_disabled_bios(struct amdgpu_device * adev)590fb4d8502Sjsg static bool vi_read_disabled_bios(struct amdgpu_device *adev)
591fb4d8502Sjsg {
592fb4d8502Sjsg u32 bus_cntl;
593fb4d8502Sjsg u32 d1vga_control = 0;
594fb4d8502Sjsg u32 d2vga_control = 0;
595fb4d8502Sjsg u32 vga_render_control = 0;
596fb4d8502Sjsg u32 rom_cntl;
597fb4d8502Sjsg bool r;
598fb4d8502Sjsg
599fb4d8502Sjsg bus_cntl = RREG32(mmBUS_CNTL);
600fb4d8502Sjsg if (adev->mode_info.num_crtc) {
601fb4d8502Sjsg d1vga_control = RREG32(mmD1VGA_CONTROL);
602fb4d8502Sjsg d2vga_control = RREG32(mmD2VGA_CONTROL);
603fb4d8502Sjsg vga_render_control = RREG32(mmVGA_RENDER_CONTROL);
604fb4d8502Sjsg }
605fb4d8502Sjsg rom_cntl = RREG32_SMC(ixROM_CNTL);
606fb4d8502Sjsg
607fb4d8502Sjsg /* enable the rom */
608fb4d8502Sjsg WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK));
609fb4d8502Sjsg if (adev->mode_info.num_crtc) {
610fb4d8502Sjsg /* Disable VGA mode */
611fb4d8502Sjsg WREG32(mmD1VGA_CONTROL,
612fb4d8502Sjsg (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK |
613fb4d8502Sjsg D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK)));
614fb4d8502Sjsg WREG32(mmD2VGA_CONTROL,
615fb4d8502Sjsg (d2vga_control & ~(D2VGA_CONTROL__D2VGA_MODE_ENABLE_MASK |
616fb4d8502Sjsg D2VGA_CONTROL__D2VGA_TIMING_SELECT_MASK)));
617fb4d8502Sjsg WREG32(mmVGA_RENDER_CONTROL,
618fb4d8502Sjsg (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK));
619fb4d8502Sjsg }
620fb4d8502Sjsg WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK);
621fb4d8502Sjsg
622fb4d8502Sjsg r = amdgpu_read_bios(adev);
623fb4d8502Sjsg
624fb4d8502Sjsg /* restore regs */
625fb4d8502Sjsg WREG32(mmBUS_CNTL, bus_cntl);
626fb4d8502Sjsg if (adev->mode_info.num_crtc) {
627fb4d8502Sjsg WREG32(mmD1VGA_CONTROL, d1vga_control);
628fb4d8502Sjsg WREG32(mmD2VGA_CONTROL, d2vga_control);
629fb4d8502Sjsg WREG32(mmVGA_RENDER_CONTROL, vga_render_control);
630fb4d8502Sjsg }
631fb4d8502Sjsg WREG32_SMC(ixROM_CNTL, rom_cntl);
632fb4d8502Sjsg return r;
633fb4d8502Sjsg }
634fb4d8502Sjsg
vi_read_bios_from_rom(struct amdgpu_device * adev,u8 * bios,u32 length_bytes)635fb4d8502Sjsg static bool vi_read_bios_from_rom(struct amdgpu_device *adev,
636fb4d8502Sjsg u8 *bios, u32 length_bytes)
637fb4d8502Sjsg {
638fb4d8502Sjsg u32 *dw_ptr;
639fb4d8502Sjsg unsigned long flags;
640fb4d8502Sjsg u32 i, length_dw;
641fb4d8502Sjsg
642fb4d8502Sjsg if (bios == NULL)
643fb4d8502Sjsg return false;
644fb4d8502Sjsg if (length_bytes == 0)
645fb4d8502Sjsg return false;
646fb4d8502Sjsg /* APU vbios image is part of sbios image */
647fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
648fb4d8502Sjsg return false;
649fb4d8502Sjsg
650fb4d8502Sjsg dw_ptr = (u32 *)bios;
651*f005ef32Sjsg length_dw = ALIGN(length_bytes, 4) / 4;
652fb4d8502Sjsg /* take the smc lock since we are using the smc index */
653fb4d8502Sjsg spin_lock_irqsave(&adev->smc_idx_lock, flags);
654fb4d8502Sjsg /* set rom index to 0 */
655fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_11, ixROM_INDEX);
656fb4d8502Sjsg WREG32(mmSMC_IND_DATA_11, 0);
657fb4d8502Sjsg /* set index to data for continous read */
658fb4d8502Sjsg WREG32(mmSMC_IND_INDEX_11, ixROM_DATA);
659fb4d8502Sjsg for (i = 0; i < length_dw; i++)
660fb4d8502Sjsg dw_ptr[i] = RREG32(mmSMC_IND_DATA_11);
661fb4d8502Sjsg spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
662fb4d8502Sjsg
663fb4d8502Sjsg return true;
664fb4d8502Sjsg }
665fb4d8502Sjsg
666fb4d8502Sjsg static const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {
667fb4d8502Sjsg {mmGRBM_STATUS},
668fb4d8502Sjsg {mmGRBM_STATUS2},
669fb4d8502Sjsg {mmGRBM_STATUS_SE0},
670fb4d8502Sjsg {mmGRBM_STATUS_SE1},
671fb4d8502Sjsg {mmGRBM_STATUS_SE2},
672fb4d8502Sjsg {mmGRBM_STATUS_SE3},
673fb4d8502Sjsg {mmSRBM_STATUS},
674fb4d8502Sjsg {mmSRBM_STATUS2},
675fb4d8502Sjsg {mmSRBM_STATUS3},
676fb4d8502Sjsg {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET},
677fb4d8502Sjsg {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET},
678fb4d8502Sjsg {mmCP_STAT},
679fb4d8502Sjsg {mmCP_STALLED_STAT1},
680fb4d8502Sjsg {mmCP_STALLED_STAT2},
681fb4d8502Sjsg {mmCP_STALLED_STAT3},
682fb4d8502Sjsg {mmCP_CPF_BUSY_STAT},
683fb4d8502Sjsg {mmCP_CPF_STALLED_STAT1},
684fb4d8502Sjsg {mmCP_CPF_STATUS},
685fb4d8502Sjsg {mmCP_CPC_BUSY_STAT},
686fb4d8502Sjsg {mmCP_CPC_STALLED_STAT1},
687fb4d8502Sjsg {mmCP_CPC_STATUS},
688fb4d8502Sjsg {mmGB_ADDR_CONFIG},
689fb4d8502Sjsg {mmMC_ARB_RAMCFG},
690fb4d8502Sjsg {mmGB_TILE_MODE0},
691fb4d8502Sjsg {mmGB_TILE_MODE1},
692fb4d8502Sjsg {mmGB_TILE_MODE2},
693fb4d8502Sjsg {mmGB_TILE_MODE3},
694fb4d8502Sjsg {mmGB_TILE_MODE4},
695fb4d8502Sjsg {mmGB_TILE_MODE5},
696fb4d8502Sjsg {mmGB_TILE_MODE6},
697fb4d8502Sjsg {mmGB_TILE_MODE7},
698fb4d8502Sjsg {mmGB_TILE_MODE8},
699fb4d8502Sjsg {mmGB_TILE_MODE9},
700fb4d8502Sjsg {mmGB_TILE_MODE10},
701fb4d8502Sjsg {mmGB_TILE_MODE11},
702fb4d8502Sjsg {mmGB_TILE_MODE12},
703fb4d8502Sjsg {mmGB_TILE_MODE13},
704fb4d8502Sjsg {mmGB_TILE_MODE14},
705fb4d8502Sjsg {mmGB_TILE_MODE15},
706fb4d8502Sjsg {mmGB_TILE_MODE16},
707fb4d8502Sjsg {mmGB_TILE_MODE17},
708fb4d8502Sjsg {mmGB_TILE_MODE18},
709fb4d8502Sjsg {mmGB_TILE_MODE19},
710fb4d8502Sjsg {mmGB_TILE_MODE20},
711fb4d8502Sjsg {mmGB_TILE_MODE21},
712fb4d8502Sjsg {mmGB_TILE_MODE22},
713fb4d8502Sjsg {mmGB_TILE_MODE23},
714fb4d8502Sjsg {mmGB_TILE_MODE24},
715fb4d8502Sjsg {mmGB_TILE_MODE25},
716fb4d8502Sjsg {mmGB_TILE_MODE26},
717fb4d8502Sjsg {mmGB_TILE_MODE27},
718fb4d8502Sjsg {mmGB_TILE_MODE28},
719fb4d8502Sjsg {mmGB_TILE_MODE29},
720fb4d8502Sjsg {mmGB_TILE_MODE30},
721fb4d8502Sjsg {mmGB_TILE_MODE31},
722fb4d8502Sjsg {mmGB_MACROTILE_MODE0},
723fb4d8502Sjsg {mmGB_MACROTILE_MODE1},
724fb4d8502Sjsg {mmGB_MACROTILE_MODE2},
725fb4d8502Sjsg {mmGB_MACROTILE_MODE3},
726fb4d8502Sjsg {mmGB_MACROTILE_MODE4},
727fb4d8502Sjsg {mmGB_MACROTILE_MODE5},
728fb4d8502Sjsg {mmGB_MACROTILE_MODE6},
729fb4d8502Sjsg {mmGB_MACROTILE_MODE7},
730fb4d8502Sjsg {mmGB_MACROTILE_MODE8},
731fb4d8502Sjsg {mmGB_MACROTILE_MODE9},
732fb4d8502Sjsg {mmGB_MACROTILE_MODE10},
733fb4d8502Sjsg {mmGB_MACROTILE_MODE11},
734fb4d8502Sjsg {mmGB_MACROTILE_MODE12},
735fb4d8502Sjsg {mmGB_MACROTILE_MODE13},
736fb4d8502Sjsg {mmGB_MACROTILE_MODE14},
737fb4d8502Sjsg {mmGB_MACROTILE_MODE15},
738fb4d8502Sjsg {mmCC_RB_BACKEND_DISABLE, true},
739fb4d8502Sjsg {mmGC_USER_RB_BACKEND_DISABLE, true},
740fb4d8502Sjsg {mmGB_BACKEND_MAP, false},
741fb4d8502Sjsg {mmPA_SC_RASTER_CONFIG, true},
742fb4d8502Sjsg {mmPA_SC_RASTER_CONFIG_1, true},
743fb4d8502Sjsg };
744fb4d8502Sjsg
vi_get_register_value(struct amdgpu_device * adev,bool indexed,u32 se_num,u32 sh_num,u32 reg_offset)745fb4d8502Sjsg static uint32_t vi_get_register_value(struct amdgpu_device *adev,
746fb4d8502Sjsg bool indexed, u32 se_num,
747fb4d8502Sjsg u32 sh_num, u32 reg_offset)
748fb4d8502Sjsg {
749fb4d8502Sjsg if (indexed) {
750fb4d8502Sjsg uint32_t val;
751fb4d8502Sjsg unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
752fb4d8502Sjsg unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
753fb4d8502Sjsg
754fb4d8502Sjsg switch (reg_offset) {
755fb4d8502Sjsg case mmCC_RB_BACKEND_DISABLE:
756fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
757fb4d8502Sjsg case mmGC_USER_RB_BACKEND_DISABLE:
758fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
759fb4d8502Sjsg case mmPA_SC_RASTER_CONFIG:
760fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
761fb4d8502Sjsg case mmPA_SC_RASTER_CONFIG_1:
762fb4d8502Sjsg return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1;
763fb4d8502Sjsg }
764fb4d8502Sjsg
765fb4d8502Sjsg mutex_lock(&adev->grbm_idx_mutex);
766fb4d8502Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
767*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
768fb4d8502Sjsg
769fb4d8502Sjsg val = RREG32(reg_offset);
770fb4d8502Sjsg
771fb4d8502Sjsg if (se_num != 0xffffffff || sh_num != 0xffffffff)
772*f005ef32Sjsg amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
773fb4d8502Sjsg mutex_unlock(&adev->grbm_idx_mutex);
774fb4d8502Sjsg return val;
775fb4d8502Sjsg } else {
776fb4d8502Sjsg unsigned idx;
777fb4d8502Sjsg
778fb4d8502Sjsg switch (reg_offset) {
779fb4d8502Sjsg case mmGB_ADDR_CONFIG:
780fb4d8502Sjsg return adev->gfx.config.gb_addr_config;
781fb4d8502Sjsg case mmMC_ARB_RAMCFG:
782fb4d8502Sjsg return adev->gfx.config.mc_arb_ramcfg;
783fb4d8502Sjsg case mmGB_TILE_MODE0:
784fb4d8502Sjsg case mmGB_TILE_MODE1:
785fb4d8502Sjsg case mmGB_TILE_MODE2:
786fb4d8502Sjsg case mmGB_TILE_MODE3:
787fb4d8502Sjsg case mmGB_TILE_MODE4:
788fb4d8502Sjsg case mmGB_TILE_MODE5:
789fb4d8502Sjsg case mmGB_TILE_MODE6:
790fb4d8502Sjsg case mmGB_TILE_MODE7:
791fb4d8502Sjsg case mmGB_TILE_MODE8:
792fb4d8502Sjsg case mmGB_TILE_MODE9:
793fb4d8502Sjsg case mmGB_TILE_MODE10:
794fb4d8502Sjsg case mmGB_TILE_MODE11:
795fb4d8502Sjsg case mmGB_TILE_MODE12:
796fb4d8502Sjsg case mmGB_TILE_MODE13:
797fb4d8502Sjsg case mmGB_TILE_MODE14:
798fb4d8502Sjsg case mmGB_TILE_MODE15:
799fb4d8502Sjsg case mmGB_TILE_MODE16:
800fb4d8502Sjsg case mmGB_TILE_MODE17:
801fb4d8502Sjsg case mmGB_TILE_MODE18:
802fb4d8502Sjsg case mmGB_TILE_MODE19:
803fb4d8502Sjsg case mmGB_TILE_MODE20:
804fb4d8502Sjsg case mmGB_TILE_MODE21:
805fb4d8502Sjsg case mmGB_TILE_MODE22:
806fb4d8502Sjsg case mmGB_TILE_MODE23:
807fb4d8502Sjsg case mmGB_TILE_MODE24:
808fb4d8502Sjsg case mmGB_TILE_MODE25:
809fb4d8502Sjsg case mmGB_TILE_MODE26:
810fb4d8502Sjsg case mmGB_TILE_MODE27:
811fb4d8502Sjsg case mmGB_TILE_MODE28:
812fb4d8502Sjsg case mmGB_TILE_MODE29:
813fb4d8502Sjsg case mmGB_TILE_MODE30:
814fb4d8502Sjsg case mmGB_TILE_MODE31:
815fb4d8502Sjsg idx = (reg_offset - mmGB_TILE_MODE0);
816fb4d8502Sjsg return adev->gfx.config.tile_mode_array[idx];
817fb4d8502Sjsg case mmGB_MACROTILE_MODE0:
818fb4d8502Sjsg case mmGB_MACROTILE_MODE1:
819fb4d8502Sjsg case mmGB_MACROTILE_MODE2:
820fb4d8502Sjsg case mmGB_MACROTILE_MODE3:
821fb4d8502Sjsg case mmGB_MACROTILE_MODE4:
822fb4d8502Sjsg case mmGB_MACROTILE_MODE5:
823fb4d8502Sjsg case mmGB_MACROTILE_MODE6:
824fb4d8502Sjsg case mmGB_MACROTILE_MODE7:
825fb4d8502Sjsg case mmGB_MACROTILE_MODE8:
826fb4d8502Sjsg case mmGB_MACROTILE_MODE9:
827fb4d8502Sjsg case mmGB_MACROTILE_MODE10:
828fb4d8502Sjsg case mmGB_MACROTILE_MODE11:
829fb4d8502Sjsg case mmGB_MACROTILE_MODE12:
830fb4d8502Sjsg case mmGB_MACROTILE_MODE13:
831fb4d8502Sjsg case mmGB_MACROTILE_MODE14:
832fb4d8502Sjsg case mmGB_MACROTILE_MODE15:
833fb4d8502Sjsg idx = (reg_offset - mmGB_MACROTILE_MODE0);
834fb4d8502Sjsg return adev->gfx.config.macrotile_mode_array[idx];
835fb4d8502Sjsg default:
836fb4d8502Sjsg return RREG32(reg_offset);
837fb4d8502Sjsg }
838fb4d8502Sjsg }
839fb4d8502Sjsg }
840fb4d8502Sjsg
vi_read_register(struct amdgpu_device * adev,u32 se_num,u32 sh_num,u32 reg_offset,u32 * value)841fb4d8502Sjsg static int vi_read_register(struct amdgpu_device *adev, u32 se_num,
842fb4d8502Sjsg u32 sh_num, u32 reg_offset, u32 *value)
843fb4d8502Sjsg {
844fb4d8502Sjsg uint32_t i;
845fb4d8502Sjsg
846fb4d8502Sjsg *value = 0;
847fb4d8502Sjsg for (i = 0; i < ARRAY_SIZE(vi_allowed_read_registers); i++) {
848fb4d8502Sjsg bool indexed = vi_allowed_read_registers[i].grbm_indexed;
849fb4d8502Sjsg
850fb4d8502Sjsg if (reg_offset != vi_allowed_read_registers[i].reg_offset)
851fb4d8502Sjsg continue;
852fb4d8502Sjsg
853fb4d8502Sjsg *value = vi_get_register_value(adev, indexed, se_num, sh_num,
854fb4d8502Sjsg reg_offset);
855fb4d8502Sjsg return 0;
856fb4d8502Sjsg }
857fb4d8502Sjsg return -EINVAL;
858fb4d8502Sjsg }
859fb4d8502Sjsg
8605ca02815Sjsg /**
8615ca02815Sjsg * vi_asic_pci_config_reset - soft reset GPU
8625ca02815Sjsg *
8635ca02815Sjsg * @adev: amdgpu_device pointer
8645ca02815Sjsg *
8655ca02815Sjsg * Use PCI Config method to reset the GPU.
8665ca02815Sjsg *
8675ca02815Sjsg * Returns 0 for success.
8685ca02815Sjsg */
vi_asic_pci_config_reset(struct amdgpu_device * adev)8695ca02815Sjsg static int vi_asic_pci_config_reset(struct amdgpu_device *adev)
870fb4d8502Sjsg {
871fb4d8502Sjsg u32 i;
8725ca02815Sjsg int r = -EINVAL;
873fb4d8502Sjsg
8745ca02815Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, true);
875fb4d8502Sjsg
876fb4d8502Sjsg /* disable BM */
877fb4d8502Sjsg pci_clear_master(adev->pdev);
878fb4d8502Sjsg /* reset */
879fb4d8502Sjsg amdgpu_device_pci_config_reset(adev);
880fb4d8502Sjsg
881fb4d8502Sjsg udelay(100);
882fb4d8502Sjsg
883fb4d8502Sjsg /* wait for asic to come out of reset */
884fb4d8502Sjsg for (i = 0; i < adev->usec_timeout; i++) {
885fb4d8502Sjsg if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
886fb4d8502Sjsg /* enable BM */
887fb4d8502Sjsg pci_set_master(adev->pdev);
888fb4d8502Sjsg adev->has_hw_reset = true;
8895ca02815Sjsg r = 0;
8905ca02815Sjsg break;
891fb4d8502Sjsg }
892fb4d8502Sjsg udelay(1);
893fb4d8502Sjsg }
894c349dbc7Sjsg
895c349dbc7Sjsg amdgpu_atombios_scratch_regs_engine_hung(adev, false);
896c349dbc7Sjsg
897c349dbc7Sjsg return r;
898c349dbc7Sjsg }
899c349dbc7Sjsg
vi_asic_supports_baco(struct amdgpu_device * adev)900c349dbc7Sjsg static bool vi_asic_supports_baco(struct amdgpu_device *adev)
901c349dbc7Sjsg {
902c349dbc7Sjsg switch (adev->asic_type) {
903c349dbc7Sjsg case CHIP_FIJI:
904c349dbc7Sjsg case CHIP_TONGA:
905c349dbc7Sjsg case CHIP_POLARIS10:
906c349dbc7Sjsg case CHIP_POLARIS11:
907c349dbc7Sjsg case CHIP_POLARIS12:
908c349dbc7Sjsg case CHIP_TOPAZ:
909c349dbc7Sjsg return amdgpu_dpm_is_baco_supported(adev);
910c349dbc7Sjsg default:
911c349dbc7Sjsg return false;
912c349dbc7Sjsg }
913c349dbc7Sjsg }
914c349dbc7Sjsg
915c349dbc7Sjsg static enum amd_reset_method
vi_asic_reset_method(struct amdgpu_device * adev)916c349dbc7Sjsg vi_asic_reset_method(struct amdgpu_device *adev)
917c349dbc7Sjsg {
918c349dbc7Sjsg bool baco_reset;
919c349dbc7Sjsg
920ad8b1aafSjsg if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY ||
921ad8b1aafSjsg amdgpu_reset_method == AMD_RESET_METHOD_BACO)
922ad8b1aafSjsg return amdgpu_reset_method;
923ad8b1aafSjsg
924ad8b1aafSjsg if (amdgpu_reset_method != -1)
925ad8b1aafSjsg dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
926ad8b1aafSjsg amdgpu_reset_method);
927ad8b1aafSjsg
928c349dbc7Sjsg switch (adev->asic_type) {
929c349dbc7Sjsg case CHIP_FIJI:
930c349dbc7Sjsg case CHIP_TONGA:
931c349dbc7Sjsg case CHIP_POLARIS10:
932c349dbc7Sjsg case CHIP_POLARIS11:
933c349dbc7Sjsg case CHIP_POLARIS12:
934c349dbc7Sjsg case CHIP_TOPAZ:
935c349dbc7Sjsg baco_reset = amdgpu_dpm_is_baco_supported(adev);
936c349dbc7Sjsg break;
937c349dbc7Sjsg default:
938c349dbc7Sjsg baco_reset = false;
939c349dbc7Sjsg break;
940c349dbc7Sjsg }
941c349dbc7Sjsg
942c349dbc7Sjsg if (baco_reset)
943c349dbc7Sjsg return AMD_RESET_METHOD_BACO;
944c349dbc7Sjsg else
945c349dbc7Sjsg return AMD_RESET_METHOD_LEGACY;
946c349dbc7Sjsg }
947c349dbc7Sjsg
948c349dbc7Sjsg /**
949fb4d8502Sjsg * vi_asic_reset - soft reset GPU
950fb4d8502Sjsg *
951fb4d8502Sjsg * @adev: amdgpu_device pointer
952fb4d8502Sjsg *
953fb4d8502Sjsg * Look up which blocks are hung and attempt
954fb4d8502Sjsg * to reset them.
955fb4d8502Sjsg * Returns 0 for success.
956fb4d8502Sjsg */
vi_asic_reset(struct amdgpu_device * adev)957fb4d8502Sjsg static int vi_asic_reset(struct amdgpu_device *adev)
958fb4d8502Sjsg {
959fb4d8502Sjsg int r;
960fb4d8502Sjsg
9611b8cb181Sjsg /* APUs don't have full asic reset */
9621b8cb181Sjsg if (adev->flags & AMD_IS_APU)
9631b8cb181Sjsg return 0;
9641b8cb181Sjsg
965c349dbc7Sjsg if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
966ad8b1aafSjsg dev_info(adev->dev, "BACO reset\n");
967c349dbc7Sjsg r = amdgpu_dpm_baco_reset(adev);
968c349dbc7Sjsg } else {
969ad8b1aafSjsg dev_info(adev->dev, "PCI CONFIG reset\n");
970c349dbc7Sjsg r = vi_asic_pci_config_reset(adev);
971c349dbc7Sjsg }
972fb4d8502Sjsg
973fb4d8502Sjsg return r;
974fb4d8502Sjsg }
975fb4d8502Sjsg
vi_get_config_memsize(struct amdgpu_device * adev)976fb4d8502Sjsg static u32 vi_get_config_memsize(struct amdgpu_device *adev)
977fb4d8502Sjsg {
978fb4d8502Sjsg return RREG32(mmCONFIG_MEMSIZE);
979fb4d8502Sjsg }
980fb4d8502Sjsg
vi_set_uvd_clock(struct amdgpu_device * adev,u32 clock,u32 cntl_reg,u32 status_reg)981fb4d8502Sjsg static int vi_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
982fb4d8502Sjsg u32 cntl_reg, u32 status_reg)
983fb4d8502Sjsg {
984fb4d8502Sjsg int r, i;
985fb4d8502Sjsg struct atom_clock_dividers dividers;
986fb4d8502Sjsg uint32_t tmp;
987fb4d8502Sjsg
988fb4d8502Sjsg r = amdgpu_atombios_get_clock_dividers(adev,
989fb4d8502Sjsg COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
990fb4d8502Sjsg clock, false, ÷rs);
991fb4d8502Sjsg if (r)
992fb4d8502Sjsg return r;
993fb4d8502Sjsg
994fb4d8502Sjsg tmp = RREG32_SMC(cntl_reg);
995fb4d8502Sjsg
996fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
997fb4d8502Sjsg tmp &= ~CG_DCLK_CNTL__DCLK_DIVIDER_MASK;
998fb4d8502Sjsg else
999fb4d8502Sjsg tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
1000fb4d8502Sjsg CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
1001fb4d8502Sjsg tmp |= dividers.post_divider;
1002fb4d8502Sjsg WREG32_SMC(cntl_reg, tmp);
1003fb4d8502Sjsg
1004fb4d8502Sjsg for (i = 0; i < 100; i++) {
1005fb4d8502Sjsg tmp = RREG32_SMC(status_reg);
1006fb4d8502Sjsg if (adev->flags & AMD_IS_APU) {
1007fb4d8502Sjsg if (tmp & 0x10000)
1008fb4d8502Sjsg break;
1009fb4d8502Sjsg } else {
1010fb4d8502Sjsg if (tmp & CG_DCLK_STATUS__DCLK_STATUS_MASK)
1011fb4d8502Sjsg break;
1012fb4d8502Sjsg }
1013fb4d8502Sjsg mdelay(10);
1014fb4d8502Sjsg }
1015fb4d8502Sjsg if (i == 100)
1016fb4d8502Sjsg return -ETIMEDOUT;
1017fb4d8502Sjsg return 0;
1018fb4d8502Sjsg }
1019fb4d8502Sjsg
1020fb4d8502Sjsg #define ixGNB_CLK1_DFS_CNTL 0xD82200F0
1021fb4d8502Sjsg #define ixGNB_CLK1_STATUS 0xD822010C
1022fb4d8502Sjsg #define ixGNB_CLK2_DFS_CNTL 0xD8220110
1023fb4d8502Sjsg #define ixGNB_CLK2_STATUS 0xD822012C
1024fb4d8502Sjsg #define ixGNB_CLK3_DFS_CNTL 0xD8220130
1025fb4d8502Sjsg #define ixGNB_CLK3_STATUS 0xD822014C
1026fb4d8502Sjsg
vi_set_uvd_clocks(struct amdgpu_device * adev,u32 vclk,u32 dclk)1027fb4d8502Sjsg static int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1028fb4d8502Sjsg {
1029fb4d8502Sjsg int r;
1030fb4d8502Sjsg
1031fb4d8502Sjsg if (adev->flags & AMD_IS_APU) {
1032fb4d8502Sjsg r = vi_set_uvd_clock(adev, vclk, ixGNB_CLK2_DFS_CNTL, ixGNB_CLK2_STATUS);
1033fb4d8502Sjsg if (r)
1034fb4d8502Sjsg return r;
1035fb4d8502Sjsg
1036fb4d8502Sjsg r = vi_set_uvd_clock(adev, dclk, ixGNB_CLK1_DFS_CNTL, ixGNB_CLK1_STATUS);
1037fb4d8502Sjsg if (r)
1038fb4d8502Sjsg return r;
1039fb4d8502Sjsg } else {
1040fb4d8502Sjsg r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
1041fb4d8502Sjsg if (r)
1042fb4d8502Sjsg return r;
1043fb4d8502Sjsg
1044fb4d8502Sjsg r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
1045fb4d8502Sjsg if (r)
1046fb4d8502Sjsg return r;
1047fb4d8502Sjsg }
1048fb4d8502Sjsg
1049fb4d8502Sjsg return 0;
1050fb4d8502Sjsg }
1051fb4d8502Sjsg
vi_set_vce_clocks(struct amdgpu_device * adev,u32 evclk,u32 ecclk)1052fb4d8502Sjsg static int vi_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
1053fb4d8502Sjsg {
1054fb4d8502Sjsg int r, i;
1055fb4d8502Sjsg struct atom_clock_dividers dividers;
1056fb4d8502Sjsg u32 tmp;
1057fb4d8502Sjsg u32 reg_ctrl;
1058fb4d8502Sjsg u32 reg_status;
1059fb4d8502Sjsg u32 status_mask;
1060fb4d8502Sjsg u32 reg_mask;
1061fb4d8502Sjsg
1062fb4d8502Sjsg if (adev->flags & AMD_IS_APU) {
1063fb4d8502Sjsg reg_ctrl = ixGNB_CLK3_DFS_CNTL;
1064fb4d8502Sjsg reg_status = ixGNB_CLK3_STATUS;
1065fb4d8502Sjsg status_mask = 0x00010000;
1066fb4d8502Sjsg reg_mask = CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
1067fb4d8502Sjsg } else {
1068fb4d8502Sjsg reg_ctrl = ixCG_ECLK_CNTL;
1069fb4d8502Sjsg reg_status = ixCG_ECLK_STATUS;
1070fb4d8502Sjsg status_mask = CG_ECLK_STATUS__ECLK_STATUS_MASK;
1071fb4d8502Sjsg reg_mask = CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK | CG_ECLK_CNTL__ECLK_DIVIDER_MASK;
1072fb4d8502Sjsg }
1073fb4d8502Sjsg
1074fb4d8502Sjsg r = amdgpu_atombios_get_clock_dividers(adev,
1075fb4d8502Sjsg COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
1076fb4d8502Sjsg ecclk, false, ÷rs);
1077fb4d8502Sjsg if (r)
1078fb4d8502Sjsg return r;
1079fb4d8502Sjsg
1080fb4d8502Sjsg for (i = 0; i < 100; i++) {
1081fb4d8502Sjsg if (RREG32_SMC(reg_status) & status_mask)
1082fb4d8502Sjsg break;
1083fb4d8502Sjsg mdelay(10);
1084fb4d8502Sjsg }
1085fb4d8502Sjsg
1086fb4d8502Sjsg if (i == 100)
1087fb4d8502Sjsg return -ETIMEDOUT;
1088fb4d8502Sjsg
1089fb4d8502Sjsg tmp = RREG32_SMC(reg_ctrl);
1090fb4d8502Sjsg tmp &= ~reg_mask;
1091fb4d8502Sjsg tmp |= dividers.post_divider;
1092fb4d8502Sjsg WREG32_SMC(reg_ctrl, tmp);
1093fb4d8502Sjsg
1094fb4d8502Sjsg for (i = 0; i < 100; i++) {
1095fb4d8502Sjsg if (RREG32_SMC(reg_status) & status_mask)
1096fb4d8502Sjsg break;
1097fb4d8502Sjsg mdelay(10);
1098fb4d8502Sjsg }
1099fb4d8502Sjsg
1100fb4d8502Sjsg if (i == 100)
1101fb4d8502Sjsg return -ETIMEDOUT;
1102fb4d8502Sjsg
1103fb4d8502Sjsg return 0;
1104fb4d8502Sjsg }
1105fb4d8502Sjsg
vi_enable_aspm(struct amdgpu_device * adev)11065ca02815Sjsg static void vi_enable_aspm(struct amdgpu_device *adev)
11075ca02815Sjsg {
11085ca02815Sjsg u32 data, orig;
11095ca02815Sjsg
11105ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
11115ca02815Sjsg data |= PCIE_LC_CNTL__LC_L0S_INACTIVITY_DEFAULT <<
11125ca02815Sjsg PCIE_LC_CNTL__LC_L0S_INACTIVITY__SHIFT;
11135ca02815Sjsg data |= PCIE_LC_CNTL__LC_L1_INACTIVITY_DEFAULT <<
11145ca02815Sjsg PCIE_LC_CNTL__LC_L1_INACTIVITY__SHIFT;
11155ca02815Sjsg data &= ~PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
11165ca02815Sjsg data |= PCIE_LC_CNTL__LC_DELAY_L1_EXIT_MASK;
11175ca02815Sjsg if (orig != data)
11185ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
11195ca02815Sjsg }
11205ca02815Sjsg
vi_program_aspm(struct amdgpu_device * adev)1121fb4d8502Sjsg static void vi_program_aspm(struct amdgpu_device *adev)
1122fb4d8502Sjsg {
11235ca02815Sjsg u32 data, data1, orig;
11245ca02815Sjsg bool bL1SS = false;
11255ca02815Sjsg bool bClkReqSupport = true;
1126fb4d8502Sjsg
11274561fb9fSjsg if (!amdgpu_device_should_use_aspm(adev) || !amdgpu_device_pcie_dynamic_switching_supported())
1128fb4d8502Sjsg return;
1129fb4d8502Sjsg
11305ca02815Sjsg if (adev->flags & AMD_IS_APU ||
11315ca02815Sjsg adev->asic_type < CHIP_POLARIS10)
11325ca02815Sjsg return;
11335ca02815Sjsg
11345ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
11355ca02815Sjsg data &= ~PCIE_LC_CNTL__LC_L1_INACTIVITY_MASK;
11365ca02815Sjsg data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
11375ca02815Sjsg data |= PCIE_LC_CNTL__LC_PMI_TO_L1_DIS_MASK;
11385ca02815Sjsg if (orig != data)
11395ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
11405ca02815Sjsg
11415ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
11425ca02815Sjsg data &= ~PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_MASK;
11435ca02815Sjsg data |= 0x0024 << PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS__SHIFT;
11445ca02815Sjsg data |= PCIE_LC_N_FTS_CNTL__LC_XMIT_N_FTS_OVERRIDE_EN_MASK;
11455ca02815Sjsg if (orig != data)
11465ca02815Sjsg WREG32_PCIE(ixPCIE_LC_N_FTS_CNTL, data);
11475ca02815Sjsg
11485ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL3);
11495ca02815Sjsg data |= PCIE_LC_CNTL3__LC_GO_TO_RECOVERY_MASK;
11505ca02815Sjsg if (orig != data)
11515ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL3, data);
11525ca02815Sjsg
11535ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_P_CNTL);
11545ca02815Sjsg data |= PCIE_P_CNTL__P_IGNORE_EDB_ERR_MASK;
11555ca02815Sjsg if (orig != data)
11565ca02815Sjsg WREG32_PCIE(ixPCIE_P_CNTL, data);
11575ca02815Sjsg
11585ca02815Sjsg data = RREG32_PCIE(ixPCIE_LC_L1_PM_SUBSTATE);
11595ca02815Sjsg pci_read_config_dword(adev->pdev, PCIE_L1_PM_SUB_CNTL, &data1);
11605ca02815Sjsg if (data & PCIE_LC_L1_PM_SUBSTATE__LC_L1_SUBSTATES_OVERRIDE_EN_MASK &&
11615ca02815Sjsg (data & (PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_2_OVERRIDE_MASK |
11625ca02815Sjsg PCIE_LC_L1_PM_SUBSTATE__LC_PCI_PM_L1_1_OVERRIDE_MASK |
11635ca02815Sjsg PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_2_OVERRIDE_MASK |
11645ca02815Sjsg PCIE_LC_L1_PM_SUBSTATE__LC_ASPM_L1_1_OVERRIDE_MASK))) {
11655ca02815Sjsg bL1SS = true;
11665ca02815Sjsg } else if (data1 & (PCIE_L1_PM_SUB_CNTL__ASPM_L1_2_EN_MASK |
11675ca02815Sjsg PCIE_L1_PM_SUB_CNTL__ASPM_L1_1_EN_MASK |
11685ca02815Sjsg PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_2_EN_MASK |
11695ca02815Sjsg PCIE_L1_PM_SUB_CNTL__PCI_PM_L1_1_EN_MASK)) {
11705ca02815Sjsg bL1SS = true;
11715ca02815Sjsg }
11725ca02815Sjsg
11735ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL6);
11745ca02815Sjsg data |= PCIE_LC_CNTL6__LC_L1_POWERDOWN_MASK;
11755ca02815Sjsg if (orig != data)
11765ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL6, data);
11775ca02815Sjsg
11785ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL);
11795ca02815Sjsg data |= PCIE_LC_LINK_WIDTH_CNTL__LC_DYN_LANES_PWR_STATE_MASK;
11805ca02815Sjsg if (orig != data)
11815ca02815Sjsg WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
11825ca02815Sjsg
11835ca02815Sjsg pci_read_config_dword(adev->pdev, LINK_CAP, &data);
11845ca02815Sjsg if (!(data & PCIE_LINK_CAP__CLOCK_POWER_MANAGEMENT_MASK))
11855ca02815Sjsg bClkReqSupport = false;
11865ca02815Sjsg
11875ca02815Sjsg if (bClkReqSupport) {
11885ca02815Sjsg orig = data = RREG32_SMC(ixTHM_CLK_CNTL);
11895ca02815Sjsg data &= ~(THM_CLK_CNTL__CMON_CLK_SEL_MASK | THM_CLK_CNTL__TMON_CLK_SEL_MASK);
11905ca02815Sjsg data |= (1 << THM_CLK_CNTL__CMON_CLK_SEL__SHIFT) |
11915ca02815Sjsg (1 << THM_CLK_CNTL__TMON_CLK_SEL__SHIFT);
11925ca02815Sjsg if (orig != data)
11935ca02815Sjsg WREG32_SMC(ixTHM_CLK_CNTL, data);
11945ca02815Sjsg
11955ca02815Sjsg orig = data = RREG32_SMC(ixMISC_CLK_CTRL);
11965ca02815Sjsg data &= ~(MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL_MASK |
11975ca02815Sjsg MISC_CLK_CTRL__ZCLK_SEL_MASK | MISC_CLK_CTRL__DFT_SMS_PG_CLK_SEL_MASK);
11985ca02815Sjsg data |= (1 << MISC_CLK_CTRL__DEEP_SLEEP_CLK_SEL__SHIFT) |
11995ca02815Sjsg (1 << MISC_CLK_CTRL__ZCLK_SEL__SHIFT);
12005ca02815Sjsg data |= (0x20 << MISC_CLK_CTRL__DFT_SMS_PG_CLK_SEL__SHIFT);
12015ca02815Sjsg if (orig != data)
12025ca02815Sjsg WREG32_SMC(ixMISC_CLK_CTRL, data);
12035ca02815Sjsg
12045ca02815Sjsg orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL);
12055ca02815Sjsg data |= CG_CLKPIN_CNTL__XTALIN_DIVIDE_MASK;
12065ca02815Sjsg if (orig != data)
12075ca02815Sjsg WREG32_SMC(ixCG_CLKPIN_CNTL, data);
12085ca02815Sjsg
12095ca02815Sjsg orig = data = RREG32_SMC(ixCG_CLKPIN_CNTL_2);
12105ca02815Sjsg data |= CG_CLKPIN_CNTL_2__ENABLE_XCLK_MASK;
12115ca02815Sjsg if (orig != data)
12125ca02815Sjsg WREG32_SMC(ixCG_CLKPIN_CNTL, data);
12135ca02815Sjsg
12145ca02815Sjsg orig = data = RREG32_SMC(ixMPLL_BYPASSCLK_SEL);
12155ca02815Sjsg data &= ~MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL_MASK;
12165ca02815Sjsg data |= (4 << MPLL_BYPASSCLK_SEL__MPLL_CLKOUT_SEL__SHIFT);
12175ca02815Sjsg if (orig != data)
12185ca02815Sjsg WREG32_SMC(ixMPLL_BYPASSCLK_SEL, data);
12195ca02815Sjsg
12205ca02815Sjsg orig = data = RREG32_PCIE(ixCPM_CONTROL);
12215ca02815Sjsg data |= (CPM_CONTROL__REFCLK_XSTCLK_ENABLE_MASK |
12225ca02815Sjsg CPM_CONTROL__CLKREQb_UNGATE_TXCLK_ENABLE_MASK);
12235ca02815Sjsg if (orig != data)
12245ca02815Sjsg WREG32_PCIE(ixCPM_CONTROL, data);
12255ca02815Sjsg
12265ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_CONFIG_CNTL);
12275ca02815Sjsg data &= ~PCIE_CONFIG_CNTL__DYN_CLK_LATENCY_MASK;
12285ca02815Sjsg data |= (0xE << PCIE_CONFIG_CNTL__DYN_CLK_LATENCY__SHIFT);
12295ca02815Sjsg if (orig != data)
12305ca02815Sjsg WREG32_PCIE(ixPCIE_CONFIG_CNTL, data);
12315ca02815Sjsg
12325ca02815Sjsg orig = data = RREG32(mmBIF_CLK_CTRL);
12335ca02815Sjsg data |= BIF_CLK_CTRL__BIF_XSTCLK_READY_MASK;
12345ca02815Sjsg if (orig != data)
12355ca02815Sjsg WREG32(mmBIF_CLK_CTRL, data);
12365ca02815Sjsg
12375ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL7);
12385ca02815Sjsg data |= PCIE_LC_CNTL7__LC_L1_SIDEBAND_CLKREQ_PDWN_EN_MASK;
12395ca02815Sjsg if (orig != data)
12405ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL7, data);
12415ca02815Sjsg
12425ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_HW_DEBUG);
12435ca02815Sjsg data |= PCIE_HW_DEBUG__HW_01_DEBUG_MASK;
12445ca02815Sjsg if (orig != data)
12455ca02815Sjsg WREG32_PCIE(ixPCIE_HW_DEBUG, data);
12465ca02815Sjsg
12475ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL2);
12485ca02815Sjsg data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L23_MASK;
12495ca02815Sjsg data |= PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK;
12505ca02815Sjsg if (bL1SS)
12515ca02815Sjsg data &= ~PCIE_LC_CNTL2__LC_ALLOW_PDWN_IN_L1_MASK;
12525ca02815Sjsg if (orig != data)
12535ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL2, data);
12545ca02815Sjsg
12555ca02815Sjsg }
12565ca02815Sjsg
12575ca02815Sjsg vi_enable_aspm(adev);
12585ca02815Sjsg
12595ca02815Sjsg data = RREG32_PCIE(ixPCIE_LC_N_FTS_CNTL);
12605ca02815Sjsg data1 = RREG32_PCIE(ixPCIE_LC_STATUS1);
12615ca02815Sjsg if (((data & PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) == PCIE_LC_N_FTS_CNTL__LC_N_FTS_MASK) &&
12625ca02815Sjsg data1 & PCIE_LC_STATUS1__LC_REVERSE_XMIT_MASK &&
12635ca02815Sjsg data1 & PCIE_LC_STATUS1__LC_REVERSE_RCVR_MASK) {
12645ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_CNTL);
12655ca02815Sjsg data &= ~PCIE_LC_CNTL__LC_L0S_INACTIVITY_MASK;
12665ca02815Sjsg if (orig != data)
12675ca02815Sjsg WREG32_PCIE(ixPCIE_LC_CNTL, data);
12685ca02815Sjsg }
12695ca02815Sjsg
12705ca02815Sjsg if ((adev->asic_type == CHIP_POLARIS12 &&
12715ca02815Sjsg !(ASICID_IS_P23(adev->pdev->device, adev->pdev->revision))) ||
12725ca02815Sjsg ASIC_IS_P22(adev->asic_type, adev->external_rev_id)) {
12735ca02815Sjsg orig = data = RREG32_PCIE(ixPCIE_LC_TRAINING_CNTL);
12745ca02815Sjsg data &= ~PCIE_LC_TRAINING_CNTL__LC_DISABLE_TRAINING_BIT_ARCH_MASK;
12755ca02815Sjsg if (orig != data)
12765ca02815Sjsg WREG32_PCIE(ixPCIE_LC_TRAINING_CNTL, data);
12775ca02815Sjsg }
1278fb4d8502Sjsg }
1279fb4d8502Sjsg
vi_enable_doorbell_aperture(struct amdgpu_device * adev,bool enable)1280fb4d8502Sjsg static void vi_enable_doorbell_aperture(struct amdgpu_device *adev,
1281fb4d8502Sjsg bool enable)
1282fb4d8502Sjsg {
1283fb4d8502Sjsg u32 tmp;
1284fb4d8502Sjsg
1285fb4d8502Sjsg /* not necessary on CZ */
1286fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1287fb4d8502Sjsg return;
1288fb4d8502Sjsg
1289fb4d8502Sjsg tmp = RREG32(mmBIF_DOORBELL_APER_EN);
1290fb4d8502Sjsg if (enable)
1291fb4d8502Sjsg tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 1);
1292fb4d8502Sjsg else
1293fb4d8502Sjsg tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 0);
1294fb4d8502Sjsg
1295fb4d8502Sjsg WREG32(mmBIF_DOORBELL_APER_EN, tmp);
1296fb4d8502Sjsg }
1297fb4d8502Sjsg
1298fb4d8502Sjsg #define ATI_REV_ID_FUSE_MACRO__ADDRESS 0xC0014044
1299fb4d8502Sjsg #define ATI_REV_ID_FUSE_MACRO__SHIFT 9
1300fb4d8502Sjsg #define ATI_REV_ID_FUSE_MACRO__MASK 0x00001E00
1301fb4d8502Sjsg
vi_get_rev_id(struct amdgpu_device * adev)1302fb4d8502Sjsg static uint32_t vi_get_rev_id(struct amdgpu_device *adev)
1303fb4d8502Sjsg {
1304fb4d8502Sjsg if (adev->flags & AMD_IS_APU)
1305fb4d8502Sjsg return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK)
1306fb4d8502Sjsg >> ATI_REV_ID_FUSE_MACRO__SHIFT;
1307fb4d8502Sjsg else
1308fb4d8502Sjsg return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK)
1309fb4d8502Sjsg >> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT;
1310fb4d8502Sjsg }
1311fb4d8502Sjsg
vi_flush_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1312fb4d8502Sjsg static void vi_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
1313fb4d8502Sjsg {
1314fb4d8502Sjsg if (!ring || !ring->funcs->emit_wreg) {
1315fb4d8502Sjsg WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1316fb4d8502Sjsg RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
1317fb4d8502Sjsg } else {
1318fb4d8502Sjsg amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
1319fb4d8502Sjsg }
1320fb4d8502Sjsg }
1321fb4d8502Sjsg
vi_invalidate_hdp(struct amdgpu_device * adev,struct amdgpu_ring * ring)1322fb4d8502Sjsg static void vi_invalidate_hdp(struct amdgpu_device *adev,
1323fb4d8502Sjsg struct amdgpu_ring *ring)
1324fb4d8502Sjsg {
1325fb4d8502Sjsg if (!ring || !ring->funcs->emit_wreg) {
1326fb4d8502Sjsg WREG32(mmHDP_DEBUG0, 1);
1327fb4d8502Sjsg RREG32(mmHDP_DEBUG0);
1328fb4d8502Sjsg } else {
1329fb4d8502Sjsg amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
1330fb4d8502Sjsg }
1331fb4d8502Sjsg }
1332fb4d8502Sjsg
vi_need_full_reset(struct amdgpu_device * adev)1333fb4d8502Sjsg static bool vi_need_full_reset(struct amdgpu_device *adev)
1334fb4d8502Sjsg {
1335fb4d8502Sjsg switch (adev->asic_type) {
1336fb4d8502Sjsg case CHIP_CARRIZO:
1337fb4d8502Sjsg case CHIP_STONEY:
1338fb4d8502Sjsg /* CZ has hang issues with full reset at the moment */
1339fb4d8502Sjsg return false;
1340fb4d8502Sjsg case CHIP_FIJI:
1341fb4d8502Sjsg case CHIP_TONGA:
1342fb4d8502Sjsg /* XXX: soft reset should work on fiji and tonga */
1343fb4d8502Sjsg return true;
1344fb4d8502Sjsg case CHIP_POLARIS10:
1345fb4d8502Sjsg case CHIP_POLARIS11:
1346fb4d8502Sjsg case CHIP_POLARIS12:
1347fb4d8502Sjsg case CHIP_TOPAZ:
1348fb4d8502Sjsg default:
1349fb4d8502Sjsg /* change this when we support soft reset */
1350fb4d8502Sjsg return true;
1351fb4d8502Sjsg }
1352fb4d8502Sjsg }
1353fb4d8502Sjsg
vi_get_pcie_usage(struct amdgpu_device * adev,uint64_t * count0,uint64_t * count1)1354c349dbc7Sjsg static void vi_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
1355c349dbc7Sjsg uint64_t *count1)
1356c349dbc7Sjsg {
1357c349dbc7Sjsg uint32_t perfctr = 0;
1358c349dbc7Sjsg uint64_t cnt0_of, cnt1_of;
1359c349dbc7Sjsg int tmp;
1360c349dbc7Sjsg
1361c349dbc7Sjsg /* This reports 0 on APUs, so return to avoid writing/reading registers
1362c349dbc7Sjsg * that may or may not be different from their GPU counterparts
1363c349dbc7Sjsg */
1364c349dbc7Sjsg if (adev->flags & AMD_IS_APU)
1365c349dbc7Sjsg return;
1366c349dbc7Sjsg
1367c349dbc7Sjsg /* Set the 2 events that we wish to watch, defined above */
1368c349dbc7Sjsg /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
1369c349dbc7Sjsg perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
1370c349dbc7Sjsg perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
1371c349dbc7Sjsg
1372c349dbc7Sjsg /* Write to enable desired perf counters */
1373c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
1374c349dbc7Sjsg /* Zero out and enable the perf counters
1375c349dbc7Sjsg * Write 0x5:
1376c349dbc7Sjsg * Bit 0 = Start all counters(1)
1377c349dbc7Sjsg * Bit 2 = Global counter reset enable(1)
1378c349dbc7Sjsg */
1379c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
1380c349dbc7Sjsg
1381c349dbc7Sjsg drm_msleep(1000);
1382c349dbc7Sjsg
1383c349dbc7Sjsg /* Load the shadow and disable the perf counters
1384c349dbc7Sjsg * Write 0x2:
1385c349dbc7Sjsg * Bit 0 = Stop counters(0)
1386c349dbc7Sjsg * Bit 1 = Load the shadow counters(1)
1387c349dbc7Sjsg */
1388c349dbc7Sjsg WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
1389c349dbc7Sjsg
1390c349dbc7Sjsg /* Read register values to get any >32bit overflow */
1391c349dbc7Sjsg tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
1392c349dbc7Sjsg cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
1393c349dbc7Sjsg cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
1394c349dbc7Sjsg
1395c349dbc7Sjsg /* Get the values and add the overflow */
1396c349dbc7Sjsg *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
1397c349dbc7Sjsg *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
1398c349dbc7Sjsg }
1399c349dbc7Sjsg
vi_get_pcie_replay_count(struct amdgpu_device * adev)1400c349dbc7Sjsg static uint64_t vi_get_pcie_replay_count(struct amdgpu_device *adev)
1401c349dbc7Sjsg {
1402c349dbc7Sjsg uint64_t nak_r, nak_g;
1403c349dbc7Sjsg
1404c349dbc7Sjsg /* Get the number of NAKs received and generated */
1405c349dbc7Sjsg nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
1406c349dbc7Sjsg nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
1407c349dbc7Sjsg
1408c349dbc7Sjsg /* Add the total number of NAKs, i.e the number of replays */
1409c349dbc7Sjsg return (nak_r + nak_g);
1410c349dbc7Sjsg }
1411c349dbc7Sjsg
vi_need_reset_on_init(struct amdgpu_device * adev)1412c349dbc7Sjsg static bool vi_need_reset_on_init(struct amdgpu_device *adev)
1413c349dbc7Sjsg {
1414c349dbc7Sjsg u32 clock_cntl, pc;
1415c349dbc7Sjsg
1416c349dbc7Sjsg if (adev->flags & AMD_IS_APU)
1417c349dbc7Sjsg return false;
1418c349dbc7Sjsg
1419c349dbc7Sjsg /* check if the SMC is already running */
1420c349dbc7Sjsg clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
1421c349dbc7Sjsg pc = RREG32_SMC(ixSMC_PC_C);
1422c349dbc7Sjsg if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) &&
1423c349dbc7Sjsg (0x20100 <= pc))
1424c349dbc7Sjsg return true;
1425c349dbc7Sjsg
1426c349dbc7Sjsg return false;
1427c349dbc7Sjsg }
1428c349dbc7Sjsg
vi_pre_asic_init(struct amdgpu_device * adev)1429ad8b1aafSjsg static void vi_pre_asic_init(struct amdgpu_device *adev)
1430ad8b1aafSjsg {
1431ad8b1aafSjsg }
1432ad8b1aafSjsg
1433fb4d8502Sjsg static const struct amdgpu_asic_funcs vi_asic_funcs =
1434fb4d8502Sjsg {
1435fb4d8502Sjsg .read_disabled_bios = &vi_read_disabled_bios,
1436fb4d8502Sjsg .read_bios_from_rom = &vi_read_bios_from_rom,
1437fb4d8502Sjsg .read_register = &vi_read_register,
1438fb4d8502Sjsg .reset = &vi_asic_reset,
1439c349dbc7Sjsg .reset_method = &vi_asic_reset_method,
1440fb4d8502Sjsg .get_xclk = &vi_get_xclk,
1441fb4d8502Sjsg .set_uvd_clocks = &vi_set_uvd_clocks,
1442fb4d8502Sjsg .set_vce_clocks = &vi_set_vce_clocks,
1443fb4d8502Sjsg .get_config_memsize = &vi_get_config_memsize,
1444fb4d8502Sjsg .flush_hdp = &vi_flush_hdp,
1445fb4d8502Sjsg .invalidate_hdp = &vi_invalidate_hdp,
1446fb4d8502Sjsg .need_full_reset = &vi_need_full_reset,
1447c349dbc7Sjsg .init_doorbell_index = &legacy_doorbell_index_init,
1448c349dbc7Sjsg .get_pcie_usage = &vi_get_pcie_usage,
1449c349dbc7Sjsg .need_reset_on_init = &vi_need_reset_on_init,
1450c349dbc7Sjsg .get_pcie_replay_count = &vi_get_pcie_replay_count,
1451c349dbc7Sjsg .supports_baco = &vi_asic_supports_baco,
1452ad8b1aafSjsg .pre_asic_init = &vi_pre_asic_init,
14535ca02815Sjsg .query_video_codecs = &vi_query_video_codecs,
1454fb4d8502Sjsg };
1455fb4d8502Sjsg
1456fb4d8502Sjsg #define CZ_REV_BRISTOL(rev) \
1457fb4d8502Sjsg ((rev >= 0xC8 && rev <= 0xCE) || (rev >= 0xE1 && rev <= 0xE6))
1458fb4d8502Sjsg
vi_common_early_init(void * handle)1459fb4d8502Sjsg static int vi_common_early_init(void *handle)
1460fb4d8502Sjsg {
1461fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1462fb4d8502Sjsg
1463fb4d8502Sjsg if (adev->flags & AMD_IS_APU) {
1464fb4d8502Sjsg adev->smc_rreg = &cz_smc_rreg;
1465fb4d8502Sjsg adev->smc_wreg = &cz_smc_wreg;
1466fb4d8502Sjsg } else {
1467fb4d8502Sjsg adev->smc_rreg = &vi_smc_rreg;
1468fb4d8502Sjsg adev->smc_wreg = &vi_smc_wreg;
1469fb4d8502Sjsg }
1470fb4d8502Sjsg adev->pcie_rreg = &vi_pcie_rreg;
1471fb4d8502Sjsg adev->pcie_wreg = &vi_pcie_wreg;
1472fb4d8502Sjsg adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg;
1473fb4d8502Sjsg adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg;
1474fb4d8502Sjsg adev->didt_rreg = &vi_didt_rreg;
1475fb4d8502Sjsg adev->didt_wreg = &vi_didt_wreg;
1476fb4d8502Sjsg adev->gc_cac_rreg = &vi_gc_cac_rreg;
1477fb4d8502Sjsg adev->gc_cac_wreg = &vi_gc_cac_wreg;
1478fb4d8502Sjsg
1479fb4d8502Sjsg adev->asic_funcs = &vi_asic_funcs;
1480fb4d8502Sjsg
1481fb4d8502Sjsg adev->rev_id = vi_get_rev_id(adev);
1482fb4d8502Sjsg adev->external_rev_id = 0xFF;
1483fb4d8502Sjsg switch (adev->asic_type) {
1484fb4d8502Sjsg case CHIP_TOPAZ:
1485fb4d8502Sjsg adev->cg_flags = 0;
1486fb4d8502Sjsg adev->pg_flags = 0;
1487fb4d8502Sjsg adev->external_rev_id = 0x1;
1488fb4d8502Sjsg break;
1489fb4d8502Sjsg case CHIP_FIJI:
1490fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1491fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
1492fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1493fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1494fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
1495fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
1496fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1497fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1498fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1499fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1500fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1501fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1502fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1503fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1504fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1505fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1506fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG;
1507fb4d8502Sjsg adev->pg_flags = 0;
1508fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x3c;
1509fb4d8502Sjsg break;
1510fb4d8502Sjsg case CHIP_TONGA:
1511fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1512fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1513fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1514fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1515fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1516fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1517fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1518fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1519fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1520fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1521fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1522fb4d8502Sjsg AMD_CG_SUPPORT_DRM_LS |
1523fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG;
1524fb4d8502Sjsg adev->pg_flags = 0;
1525fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x14;
1526fb4d8502Sjsg break;
1527fb4d8502Sjsg case CHIP_POLARIS11:
1528fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1529fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1530fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1531fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1532fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1533fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
1534fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
1535fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1536fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1537fb4d8502Sjsg AMD_CG_SUPPORT_BIF_MGCG |
1538fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1539fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1540fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1541fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1542fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1543fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1544fb4d8502Sjsg AMD_CG_SUPPORT_DRM_LS |
1545fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
1546fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;
1547fb4d8502Sjsg adev->pg_flags = 0;
1548fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x5A;
1549fb4d8502Sjsg break;
1550fb4d8502Sjsg case CHIP_POLARIS10:
1551fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1552fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1553fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1554fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1555fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1556fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
1557fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
1558fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1559fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1560fb4d8502Sjsg AMD_CG_SUPPORT_BIF_MGCG |
1561fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1562fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1563fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1564fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1565fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1566fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1567fb4d8502Sjsg AMD_CG_SUPPORT_DRM_LS |
1568fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
1569fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;
1570fb4d8502Sjsg adev->pg_flags = 0;
1571fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x50;
1572fb4d8502Sjsg break;
1573fb4d8502Sjsg case CHIP_POLARIS12:
1574fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
1575fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1576fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1577fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1578fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1579fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
1580fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
1581fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1582fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1583fb4d8502Sjsg AMD_CG_SUPPORT_BIF_MGCG |
1584fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1585fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1586fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1587fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1588fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1589fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1590fb4d8502Sjsg AMD_CG_SUPPORT_DRM_LS |
1591fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
1592fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;
1593fb4d8502Sjsg adev->pg_flags = 0;
1594fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x64;
1595fb4d8502Sjsg break;
1596fb4d8502Sjsg case CHIP_VEGAM:
1597fb4d8502Sjsg adev->cg_flags = 0;
1598fb4d8502Sjsg /*AMD_CG_SUPPORT_GFX_MGCG |
1599fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1600fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1601fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1602fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1603fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGCG |
1604fb4d8502Sjsg AMD_CG_SUPPORT_GFX_3D_CGLS |
1605fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1606fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1607fb4d8502Sjsg AMD_CG_SUPPORT_BIF_MGCG |
1608fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1609fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1610fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1611fb4d8502Sjsg AMD_CG_SUPPORT_ROM_MGCG |
1612fb4d8502Sjsg AMD_CG_SUPPORT_MC_MGCG |
1613fb4d8502Sjsg AMD_CG_SUPPORT_MC_LS |
1614fb4d8502Sjsg AMD_CG_SUPPORT_DRM_LS |
1615fb4d8502Sjsg AMD_CG_SUPPORT_UVD_MGCG |
1616fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;*/
1617fb4d8502Sjsg adev->pg_flags = 0;
1618fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x6E;
1619fb4d8502Sjsg break;
1620fb4d8502Sjsg case CHIP_CARRIZO:
1621fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
1622fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
1623fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
1624fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1625fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1626fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
1627fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
1628fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGCG |
1629fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1630fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1631fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1632fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1633fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1634fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1635fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;
1636fb4d8502Sjsg /* rev0 hardware requires workarounds to support PG */
1637fb4d8502Sjsg adev->pg_flags = 0;
1638fb4d8502Sjsg if (adev->rev_id != 0x00 || CZ_REV_BRISTOL(adev->pdev->revision)) {
1639fb4d8502Sjsg adev->pg_flags |= AMD_PG_SUPPORT_GFX_SMG |
1640fb4d8502Sjsg AMD_PG_SUPPORT_GFX_PIPELINE |
1641fb4d8502Sjsg AMD_PG_SUPPORT_CP |
1642fb4d8502Sjsg AMD_PG_SUPPORT_UVD |
1643fb4d8502Sjsg AMD_PG_SUPPORT_VCE;
1644fb4d8502Sjsg }
1645fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x1;
1646fb4d8502Sjsg break;
1647fb4d8502Sjsg case CHIP_STONEY:
1648fb4d8502Sjsg adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
1649fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGCG |
1650fb4d8502Sjsg AMD_CG_SUPPORT_GFX_MGLS |
1651fb4d8502Sjsg AMD_CG_SUPPORT_GFX_RLC_LS |
1652fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CP_LS |
1653fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS |
1654fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGTS_LS |
1655fb4d8502Sjsg AMD_CG_SUPPORT_GFX_CGLS |
1656fb4d8502Sjsg AMD_CG_SUPPORT_BIF_LS |
1657fb4d8502Sjsg AMD_CG_SUPPORT_HDP_MGCG |
1658fb4d8502Sjsg AMD_CG_SUPPORT_HDP_LS |
1659fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_MGCG |
1660fb4d8502Sjsg AMD_CG_SUPPORT_SDMA_LS |
1661fb4d8502Sjsg AMD_CG_SUPPORT_VCE_MGCG;
1662fb4d8502Sjsg adev->pg_flags = AMD_PG_SUPPORT_GFX_PG |
1663fb4d8502Sjsg AMD_PG_SUPPORT_GFX_SMG |
1664fb4d8502Sjsg AMD_PG_SUPPORT_GFX_PIPELINE |
1665fb4d8502Sjsg AMD_PG_SUPPORT_CP |
1666fb4d8502Sjsg AMD_PG_SUPPORT_UVD |
1667fb4d8502Sjsg AMD_PG_SUPPORT_VCE;
1668fb4d8502Sjsg adev->external_rev_id = adev->rev_id + 0x61;
1669fb4d8502Sjsg break;
1670fb4d8502Sjsg default:
1671fb4d8502Sjsg /* FIXME: not supported yet */
1672fb4d8502Sjsg return -EINVAL;
1673fb4d8502Sjsg }
1674fb4d8502Sjsg
1675fb4d8502Sjsg if (amdgpu_sriov_vf(adev)) {
1676fb4d8502Sjsg amdgpu_virt_init_setting(adev);
1677fb4d8502Sjsg xgpu_vi_mailbox_set_irq_funcs(adev);
1678fb4d8502Sjsg }
1679fb4d8502Sjsg
1680fb4d8502Sjsg return 0;
1681fb4d8502Sjsg }
1682fb4d8502Sjsg
vi_common_late_init(void * handle)1683fb4d8502Sjsg static int vi_common_late_init(void *handle)
1684fb4d8502Sjsg {
1685fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1686fb4d8502Sjsg
1687fb4d8502Sjsg if (amdgpu_sriov_vf(adev))
1688fb4d8502Sjsg xgpu_vi_mailbox_get_irq(adev);
1689fb4d8502Sjsg
1690fb4d8502Sjsg return 0;
1691fb4d8502Sjsg }
1692fb4d8502Sjsg
vi_common_sw_init(void * handle)1693fb4d8502Sjsg static int vi_common_sw_init(void *handle)
1694fb4d8502Sjsg {
1695fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1696fb4d8502Sjsg
1697fb4d8502Sjsg if (amdgpu_sriov_vf(adev))
1698fb4d8502Sjsg xgpu_vi_mailbox_add_irq_id(adev);
1699fb4d8502Sjsg
1700fb4d8502Sjsg return 0;
1701fb4d8502Sjsg }
1702fb4d8502Sjsg
vi_common_sw_fini(void * handle)1703fb4d8502Sjsg static int vi_common_sw_fini(void *handle)
1704fb4d8502Sjsg {
1705fb4d8502Sjsg return 0;
1706fb4d8502Sjsg }
1707fb4d8502Sjsg
vi_common_hw_init(void * handle)1708fb4d8502Sjsg static int vi_common_hw_init(void *handle)
1709fb4d8502Sjsg {
1710fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1711fb4d8502Sjsg
1712fb4d8502Sjsg /* move the golden regs per IP block */
1713fb4d8502Sjsg vi_init_golden_registers(adev);
1714fb4d8502Sjsg /* enable aspm */
1715fb4d8502Sjsg vi_program_aspm(adev);
1716fb4d8502Sjsg /* enable the doorbell aperture */
1717fb4d8502Sjsg vi_enable_doorbell_aperture(adev, true);
1718fb4d8502Sjsg
1719fb4d8502Sjsg return 0;
1720fb4d8502Sjsg }
1721fb4d8502Sjsg
vi_common_hw_fini(void * handle)1722fb4d8502Sjsg static int vi_common_hw_fini(void *handle)
1723fb4d8502Sjsg {
1724fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1725fb4d8502Sjsg
1726fb4d8502Sjsg /* enable the doorbell aperture */
1727fb4d8502Sjsg vi_enable_doorbell_aperture(adev, false);
1728fb4d8502Sjsg
1729fb4d8502Sjsg if (amdgpu_sriov_vf(adev))
1730fb4d8502Sjsg xgpu_vi_mailbox_put_irq(adev);
1731fb4d8502Sjsg
1732fb4d8502Sjsg return 0;
1733fb4d8502Sjsg }
1734fb4d8502Sjsg
vi_common_suspend(void * handle)1735fb4d8502Sjsg static int vi_common_suspend(void *handle)
1736fb4d8502Sjsg {
1737fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1738fb4d8502Sjsg
1739fb4d8502Sjsg return vi_common_hw_fini(adev);
1740fb4d8502Sjsg }
1741fb4d8502Sjsg
vi_common_resume(void * handle)1742fb4d8502Sjsg static int vi_common_resume(void *handle)
1743fb4d8502Sjsg {
1744fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1745fb4d8502Sjsg
1746fb4d8502Sjsg return vi_common_hw_init(adev);
1747fb4d8502Sjsg }
1748fb4d8502Sjsg
vi_common_is_idle(void * handle)1749fb4d8502Sjsg static bool vi_common_is_idle(void *handle)
1750fb4d8502Sjsg {
1751fb4d8502Sjsg return true;
1752fb4d8502Sjsg }
1753fb4d8502Sjsg
vi_common_wait_for_idle(void * handle)1754fb4d8502Sjsg static int vi_common_wait_for_idle(void *handle)
1755fb4d8502Sjsg {
1756fb4d8502Sjsg return 0;
1757fb4d8502Sjsg }
1758fb4d8502Sjsg
vi_common_soft_reset(void * handle)1759fb4d8502Sjsg static int vi_common_soft_reset(void *handle)
1760fb4d8502Sjsg {
1761fb4d8502Sjsg return 0;
1762fb4d8502Sjsg }
1763fb4d8502Sjsg
vi_update_bif_medium_grain_light_sleep(struct amdgpu_device * adev,bool enable)1764fb4d8502Sjsg static void vi_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
1765fb4d8502Sjsg bool enable)
1766fb4d8502Sjsg {
1767fb4d8502Sjsg uint32_t temp, data;
1768fb4d8502Sjsg
1769fb4d8502Sjsg temp = data = RREG32_PCIE(ixPCIE_CNTL2);
1770fb4d8502Sjsg
1771fb4d8502Sjsg if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS))
1772fb4d8502Sjsg data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1773fb4d8502Sjsg PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1774fb4d8502Sjsg PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
1775fb4d8502Sjsg else
1776fb4d8502Sjsg data &= ~(PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
1777fb4d8502Sjsg PCIE_CNTL2__MST_MEM_LS_EN_MASK |
1778fb4d8502Sjsg PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK);
1779fb4d8502Sjsg
1780fb4d8502Sjsg if (temp != data)
1781fb4d8502Sjsg WREG32_PCIE(ixPCIE_CNTL2, data);
1782fb4d8502Sjsg }
1783fb4d8502Sjsg
vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device * adev,bool enable)1784fb4d8502Sjsg static void vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev,
1785fb4d8502Sjsg bool enable)
1786fb4d8502Sjsg {
1787fb4d8502Sjsg uint32_t temp, data;
1788fb4d8502Sjsg
1789fb4d8502Sjsg temp = data = RREG32(mmHDP_HOST_PATH_CNTL);
1790fb4d8502Sjsg
1791fb4d8502Sjsg if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))
1792fb4d8502Sjsg data &= ~HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
1793fb4d8502Sjsg else
1794fb4d8502Sjsg data |= HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
1795fb4d8502Sjsg
1796fb4d8502Sjsg if (temp != data)
1797fb4d8502Sjsg WREG32(mmHDP_HOST_PATH_CNTL, data);
1798fb4d8502Sjsg }
1799fb4d8502Sjsg
vi_update_hdp_light_sleep(struct amdgpu_device * adev,bool enable)1800fb4d8502Sjsg static void vi_update_hdp_light_sleep(struct amdgpu_device *adev,
1801fb4d8502Sjsg bool enable)
1802fb4d8502Sjsg {
1803fb4d8502Sjsg uint32_t temp, data;
1804fb4d8502Sjsg
1805fb4d8502Sjsg temp = data = RREG32(mmHDP_MEM_POWER_LS);
1806fb4d8502Sjsg
1807fb4d8502Sjsg if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
1808fb4d8502Sjsg data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK;
1809fb4d8502Sjsg else
1810fb4d8502Sjsg data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK;
1811fb4d8502Sjsg
1812fb4d8502Sjsg if (temp != data)
1813fb4d8502Sjsg WREG32(mmHDP_MEM_POWER_LS, data);
1814fb4d8502Sjsg }
1815fb4d8502Sjsg
vi_update_drm_light_sleep(struct amdgpu_device * adev,bool enable)1816fb4d8502Sjsg static void vi_update_drm_light_sleep(struct amdgpu_device *adev,
1817fb4d8502Sjsg bool enable)
1818fb4d8502Sjsg {
1819fb4d8502Sjsg uint32_t temp, data;
1820fb4d8502Sjsg
1821fb4d8502Sjsg temp = data = RREG32(0x157a);
1822fb4d8502Sjsg
1823fb4d8502Sjsg if (enable && (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS))
1824fb4d8502Sjsg data |= 1;
1825fb4d8502Sjsg else
1826fb4d8502Sjsg data &= ~1;
1827fb4d8502Sjsg
1828fb4d8502Sjsg if (temp != data)
1829fb4d8502Sjsg WREG32(0x157a, data);
1830fb4d8502Sjsg }
1831fb4d8502Sjsg
1832fb4d8502Sjsg
vi_update_rom_medium_grain_clock_gating(struct amdgpu_device * adev,bool enable)1833fb4d8502Sjsg static void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
1834fb4d8502Sjsg bool enable)
1835fb4d8502Sjsg {
1836fb4d8502Sjsg uint32_t temp, data;
1837fb4d8502Sjsg
1838fb4d8502Sjsg temp = data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
1839fb4d8502Sjsg
1840fb4d8502Sjsg if (enable && (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG))
1841fb4d8502Sjsg data &= ~(CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
1842fb4d8502Sjsg CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK);
1843fb4d8502Sjsg else
1844fb4d8502Sjsg data |= CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
1845fb4d8502Sjsg CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK;
1846fb4d8502Sjsg
1847fb4d8502Sjsg if (temp != data)
1848fb4d8502Sjsg WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data);
1849fb4d8502Sjsg }
1850fb4d8502Sjsg
vi_common_set_clockgating_state_by_smu(void * handle,enum amd_clockgating_state state)1851fb4d8502Sjsg static int vi_common_set_clockgating_state_by_smu(void *handle,
1852fb4d8502Sjsg enum amd_clockgating_state state)
1853fb4d8502Sjsg {
1854fb4d8502Sjsg uint32_t msg_id, pp_state = 0;
1855fb4d8502Sjsg uint32_t pp_support_state = 0;
1856fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1857fb4d8502Sjsg
1858fb4d8502Sjsg if (adev->cg_flags & (AMD_CG_SUPPORT_MC_LS | AMD_CG_SUPPORT_MC_MGCG)) {
1859fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) {
1860fb4d8502Sjsg pp_support_state = PP_STATE_SUPPORT_LS;
1861fb4d8502Sjsg pp_state = PP_STATE_LS;
1862fb4d8502Sjsg }
1863fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG) {
1864fb4d8502Sjsg pp_support_state |= PP_STATE_SUPPORT_CG;
1865fb4d8502Sjsg pp_state |= PP_STATE_CG;
1866fb4d8502Sjsg }
1867fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1868fb4d8502Sjsg pp_state = 0;
1869fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1870fb4d8502Sjsg PP_BLOCK_SYS_MC,
1871fb4d8502Sjsg pp_support_state,
1872fb4d8502Sjsg pp_state);
1873fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1874fb4d8502Sjsg }
1875fb4d8502Sjsg
1876fb4d8502Sjsg if (adev->cg_flags & (AMD_CG_SUPPORT_SDMA_LS | AMD_CG_SUPPORT_SDMA_MGCG)) {
1877fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS) {
1878fb4d8502Sjsg pp_support_state = PP_STATE_SUPPORT_LS;
1879fb4d8502Sjsg pp_state = PP_STATE_LS;
1880fb4d8502Sjsg }
1881fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG) {
1882fb4d8502Sjsg pp_support_state |= PP_STATE_SUPPORT_CG;
1883fb4d8502Sjsg pp_state |= PP_STATE_CG;
1884fb4d8502Sjsg }
1885fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1886fb4d8502Sjsg pp_state = 0;
1887fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1888fb4d8502Sjsg PP_BLOCK_SYS_SDMA,
1889fb4d8502Sjsg pp_support_state,
1890fb4d8502Sjsg pp_state);
1891fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1892fb4d8502Sjsg }
1893fb4d8502Sjsg
1894fb4d8502Sjsg if (adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | AMD_CG_SUPPORT_HDP_MGCG)) {
1895fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS) {
1896fb4d8502Sjsg pp_support_state = PP_STATE_SUPPORT_LS;
1897fb4d8502Sjsg pp_state = PP_STATE_LS;
1898fb4d8502Sjsg }
1899fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG) {
1900fb4d8502Sjsg pp_support_state |= PP_STATE_SUPPORT_CG;
1901fb4d8502Sjsg pp_state |= PP_STATE_CG;
1902fb4d8502Sjsg }
1903fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1904fb4d8502Sjsg pp_state = 0;
1905fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1906fb4d8502Sjsg PP_BLOCK_SYS_HDP,
1907fb4d8502Sjsg pp_support_state,
1908fb4d8502Sjsg pp_state);
1909fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1910fb4d8502Sjsg }
1911fb4d8502Sjsg
1912fb4d8502Sjsg
1913fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS) {
1914fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1915fb4d8502Sjsg pp_state = 0;
1916fb4d8502Sjsg else
1917fb4d8502Sjsg pp_state = PP_STATE_LS;
1918fb4d8502Sjsg
1919fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1920fb4d8502Sjsg PP_BLOCK_SYS_BIF,
1921fb4d8502Sjsg PP_STATE_SUPPORT_LS,
1922fb4d8502Sjsg pp_state);
1923fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1924fb4d8502Sjsg }
1925fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_BIF_MGCG) {
1926fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1927fb4d8502Sjsg pp_state = 0;
1928fb4d8502Sjsg else
1929fb4d8502Sjsg pp_state = PP_STATE_CG;
1930fb4d8502Sjsg
1931fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1932fb4d8502Sjsg PP_BLOCK_SYS_BIF,
1933fb4d8502Sjsg PP_STATE_SUPPORT_CG,
1934fb4d8502Sjsg pp_state);
1935fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1936fb4d8502Sjsg }
1937fb4d8502Sjsg
1938fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS) {
1939fb4d8502Sjsg
1940fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1941fb4d8502Sjsg pp_state = 0;
1942fb4d8502Sjsg else
1943fb4d8502Sjsg pp_state = PP_STATE_LS;
1944fb4d8502Sjsg
1945fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1946fb4d8502Sjsg PP_BLOCK_SYS_DRM,
1947fb4d8502Sjsg PP_STATE_SUPPORT_LS,
1948fb4d8502Sjsg pp_state);
1949fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1950fb4d8502Sjsg }
1951fb4d8502Sjsg
1952fb4d8502Sjsg if (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG) {
1953fb4d8502Sjsg
1954fb4d8502Sjsg if (state == AMD_CG_STATE_UNGATE)
1955fb4d8502Sjsg pp_state = 0;
1956fb4d8502Sjsg else
1957fb4d8502Sjsg pp_state = PP_STATE_CG;
1958fb4d8502Sjsg
1959fb4d8502Sjsg msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1960fb4d8502Sjsg PP_BLOCK_SYS_ROM,
1961fb4d8502Sjsg PP_STATE_SUPPORT_CG,
1962fb4d8502Sjsg pp_state);
1963fb4d8502Sjsg amdgpu_dpm_set_clockgating_by_smu(adev, msg_id);
1964fb4d8502Sjsg }
1965fb4d8502Sjsg return 0;
1966fb4d8502Sjsg }
1967fb4d8502Sjsg
vi_common_set_clockgating_state(void * handle,enum amd_clockgating_state state)1968fb4d8502Sjsg static int vi_common_set_clockgating_state(void *handle,
1969fb4d8502Sjsg enum amd_clockgating_state state)
1970fb4d8502Sjsg {
1971fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1972fb4d8502Sjsg
1973fb4d8502Sjsg if (amdgpu_sriov_vf(adev))
1974fb4d8502Sjsg return 0;
1975fb4d8502Sjsg
1976fb4d8502Sjsg switch (adev->asic_type) {
1977fb4d8502Sjsg case CHIP_FIJI:
1978fb4d8502Sjsg vi_update_bif_medium_grain_light_sleep(adev,
1979fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1980fb4d8502Sjsg vi_update_hdp_medium_grain_clock_gating(adev,
1981fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1982fb4d8502Sjsg vi_update_hdp_light_sleep(adev,
1983fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1984fb4d8502Sjsg vi_update_rom_medium_grain_clock_gating(adev,
1985fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1986fb4d8502Sjsg break;
1987fb4d8502Sjsg case CHIP_CARRIZO:
1988fb4d8502Sjsg case CHIP_STONEY:
1989fb4d8502Sjsg vi_update_bif_medium_grain_light_sleep(adev,
1990fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1991fb4d8502Sjsg vi_update_hdp_medium_grain_clock_gating(adev,
1992fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1993fb4d8502Sjsg vi_update_hdp_light_sleep(adev,
1994fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1995fb4d8502Sjsg vi_update_drm_light_sleep(adev,
1996fb4d8502Sjsg state == AMD_CG_STATE_GATE);
1997fb4d8502Sjsg break;
1998fb4d8502Sjsg case CHIP_TONGA:
1999fb4d8502Sjsg case CHIP_POLARIS10:
2000fb4d8502Sjsg case CHIP_POLARIS11:
2001fb4d8502Sjsg case CHIP_POLARIS12:
2002fb4d8502Sjsg case CHIP_VEGAM:
2003fb4d8502Sjsg vi_common_set_clockgating_state_by_smu(adev, state);
20045ca02815Sjsg break;
2005fb4d8502Sjsg default:
2006fb4d8502Sjsg break;
2007fb4d8502Sjsg }
2008fb4d8502Sjsg return 0;
2009fb4d8502Sjsg }
2010fb4d8502Sjsg
vi_common_set_powergating_state(void * handle,enum amd_powergating_state state)2011fb4d8502Sjsg static int vi_common_set_powergating_state(void *handle,
2012fb4d8502Sjsg enum amd_powergating_state state)
2013fb4d8502Sjsg {
2014fb4d8502Sjsg return 0;
2015fb4d8502Sjsg }
2016fb4d8502Sjsg
vi_common_get_clockgating_state(void * handle,u64 * flags)20171bb76ff1Sjsg static void vi_common_get_clockgating_state(void *handle, u64 *flags)
2018fb4d8502Sjsg {
2019fb4d8502Sjsg struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2020fb4d8502Sjsg int data;
2021fb4d8502Sjsg
2022fb4d8502Sjsg if (amdgpu_sriov_vf(adev))
2023fb4d8502Sjsg *flags = 0;
2024fb4d8502Sjsg
2025fb4d8502Sjsg /* AMD_CG_SUPPORT_BIF_LS */
2026fb4d8502Sjsg data = RREG32_PCIE(ixPCIE_CNTL2);
2027fb4d8502Sjsg if (data & PCIE_CNTL2__SLV_MEM_LS_EN_MASK)
2028fb4d8502Sjsg *flags |= AMD_CG_SUPPORT_BIF_LS;
2029fb4d8502Sjsg
2030fb4d8502Sjsg /* AMD_CG_SUPPORT_HDP_LS */
2031fb4d8502Sjsg data = RREG32(mmHDP_MEM_POWER_LS);
2032fb4d8502Sjsg if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK)
2033fb4d8502Sjsg *flags |= AMD_CG_SUPPORT_HDP_LS;
2034fb4d8502Sjsg
2035fb4d8502Sjsg /* AMD_CG_SUPPORT_HDP_MGCG */
2036fb4d8502Sjsg data = RREG32(mmHDP_HOST_PATH_CNTL);
2037fb4d8502Sjsg if (!(data & HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK))
2038fb4d8502Sjsg *flags |= AMD_CG_SUPPORT_HDP_MGCG;
2039fb4d8502Sjsg
2040fb4d8502Sjsg /* AMD_CG_SUPPORT_ROM_MGCG */
2041fb4d8502Sjsg data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
2042fb4d8502Sjsg if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK))
2043fb4d8502Sjsg *flags |= AMD_CG_SUPPORT_ROM_MGCG;
2044fb4d8502Sjsg }
2045fb4d8502Sjsg
2046fb4d8502Sjsg static const struct amd_ip_funcs vi_common_ip_funcs = {
2047fb4d8502Sjsg .name = "vi_common",
2048fb4d8502Sjsg .early_init = vi_common_early_init,
2049fb4d8502Sjsg .late_init = vi_common_late_init,
2050fb4d8502Sjsg .sw_init = vi_common_sw_init,
2051fb4d8502Sjsg .sw_fini = vi_common_sw_fini,
2052fb4d8502Sjsg .hw_init = vi_common_hw_init,
2053fb4d8502Sjsg .hw_fini = vi_common_hw_fini,
2054fb4d8502Sjsg .suspend = vi_common_suspend,
2055fb4d8502Sjsg .resume = vi_common_resume,
2056fb4d8502Sjsg .is_idle = vi_common_is_idle,
2057fb4d8502Sjsg .wait_for_idle = vi_common_wait_for_idle,
2058fb4d8502Sjsg .soft_reset = vi_common_soft_reset,
2059fb4d8502Sjsg .set_clockgating_state = vi_common_set_clockgating_state,
2060fb4d8502Sjsg .set_powergating_state = vi_common_set_powergating_state,
2061fb4d8502Sjsg .get_clockgating_state = vi_common_get_clockgating_state,
2062fb4d8502Sjsg };
2063fb4d8502Sjsg
2064fb4d8502Sjsg static const struct amdgpu_ip_block_version vi_common_ip_block =
2065fb4d8502Sjsg {
2066fb4d8502Sjsg .type = AMD_IP_BLOCK_TYPE_COMMON,
2067fb4d8502Sjsg .major = 1,
2068fb4d8502Sjsg .minor = 0,
2069fb4d8502Sjsg .rev = 0,
2070fb4d8502Sjsg .funcs = &vi_common_ip_funcs,
2071fb4d8502Sjsg };
2072fb4d8502Sjsg
vi_set_virt_ops(struct amdgpu_device * adev)2073ad8b1aafSjsg void vi_set_virt_ops(struct amdgpu_device *adev)
2074ad8b1aafSjsg {
2075ad8b1aafSjsg adev->virt.ops = &xgpu_vi_virt_ops;
2076ad8b1aafSjsg }
2077ad8b1aafSjsg
vi_set_ip_blocks(struct amdgpu_device * adev)2078fb4d8502Sjsg int vi_set_ip_blocks(struct amdgpu_device *adev)
2079fb4d8502Sjsg {
2080*f005ef32Sjsg amdgpu_device_set_sriov_virtual_display(adev);
2081*f005ef32Sjsg
2082fb4d8502Sjsg switch (adev->asic_type) {
2083fb4d8502Sjsg case CHIP_TOPAZ:
2084fb4d8502Sjsg /* topaz has no DCE, UVD, VCE */
2085fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2086fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block);
2087fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block);
2088c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
2089c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v2_4_ip_block);
2090fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2091fb4d8502Sjsg if (adev->enable_virtual_display)
20925ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2093fb4d8502Sjsg break;
2094fb4d8502Sjsg case CHIP_FIJI:
2095fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2096fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block);
2097fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
2098c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
2099c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
2100fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2101*f005ef32Sjsg if (adev->enable_virtual_display)
21025ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2103fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2104fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2105fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2106fb4d8502Sjsg #endif
2107fb4d8502Sjsg else
2108fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v10_1_ip_block);
2109fb4d8502Sjsg if (!amdgpu_sriov_vf(adev)) {
2110fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
2111fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
2112fb4d8502Sjsg }
2113fb4d8502Sjsg break;
2114fb4d8502Sjsg case CHIP_TONGA:
2115fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2116fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
2117fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
2118c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
2119c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
2120fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2121*f005ef32Sjsg if (adev->enable_virtual_display)
21225ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2123fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2124fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2125fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2126fb4d8502Sjsg #endif
2127fb4d8502Sjsg else
2128fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v10_0_ip_block);
2129fb4d8502Sjsg if (!amdgpu_sriov_vf(adev)) {
2130fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v5_0_ip_block);
2131fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
2132fb4d8502Sjsg }
2133fb4d8502Sjsg break;
2134fb4d8502Sjsg case CHIP_POLARIS10:
2135fb4d8502Sjsg case CHIP_POLARIS11:
2136fb4d8502Sjsg case CHIP_POLARIS12:
2137fb4d8502Sjsg case CHIP_VEGAM:
2138fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2139fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block);
2140fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
2141c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
2142c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v3_1_ip_block);
2143fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2144fb4d8502Sjsg if (adev->enable_virtual_display)
21455ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2146fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2147fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2148fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2149fb4d8502Sjsg #endif
2150fb4d8502Sjsg else
2151fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v11_2_ip_block);
2152fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v6_3_ip_block);
2153fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
2154fb4d8502Sjsg break;
2155fb4d8502Sjsg case CHIP_CARRIZO:
2156fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2157fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
2158fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
2159c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
2160c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
2161fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2162fb4d8502Sjsg if (adev->enable_virtual_display)
21635ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2164fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2165fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2166fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2167fb4d8502Sjsg #endif
2168fb4d8502Sjsg else
2169fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
2170fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
2171fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v3_1_ip_block);
2172fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_ACP)
2173fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &acp_ip_block);
2174fb4d8502Sjsg #endif
2175fb4d8502Sjsg break;
2176fb4d8502Sjsg case CHIP_STONEY:
2177fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
2178fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
2179fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
2180c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &gfx_v8_1_ip_block);
2181c349dbc7Sjsg amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
2182fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
2183fb4d8502Sjsg if (adev->enable_virtual_display)
21845ca02815Sjsg amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
2185fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_DC)
2186fb4d8502Sjsg else if (amdgpu_device_has_dc_support(adev))
2187fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dm_ip_block);
2188fb4d8502Sjsg #endif
2189fb4d8502Sjsg else
2190fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
2191fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &uvd_v6_2_ip_block);
2192fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
2193fb4d8502Sjsg #if defined(CONFIG_DRM_AMD_ACP)
2194fb4d8502Sjsg amdgpu_device_ip_block_add(adev, &acp_ip_block);
2195fb4d8502Sjsg #endif
2196fb4d8502Sjsg break;
2197fb4d8502Sjsg default:
2198fb4d8502Sjsg /* FIXME: not supported yet */
2199fb4d8502Sjsg return -EINVAL;
2200fb4d8502Sjsg }
2201fb4d8502Sjsg
2202fb4d8502Sjsg return 0;
2203fb4d8502Sjsg }
2204c349dbc7Sjsg
legacy_doorbell_index_init(struct amdgpu_device * adev)2205c349dbc7Sjsg void legacy_doorbell_index_init(struct amdgpu_device *adev)
2206c349dbc7Sjsg {
2207c349dbc7Sjsg adev->doorbell_index.kiq = AMDGPU_DOORBELL_KIQ;
2208c349dbc7Sjsg adev->doorbell_index.mec_ring0 = AMDGPU_DOORBELL_MEC_RING0;
2209c349dbc7Sjsg adev->doorbell_index.mec_ring1 = AMDGPU_DOORBELL_MEC_RING1;
2210c349dbc7Sjsg adev->doorbell_index.mec_ring2 = AMDGPU_DOORBELL_MEC_RING2;
2211c349dbc7Sjsg adev->doorbell_index.mec_ring3 = AMDGPU_DOORBELL_MEC_RING3;
2212c349dbc7Sjsg adev->doorbell_index.mec_ring4 = AMDGPU_DOORBELL_MEC_RING4;
2213c349dbc7Sjsg adev->doorbell_index.mec_ring5 = AMDGPU_DOORBELL_MEC_RING5;
2214c349dbc7Sjsg adev->doorbell_index.mec_ring6 = AMDGPU_DOORBELL_MEC_RING6;
2215c349dbc7Sjsg adev->doorbell_index.mec_ring7 = AMDGPU_DOORBELL_MEC_RING7;
2216c349dbc7Sjsg adev->doorbell_index.gfx_ring0 = AMDGPU_DOORBELL_GFX_RING0;
2217c349dbc7Sjsg adev->doorbell_index.sdma_engine[0] = AMDGPU_DOORBELL_sDMA_ENGINE0;
2218c349dbc7Sjsg adev->doorbell_index.sdma_engine[1] = AMDGPU_DOORBELL_sDMA_ENGINE1;
2219c349dbc7Sjsg adev->doorbell_index.ih = AMDGPU_DOORBELL_IH;
2220c349dbc7Sjsg adev->doorbell_index.max_assignment = AMDGPU_DOORBELL_MAX_ASSIGNMENT;
2221c349dbc7Sjsg }
2222