diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 136 | 
1 files changed, 66 insertions, 70 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index ab3794c42d36..6e40cc1bc6dc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -125,6 +125,7 @@ const char *amdgpu_asic_name[] = {  	"DIMGREY_CAVEFISH",  	"BEIGE_GOBY",  	"YELLOW_CARP", +	"IP DISCOVERY",  	"LAST",  }; @@ -305,7 +306,7 @@ void amdgpu_device_mm_access(struct amdgpu_device *adev, loff_t pos,  	uint64_t last;  	int idx; -	if (!drm_dev_enter(&adev->ddev, &idx)) +	if (!drm_dev_enter(adev_to_drm(adev), &idx))  		return;  	BUG_ON(!IS_ALIGNED(pos, 4) || !IS_ALIGNED(size, 4)); @@ -2126,46 +2127,11 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)  		if (r)  			return r;  		break; -	case CHIP_VEGA10: -	case CHIP_VEGA12: -	case CHIP_VEGA20: -	case CHIP_RAVEN: -	case CHIP_ARCTURUS: -	case CHIP_RENOIR: -	case CHIP_ALDEBARAN: -		if (adev->flags & AMD_IS_APU) -			adev->family = AMDGPU_FAMILY_RV; -		else -			adev->family = AMDGPU_FAMILY_AI; - -		r = soc15_set_ip_blocks(adev); -		if (r) -			return r; -		break; -	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_YELLOW_CARP: -	case CHIP_CYAN_SKILLFISH: -		if (adev->asic_type == CHIP_VANGOGH) -			adev->family = AMDGPU_FAMILY_VGH; -		else if (adev->asic_type == CHIP_YELLOW_CARP) -			adev->family = AMDGPU_FAMILY_YC; -		else -			adev->family = AMDGPU_FAMILY_NV; - -		r = nv_set_ip_blocks(adev); +	default: +		r = amdgpu_discovery_set_ip_blocks(adev);  		if (r)  			return r;  		break; -	default: -		/* FIXME: not supported yet */ -		return -EINVAL;  	}  	amdgpu_amdkfd_device_probe(adev); @@ -2394,10 +2360,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  	if (r)  		goto init_failed; -	r = amdgpu_amdkfd_resume_iommu(adev); -	if (r) -		goto init_failed; -  	r = amdgpu_device_ip_hw_init_phase1(adev);  	if (r)  		goto init_failed; @@ -2436,6 +2398,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  	if (!adev->gmc.xgmi.pending_reset)  		amdgpu_amdkfd_device_init(adev); +	r = amdgpu_amdkfd_resume_iommu(adev); +	if (r) +		goto init_failed; +  	amdgpu_fru_get_product_info(adev);  init_failed: @@ -2745,6 +2711,11 @@ static int amdgpu_device_ip_fini_early(struct amdgpu_device *adev)  		adev->ip_blocks[i].status.hw = false;  	} +	if (amdgpu_sriov_vf(adev)) { +		if (amdgpu_virt_release_full_gpu(adev, false)) +			DRM_ERROR("failed to release exclusive mode on fini\n"); +	} +  	return 0;  } @@ -2805,10 +2776,6 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)  	amdgpu_ras_fini(adev); -	if (amdgpu_sriov_vf(adev)) -		if (amdgpu_virt_release_full_gpu(adev, false)) -			DRM_ERROR("failed to release exclusive mode on fini\n"); -  	return 0;  } @@ -3240,6 +3207,7 @@ bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)  	case CHIP_NAVI14:  	case CHIP_NAVI12:  	case CHIP_RENOIR: +	case CHIP_CYAN_SKILLFISH:  	case CHIP_SIENNA_CICHLID:  	case CHIP_NAVY_FLOUNDER:  	case CHIP_DIMGREY_CAVEFISH: @@ -3247,13 +3215,15 @@ bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)  	case CHIP_VANGOGH:  	case CHIP_YELLOW_CARP:  #endif +	default:  		return amdgpu_dc != 0; -#endif +#else  	default:  		if (amdgpu_dc > 0)  			DRM_INFO_ONCE("Display Core has been requested via kernel parameter "  					 "but isn't supported by ASIC, ignoring\n");  		return false; +#endif  	}  } @@ -3354,6 +3324,8 @@ static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)  				continue;  			} else if (timeout < 0) {  				timeout = MAX_SCHEDULE_TIMEOUT; +				dev_warn(adev->dev, "lockup timeout disabled"); +				add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);  			} else {  				timeout = msecs_to_jiffies(timeout);  			} @@ -3538,17 +3510,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);  	DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size); -	/* enable PCIE atomic ops */ -	r = pci_enable_atomic_ops_to_root(adev->pdev, -					  PCI_EXP_DEVCAP2_ATOMIC_COMP32 | -					  PCI_EXP_DEVCAP2_ATOMIC_COMP64); -	if (r) { -		adev->have_atomics_support = false; -		DRM_INFO("PCIE atomic ops is not supported\n"); -	} else { -		adev->have_atomics_support = true; -	} -  	amdgpu_device_get_pcie_info(adev);  	if (amdgpu_mcbp) @@ -3571,6 +3532,19 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	if (r)  		return r; +	/* enable PCIE atomic ops */ +	if (amdgpu_sriov_vf(adev)) +		adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *) +			adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_enabled_flags == +			(PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64); +	else +		adev->have_atomics_support = +			!pci_enable_atomic_ops_to_root(adev->pdev, +					  PCI_EXP_DEVCAP2_ATOMIC_COMP32 | +					  PCI_EXP_DEVCAP2_ATOMIC_COMP64); +	if (!adev->have_atomics_support) +		dev_info(adev->dev, "PCIE atomic ops is not supported\n"); +  	/* doorbell bar mapping and doorbell index init*/  	amdgpu_device_doorbell_init(adev); @@ -3865,9 +3839,11 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)  	amdgpu_fbdev_fini(adev); +	amdgpu_device_ip_fini_early(adev); +  	amdgpu_irq_fini_hw(adev); -	amdgpu_device_ip_fini_early(adev); +	ttm_device_clear_dma_mappings(&adev->mman.bdev);  	amdgpu_gart_dummy_page_fini(adev); @@ -3876,8 +3852,8 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)  void amdgpu_device_fini_sw(struct amdgpu_device *adev)  { -	amdgpu_device_ip_fini(adev);  	amdgpu_fence_driver_sw_fini(adev); +	amdgpu_device_ip_fini(adev);  	release_firmware(adev->firmware.gpu_info_fw);  	adev->firmware.gpu_info_fw = NULL;  	adev->accel_working = false; @@ -3909,6 +3885,25 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)  } +/** + * amdgpu_device_evict_resources - evict device resources + * @adev: amdgpu device object + * + * Evicts all ttm device resources(vram BOs, gart table) from the lru list + * of the vram memory type. Mainly used for evicting device resources + * at suspend time. + * + */ +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)) +		return; + +	if (amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM)) +		DRM_WARN("evicting device resources failed\n"); + +}  /*   * Suspend & resume. @@ -3949,17 +3944,16 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  	if (!adev->in_s0ix)  		amdgpu_amdkfd_suspend(adev, adev->in_runpm); -	/* evict vram memory */ -	amdgpu_bo_evict_vram(adev); +	/* First evict vram memory */ +	amdgpu_device_evict_resources(adev);  	amdgpu_fence_driver_hw_fini(adev);  	amdgpu_device_ip_suspend_phase2(adev); -	/* evict remaining vram memory -	 * This second call to evict vram is to evict the gart page table -	 * using the CPU. +	/* This second call to evict device resources is to evict +	 * the gart page table using the CPU.  	 */ -	amdgpu_bo_evict_vram(adev); +	amdgpu_device_evict_resources(adev);  	return 0;  } @@ -4466,10 +4460,6 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,  	if (reset_context->reset_req_dev == adev)  		job = reset_context->job; -	/* no need to dump if device is not in good state during probe period */ -	if (!adev->gmc.xgmi.pending_reset) -		amdgpu_debugfs_wait_dump(adev); -  	if (amdgpu_sriov_vf(adev)) {  		/* stop the data exchange thread */  		amdgpu_virt_fini_data_exchange(adev); @@ -5399,6 +5389,8 @@ pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_sta  		return PCI_ERS_RESULT_DISCONNECT;  	} +	adev->pci_channel_state = state; +  	switch (state) {  	case pci_channel_io_normal:  		return PCI_ERS_RESULT_CAN_RECOVER; @@ -5541,6 +5533,10 @@ void amdgpu_pci_resume(struct pci_dev *pdev)  	DRM_INFO("PCI error: resume callback!!\n"); +	/* Only continue execution for the case of pci_channel_io_frozen */ +	if (adev->pci_channel_state != pci_channel_io_frozen) +		return; +  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {  		struct amdgpu_ring *ring = adev->rings[i]; |