diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 19 | 
1 files changed, 18 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 4fcfc2313b8c..5661b82d84d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -33,6 +33,7 @@  #include <linux/slab.h>  #include <linux/dma-buf.h> +#include <drm/drm_drv.h>  #include <drm/amdgpu_drm.h>  #include <drm/drm_cache.h>  #include "amdgpu.h" @@ -1032,9 +1033,14 @@ int amdgpu_bo_init(struct amdgpu_device *adev)  	/* On A+A platform, VRAM can be mapped as WB */  	if (!adev->gmc.xgmi.connected_to_cpu) {  		/* reserve PAT memory space to WC for VRAM */ -		arch_io_reserve_memtype_wc(adev->gmc.aper_base, +		int r = arch_io_reserve_memtype_wc(adev->gmc.aper_base,  				adev->gmc.aper_size); +		if (r) { +			DRM_ERROR("Unable to set WC memtype for the aperture base\n"); +			return r; +		} +  		/* Add an MTRR for the VRAM */  		adev->gmc.vram_mtrr = arch_phys_wc_add(adev->gmc.aper_base,  				adev->gmc.aper_size); @@ -1056,7 +1062,18 @@ int amdgpu_bo_init(struct amdgpu_device *adev)   */  void amdgpu_bo_fini(struct amdgpu_device *adev)  { +	int idx; +  	amdgpu_ttm_fini(adev); + +	if (drm_dev_enter(adev_to_drm(adev), &idx)) { + +		if (!adev->gmc.xgmi.connected_to_cpu) { +			arch_phys_wc_del(adev->gmc.vram_mtrr); +			arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size); +		} +		drm_dev_exit(idx); +	}  }  /** |