static int vi_gpu_pci_config_reset(struct amdgpu_device *adev) { u32 i; dev_info(adev->dev, "GPU pci config reset\n"); /* disable BM */ pci_clear_master(adev->pdev); /* reset */ amdgpu_pci_config_reset(adev); udelay(100); /* wait for asic to come out of reset */ for (i = 0; i < adev->usec_timeout; i++) { if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { /* enable BM */ pci_set_master(adev->pdev); adev->has_hw_reset = true; return 0; } udelay(1); } return -EINVAL; }
static void vi_gpu_pci_config_reset(struct amdgpu_device *adev) { u32 i; dev_info(adev->dev, "GPU pci config reset\n"); /* disable BM */ pci_clear_master(adev->pdev); /* reset */ amdgpu_pci_config_reset(adev); udelay(100); /* wait for asic to come out of reset */ for (i = 0; i < adev->usec_timeout; i++) { if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) break; udelay(1); } }
static void vi_gpu_pci_config_reset(struct amdgpu_device *adev) { struct amdgpu_mode_mc_save save; u32 tmp, i; dev_info(adev->dev, "GPU pci config reset\n"); /* disable dpm? */ /* disable cg/pg */ /* Disable GFX parsing/prefetching */ tmp = RREG32(mmCP_ME_CNTL); tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 1); tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1); tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1); WREG32(mmCP_ME_CNTL, tmp); /* Disable MEC parsing/prefetching */ tmp = RREG32(mmCP_MEC_CNTL); tmp = REG_SET_FIELD(tmp, CP_MEC_CNTL, MEC_ME1_HALT, 1); tmp = REG_SET_FIELD(tmp, CP_MEC_CNTL, MEC_ME2_HALT, 1); WREG32(mmCP_MEC_CNTL, tmp); /* Disable GFX parsing/prefetching */ WREG32(mmCP_ME_CNTL, CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK); /* Disable MEC parsing/prefetching */ WREG32(mmCP_MEC_CNTL, CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK); /* sdma0 */ tmp = RREG32(mmSDMA0_F32_CNTL + SDMA0_REGISTER_OFFSET); tmp = REG_SET_FIELD(tmp, SDMA0_F32_CNTL, HALT, 1); WREG32(mmSDMA0_F32_CNTL + SDMA0_REGISTER_OFFSET, tmp); /* sdma1 */ tmp = RREG32(mmSDMA0_F32_CNTL + SDMA1_REGISTER_OFFSET); tmp = REG_SET_FIELD(tmp, SDMA0_F32_CNTL, HALT, 1); WREG32(mmSDMA0_F32_CNTL + SDMA1_REGISTER_OFFSET, tmp); /* XXX other engines? */ /* halt the rlc, disable cp internal ints */ //XXX //gfx_v8_0_rlc_stop(adev); udelay(50); /* disable mem access */ gmc_v8_0_mc_stop(adev, &save); if (amdgpu_asic_wait_for_mc_idle(adev)) { dev_warn(adev->dev, "Wait for MC idle timed out !\n"); } /* disable BM */ pci_clear_master(adev->pdev); /* reset */ amdgpu_pci_config_reset(adev); udelay(100); /* wait for asic to come out of reset */ for (i = 0; i < adev->usec_timeout; i++) { if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) break; udelay(1); } }