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@xxxxxxx> > Acked-by: Solomon Chiu <solomon.chiu@xxxxxxx> > Signed-off-by: Stylon Wang <stylon.wang@xxxxxxx> Acked-by: Harry Wentland <harry.wentland@xxxxxxx> 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); >