diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 79 | 
1 files changed, 25 insertions, 54 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index f6147528be64..b6db28a570c2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -144,41 +144,6 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  	struct amdgpu_device *adev;  	int r, acpi_status; -#ifdef CONFIG_DRM_AMDGPU_SI -	if (!amdgpu_si_support) { -		switch (flags & AMD_ASIC_MASK) { -		case CHIP_TAHITI: -		case CHIP_PITCAIRN: -		case CHIP_VERDE: -		case CHIP_OLAND: -		case CHIP_HAINAN: -			dev_info(dev->dev, -				 "SI support provided by radeon.\n"); -			dev_info(dev->dev, -				 "Use radeon.si_support=0 amdgpu.si_support=1 to override.\n" -				); -			return -ENODEV; -		} -	} -#endif -#ifdef CONFIG_DRM_AMDGPU_CIK -	if (!amdgpu_cik_support) { -		switch (flags & AMD_ASIC_MASK) { -		case CHIP_KAVERI: -		case CHIP_BONAIRE: -		case CHIP_HAWAII: -		case CHIP_KABINI: -		case CHIP_MULLINS: -			dev_info(dev->dev, -				 "CIK support provided by radeon.\n"); -			dev_info(dev->dev, -				 "Use radeon.cik_support=0 amdgpu.cik_support=1 to override.\n" -				); -			return -ENODEV; -		} -	} -#endif -  	adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL);  	if (adev == NULL) {  		return -ENOMEM; @@ -225,7 +190,6 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  		pm_runtime_put_autosuspend(dev->dev);  	} -	amdgpu_register_gpu_instance(adev);  out:  	if (r) {  		/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */ @@ -619,9 +583,12 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  		struct drm_amdgpu_info_vram_gtt vram_gtt;  		vram_gtt.vram_size = adev->gmc.real_vram_size - -			atomic64_read(&adev->vram_pin_size); -		vram_gtt.vram_cpu_accessible_size = adev->gmc.visible_vram_size - -			atomic64_read(&adev->visible_pin_size); +			atomic64_read(&adev->vram_pin_size) - +			AMDGPU_VM_RESERVED_VRAM; +		vram_gtt.vram_cpu_accessible_size = +			min(adev->gmc.visible_vram_size - +			    atomic64_read(&adev->visible_pin_size), +			    vram_gtt.vram_size);  		vram_gtt.gtt_size = adev->mman.bdev.man[TTM_PL_TT].size;  		vram_gtt.gtt_size *= PAGE_SIZE;  		vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); @@ -634,15 +601,18 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  		memset(&mem, 0, sizeof(mem));  		mem.vram.total_heap_size = adev->gmc.real_vram_size;  		mem.vram.usable_heap_size = adev->gmc.real_vram_size - -			atomic64_read(&adev->vram_pin_size); +			atomic64_read(&adev->vram_pin_size) - +			AMDGPU_VM_RESERVED_VRAM;  		mem.vram.heap_usage =  			amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);  		mem.vram.max_allocation = mem.vram.usable_heap_size * 3 / 4;  		mem.cpu_accessible_vram.total_heap_size =  			adev->gmc.visible_vram_size; -		mem.cpu_accessible_vram.usable_heap_size = adev->gmc.visible_vram_size - -			atomic64_read(&adev->visible_pin_size); +		mem.cpu_accessible_vram.usable_heap_size = +			min(adev->gmc.visible_vram_size - +			    atomic64_read(&adev->visible_pin_size), +			    mem.vram.usable_heap_size);  		mem.cpu_accessible_vram.heap_usage =  			amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);  		mem.cpu_accessible_vram.max_allocation = @@ -685,15 +655,19 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  			return -ENOMEM;  		alloc_size = info->read_mmr_reg.count * sizeof(*regs); -		for (i = 0; i < info->read_mmr_reg.count; i++) +		amdgpu_gfx_off_ctrl(adev, false); +		for (i = 0; i < info->read_mmr_reg.count; i++) {  			if (amdgpu_asic_read_register(adev, se_num, sh_num,  						      info->read_mmr_reg.dword_offset + i,  						      ®s[i])) {  				DRM_DEBUG_KMS("unallowed offset %#x\n",  					      info->read_mmr_reg.dword_offset + i);  				kfree(regs); +				amdgpu_gfx_off_ctrl(adev, true);  				return -EFAULT;  			} +		} +		amdgpu_gfx_off_ctrl(adev, true);  		n = copy_to_user(out, regs, min(size, alloc_size));  		kfree(regs);  		return n ? -EFAULT : 0; @@ -764,17 +738,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  		dev_info.vce_harvest_config = adev->vce.harvest_config;  		dev_info.gc_double_offchip_lds_buf =  			adev->gfx.config.double_offchip_lds_buf; - -		if (amdgpu_ngg) { -			dev_info.prim_buf_gpu_addr = adev->gfx.ngg.buf[NGG_PRIM].gpu_addr; -			dev_info.prim_buf_size = adev->gfx.ngg.buf[NGG_PRIM].size; -			dev_info.pos_buf_gpu_addr = adev->gfx.ngg.buf[NGG_POS].gpu_addr; -			dev_info.pos_buf_size = adev->gfx.ngg.buf[NGG_POS].size; -			dev_info.cntl_sb_buf_gpu_addr = adev->gfx.ngg.buf[NGG_CNTL].gpu_addr; -			dev_info.cntl_sb_buf_size = adev->gfx.ngg.buf[NGG_CNTL].size; -			dev_info.param_buf_gpu_addr = adev->gfx.ngg.buf[NGG_PARAM].gpu_addr; -			dev_info.param_buf_size = adev->gfx.ngg.buf[NGG_PARAM].size; -		}  		dev_info.wave_front_size = adev->gfx.cu_info.wave_front_size;  		dev_info.num_shader_visible_vgprs = adev->gfx.config.max_gprs;  		dev_info.num_cu_per_sh = adev->gfx.config.max_cu_per_sh; @@ -787,6 +750,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  			dev_info.pa_sc_tile_steering_override =  				adev->gfx.config.pa_sc_tile_steering_override; +		dev_info.tcc_disabled_mask = adev->gfx.config.tcc_disabled_mask; +  		return copy_to_user(out, &dev_info,  				    min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0;  	} @@ -1001,6 +966,12 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  	/* Ensure IB tests are run on ring */  	flush_delayed_work(&adev->delayed_init_work); + +	if (amdgpu_ras_intr_triggered()) { +		DRM_ERROR("RAS Intr triggered, device disabled!!"); +		return -EHWPOISON; +	} +  	file_priv->driver_priv = NULL;  	r = pm_runtime_get_sync(dev->dev); |