diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 22 | 
9 files changed, 41 insertions, 28 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 3d8a48f46b01..6dce81a061ab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1078,6 +1078,8 @@ struct amdgpu_device {  	bool				in_s3;  	bool				in_s4;  	bool				in_s0ix; +	/* indicate amdgpu suspension status */ +	bool				suspend_complete;  	enum pp_mp1_state               mp1_state;  	struct amdgpu_doorbell_index doorbell_index; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 971acf01bea6..211501ea9169 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -2476,6 +2476,7 @@ static int amdgpu_pmops_suspend(struct device *dev)  	struct drm_device *drm_dev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = drm_to_adev(drm_dev); +	adev->suspend_complete = false;  	if (amdgpu_acpi_is_s0ix_active(adev))  		adev->in_s0ix = true;  	else if (amdgpu_acpi_is_s3_active(adev)) @@ -2490,6 +2491,7 @@ static int amdgpu_pmops_suspend_noirq(struct device *dev)  	struct drm_device *drm_dev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = drm_to_adev(drm_dev); +	adev->suspend_complete = true;  	if (amdgpu_acpi_should_gpu_reset(adev))  		return amdgpu_asic_reset(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c index 468a67b302d4..ca5c86e5f7cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c @@ -362,7 +362,7 @@ static ssize_t ta_if_invoke_debugfs_write(struct file *fp, const char *buf, size  		}  	} -	if (copy_to_user((char *)buf, context->mem_context.shared_buf, shared_buf_len)) +	if (copy_to_user((char *)&buf[copy_pos], context->mem_context.shared_buf, shared_buf_len))  		ret = -EFAULT;  err_free_shared_buf: diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 69c500910746..3bc6943365a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -3034,6 +3034,14 @@ static int gfx_v9_0_cp_gfx_start(struct amdgpu_device *adev)  	gfx_v9_0_cp_gfx_enable(adev, true); +	/* Now only limit the quirk on the APU gfx9 series and already +	 * confirmed that the APU gfx10/gfx11 needn't such update. +	 */ +	if (adev->flags & AMD_IS_APU && +			adev->in_s3 && !adev->suspend_complete) { +		DRM_INFO(" Will skip the CSB packet resubmit\n"); +		return 0; +	}  	r = amdgpu_ring_alloc(ring, gfx_v9_0_get_csb_size(adev) + 4 + 3);  	if (r) {  		DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 40a00ea0009f..e67a62db9e12 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -1947,14 +1947,6 @@ static int gmc_v9_0_init_mem_ranges(struct amdgpu_device *adev)  static void gmc_v9_4_3_init_vram_info(struct amdgpu_device *adev)  { -	static const u32 regBIF_BIOS_SCRATCH_4 = 0x50; -	u32 vram_info; - -	/* Only for dGPU, vendor informaton is reliable */ -	if (!amdgpu_sriov_vf(adev) && !(adev->flags & AMD_IS_APU)) { -		vram_info = RREG32(regBIF_BIOS_SCRATCH_4); -		adev->gmc.vram_vendor = vram_info & 0xF; -	}  	adev->gmc.vram_type = AMDGPU_VRAM_TYPE_HBM;  	adev->gmc.vram_width = 128 * 64;  } diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c index bc38b90f8cf8..88ea58d5c4ab 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c @@ -674,14 +674,6 @@ static int jpeg_v4_0_set_powergating_state(void *handle,  	return ret;  } -static int jpeg_v4_0_set_interrupt_state(struct amdgpu_device *adev, -					struct amdgpu_irq_src *source, -					unsigned type, -					enum amdgpu_interrupt_state state) -{ -	return 0; -} -  static int jpeg_v4_0_set_ras_interrupt_state(struct amdgpu_device *adev,  					struct amdgpu_irq_src *source,  					unsigned int type, @@ -765,7 +757,6 @@ static void jpeg_v4_0_set_dec_ring_funcs(struct amdgpu_device *adev)  }  static const struct amdgpu_irq_src_funcs jpeg_v4_0_irq_funcs = { -	.set = jpeg_v4_0_set_interrupt_state,  	.process = jpeg_v4_0_process_interrupt,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c index 6ede85b28cc8..78b74daf4eeb 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c @@ -181,7 +181,6 @@ static int jpeg_v4_0_5_hw_fini(void *handle)  			RREG32_SOC15(JPEG, 0, regUVD_JRBC_STATUS))  			jpeg_v4_0_5_set_powergating_state(adev, AMD_PG_STATE_GATE);  	} -	amdgpu_irq_put(adev, &adev->jpeg.inst->irq, 0);  	return 0;  } @@ -516,14 +515,6 @@ static int jpeg_v4_0_5_set_powergating_state(void *handle,  	return ret;  } -static int jpeg_v4_0_5_set_interrupt_state(struct amdgpu_device *adev, -					struct amdgpu_irq_src *source, -					unsigned type, -					enum amdgpu_interrupt_state state) -{ -	return 0; -} -  static int jpeg_v4_0_5_process_interrupt(struct amdgpu_device *adev,  				      struct amdgpu_irq_src *source,  				      struct amdgpu_iv_entry *entry) @@ -603,7 +594,6 @@ static void jpeg_v4_0_5_set_dec_ring_funcs(struct amdgpu_device *adev)  }  static const struct amdgpu_irq_src_funcs jpeg_v4_0_5_irq_funcs = { -	.set = jpeg_v4_0_5_set_interrupt_state,  	.process = jpeg_v4_0_5_process_interrupt,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c index e90f33780803..b4723d68eab0 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c @@ -431,6 +431,12 @@ static void nbio_v7_9_init_registers(struct amdgpu_device *adev)  	u32 inst_mask;  	int i; +	if (amdgpu_sriov_vf(adev)) +		adev->rmmio_remap.reg_offset = +			SOC15_REG_OFFSET( +				NBIO, 0, +				regBIF_BX_DEV0_EPF0_VF0_HDP_MEM_COHERENCY_FLUSH_CNTL) +			<< 2;  	WREG32_SOC15(NBIO, 0, regXCC_DOORBELL_FENCE,  		0xff & ~(adev->gfx.xcc_mask)); diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 15033efec2ba..c64c01e2944a 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -1298,10 +1298,32 @@ static int soc15_common_suspend(void *handle)  	return soc15_common_hw_fini(adev);  } +static bool soc15_need_reset_on_resume(struct amdgpu_device *adev) +{ +	u32 sol_reg; + +	sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81); + +	/* Will reset for the following suspend abort cases. +	 * 1) Only reset limit on APU side, dGPU hasn't checked yet. +	 * 2) S3 suspend abort and TOS already launched. +	 */ +	if (adev->flags & AMD_IS_APU && adev->in_s3 && +			!adev->suspend_complete && +			sol_reg) +		return true; + +	return false; +} +  static int soc15_common_resume(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (soc15_need_reset_on_resume(adev)) { +		dev_info(adev->dev, "S3 suspend abort case, let's reset ASIC.\n"); +		soc15_asic_reset(adev); +	}  	return soc15_common_hw_init(adev);  }  | 
