diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 81 | 
1 files changed, 36 insertions, 45 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index a8b08a72b71b..ed077de426d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -552,7 +552,7 @@ void amdgpu_device_wreg(struct amdgpu_device *adev,  }  /** - * amdgpu_mm_wreg_mmio_rlc -  write register either with mmio or with RLC path if in range + * amdgpu_mm_wreg_mmio_rlc -  write register either with direct/indirect mmio or with RLC path if in range   *   * this function is invoked only the debugfs register access   */ @@ -567,6 +567,8 @@ void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev,  	    adev->gfx.rlc.funcs->is_rlcg_access_range) {  		if (adev->gfx.rlc.funcs->is_rlcg_access_range(adev, reg))  			return adev->gfx.rlc.funcs->sriov_wreg(adev, reg, v, 0, 0); +	} else if ((reg * 4) >= adev->rmmio_size) { +		adev->pcie_wreg(adev, reg * 4, v);  	} else {  		writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));  	} @@ -1448,7 +1450,7 @@ static int amdgpu_device_init_apu_flags(struct amdgpu_device *adev)  			adev->apu_flags |= AMD_APU_IS_CYAN_SKILLFISH2;  		break;  	default: -		return -EINVAL; +		break;  	}  	return 0; @@ -2352,7 +2354,7 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  	}  	if (amdgpu_sriov_vf(adev)) -		amdgpu_virt_exchange_data(adev); +		amdgpu_virt_init_data_exchange(adev);  	r = amdgpu_ib_pool_init(adev);  	if (r) { @@ -3496,9 +3498,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	mutex_init(&adev->psp.mutex);  	mutex_init(&adev->notifier_lock); -	r = amdgpu_device_init_apu_flags(adev); -	if (r) -		return r; +	 amdgpu_device_init_apu_flags(adev);  	r = amdgpu_device_check_arguments(adev);  	if (r) @@ -3833,6 +3833,7 @@ failed:  static void amdgpu_device_unmap_mmio(struct amdgpu_device *adev)  { +  	/* Clear all CPU mappings pointing to this device */  	unmap_mapping_range(adev->ddev.anon_inode->i_mapping, 0, 0, 1); @@ -3913,6 +3914,8 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)  void amdgpu_device_fini_sw(struct amdgpu_device *adev)  { +	int idx; +  	amdgpu_fence_driver_sw_fini(adev);  	amdgpu_device_ip_fini(adev);  	release_firmware(adev->firmware.gpu_info_fw); @@ -3937,6 +3940,14 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)  	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)  		vga_client_unregister(adev->pdev); +	if (drm_dev_enter(adev_to_drm(adev), &idx)) { + +		iounmap(adev->rmmio); +		adev->rmmio = NULL; +		amdgpu_device_doorbell_fini(adev); +		drm_dev_exit(idx); +	} +  	if (IS_ENABLED(CONFIG_PERF_EVENTS))  		amdgpu_pmu_fini(adev);  	if (adev->mman.discovery_bin) @@ -3957,8 +3968,8 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)   */  static void amdgpu_device_evict_resources(struct amdgpu_device *adev)  { -	/* No need to evict vram on APUs for suspend to ram */ -	if (adev->in_s3 && (adev->flags & AMD_IS_APU)) +	/* No need to evict vram on APUs for suspend to ram or s2idle */ +	if ((adev->in_s3 || adev->in_s0ix) && (adev->flags & AMD_IS_APU))  		return;  	if (amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM)) @@ -4005,16 +4016,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  	if (!adev->in_s0ix)  		amdgpu_amdkfd_suspend(adev, adev->in_runpm); -	/* First evict vram memory */  	amdgpu_device_evict_resources(adev);  	amdgpu_fence_driver_hw_fini(adev);  	amdgpu_device_ip_suspend_phase2(adev); -	/* This second call to evict device resources is to evict -	 * the gart page table using the CPU. -	 */ -	amdgpu_device_evict_resources(adev);  	return 0;  } @@ -4359,8 +4365,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,  		goto error;  	amdgpu_virt_init_data_exchange(adev); -	/* we need recover gart prior to run SMC/CP/SDMA resume */ -	amdgpu_gtt_mgr_recover(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT));  	r = amdgpu_device_fw_loading(adev);  	if (r) @@ -4446,33 +4450,24 @@ bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)  	if (amdgpu_gpu_recovery == -1) {  		switch (adev->asic_type) { -		case CHIP_BONAIRE: -		case CHIP_HAWAII: -		case CHIP_TOPAZ: -		case CHIP_TONGA: -		case CHIP_FIJI: -		case CHIP_POLARIS10: -		case CHIP_POLARIS11: -		case CHIP_POLARIS12: -		case CHIP_VEGAM: -		case CHIP_VEGA20: -		case CHIP_VEGA10: -		case CHIP_VEGA12: -		case CHIP_RAVEN: -		case CHIP_ARCTURUS: -		case CHIP_RENOIR: -		case CHIP_NAVI10: -		case CHIP_NAVI14: -		case CHIP_NAVI12: -		case CHIP_SIENNA_CICHLID: -		case CHIP_NAVY_FLOUNDER: -		case CHIP_DIMGREY_CAVEFISH: -		case CHIP_BEIGE_GOBY: -		case CHIP_VANGOGH: -		case CHIP_ALDEBARAN: -			break; -		default: +#ifdef CONFIG_DRM_AMDGPU_SI +		case CHIP_VERDE: +		case CHIP_TAHITI: +		case CHIP_PITCAIRN: +		case CHIP_OLAND: +		case CHIP_HAINAN: +#endif +#ifdef CONFIG_DRM_AMDGPU_CIK +		case CHIP_KAVERI: +		case CHIP_KABINI: +		case CHIP_MULLINS: +#endif +		case CHIP_CARRIZO: +		case CHIP_STONEY: +		case CHIP_CYAN_SKILLFISH:  			goto disabled; +		default: +			break;  		}  	} @@ -4680,10 +4675,6 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,  					amdgpu_inc_vram_lost(tmp_adev);  				} -				r = amdgpu_gtt_mgr_recover(ttm_manager_type(&tmp_adev->mman.bdev, TTM_PL_TT)); -				if (r) -					goto out; -  				r = amdgpu_device_fw_loading(tmp_adev);  				if (r)  					return r;  |