diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nv.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 24 | 
17 files changed, 107 insertions, 47 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 751557af09bb..a15a4787c7ee 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -297,7 +297,7 @@ void amdgpu_amdkfd_ras_poison_consumption_handler(struct kgd_dev *kgd);  void amdgpu_amdkfd_gpuvm_init_mem_limits(void);  void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,  				struct amdgpu_vm *vm); -void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo); +void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo);  void amdgpu_amdkfd_reserve_system_mem(uint64_t size);  #else  static inline @@ -312,7 +312,7 @@ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,  }  static inline -void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo) +void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)  {  }  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 0e9cfe99ae9e..71acd577803e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -207,7 +207,7 @@ static void unreserve_mem_limit(struct amdgpu_device *adev,  	spin_unlock(&kfd_mem_limit.mem_limit_lock);  } -void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo) +void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);  	u32 domain = bo->preferred_domains; @@ -219,6 +219,8 @@ void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo)  	}  	unreserve_mem_limit(adev, amdgpu_bo_size(bo), domain, sg); + +	kfree(bo->kfd_bo);  } @@ -734,14 +736,19 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,  		}  		/* Add BO to VM internal data structures */ +		ret = amdgpu_bo_reserve(bo[i], false); +		if (ret) { +			pr_debug("Unable to reserve BO during memory attach"); +			goto unwind; +		}  		attachment[i]->bo_va = amdgpu_vm_bo_add(adev, vm, bo[i]); +		amdgpu_bo_unreserve(bo[i]);  		if (unlikely(!attachment[i]->bo_va)) {  			ret = -ENOMEM;  			pr_err("Failed to add BO object to VM. ret == %d\n",  			       ret);  			goto unwind;  		} -  		attachment[i]->va = va;  		attachment[i]->pte_flags = get_pte_flags(adev, mem);  		attachment[i]->adev = adev; @@ -757,7 +764,9 @@ unwind:  		if (!attachment[i])  			continue;  		if (attachment[i]->bo_va) { +			amdgpu_bo_reserve(bo[i], true);  			amdgpu_vm_bo_rmv(adev, attachment[i]->bo_va); +			amdgpu_bo_unreserve(bo[i]);  			list_del(&attachment[i]->list);  		}  		if (bo[i]) @@ -1568,12 +1577,12 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  	pr_debug("Release VA 0x%llx - 0x%llx\n", mem->va,  		mem->va + bo_size * (1 + mem->aql_queue)); -	ret = unreserve_bo_and_vms(&ctx, false, false); -  	/* Remove from VM internal data structures */  	list_for_each_entry_safe(entry, tmp, &mem->attachments, list)  		kfd_mem_detach(entry); +	ret = unreserve_bo_and_vms(&ctx, false, false); +  	/* Free the sync object */  	amdgpu_sync_free(&mem->sync); @@ -1600,9 +1609,13 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  	drm_vma_node_revoke(&mem->bo->tbo.base.vma_node, drm_priv);  	if (mem->dmabuf)  		dma_buf_put(mem->dmabuf); -	drm_gem_object_put(&mem->bo->tbo.base);  	mutex_destroy(&mem->lock); -	kfree(mem); + +	/* If this releases the last reference, it will end up calling +	 * amdgpu_amdkfd_release_notify and kfree the mem struct. That's why +	 * this needs to be the last call here. +	 */ +	drm_gem_object_put(&mem->bo->tbo.base);  	return ret;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 6e40cc1bc6dc..5625f7736e37 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2398,10 +2398,6 @@ 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: @@ -3171,11 +3167,21 @@ bool amdgpu_device_asic_has_dc_support(enum amd_asic_type asic_type)  {  	switch (asic_type) {  #if defined(CONFIG_DRM_AMD_DC) -#if defined(CONFIG_DRM_AMD_DC_SI)  	case CHIP_TAHITI:  	case CHIP_PITCAIRN:  	case CHIP_VERDE:  	case CHIP_OLAND: +		/* +		 * We have systems in the wild with these ASICs that require +		 * LVDS and VGA support which is not supported with DC. +		 * +		 * Fallback to the non-DC driver here by default so as not to +		 * cause regressions. +		 */ +#if defined(CONFIG_DRM_AMD_DC_SI) +		return amdgpu_dc > 0; +#else +		return false;  #endif  	case CHIP_BONAIRE:  	case CHIP_KAVERI: @@ -4287,8 +4293,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,  	if (r)  		return r; -	amdgpu_amdkfd_pre_reset(adev); -  	/* Resume IP prior to SMC */  	r = amdgpu_device_ip_reinit_early_sriov(adev);  	if (r) @@ -4850,6 +4854,9 @@ static void amdgpu_device_recheck_guilty_jobs(  		/* clear job's guilty and depend the folowing step to decide the real one */  		drm_sched_reset_karma(s_job); +		/* for the real bad job, it will be resubmitted twice, adding a dma_fence_get +		 * to make sure fence is balanced */ +		dma_fence_get(s_job->s_fence->parent);  		drm_sched_resubmit_jobs_ext(&ring->sched, 1);  		ret = dma_fence_wait_timeout(s_job->s_fence->parent, false, ring->sched.timeout); @@ -4885,6 +4892,7 @@ retry:  		/* got the hw fence, signal finished fence */  		atomic_dec(ring->sched.score); +		dma_fence_put(s_job->s_fence->parent);  		dma_fence_get(&s_job->s_fence->finished);  		dma_fence_signal(&s_job->s_fence->finished);  		dma_fence_put(&s_job->s_fence->finished); @@ -5020,8 +5028,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  		cancel_delayed_work_sync(&tmp_adev->delayed_init_work); -		if (!amdgpu_sriov_vf(tmp_adev)) -			amdgpu_amdkfd_pre_reset(tmp_adev); +		amdgpu_amdkfd_pre_reset(tmp_adev);  		/*  		 * Mark these ASICs to be reseted as untracked first diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index d7c8d9e3c203..ff70bc233489 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -867,7 +867,8 @@ static int amdgpu_discovery_set_mm_ip_blocks(struct amdgpu_device *adev)  		case IP_VERSION(2, 0, 2):  		case IP_VERSION(2, 2, 0):  			amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block); -			amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block); +			if (!amdgpu_sriov_vf(adev)) +				amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);  			break;  		case IP_VERSION(2, 0, 3):  			break; @@ -881,6 +882,7 @@ static int amdgpu_discovery_set_mm_ip_blocks(struct amdgpu_device *adev)  			break;  		case IP_VERSION(3, 0, 0):  		case IP_VERSION(3, 0, 16): +		case IP_VERSION(3, 0, 64):  		case IP_VERSION(3, 1, 1):  		case IP_VERSION(3, 0, 2):  			amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index a573424a6e0b..a1e63ba4c54a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -60,9 +60,10 @@ static vm_fault_t amdgpu_gem_fault(struct vm_fault *vmf)  			goto unlock;  		} -		ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot, -					       TTM_BO_VM_NUM_PREFAULT, 1); -		drm_dev_exit(idx); +		 ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot, +						TTM_BO_VM_NUM_PREFAULT); + +		 drm_dev_exit(idx);  	} else {  		ret = ttm_bo_vm_dummy_page(vmf, vmf->vma->vm_page_prot);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index dfe667ea8b05..651c7abfde03 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -1423,6 +1423,8 @@ static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)  	struct drm_amdgpu_info_firmware fw_info;  	struct drm_amdgpu_query_fw query_fw;  	struct atom_context *ctx = adev->mode_info.atom_context; +	uint8_t smu_minor, smu_debug; +	uint16_t smu_major;  	int ret, i;  	static const char *ta_fw_name[TA_FW_TYPE_MAX_INDEX] = { @@ -1568,8 +1570,11 @@ static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)  	ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);  	if (ret)  		return ret; -	seq_printf(m, "SMC feature version: %u, firmware version: 0x%08x\n", -		   fw_info.feature, fw_info.ver); +	smu_major = (fw_info.ver >> 16) & 0xffff; +	smu_minor = (fw_info.ver >> 8) & 0xff; +	smu_debug = (fw_info.ver >> 0) & 0xff; +	seq_printf(m, "SMC feature version: %u, firmware version: 0x%08x (%d.%d.%d)\n", +		   fw_info.feature, fw_info.ver, smu_major, smu_minor, smu_debug);  	/* SDMA */  	query_fw.fw_type = AMDGPU_INFO_FW_SDMA; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index aeb92e5677ac..4fcfc2313b8c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -1274,7 +1274,7 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)  	abo = ttm_to_amdgpu_bo(bo);  	if (abo->kfd_bo) -		amdgpu_amdkfd_unreserve_memory_limit(abo); +		amdgpu_amdkfd_release_notify(abo);  	/* We only remove the fence if the resv has individualized. */  	WARN_ON_ONCE(bo->type == ttm_bo_type_kernel diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index 2658414c503d..4f7c70845785 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -134,6 +134,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  			adev->vcn.indirect_sram = true;  		break;  	case IP_VERSION(3, 0, 0): +	case IP_VERSION(3, 0, 64):  		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0))  			fw_name = FIRMWARE_SIENNA_CICHLID;  		else diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c index 978ac927ac11..0fad2bf854ae 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c @@ -806,9 +806,9 @@ static void amdgpu_xgmi_reset_ras_error_count(struct amdgpu_device *adev)  		for (i = 0; i < ARRAY_SIZE(xgmi23_pcs_err_status_reg_aldebaran); i++)  			pcs_clear_status(adev,  					 xgmi23_pcs_err_status_reg_aldebaran[i]); -		for (i = 0; i < ARRAY_SIZE(xgmi23_pcs_err_status_reg_aldebaran); i++) +		for (i = 0; i < ARRAY_SIZE(xgmi3x16_pcs_err_status_reg_aldebaran); i++)  			pcs_clear_status(adev, -					 xgmi23_pcs_err_status_reg_aldebaran[i]); +					 xgmi3x16_pcs_err_status_reg_aldebaran[i]);  		for (i = 0; i < ARRAY_SIZE(walf_pcs_err_status_reg_aldebaran); i++)  			pcs_clear_status(adev,  					 walf_pcs_err_status_reg_aldebaran[i]); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index 90a834dc4008..e7dfeb466a0e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -8249,6 +8249,9 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  static void gfx_v10_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  {  	u32 reg, data; + +	amdgpu_gfx_off_ctrl(adev, false); +  	/* not for *_SOC15 */  	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL);  	if (amdgpu_sriov_is_pp_one_vf(adev)) @@ -8263,6 +8266,8 @@ static void gfx_v10_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data);  	else  		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data); + +	amdgpu_gfx_off_ctrl(adev, true);  }  static bool gfx_v10_0_check_rlcg_range(struct amdgpu_device *adev, @@ -8316,11 +8321,8 @@ static void gfx_v10_cntl_power_gating(struct amdgpu_device *adev, bool enable)  	if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG)) {  		switch (adev->ip_versions[GC_HWIP][0]) {  		case IP_VERSION(10, 3, 1): -			data = 0x4E20 & RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG_MASK_Vangogh; -			WREG32_SOC15(GC, 0, mmRLC_PG_DELAY_3, data); -			break;  		case IP_VERSION(10, 3, 3): -			data = 0x1388 & RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG_MASK_Vangogh; +			data = 0x4E20 & RLC_PG_DELAY_3__CGCG_ACTIVE_BEFORE_CGPG_MASK_Vangogh;  			WREG32_SOC15(GC, 0, mmRLC_PG_DELAY_3, data);  			break;  		default: diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 37b4a3db6360..d17a6f399347 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -3575,12 +3575,16 @@ static void gfx_v7_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  {  	u32 data; +	amdgpu_gfx_off_ctrl(adev, false); +  	data = RREG32(mmRLC_SPM_VMID);  	data &= ~RLC_SPM_VMID__RLC_SPM_VMID_MASK;  	data |= (vmid & RLC_SPM_VMID__RLC_SPM_VMID_MASK) << RLC_SPM_VMID__RLC_SPM_VMID__SHIFT;  	WREG32(mmRLC_SPM_VMID, data); + +	amdgpu_gfx_off_ctrl(adev, true);  }  static void gfx_v7_0_enable_cgcg(struct amdgpu_device *adev, bool enable) diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index e0302c23e9a7..5f112efda634 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -5624,6 +5624,8 @@ static void gfx_v8_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  {  	u32 data; +	amdgpu_gfx_off_ctrl(adev, false); +  	if (amdgpu_sriov_is_pp_one_vf(adev))  		data = RREG32_NO_KIQ(mmRLC_SPM_VMID);  	else @@ -5636,6 +5638,8 @@ static void gfx_v8_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  		WREG32_NO_KIQ(mmRLC_SPM_VMID, data);  	else  		WREG32(mmRLC_SPM_VMID, data); + +	amdgpu_gfx_off_ctrl(adev, true);  }  static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 7f944bb11298..b4b80f27b894 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -2462,7 +2462,9 @@ static int gfx_v9_0_sw_fini(void *handle)  	amdgpu_gfx_kiq_fini(adev);  	gfx_v9_0_mec_fini(adev); -	amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj); +	amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, +				&adev->gfx.rlc.clear_state_gpu_addr, +				(void **)&adev->gfx.rlc.cs_ptr);  	if (adev->flags & AMD_IS_APU) {  		amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj,  				&adev->gfx.rlc.cp_table_gpu_addr, @@ -5102,6 +5104,8 @@ static void gfx_v9_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  {  	u32 reg, data; +	amdgpu_gfx_off_ctrl(adev, false); +  	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL);  	if (amdgpu_sriov_is_pp_one_vf(adev))  		data = RREG32_NO_KIQ(reg); @@ -5115,6 +5119,8 @@ static void gfx_v9_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data);  	else  		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data); + +	amdgpu_gfx_off_ctrl(adev, true);  }  static bool gfx_v9_0_check_rlcg_range(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index bda1542ef1dd..480e41847d7c 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c @@ -348,6 +348,10 @@ static void gfxhub_v1_0_gart_disable(struct amdgpu_device *adev)  		WREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT0_CNTL,  				    i * hub->ctx_distance, 0); +	if (amdgpu_sriov_vf(adev)) +		/* Avoid write to GMC registers */ +		return; +  	/* Setup TLB control */  	tmp = RREG32_SOC15(GC, 0, mmMC_VM_MX_L1_TLB_CNTL);  	tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, 0); diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c index 497b86c376c6..90f0aefbdb39 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c @@ -54,15 +54,17 @@ int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)  		seg_size = REG_GET_FIELD(  			RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_SIZE_ALDE),  			MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24; +		max_region = +			REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL_ALDE, PF_MAX_REGION);  	} else {  		xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_CNTL);  		seg_size = REG_GET_FIELD(  			RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_SIZE),  			MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24; +		max_region = +			REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_MAX_REGION);  	} -	max_region = -		REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_MAX_REGION);  	switch (adev->asic_type) { @@ -89,9 +91,15 @@ int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)  		if (adev->gmc.xgmi.num_physical_nodes > max_num_physical_nodes)  			return -EINVAL; -		adev->gmc.xgmi.physical_node_id = -		REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, -			      PF_LFB_REGION); +		if (adev->asic_type == CHIP_ALDEBARAN) { +			adev->gmc.xgmi.physical_node_id = +				REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL_ALDE, +						PF_LFB_REGION); +		} else { +			adev->gmc.xgmi.physical_node_id = +				REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, +						PF_LFB_REGION); +		}  		if (adev->gmc.xgmi.physical_node_id > max_physical_node_id)  			return -EINVAL; diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index febc903adf58..59eafa31c626 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -182,6 +182,7 @@ static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,  {  	switch (adev->ip_versions[UVD_HWIP][0]) {  	case IP_VERSION(3, 0, 0): +	case IP_VERSION(3, 0, 64):  		if (amdgpu_sriov_vf(adev)) {  			if (encode)  				*codecs = &sriov_sc_video_codecs_encode; diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index d5d023a24269..2d558c2f417d 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c @@ -534,6 +534,19 @@ static int uvd_v6_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	cancel_delayed_work_sync(&adev->uvd.idle_work); + +	if (RREG32(mmUVD_STATUS) != 0) +		uvd_v6_0_stop(adev); + +	return 0; +} + +static int uvd_v6_0_suspend(void *handle) +{ +	int r; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +  	/*  	 * Proper cleanups before halting the HW engine:  	 *   - cancel the delayed idle work @@ -558,17 +571,6 @@ static int uvd_v6_0_hw_fini(void *handle)  						       AMD_CG_STATE_GATE);  	} -	if (RREG32(mmUVD_STATUS) != 0) -		uvd_v6_0_stop(adev); - -	return 0; -} - -static int uvd_v6_0_suspend(void *handle) -{ -	int r; -	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -  	r = uvd_v6_0_hw_fini(adev);  	if (r)  		return r;  |