[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