Received: by 2002:a17:90b:8d0:0:0:0:0 with SMTP id ds16csp4884450pjb; Mon, 27 Jul 2020 07:33:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwL0sUDQLecUnF3U0me/APzsPt48MtHHx0mbaS1gK+gnQwiLfQnZn202T1t1kZo0HLE0CuQ X-Received: by 2002:a17:907:4240:: with SMTP id oi24mr20986288ejb.23.1595860435969; Mon, 27 Jul 2020 07:33:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595860435; cv=none; d=google.com; s=arc-20160816; b=B9qBFVZKezSkH/vMJ7y2Q06aXG3q+bz0nLTg+e2rcoVg9Mxxl7MNCai7msti7jn19/ 9LwKDbtviZwtU3jj+Z42R6OVgWDhDYAz/Lqkc0DKEf8nZnV0mr4flw0qA6Ww9o4aBhP9 /9mZSyQQY4MXN6SP0vKQnp9WA+4mE9c2k7/FM4iDiDkvnV7q+igPwTkpPMseHKL/tzdS Fg24o2RLiAtUFWsBPxfaOQygMsFDZu1L0Se1UcICG1OjyL9kh74rGfqmXF/99IA8DVMn mUD34k3Sc+7aMq3Sg6WYPE5j3n1PehpGE0gl/35PFeRBn7LNirmFuA3aSc6g0zLpIVrj il6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=RDdUhIH111GsHRpeP3NqyoVgpdwlAEDt2bYaGzuPZic=; b=WnpvecgReW77I25NESEKlj40dq9QJcfO1tfto6CA+tGCQh6rMnEtTSfevrDqKCXttF D0MKzKmbX1OjZkn7VwSC4eK5jjMUHo3KhEvy9X2BfjYPYTVIZ0jY/kQ6r7y5R37qSuqt 4uQuovI9sNnyyWDA2mLBK4sgCgb+awj16LqnotTNkBPD+ZXWNATDJ2KgoHRXUKMeNqH4 +jQtwhMw2YNONyfMmM3GOB6/gLVvI3XTxpzHlXI9k8vop2+C4f2ftFKRO/BRUcXxj81u fubSlikZZz0npZBfgmq+d2lZt3xOeeV3xKq398ZffwH1Yx2dgftrLteq9pAOfEKvT5k+ IO3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="qEubt/CG"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i4si4156619ejz.318.2020.07.27.07.33.33; Mon, 27 Jul 2020 07:33:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="qEubt/CG"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731353AbgG0OTH (ORCPT + 99 others); Mon, 27 Jul 2020 10:19:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:46922 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731349AbgG0OTF (ORCPT ); Mon, 27 Jul 2020 10:19:05 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D59E121744; Mon, 27 Jul 2020 14:19:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1595859545; bh=LWaLMwzvuoFyZldcrj7VKEFScyM7rT9jYz4eGj0RDXg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qEubt/CGchLPGFMvZJ0tTdnNO74LiUxpw68Yjy9wTrLLlHGAfFEuAsezZoSlLmJnO eWR71T99GfBWfED+TgTLTbqKrwHHeN//HjVS9uw8xIKhJ7X39HwCS620YokRyVDrNS bXbb1q6eyieS1C0YWG7ZrAuJIBb4ujohw1HkNhb4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ranjani Sridharan , Pierre-Louis Bossart , Kai Vehmanen , Takashi Iwai , Sasha Levin Subject: [PATCH 5.7 012/179] ALSA: hda/hdmi: fix failures at PCM open on Intel ICL and later Date: Mon, 27 Jul 2020 16:03:07 +0200 Message-Id: <20200727134933.275357681@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200727134932.659499757@linuxfoundation.org> References: <20200727134932.659499757@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kai Vehmanen [ Upstream commit 56275036d8185f92eceac7479d48b858ee3dab84 ] When HDMI PCM devices are opened in a specific order, with at least one HDMI/DP receiver connected, ALSA PCM open fails to -EBUSY on the connected monitor, on recent Intel platforms (ICL/JSL and newer). While this is not a typical sequence, at least Pulseaudio does this every time when it is started, to discover the available PCMs. The rootcause is an invalid assumption in hdmi_add_pin(), where the total number of converters is assumed to be known at the time the function is called. On older Intel platforms this held true, but after ICL/JSL, the order how pins and converters are in the subnode list as returned by snd_hda_get_sub_nodes(), was changed. As a result, information for some converters was not stored to per_pin->mux_nids. And this means some pins cannot be connected to all converters, and application instead gets -EBUSY instead at open. The assumption that converters are always before pins in the subnode list, is not really a valid one. Fix the problem in hdmi_parse_codec() by introducing separate loops for discovering converters and pins. BugLink: https://github.com/thesofproject/linux/issues/1978 BugLink: https://github.com/thesofproject/linux/issues/2216 BugLink: https://github.com/thesofproject/linux/issues/2217 Reviewed-by: Ranjani Sridharan Reviewed-by: Pierre-Louis Bossart Signed-off-by: Kai Vehmanen Link: https://lore.kernel.org/r/20200703153818.2808592-1-kai.vehmanen@linux.intel.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/patch_hdmi.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 137d655fed8f8..e821c9df81070 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -1804,33 +1804,43 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid) static int hdmi_parse_codec(struct hda_codec *codec) { - hda_nid_t nid; + hda_nid_t start_nid; + unsigned int caps; int i, nodes; - nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &nid); - if (!nid || nodes < 0) { + nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid); + if (!start_nid || nodes < 0) { codec_warn(codec, "HDMI: failed to get afg sub nodes\n"); return -EINVAL; } - for (i = 0; i < nodes; i++, nid++) { - unsigned int caps; - unsigned int type; + /* + * hdmi_add_pin() assumes total amount of converters to + * be known, so first discover all converters + */ + for (i = 0; i < nodes; i++) { + hda_nid_t nid = start_nid + i; caps = get_wcaps(codec, nid); - type = get_wcaps_type(caps); if (!(caps & AC_WCAP_DIGITAL)) continue; - switch (type) { - case AC_WID_AUD_OUT: + if (get_wcaps_type(caps) == AC_WID_AUD_OUT) hdmi_add_cvt(codec, nid); - break; - case AC_WID_PIN: + } + + /* discover audio pins */ + for (i = 0; i < nodes; i++) { + hda_nid_t nid = start_nid + i; + + caps = get_wcaps(codec, nid); + + if (!(caps & AC_WCAP_DIGITAL)) + continue; + + if (get_wcaps_type(caps) == AC_WID_PIN) hdmi_add_pin(codec, nid); - break; - } } return 0; -- 2.25.1