Commit b6fd7747 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Takashi Iwai

ALSA: hda/hdmi: Disable silent stream on GLK

The silent stream stuff recurses back into i915 audio
component .get_power() from the .pin_eld_notify() hook.
On GLK this will deadlock as i915 may already be holding
the relevant modeset locks during .pin_eld_notify() and
the GLK audio vs. CDCLK workaround will try to grab the
same locks from .get_power().

Until someone comes up with a better fix just disable the
silent stream support on GLK.

Cc: stable@vger.kernel.org
Cc: Harsha Priya <harshapriya.n@intel.com>
Cc: Emmanuel Jillela <emmanuel.jillela@intel.com>
Cc: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Cc: Takashi Iwai <tiwai@suse.de>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2623
Fixes: 951894cf ("ALSA: hda/hdmi: Add Intel silent stream support")
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211222145350.24342-1-ville.syrjala@linux.intel.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 065807d7
...@@ -2947,7 +2947,8 @@ static int parse_intel_hdmi(struct hda_codec *codec) ...@@ -2947,7 +2947,8 @@ static int parse_intel_hdmi(struct hda_codec *codec)
/* Intel Haswell and onwards; audio component with eld notifier */ /* Intel Haswell and onwards; audio component with eld notifier */
static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid, static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
const int *port_map, int port_num, int dev_num) const int *port_map, int port_num, int dev_num,
bool send_silent_stream)
{ {
struct hdmi_spec *spec; struct hdmi_spec *spec;
int err; int err;
...@@ -2980,7 +2981,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid, ...@@ -2980,7 +2981,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
* Enable silent stream feature, if it is enabled via * Enable silent stream feature, if it is enabled via
* module param or Kconfig option * module param or Kconfig option
*/ */
if (enable_silent_stream) if (send_silent_stream)
spec->send_silent_stream = true; spec->send_silent_stream = true;
return parse_intel_hdmi(codec); return parse_intel_hdmi(codec);
...@@ -2988,12 +2989,18 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid, ...@@ -2988,12 +2989,18 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
static int patch_i915_hsw_hdmi(struct hda_codec *codec) static int patch_i915_hsw_hdmi(struct hda_codec *codec)
{ {
return intel_hsw_common_init(codec, 0x08, NULL, 0, 3); return intel_hsw_common_init(codec, 0x08, NULL, 0, 3,
enable_silent_stream);
} }
static int patch_i915_glk_hdmi(struct hda_codec *codec) static int patch_i915_glk_hdmi(struct hda_codec *codec)
{ {
return intel_hsw_common_init(codec, 0x0b, NULL, 0, 3); /*
* Silent stream calls audio component .get_power() from
* .pin_eld_notify(). On GLK this will deadlock in i915 due
* to the audio vs. CDCLK workaround.
*/
return intel_hsw_common_init(codec, 0x0b, NULL, 0, 3, false);
} }
static int patch_i915_icl_hdmi(struct hda_codec *codec) static int patch_i915_icl_hdmi(struct hda_codec *codec)
...@@ -3004,7 +3011,8 @@ static int patch_i915_icl_hdmi(struct hda_codec *codec) ...@@ -3004,7 +3011,8 @@ static int patch_i915_icl_hdmi(struct hda_codec *codec)
*/ */
static const int map[] = {0x0, 0x4, 0x6, 0x8, 0xa, 0xb}; static const int map[] = {0x0, 0x4, 0x6, 0x8, 0xa, 0xb};
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 3); return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 3,
enable_silent_stream);
} }
static int patch_i915_tgl_hdmi(struct hda_codec *codec) static int patch_i915_tgl_hdmi(struct hda_codec *codec)
...@@ -3016,7 +3024,8 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec) ...@@ -3016,7 +3024,8 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec)
static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}; static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
int ret; int ret;
ret = intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 4); ret = intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map), 4,
enable_silent_stream);
if (!ret) { if (!ret) {
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment