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 <[email protected]>
> Acked-by: Solomon Chiu <[email protected]>
> Signed-off-by: Stylon Wang <[email protected]>

Acked-by: Harry Wentland <[email protected]>

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);
>  

Reply via email to