139def24fSHawking Zhang /* 239def24fSHawking Zhang * Copyright 2022 Advanced Micro Devices, Inc. 339def24fSHawking Zhang * 439def24fSHawking Zhang * Permission is hereby granted, free of charge, to any person obtaining a 539def24fSHawking Zhang * copy of this software and associated documentation files (the "Software"), 639def24fSHawking Zhang * to deal in the Software without restriction, including without limitation 739def24fSHawking Zhang * the rights to use, copy, modify, merge, publish, distribute, sublicense, 839def24fSHawking Zhang * and/or sell copies of the Software, and to permit persons to whom the 939def24fSHawking Zhang * Software is furnished to do so, subject to the following conditions: 1039def24fSHawking Zhang * 1139def24fSHawking Zhang * The above copyright notice and this permission notice shall be included in 1239def24fSHawking Zhang * all copies or substantial portions of the Software. 1339def24fSHawking Zhang * 1439def24fSHawking Zhang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1539def24fSHawking Zhang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1639def24fSHawking Zhang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1739def24fSHawking Zhang * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1839def24fSHawking Zhang * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1939def24fSHawking Zhang * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2039def24fSHawking Zhang * OTHER DEALINGS IN THE SOFTWARE. 2139def24fSHawking Zhang * 2239def24fSHawking Zhang */ 2339def24fSHawking Zhang #include "amdgpu.h" 2439def24fSHawking Zhang #include "amdgpu_atombios.h" 2539def24fSHawking Zhang #include "nbio_v7_9.h" 2639def24fSHawking Zhang #include "amdgpu_ras.h" 2739def24fSHawking Zhang 2839def24fSHawking Zhang #include "nbio/nbio_7_9_0_offset.h" 2939def24fSHawking Zhang #include "nbio/nbio_7_9_0_sh_mask.h" 3039def24fSHawking Zhang #include "ivsrcid/nbio/irqsrcs_nbif_7_4.h" 3139def24fSHawking Zhang #include <uapi/linux/kfd_ioctl.h> 3239def24fSHawking Zhang 33ea2d2f8eSRajneesh Bhardwaj #define NPS_MODE_MASK 0x000000FFL 34ea2d2f8eSRajneesh Bhardwaj 35*50709d18SLijo Lazar /* Core 0 Port 0 counter */ 36*50709d18SLijo Lazar #define smnPCIEP_NAK_COUNTER 0x1A340218 37*50709d18SLijo Lazar 3839def24fSHawking Zhang static void nbio_v7_9_remap_hdp_registers(struct amdgpu_device *adev) 3939def24fSHawking Zhang { 4039def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL, 4139def24fSHawking Zhang adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL); 4239def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_REMAP_HDP_REG_FLUSH_CNTL, 4339def24fSHawking Zhang adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_REG_FLUSH_CNTL); 4439def24fSHawking Zhang } 4539def24fSHawking Zhang 4639def24fSHawking Zhang static u32 nbio_v7_9_get_rev_id(struct amdgpu_device *adev) 4739def24fSHawking Zhang { 4839def24fSHawking Zhang u32 tmp; 4939def24fSHawking Zhang 5039def24fSHawking Zhang tmp = RREG32_SOC15(NBIO, 0, regRCC_STRAP0_RCC_DEV0_EPF0_STRAP0); 5139def24fSHawking Zhang tmp = REG_GET_FIELD(tmp, RCC_STRAP0_RCC_DEV0_EPF0_STRAP0, STRAP_ATI_REV_ID_DEV0_F0); 5239def24fSHawking Zhang 5339def24fSHawking Zhang return tmp; 5439def24fSHawking Zhang } 5539def24fSHawking Zhang 5639def24fSHawking Zhang static void nbio_v7_9_mc_access_enable(struct amdgpu_device *adev, bool enable) 5739def24fSHawking Zhang { 5839def24fSHawking Zhang if (enable) 5939def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_BIF_FB_EN, 6039def24fSHawking Zhang BIF_BX0_BIF_FB_EN__FB_READ_EN_MASK | BIF_BX0_BIF_FB_EN__FB_WRITE_EN_MASK); 6139def24fSHawking Zhang else 6239def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_BIF_FB_EN, 0); 6339def24fSHawking Zhang } 6439def24fSHawking Zhang 6539def24fSHawking Zhang static u32 nbio_v7_9_get_memsize(struct amdgpu_device *adev) 6639def24fSHawking Zhang { 6739def24fSHawking Zhang return RREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF0_RCC_CONFIG_MEMSIZE); 6839def24fSHawking Zhang } 6939def24fSHawking Zhang 7039def24fSHawking Zhang static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instance, 7139def24fSHawking Zhang bool use_doorbell, int doorbell_index, int doorbell_size) 7239def24fSHawking Zhang { 7339def24fSHawking Zhang u32 doorbell_range = 0, doorbell_ctrl = 0; 74f8b34a05SLijo Lazar int aid_id, dev_inst; 75f8b34a05SLijo Lazar 76f8b34a05SLijo Lazar dev_inst = GET_INST(SDMA0, instance); 77f8b34a05SLijo Lazar aid_id = adev->sdma.instance[instance].aid_id; 786b22ef25SLe Ma 796b22ef25SLe Ma if (use_doorbell == false) 806b22ef25SLe Ma return; 8139def24fSHawking Zhang 8239def24fSHawking Zhang doorbell_range = 8339def24fSHawking Zhang REG_SET_FIELD(doorbell_range, DOORBELL0_CTRL_ENTRY_0, 8439def24fSHawking Zhang BIF_DOORBELL0_RANGE_OFFSET_ENTRY, doorbell_index); 8539def24fSHawking Zhang doorbell_range = 8639def24fSHawking Zhang REG_SET_FIELD(doorbell_range, DOORBELL0_CTRL_ENTRY_0, 8739def24fSHawking Zhang BIF_DOORBELL0_RANGE_SIZE_ENTRY, doorbell_size); 8839def24fSHawking Zhang doorbell_ctrl = 8939def24fSHawking Zhang REG_SET_FIELD(doorbell_ctrl, S2A_DOORBELL_ENTRY_1_CTRL, 9039def24fSHawking Zhang S2A_DOORBELL_PORT1_ENABLE, 1); 9139def24fSHawking Zhang doorbell_ctrl = 9239def24fSHawking Zhang REG_SET_FIELD(doorbell_ctrl, S2A_DOORBELL_ENTRY_1_CTRL, 9339def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_SIZE, doorbell_size); 9439def24fSHawking Zhang 95f8b34a05SLijo Lazar switch (dev_inst % adev->sdma.num_inst_per_aid) { 9639def24fSHawking Zhang case 0: 973955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_1, 986b22ef25SLe Ma 4 * aid_id, doorbell_range); 9939def24fSHawking Zhang 10039def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 10139def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 10239def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0xe); 10339def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 10439def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 10539def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0xe); 10639def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 10739def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 10839def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 10939def24fSHawking Zhang 0x1); 110369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_1_CTRL, 111369576c2SLe Ma aid_id, doorbell_ctrl); 11239def24fSHawking Zhang break; 11339def24fSHawking Zhang case 1: 1143955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_2, 1156b22ef25SLe Ma 4 * aid_id, doorbell_range); 11639def24fSHawking Zhang 11739def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 11839def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 11939def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0x8); 12039def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 12139def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 12239def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x8); 12339def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 12439def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 12539def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 12639def24fSHawking Zhang 0x2); 127369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_2_CTRL, 128369576c2SLe Ma aid_id, doorbell_ctrl); 12939def24fSHawking Zhang break; 13039def24fSHawking Zhang case 2: 1313955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_3, 1326b22ef25SLe Ma 4 * aid_id, doorbell_range); 13339def24fSHawking Zhang 13439def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 13539def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 13639def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0x9); 13739def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 13839def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 13939def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x9); 14039def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 14139def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 14239def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 14339def24fSHawking Zhang 0x8); 144369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_5_CTRL, 145369576c2SLe Ma aid_id, doorbell_ctrl); 14639def24fSHawking Zhang break; 14739def24fSHawking Zhang case 3: 1483955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_4, 1496b22ef25SLe Ma 4 * aid_id, doorbell_range); 15039def24fSHawking Zhang 15139def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 15239def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 15339def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0xa); 15439def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 15539def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 15639def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0xa); 15739def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 15839def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 15939def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 16039def24fSHawking Zhang 0x9); 161369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_6_CTRL, 162369576c2SLe Ma aid_id, doorbell_ctrl); 16339def24fSHawking Zhang break; 16439def24fSHawking Zhang default: 16539def24fSHawking Zhang break; 1661ffbc89cSJiapeng Chong } 16739def24fSHawking Zhang 16839def24fSHawking Zhang return; 16939def24fSHawking Zhang } 17039def24fSHawking Zhang 17139def24fSHawking Zhang static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_doorbell, 17239def24fSHawking Zhang int doorbell_index, int instance) 17339def24fSHawking Zhang { 17439def24fSHawking Zhang u32 doorbell_range = 0, doorbell_ctrl = 0; 1752e10ced4SJames Zhu u32 aid_id = instance; 17639def24fSHawking Zhang 17739def24fSHawking Zhang if (use_doorbell) { 17839def24fSHawking Zhang doorbell_range = REG_SET_FIELD(doorbell_range, 17939def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 18039def24fSHawking Zhang BIF_DOORBELL0_RANGE_OFFSET_ENTRY, 18139def24fSHawking Zhang doorbell_index); 18239def24fSHawking Zhang doorbell_range = REG_SET_FIELD(doorbell_range, 18339def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 18439def24fSHawking Zhang BIF_DOORBELL0_RANGE_SIZE_ENTRY, 18553054e9aSJames Zhu 0x9); 1862e10ced4SJames Zhu if (aid_id) 1872e10ced4SJames Zhu doorbell_range = REG_SET_FIELD(doorbell_range, 1882e10ced4SJames Zhu DOORBELL0_CTRL_ENTRY_0, 1892e10ced4SJames Zhu DOORBELL0_FENCE_ENABLE_ENTRY, 1902e10ced4SJames Zhu 0x4); 19139def24fSHawking Zhang 19239def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 19339def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 19439def24fSHawking Zhang S2A_DOORBELL_PORT1_ENABLE, 1); 19539def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 19639def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 19739def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0x4); 19839def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 19939def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 20039def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x4); 20139def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 20239def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 20353054e9aSJames Zhu S2A_DOORBELL_PORT1_RANGE_SIZE, 0x9); 20439def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 20539def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 20639def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0x4); 2072e10ced4SJames Zhu 2083955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17, 2092e10ced4SJames Zhu aid_id, doorbell_range); 210369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL, 211369576c2SLe Ma aid_id, doorbell_ctrl); 21239def24fSHawking Zhang } else { 21339def24fSHawking Zhang doorbell_range = REG_SET_FIELD(doorbell_range, 21439def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 21539def24fSHawking Zhang BIF_DOORBELL0_RANGE_SIZE_ENTRY, 0); 21639def24fSHawking Zhang doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl, 21739def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 21839def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_SIZE, 0); 21939def24fSHawking Zhang 2203955b141SLe Ma WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17, 2213955b141SLe Ma aid_id, doorbell_range); 222369576c2SLe Ma WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL, 223369576c2SLe Ma aid_id, doorbell_ctrl); 2242e10ced4SJames Zhu } 22539def24fSHawking Zhang } 22639def24fSHawking Zhang 22739def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_aperture(struct amdgpu_device *adev, 22839def24fSHawking Zhang bool enable) 22939def24fSHawking Zhang { 23039def24fSHawking Zhang /* Enable to allow doorbell pass thru on pre-silicon bare-metal */ 23139def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIFC_DOORBELL_ACCESS_EN_PF, 0xfffff); 23239def24fSHawking Zhang WREG32_FIELD15_PREREG(NBIO, 0, RCC_DEV0_EPF0_RCC_DOORBELL_APER_EN, 23339def24fSHawking Zhang BIF_DOORBELL_APER_EN, enable ? 1 : 0); 23439def24fSHawking Zhang } 23539def24fSHawking Zhang 23639def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_selfring_aperture(struct amdgpu_device *adev, 23739def24fSHawking Zhang bool enable) 23839def24fSHawking Zhang { 23939def24fSHawking Zhang u32 tmp = 0; 24039def24fSHawking Zhang 24139def24fSHawking Zhang if (enable) { 24239def24fSHawking Zhang tmp = REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL, 24339def24fSHawking Zhang DOORBELL_SELFRING_GPA_APER_EN, 1) | 24439def24fSHawking Zhang REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL, 24539def24fSHawking Zhang DOORBELL_SELFRING_GPA_APER_MODE, 1) | 24639def24fSHawking Zhang REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL, 24739def24fSHawking Zhang DOORBELL_SELFRING_GPA_APER_SIZE, 0); 24839def24fSHawking Zhang 24939def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_BASE_LOW, 25039def24fSHawking Zhang lower_32_bits(adev->doorbell.base)); 25139def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_BASE_HIGH, 25239def24fSHawking Zhang upper_32_bits(adev->doorbell.base)); 25339def24fSHawking Zhang } 25439def24fSHawking Zhang 25539def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL, tmp); 25639def24fSHawking Zhang } 25739def24fSHawking Zhang 25839def24fSHawking Zhang static void nbio_v7_9_ih_doorbell_range(struct amdgpu_device *adev, 25939def24fSHawking Zhang bool use_doorbell, int doorbell_index) 26039def24fSHawking Zhang { 26139def24fSHawking Zhang u32 ih_doorbell_range = 0, ih_doorbell_ctrl = 0; 26239def24fSHawking Zhang 26339def24fSHawking Zhang if (use_doorbell) { 26439def24fSHawking Zhang ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, 26539def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 26639def24fSHawking Zhang BIF_DOORBELL0_RANGE_OFFSET_ENTRY, 26739def24fSHawking Zhang doorbell_index); 26839def24fSHawking Zhang ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, 26939def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 27039def24fSHawking Zhang BIF_DOORBELL0_RANGE_SIZE_ENTRY, 27140b832aaSMukul Joshi 0x8); 27239def24fSHawking Zhang 27339def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 27439def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 27539def24fSHawking Zhang S2A_DOORBELL_PORT1_ENABLE, 1); 27639def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 27739def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 27839def24fSHawking Zhang S2A_DOORBELL_PORT1_AWID, 0); 27939def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 28039def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 28139def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_OFFSET, 0); 28239def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 28339def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 28440b832aaSMukul Joshi S2A_DOORBELL_PORT1_RANGE_SIZE, 0x8); 28539def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 28639def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 28739def24fSHawking Zhang S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0); 28839def24fSHawking Zhang } else { 28939def24fSHawking Zhang ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, 29039def24fSHawking Zhang DOORBELL0_CTRL_ENTRY_0, 29139def24fSHawking Zhang BIF_DOORBELL0_RANGE_SIZE_ENTRY, 0); 29239def24fSHawking Zhang ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl, 29339def24fSHawking Zhang S2A_DOORBELL_ENTRY_1_CTRL, 29439def24fSHawking Zhang S2A_DOORBELL_PORT1_RANGE_SIZE, 0); 29539def24fSHawking Zhang } 29639def24fSHawking Zhang 29739def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_0, ih_doorbell_range); 29839def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_3_CTRL, ih_doorbell_ctrl); 29939def24fSHawking Zhang } 30039def24fSHawking Zhang 30139def24fSHawking Zhang 30239def24fSHawking Zhang static void nbio_v7_9_update_medium_grain_clock_gating(struct amdgpu_device *adev, 30339def24fSHawking Zhang bool enable) 30439def24fSHawking Zhang { 30539def24fSHawking Zhang } 30639def24fSHawking Zhang 30739def24fSHawking Zhang static void nbio_v7_9_update_medium_grain_light_sleep(struct amdgpu_device *adev, 30839def24fSHawking Zhang bool enable) 30939def24fSHawking Zhang { 31039def24fSHawking Zhang } 31139def24fSHawking Zhang 31239def24fSHawking Zhang static void nbio_v7_9_get_clockgating_state(struct amdgpu_device *adev, 31339def24fSHawking Zhang u64 *flags) 31439def24fSHawking Zhang { 31539def24fSHawking Zhang } 31639def24fSHawking Zhang 31739def24fSHawking Zhang static void nbio_v7_9_ih_control(struct amdgpu_device *adev) 31839def24fSHawking Zhang { 31939def24fSHawking Zhang u32 interrupt_cntl; 32039def24fSHawking Zhang 32139def24fSHawking Zhang /* setup interrupt control */ 32239def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL2, adev->dummy_page_addr >> 8); 32339def24fSHawking Zhang interrupt_cntl = RREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL); 32439def24fSHawking Zhang /* INTERRUPT_CNTL__IH_DUMMY_RD_OVERRIDE_MASK=0 - dummy read disabled with msi, enabled without msi 32539def24fSHawking Zhang * INTERRUPT_CNTL__IH_DUMMY_RD_OVERRIDE_MASK=1 - dummy read controlled by IH_DUMMY_RD_EN 32639def24fSHawking Zhang */ 32739def24fSHawking Zhang interrupt_cntl = 32839def24fSHawking Zhang REG_SET_FIELD(interrupt_cntl, BIF_BX0_INTERRUPT_CNTL, IH_DUMMY_RD_OVERRIDE, 0); 32939def24fSHawking Zhang /* INTERRUPT_CNTL__IH_REQ_NONSNOOP_EN_MASK=1 if ring is in non-cacheable memory, e.g., vram */ 33039def24fSHawking Zhang interrupt_cntl = 33139def24fSHawking Zhang REG_SET_FIELD(interrupt_cntl, BIF_BX0_INTERRUPT_CNTL, IH_REQ_NONSNOOP_EN, 0); 33239def24fSHawking Zhang WREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL, interrupt_cntl); 33339def24fSHawking Zhang } 33439def24fSHawking Zhang 33539def24fSHawking Zhang static u32 nbio_v7_9_get_hdp_flush_req_offset(struct amdgpu_device *adev) 33639def24fSHawking Zhang { 33739def24fSHawking Zhang return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX_PF0_GPU_HDP_FLUSH_REQ); 33839def24fSHawking Zhang } 33939def24fSHawking Zhang 34039def24fSHawking Zhang static u32 nbio_v7_9_get_hdp_flush_done_offset(struct amdgpu_device *adev) 34139def24fSHawking Zhang { 34239def24fSHawking Zhang return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX_PF0_GPU_HDP_FLUSH_DONE); 34339def24fSHawking Zhang } 34439def24fSHawking Zhang 34539def24fSHawking Zhang static u32 nbio_v7_9_get_pcie_index_offset(struct amdgpu_device *adev) 34639def24fSHawking Zhang { 34739def24fSHawking Zhang return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_INDEX2); 34839def24fSHawking Zhang } 34939def24fSHawking Zhang 35039def24fSHawking Zhang static u32 nbio_v7_9_get_pcie_data_offset(struct amdgpu_device *adev) 35139def24fSHawking Zhang { 35239def24fSHawking Zhang return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_DATA2); 35339def24fSHawking Zhang } 35439def24fSHawking Zhang 3550c552ed3SLe Ma static u32 nbio_v7_9_get_pcie_index_hi_offset(struct amdgpu_device *adev) 3560c552ed3SLe Ma { 3570c552ed3SLe Ma return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_INDEX2_HI); 3580c552ed3SLe Ma } 3590c552ed3SLe Ma 36039def24fSHawking Zhang const struct nbio_hdp_flush_reg nbio_v7_9_hdp_flush_reg = { 36139def24fSHawking Zhang .ref_and_mask_cp0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP0_MASK, 36239def24fSHawking Zhang .ref_and_mask_cp1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP1_MASK, 36339def24fSHawking Zhang .ref_and_mask_cp2 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP2_MASK, 36439def24fSHawking Zhang .ref_and_mask_cp3 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP3_MASK, 36539def24fSHawking Zhang .ref_and_mask_cp4 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP4_MASK, 36639def24fSHawking Zhang .ref_and_mask_cp5 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP5_MASK, 36739def24fSHawking Zhang .ref_and_mask_cp6 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP6_MASK, 36839def24fSHawking Zhang .ref_and_mask_cp7 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP7_MASK, 36939def24fSHawking Zhang .ref_and_mask_cp8 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP8_MASK, 37039def24fSHawking Zhang .ref_and_mask_cp9 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP9_MASK, 37139def24fSHawking Zhang .ref_and_mask_sdma0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA0_MASK, 37239def24fSHawking Zhang .ref_and_mask_sdma1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA1_MASK, 37339def24fSHawking Zhang .ref_and_mask_sdma2 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG0_MASK, 37439def24fSHawking Zhang .ref_and_mask_sdma3 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG1_MASK, 37539def24fSHawking Zhang .ref_and_mask_sdma4 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG2_MASK, 37639def24fSHawking Zhang .ref_and_mask_sdma5 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG3_MASK, 37739def24fSHawking Zhang .ref_and_mask_sdma6 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG4_MASK, 37839def24fSHawking Zhang .ref_and_mask_sdma7 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG5_MASK, 37939def24fSHawking Zhang }; 38039def24fSHawking Zhang 38139def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_interrupt(struct amdgpu_device *adev, 38239def24fSHawking Zhang bool enable) 38339def24fSHawking Zhang { 38439def24fSHawking Zhang WREG32_FIELD15_PREREG(NBIO, 0, BIF_BX0_BIF_DOORBELL_INT_CNTL, 38539def24fSHawking Zhang DOORBELL_INTERRUPT_DISABLE, enable ? 0 : 1); 38639def24fSHawking Zhang } 38739def24fSHawking Zhang 3886c882a57SNathan Chancellor static int nbio_v7_9_get_compute_partition_mode(struct amdgpu_device *adev) 38998a54e88SLe Ma { 390cd321e6fSLijo Lazar u32 tmp, px; 39198a54e88SLe Ma 392cd321e6fSLijo Lazar tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_COMPUTE_STATUS); 393cd321e6fSLijo Lazar px = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_COMPUTE_STATUS, 394cd321e6fSLijo Lazar PARTITION_MODE); 39598a54e88SLe Ma 396fe381726SLijo Lazar return px; 39798a54e88SLe Ma } 39898a54e88SLe Ma 3996c882a57SNathan Chancellor static u32 nbio_v7_9_get_memory_partition_mode(struct amdgpu_device *adev, 4006c882a57SNathan Chancellor u32 *supp_modes) 401ea2d2f8eSRajneesh Bhardwaj { 402ea2d2f8eSRajneesh Bhardwaj u32 tmp; 4030f2e1d62SLijo Lazar 404ea2d2f8eSRajneesh Bhardwaj tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_STATUS); 405ea2d2f8eSRajneesh Bhardwaj tmp = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_MEM_STATUS, NPS_MODE); 406ea2d2f8eSRajneesh Bhardwaj 4070f2e1d62SLijo Lazar if (supp_modes) { 4080f2e1d62SLijo Lazar *supp_modes = 4090f2e1d62SLijo Lazar RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_CAP); 4100f2e1d62SLijo Lazar } 4110f2e1d62SLijo Lazar 412ea2d2f8eSRajneesh Bhardwaj return ffs(tmp); 413ea2d2f8eSRajneesh Bhardwaj } 414ea2d2f8eSRajneesh Bhardwaj 41589fb3020SShiwu Zhang static void nbio_v7_9_init_registers(struct amdgpu_device *adev) 41689fb3020SShiwu Zhang { 41789fb3020SShiwu Zhang u32 inst_mask; 41889fb3020SShiwu Zhang int i; 41989fb3020SShiwu Zhang 42089fb3020SShiwu Zhang WREG32_SOC15(NBIO, 0, regXCC_DOORBELL_FENCE, 42189fb3020SShiwu Zhang 0xff & ~(adev->gfx.xcc_mask)); 42289fb3020SShiwu Zhang 423a3ffabb2SLijo Lazar WREG32_SOC15(NBIO, 0, regBIFC_GFX_INT_MONITOR_MASK, 0x7ff); 424a3ffabb2SLijo Lazar 42589fb3020SShiwu Zhang inst_mask = adev->aid_mask & ~1U; 42689fb3020SShiwu Zhang for_each_inst(i, inst_mask) { 42789fb3020SShiwu Zhang WREG32_SOC15_EXT(NBIO, i, regXCC_DOORBELL_FENCE, i, 42889fb3020SShiwu Zhang XCC_DOORBELL_FENCE__SHUB_SLV_MODE_MASK); 42989fb3020SShiwu Zhang 43089fb3020SShiwu Zhang } 43189fb3020SShiwu Zhang } 43289fb3020SShiwu Zhang 433*50709d18SLijo Lazar static u64 nbio_v7_9_get_pcie_replay_count(struct amdgpu_device *adev) 434*50709d18SLijo Lazar { 435*50709d18SLijo Lazar u32 val, nak_r, nak_g; 436*50709d18SLijo Lazar 437*50709d18SLijo Lazar if (adev->flags & AMD_IS_APU) 438*50709d18SLijo Lazar return 0; 439*50709d18SLijo Lazar 440*50709d18SLijo Lazar /* Get the number of NAKs received and generated */ 441*50709d18SLijo Lazar val = RREG32_PCIE(smnPCIEP_NAK_COUNTER); 442*50709d18SLijo Lazar nak_r = val & 0xFFFF; 443*50709d18SLijo Lazar nak_g = val >> 16; 444*50709d18SLijo Lazar 445*50709d18SLijo Lazar /* Add the total number of NAKs, i.e the number of replays */ 446*50709d18SLijo Lazar return (nak_r + nak_g); 447*50709d18SLijo Lazar } 448*50709d18SLijo Lazar 44939def24fSHawking Zhang const struct amdgpu_nbio_funcs nbio_v7_9_funcs = { 45039def24fSHawking Zhang .get_hdp_flush_req_offset = nbio_v7_9_get_hdp_flush_req_offset, 45139def24fSHawking Zhang .get_hdp_flush_done_offset = nbio_v7_9_get_hdp_flush_done_offset, 45239def24fSHawking Zhang .get_pcie_index_offset = nbio_v7_9_get_pcie_index_offset, 45339def24fSHawking Zhang .get_pcie_data_offset = nbio_v7_9_get_pcie_data_offset, 4540c552ed3SLe Ma .get_pcie_index_hi_offset = nbio_v7_9_get_pcie_index_hi_offset, 45539def24fSHawking Zhang .get_rev_id = nbio_v7_9_get_rev_id, 45639def24fSHawking Zhang .mc_access_enable = nbio_v7_9_mc_access_enable, 45739def24fSHawking Zhang .get_memsize = nbio_v7_9_get_memsize, 45839def24fSHawking Zhang .sdma_doorbell_range = nbio_v7_9_sdma_doorbell_range, 45939def24fSHawking Zhang .vcn_doorbell_range = nbio_v7_9_vcn_doorbell_range, 46039def24fSHawking Zhang .enable_doorbell_aperture = nbio_v7_9_enable_doorbell_aperture, 46139def24fSHawking Zhang .enable_doorbell_selfring_aperture = nbio_v7_9_enable_doorbell_selfring_aperture, 46239def24fSHawking Zhang .ih_doorbell_range = nbio_v7_9_ih_doorbell_range, 46339def24fSHawking Zhang .enable_doorbell_interrupt = nbio_v7_9_enable_doorbell_interrupt, 46439def24fSHawking Zhang .update_medium_grain_clock_gating = nbio_v7_9_update_medium_grain_clock_gating, 46539def24fSHawking Zhang .update_medium_grain_light_sleep = nbio_v7_9_update_medium_grain_light_sleep, 46639def24fSHawking Zhang .get_clockgating_state = nbio_v7_9_get_clockgating_state, 46739def24fSHawking Zhang .ih_control = nbio_v7_9_ih_control, 46839def24fSHawking Zhang .remap_hdp_registers = nbio_v7_9_remap_hdp_registers, 46998a54e88SLe Ma .get_compute_partition_mode = nbio_v7_9_get_compute_partition_mode, 470ea2d2f8eSRajneesh Bhardwaj .get_memory_partition_mode = nbio_v7_9_get_memory_partition_mode, 47189fb3020SShiwu Zhang .init_registers = nbio_v7_9_init_registers, 472*50709d18SLijo Lazar .get_pcie_replay_count = nbio_v7_9_get_pcie_replay_count, 47339def24fSHawking Zhang }; 474