14af2e15cSLikun Gao /*
24af2e15cSLikun Gao * Copyright 2025 Advanced Micro Devices, Inc.
34af2e15cSLikun Gao *
44af2e15cSLikun Gao * Permission is hereby granted, free of charge, to any person obtaining a
54af2e15cSLikun Gao * copy of this software and associated documentation files (the "Software"),
64af2e15cSLikun Gao * to deal in the Software without restriction, including without limitation
74af2e15cSLikun Gao * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84af2e15cSLikun Gao * and/or sell copies of the Software, and to permit persons to whom the
94af2e15cSLikun Gao * Software is furnished to do so, subject to the following conditions:
104af2e15cSLikun Gao *
114af2e15cSLikun Gao * The above copyright notice and this permission notice shall be included in
124af2e15cSLikun Gao * all copies or substantial portions of the Software.
134af2e15cSLikun Gao *
144af2e15cSLikun Gao * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154af2e15cSLikun Gao * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164af2e15cSLikun Gao * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
174af2e15cSLikun Gao * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
184af2e15cSLikun Gao * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194af2e15cSLikun Gao * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204af2e15cSLikun Gao * OTHER DEALINGS IN THE SOFTWARE.
214af2e15cSLikun Gao *
224af2e15cSLikun Gao */
234af2e15cSLikun Gao
244af2e15cSLikun Gao #include "amdgpu.h"
254af2e15cSLikun Gao #include "mmhub_v4_2_0.h"
264af2e15cSLikun Gao
274af2e15cSLikun Gao #include "mmhub/mmhub_4_2_0_offset.h"
284af2e15cSLikun Gao #include "mmhub/mmhub_4_2_0_sh_mask.h"
294af2e15cSLikun Gao
304af2e15cSLikun Gao #include "soc15_common.h"
314af2e15cSLikun Gao #include "soc24_enum.h"
324af2e15cSLikun Gao
334af2e15cSLikun Gao #define regMMVM_L2_CNTL3_DEFAULT 0x80100007
344af2e15cSLikun Gao #define regMMVM_L2_CNTL4_DEFAULT 0x000000c1
354af2e15cSLikun Gao #define regMMVM_L2_CNTL5_DEFAULT 0x00003fe0
364af2e15cSLikun Gao
374af2e15cSLikun Gao static const char *mmhub_client_ids_v4_2_0[][2] = {
384af2e15cSLikun Gao [0][0] = "VMC",
394af2e15cSLikun Gao [4][0] = "DCEDMC",
404af2e15cSLikun Gao [5][0] = "DCEVGA",
414af2e15cSLikun Gao [6][0] = "MP0",
424af2e15cSLikun Gao [7][0] = "MP1",
434af2e15cSLikun Gao [8][0] = "MPIO",
444af2e15cSLikun Gao [16][0] = "HDP",
454af2e15cSLikun Gao [17][0] = "LSDMA",
464af2e15cSLikun Gao [18][0] = "JPEG",
474af2e15cSLikun Gao [19][0] = "VCNU0",
484af2e15cSLikun Gao [21][0] = "VSCH",
494af2e15cSLikun Gao [22][0] = "VCNU1",
504af2e15cSLikun Gao [23][0] = "VCN1",
514af2e15cSLikun Gao [32+20][0] = "VCN0",
524af2e15cSLikun Gao [2][1] = "DBGUNBIO",
534af2e15cSLikun Gao [3][1] = "DCEDWB",
544af2e15cSLikun Gao [4][1] = "DCEDMC",
554af2e15cSLikun Gao [5][1] = "DCEVGA",
564af2e15cSLikun Gao [6][1] = "MP0",
574af2e15cSLikun Gao [7][1] = "MP1",
584af2e15cSLikun Gao [8][1] = "MPIO",
594af2e15cSLikun Gao [10][1] = "DBGU0",
604af2e15cSLikun Gao [11][1] = "DBGU1",
614af2e15cSLikun Gao [12][1] = "DBGU2",
624af2e15cSLikun Gao [13][1] = "DBGU3",
634af2e15cSLikun Gao [14][1] = "XDP",
644af2e15cSLikun Gao [15][1] = "OSSSYS",
654af2e15cSLikun Gao [16][1] = "HDP",
664af2e15cSLikun Gao [17][1] = "LSDMA",
674af2e15cSLikun Gao [18][1] = "JPEG",
684af2e15cSLikun Gao [19][1] = "VCNU0",
694af2e15cSLikun Gao [20][1] = "VCN0",
704af2e15cSLikun Gao [21][1] = "VSCH",
714af2e15cSLikun Gao [22][1] = "VCNU1",
724af2e15cSLikun Gao [23][1] = "VCN1",
734af2e15cSLikun Gao };
744af2e15cSLikun Gao
mmhub_v4_2_0_get_fb_location(struct amdgpu_device * adev)754af2e15cSLikun Gao static u64 mmhub_v4_2_0_get_fb_location(struct amdgpu_device *adev)
764af2e15cSLikun Gao {
774af2e15cSLikun Gao u64 base;
784af2e15cSLikun Gao
794af2e15cSLikun Gao base = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0),
804af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_BASE_LO32);
814af2e15cSLikun Gao base &= MMMC_VM_FB_LOCATION_BASE_LO32__FB_BASE_LO32_MASK;
824af2e15cSLikun Gao base <<= 24;
834af2e15cSLikun Gao
844af2e15cSLikun Gao base |= ((u64)(MMMC_VM_FB_LOCATION_BASE_HI32__FB_BASE_HI1_MASK &
854af2e15cSLikun Gao RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0),
864af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_BASE_HI32)) << 56);
874af2e15cSLikun Gao
884af2e15cSLikun Gao return base;
894af2e15cSLikun Gao }
904af2e15cSLikun Gao
mmhub_v4_2_0_get_mc_fb_offset(struct amdgpu_device * adev)914af2e15cSLikun Gao static u64 mmhub_v4_2_0_get_mc_fb_offset(struct amdgpu_device *adev)
924af2e15cSLikun Gao {
934af2e15cSLikun Gao return (u64)RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0),
944af2e15cSLikun Gao regMMMC_VM_FB_OFFSET) << 24;
954af2e15cSLikun Gao }
964af2e15cSLikun Gao
mmhub_v4_2_0_mid_setup_vm_pt_regs(struct amdgpu_device * adev,uint32_t vmid,uint64_t page_table_base,uint32_t mid_mask)974af2e15cSLikun Gao static void mmhub_v4_2_0_mid_setup_vm_pt_regs(struct amdgpu_device *adev,
984af2e15cSLikun Gao uint32_t vmid,
994af2e15cSLikun Gao uint64_t page_table_base,
1004af2e15cSLikun Gao uint32_t mid_mask)
1014af2e15cSLikun Gao {
1024af2e15cSLikun Gao struct amdgpu_vmhub *hub;
1034af2e15cSLikun Gao int i;
1044af2e15cSLikun Gao
1054af2e15cSLikun Gao for_each_inst(i, mid_mask) {
1064af2e15cSLikun Gao hub = &adev->vmhub[AMDGPU_MMHUB0(i)];
1074af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, i),
1084af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,
1094af2e15cSLikun Gao hub->ctx_addr_distance * vmid,
1104af2e15cSLikun Gao lower_32_bits(page_table_base));
1114af2e15cSLikun Gao
1124af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, i),
1134af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32,
1144af2e15cSLikun Gao hub->ctx_addr_distance * vmid,
1154af2e15cSLikun Gao upper_32_bits(page_table_base));
1164af2e15cSLikun Gao }
1174af2e15cSLikun Gao }
1184af2e15cSLikun Gao
mmhub_v4_2_0_setup_vm_pt_regs(struct amdgpu_device * adev,uint32_t vmid,uint64_t page_table_base)1194af2e15cSLikun Gao static void mmhub_v4_2_0_setup_vm_pt_regs(struct amdgpu_device *adev,
1204af2e15cSLikun Gao uint32_t vmid,
1214af2e15cSLikun Gao uint64_t page_table_base)
1224af2e15cSLikun Gao {
1234af2e15cSLikun Gao uint32_t mid_mask;
1244af2e15cSLikun Gao
1254af2e15cSLikun Gao mid_mask = adev->aid_mask;
1264af2e15cSLikun Gao mmhub_v4_2_0_mid_setup_vm_pt_regs(adev, vmid,
1274af2e15cSLikun Gao page_table_base,
1284af2e15cSLikun Gao mid_mask);
1294af2e15cSLikun Gao }
1304af2e15cSLikun Gao
mmhub_v4_2_0_mid_init_gart_aperture_regs(struct amdgpu_device * adev,uint32_t mid_mask)1314af2e15cSLikun Gao static void mmhub_v4_2_0_mid_init_gart_aperture_regs(struct amdgpu_device *adev,
1324af2e15cSLikun Gao uint32_t mid_mask)
1334af2e15cSLikun Gao {
1344af2e15cSLikun Gao uint64_t pt_base = amdgpu_gmc_pd_addr(adev->gart.bo);
1354af2e15cSLikun Gao int i;
1364af2e15cSLikun Gao
1374af2e15cSLikun Gao if (adev->gmc.pdb0_bo)
1384af2e15cSLikun Gao pt_base = amdgpu_gmc_pd_addr(adev->gmc.pdb0_bo);
1394af2e15cSLikun Gao else
1404af2e15cSLikun Gao pt_base = amdgpu_gmc_pd_addr(adev->gart.bo);
1414af2e15cSLikun Gao
1424af2e15cSLikun Gao mmhub_v4_2_0_mid_setup_vm_pt_regs(adev, 0, pt_base, mid_mask);
1434af2e15cSLikun Gao
1444af2e15cSLikun Gao for_each_inst(i, mid_mask) {
1454af2e15cSLikun Gao if (adev->gmc.pdb0_bo) {
1464af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1474af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
1484af2e15cSLikun Gao (u32)(adev->gmc.fb_start >> 12));
1494af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1504af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32,
1514af2e15cSLikun Gao (u32)(adev->gmc.fb_start >> 44));
1524af2e15cSLikun Gao
1534af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1544af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32,
1554af2e15cSLikun Gao (u32)(adev->gmc.fb_end >> 12));
1564af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1574af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32,
1584af2e15cSLikun Gao (u32)(adev->gmc.fb_end >> 44));
1594af2e15cSLikun Gao } else {
1604af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1614af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
1624af2e15cSLikun Gao (u32)(adev->gmc.gart_start >> 12));
1634af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1644af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32,
1654af2e15cSLikun Gao (u32)(adev->gmc.gart_start >> 44));
1664af2e15cSLikun Gao
1674af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1684af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32,
1694af2e15cSLikun Gao (u32)(adev->gmc.gart_end >> 12));
1704af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1714af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32,
1724af2e15cSLikun Gao (u32)(adev->gmc.gart_end >> 44));
1734af2e15cSLikun Gao }
1744af2e15cSLikun Gao }
1754af2e15cSLikun Gao }
1764af2e15cSLikun Gao
mmhub_v4_2_0_mid_init_system_aperture_regs(struct amdgpu_device * adev,uint32_t mid_mask)1774af2e15cSLikun Gao static void mmhub_v4_2_0_mid_init_system_aperture_regs(struct amdgpu_device *adev,
1784af2e15cSLikun Gao uint32_t mid_mask)
1794af2e15cSLikun Gao {
1804af2e15cSLikun Gao uint64_t value;
1814af2e15cSLikun Gao uint32_t tmp;
1824af2e15cSLikun Gao int i;
1834af2e15cSLikun Gao
1844af2e15cSLikun Gao /*
1854af2e15cSLikun Gao * the new L1 policy will block SRIOV guest from writing
1864af2e15cSLikun Gao * these regs, and they will be programed at host.
1874af2e15cSLikun Gao * so skip programing these regs.
1884af2e15cSLikun Gao */
1894af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
1904af2e15cSLikun Gao return;
1914af2e15cSLikun Gao
1924af2e15cSLikun Gao for_each_inst(i, mid_mask) {
1934af2e15cSLikun Gao /* Program the AGP BAR */
1944af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1954af2e15cSLikun Gao regMMMC_VM_AGP_BASE_LO32, 0);
1964af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1974af2e15cSLikun Gao regMMMC_VM_AGP_BASE_HI32, 0);
1984af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
1994af2e15cSLikun Gao regMMMC_VM_AGP_BOT_LO32,
2004af2e15cSLikun Gao lower_32_bits(adev->gmc.agp_start >> 24));
2014af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2024af2e15cSLikun Gao regMMMC_VM_AGP_BOT_HI32,
2034af2e15cSLikun Gao upper_32_bits(adev->gmc.agp_start >> 24));
2044af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2054af2e15cSLikun Gao regMMMC_VM_AGP_TOP_LO32,
2064af2e15cSLikun Gao lower_32_bits(adev->gmc.agp_end >> 24));
2074af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2084af2e15cSLikun Gao regMMMC_VM_AGP_TOP_HI32,
2094af2e15cSLikun Gao upper_32_bits(adev->gmc.agp_end >> 24));
2104af2e15cSLikun Gao
2114af2e15cSLikun Gao /* Program the system aperture low logical page number. */
2124af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2134af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_LO32,
2144af2e15cSLikun Gao lower_32_bits(min(adev->gmc.fb_start,
2154af2e15cSLikun Gao adev->gmc.agp_start) >> 18));
2164af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2174af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_HI32,
2184af2e15cSLikun Gao upper_32_bits(min(adev->gmc.fb_start,
2194af2e15cSLikun Gao adev->gmc.agp_start) >> 18));
2204af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2214af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_LO32,
2224af2e15cSLikun Gao lower_32_bits(max(adev->gmc.fb_end,
2234af2e15cSLikun Gao adev->gmc.agp_end) >> 18));
2244af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2254af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_HI32,
2264af2e15cSLikun Gao upper_32_bits(max(adev->gmc.fb_end,
2274af2e15cSLikun Gao adev->gmc.agp_end) >> 18));
2284af2e15cSLikun Gao
2294af2e15cSLikun Gao /* Set default page address. */
2304af2e15cSLikun Gao value = amdgpu_gmc_vram_mc2pa(adev, adev->mem_scratch.gpu_addr);
2314af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2324af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB,
2334af2e15cSLikun Gao (u32)(value >> 12));
2344af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2354af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB,
2364af2e15cSLikun Gao (u32)(value >> 44));
2374af2e15cSLikun Gao
2384af2e15cSLikun Gao /* Program "protection fault". */
2394af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2404af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32,
2414af2e15cSLikun Gao (u32)(adev->dummy_page_addr >> 12));
2424af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2434af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32,
2444af2e15cSLikun Gao (u32)((u64)adev->dummy_page_addr >> 44));
2454af2e15cSLikun Gao
2464af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2474af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_CNTL2);
2484af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL2,
2494af2e15cSLikun Gao ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1);
2506f894c92SMukul Joshi tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL2,
2516f894c92SMukul Joshi ENABLE_RETRY_FAULT_INTERRUPT, 0x1);
2524af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2534af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_CNTL2, tmp);
2544af2e15cSLikun Gao }
2554af2e15cSLikun Gao
2564af2e15cSLikun Gao /* In the case squeezing vram into GART aperture, we don't use
2574af2e15cSLikun Gao * FB aperture and AGP aperture. Disable them.
2584af2e15cSLikun Gao */
2594af2e15cSLikun Gao if (adev->gmc.pdb0_bo) {
2604af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2614af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_TOP_LO32, 0);
2624af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2634af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_TOP_HI32, 0);
2644af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2654af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_BASE_LO32, 0xFFFFFFFF);
2664af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2674af2e15cSLikun Gao regMMMC_VM_FB_LOCATION_BASE_HI32, 1);
2684af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2694af2e15cSLikun Gao regMMMC_VM_AGP_TOP_LO32, 0);
2704af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2714af2e15cSLikun Gao regMMMC_VM_AGP_TOP_HI32, 0);
2724af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2734af2e15cSLikun Gao regMMMC_VM_AGP_BOT_LO32, 0xFFFFFFFF);
2744af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2754af2e15cSLikun Gao regMMMC_VM_AGP_BOT_HI32, 1);
2764af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2774af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_LO32,
2784af2e15cSLikun Gao 0xFFFFFFFF);
2794af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2804af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_HI32,
2814af2e15cSLikun Gao 0x7F);
2824af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2834af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_LO32, 0);
2844af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2854af2e15cSLikun Gao regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_HI32, 0);
2864af2e15cSLikun Gao }
2874af2e15cSLikun Gao }
2884af2e15cSLikun Gao
mmhub_v4_2_0_mid_init_tlb_regs(struct amdgpu_device * adev,uint32_t mid_mask)2894af2e15cSLikun Gao static void mmhub_v4_2_0_mid_init_tlb_regs(struct amdgpu_device *adev,
2904af2e15cSLikun Gao uint32_t mid_mask)
2914af2e15cSLikun Gao {
2924af2e15cSLikun Gao uint32_t tmp;
2934af2e15cSLikun Gao int i;
2944af2e15cSLikun Gao
2954af2e15cSLikun Gao for_each_inst(i, mid_mask) {
2964af2e15cSLikun Gao /* Setup TLB control */
2974af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
2984af2e15cSLikun Gao regMMMC_VM_MX_L1_TLB_CNTL);
2994af2e15cSLikun Gao
3004af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 1);
3014af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE, 3);
3024af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
3034af2e15cSLikun Gao ENABLE_ADVANCED_DRIVER_MODEL, 1);
3044af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
3054af2e15cSLikun Gao SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
3064af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
3074af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
3084af2e15cSLikun Gao MTYPE, MTYPE_UC); /* UC, uncached */
3094af2e15cSLikun Gao
3104af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
3114af2e15cSLikun Gao regMMMC_VM_MX_L1_TLB_CNTL, tmp);
3124af2e15cSLikun Gao }
3134af2e15cSLikun Gao }
3144af2e15cSLikun Gao
mmhub_v4_2_0_mid_init_cache_regs(struct amdgpu_device * adev,uint32_t mid_mask)3154af2e15cSLikun Gao static void mmhub_v4_2_0_mid_init_cache_regs(struct amdgpu_device *adev,
3164af2e15cSLikun Gao uint32_t mid_mask)
3174af2e15cSLikun Gao {
3184af2e15cSLikun Gao uint32_t tmp;
3194af2e15cSLikun Gao int i;
3204af2e15cSLikun Gao
3214af2e15cSLikun Gao /* These registers are not accessible to VF-SRIOV.
3224af2e15cSLikun Gao * The PF will program them instead.
3234af2e15cSLikun Gao */
3244af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
3254af2e15cSLikun Gao return;
3264af2e15cSLikun Gao
3274af2e15cSLikun Gao for_each_inst(i, mid_mask) {
3284af2e15cSLikun Gao /* Setup L2 cache */
3294af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL);
3304af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL, ENABLE_L2_CACHE, 1);
3314af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 0);
3324af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL,
3334af2e15cSLikun Gao ENABLE_DEFAULT_PAGE_OUT_TO_SYSTEM_MEMORY, 1);
3344af2e15cSLikun Gao /* XXX for emulation, Refer to closed source code.*/
3354af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL,
3364af2e15cSLikun Gao L2_PDE0_CACHE_TAG_GENERATION_MODE, 0);
3374af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL,
3384af2e15cSLikun Gao PDE_FAULT_CLASSIFICATION, 0);
3394af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL,
3404af2e15cSLikun Gao CONTEXT1_IDENTITY_ACCESS_MODE, 1);
3414af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL,
3424af2e15cSLikun Gao IDENTITY_MODE_FRAGMENT_SIZE, 0);
3434af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL, tmp);
3444af2e15cSLikun Gao
3454af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL2);
3464af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL2,
3474af2e15cSLikun Gao INVALIDATE_ALL_L1_TLBS, 1);
3484af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL2,
3494af2e15cSLikun Gao INVALIDATE_L2_CACHE, 1);
3504af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL2, tmp);
3514af2e15cSLikun Gao
3524af2e15cSLikun Gao tmp = regMMVM_L2_CNTL3_DEFAULT;
3534af2e15cSLikun Gao if (adev->gmc.translate_further) {
3544af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3, BANK_SELECT, 12);
3554af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3,
3564af2e15cSLikun Gao L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
3574af2e15cSLikun Gao } else {
3584af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3, BANK_SELECT, 9);
3594af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL3,
3604af2e15cSLikun Gao L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
3614af2e15cSLikun Gao }
3624af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL3, tmp);
3634af2e15cSLikun Gao
3644af2e15cSLikun Gao tmp = regMMVM_L2_CNTL4_DEFAULT;
3654af2e15cSLikun Gao /* For AMD APP APUs setup WC memory */
3664af2e15cSLikun Gao if (adev->gmc.xgmi.connected_to_cpu || adev->gmc.is_app_apu) {
3674af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL4,
3684af2e15cSLikun Gao VMC_TAP_PDE_REQUEST_PHYSICAL, 1);
3694af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL4,
3704af2e15cSLikun Gao VMC_TAP_PTE_REQUEST_PHYSICAL, 1);
3714af2e15cSLikun Gao } else {
3724af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL4,
3734af2e15cSLikun Gao VMC_TAP_PDE_REQUEST_PHYSICAL, 0);
3744af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL4,
3754af2e15cSLikun Gao VMC_TAP_PTE_REQUEST_PHYSICAL, 0);
3764af2e15cSLikun Gao }
3774af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL4, tmp);
3784af2e15cSLikun Gao
3794af2e15cSLikun Gao tmp = regMMVM_L2_CNTL5_DEFAULT;
3804af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL5,
3814af2e15cSLikun Gao L2_CACHE_SMALLK_FRAGMENT_SIZE, 0);
3824af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_CNTL5, tmp);
3834af2e15cSLikun Gao }
3844af2e15cSLikun Gao }
3854af2e15cSLikun Gao
mmhub_v4_2_0_mid_enable_system_domain(struct amdgpu_device * adev,uint32_t mid_mask)3864af2e15cSLikun Gao static void mmhub_v4_2_0_mid_enable_system_domain(struct amdgpu_device *adev,
3874af2e15cSLikun Gao uint32_t mid_mask)
3884af2e15cSLikun Gao {
3894af2e15cSLikun Gao uint32_t tmp;
3904af2e15cSLikun Gao int i;
3914af2e15cSLikun Gao
3924af2e15cSLikun Gao for_each_inst(i, mid_mask) {
3934af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
3944af2e15cSLikun Gao regMMVM_CONTEXT0_CNTL);
3954af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL,
3964af2e15cSLikun Gao ENABLE_CONTEXT, 1);
3974af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL,
398*a1e0a6b5SHarish Kasiviswanathan PAGE_TABLE_DEPTH, adev->gmc.vmid0_page_table_depth);
399*a1e0a6b5SHarish Kasiviswanathan tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL,
400*a1e0a6b5SHarish Kasiviswanathan PAGE_TABLE_BLOCK_SIZE,
401*a1e0a6b5SHarish Kasiviswanathan adev->gmc.vmid0_page_table_block_size);
4024af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL,
4034af2e15cSLikun Gao RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);
4044af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4054af2e15cSLikun Gao regMMVM_CONTEXT0_CNTL, tmp);
4064af2e15cSLikun Gao }
4074af2e15cSLikun Gao }
4084af2e15cSLikun Gao
mmhub_v4_2_0_mid_disable_identity_aperture(struct amdgpu_device * adev,uint32_t mid_mask)4094af2e15cSLikun Gao static void mmhub_v4_2_0_mid_disable_identity_aperture(struct amdgpu_device *adev,
4104af2e15cSLikun Gao uint32_t mid_mask)
4114af2e15cSLikun Gao {
4124af2e15cSLikun Gao int i;
4134af2e15cSLikun Gao
4144af2e15cSLikun Gao /* These registers are not accessible to VF-SRIOV.
4154af2e15cSLikun Gao * The PF will program them instead.
4164af2e15cSLikun Gao */
4174af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
4184af2e15cSLikun Gao return;
4194af2e15cSLikun Gao
4204af2e15cSLikun Gao for_each_inst(i, mid_mask) {
4214af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4224af2e15cSLikun Gao regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
4234af2e15cSLikun Gao 0xFFFFFFFF);
4244af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4254af2e15cSLikun Gao regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32,
4264af2e15cSLikun Gao 0x00001FFF);
4274af2e15cSLikun Gao
4284af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4294af2e15cSLikun Gao regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32,
4304af2e15cSLikun Gao 0);
4314af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4324af2e15cSLikun Gao regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32,
4334af2e15cSLikun Gao 0);
4344af2e15cSLikun Gao
4354af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4364af2e15cSLikun Gao regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32,
4374af2e15cSLikun Gao 0);
4384af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
4394af2e15cSLikun Gao regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32,
4404af2e15cSLikun Gao 0);
4414af2e15cSLikun Gao }
4424af2e15cSLikun Gao }
4434af2e15cSLikun Gao
mmhub_v4_2_0_mid_setup_vmid_config(struct amdgpu_device * adev,uint32_t mid_mask)4444af2e15cSLikun Gao static void mmhub_v4_2_0_mid_setup_vmid_config(struct amdgpu_device *adev,
4454af2e15cSLikun Gao uint32_t mid_mask)
4464af2e15cSLikun Gao {
4474af2e15cSLikun Gao struct amdgpu_vmhub *hub;
4484af2e15cSLikun Gao uint32_t tmp;
4494af2e15cSLikun Gao int i, j;
4504af2e15cSLikun Gao
4514af2e15cSLikun Gao for_each_inst(j, mid_mask) {
4524af2e15cSLikun Gao hub = &adev->vmhub[AMDGPU_MMHUB0(j)];
4534af2e15cSLikun Gao for (i = 0; i <= 14; i++) {
4544af2e15cSLikun Gao tmp = RREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j),
4554af2e15cSLikun Gao regMMVM_CONTEXT1_CNTL,
4564af2e15cSLikun Gao i * hub->ctx_distance);
4574af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
4584af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH,
4594af2e15cSLikun Gao adev->vm_manager.num_level);
4604af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4614af2e15cSLikun Gao RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4624af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4634af2e15cSLikun Gao DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT,
4644af2e15cSLikun Gao 1);
4654af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4664af2e15cSLikun Gao PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4674af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4684af2e15cSLikun Gao VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4694af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4704af2e15cSLikun Gao READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4714af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4724af2e15cSLikun Gao WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4734af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4744af2e15cSLikun Gao EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
4754af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4764af2e15cSLikun Gao PAGE_TABLE_BLOCK_SIZE,
4774af2e15cSLikun Gao adev->vm_manager.block_size - 9);
4784af2e15cSLikun Gao /* Send no-retry XNACK on fault to suppress VM fault storm. */
4794af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL,
4804af2e15cSLikun Gao RETRY_PERMISSION_OR_INVALID_PAGE_FAULT,
4814af2e15cSLikun Gao !amdgpu_noretry);
4824af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j), regMMVM_CONTEXT1_CNTL,
4834af2e15cSLikun Gao i * hub->ctx_distance, tmp);
4844af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j), regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32,
4854af2e15cSLikun Gao i * hub->ctx_addr_distance, 0);
4864af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j), regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32,
4874af2e15cSLikun Gao i * hub->ctx_addr_distance, 0);
4884af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j), regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32,
4894af2e15cSLikun Gao i * hub->ctx_addr_distance,
4904af2e15cSLikun Gao lower_32_bits(adev->vm_manager.max_pfn - 1));
4914af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j), regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32,
4924af2e15cSLikun Gao i * hub->ctx_addr_distance,
4934af2e15cSLikun Gao upper_32_bits(adev->vm_manager.max_pfn - 1));
4944af2e15cSLikun Gao }
4954af2e15cSLikun Gao }
4964af2e15cSLikun Gao
4974af2e15cSLikun Gao hub->vm_cntx_cntl = tmp;
4984af2e15cSLikun Gao }
4994af2e15cSLikun Gao
mmhub_v4_2_0_mid_program_invalidation(struct amdgpu_device * adev,uint32_t mid_mask)5004af2e15cSLikun Gao static void mmhub_v4_2_0_mid_program_invalidation(struct amdgpu_device *adev,
5014af2e15cSLikun Gao uint32_t mid_mask)
5024af2e15cSLikun Gao {
5034af2e15cSLikun Gao struct amdgpu_vmhub *hub;
5044af2e15cSLikun Gao unsigned int i, j;
5054af2e15cSLikun Gao
5064af2e15cSLikun Gao for_each_inst(j, mid_mask) {
5074af2e15cSLikun Gao hub = &adev->vmhub[AMDGPU_MMHUB0(j)];
5084af2e15cSLikun Gao
5094af2e15cSLikun Gao for (i = 0; i < 18; ++i) {
5104af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j),
5114af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32,
5124af2e15cSLikun Gao i * hub->eng_addr_distance, 0xffffffff);
5134af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j),
5144af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32,
5154af2e15cSLikun Gao i * hub->eng_addr_distance, 0x3fff);
5164af2e15cSLikun Gao }
5174af2e15cSLikun Gao }
5184af2e15cSLikun Gao }
5194af2e15cSLikun Gao
mmhub_v4_2_0_mid_gart_enable(struct amdgpu_device * adev,uint32_t mid_mask)5204af2e15cSLikun Gao static int mmhub_v4_2_0_mid_gart_enable(struct amdgpu_device *adev,
5214af2e15cSLikun Gao uint32_t mid_mask)
5224af2e15cSLikun Gao {
5234af2e15cSLikun Gao /* GART Enable. */
5244af2e15cSLikun Gao mmhub_v4_2_0_mid_init_gart_aperture_regs(adev, mid_mask);
5254af2e15cSLikun Gao mmhub_v4_2_0_mid_init_system_aperture_regs(adev, mid_mask);
5264af2e15cSLikun Gao mmhub_v4_2_0_mid_init_tlb_regs(adev, mid_mask);
5274af2e15cSLikun Gao mmhub_v4_2_0_mid_init_cache_regs(adev, mid_mask);
5284af2e15cSLikun Gao
5294af2e15cSLikun Gao mmhub_v4_2_0_mid_enable_system_domain(adev, mid_mask);
5304af2e15cSLikun Gao mmhub_v4_2_0_mid_disable_identity_aperture(adev, mid_mask);
5314af2e15cSLikun Gao mmhub_v4_2_0_mid_setup_vmid_config(adev, mid_mask);
5324af2e15cSLikun Gao mmhub_v4_2_0_mid_program_invalidation(adev, mid_mask);
5334af2e15cSLikun Gao
5344af2e15cSLikun Gao return 0;
5354af2e15cSLikun Gao }
mmhub_v4_2_0_gart_enable(struct amdgpu_device * adev)5364af2e15cSLikun Gao static int mmhub_v4_2_0_gart_enable(struct amdgpu_device *adev)
5374af2e15cSLikun Gao {
5384af2e15cSLikun Gao uint32_t mid_mask;
5394af2e15cSLikun Gao
5404af2e15cSLikun Gao mid_mask = adev->aid_mask;
5414af2e15cSLikun Gao return mmhub_v4_2_0_mid_gart_enable(adev, mid_mask);
5424af2e15cSLikun Gao }
5434af2e15cSLikun Gao
mmhub_v4_2_0_mid_gart_disable(struct amdgpu_device * adev,uint32_t mid_mask)5444af2e15cSLikun Gao static void mmhub_v4_2_0_mid_gart_disable(struct amdgpu_device *adev,
5454af2e15cSLikun Gao uint32_t mid_mask)
5464af2e15cSLikun Gao {
5474af2e15cSLikun Gao struct amdgpu_vmhub *hub;
5484af2e15cSLikun Gao u32 tmp;
5494af2e15cSLikun Gao u32 i, j;
5504af2e15cSLikun Gao
5514af2e15cSLikun Gao for_each_inst(j, mid_mask) {
5524af2e15cSLikun Gao hub = &adev->vmhub[AMDGPU_MMHUB0(j)];
5534af2e15cSLikun Gao /* Disable all tables */
5544af2e15cSLikun Gao for (i = 0; i < 16; i++)
5554af2e15cSLikun Gao WREG32_SOC15_OFFSET(MMHUB, GET_INST(MMHUB, j),
5564af2e15cSLikun Gao regMMVM_CONTEXT0_CNTL,
5574af2e15cSLikun Gao i * hub->ctx_distance, 0);
5584af2e15cSLikun Gao
5594af2e15cSLikun Gao /* Setup TLB control */
5604af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, j),
5614af2e15cSLikun Gao regMMMC_VM_MX_L1_TLB_CNTL);
5624af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
5634af2e15cSLikun Gao ENABLE_L1_TLB, 0);
5644af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
5654af2e15cSLikun Gao ENABLE_ADVANCED_DRIVER_MODEL, 0);
5664af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, j),
5674af2e15cSLikun Gao regMMMC_VM_MX_L1_TLB_CNTL, tmp);
5684af2e15cSLikun Gao
5694af2e15cSLikun Gao /* Setup L2 cache */
5704af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, j), regMMVM_L2_CNTL);
5714af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_CNTL, ENABLE_L2_CACHE, 0);
5724af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, j), regMMVM_L2_CNTL, tmp);
5734af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, j), regMMVM_L2_CNTL3, 0);
5744af2e15cSLikun Gao }
5754af2e15cSLikun Gao }
5764af2e15cSLikun Gao
mmhub_v4_2_0_gart_disable(struct amdgpu_device * adev)5774af2e15cSLikun Gao static void mmhub_v4_2_0_gart_disable(struct amdgpu_device *adev)
5784af2e15cSLikun Gao {
5794af2e15cSLikun Gao uint32_t mid_mask;
5804af2e15cSLikun Gao
5814af2e15cSLikun Gao mid_mask = adev->aid_mask;
5824af2e15cSLikun Gao mmhub_v4_2_0_mid_gart_disable(adev, mid_mask);
5834af2e15cSLikun Gao }
5844af2e15cSLikun Gao
5854af2e15cSLikun Gao static void
mmhub_v4_2_0_mid_set_fault_enable_default(struct amdgpu_device * adev,bool value,uint32_t mid_mask)5864af2e15cSLikun Gao mmhub_v4_2_0_mid_set_fault_enable_default(struct amdgpu_device *adev,
5874af2e15cSLikun Gao bool value, uint32_t mid_mask)
5884af2e15cSLikun Gao {
5894af2e15cSLikun Gao u32 tmp;
5904af2e15cSLikun Gao int i;
5914af2e15cSLikun Gao
5924af2e15cSLikun Gao /* These registers are not accessible to VF-SRIOV.
5934af2e15cSLikun Gao * The PF will program them instead.
5944af2e15cSLikun Gao */
5954af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
5964af2e15cSLikun Gao return;
5974af2e15cSLikun Gao
5984af2e15cSLikun Gao for_each_inst(i, mid_mask) {
5994af2e15cSLikun Gao tmp = RREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
6004af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_CNTL_LO32);
6014af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6024af2e15cSLikun Gao RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6034af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6044af2e15cSLikun Gao PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6054af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6064af2e15cSLikun Gao PDE1_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6074af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6084af2e15cSLikun Gao PDE2_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6094af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6104af2e15cSLikun Gao TRANSLATE_FURTHER_PROTECTION_FAULT_ENABLE_DEFAULT,
6114af2e15cSLikun Gao value);
6124af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6134af2e15cSLikun Gao NACK_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6144af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6154af2e15cSLikun Gao DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6164af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6174af2e15cSLikun Gao VALID_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6184af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6194af2e15cSLikun Gao READ_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6204af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6214af2e15cSLikun Gao WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6224af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6234af2e15cSLikun Gao EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
6244af2e15cSLikun Gao if (!value) {
6254af2e15cSLikun Gao tmp = REG_SET_FIELD(tmp, MMVM_L2_PROTECTION_FAULT_CNTL_LO32,
6264af2e15cSLikun Gao CRASH_ON_NO_RETRY_FAULT, 1);
6274af2e15cSLikun Gao }
6284af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
6294af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_CNTL_LO32, tmp);
6304af2e15cSLikun Gao }
6314af2e15cSLikun Gao }
6324af2e15cSLikun Gao
6334af2e15cSLikun Gao
6344af2e15cSLikun Gao /**
6354af2e15cSLikun Gao * mmhub_v4_2_0_set_fault_enable_default - update GART/VM fault handling
6364af2e15cSLikun Gao *
6374af2e15cSLikun Gao * @adev: amdgpu_device pointer
6384af2e15cSLikun Gao * @value: true redirects VM faults to the default page
6394af2e15cSLikun Gao */
6404af2e15cSLikun Gao static void
mmhub_v4_2_0_set_fault_enable_default(struct amdgpu_device * adev,bool value)6414af2e15cSLikun Gao mmhub_v4_2_0_set_fault_enable_default(struct amdgpu_device *adev,
6424af2e15cSLikun Gao bool value)
6434af2e15cSLikun Gao {
6444af2e15cSLikun Gao uint32_t mid_mask;
6454af2e15cSLikun Gao
6464af2e15cSLikun Gao mid_mask = adev->aid_mask;
6474af2e15cSLikun Gao mmhub_v4_2_0_mid_set_fault_enable_default(adev, value, mid_mask);
6484af2e15cSLikun Gao }
6494af2e15cSLikun Gao
mmhub_v4_2_0_get_invalidate_req(unsigned int vmid,uint32_t flush_type)6504af2e15cSLikun Gao static uint32_t mmhub_v4_2_0_get_invalidate_req(unsigned int vmid,
6514af2e15cSLikun Gao uint32_t flush_type)
6524af2e15cSLikun Gao {
6534af2e15cSLikun Gao u32 req = 0;
6544af2e15cSLikun Gao
6554af2e15cSLikun Gao /* invalidate using legacy mode on vmid*/
6564af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ,
6574af2e15cSLikun Gao PER_VMID_INVALIDATE_REQ, 1 << vmid);
6584af2e15cSLikun Gao /* Only use legacy inv on mmhub side */
6594af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0);
6604af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1);
6614af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1);
6624af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1);
6634af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1);
664fa0aa517SPhilip Yang req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE3, 1);
6654af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1);
6664af2e15cSLikun Gao req = REG_SET_FIELD(req, MMVM_INVALIDATE_ENG0_REQ,
6674af2e15cSLikun Gao CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0);
6684af2e15cSLikun Gao
6694af2e15cSLikun Gao return req;
6704af2e15cSLikun Gao }
6714af2e15cSLikun Gao
6724af2e15cSLikun Gao /*TODO: l2 protection fault status is increased to 64bits.
6734af2e15cSLikun Gao * some critical fields like FED are moved to STATUS_HI32 */
6744af2e15cSLikun Gao static void
mmhub_v4_2_0_print_l2_protection_fault_status(struct amdgpu_device * adev,uint32_t status)6754af2e15cSLikun Gao mmhub_v4_2_0_print_l2_protection_fault_status(struct amdgpu_device *adev,
6764af2e15cSLikun Gao uint32_t status)
6774af2e15cSLikun Gao {
6784af2e15cSLikun Gao uint32_t cid, rw;
6794af2e15cSLikun Gao const char *mmhub_cid = NULL;
6804af2e15cSLikun Gao
6814af2e15cSLikun Gao cid = REG_GET_FIELD(status,
6824af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, CID);
6834af2e15cSLikun Gao rw = REG_GET_FIELD(status,
6844af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, RW);
6854af2e15cSLikun Gao
6864af2e15cSLikun Gao dev_err(adev->dev,
6874af2e15cSLikun Gao "MMVM_L2_PROTECTION_FAULT_STATUS_LO32:0x%08X\n",
6884af2e15cSLikun Gao status);
6894af2e15cSLikun Gao switch (amdgpu_ip_version(adev, MMHUB_HWIP, 0)) {
6904af2e15cSLikun Gao case IP_VERSION(4, 2, 0):
6914af2e15cSLikun Gao mmhub_cid = mmhub_client_ids_v4_2_0[cid][rw];
6924af2e15cSLikun Gao break;
6934af2e15cSLikun Gao default:
6944af2e15cSLikun Gao mmhub_cid = NULL;
6954af2e15cSLikun Gao break;
6964af2e15cSLikun Gao }
6974af2e15cSLikun Gao dev_err(adev->dev, "\t Faulty UTCL2 client ID: %s (0x%x)\n",
6984af2e15cSLikun Gao mmhub_cid ? mmhub_cid : "unknown", cid);
6994af2e15cSLikun Gao dev_err(adev->dev, "\t MORE_FAULTS: 0x%lx\n",
7004af2e15cSLikun Gao REG_GET_FIELD(status,
7014af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, MORE_FAULTS));
7024af2e15cSLikun Gao dev_err(adev->dev, "\t WALKER_ERROR: 0x%lx\n",
7034af2e15cSLikun Gao REG_GET_FIELD(status,
7044af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, WALKER_ERROR));
7054af2e15cSLikun Gao dev_err(adev->dev, "\t PERMISSION_FAULTS: 0x%lx\n",
7064af2e15cSLikun Gao REG_GET_FIELD(status,
7074af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, PERMISSION_FAULTS));
7084af2e15cSLikun Gao dev_err(adev->dev, "\t MAPPING_ERROR: 0x%lx\n",
7094af2e15cSLikun Gao REG_GET_FIELD(status,
7104af2e15cSLikun Gao MMVM_L2_PROTECTION_FAULT_STATUS_LO32, MAPPING_ERROR));
7114af2e15cSLikun Gao dev_err(adev->dev, "\t RW: 0x%x\n", rw);
7124af2e15cSLikun Gao }
7134af2e15cSLikun Gao
7144af2e15cSLikun Gao
7154af2e15cSLikun Gao static const struct amdgpu_vmhub_funcs mmhub_v4_2_0_vmhub_funcs = {
7164af2e15cSLikun Gao .print_l2_protection_fault_status = mmhub_v4_2_0_print_l2_protection_fault_status,
7174af2e15cSLikun Gao .get_invalidate_req = mmhub_v4_2_0_get_invalidate_req,
7184af2e15cSLikun Gao };
7194af2e15cSLikun Gao
mmhub_v4_2_0_mid_init(struct amdgpu_device * adev,uint32_t mid_mask)7204af2e15cSLikun Gao static void mmhub_v4_2_0_mid_init(struct amdgpu_device *adev,
7214af2e15cSLikun Gao uint32_t mid_mask)
7224af2e15cSLikun Gao {
7234af2e15cSLikun Gao struct amdgpu_vmhub *hub;
7244af2e15cSLikun Gao int i;
7254af2e15cSLikun Gao
7264af2e15cSLikun Gao for_each_inst(i, mid_mask) {
7274af2e15cSLikun Gao hub = &adev->vmhub[AMDGPU_MMHUB0(i)];
7284af2e15cSLikun Gao
7294af2e15cSLikun Gao hub->ctx0_ptb_addr_lo32 =
7304af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7314af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32);
7324af2e15cSLikun Gao hub->ctx0_ptb_addr_hi32 =
7334af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7344af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32);
7354af2e15cSLikun Gao hub->vm_inv_eng0_sem =
7364af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7374af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_SEM);
7384af2e15cSLikun Gao hub->vm_inv_eng0_req =
7394af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7404af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_REQ);
7414af2e15cSLikun Gao hub->vm_inv_eng0_ack =
7424af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7434af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_ACK);
7444af2e15cSLikun Gao hub->vm_context0_cntl =
7454af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7464af2e15cSLikun Gao regMMVM_CONTEXT0_CNTL);
7474af2e15cSLikun Gao /* TODO: add a new member to accomandate additional fault status/cntl reg */
7484af2e15cSLikun Gao hub->vm_l2_pro_fault_status =
7494af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7504af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_STATUS_LO32);
7514af2e15cSLikun Gao hub->vm_l2_pro_fault_cntl =
7524af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i),
7534af2e15cSLikun Gao regMMVM_L2_PROTECTION_FAULT_CNTL_LO32);
7544af2e15cSLikun Gao
7554af2e15cSLikun Gao hub->ctx_distance = regMMVM_CONTEXT1_CNTL - regMMVM_CONTEXT0_CNTL;
7564af2e15cSLikun Gao hub->ctx_addr_distance = regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 -
7574af2e15cSLikun Gao regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
7584af2e15cSLikun Gao hub->eng_distance = regMMVM_INVALIDATE_ENG1_REQ -
7594af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_REQ;
7604af2e15cSLikun Gao hub->eng_addr_distance = regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 -
7614af2e15cSLikun Gao regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32;
7624af2e15cSLikun Gao
7634af2e15cSLikun Gao hub->vm_cntx_cntl_vm_fault = MMVM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7644af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7654af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7664af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7674af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7684af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
7694af2e15cSLikun Gao MMVM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK;
7704af2e15cSLikun Gao
7714af2e15cSLikun Gao hub->vm_l2_bank_select_reserved_cid2 =
7724af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i), regMMVM_L2_BANK_SELECT_RESERVED_CID2);
7734af2e15cSLikun Gao
7744af2e15cSLikun Gao hub->vm_contexts_disable =
7754af2e15cSLikun Gao SOC15_REG_OFFSET(MMHUB, GET_INST(MMHUB, i), regMMVM_CONTEXTS_DISABLE);
7764af2e15cSLikun Gao
7774af2e15cSLikun Gao hub->vmhub_funcs = &mmhub_v4_2_0_vmhub_funcs;
7784af2e15cSLikun Gao }
7794af2e15cSLikun Gao }
7804af2e15cSLikun Gao
mmhub_v4_2_0_init(struct amdgpu_device * adev)7814af2e15cSLikun Gao static void mmhub_v4_2_0_init(struct amdgpu_device *adev)
7824af2e15cSLikun Gao {
7834af2e15cSLikun Gao uint32_t mid_mask;
7844af2e15cSLikun Gao
7854af2e15cSLikun Gao mid_mask = adev->aid_mask;
7864af2e15cSLikun Gao mmhub_v4_2_0_mid_init(adev, mid_mask);
7874af2e15cSLikun Gao }
7884af2e15cSLikun Gao
7894af2e15cSLikun Gao static void
mmhub_v4_2_0_update_medium_grain_clock_gating(struct amdgpu_device * adev,bool enable)7904af2e15cSLikun Gao mmhub_v4_2_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
7914af2e15cSLikun Gao bool enable)
7924af2e15cSLikun Gao {
7934af2e15cSLikun Gao uint32_t def, data;
7944af2e15cSLikun Gao uint32_t def1, data1, def2 = 0, data2 = 0;
7954af2e15cSLikun Gao def = data = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regMM_ATC_L2_MISC_CG);
7964af2e15cSLikun Gao def1 = data1 = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regDAGB0_CNTL_MISC2);
7974af2e15cSLikun Gao def2 = data2 = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regDAGB1_CNTL_MISC2);
7984af2e15cSLikun Gao
7994af2e15cSLikun Gao if (enable) {
8004af2e15cSLikun Gao data |= MM_ATC_L2_MISC_CG__ENABLE_MASK;
8014af2e15cSLikun Gao data1 &= ~(DAGB0_CNTL_MISC2__DISABLE_RDRET_TAP_CHAIN_FGCG_MASK |
8024af2e15cSLikun Gao DAGB0_CNTL_MISC2__DISABLE_WRRET_TAP_CHAIN_FGCG_MASK);
8034af2e15cSLikun Gao
8044af2e15cSLikun Gao data2 &= ~(DAGB1_CNTL_MISC2__DISABLE_RDRET_TAP_CHAIN_FGCG_MASK |
8054af2e15cSLikun Gao DAGB1_CNTL_MISC2__DISABLE_WRRET_TAP_CHAIN_FGCG_MASK);
8064af2e15cSLikun Gao } else {
8074af2e15cSLikun Gao data &= ~MM_ATC_L2_MISC_CG__ENABLE_MASK;
8084af2e15cSLikun Gao data1 |= (DAGB0_CNTL_MISC2__DISABLE_RDRET_TAP_CHAIN_FGCG_MASK |
8094af2e15cSLikun Gao DAGB0_CNTL_MISC2__DISABLE_WRRET_TAP_CHAIN_FGCG_MASK);
8104af2e15cSLikun Gao
8114af2e15cSLikun Gao data2 |= (DAGB1_CNTL_MISC2__DISABLE_RDRET_TAP_CHAIN_FGCG_MASK |
8124af2e15cSLikun Gao DAGB1_CNTL_MISC2__DISABLE_WRRET_TAP_CHAIN_FGCG_MASK);
8134af2e15cSLikun Gao }
8144af2e15cSLikun Gao
8154af2e15cSLikun Gao if (def != data)
8164af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regMM_ATC_L2_MISC_CG, data);
8174af2e15cSLikun Gao if (def1 != data1)
8184af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regDAGB0_CNTL_MISC2, data1);
8194af2e15cSLikun Gao
8204af2e15cSLikun Gao if (def2 != data2)
8214af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regDAGB1_CNTL_MISC2, data2);
8224af2e15cSLikun Gao }
8234af2e15cSLikun Gao
8244af2e15cSLikun Gao static void
mmhub_v4_2_0_update_medium_grain_light_sleep(struct amdgpu_device * adev,bool enable)8254af2e15cSLikun Gao mmhub_v4_2_0_update_medium_grain_light_sleep(struct amdgpu_device *adev,
8264af2e15cSLikun Gao bool enable)
8274af2e15cSLikun Gao {
8284af2e15cSLikun Gao uint32_t def, data;
8294af2e15cSLikun Gao
8304af2e15cSLikun Gao def = data = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regMM_ATC_L2_MISC_CG);
8314af2e15cSLikun Gao
8324af2e15cSLikun Gao if (enable)
8334af2e15cSLikun Gao data |= MM_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
8344af2e15cSLikun Gao else
8354af2e15cSLikun Gao data &= ~MM_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
8364af2e15cSLikun Gao
8374af2e15cSLikun Gao if (def != data)
8384af2e15cSLikun Gao WREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regMM_ATC_L2_MISC_CG, data);
8394af2e15cSLikun Gao }
8404af2e15cSLikun Gao
mmhub_v4_2_0_set_clockgating(struct amdgpu_device * adev,enum amd_clockgating_state state)8414af2e15cSLikun Gao static int mmhub_v4_2_0_set_clockgating(struct amdgpu_device *adev,
8424af2e15cSLikun Gao enum amd_clockgating_state state)
8434af2e15cSLikun Gao {
8444af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
8454af2e15cSLikun Gao return 0;
8464af2e15cSLikun Gao
8474af2e15cSLikun Gao if (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)
8484af2e15cSLikun Gao mmhub_v4_2_0_update_medium_grain_clock_gating(adev,
8494af2e15cSLikun Gao state == AMD_CG_STATE_GATE);
8504af2e15cSLikun Gao
8514af2e15cSLikun Gao if (adev->cg_flags & AMD_CG_SUPPORT_MC_LS)
8524af2e15cSLikun Gao mmhub_v4_2_0_update_medium_grain_light_sleep(adev,
8534af2e15cSLikun Gao state == AMD_CG_STATE_GATE);
8544af2e15cSLikun Gao
8554af2e15cSLikun Gao return 0;
8564af2e15cSLikun Gao }
8574af2e15cSLikun Gao
mmhub_v4_2_0_get_clockgating(struct amdgpu_device * adev,u64 * flags)8584af2e15cSLikun Gao static void mmhub_v4_2_0_get_clockgating(struct amdgpu_device *adev, u64 *flags)
8594af2e15cSLikun Gao {
8604af2e15cSLikun Gao int data;
8614af2e15cSLikun Gao
8624af2e15cSLikun Gao if (amdgpu_sriov_vf(adev))
8634af2e15cSLikun Gao *flags = 0;
8644af2e15cSLikun Gao
8654af2e15cSLikun Gao data = RREG32_SOC15(MMHUB, GET_INST(MMHUB, 0), regMM_ATC_L2_MISC_CG);
8664af2e15cSLikun Gao
8674af2e15cSLikun Gao /* AMD_CG_SUPPORT_MC_MGCG */
8684af2e15cSLikun Gao if (data & MM_ATC_L2_MISC_CG__ENABLE_MASK)
8694af2e15cSLikun Gao *flags |= AMD_CG_SUPPORT_MC_MGCG;
8704af2e15cSLikun Gao
8714af2e15cSLikun Gao /* AMD_CG_SUPPORT_MC_LS */
8724af2e15cSLikun Gao if (data & MM_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK)
8734af2e15cSLikun Gao *flags |= AMD_CG_SUPPORT_MC_LS;
8744af2e15cSLikun Gao }
8754af2e15cSLikun Gao
8764af2e15cSLikun Gao const struct amdgpu_mmhub_funcs mmhub_v4_2_0_funcs = {
8774af2e15cSLikun Gao .init = mmhub_v4_2_0_init,
8784af2e15cSLikun Gao .get_fb_location = mmhub_v4_2_0_get_fb_location,
8794af2e15cSLikun Gao .get_mc_fb_offset = mmhub_v4_2_0_get_mc_fb_offset,
8804af2e15cSLikun Gao .setup_vm_pt_regs = mmhub_v4_2_0_setup_vm_pt_regs,
8814af2e15cSLikun Gao .gart_enable = mmhub_v4_2_0_gart_enable,
8824af2e15cSLikun Gao .gart_disable = mmhub_v4_2_0_gart_disable,
8834af2e15cSLikun Gao .set_fault_enable_default = mmhub_v4_2_0_set_fault_enable_default,
8844af2e15cSLikun Gao .set_clockgating = mmhub_v4_2_0_set_clockgating,
8854af2e15cSLikun Gao .get_clockgating = mmhub_v4_2_0_get_clockgating,
8864af2e15cSLikun Gao };
8874af2e15cSLikun Gao
mmhub_v4_2_0_xcp_resume(void * handle,uint32_t inst_mask)8884af2e15cSLikun Gao static int mmhub_v4_2_0_xcp_resume(void *handle, uint32_t inst_mask)
8894af2e15cSLikun Gao {
8904af2e15cSLikun Gao struct amdgpu_device *adev = (struct amdgpu_device *)handle;
8914af2e15cSLikun Gao bool value;
8924af2e15cSLikun Gao
8934af2e15cSLikun Gao if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
8944af2e15cSLikun Gao value = false;
8954af2e15cSLikun Gao else
8964af2e15cSLikun Gao value = true;
8974af2e15cSLikun Gao
8984af2e15cSLikun Gao mmhub_v4_2_0_mid_set_fault_enable_default(adev, value, inst_mask);
8994af2e15cSLikun Gao
9004af2e15cSLikun Gao if (!amdgpu_sriov_vf(adev))
9014af2e15cSLikun Gao return mmhub_v4_2_0_mid_gart_enable(adev, inst_mask);
9024af2e15cSLikun Gao
9034af2e15cSLikun Gao return 0;
9044af2e15cSLikun Gao }
9054af2e15cSLikun Gao
mmhub_v4_2_0_xcp_suspend(void * handle,uint32_t inst_mask)9064af2e15cSLikun Gao static int mmhub_v4_2_0_xcp_suspend(void *handle, uint32_t inst_mask)
9074af2e15cSLikun Gao {
9084af2e15cSLikun Gao struct amdgpu_device *adev = (struct amdgpu_device *)handle;
9094af2e15cSLikun Gao
9104af2e15cSLikun Gao if (!amdgpu_sriov_vf(adev))
9114af2e15cSLikun Gao mmhub_v4_2_0_mid_gart_disable(adev, inst_mask);
9124af2e15cSLikun Gao
9134af2e15cSLikun Gao return 0;
9144af2e15cSLikun Gao }
9154af2e15cSLikun Gao
9164af2e15cSLikun Gao struct amdgpu_xcp_ip_funcs mmhub_v4_2_0_xcp_funcs = {
9174af2e15cSLikun Gao .suspend = &mmhub_v4_2_0_xcp_suspend,
9184af2e15cSLikun Gao .resume = &mmhub_v4_2_0_xcp_resume
9194af2e15cSLikun Gao };
920