[PATCH] drm/amdgpu: Clear doorbell interrupt status for Sienna Cichlid

Luben Tuikov luben.tuikov at amd.com
Wed Jul 21 15:50:09 UTC 2021


Yeah, looks good.

Acked-by: Luben Tuikov <luben.tuikov at amd.com>

On 2021-07-20 11:02 p.m., Chengzhe Liu wrote:
> On Sienna Cichlid, in pass-through mode, if we unload the driver in BACO
> mode(RTPM), then the kernel would receive thousands of interrupts.
> That's because there is doorbell monitor interrupt on BIF, so KVM keeps
> injecting interrupts to the guest VM. So we should clear the doorbell
> interrupt status after BACO exit.
>
> v2: Modify coding style and commit message
>
> Signed-off-by: Chengzhe Liu <ChengZhe.Liu at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h   |  1 +
>  drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c     | 21 +++++++++++++++++++++
>  3 files changed, 26 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 37fa199be8b3..92f73d2bbfc9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -5265,6 +5265,10 @@ int amdgpu_device_baco_exit(struct drm_device *dev)
>  	    adev->nbio.funcs->enable_doorbell_interrupt)
>  		adev->nbio.funcs->enable_doorbell_interrupt(adev, true);
>  
> +	if (amdgpu_passthrough(adev) &&
> +	    adev->nbio.funcs->clear_doorbell_interrupt)
> +		adev->nbio.funcs->clear_doorbell_interrupt(adev);
> +
>  	return 0;
>  }
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
> index 45295dce5c3e..843052205bd5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
> @@ -95,6 +95,7 @@ struct amdgpu_nbio_funcs {
>  	void (*program_aspm)(struct amdgpu_device *adev);
>  	void (*apply_lc_spc_mode_wa)(struct amdgpu_device *adev);
>  	void (*apply_l1_link_width_reconfig_wa)(struct amdgpu_device *adev);
> +	void (*clear_doorbell_interrupt)(struct amdgpu_device *adev);
>  };
>  
>  struct amdgpu_nbio {
> diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c
> index 7b79eeaa88aa..b184b656b9b6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c
> +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c
> @@ -508,6 +508,26 @@ static void nbio_v2_3_apply_l1_link_width_reconfig_wa(struct amdgpu_device *adev
>  	WREG32_PCIE(smnPCIE_LC_LINK_WIDTH_CNTL, reg_data);
>  }
>  
> +static void nbio_v2_3_clear_doorbell_interrupt(struct amdgpu_device *adev)
> +{
> +	uint32_t reg, reg_data;
> +
> +	if (adev->asic_type != CHIP_SIENNA_CICHLID)
> +		return;
> +
> +	reg = RREG32_SOC15(NBIO, 0, mmBIF_RB_CNTL);
> +
> +	/* Clear Interrupt Status
> +	 */
> +	if ((reg & BIF_RB_CNTL__RB_ENABLE_MASK) == 0) {
> +		reg = RREG32_SOC15(NBIO, 0, mmBIF_DOORBELL_INT_CNTL);
> +		if (reg & BIF_DOORBELL_INT_CNTL__DOORBELL_INTERRUPT_STATUS_MASK) {
> +			reg_data = 1 << BIF_DOORBELL_INT_CNTL__DOORBELL_INTERRUPT_CLEAR__SHIFT;
> +			WREG32_SOC15(NBIO, 0, mmBIF_DOORBELL_INT_CNTL, reg_data);
> +		}
> +	}
> +}
> +
>  const struct amdgpu_nbio_funcs nbio_v2_3_funcs = {
>  	.get_hdp_flush_req_offset = nbio_v2_3_get_hdp_flush_req_offset,
>  	.get_hdp_flush_done_offset = nbio_v2_3_get_hdp_flush_done_offset,
> @@ -531,4 +551,5 @@ const struct amdgpu_nbio_funcs nbio_v2_3_funcs = {
>  	.program_aspm =  nbio_v2_3_program_aspm,
>  	.apply_lc_spc_mode_wa = nbio_v2_3_apply_lc_spc_mode_wa,
>  	.apply_l1_link_width_reconfig_wa = nbio_v2_3_apply_l1_link_width_reconfig_wa,
> +	.clear_doorbell_interrupt = nbio_v2_3_clear_doorbell_interrupt,
>  };



More information about the amd-gfx mailing list