[PATCH] drm/amdgpu: Fixed an issue where audio did not turn off properly after unplugging HDMI
Alex Deucher
alexdeucher at gmail.com
Mon Aug 18 15:39:23 UTC 2025
On Fri, Aug 15, 2025 at 11:23 AM <2564278112 at qq.com> wrote:
>
> From: Wang Jiang <jiangwang at kylinos.cn>
>
> In commit 3c021931023a ("drm/amdgpu: replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi")',
> the method for determining connector types has been modified.
> After the modification, when disconnecting the monitor, the information from the previous connection cannot be retrieved,
> because display_info.is_hdmi has been reset, resulting in the connector type returned as dvi.
> On AMD Oland and other cards, the audio driver determines whether to turn off audio based on connector type
> However, when the monitor is disconnected, the information from the previous connection cannot be obtained, resulting in the inability to turn off the audio.
> I don't understand why this is being done, I think the right thing to do is to decide whether or not to enable audio based on whether the connector has audio.
> This commit modifies the code to retrieve audio information from the connected EDID.
> Now, the decision to turn audio on/off is based on the audio information in the EDID.
>
> Signed-off-by: Wang Jiang <jiangwang at kylinos.cn>
> ---
> drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 21 ++++++++++++++++-----
This only fixes up DCE6. I would suggest one of the following to fix this:
1. Revert the changes from 3c021931023a in atombios_encoders.c
or
2. Add amdgpu_connector->is_hdmi and set it when
connector->display_info.is_hdmi is valid and use that rather than
connector->display_info.is_hdmi.
Alex
> 1 file changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> index 276c025c4c03..c56b2027d53e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> @@ -3253,17 +3253,22 @@ static void dce_v6_0_encoder_mode_set(struct drm_encoder *encoder,
> struct drm_display_mode *adjusted_mode)
> {
> struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> - int em = amdgpu_atombios_encoder_get_encoder_mode(encoder);
> -
> + struct drm_connector *connector;
> + struct amdgpu_connector *amdgpu_connector = NULL;
> amdgpu_encoder->pixel_clock = adjusted_mode->clock;
>
> /* need to call this here rather than in prepare() since we need some crtc info */
> amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
> + connector = amdgpu_get_connector_for_encoder_init(encoder);
> + amdgpu_connector = to_amdgpu_connector(connector);
> + if (!amdgpu_connector) {
> + DRM_ERROR("Couldn't find encoder's connector\n");
> + }
>
> /* set scaler clears this on some chips */
> dce_v6_0_set_interleave(encoder->crtc, mode);
>
> - if (em == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(em)) {
> + if (drm_detect_monitor_audio(amdgpu_connector_edid(connector))) {
> dce_v6_0_afmt_enable(encoder, true);
> dce_v6_0_afmt_setmode(encoder, adjusted_mode);
> }
> @@ -3322,12 +3327,18 @@ static void dce_v6_0_encoder_disable(struct drm_encoder *encoder)
> {
> struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> struct amdgpu_encoder_atom_dig *dig;
> - int em = amdgpu_atombios_encoder_get_encoder_mode(encoder);
> + struct drm_connector *connector;
> + struct amdgpu_connector *amdgpu_connector = NULL;
>
> amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
> + connector = amdgpu_get_connector_for_encoder_init(encoder);
> + amdgpu_connector = to_amdgpu_connector(connector);
> + if (!amdgpu_connector) {
> + DRM_ERROR("Couldn't find encoder's connector\n");
> + }
>
> if (amdgpu_atombios_encoder_is_digital(encoder)) {
> - if (em == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(em))
> + if (drm_detect_monitor_audio(amdgpu_connector_edid(connector)))
> dce_v6_0_afmt_enable(encoder, false);
> dig = amdgpu_encoder->enc_priv;
> dig->dig_encoder = -1;
> --
> 2.25.1
>
More information about the amd-gfx
mailing list