18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include <linux/pci.h> 258c2ecf20Sopenharmony_ci#include <linux/slab.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include "amdgpu.h" 288c2ecf20Sopenharmony_ci#include "amdgpu_atombios.h" 298c2ecf20Sopenharmony_ci#include "amdgpu_ih.h" 308c2ecf20Sopenharmony_ci#include "amdgpu_uvd.h" 318c2ecf20Sopenharmony_ci#include "amdgpu_vce.h" 328c2ecf20Sopenharmony_ci#include "amdgpu_ucode.h" 338c2ecf20Sopenharmony_ci#include "atom.h" 348c2ecf20Sopenharmony_ci#include "amd_pcie.h" 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include "gmc/gmc_8_1_d.h" 378c2ecf20Sopenharmony_ci#include "gmc/gmc_8_1_sh_mask.h" 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#include "oss/oss_3_0_d.h" 408c2ecf20Sopenharmony_ci#include "oss/oss_3_0_sh_mask.h" 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#include "bif/bif_5_0_d.h" 438c2ecf20Sopenharmony_ci#include "bif/bif_5_0_sh_mask.h" 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#include "gca/gfx_8_0_d.h" 468c2ecf20Sopenharmony_ci#include "gca/gfx_8_0_sh_mask.h" 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#include "smu/smu_7_1_1_d.h" 498c2ecf20Sopenharmony_ci#include "smu/smu_7_1_1_sh_mask.h" 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#include "uvd/uvd_5_0_d.h" 528c2ecf20Sopenharmony_ci#include "uvd/uvd_5_0_sh_mask.h" 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci#include "vce/vce_3_0_d.h" 558c2ecf20Sopenharmony_ci#include "vce/vce_3_0_sh_mask.h" 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#include "dce/dce_10_0_d.h" 588c2ecf20Sopenharmony_ci#include "dce/dce_10_0_sh_mask.h" 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#include "vid.h" 618c2ecf20Sopenharmony_ci#include "vi.h" 628c2ecf20Sopenharmony_ci#include "gmc_v8_0.h" 638c2ecf20Sopenharmony_ci#include "gmc_v7_0.h" 648c2ecf20Sopenharmony_ci#include "gfx_v8_0.h" 658c2ecf20Sopenharmony_ci#include "sdma_v2_4.h" 668c2ecf20Sopenharmony_ci#include "sdma_v3_0.h" 678c2ecf20Sopenharmony_ci#include "dce_v10_0.h" 688c2ecf20Sopenharmony_ci#include "dce_v11_0.h" 698c2ecf20Sopenharmony_ci#include "iceland_ih.h" 708c2ecf20Sopenharmony_ci#include "tonga_ih.h" 718c2ecf20Sopenharmony_ci#include "cz_ih.h" 728c2ecf20Sopenharmony_ci#include "uvd_v5_0.h" 738c2ecf20Sopenharmony_ci#include "uvd_v6_0.h" 748c2ecf20Sopenharmony_ci#include "vce_v3_0.h" 758c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP) 768c2ecf20Sopenharmony_ci#include "amdgpu_acp.h" 778c2ecf20Sopenharmony_ci#endif 788c2ecf20Sopenharmony_ci#include "dce_virtual.h" 798c2ecf20Sopenharmony_ci#include "mxgpu_vi.h" 808c2ecf20Sopenharmony_ci#include "amdgpu_dm.h" 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* 838c2ecf20Sopenharmony_ci * Indirect registers accessor 848c2ecf20Sopenharmony_ci */ 858c2ecf20Sopenharmony_cistatic u32 vi_pcie_rreg(struct amdgpu_device *adev, u32 reg) 868c2ecf20Sopenharmony_ci{ 878c2ecf20Sopenharmony_ci unsigned long flags; 888c2ecf20Sopenharmony_ci u32 r; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->pcie_idx_lock, flags); 918c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmPCIE_INDEX, reg); 928c2ecf20Sopenharmony_ci (void)RREG32_NO_KIQ(mmPCIE_INDEX); 938c2ecf20Sopenharmony_ci r = RREG32_NO_KIQ(mmPCIE_DATA); 948c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 958c2ecf20Sopenharmony_ci return r; 968c2ecf20Sopenharmony_ci} 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistatic void vi_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci unsigned long flags; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->pcie_idx_lock, flags); 1038c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmPCIE_INDEX, reg); 1048c2ecf20Sopenharmony_ci (void)RREG32_NO_KIQ(mmPCIE_INDEX); 1058c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmPCIE_DATA, v); 1068c2ecf20Sopenharmony_ci (void)RREG32_NO_KIQ(mmPCIE_DATA); 1078c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_cistatic u32 vi_smc_rreg(struct amdgpu_device *adev, u32 reg) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci unsigned long flags; 1138c2ecf20Sopenharmony_ci u32 r; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->smc_idx_lock, flags); 1168c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg)); 1178c2ecf20Sopenharmony_ci r = RREG32_NO_KIQ(mmSMC_IND_DATA_11); 1188c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 1198c2ecf20Sopenharmony_ci return r; 1208c2ecf20Sopenharmony_ci} 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic void vi_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci unsigned long flags; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->smc_idx_lock, flags); 1278c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmSMC_IND_INDEX_11, (reg)); 1288c2ecf20Sopenharmony_ci WREG32_NO_KIQ(mmSMC_IND_DATA_11, (v)); 1298c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 1308c2ecf20Sopenharmony_ci} 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/* smu_8_0_d.h */ 1338c2ecf20Sopenharmony_ci#define mmMP0PUB_IND_INDEX 0x180 1348c2ecf20Sopenharmony_ci#define mmMP0PUB_IND_DATA 0x181 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic u32 cz_smc_rreg(struct amdgpu_device *adev, u32 reg) 1378c2ecf20Sopenharmony_ci{ 1388c2ecf20Sopenharmony_ci unsigned long flags; 1398c2ecf20Sopenharmony_ci u32 r; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->smc_idx_lock, flags); 1428c2ecf20Sopenharmony_ci WREG32(mmMP0PUB_IND_INDEX, (reg)); 1438c2ecf20Sopenharmony_ci r = RREG32(mmMP0PUB_IND_DATA); 1448c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 1458c2ecf20Sopenharmony_ci return r; 1468c2ecf20Sopenharmony_ci} 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistatic void cz_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1498c2ecf20Sopenharmony_ci{ 1508c2ecf20Sopenharmony_ci unsigned long flags; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->smc_idx_lock, flags); 1538c2ecf20Sopenharmony_ci WREG32(mmMP0PUB_IND_INDEX, (reg)); 1548c2ecf20Sopenharmony_ci WREG32(mmMP0PUB_IND_DATA, (v)); 1558c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 1568c2ecf20Sopenharmony_ci} 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_cistatic u32 vi_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg) 1598c2ecf20Sopenharmony_ci{ 1608c2ecf20Sopenharmony_ci unsigned long flags; 1618c2ecf20Sopenharmony_ci u32 r; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags); 1648c2ecf20Sopenharmony_ci WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff)); 1658c2ecf20Sopenharmony_ci r = RREG32(mmUVD_CTX_DATA); 1668c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags); 1678c2ecf20Sopenharmony_ci return r; 1688c2ecf20Sopenharmony_ci} 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistatic void vi_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci unsigned long flags; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags); 1758c2ecf20Sopenharmony_ci WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff)); 1768c2ecf20Sopenharmony_ci WREG32(mmUVD_CTX_DATA, (v)); 1778c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags); 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic u32 vi_didt_rreg(struct amdgpu_device *adev, u32 reg) 1818c2ecf20Sopenharmony_ci{ 1828c2ecf20Sopenharmony_ci unsigned long flags; 1838c2ecf20Sopenharmony_ci u32 r; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->didt_idx_lock, flags); 1868c2ecf20Sopenharmony_ci WREG32(mmDIDT_IND_INDEX, (reg)); 1878c2ecf20Sopenharmony_ci r = RREG32(mmDIDT_IND_DATA); 1888c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->didt_idx_lock, flags); 1898c2ecf20Sopenharmony_ci return r; 1908c2ecf20Sopenharmony_ci} 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_cistatic void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 1938c2ecf20Sopenharmony_ci{ 1948c2ecf20Sopenharmony_ci unsigned long flags; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->didt_idx_lock, flags); 1978c2ecf20Sopenharmony_ci WREG32(mmDIDT_IND_INDEX, (reg)); 1988c2ecf20Sopenharmony_ci WREG32(mmDIDT_IND_DATA, (v)); 1998c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->didt_idx_lock, flags); 2008c2ecf20Sopenharmony_ci} 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_cistatic u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg) 2038c2ecf20Sopenharmony_ci{ 2048c2ecf20Sopenharmony_ci unsigned long flags; 2058c2ecf20Sopenharmony_ci u32 r; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->gc_cac_idx_lock, flags); 2088c2ecf20Sopenharmony_ci WREG32(mmGC_CAC_IND_INDEX, (reg)); 2098c2ecf20Sopenharmony_ci r = RREG32(mmGC_CAC_IND_DATA); 2108c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags); 2118c2ecf20Sopenharmony_ci return r; 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistatic void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 2158c2ecf20Sopenharmony_ci{ 2168c2ecf20Sopenharmony_ci unsigned long flags; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->gc_cac_idx_lock, flags); 2198c2ecf20Sopenharmony_ci WREG32(mmGC_CAC_IND_INDEX, (reg)); 2208c2ecf20Sopenharmony_ci WREG32(mmGC_CAC_IND_DATA, (v)); 2218c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags); 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic const u32 tonga_mgcg_cgcg_init[] = 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, 2288c2ecf20Sopenharmony_ci mmPCIE_INDEX, 0xffffffff, 0x0140001c, 2298c2ecf20Sopenharmony_ci mmPCIE_DATA, 0x000f0000, 0x00000000, 2308c2ecf20Sopenharmony_ci mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C, 2318c2ecf20Sopenharmony_ci mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100, 2328c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 2338c2ecf20Sopenharmony_ci mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 2348c2ecf20Sopenharmony_ci}; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_cistatic const u32 fiji_mgcg_cgcg_init[] = 2378c2ecf20Sopenharmony_ci{ 2388c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, 2398c2ecf20Sopenharmony_ci mmPCIE_INDEX, 0xffffffff, 0x0140001c, 2408c2ecf20Sopenharmony_ci mmPCIE_DATA, 0x000f0000, 0x00000000, 2418c2ecf20Sopenharmony_ci mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C, 2428c2ecf20Sopenharmony_ci mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100, 2438c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 2448c2ecf20Sopenharmony_ci mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 2458c2ecf20Sopenharmony_ci}; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_cistatic const u32 iceland_mgcg_cgcg_init[] = 2488c2ecf20Sopenharmony_ci{ 2498c2ecf20Sopenharmony_ci mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2, 2508c2ecf20Sopenharmony_ci mmPCIE_DATA, 0x000f0000, 0x00000000, 2518c2ecf20Sopenharmony_ci mmSMC_IND_INDEX_4, 0xffffffff, ixCGTT_ROM_CLK_CTRL0, 2528c2ecf20Sopenharmony_ci mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100, 2538c2ecf20Sopenharmony_ci mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 2548c2ecf20Sopenharmony_ci}; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_cistatic const u32 cz_mgcg_cgcg_init[] = 2578c2ecf20Sopenharmony_ci{ 2588c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, 2598c2ecf20Sopenharmony_ci mmPCIE_INDEX, 0xffffffff, 0x0140001c, 2608c2ecf20Sopenharmony_ci mmPCIE_DATA, 0x000f0000, 0x00000000, 2618c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, 2628c2ecf20Sopenharmony_ci mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, 2638c2ecf20Sopenharmony_ci}; 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cistatic const u32 stoney_mgcg_cgcg_init[] = 2668c2ecf20Sopenharmony_ci{ 2678c2ecf20Sopenharmony_ci mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00000100, 2688c2ecf20Sopenharmony_ci mmHDP_XDP_CGTT_BLK_CTRL, 0xffffffff, 0x00000104, 2698c2ecf20Sopenharmony_ci mmHDP_HOST_PATH_CNTL, 0xffffffff, 0x0f000027, 2708c2ecf20Sopenharmony_ci}; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_cistatic void vi_init_golden_registers(struct amdgpu_device *adev) 2738c2ecf20Sopenharmony_ci{ 2748c2ecf20Sopenharmony_ci /* Some of the registers might be dependent on GRBM_GFX_INDEX */ 2758c2ecf20Sopenharmony_ci mutex_lock(&adev->grbm_idx_mutex); 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) { 2788c2ecf20Sopenharmony_ci xgpu_vi_init_golden_registers(adev); 2798c2ecf20Sopenharmony_ci mutex_unlock(&adev->grbm_idx_mutex); 2808c2ecf20Sopenharmony_ci return; 2818c2ecf20Sopenharmony_ci } 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci switch (adev->asic_type) { 2848c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 2858c2ecf20Sopenharmony_ci amdgpu_device_program_register_sequence(adev, 2868c2ecf20Sopenharmony_ci iceland_mgcg_cgcg_init, 2878c2ecf20Sopenharmony_ci ARRAY_SIZE(iceland_mgcg_cgcg_init)); 2888c2ecf20Sopenharmony_ci break; 2898c2ecf20Sopenharmony_ci case CHIP_FIJI: 2908c2ecf20Sopenharmony_ci amdgpu_device_program_register_sequence(adev, 2918c2ecf20Sopenharmony_ci fiji_mgcg_cgcg_init, 2928c2ecf20Sopenharmony_ci ARRAY_SIZE(fiji_mgcg_cgcg_init)); 2938c2ecf20Sopenharmony_ci break; 2948c2ecf20Sopenharmony_ci case CHIP_TONGA: 2958c2ecf20Sopenharmony_ci amdgpu_device_program_register_sequence(adev, 2968c2ecf20Sopenharmony_ci tonga_mgcg_cgcg_init, 2978c2ecf20Sopenharmony_ci ARRAY_SIZE(tonga_mgcg_cgcg_init)); 2988c2ecf20Sopenharmony_ci break; 2998c2ecf20Sopenharmony_ci case CHIP_CARRIZO: 3008c2ecf20Sopenharmony_ci amdgpu_device_program_register_sequence(adev, 3018c2ecf20Sopenharmony_ci cz_mgcg_cgcg_init, 3028c2ecf20Sopenharmony_ci ARRAY_SIZE(cz_mgcg_cgcg_init)); 3038c2ecf20Sopenharmony_ci break; 3048c2ecf20Sopenharmony_ci case CHIP_STONEY: 3058c2ecf20Sopenharmony_ci amdgpu_device_program_register_sequence(adev, 3068c2ecf20Sopenharmony_ci stoney_mgcg_cgcg_init, 3078c2ecf20Sopenharmony_ci ARRAY_SIZE(stoney_mgcg_cgcg_init)); 3088c2ecf20Sopenharmony_ci break; 3098c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 3108c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 3118c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 3128c2ecf20Sopenharmony_ci case CHIP_VEGAM: 3138c2ecf20Sopenharmony_ci default: 3148c2ecf20Sopenharmony_ci break; 3158c2ecf20Sopenharmony_ci } 3168c2ecf20Sopenharmony_ci mutex_unlock(&adev->grbm_idx_mutex); 3178c2ecf20Sopenharmony_ci} 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci/** 3208c2ecf20Sopenharmony_ci * vi_get_xclk - get the xclk 3218c2ecf20Sopenharmony_ci * 3228c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer 3238c2ecf20Sopenharmony_ci * 3248c2ecf20Sopenharmony_ci * Returns the reference clock used by the gfx engine 3258c2ecf20Sopenharmony_ci * (VI). 3268c2ecf20Sopenharmony_ci */ 3278c2ecf20Sopenharmony_cistatic u32 vi_get_xclk(struct amdgpu_device *adev) 3288c2ecf20Sopenharmony_ci{ 3298c2ecf20Sopenharmony_ci u32 reference_clock = adev->clock.spll.reference_freq; 3308c2ecf20Sopenharmony_ci u32 tmp; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) { 3338c2ecf20Sopenharmony_ci switch (adev->asic_type) { 3348c2ecf20Sopenharmony_ci case CHIP_STONEY: 3358c2ecf20Sopenharmony_ci /* vbios says 48Mhz, but the actual freq is 100Mhz */ 3368c2ecf20Sopenharmony_ci return 10000; 3378c2ecf20Sopenharmony_ci default: 3388c2ecf20Sopenharmony_ci return reference_clock; 3398c2ecf20Sopenharmony_ci } 3408c2ecf20Sopenharmony_ci } 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2); 3438c2ecf20Sopenharmony_ci if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK)) 3448c2ecf20Sopenharmony_ci return 1000; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci tmp = RREG32_SMC(ixCG_CLKPIN_CNTL); 3478c2ecf20Sopenharmony_ci if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL, XTALIN_DIVIDE)) 3488c2ecf20Sopenharmony_ci return reference_clock / 4; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci return reference_clock; 3518c2ecf20Sopenharmony_ci} 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci/** 3548c2ecf20Sopenharmony_ci * vi_srbm_select - select specific register instances 3558c2ecf20Sopenharmony_ci * 3568c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer 3578c2ecf20Sopenharmony_ci * @me: selected ME (micro engine) 3588c2ecf20Sopenharmony_ci * @pipe: pipe 3598c2ecf20Sopenharmony_ci * @queue: queue 3608c2ecf20Sopenharmony_ci * @vmid: VMID 3618c2ecf20Sopenharmony_ci * 3628c2ecf20Sopenharmony_ci * Switches the currently active registers instances. Some 3638c2ecf20Sopenharmony_ci * registers are instanced per VMID, others are instanced per 3648c2ecf20Sopenharmony_ci * me/pipe/queue combination. 3658c2ecf20Sopenharmony_ci */ 3668c2ecf20Sopenharmony_civoid vi_srbm_select(struct amdgpu_device *adev, 3678c2ecf20Sopenharmony_ci u32 me, u32 pipe, u32 queue, u32 vmid) 3688c2ecf20Sopenharmony_ci{ 3698c2ecf20Sopenharmony_ci u32 srbm_gfx_cntl = 0; 3708c2ecf20Sopenharmony_ci srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, PIPEID, pipe); 3718c2ecf20Sopenharmony_ci srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, MEID, me); 3728c2ecf20Sopenharmony_ci srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, VMID, vmid); 3738c2ecf20Sopenharmony_ci srbm_gfx_cntl = REG_SET_FIELD(srbm_gfx_cntl, SRBM_GFX_CNTL, QUEUEID, queue); 3748c2ecf20Sopenharmony_ci WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl); 3758c2ecf20Sopenharmony_ci} 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_cistatic void vi_vga_set_state(struct amdgpu_device *adev, bool state) 3788c2ecf20Sopenharmony_ci{ 3798c2ecf20Sopenharmony_ci /* todo */ 3808c2ecf20Sopenharmony_ci} 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_cistatic bool vi_read_disabled_bios(struct amdgpu_device *adev) 3838c2ecf20Sopenharmony_ci{ 3848c2ecf20Sopenharmony_ci u32 bus_cntl; 3858c2ecf20Sopenharmony_ci u32 d1vga_control = 0; 3868c2ecf20Sopenharmony_ci u32 d2vga_control = 0; 3878c2ecf20Sopenharmony_ci u32 vga_render_control = 0; 3888c2ecf20Sopenharmony_ci u32 rom_cntl; 3898c2ecf20Sopenharmony_ci bool r; 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_ci bus_cntl = RREG32(mmBUS_CNTL); 3928c2ecf20Sopenharmony_ci if (adev->mode_info.num_crtc) { 3938c2ecf20Sopenharmony_ci d1vga_control = RREG32(mmD1VGA_CONTROL); 3948c2ecf20Sopenharmony_ci d2vga_control = RREG32(mmD2VGA_CONTROL); 3958c2ecf20Sopenharmony_ci vga_render_control = RREG32(mmVGA_RENDER_CONTROL); 3968c2ecf20Sopenharmony_ci } 3978c2ecf20Sopenharmony_ci rom_cntl = RREG32_SMC(ixROM_CNTL); 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ci /* enable the rom */ 4008c2ecf20Sopenharmony_ci WREG32(mmBUS_CNTL, (bus_cntl & ~BUS_CNTL__BIOS_ROM_DIS_MASK)); 4018c2ecf20Sopenharmony_ci if (adev->mode_info.num_crtc) { 4028c2ecf20Sopenharmony_ci /* Disable VGA mode */ 4038c2ecf20Sopenharmony_ci WREG32(mmD1VGA_CONTROL, 4048c2ecf20Sopenharmony_ci (d1vga_control & ~(D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK | 4058c2ecf20Sopenharmony_ci D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK))); 4068c2ecf20Sopenharmony_ci WREG32(mmD2VGA_CONTROL, 4078c2ecf20Sopenharmony_ci (d2vga_control & ~(D2VGA_CONTROL__D2VGA_MODE_ENABLE_MASK | 4088c2ecf20Sopenharmony_ci D2VGA_CONTROL__D2VGA_TIMING_SELECT_MASK))); 4098c2ecf20Sopenharmony_ci WREG32(mmVGA_RENDER_CONTROL, 4108c2ecf20Sopenharmony_ci (vga_render_control & ~VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK)); 4118c2ecf20Sopenharmony_ci } 4128c2ecf20Sopenharmony_ci WREG32_SMC(ixROM_CNTL, rom_cntl | ROM_CNTL__SCK_OVERWRITE_MASK); 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_ci r = amdgpu_read_bios(adev); 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci /* restore regs */ 4178c2ecf20Sopenharmony_ci WREG32(mmBUS_CNTL, bus_cntl); 4188c2ecf20Sopenharmony_ci if (adev->mode_info.num_crtc) { 4198c2ecf20Sopenharmony_ci WREG32(mmD1VGA_CONTROL, d1vga_control); 4208c2ecf20Sopenharmony_ci WREG32(mmD2VGA_CONTROL, d2vga_control); 4218c2ecf20Sopenharmony_ci WREG32(mmVGA_RENDER_CONTROL, vga_render_control); 4228c2ecf20Sopenharmony_ci } 4238c2ecf20Sopenharmony_ci WREG32_SMC(ixROM_CNTL, rom_cntl); 4248c2ecf20Sopenharmony_ci return r; 4258c2ecf20Sopenharmony_ci} 4268c2ecf20Sopenharmony_ci 4278c2ecf20Sopenharmony_cistatic bool vi_read_bios_from_rom(struct amdgpu_device *adev, 4288c2ecf20Sopenharmony_ci u8 *bios, u32 length_bytes) 4298c2ecf20Sopenharmony_ci{ 4308c2ecf20Sopenharmony_ci u32 *dw_ptr; 4318c2ecf20Sopenharmony_ci unsigned long flags; 4328c2ecf20Sopenharmony_ci u32 i, length_dw; 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci if (bios == NULL) 4358c2ecf20Sopenharmony_ci return false; 4368c2ecf20Sopenharmony_ci if (length_bytes == 0) 4378c2ecf20Sopenharmony_ci return false; 4388c2ecf20Sopenharmony_ci /* APU vbios image is part of sbios image */ 4398c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 4408c2ecf20Sopenharmony_ci return false; 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci dw_ptr = (u32 *)bios; 4438c2ecf20Sopenharmony_ci length_dw = ALIGN(length_bytes, 4) / 4; 4448c2ecf20Sopenharmony_ci /* take the smc lock since we are using the smc index */ 4458c2ecf20Sopenharmony_ci spin_lock_irqsave(&adev->smc_idx_lock, flags); 4468c2ecf20Sopenharmony_ci /* set rom index to 0 */ 4478c2ecf20Sopenharmony_ci WREG32(mmSMC_IND_INDEX_11, ixROM_INDEX); 4488c2ecf20Sopenharmony_ci WREG32(mmSMC_IND_DATA_11, 0); 4498c2ecf20Sopenharmony_ci /* set index to data for continous read */ 4508c2ecf20Sopenharmony_ci WREG32(mmSMC_IND_INDEX_11, ixROM_DATA); 4518c2ecf20Sopenharmony_ci for (i = 0; i < length_dw; i++) 4528c2ecf20Sopenharmony_ci dw_ptr[i] = RREG32(mmSMC_IND_DATA_11); 4538c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci return true; 4568c2ecf20Sopenharmony_ci} 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_cistatic const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = { 4598c2ecf20Sopenharmony_ci {mmGRBM_STATUS}, 4608c2ecf20Sopenharmony_ci {mmGRBM_STATUS2}, 4618c2ecf20Sopenharmony_ci {mmGRBM_STATUS_SE0}, 4628c2ecf20Sopenharmony_ci {mmGRBM_STATUS_SE1}, 4638c2ecf20Sopenharmony_ci {mmGRBM_STATUS_SE2}, 4648c2ecf20Sopenharmony_ci {mmGRBM_STATUS_SE3}, 4658c2ecf20Sopenharmony_ci {mmSRBM_STATUS}, 4668c2ecf20Sopenharmony_ci {mmSRBM_STATUS2}, 4678c2ecf20Sopenharmony_ci {mmSRBM_STATUS3}, 4688c2ecf20Sopenharmony_ci {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET}, 4698c2ecf20Sopenharmony_ci {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET}, 4708c2ecf20Sopenharmony_ci {mmCP_STAT}, 4718c2ecf20Sopenharmony_ci {mmCP_STALLED_STAT1}, 4728c2ecf20Sopenharmony_ci {mmCP_STALLED_STAT2}, 4738c2ecf20Sopenharmony_ci {mmCP_STALLED_STAT3}, 4748c2ecf20Sopenharmony_ci {mmCP_CPF_BUSY_STAT}, 4758c2ecf20Sopenharmony_ci {mmCP_CPF_STALLED_STAT1}, 4768c2ecf20Sopenharmony_ci {mmCP_CPF_STATUS}, 4778c2ecf20Sopenharmony_ci {mmCP_CPC_BUSY_STAT}, 4788c2ecf20Sopenharmony_ci {mmCP_CPC_STALLED_STAT1}, 4798c2ecf20Sopenharmony_ci {mmCP_CPC_STATUS}, 4808c2ecf20Sopenharmony_ci {mmGB_ADDR_CONFIG}, 4818c2ecf20Sopenharmony_ci {mmMC_ARB_RAMCFG}, 4828c2ecf20Sopenharmony_ci {mmGB_TILE_MODE0}, 4838c2ecf20Sopenharmony_ci {mmGB_TILE_MODE1}, 4848c2ecf20Sopenharmony_ci {mmGB_TILE_MODE2}, 4858c2ecf20Sopenharmony_ci {mmGB_TILE_MODE3}, 4868c2ecf20Sopenharmony_ci {mmGB_TILE_MODE4}, 4878c2ecf20Sopenharmony_ci {mmGB_TILE_MODE5}, 4888c2ecf20Sopenharmony_ci {mmGB_TILE_MODE6}, 4898c2ecf20Sopenharmony_ci {mmGB_TILE_MODE7}, 4908c2ecf20Sopenharmony_ci {mmGB_TILE_MODE8}, 4918c2ecf20Sopenharmony_ci {mmGB_TILE_MODE9}, 4928c2ecf20Sopenharmony_ci {mmGB_TILE_MODE10}, 4938c2ecf20Sopenharmony_ci {mmGB_TILE_MODE11}, 4948c2ecf20Sopenharmony_ci {mmGB_TILE_MODE12}, 4958c2ecf20Sopenharmony_ci {mmGB_TILE_MODE13}, 4968c2ecf20Sopenharmony_ci {mmGB_TILE_MODE14}, 4978c2ecf20Sopenharmony_ci {mmGB_TILE_MODE15}, 4988c2ecf20Sopenharmony_ci {mmGB_TILE_MODE16}, 4998c2ecf20Sopenharmony_ci {mmGB_TILE_MODE17}, 5008c2ecf20Sopenharmony_ci {mmGB_TILE_MODE18}, 5018c2ecf20Sopenharmony_ci {mmGB_TILE_MODE19}, 5028c2ecf20Sopenharmony_ci {mmGB_TILE_MODE20}, 5038c2ecf20Sopenharmony_ci {mmGB_TILE_MODE21}, 5048c2ecf20Sopenharmony_ci {mmGB_TILE_MODE22}, 5058c2ecf20Sopenharmony_ci {mmGB_TILE_MODE23}, 5068c2ecf20Sopenharmony_ci {mmGB_TILE_MODE24}, 5078c2ecf20Sopenharmony_ci {mmGB_TILE_MODE25}, 5088c2ecf20Sopenharmony_ci {mmGB_TILE_MODE26}, 5098c2ecf20Sopenharmony_ci {mmGB_TILE_MODE27}, 5108c2ecf20Sopenharmony_ci {mmGB_TILE_MODE28}, 5118c2ecf20Sopenharmony_ci {mmGB_TILE_MODE29}, 5128c2ecf20Sopenharmony_ci {mmGB_TILE_MODE30}, 5138c2ecf20Sopenharmony_ci {mmGB_TILE_MODE31}, 5148c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE0}, 5158c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE1}, 5168c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE2}, 5178c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE3}, 5188c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE4}, 5198c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE5}, 5208c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE6}, 5218c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE7}, 5228c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE8}, 5238c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE9}, 5248c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE10}, 5258c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE11}, 5268c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE12}, 5278c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE13}, 5288c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE14}, 5298c2ecf20Sopenharmony_ci {mmGB_MACROTILE_MODE15}, 5308c2ecf20Sopenharmony_ci {mmCC_RB_BACKEND_DISABLE, true}, 5318c2ecf20Sopenharmony_ci {mmGC_USER_RB_BACKEND_DISABLE, true}, 5328c2ecf20Sopenharmony_ci {mmGB_BACKEND_MAP, false}, 5338c2ecf20Sopenharmony_ci {mmPA_SC_RASTER_CONFIG, true}, 5348c2ecf20Sopenharmony_ci {mmPA_SC_RASTER_CONFIG_1, true}, 5358c2ecf20Sopenharmony_ci}; 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_cistatic uint32_t vi_get_register_value(struct amdgpu_device *adev, 5388c2ecf20Sopenharmony_ci bool indexed, u32 se_num, 5398c2ecf20Sopenharmony_ci u32 sh_num, u32 reg_offset) 5408c2ecf20Sopenharmony_ci{ 5418c2ecf20Sopenharmony_ci if (indexed) { 5428c2ecf20Sopenharmony_ci uint32_t val; 5438c2ecf20Sopenharmony_ci unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; 5448c2ecf20Sopenharmony_ci unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ci switch (reg_offset) { 5478c2ecf20Sopenharmony_ci case mmCC_RB_BACKEND_DISABLE: 5488c2ecf20Sopenharmony_ci return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; 5498c2ecf20Sopenharmony_ci case mmGC_USER_RB_BACKEND_DISABLE: 5508c2ecf20Sopenharmony_ci return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; 5518c2ecf20Sopenharmony_ci case mmPA_SC_RASTER_CONFIG: 5528c2ecf20Sopenharmony_ci return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; 5538c2ecf20Sopenharmony_ci case mmPA_SC_RASTER_CONFIG_1: 5548c2ecf20Sopenharmony_ci return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1; 5558c2ecf20Sopenharmony_ci } 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci mutex_lock(&adev->grbm_idx_mutex); 5588c2ecf20Sopenharmony_ci if (se_num != 0xffffffff || sh_num != 0xffffffff) 5598c2ecf20Sopenharmony_ci amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); 5608c2ecf20Sopenharmony_ci 5618c2ecf20Sopenharmony_ci val = RREG32(reg_offset); 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci if (se_num != 0xffffffff || sh_num != 0xffffffff) 5648c2ecf20Sopenharmony_ci amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 5658c2ecf20Sopenharmony_ci mutex_unlock(&adev->grbm_idx_mutex); 5668c2ecf20Sopenharmony_ci return val; 5678c2ecf20Sopenharmony_ci } else { 5688c2ecf20Sopenharmony_ci unsigned idx; 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci switch (reg_offset) { 5718c2ecf20Sopenharmony_ci case mmGB_ADDR_CONFIG: 5728c2ecf20Sopenharmony_ci return adev->gfx.config.gb_addr_config; 5738c2ecf20Sopenharmony_ci case mmMC_ARB_RAMCFG: 5748c2ecf20Sopenharmony_ci return adev->gfx.config.mc_arb_ramcfg; 5758c2ecf20Sopenharmony_ci case mmGB_TILE_MODE0: 5768c2ecf20Sopenharmony_ci case mmGB_TILE_MODE1: 5778c2ecf20Sopenharmony_ci case mmGB_TILE_MODE2: 5788c2ecf20Sopenharmony_ci case mmGB_TILE_MODE3: 5798c2ecf20Sopenharmony_ci case mmGB_TILE_MODE4: 5808c2ecf20Sopenharmony_ci case mmGB_TILE_MODE5: 5818c2ecf20Sopenharmony_ci case mmGB_TILE_MODE6: 5828c2ecf20Sopenharmony_ci case mmGB_TILE_MODE7: 5838c2ecf20Sopenharmony_ci case mmGB_TILE_MODE8: 5848c2ecf20Sopenharmony_ci case mmGB_TILE_MODE9: 5858c2ecf20Sopenharmony_ci case mmGB_TILE_MODE10: 5868c2ecf20Sopenharmony_ci case mmGB_TILE_MODE11: 5878c2ecf20Sopenharmony_ci case mmGB_TILE_MODE12: 5888c2ecf20Sopenharmony_ci case mmGB_TILE_MODE13: 5898c2ecf20Sopenharmony_ci case mmGB_TILE_MODE14: 5908c2ecf20Sopenharmony_ci case mmGB_TILE_MODE15: 5918c2ecf20Sopenharmony_ci case mmGB_TILE_MODE16: 5928c2ecf20Sopenharmony_ci case mmGB_TILE_MODE17: 5938c2ecf20Sopenharmony_ci case mmGB_TILE_MODE18: 5948c2ecf20Sopenharmony_ci case mmGB_TILE_MODE19: 5958c2ecf20Sopenharmony_ci case mmGB_TILE_MODE20: 5968c2ecf20Sopenharmony_ci case mmGB_TILE_MODE21: 5978c2ecf20Sopenharmony_ci case mmGB_TILE_MODE22: 5988c2ecf20Sopenharmony_ci case mmGB_TILE_MODE23: 5998c2ecf20Sopenharmony_ci case mmGB_TILE_MODE24: 6008c2ecf20Sopenharmony_ci case mmGB_TILE_MODE25: 6018c2ecf20Sopenharmony_ci case mmGB_TILE_MODE26: 6028c2ecf20Sopenharmony_ci case mmGB_TILE_MODE27: 6038c2ecf20Sopenharmony_ci case mmGB_TILE_MODE28: 6048c2ecf20Sopenharmony_ci case mmGB_TILE_MODE29: 6058c2ecf20Sopenharmony_ci case mmGB_TILE_MODE30: 6068c2ecf20Sopenharmony_ci case mmGB_TILE_MODE31: 6078c2ecf20Sopenharmony_ci idx = (reg_offset - mmGB_TILE_MODE0); 6088c2ecf20Sopenharmony_ci return adev->gfx.config.tile_mode_array[idx]; 6098c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE0: 6108c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE1: 6118c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE2: 6128c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE3: 6138c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE4: 6148c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE5: 6158c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE6: 6168c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE7: 6178c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE8: 6188c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE9: 6198c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE10: 6208c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE11: 6218c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE12: 6228c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE13: 6238c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE14: 6248c2ecf20Sopenharmony_ci case mmGB_MACROTILE_MODE15: 6258c2ecf20Sopenharmony_ci idx = (reg_offset - mmGB_MACROTILE_MODE0); 6268c2ecf20Sopenharmony_ci return adev->gfx.config.macrotile_mode_array[idx]; 6278c2ecf20Sopenharmony_ci default: 6288c2ecf20Sopenharmony_ci return RREG32(reg_offset); 6298c2ecf20Sopenharmony_ci } 6308c2ecf20Sopenharmony_ci } 6318c2ecf20Sopenharmony_ci} 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_cistatic int vi_read_register(struct amdgpu_device *adev, u32 se_num, 6348c2ecf20Sopenharmony_ci u32 sh_num, u32 reg_offset, u32 *value) 6358c2ecf20Sopenharmony_ci{ 6368c2ecf20Sopenharmony_ci uint32_t i; 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci *value = 0; 6398c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(vi_allowed_read_registers); i++) { 6408c2ecf20Sopenharmony_ci bool indexed = vi_allowed_read_registers[i].grbm_indexed; 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_ci if (reg_offset != vi_allowed_read_registers[i].reg_offset) 6438c2ecf20Sopenharmony_ci continue; 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci *value = vi_get_register_value(adev, indexed, se_num, sh_num, 6468c2ecf20Sopenharmony_ci reg_offset); 6478c2ecf20Sopenharmony_ci return 0; 6488c2ecf20Sopenharmony_ci } 6498c2ecf20Sopenharmony_ci return -EINVAL; 6508c2ecf20Sopenharmony_ci} 6518c2ecf20Sopenharmony_ci 6528c2ecf20Sopenharmony_cistatic int vi_gpu_pci_config_reset(struct amdgpu_device *adev) 6538c2ecf20Sopenharmony_ci{ 6548c2ecf20Sopenharmony_ci u32 i; 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci dev_info(adev->dev, "GPU pci config reset\n"); 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci /* disable BM */ 6598c2ecf20Sopenharmony_ci pci_clear_master(adev->pdev); 6608c2ecf20Sopenharmony_ci /* reset */ 6618c2ecf20Sopenharmony_ci amdgpu_device_pci_config_reset(adev); 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_ci udelay(100); 6648c2ecf20Sopenharmony_ci 6658c2ecf20Sopenharmony_ci /* wait for asic to come out of reset */ 6668c2ecf20Sopenharmony_ci for (i = 0; i < adev->usec_timeout; i++) { 6678c2ecf20Sopenharmony_ci if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { 6688c2ecf20Sopenharmony_ci /* enable BM */ 6698c2ecf20Sopenharmony_ci pci_set_master(adev->pdev); 6708c2ecf20Sopenharmony_ci adev->has_hw_reset = true; 6718c2ecf20Sopenharmony_ci return 0; 6728c2ecf20Sopenharmony_ci } 6738c2ecf20Sopenharmony_ci udelay(1); 6748c2ecf20Sopenharmony_ci } 6758c2ecf20Sopenharmony_ci return -EINVAL; 6768c2ecf20Sopenharmony_ci} 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_ci/** 6798c2ecf20Sopenharmony_ci * vi_asic_pci_config_reset - soft reset GPU 6808c2ecf20Sopenharmony_ci * 6818c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer 6828c2ecf20Sopenharmony_ci * 6838c2ecf20Sopenharmony_ci * Use PCI Config method to reset the GPU. 6848c2ecf20Sopenharmony_ci * 6858c2ecf20Sopenharmony_ci * Returns 0 for success. 6868c2ecf20Sopenharmony_ci */ 6878c2ecf20Sopenharmony_cistatic int vi_asic_pci_config_reset(struct amdgpu_device *adev) 6888c2ecf20Sopenharmony_ci{ 6898c2ecf20Sopenharmony_ci int r; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci amdgpu_atombios_scratch_regs_engine_hung(adev, true); 6928c2ecf20Sopenharmony_ci 6938c2ecf20Sopenharmony_ci r = vi_gpu_pci_config_reset(adev); 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci amdgpu_atombios_scratch_regs_engine_hung(adev, false); 6968c2ecf20Sopenharmony_ci 6978c2ecf20Sopenharmony_ci return r; 6988c2ecf20Sopenharmony_ci} 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_cistatic bool vi_asic_supports_baco(struct amdgpu_device *adev) 7018c2ecf20Sopenharmony_ci{ 7028c2ecf20Sopenharmony_ci switch (adev->asic_type) { 7038c2ecf20Sopenharmony_ci case CHIP_FIJI: 7048c2ecf20Sopenharmony_ci case CHIP_TONGA: 7058c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 7068c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 7078c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 7088c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 7098c2ecf20Sopenharmony_ci return amdgpu_dpm_is_baco_supported(adev); 7108c2ecf20Sopenharmony_ci default: 7118c2ecf20Sopenharmony_ci return false; 7128c2ecf20Sopenharmony_ci } 7138c2ecf20Sopenharmony_ci} 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_cistatic enum amd_reset_method 7168c2ecf20Sopenharmony_civi_asic_reset_method(struct amdgpu_device *adev) 7178c2ecf20Sopenharmony_ci{ 7188c2ecf20Sopenharmony_ci bool baco_reset; 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_ci if (amdgpu_reset_method == AMD_RESET_METHOD_LEGACY || 7218c2ecf20Sopenharmony_ci amdgpu_reset_method == AMD_RESET_METHOD_BACO) 7228c2ecf20Sopenharmony_ci return amdgpu_reset_method; 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci if (amdgpu_reset_method != -1) 7258c2ecf20Sopenharmony_ci dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n", 7268c2ecf20Sopenharmony_ci amdgpu_reset_method); 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci switch (adev->asic_type) { 7298c2ecf20Sopenharmony_ci case CHIP_FIJI: 7308c2ecf20Sopenharmony_ci case CHIP_TONGA: 7318c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 7328c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 7338c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 7348c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 7358c2ecf20Sopenharmony_ci baco_reset = amdgpu_dpm_is_baco_supported(adev); 7368c2ecf20Sopenharmony_ci break; 7378c2ecf20Sopenharmony_ci default: 7388c2ecf20Sopenharmony_ci baco_reset = false; 7398c2ecf20Sopenharmony_ci break; 7408c2ecf20Sopenharmony_ci } 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci if (baco_reset) 7438c2ecf20Sopenharmony_ci return AMD_RESET_METHOD_BACO; 7448c2ecf20Sopenharmony_ci else 7458c2ecf20Sopenharmony_ci return AMD_RESET_METHOD_LEGACY; 7468c2ecf20Sopenharmony_ci} 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci/** 7498c2ecf20Sopenharmony_ci * vi_asic_reset - soft reset GPU 7508c2ecf20Sopenharmony_ci * 7518c2ecf20Sopenharmony_ci * @adev: amdgpu_device pointer 7528c2ecf20Sopenharmony_ci * 7538c2ecf20Sopenharmony_ci * Look up which blocks are hung and attempt 7548c2ecf20Sopenharmony_ci * to reset them. 7558c2ecf20Sopenharmony_ci * Returns 0 for success. 7568c2ecf20Sopenharmony_ci */ 7578c2ecf20Sopenharmony_cistatic int vi_asic_reset(struct amdgpu_device *adev) 7588c2ecf20Sopenharmony_ci{ 7598c2ecf20Sopenharmony_ci int r; 7608c2ecf20Sopenharmony_ci 7618c2ecf20Sopenharmony_ci if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { 7628c2ecf20Sopenharmony_ci dev_info(adev->dev, "BACO reset\n"); 7638c2ecf20Sopenharmony_ci r = amdgpu_dpm_baco_reset(adev); 7648c2ecf20Sopenharmony_ci } else { 7658c2ecf20Sopenharmony_ci dev_info(adev->dev, "PCI CONFIG reset\n"); 7668c2ecf20Sopenharmony_ci r = vi_asic_pci_config_reset(adev); 7678c2ecf20Sopenharmony_ci } 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci return r; 7708c2ecf20Sopenharmony_ci} 7718c2ecf20Sopenharmony_ci 7728c2ecf20Sopenharmony_cistatic u32 vi_get_config_memsize(struct amdgpu_device *adev) 7738c2ecf20Sopenharmony_ci{ 7748c2ecf20Sopenharmony_ci return RREG32(mmCONFIG_MEMSIZE); 7758c2ecf20Sopenharmony_ci} 7768c2ecf20Sopenharmony_ci 7778c2ecf20Sopenharmony_cistatic int vi_set_uvd_clock(struct amdgpu_device *adev, u32 clock, 7788c2ecf20Sopenharmony_ci u32 cntl_reg, u32 status_reg) 7798c2ecf20Sopenharmony_ci{ 7808c2ecf20Sopenharmony_ci int r, i; 7818c2ecf20Sopenharmony_ci struct atom_clock_dividers dividers; 7828c2ecf20Sopenharmony_ci uint32_t tmp; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci r = amdgpu_atombios_get_clock_dividers(adev, 7858c2ecf20Sopenharmony_ci COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, 7868c2ecf20Sopenharmony_ci clock, false, ÷rs); 7878c2ecf20Sopenharmony_ci if (r) 7888c2ecf20Sopenharmony_ci return r; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_ci tmp = RREG32_SMC(cntl_reg); 7918c2ecf20Sopenharmony_ci 7928c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 7938c2ecf20Sopenharmony_ci tmp &= ~CG_DCLK_CNTL__DCLK_DIVIDER_MASK; 7948c2ecf20Sopenharmony_ci else 7958c2ecf20Sopenharmony_ci tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK | 7968c2ecf20Sopenharmony_ci CG_DCLK_CNTL__DCLK_DIVIDER_MASK); 7978c2ecf20Sopenharmony_ci tmp |= dividers.post_divider; 7988c2ecf20Sopenharmony_ci WREG32_SMC(cntl_reg, tmp); 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_ci for (i = 0; i < 100; i++) { 8018c2ecf20Sopenharmony_ci tmp = RREG32_SMC(status_reg); 8028c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) { 8038c2ecf20Sopenharmony_ci if (tmp & 0x10000) 8048c2ecf20Sopenharmony_ci break; 8058c2ecf20Sopenharmony_ci } else { 8068c2ecf20Sopenharmony_ci if (tmp & CG_DCLK_STATUS__DCLK_STATUS_MASK) 8078c2ecf20Sopenharmony_ci break; 8088c2ecf20Sopenharmony_ci } 8098c2ecf20Sopenharmony_ci mdelay(10); 8108c2ecf20Sopenharmony_ci } 8118c2ecf20Sopenharmony_ci if (i == 100) 8128c2ecf20Sopenharmony_ci return -ETIMEDOUT; 8138c2ecf20Sopenharmony_ci return 0; 8148c2ecf20Sopenharmony_ci} 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci#define ixGNB_CLK1_DFS_CNTL 0xD82200F0 8178c2ecf20Sopenharmony_ci#define ixGNB_CLK1_STATUS 0xD822010C 8188c2ecf20Sopenharmony_ci#define ixGNB_CLK2_DFS_CNTL 0xD8220110 8198c2ecf20Sopenharmony_ci#define ixGNB_CLK2_STATUS 0xD822012C 8208c2ecf20Sopenharmony_ci#define ixGNB_CLK3_DFS_CNTL 0xD8220130 8218c2ecf20Sopenharmony_ci#define ixGNB_CLK3_STATUS 0xD822014C 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_cistatic int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk) 8248c2ecf20Sopenharmony_ci{ 8258c2ecf20Sopenharmony_ci int r; 8268c2ecf20Sopenharmony_ci 8278c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) { 8288c2ecf20Sopenharmony_ci r = vi_set_uvd_clock(adev, vclk, ixGNB_CLK2_DFS_CNTL, ixGNB_CLK2_STATUS); 8298c2ecf20Sopenharmony_ci if (r) 8308c2ecf20Sopenharmony_ci return r; 8318c2ecf20Sopenharmony_ci 8328c2ecf20Sopenharmony_ci r = vi_set_uvd_clock(adev, dclk, ixGNB_CLK1_DFS_CNTL, ixGNB_CLK1_STATUS); 8338c2ecf20Sopenharmony_ci if (r) 8348c2ecf20Sopenharmony_ci return r; 8358c2ecf20Sopenharmony_ci } else { 8368c2ecf20Sopenharmony_ci r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS); 8378c2ecf20Sopenharmony_ci if (r) 8388c2ecf20Sopenharmony_ci return r; 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_ci r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS); 8418c2ecf20Sopenharmony_ci if (r) 8428c2ecf20Sopenharmony_ci return r; 8438c2ecf20Sopenharmony_ci } 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_ci return 0; 8468c2ecf20Sopenharmony_ci} 8478c2ecf20Sopenharmony_ci 8488c2ecf20Sopenharmony_cistatic int vi_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk) 8498c2ecf20Sopenharmony_ci{ 8508c2ecf20Sopenharmony_ci int r, i; 8518c2ecf20Sopenharmony_ci struct atom_clock_dividers dividers; 8528c2ecf20Sopenharmony_ci u32 tmp; 8538c2ecf20Sopenharmony_ci u32 reg_ctrl; 8548c2ecf20Sopenharmony_ci u32 reg_status; 8558c2ecf20Sopenharmony_ci u32 status_mask; 8568c2ecf20Sopenharmony_ci u32 reg_mask; 8578c2ecf20Sopenharmony_ci 8588c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) { 8598c2ecf20Sopenharmony_ci reg_ctrl = ixGNB_CLK3_DFS_CNTL; 8608c2ecf20Sopenharmony_ci reg_status = ixGNB_CLK3_STATUS; 8618c2ecf20Sopenharmony_ci status_mask = 0x00010000; 8628c2ecf20Sopenharmony_ci reg_mask = CG_ECLK_CNTL__ECLK_DIVIDER_MASK; 8638c2ecf20Sopenharmony_ci } else { 8648c2ecf20Sopenharmony_ci reg_ctrl = ixCG_ECLK_CNTL; 8658c2ecf20Sopenharmony_ci reg_status = ixCG_ECLK_STATUS; 8668c2ecf20Sopenharmony_ci status_mask = CG_ECLK_STATUS__ECLK_STATUS_MASK; 8678c2ecf20Sopenharmony_ci reg_mask = CG_ECLK_CNTL__ECLK_DIR_CNTL_EN_MASK | CG_ECLK_CNTL__ECLK_DIVIDER_MASK; 8688c2ecf20Sopenharmony_ci } 8698c2ecf20Sopenharmony_ci 8708c2ecf20Sopenharmony_ci r = amdgpu_atombios_get_clock_dividers(adev, 8718c2ecf20Sopenharmony_ci COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, 8728c2ecf20Sopenharmony_ci ecclk, false, ÷rs); 8738c2ecf20Sopenharmony_ci if (r) 8748c2ecf20Sopenharmony_ci return r; 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_ci for (i = 0; i < 100; i++) { 8778c2ecf20Sopenharmony_ci if (RREG32_SMC(reg_status) & status_mask) 8788c2ecf20Sopenharmony_ci break; 8798c2ecf20Sopenharmony_ci mdelay(10); 8808c2ecf20Sopenharmony_ci } 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci if (i == 100) 8838c2ecf20Sopenharmony_ci return -ETIMEDOUT; 8848c2ecf20Sopenharmony_ci 8858c2ecf20Sopenharmony_ci tmp = RREG32_SMC(reg_ctrl); 8868c2ecf20Sopenharmony_ci tmp &= ~reg_mask; 8878c2ecf20Sopenharmony_ci tmp |= dividers.post_divider; 8888c2ecf20Sopenharmony_ci WREG32_SMC(reg_ctrl, tmp); 8898c2ecf20Sopenharmony_ci 8908c2ecf20Sopenharmony_ci for (i = 0; i < 100; i++) { 8918c2ecf20Sopenharmony_ci if (RREG32_SMC(reg_status) & status_mask) 8928c2ecf20Sopenharmony_ci break; 8938c2ecf20Sopenharmony_ci mdelay(10); 8948c2ecf20Sopenharmony_ci } 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_ci if (i == 100) 8978c2ecf20Sopenharmony_ci return -ETIMEDOUT; 8988c2ecf20Sopenharmony_ci 8998c2ecf20Sopenharmony_ci return 0; 9008c2ecf20Sopenharmony_ci} 9018c2ecf20Sopenharmony_ci 9028c2ecf20Sopenharmony_cistatic void vi_pcie_gen3_enable(struct amdgpu_device *adev) 9038c2ecf20Sopenharmony_ci{ 9048c2ecf20Sopenharmony_ci if (pci_is_root_bus(adev->pdev->bus)) 9058c2ecf20Sopenharmony_ci return; 9068c2ecf20Sopenharmony_ci 9078c2ecf20Sopenharmony_ci if (amdgpu_pcie_gen2 == 0) 9088c2ecf20Sopenharmony_ci return; 9098c2ecf20Sopenharmony_ci 9108c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 9118c2ecf20Sopenharmony_ci return; 9128c2ecf20Sopenharmony_ci 9138c2ecf20Sopenharmony_ci if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 | 9148c2ecf20Sopenharmony_ci CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3))) 9158c2ecf20Sopenharmony_ci return; 9168c2ecf20Sopenharmony_ci 9178c2ecf20Sopenharmony_ci /* todo */ 9188c2ecf20Sopenharmony_ci} 9198c2ecf20Sopenharmony_ci 9208c2ecf20Sopenharmony_cistatic void vi_program_aspm(struct amdgpu_device *adev) 9218c2ecf20Sopenharmony_ci{ 9228c2ecf20Sopenharmony_ci 9238c2ecf20Sopenharmony_ci if (amdgpu_aspm == 0) 9248c2ecf20Sopenharmony_ci return; 9258c2ecf20Sopenharmony_ci 9268c2ecf20Sopenharmony_ci /* todo */ 9278c2ecf20Sopenharmony_ci} 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_cistatic void vi_enable_doorbell_aperture(struct amdgpu_device *adev, 9308c2ecf20Sopenharmony_ci bool enable) 9318c2ecf20Sopenharmony_ci{ 9328c2ecf20Sopenharmony_ci u32 tmp; 9338c2ecf20Sopenharmony_ci 9348c2ecf20Sopenharmony_ci /* not necessary on CZ */ 9358c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 9368c2ecf20Sopenharmony_ci return; 9378c2ecf20Sopenharmony_ci 9388c2ecf20Sopenharmony_ci tmp = RREG32(mmBIF_DOORBELL_APER_EN); 9398c2ecf20Sopenharmony_ci if (enable) 9408c2ecf20Sopenharmony_ci tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 1); 9418c2ecf20Sopenharmony_ci else 9428c2ecf20Sopenharmony_ci tmp = REG_SET_FIELD(tmp, BIF_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, 0); 9438c2ecf20Sopenharmony_ci 9448c2ecf20Sopenharmony_ci WREG32(mmBIF_DOORBELL_APER_EN, tmp); 9458c2ecf20Sopenharmony_ci} 9468c2ecf20Sopenharmony_ci 9478c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__ADDRESS 0xC0014044 9488c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__SHIFT 9 9498c2ecf20Sopenharmony_ci#define ATI_REV_ID_FUSE_MACRO__MASK 0x00001E00 9508c2ecf20Sopenharmony_ci 9518c2ecf20Sopenharmony_cistatic uint32_t vi_get_rev_id(struct amdgpu_device *adev) 9528c2ecf20Sopenharmony_ci{ 9538c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 9548c2ecf20Sopenharmony_ci return (RREG32_SMC(ATI_REV_ID_FUSE_MACRO__ADDRESS) & ATI_REV_ID_FUSE_MACRO__MASK) 9558c2ecf20Sopenharmony_ci >> ATI_REV_ID_FUSE_MACRO__SHIFT; 9568c2ecf20Sopenharmony_ci else 9578c2ecf20Sopenharmony_ci return (RREG32(mmPCIE_EFUSE4) & PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID_MASK) 9588c2ecf20Sopenharmony_ci >> PCIE_EFUSE4__STRAP_BIF_ATI_REV_ID__SHIFT; 9598c2ecf20Sopenharmony_ci} 9608c2ecf20Sopenharmony_ci 9618c2ecf20Sopenharmony_cistatic void vi_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring) 9628c2ecf20Sopenharmony_ci{ 9638c2ecf20Sopenharmony_ci if (!ring || !ring->funcs->emit_wreg) { 9648c2ecf20Sopenharmony_ci WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 9658c2ecf20Sopenharmony_ci RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL); 9668c2ecf20Sopenharmony_ci } else { 9678c2ecf20Sopenharmony_ci amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1); 9688c2ecf20Sopenharmony_ci } 9698c2ecf20Sopenharmony_ci} 9708c2ecf20Sopenharmony_ci 9718c2ecf20Sopenharmony_cistatic void vi_invalidate_hdp(struct amdgpu_device *adev, 9728c2ecf20Sopenharmony_ci struct amdgpu_ring *ring) 9738c2ecf20Sopenharmony_ci{ 9748c2ecf20Sopenharmony_ci if (!ring || !ring->funcs->emit_wreg) { 9758c2ecf20Sopenharmony_ci WREG32(mmHDP_DEBUG0, 1); 9768c2ecf20Sopenharmony_ci RREG32(mmHDP_DEBUG0); 9778c2ecf20Sopenharmony_ci } else { 9788c2ecf20Sopenharmony_ci amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1); 9798c2ecf20Sopenharmony_ci } 9808c2ecf20Sopenharmony_ci} 9818c2ecf20Sopenharmony_ci 9828c2ecf20Sopenharmony_cistatic bool vi_need_full_reset(struct amdgpu_device *adev) 9838c2ecf20Sopenharmony_ci{ 9848c2ecf20Sopenharmony_ci switch (adev->asic_type) { 9858c2ecf20Sopenharmony_ci case CHIP_CARRIZO: 9868c2ecf20Sopenharmony_ci case CHIP_STONEY: 9878c2ecf20Sopenharmony_ci /* CZ has hang issues with full reset at the moment */ 9888c2ecf20Sopenharmony_ci return false; 9898c2ecf20Sopenharmony_ci case CHIP_FIJI: 9908c2ecf20Sopenharmony_ci case CHIP_TONGA: 9918c2ecf20Sopenharmony_ci /* XXX: soft reset should work on fiji and tonga */ 9928c2ecf20Sopenharmony_ci return true; 9938c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 9948c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 9958c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 9968c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 9978c2ecf20Sopenharmony_ci default: 9988c2ecf20Sopenharmony_ci /* change this when we support soft reset */ 9998c2ecf20Sopenharmony_ci return true; 10008c2ecf20Sopenharmony_ci } 10018c2ecf20Sopenharmony_ci} 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_cistatic void vi_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0, 10048c2ecf20Sopenharmony_ci uint64_t *count1) 10058c2ecf20Sopenharmony_ci{ 10068c2ecf20Sopenharmony_ci uint32_t perfctr = 0; 10078c2ecf20Sopenharmony_ci uint64_t cnt0_of, cnt1_of; 10088c2ecf20Sopenharmony_ci int tmp; 10098c2ecf20Sopenharmony_ci 10108c2ecf20Sopenharmony_ci /* This reports 0 on APUs, so return to avoid writing/reading registers 10118c2ecf20Sopenharmony_ci * that may or may not be different from their GPU counterparts 10128c2ecf20Sopenharmony_ci */ 10138c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 10148c2ecf20Sopenharmony_ci return; 10158c2ecf20Sopenharmony_ci 10168c2ecf20Sopenharmony_ci /* Set the 2 events that we wish to watch, defined above */ 10178c2ecf20Sopenharmony_ci /* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */ 10188c2ecf20Sopenharmony_ci perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40); 10198c2ecf20Sopenharmony_ci perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104); 10208c2ecf20Sopenharmony_ci 10218c2ecf20Sopenharmony_ci /* Write to enable desired perf counters */ 10228c2ecf20Sopenharmony_ci WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr); 10238c2ecf20Sopenharmony_ci /* Zero out and enable the perf counters 10248c2ecf20Sopenharmony_ci * Write 0x5: 10258c2ecf20Sopenharmony_ci * Bit 0 = Start all counters(1) 10268c2ecf20Sopenharmony_ci * Bit 2 = Global counter reset enable(1) 10278c2ecf20Sopenharmony_ci */ 10288c2ecf20Sopenharmony_ci WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005); 10298c2ecf20Sopenharmony_ci 10308c2ecf20Sopenharmony_ci msleep(1000); 10318c2ecf20Sopenharmony_ci 10328c2ecf20Sopenharmony_ci /* Load the shadow and disable the perf counters 10338c2ecf20Sopenharmony_ci * Write 0x2: 10348c2ecf20Sopenharmony_ci * Bit 0 = Stop counters(0) 10358c2ecf20Sopenharmony_ci * Bit 1 = Load the shadow counters(1) 10368c2ecf20Sopenharmony_ci */ 10378c2ecf20Sopenharmony_ci WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002); 10388c2ecf20Sopenharmony_ci 10398c2ecf20Sopenharmony_ci /* Read register values to get any >32bit overflow */ 10408c2ecf20Sopenharmony_ci tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK); 10418c2ecf20Sopenharmony_ci cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER); 10428c2ecf20Sopenharmony_ci cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER); 10438c2ecf20Sopenharmony_ci 10448c2ecf20Sopenharmony_ci /* Get the values and add the overflow */ 10458c2ecf20Sopenharmony_ci *count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32); 10468c2ecf20Sopenharmony_ci *count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32); 10478c2ecf20Sopenharmony_ci} 10488c2ecf20Sopenharmony_ci 10498c2ecf20Sopenharmony_cistatic uint64_t vi_get_pcie_replay_count(struct amdgpu_device *adev) 10508c2ecf20Sopenharmony_ci{ 10518c2ecf20Sopenharmony_ci uint64_t nak_r, nak_g; 10528c2ecf20Sopenharmony_ci 10538c2ecf20Sopenharmony_ci /* Get the number of NAKs received and generated */ 10548c2ecf20Sopenharmony_ci nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK); 10558c2ecf20Sopenharmony_ci nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED); 10568c2ecf20Sopenharmony_ci 10578c2ecf20Sopenharmony_ci /* Add the total number of NAKs, i.e the number of replays */ 10588c2ecf20Sopenharmony_ci return (nak_r + nak_g); 10598c2ecf20Sopenharmony_ci} 10608c2ecf20Sopenharmony_ci 10618c2ecf20Sopenharmony_cistatic bool vi_need_reset_on_init(struct amdgpu_device *adev) 10628c2ecf20Sopenharmony_ci{ 10638c2ecf20Sopenharmony_ci u32 clock_cntl, pc; 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) 10668c2ecf20Sopenharmony_ci return false; 10678c2ecf20Sopenharmony_ci 10688c2ecf20Sopenharmony_ci /* check if the SMC is already running */ 10698c2ecf20Sopenharmony_ci clock_cntl = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0); 10708c2ecf20Sopenharmony_ci pc = RREG32_SMC(ixSMC_PC_C); 10718c2ecf20Sopenharmony_ci if ((0 == REG_GET_FIELD(clock_cntl, SMC_SYSCON_CLOCK_CNTL_0, ck_disable)) && 10728c2ecf20Sopenharmony_ci (0x20100 <= pc)) 10738c2ecf20Sopenharmony_ci return true; 10748c2ecf20Sopenharmony_ci 10758c2ecf20Sopenharmony_ci return false; 10768c2ecf20Sopenharmony_ci} 10778c2ecf20Sopenharmony_ci 10788c2ecf20Sopenharmony_cistatic void vi_pre_asic_init(struct amdgpu_device *adev) 10798c2ecf20Sopenharmony_ci{ 10808c2ecf20Sopenharmony_ci} 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_cistatic const struct amdgpu_asic_funcs vi_asic_funcs = 10838c2ecf20Sopenharmony_ci{ 10848c2ecf20Sopenharmony_ci .read_disabled_bios = &vi_read_disabled_bios, 10858c2ecf20Sopenharmony_ci .read_bios_from_rom = &vi_read_bios_from_rom, 10868c2ecf20Sopenharmony_ci .read_register = &vi_read_register, 10878c2ecf20Sopenharmony_ci .reset = &vi_asic_reset, 10888c2ecf20Sopenharmony_ci .reset_method = &vi_asic_reset_method, 10898c2ecf20Sopenharmony_ci .set_vga_state = &vi_vga_set_state, 10908c2ecf20Sopenharmony_ci .get_xclk = &vi_get_xclk, 10918c2ecf20Sopenharmony_ci .set_uvd_clocks = &vi_set_uvd_clocks, 10928c2ecf20Sopenharmony_ci .set_vce_clocks = &vi_set_vce_clocks, 10938c2ecf20Sopenharmony_ci .get_config_memsize = &vi_get_config_memsize, 10948c2ecf20Sopenharmony_ci .flush_hdp = &vi_flush_hdp, 10958c2ecf20Sopenharmony_ci .invalidate_hdp = &vi_invalidate_hdp, 10968c2ecf20Sopenharmony_ci .need_full_reset = &vi_need_full_reset, 10978c2ecf20Sopenharmony_ci .init_doorbell_index = &legacy_doorbell_index_init, 10988c2ecf20Sopenharmony_ci .get_pcie_usage = &vi_get_pcie_usage, 10998c2ecf20Sopenharmony_ci .need_reset_on_init = &vi_need_reset_on_init, 11008c2ecf20Sopenharmony_ci .get_pcie_replay_count = &vi_get_pcie_replay_count, 11018c2ecf20Sopenharmony_ci .supports_baco = &vi_asic_supports_baco, 11028c2ecf20Sopenharmony_ci .pre_asic_init = &vi_pre_asic_init, 11038c2ecf20Sopenharmony_ci}; 11048c2ecf20Sopenharmony_ci 11058c2ecf20Sopenharmony_ci#define CZ_REV_BRISTOL(rev) \ 11068c2ecf20Sopenharmony_ci ((rev >= 0xC8 && rev <= 0xCE) || (rev >= 0xE1 && rev <= 0xE6)) 11078c2ecf20Sopenharmony_ci 11088c2ecf20Sopenharmony_cistatic int vi_common_early_init(void *handle) 11098c2ecf20Sopenharmony_ci{ 11108c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 11118c2ecf20Sopenharmony_ci 11128c2ecf20Sopenharmony_ci if (adev->flags & AMD_IS_APU) { 11138c2ecf20Sopenharmony_ci adev->smc_rreg = &cz_smc_rreg; 11148c2ecf20Sopenharmony_ci adev->smc_wreg = &cz_smc_wreg; 11158c2ecf20Sopenharmony_ci } else { 11168c2ecf20Sopenharmony_ci adev->smc_rreg = &vi_smc_rreg; 11178c2ecf20Sopenharmony_ci adev->smc_wreg = &vi_smc_wreg; 11188c2ecf20Sopenharmony_ci } 11198c2ecf20Sopenharmony_ci adev->pcie_rreg = &vi_pcie_rreg; 11208c2ecf20Sopenharmony_ci adev->pcie_wreg = &vi_pcie_wreg; 11218c2ecf20Sopenharmony_ci adev->uvd_ctx_rreg = &vi_uvd_ctx_rreg; 11228c2ecf20Sopenharmony_ci adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg; 11238c2ecf20Sopenharmony_ci adev->didt_rreg = &vi_didt_rreg; 11248c2ecf20Sopenharmony_ci adev->didt_wreg = &vi_didt_wreg; 11258c2ecf20Sopenharmony_ci adev->gc_cac_rreg = &vi_gc_cac_rreg; 11268c2ecf20Sopenharmony_ci adev->gc_cac_wreg = &vi_gc_cac_wreg; 11278c2ecf20Sopenharmony_ci 11288c2ecf20Sopenharmony_ci adev->asic_funcs = &vi_asic_funcs; 11298c2ecf20Sopenharmony_ci 11308c2ecf20Sopenharmony_ci adev->rev_id = vi_get_rev_id(adev); 11318c2ecf20Sopenharmony_ci adev->external_rev_id = 0xFF; 11328c2ecf20Sopenharmony_ci switch (adev->asic_type) { 11338c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 11348c2ecf20Sopenharmony_ci adev->cg_flags = 0; 11358c2ecf20Sopenharmony_ci adev->pg_flags = 0; 11368c2ecf20Sopenharmony_ci adev->external_rev_id = 0x1; 11378c2ecf20Sopenharmony_ci break; 11388c2ecf20Sopenharmony_ci case CHIP_FIJI: 11398c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 11408c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_MGLS | 11418c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 11428c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 11438c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS | 11448c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS_LS | 11458c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 11468c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 11478c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 11488c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 11498c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 11508c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 11518c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 11528c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 11538c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 11548c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 11558c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG; 11568c2ecf20Sopenharmony_ci adev->pg_flags = 0; 11578c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x3c; 11588c2ecf20Sopenharmony_ci break; 11598c2ecf20Sopenharmony_ci case CHIP_TONGA: 11608c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 11618c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 11628c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 11638c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 11648c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 11658c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 11668c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 11678c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 11688c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 11698c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 11708c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 11718c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_DRM_LS | 11728c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG; 11738c2ecf20Sopenharmony_ci adev->pg_flags = 0; 11748c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x14; 11758c2ecf20Sopenharmony_ci break; 11768c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 11778c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 11788c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 11798c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 11808c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 11818c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 11828c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGCG | 11838c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGLS | 11848c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 11858c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 11868c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_MGCG | 11878c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 11888c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 11898c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 11908c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 11918c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 11928c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 11938c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_DRM_LS | 11948c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG | 11958c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG; 11968c2ecf20Sopenharmony_ci adev->pg_flags = 0; 11978c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x5A; 11988c2ecf20Sopenharmony_ci break; 11998c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 12008c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 12018c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 12028c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 12038c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 12048c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 12058c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGCG | 12068c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGLS | 12078c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 12088c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 12098c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_MGCG | 12108c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 12118c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 12128c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 12138c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 12148c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 12158c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 12168c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_DRM_LS | 12178c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG | 12188c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG; 12198c2ecf20Sopenharmony_ci adev->pg_flags = 0; 12208c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x50; 12218c2ecf20Sopenharmony_ci break; 12228c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 12238c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 12248c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 12258c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 12268c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 12278c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 12288c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGCG | 12298c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGLS | 12308c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 12318c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 12328c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_MGCG | 12338c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 12348c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 12358c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 12368c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 12378c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 12388c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 12398c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_DRM_LS | 12408c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG | 12418c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG; 12428c2ecf20Sopenharmony_ci adev->pg_flags = 0; 12438c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x64; 12448c2ecf20Sopenharmony_ci break; 12458c2ecf20Sopenharmony_ci case CHIP_VEGAM: 12468c2ecf20Sopenharmony_ci adev->cg_flags = 0; 12478c2ecf20Sopenharmony_ci /*AMD_CG_SUPPORT_GFX_MGCG | 12488c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 12498c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 12508c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 12518c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 12528c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGCG | 12538c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_3D_CGLS | 12548c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 12558c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 12568c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_MGCG | 12578c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 12588c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 12598c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 12608c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_ROM_MGCG | 12618c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_MGCG | 12628c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_MC_LS | 12638c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_DRM_LS | 12648c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_UVD_MGCG | 12658c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG;*/ 12668c2ecf20Sopenharmony_ci adev->pg_flags = 0; 12678c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x6E; 12688c2ecf20Sopenharmony_ci break; 12698c2ecf20Sopenharmony_ci case CHIP_CARRIZO: 12708c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG | 12718c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_MGCG | 12728c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_MGLS | 12738c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 12748c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 12758c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS | 12768c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS_LS | 12778c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGCG | 12788c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 12798c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 12808c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 12818c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 12828c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 12838c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 12848c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG; 12858c2ecf20Sopenharmony_ci /* rev0 hardware requires workarounds to support PG */ 12868c2ecf20Sopenharmony_ci adev->pg_flags = 0; 12878c2ecf20Sopenharmony_ci if (adev->rev_id != 0x00 || CZ_REV_BRISTOL(adev->pdev->revision)) { 12888c2ecf20Sopenharmony_ci adev->pg_flags |= AMD_PG_SUPPORT_GFX_SMG | 12898c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_GFX_PIPELINE | 12908c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_CP | 12918c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_UVD | 12928c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_VCE; 12938c2ecf20Sopenharmony_ci } 12948c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x1; 12958c2ecf20Sopenharmony_ci break; 12968c2ecf20Sopenharmony_ci case CHIP_STONEY: 12978c2ecf20Sopenharmony_ci adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG | 12988c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_MGCG | 12998c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_MGLS | 13008c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_RLC_LS | 13018c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CP_LS | 13028c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS | 13038c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGTS_LS | 13048c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_GFX_CGLS | 13058c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_BIF_LS | 13068c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_MGCG | 13078c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_HDP_LS | 13088c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_MGCG | 13098c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_SDMA_LS | 13108c2ecf20Sopenharmony_ci AMD_CG_SUPPORT_VCE_MGCG; 13118c2ecf20Sopenharmony_ci adev->pg_flags = AMD_PG_SUPPORT_GFX_PG | 13128c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_GFX_SMG | 13138c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_GFX_PIPELINE | 13148c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_CP | 13158c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_UVD | 13168c2ecf20Sopenharmony_ci AMD_PG_SUPPORT_VCE; 13178c2ecf20Sopenharmony_ci adev->external_rev_id = adev->rev_id + 0x61; 13188c2ecf20Sopenharmony_ci break; 13198c2ecf20Sopenharmony_ci default: 13208c2ecf20Sopenharmony_ci /* FIXME: not supported yet */ 13218c2ecf20Sopenharmony_ci return -EINVAL; 13228c2ecf20Sopenharmony_ci } 13238c2ecf20Sopenharmony_ci 13248c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) { 13258c2ecf20Sopenharmony_ci amdgpu_virt_init_setting(adev); 13268c2ecf20Sopenharmony_ci xgpu_vi_mailbox_set_irq_funcs(adev); 13278c2ecf20Sopenharmony_ci } 13288c2ecf20Sopenharmony_ci 13298c2ecf20Sopenharmony_ci return 0; 13308c2ecf20Sopenharmony_ci} 13318c2ecf20Sopenharmony_ci 13328c2ecf20Sopenharmony_cistatic int vi_common_late_init(void *handle) 13338c2ecf20Sopenharmony_ci{ 13348c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13358c2ecf20Sopenharmony_ci 13368c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 13378c2ecf20Sopenharmony_ci xgpu_vi_mailbox_get_irq(adev); 13388c2ecf20Sopenharmony_ci 13398c2ecf20Sopenharmony_ci return 0; 13408c2ecf20Sopenharmony_ci} 13418c2ecf20Sopenharmony_ci 13428c2ecf20Sopenharmony_cistatic int vi_common_sw_init(void *handle) 13438c2ecf20Sopenharmony_ci{ 13448c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13458c2ecf20Sopenharmony_ci 13468c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 13478c2ecf20Sopenharmony_ci xgpu_vi_mailbox_add_irq_id(adev); 13488c2ecf20Sopenharmony_ci 13498c2ecf20Sopenharmony_ci return 0; 13508c2ecf20Sopenharmony_ci} 13518c2ecf20Sopenharmony_ci 13528c2ecf20Sopenharmony_cistatic int vi_common_sw_fini(void *handle) 13538c2ecf20Sopenharmony_ci{ 13548c2ecf20Sopenharmony_ci return 0; 13558c2ecf20Sopenharmony_ci} 13568c2ecf20Sopenharmony_ci 13578c2ecf20Sopenharmony_cistatic int vi_common_hw_init(void *handle) 13588c2ecf20Sopenharmony_ci{ 13598c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13608c2ecf20Sopenharmony_ci 13618c2ecf20Sopenharmony_ci /* move the golden regs per IP block */ 13628c2ecf20Sopenharmony_ci vi_init_golden_registers(adev); 13638c2ecf20Sopenharmony_ci /* enable pcie gen2/3 link */ 13648c2ecf20Sopenharmony_ci vi_pcie_gen3_enable(adev); 13658c2ecf20Sopenharmony_ci /* enable aspm */ 13668c2ecf20Sopenharmony_ci vi_program_aspm(adev); 13678c2ecf20Sopenharmony_ci /* enable the doorbell aperture */ 13688c2ecf20Sopenharmony_ci vi_enable_doorbell_aperture(adev, true); 13698c2ecf20Sopenharmony_ci 13708c2ecf20Sopenharmony_ci return 0; 13718c2ecf20Sopenharmony_ci} 13728c2ecf20Sopenharmony_ci 13738c2ecf20Sopenharmony_cistatic int vi_common_hw_fini(void *handle) 13748c2ecf20Sopenharmony_ci{ 13758c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13768c2ecf20Sopenharmony_ci 13778c2ecf20Sopenharmony_ci /* enable the doorbell aperture */ 13788c2ecf20Sopenharmony_ci vi_enable_doorbell_aperture(adev, false); 13798c2ecf20Sopenharmony_ci 13808c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 13818c2ecf20Sopenharmony_ci xgpu_vi_mailbox_put_irq(adev); 13828c2ecf20Sopenharmony_ci 13838c2ecf20Sopenharmony_ci return 0; 13848c2ecf20Sopenharmony_ci} 13858c2ecf20Sopenharmony_ci 13868c2ecf20Sopenharmony_cistatic int vi_common_suspend(void *handle) 13878c2ecf20Sopenharmony_ci{ 13888c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13898c2ecf20Sopenharmony_ci 13908c2ecf20Sopenharmony_ci return vi_common_hw_fini(adev); 13918c2ecf20Sopenharmony_ci} 13928c2ecf20Sopenharmony_ci 13938c2ecf20Sopenharmony_cistatic int vi_common_resume(void *handle) 13948c2ecf20Sopenharmony_ci{ 13958c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 13968c2ecf20Sopenharmony_ci 13978c2ecf20Sopenharmony_ci return vi_common_hw_init(adev); 13988c2ecf20Sopenharmony_ci} 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_cistatic bool vi_common_is_idle(void *handle) 14018c2ecf20Sopenharmony_ci{ 14028c2ecf20Sopenharmony_ci return true; 14038c2ecf20Sopenharmony_ci} 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_cistatic int vi_common_wait_for_idle(void *handle) 14068c2ecf20Sopenharmony_ci{ 14078c2ecf20Sopenharmony_ci return 0; 14088c2ecf20Sopenharmony_ci} 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_cistatic int vi_common_soft_reset(void *handle) 14118c2ecf20Sopenharmony_ci{ 14128c2ecf20Sopenharmony_ci return 0; 14138c2ecf20Sopenharmony_ci} 14148c2ecf20Sopenharmony_ci 14158c2ecf20Sopenharmony_cistatic void vi_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev, 14168c2ecf20Sopenharmony_ci bool enable) 14178c2ecf20Sopenharmony_ci{ 14188c2ecf20Sopenharmony_ci uint32_t temp, data; 14198c2ecf20Sopenharmony_ci 14208c2ecf20Sopenharmony_ci temp = data = RREG32_PCIE(ixPCIE_CNTL2); 14218c2ecf20Sopenharmony_ci 14228c2ecf20Sopenharmony_ci if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS)) 14238c2ecf20Sopenharmony_ci data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK | 14248c2ecf20Sopenharmony_ci PCIE_CNTL2__MST_MEM_LS_EN_MASK | 14258c2ecf20Sopenharmony_ci PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK; 14268c2ecf20Sopenharmony_ci else 14278c2ecf20Sopenharmony_ci data &= ~(PCIE_CNTL2__SLV_MEM_LS_EN_MASK | 14288c2ecf20Sopenharmony_ci PCIE_CNTL2__MST_MEM_LS_EN_MASK | 14298c2ecf20Sopenharmony_ci PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK); 14308c2ecf20Sopenharmony_ci 14318c2ecf20Sopenharmony_ci if (temp != data) 14328c2ecf20Sopenharmony_ci WREG32_PCIE(ixPCIE_CNTL2, data); 14338c2ecf20Sopenharmony_ci} 14348c2ecf20Sopenharmony_ci 14358c2ecf20Sopenharmony_cistatic void vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev, 14368c2ecf20Sopenharmony_ci bool enable) 14378c2ecf20Sopenharmony_ci{ 14388c2ecf20Sopenharmony_ci uint32_t temp, data; 14398c2ecf20Sopenharmony_ci 14408c2ecf20Sopenharmony_ci temp = data = RREG32(mmHDP_HOST_PATH_CNTL); 14418c2ecf20Sopenharmony_ci 14428c2ecf20Sopenharmony_ci if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG)) 14438c2ecf20Sopenharmony_ci data &= ~HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK; 14448c2ecf20Sopenharmony_ci else 14458c2ecf20Sopenharmony_ci data |= HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK; 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci if (temp != data) 14488c2ecf20Sopenharmony_ci WREG32(mmHDP_HOST_PATH_CNTL, data); 14498c2ecf20Sopenharmony_ci} 14508c2ecf20Sopenharmony_ci 14518c2ecf20Sopenharmony_cistatic void vi_update_hdp_light_sleep(struct amdgpu_device *adev, 14528c2ecf20Sopenharmony_ci bool enable) 14538c2ecf20Sopenharmony_ci{ 14548c2ecf20Sopenharmony_ci uint32_t temp, data; 14558c2ecf20Sopenharmony_ci 14568c2ecf20Sopenharmony_ci temp = data = RREG32(mmHDP_MEM_POWER_LS); 14578c2ecf20Sopenharmony_ci 14588c2ecf20Sopenharmony_ci if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) 14598c2ecf20Sopenharmony_ci data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; 14608c2ecf20Sopenharmony_ci else 14618c2ecf20Sopenharmony_ci data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; 14628c2ecf20Sopenharmony_ci 14638c2ecf20Sopenharmony_ci if (temp != data) 14648c2ecf20Sopenharmony_ci WREG32(mmHDP_MEM_POWER_LS, data); 14658c2ecf20Sopenharmony_ci} 14668c2ecf20Sopenharmony_ci 14678c2ecf20Sopenharmony_cistatic void vi_update_drm_light_sleep(struct amdgpu_device *adev, 14688c2ecf20Sopenharmony_ci bool enable) 14698c2ecf20Sopenharmony_ci{ 14708c2ecf20Sopenharmony_ci uint32_t temp, data; 14718c2ecf20Sopenharmony_ci 14728c2ecf20Sopenharmony_ci temp = data = RREG32(0x157a); 14738c2ecf20Sopenharmony_ci 14748c2ecf20Sopenharmony_ci if (enable && (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS)) 14758c2ecf20Sopenharmony_ci data |= 1; 14768c2ecf20Sopenharmony_ci else 14778c2ecf20Sopenharmony_ci data &= ~1; 14788c2ecf20Sopenharmony_ci 14798c2ecf20Sopenharmony_ci if (temp != data) 14808c2ecf20Sopenharmony_ci WREG32(0x157a, data); 14818c2ecf20Sopenharmony_ci} 14828c2ecf20Sopenharmony_ci 14838c2ecf20Sopenharmony_ci 14848c2ecf20Sopenharmony_cistatic void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev, 14858c2ecf20Sopenharmony_ci bool enable) 14868c2ecf20Sopenharmony_ci{ 14878c2ecf20Sopenharmony_ci uint32_t temp, data; 14888c2ecf20Sopenharmony_ci 14898c2ecf20Sopenharmony_ci temp = data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0); 14908c2ecf20Sopenharmony_ci 14918c2ecf20Sopenharmony_ci if (enable && (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG)) 14928c2ecf20Sopenharmony_ci data &= ~(CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK | 14938c2ecf20Sopenharmony_ci CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK); 14948c2ecf20Sopenharmony_ci else 14958c2ecf20Sopenharmony_ci data |= CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK | 14968c2ecf20Sopenharmony_ci CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK; 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_ci if (temp != data) 14998c2ecf20Sopenharmony_ci WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data); 15008c2ecf20Sopenharmony_ci} 15018c2ecf20Sopenharmony_ci 15028c2ecf20Sopenharmony_cistatic int vi_common_set_clockgating_state_by_smu(void *handle, 15038c2ecf20Sopenharmony_ci enum amd_clockgating_state state) 15048c2ecf20Sopenharmony_ci{ 15058c2ecf20Sopenharmony_ci uint32_t msg_id, pp_state = 0; 15068c2ecf20Sopenharmony_ci uint32_t pp_support_state = 0; 15078c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 15088c2ecf20Sopenharmony_ci 15098c2ecf20Sopenharmony_ci if (adev->cg_flags & (AMD_CG_SUPPORT_MC_LS | AMD_CG_SUPPORT_MC_MGCG)) { 15108c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) { 15118c2ecf20Sopenharmony_ci pp_support_state = PP_STATE_SUPPORT_LS; 15128c2ecf20Sopenharmony_ci pp_state = PP_STATE_LS; 15138c2ecf20Sopenharmony_ci } 15148c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG) { 15158c2ecf20Sopenharmony_ci pp_support_state |= PP_STATE_SUPPORT_CG; 15168c2ecf20Sopenharmony_ci pp_state |= PP_STATE_CG; 15178c2ecf20Sopenharmony_ci } 15188c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15198c2ecf20Sopenharmony_ci pp_state = 0; 15208c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15218c2ecf20Sopenharmony_ci PP_BLOCK_SYS_MC, 15228c2ecf20Sopenharmony_ci pp_support_state, 15238c2ecf20Sopenharmony_ci pp_state); 15248c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 15258c2ecf20Sopenharmony_ci } 15268c2ecf20Sopenharmony_ci 15278c2ecf20Sopenharmony_ci if (adev->cg_flags & (AMD_CG_SUPPORT_SDMA_LS | AMD_CG_SUPPORT_SDMA_MGCG)) { 15288c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS) { 15298c2ecf20Sopenharmony_ci pp_support_state = PP_STATE_SUPPORT_LS; 15308c2ecf20Sopenharmony_ci pp_state = PP_STATE_LS; 15318c2ecf20Sopenharmony_ci } 15328c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG) { 15338c2ecf20Sopenharmony_ci pp_support_state |= PP_STATE_SUPPORT_CG; 15348c2ecf20Sopenharmony_ci pp_state |= PP_STATE_CG; 15358c2ecf20Sopenharmony_ci } 15368c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15378c2ecf20Sopenharmony_ci pp_state = 0; 15388c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15398c2ecf20Sopenharmony_ci PP_BLOCK_SYS_SDMA, 15408c2ecf20Sopenharmony_ci pp_support_state, 15418c2ecf20Sopenharmony_ci pp_state); 15428c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 15438c2ecf20Sopenharmony_ci } 15448c2ecf20Sopenharmony_ci 15458c2ecf20Sopenharmony_ci if (adev->cg_flags & (AMD_CG_SUPPORT_HDP_LS | AMD_CG_SUPPORT_HDP_MGCG)) { 15468c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS) { 15478c2ecf20Sopenharmony_ci pp_support_state = PP_STATE_SUPPORT_LS; 15488c2ecf20Sopenharmony_ci pp_state = PP_STATE_LS; 15498c2ecf20Sopenharmony_ci } 15508c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG) { 15518c2ecf20Sopenharmony_ci pp_support_state |= PP_STATE_SUPPORT_CG; 15528c2ecf20Sopenharmony_ci pp_state |= PP_STATE_CG; 15538c2ecf20Sopenharmony_ci } 15548c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15558c2ecf20Sopenharmony_ci pp_state = 0; 15568c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15578c2ecf20Sopenharmony_ci PP_BLOCK_SYS_HDP, 15588c2ecf20Sopenharmony_ci pp_support_state, 15598c2ecf20Sopenharmony_ci pp_state); 15608c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 15618c2ecf20Sopenharmony_ci } 15628c2ecf20Sopenharmony_ci 15638c2ecf20Sopenharmony_ci 15648c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS) { 15658c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15668c2ecf20Sopenharmony_ci pp_state = 0; 15678c2ecf20Sopenharmony_ci else 15688c2ecf20Sopenharmony_ci pp_state = PP_STATE_LS; 15698c2ecf20Sopenharmony_ci 15708c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15718c2ecf20Sopenharmony_ci PP_BLOCK_SYS_BIF, 15728c2ecf20Sopenharmony_ci PP_STATE_SUPPORT_LS, 15738c2ecf20Sopenharmony_ci pp_state); 15748c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 15758c2ecf20Sopenharmony_ci } 15768c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_BIF_MGCG) { 15778c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15788c2ecf20Sopenharmony_ci pp_state = 0; 15798c2ecf20Sopenharmony_ci else 15808c2ecf20Sopenharmony_ci pp_state = PP_STATE_CG; 15818c2ecf20Sopenharmony_ci 15828c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15838c2ecf20Sopenharmony_ci PP_BLOCK_SYS_BIF, 15848c2ecf20Sopenharmony_ci PP_STATE_SUPPORT_CG, 15858c2ecf20Sopenharmony_ci pp_state); 15868c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 15878c2ecf20Sopenharmony_ci } 15888c2ecf20Sopenharmony_ci 15898c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_DRM_LS) { 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 15928c2ecf20Sopenharmony_ci pp_state = 0; 15938c2ecf20Sopenharmony_ci else 15948c2ecf20Sopenharmony_ci pp_state = PP_STATE_LS; 15958c2ecf20Sopenharmony_ci 15968c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 15978c2ecf20Sopenharmony_ci PP_BLOCK_SYS_DRM, 15988c2ecf20Sopenharmony_ci PP_STATE_SUPPORT_LS, 15998c2ecf20Sopenharmony_ci pp_state); 16008c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 16018c2ecf20Sopenharmony_ci } 16028c2ecf20Sopenharmony_ci 16038c2ecf20Sopenharmony_ci if (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG) { 16048c2ecf20Sopenharmony_ci 16058c2ecf20Sopenharmony_ci if (state == AMD_CG_STATE_UNGATE) 16068c2ecf20Sopenharmony_ci pp_state = 0; 16078c2ecf20Sopenharmony_ci else 16088c2ecf20Sopenharmony_ci pp_state = PP_STATE_CG; 16098c2ecf20Sopenharmony_ci 16108c2ecf20Sopenharmony_ci msg_id = PP_CG_MSG_ID(PP_GROUP_SYS, 16118c2ecf20Sopenharmony_ci PP_BLOCK_SYS_ROM, 16128c2ecf20Sopenharmony_ci PP_STATE_SUPPORT_CG, 16138c2ecf20Sopenharmony_ci pp_state); 16148c2ecf20Sopenharmony_ci amdgpu_dpm_set_clockgating_by_smu(adev, msg_id); 16158c2ecf20Sopenharmony_ci } 16168c2ecf20Sopenharmony_ci return 0; 16178c2ecf20Sopenharmony_ci} 16188c2ecf20Sopenharmony_ci 16198c2ecf20Sopenharmony_cistatic int vi_common_set_clockgating_state(void *handle, 16208c2ecf20Sopenharmony_ci enum amd_clockgating_state state) 16218c2ecf20Sopenharmony_ci{ 16228c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 16238c2ecf20Sopenharmony_ci 16248c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 16258c2ecf20Sopenharmony_ci return 0; 16268c2ecf20Sopenharmony_ci 16278c2ecf20Sopenharmony_ci switch (adev->asic_type) { 16288c2ecf20Sopenharmony_ci case CHIP_FIJI: 16298c2ecf20Sopenharmony_ci vi_update_bif_medium_grain_light_sleep(adev, 16308c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16318c2ecf20Sopenharmony_ci vi_update_hdp_medium_grain_clock_gating(adev, 16328c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16338c2ecf20Sopenharmony_ci vi_update_hdp_light_sleep(adev, 16348c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16358c2ecf20Sopenharmony_ci vi_update_rom_medium_grain_clock_gating(adev, 16368c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16378c2ecf20Sopenharmony_ci break; 16388c2ecf20Sopenharmony_ci case CHIP_CARRIZO: 16398c2ecf20Sopenharmony_ci case CHIP_STONEY: 16408c2ecf20Sopenharmony_ci vi_update_bif_medium_grain_light_sleep(adev, 16418c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16428c2ecf20Sopenharmony_ci vi_update_hdp_medium_grain_clock_gating(adev, 16438c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16448c2ecf20Sopenharmony_ci vi_update_hdp_light_sleep(adev, 16458c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16468c2ecf20Sopenharmony_ci vi_update_drm_light_sleep(adev, 16478c2ecf20Sopenharmony_ci state == AMD_CG_STATE_GATE); 16488c2ecf20Sopenharmony_ci break; 16498c2ecf20Sopenharmony_ci case CHIP_TONGA: 16508c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 16518c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 16528c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 16538c2ecf20Sopenharmony_ci case CHIP_VEGAM: 16548c2ecf20Sopenharmony_ci vi_common_set_clockgating_state_by_smu(adev, state); 16558c2ecf20Sopenharmony_ci default: 16568c2ecf20Sopenharmony_ci break; 16578c2ecf20Sopenharmony_ci } 16588c2ecf20Sopenharmony_ci return 0; 16598c2ecf20Sopenharmony_ci} 16608c2ecf20Sopenharmony_ci 16618c2ecf20Sopenharmony_cistatic int vi_common_set_powergating_state(void *handle, 16628c2ecf20Sopenharmony_ci enum amd_powergating_state state) 16638c2ecf20Sopenharmony_ci{ 16648c2ecf20Sopenharmony_ci return 0; 16658c2ecf20Sopenharmony_ci} 16668c2ecf20Sopenharmony_ci 16678c2ecf20Sopenharmony_cistatic void vi_common_get_clockgating_state(void *handle, u32 *flags) 16688c2ecf20Sopenharmony_ci{ 16698c2ecf20Sopenharmony_ci struct amdgpu_device *adev = (struct amdgpu_device *)handle; 16708c2ecf20Sopenharmony_ci int data; 16718c2ecf20Sopenharmony_ci 16728c2ecf20Sopenharmony_ci if (amdgpu_sriov_vf(adev)) 16738c2ecf20Sopenharmony_ci *flags = 0; 16748c2ecf20Sopenharmony_ci 16758c2ecf20Sopenharmony_ci /* AMD_CG_SUPPORT_BIF_LS */ 16768c2ecf20Sopenharmony_ci data = RREG32_PCIE(ixPCIE_CNTL2); 16778c2ecf20Sopenharmony_ci if (data & PCIE_CNTL2__SLV_MEM_LS_EN_MASK) 16788c2ecf20Sopenharmony_ci *flags |= AMD_CG_SUPPORT_BIF_LS; 16798c2ecf20Sopenharmony_ci 16808c2ecf20Sopenharmony_ci /* AMD_CG_SUPPORT_HDP_LS */ 16818c2ecf20Sopenharmony_ci data = RREG32(mmHDP_MEM_POWER_LS); 16828c2ecf20Sopenharmony_ci if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK) 16838c2ecf20Sopenharmony_ci *flags |= AMD_CG_SUPPORT_HDP_LS; 16848c2ecf20Sopenharmony_ci 16858c2ecf20Sopenharmony_ci /* AMD_CG_SUPPORT_HDP_MGCG */ 16868c2ecf20Sopenharmony_ci data = RREG32(mmHDP_HOST_PATH_CNTL); 16878c2ecf20Sopenharmony_ci if (!(data & HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK)) 16888c2ecf20Sopenharmony_ci *flags |= AMD_CG_SUPPORT_HDP_MGCG; 16898c2ecf20Sopenharmony_ci 16908c2ecf20Sopenharmony_ci /* AMD_CG_SUPPORT_ROM_MGCG */ 16918c2ecf20Sopenharmony_ci data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0); 16928c2ecf20Sopenharmony_ci if (!(data & CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK)) 16938c2ecf20Sopenharmony_ci *flags |= AMD_CG_SUPPORT_ROM_MGCG; 16948c2ecf20Sopenharmony_ci} 16958c2ecf20Sopenharmony_ci 16968c2ecf20Sopenharmony_cistatic const struct amd_ip_funcs vi_common_ip_funcs = { 16978c2ecf20Sopenharmony_ci .name = "vi_common", 16988c2ecf20Sopenharmony_ci .early_init = vi_common_early_init, 16998c2ecf20Sopenharmony_ci .late_init = vi_common_late_init, 17008c2ecf20Sopenharmony_ci .sw_init = vi_common_sw_init, 17018c2ecf20Sopenharmony_ci .sw_fini = vi_common_sw_fini, 17028c2ecf20Sopenharmony_ci .hw_init = vi_common_hw_init, 17038c2ecf20Sopenharmony_ci .hw_fini = vi_common_hw_fini, 17048c2ecf20Sopenharmony_ci .suspend = vi_common_suspend, 17058c2ecf20Sopenharmony_ci .resume = vi_common_resume, 17068c2ecf20Sopenharmony_ci .is_idle = vi_common_is_idle, 17078c2ecf20Sopenharmony_ci .wait_for_idle = vi_common_wait_for_idle, 17088c2ecf20Sopenharmony_ci .soft_reset = vi_common_soft_reset, 17098c2ecf20Sopenharmony_ci .set_clockgating_state = vi_common_set_clockgating_state, 17108c2ecf20Sopenharmony_ci .set_powergating_state = vi_common_set_powergating_state, 17118c2ecf20Sopenharmony_ci .get_clockgating_state = vi_common_get_clockgating_state, 17128c2ecf20Sopenharmony_ci}; 17138c2ecf20Sopenharmony_ci 17148c2ecf20Sopenharmony_cistatic const struct amdgpu_ip_block_version vi_common_ip_block = 17158c2ecf20Sopenharmony_ci{ 17168c2ecf20Sopenharmony_ci .type = AMD_IP_BLOCK_TYPE_COMMON, 17178c2ecf20Sopenharmony_ci .major = 1, 17188c2ecf20Sopenharmony_ci .minor = 0, 17198c2ecf20Sopenharmony_ci .rev = 0, 17208c2ecf20Sopenharmony_ci .funcs = &vi_common_ip_funcs, 17218c2ecf20Sopenharmony_ci}; 17228c2ecf20Sopenharmony_ci 17238c2ecf20Sopenharmony_civoid vi_set_virt_ops(struct amdgpu_device *adev) 17248c2ecf20Sopenharmony_ci{ 17258c2ecf20Sopenharmony_ci adev->virt.ops = &xgpu_vi_virt_ops; 17268c2ecf20Sopenharmony_ci} 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ciint vi_set_ip_blocks(struct amdgpu_device *adev) 17298c2ecf20Sopenharmony_ci{ 17308c2ecf20Sopenharmony_ci switch (adev->asic_type) { 17318c2ecf20Sopenharmony_ci case CHIP_TOPAZ: 17328c2ecf20Sopenharmony_ci /* topaz has no DCE, UVD, VCE */ 17338c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 17348c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block); 17358c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block); 17368c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block); 17378c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v2_4_ip_block); 17388c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 17398c2ecf20Sopenharmony_ci if (adev->enable_virtual_display) 17408c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 17418c2ecf20Sopenharmony_ci break; 17428c2ecf20Sopenharmony_ci case CHIP_FIJI: 17438c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 17448c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block); 17458c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block); 17468c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block); 17478c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block); 17488c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 17498c2ecf20Sopenharmony_ci if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) 17508c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 17518c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 17528c2ecf20Sopenharmony_ci else if (amdgpu_device_has_dc_support(adev)) 17538c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dm_ip_block); 17548c2ecf20Sopenharmony_ci#endif 17558c2ecf20Sopenharmony_ci else 17568c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_v10_1_ip_block); 17578c2ecf20Sopenharmony_ci if (!amdgpu_sriov_vf(adev)) { 17588c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block); 17598c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block); 17608c2ecf20Sopenharmony_ci } 17618c2ecf20Sopenharmony_ci break; 17628c2ecf20Sopenharmony_ci case CHIP_TONGA: 17638c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 17648c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block); 17658c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block); 17668c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block); 17678c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block); 17688c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 17698c2ecf20Sopenharmony_ci if (adev->enable_virtual_display || amdgpu_sriov_vf(adev)) 17708c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 17718c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 17728c2ecf20Sopenharmony_ci else if (amdgpu_device_has_dc_support(adev)) 17738c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dm_ip_block); 17748c2ecf20Sopenharmony_ci#endif 17758c2ecf20Sopenharmony_ci else 17768c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_v10_0_ip_block); 17778c2ecf20Sopenharmony_ci if (!amdgpu_sriov_vf(adev)) { 17788c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &uvd_v5_0_ip_block); 17798c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block); 17808c2ecf20Sopenharmony_ci } 17818c2ecf20Sopenharmony_ci break; 17828c2ecf20Sopenharmony_ci case CHIP_POLARIS10: 17838c2ecf20Sopenharmony_ci case CHIP_POLARIS11: 17848c2ecf20Sopenharmony_ci case CHIP_POLARIS12: 17858c2ecf20Sopenharmony_ci case CHIP_VEGAM: 17868c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 17878c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block); 17888c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block); 17898c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block); 17908c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v3_1_ip_block); 17918c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 17928c2ecf20Sopenharmony_ci if (adev->enable_virtual_display) 17938c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 17948c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 17958c2ecf20Sopenharmony_ci else if (amdgpu_device_has_dc_support(adev)) 17968c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dm_ip_block); 17978c2ecf20Sopenharmony_ci#endif 17988c2ecf20Sopenharmony_ci else 17998c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_v11_2_ip_block); 18008c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &uvd_v6_3_ip_block); 18018c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block); 18028c2ecf20Sopenharmony_ci break; 18038c2ecf20Sopenharmony_ci case CHIP_CARRIZO: 18048c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 18058c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block); 18068c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &cz_ih_ip_block); 18078c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block); 18088c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block); 18098c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 18108c2ecf20Sopenharmony_ci if (adev->enable_virtual_display) 18118c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 18128c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 18138c2ecf20Sopenharmony_ci else if (amdgpu_device_has_dc_support(adev)) 18148c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dm_ip_block); 18158c2ecf20Sopenharmony_ci#endif 18168c2ecf20Sopenharmony_ci else 18178c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block); 18188c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block); 18198c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vce_v3_1_ip_block); 18208c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP) 18218c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &acp_ip_block); 18228c2ecf20Sopenharmony_ci#endif 18238c2ecf20Sopenharmony_ci break; 18248c2ecf20Sopenharmony_ci case CHIP_STONEY: 18258c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vi_common_ip_block); 18268c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block); 18278c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &cz_ih_ip_block); 18288c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &gfx_v8_1_ip_block); 18298c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block); 18308c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &pp_smu_ip_block); 18318c2ecf20Sopenharmony_ci if (adev->enable_virtual_display) 18328c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); 18338c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) 18348c2ecf20Sopenharmony_ci else if (amdgpu_device_has_dc_support(adev)) 18358c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dm_ip_block); 18368c2ecf20Sopenharmony_ci#endif 18378c2ecf20Sopenharmony_ci else 18388c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block); 18398c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &uvd_v6_2_ip_block); 18408c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block); 18418c2ecf20Sopenharmony_ci#if defined(CONFIG_DRM_AMD_ACP) 18428c2ecf20Sopenharmony_ci amdgpu_device_ip_block_add(adev, &acp_ip_block); 18438c2ecf20Sopenharmony_ci#endif 18448c2ecf20Sopenharmony_ci break; 18458c2ecf20Sopenharmony_ci default: 18468c2ecf20Sopenharmony_ci /* FIXME: not supported yet */ 18478c2ecf20Sopenharmony_ci return -EINVAL; 18488c2ecf20Sopenharmony_ci } 18498c2ecf20Sopenharmony_ci 18508c2ecf20Sopenharmony_ci return 0; 18518c2ecf20Sopenharmony_ci} 18528c2ecf20Sopenharmony_ci 18538c2ecf20Sopenharmony_civoid legacy_doorbell_index_init(struct amdgpu_device *adev) 18548c2ecf20Sopenharmony_ci{ 18558c2ecf20Sopenharmony_ci adev->doorbell_index.kiq = AMDGPU_DOORBELL_KIQ; 18568c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring0 = AMDGPU_DOORBELL_MEC_RING0; 18578c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring1 = AMDGPU_DOORBELL_MEC_RING1; 18588c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring2 = AMDGPU_DOORBELL_MEC_RING2; 18598c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring3 = AMDGPU_DOORBELL_MEC_RING3; 18608c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring4 = AMDGPU_DOORBELL_MEC_RING4; 18618c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring5 = AMDGPU_DOORBELL_MEC_RING5; 18628c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring6 = AMDGPU_DOORBELL_MEC_RING6; 18638c2ecf20Sopenharmony_ci adev->doorbell_index.mec_ring7 = AMDGPU_DOORBELL_MEC_RING7; 18648c2ecf20Sopenharmony_ci adev->doorbell_index.gfx_ring0 = AMDGPU_DOORBELL_GFX_RING0; 18658c2ecf20Sopenharmony_ci adev->doorbell_index.sdma_engine[0] = AMDGPU_DOORBELL_sDMA_ENGINE0; 18668c2ecf20Sopenharmony_ci adev->doorbell_index.sdma_engine[1] = AMDGPU_DOORBELL_sDMA_ENGINE1; 18678c2ecf20Sopenharmony_ci adev->doorbell_index.ih = AMDGPU_DOORBELL_IH; 18688c2ecf20Sopenharmony_ci adev->doorbell_index.max_assignment = AMDGPU_DOORBELL_MAX_ASSIGNMENT; 18698c2ecf20Sopenharmony_ci} 1870