From nobody Sat Oct 4 14:13:10 2025 Received: from out162-62-58-216.mail.qq.com (out162-62-58-216.mail.qq.com [162.62.58.216]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 038A02D738C for ; Fri, 15 Aug 2025 08:40:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=162.62.58.216 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755247218; cv=none; b=gEmet9LHPVyGnQi3C6PFySRjq+YzDc/bfHSKXaZF5d+zYS11llav836V5bTfrPldqFUZnauqaeG48YDErCWRk3lzdwdrRe/QDB4lwM9auWDcgm6Q/IKTp6vp+Nd9K08b2vvWjyzK+d0+66qUI0DIcswr0VRSbeh5qDGIUSU1hFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755247218; c=relaxed/simple; bh=3jnTo9QP6GZBHWTgPi7c4x1BQz6npH0TtggpKdtFMl4=; h=Message-ID:From:To:Cc:Subject:Date:MIME-Version; b=SterILFla3MF7fzfgPhBzp5nI9uPINdAyGW5qVfvZxOHCVSdfU6RzhC1vGxbN0tOd/NfubDwhpSSvS6IeqfgWZ0sRwoXyMX1A+OFEK00ADFgmvX88tyCmVGd+MLwDuKt6s9Sq/CPXN7z5rmBYlbfEyHK3q+atPK5ZKW20XvI+po= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=qq.com; spf=pass smtp.mailfrom=qq.com; dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b=Wr1ygyEm; arc=none smtp.client-ip=162.62.58.216 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=qq.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=qq.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=qq.com header.i=@qq.com header.b="Wr1ygyEm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1755247204; bh=bHWE4AORGxV5tQB74wROjNY5YvD7d9GgkwOBcOZ8ZC4=; h=From:To:Cc:Subject:Date; b=Wr1ygyEmuIIZInWQD5xp9bMqo2/1MtQkhvhfh5JJ2uEzDpFJ7AFZ/u3cshhjFI/PD 0Mdojj+yGsuMBL7w1/s3x8ONIp97ZL73OqQbkFGJmUiBEZhi3izjUjzQk0vIxWqJpa 1/f14I2jP2XYzsLVvf4ubGKNu8kZFxMbBMiYS6qM= Received: from localhost.localdomain ([116.128.244.169]) by newxmesmtplogicsvrszb23-0.qq.com (NewEsmtp) with SMTP id 9B72EA7A; Fri, 15 Aug 2025 16:38:55 +0800 X-QQ-mid: xmsmtpt1755247135timb70iz3 Message-ID: X-QQ-XMAILINFO: Nr4sKL92GIu+vW/ICYMcGdH9uS9e6ADBfUWXi1HsqoqwfNXlNmPVV8tTT6tNHT a75U8BkZvsrfRFH7JpUHvdSfnI6+uf9NDv3Bz+MOpv94QKUBiS8+KVJPmcbuX/SXGlwDUuK5QVSV Q+R6e/Kw9ab3JAOIhzzJWuxl6VO55dvaPRWSC7G1Th0aJ03kWyftqmvqcO2fruaBCDqCz+TBtlXM PhvNMKoTr0lGgbYYNSQvPOEUPQzU3xNOTvVwAkGLF17eluRPpQdtf5IftMc1Ha+jC0HTgpVZnol3 xt2QQ0e1OLJ9kbw8P0O7ZfcsK2npv+UswTG6HGypTEFn3RRveN8pp5XMTUCR4ig1RnSsKWNuamPR i2zzCZ/wP7e9uq4Ovxz/qC0+G89y+f1XqCqQYcJ6xvWcgSIQgU1U/w6S7VZOrWKFZSVzV49hV60y WV8b50uEvoR/djJH2voqdb71t54DuEKoBE0yflNR8L7tXBf9Oc3iOZIAHIJG8VypZS/tWw8Vgw6B aEfjKpltwSXyUkiHUrX8TzFRr3hbSlN7IflwtaglL8iJaRag/N7x5o9aqYyarJRW7fStE8BkB0PB OFSBsqwKMLyQbn7CFlQYed74axx1v4hNCv7pNA48D8GAgbVgStYAiBJtbFqc7Mq01JEdR2JUQIrk o6Pn62Pn59cSpd+Gb6qJMrDP6DvXYMbWKgBQAPrGfVFMRy614Ua4lKjfs6P2dvh0jiwXce3Jmmt+ sjGyie+idrWmPWOKOfAMEUNa/ee8geljug5bIipLsRiF4FhHhYT3+X7eRn1xE4GCUFO5SsrPFJKp kK4jdPVX+uWOPCG7rEW6nOVTb67b+DVMGA2znTNSAjfxa+uPsFInujZqwjy6RWcOl6p10ZL8Htt4 Ywd6Iij/HmuiRdU072fH6wdQtQWPNzzk1XbpH7WWSeNOjCPXRwtz+PjK6u5j/Wwdkp4amDkE9fQp AzDCN/IKAhlkZLjU13W1dBdN1XIxkJVF49aogkwhg= X-QQ-XMRINFO: NyFYKkN4Ny6FSmKK/uo/jdU= From: 2564278112@qq.com To: alex.williamson@redhat.com Cc: christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch, sunil.khatri@amd.com, alexandre.f.demers@gmail.com, boyuan.zhang@amd.com, jiangwang@kylinos.cn, amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/amdgpu: Fixed an issue where audio did not turn off properly after unplugging HDMI Date: Fri, 15 Aug 2025 16:38:51 +0800 X-OQ-MSGID: <20250815083851.1417451-1-2564278112@qq.com> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wang Jiang 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 fro= m the previous connection cannot be retrieved, because display_info.is_hdmi has been reset, resulting in the connector typ= e returned as dvi. On AMD Oland and other cards, the audio driver determines whether to turn o= ff audio based on connector type However, when the monitor is disconnected, the information from the previou= s 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 ha= s audio. This commit modifies the code to retrieve audio information from the connec= ted EDID. Now, the decision to turn audio on/off is based on the audio information in= the EDID. Signed-off-by: Wang Jiang --- drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/am= dgpu/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_en= coder *encoder, struct drm_display_mode *adjusted_mode) { struct amdgpu_encoder *amdgpu_encoder =3D to_amdgpu_encoder(encoder); - int em =3D amdgpu_atombios_encoder_get_encoder_mode(encoder); - + struct drm_connector *connector; + struct amdgpu_connector *amdgpu_connector =3D NULL; amdgpu_encoder->pixel_clock =3D adjusted_mode->clock; =20 /* need to call this here rather than in prepare() since we need some crt= c info */ amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); + connector =3D amdgpu_get_connector_for_encoder_init(encoder); + amdgpu_connector =3D to_amdgpu_connector(connector); + if (!amdgpu_connector) { + DRM_ERROR("Couldn't find encoder's connector\n"); + } =20 /* set scaler clears this on some chips */ dce_v6_0_set_interleave(encoder->crtc, mode); =20 - if (em =3D=3D 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_enc= oder *encoder) { struct amdgpu_encoder *amdgpu_encoder =3D to_amdgpu_encoder(encoder); struct amdgpu_encoder_atom_dig *dig; - int em =3D amdgpu_atombios_encoder_get_encoder_mode(encoder); + struct drm_connector *connector; + struct amdgpu_connector *amdgpu_connector =3D NULL; =20 amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); + connector =3D amdgpu_get_connector_for_encoder_init(encoder); + amdgpu_connector =3D to_amdgpu_connector(connector); + if (!amdgpu_connector) { + DRM_ERROR("Couldn't find encoder's connector\n"); + } =20 if (amdgpu_atombios_encoder_is_digital(encoder)) { - if (em =3D=3D 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 =3D amdgpu_encoder->enc_priv; dig->dig_encoder =3D -1; --=20 2.25.1