[alsa-devel] [PATCH v3] ALSA: hda: hdmi - fix regression in connect list handling

Nikhil Mahale nmahale at nvidia.com
Thu Nov 28 05:11:02 CET 2019


Sorry for this regression,

This idea to copy the values directly from spec->cvt_nids here without the
override hack as we have now, seems good to me.

Thanks,
Nikhil mahale

On 11/27/19 9:42 PM, Kai Vehmanen wrote:
> Fix regression in how intel_haswell_fixup_connect_list()
> results are used in hda_read_pin_conn(). Use of
> snd_hda_get_raw_connections() in hda_read_pin_conn() bypasses
> the cache and thus also bypasses the overridden pin connection
> list. On platforms that require the connection list fixup,
> mux list will be empty and HDMI playback will fail to -EBUSY
> at open.
> 
> Fix the regression in hda_read_pinn_conn(). Simplify code
> as suggested by Takashi Iwai to remove old
> intel_haswell_fixup_connect_list() and copy the cvt_nid list
> directly and not use snd_hda_override_conn_list() at all.
> 
> Fixes: 9c32fea83692 ("ALSA: hda - Add DP-MST support for non-acomp codecs")
> BugLink: https://github.com/thesofproject/linux/issues/1537
> Cc: Nikhil Mahale <nmahale at nvidia.com>
> Signed-off-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> ---
>  sound/pci/hda/patch_hdmi.c | 38 ++++++++++++--------------------------
>  1 file changed, 12 insertions(+), 26 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
> index 55d20e40a195..373ca99b7a2f 100644
> --- a/sound/pci/hda/patch_hdmi.c
> +++ b/sound/pci/hda/patch_hdmi.c
> @@ -1302,6 +1302,7 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
>  	struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
>  	hda_nid_t pin_nid = per_pin->pin_nid;
>  	int dev_id = per_pin->dev_id;
> +	int conns;
>  
>  	if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) {
>  		codec_warn(codec,
> @@ -1312,10 +1313,18 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
>  
>  	snd_hda_set_dev_select(codec, pin_nid, dev_id);
>  
> +	if (spec->intel_hsw_fixup) {
> +		conns = spec->num_cvts;
> +		memcpy(per_pin->mux_nids, spec->cvt_nids,
> +		       sizeof(hda_nid_t) * conns);
> +	} else {
> +		conns = snd_hda_get_raw_connections(codec, pin_nid,
> +						    per_pin->mux_nids,
> +						    HDA_MAX_CONNECTIONS);
> +	}
> +
>  	/* all the device entries on the same pin have the same conn list */
> -	per_pin->num_mux_nids =
> -		snd_hda_get_raw_connections(codec, pin_nid, per_pin->mux_nids,
> -					    HDA_MAX_CONNECTIONS);
> +	per_pin->num_mux_nids = conns;
>  
>  	return 0;
>  }
> @@ -1713,9 +1722,6 @@ static void hdmi_repoll_eld(struct work_struct *work)
>  	mutex_unlock(&spec->pcm_lock);
>  }
>  
> -static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
> -					     hda_nid_t nid);
> -
>  static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
>  {
>  	struct hdmi_spec *spec = codec->spec;
> @@ -1790,8 +1796,6 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
>  		per_pin->dev_id = i;
>  		per_pin->non_pcm = false;
>  		snd_hda_set_dev_select(codec, pin_nid, i);
> -		if (spec->intel_hsw_fixup)
> -			intel_haswell_fixup_connect_list(codec, pin_nid);
>  		err = hdmi_read_pin_conn(codec, pin_idx);
>  		if (err < 0)
>  			return err;
> @@ -2603,24 +2607,6 @@ static void generic_acomp_init(struct hda_codec *codec,
>   * Intel codec parsers and helpers
>   */
>  
> -static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
> -					     hda_nid_t nid)
> -{
> -	struct hdmi_spec *spec = codec->spec;
> -	hda_nid_t conns[4];
> -	int nconns;
> -
> -	nconns = snd_hda_get_raw_connections(codec, nid, conns,
> -					     ARRAY_SIZE(conns));
> -	if (nconns == spec->num_cvts &&
> -	    !memcmp(conns, spec->cvt_nids, spec->num_cvts * sizeof(hda_nid_t)))
> -		return;
> -
> -	/* override pins connection list */
> -	codec_dbg(codec, "hdmi: haswell: override pin connection 0x%x\n", nid);
> -	snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids);
> -}
> -
>  #define INTEL_GET_VENDOR_VERB	0xf81
>  #define INTEL_SET_VENDOR_VERB	0x781
>  #define INTEL_EN_DP12		0x02	/* enable DP 1.2 features */
> 


More information about the Alsa-devel mailing list