[PATCH] drm/amd/display: Fix new dmub notification enabling in DM

Harry Wentland harry.wentland at amd.com
Thu Jul 7 12:23:36 UTC 2022


On 2022-07-07 04:23, Stylon Wang wrote:
> [Why]
> Changes from "Fix for dmub outbox notification enable" need to land
> in DM or DMUB outbox notification would be disabled.
> 
> [How]
> Enable outbox notification only after interrupt are enabled and IRQ
> handlers registered. Any pending notification will be sent by DMUB
> once outbox notification is enabled.
> 
> Fixes: ed7208706448 (“drm/amd/display: Fix for dmub outbox notification enable”)
> Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas at amd.com>
> Acked-by: Solomon Chiu <solomon.chiu at amd.com>
> Signed-off-by: Stylon Wang <stylon.wang at amd.com>

Acked-by: Harry Wentland <harry.wentland at amd.com>

Harry

> ---
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 +++++++++++++------
>  1 file changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index eb5efb4aa2ba..de1c139ae279 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -1617,7 +1617,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
>  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
>  	adev->dm.crc_rd_wrk = amdgpu_dm_crtc_secure_display_create_work();
>  #endif
> -	if (dc_enable_dmub_notifications(adev->dm.dc)) {
> +	if (dc_is_dmub_outbox_supported(adev->dm.dc)) {
>  		init_completion(&adev->dm.dmub_aux_transfer_done);
>  		adev->dm.dmub_notify = kzalloc(sizeof(struct dmub_notification), GFP_KERNEL);
>  		if (!adev->dm.dmub_notify) {
> @@ -1653,6 +1653,13 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
>  		goto error;
>  	}
>  
> +	/* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
> +	 * It is expected that DMUB will resend any pending notifications at this point, for
> +	 * example HPD from DPIA.
> +	 */
> +	if (dc_is_dmub_outbox_supported(adev->dm.dc))
> +		dc_enable_dmub_outbox(adev->dm.dc);
> +
>  	/* create fake encoders for MST */
>  	dm_dp_create_fake_mst_encoders(adev);
>  
> @@ -2625,9 +2632,6 @@ static int dm_resume(void *handle)
>  		 */
>  		link_enc_cfg_copy(adev->dm.dc->current_state, dc_state);
>  
> -		if (dc_enable_dmub_notifications(adev->dm.dc))
> -			amdgpu_dm_outbox_init(adev);
> -
>  		r = dm_dmub_hw_init(adev);
>  		if (r)
>  			DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
> @@ -2645,6 +2649,11 @@ static int dm_resume(void *handle)
>  			}
>  		}
>  
> +		if (dc_is_dmub_outbox_supported(adev->dm.dc)) {
> +			amdgpu_dm_outbox_init(adev);
> +			dc_enable_dmub_outbox(adev->dm.dc);
> +		}
> +
>  		WARN_ON(!dc_commit_state(dm->dc, dc_state));
>  
>  		dm_gpureset_commit_state(dm->cached_dc_state, dm);
> @@ -2666,13 +2675,15 @@ static int dm_resume(void *handle)
>  	/* TODO: Remove dc_state->dccg, use dc->dccg directly. */
>  	dc_resource_state_construct(dm->dc, dm_state->context);
>  
> -	/* Re-enable outbox interrupts for DPIA. */
> -	if (dc_enable_dmub_notifications(adev->dm.dc))
> -		amdgpu_dm_outbox_init(adev);
> -
>  	/* Before powering on DC we need to re-initialize DMUB. */
>  	dm_dmub_hw_resume(adev);
>  
> +	/* Re-enable outbox interrupts for DPIA. */
> +	if (dc_is_dmub_outbox_supported(adev->dm.dc)) {
> +		amdgpu_dm_outbox_init(adev);
> +		dc_enable_dmub_outbox(adev->dm.dc);
> +	}
> +
>  	/* power on hardware */
>  	dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
>  



More information about the amd-gfx mailing list