alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] ALSA: hda: Fix potential bad accesses at suspend/resume
@ 2021-03-10 11:28 Takashi Iwai
  2021-03-10 11:28 ` [PATCH 1/3] ALSA: hda: Flush pending unsolicited events before suspend Takashi Iwai
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Takashi Iwai @ 2021-03-10 11:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: Abhishek Sahu

Hi,

this is a small patch series to address the bugs that triggers the
unexpected accesses during the system suspend/resume.  It happens
often with Nvidia driver and HDMI codec driver, and it may lead to the
serious CORB/RIRB errors.

Although the issues are seen mostly on DP/HDMI, a part of the problems
is rather generic to all platforms.


Takashi

===

Takashi Iwai (3):
  ALSA: hda: Flush pending unsolicited events before suspend
  ALSA: hda: Avoid spurious unsol event handling during S3/S4
  ALSA: hda/hdmi: Cancel pending works before suspend

 sound/pci/hda/hda_bind.c   |  4 ++++
 sound/pci/hda/hda_intel.c  |  2 ++
 sound/pci/hda/patch_hdmi.c | 13 +++++++++++++
 3 files changed, 19 insertions(+)

-- 
2.26.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] ALSA: hda: Flush pending unsolicited events before suspend
  2021-03-10 11:28 [PATCH 0/3] ALSA: hda: Fix potential bad accesses at suspend/resume Takashi Iwai
@ 2021-03-10 11:28 ` Takashi Iwai
  2021-03-10 11:28 ` [PATCH 2/3] ALSA: hda: Avoid spurious unsol event handling during S3/S4 Takashi Iwai
  2021-03-10 11:28 ` [PATCH 3/3] ALSA: hda/hdmi: Cancel pending works before suspend Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2021-03-10 11:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: Abhishek Sahu

The HD-audio controller driver processes the unsolicited events via
its work asynchronously, and this might be pending when the system
goes to suspend.  When a lengthy event handling like ELD byte reads is
running, this might trigger unexpected accesses among suspend/resume
procedure, typically seen with Nvidia driver that still requires the
handling via unsolicited event verbs for ELD updates.

This patch adds the flush of unsol_work to assure that pending events
are processed before going into suspend.

Buglink: https://bugzilla.suse.com/show_bug.cgi?id=1182377
Reported-and-tested-by: Abhishek Sahu <abhsahu@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/hda_intel.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 5b492c3f816c..5eea130dcf0a 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1026,6 +1026,8 @@ static int azx_prepare(struct device *dev)
 	chip = card->private_data;
 	chip->pm_prepared = 1;
 
+	flush_work(&azx_bus(chip)->unsol_work);
+
 	/* HDA controller always requires different WAKEEN for runtime suspend
 	 * and system suspend, so don't use direct-complete here.
 	 */
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] ALSA: hda: Avoid spurious unsol event handling during S3/S4
  2021-03-10 11:28 [PATCH 0/3] ALSA: hda: Fix potential bad accesses at suspend/resume Takashi Iwai
  2021-03-10 11:28 ` [PATCH 1/3] ALSA: hda: Flush pending unsolicited events before suspend Takashi Iwai
@ 2021-03-10 11:28 ` Takashi Iwai
  2021-03-10 11:28 ` [PATCH 3/3] ALSA: hda/hdmi: Cancel pending works before suspend Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2021-03-10 11:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: Abhishek Sahu

When HD-audio bus receives unsolicited events during its system
suspend/resume (S3 and S4) phase, the controller driver may still try
to process events although the codec chips are already (or yet)
powered down.  This might screw up the codec communication, resulting
in CORB/RIRB errors.  Such events should be rather skipped, as the
codec chip status such as the jack status will be fully refreshed at
the system resume time.

Since we're tracking the system suspend/resume state in codec
power.power_state field, let's add the check in the common unsol event
handler entry point to filter out such events.

BugLink: https://bugzilla.suse.com/show_bug.cgi?id=1182377
Tested-by: Abhishek Sahu <abhsahu@nvidia.com>
Cc: <stable@vger.kernel.org> # 183ab39eb0ea: ALSA: hda: Initialize power_state
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/hda_bind.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c
index 6a8564566375..17a25e453f60 100644
--- a/sound/pci/hda/hda_bind.c
+++ b/sound/pci/hda/hda_bind.c
@@ -47,6 +47,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev)
 	if (codec->bus->shutdown)
 		return;
 
+	/* ignore unsol events during system suspend/resume */
+	if (codec->core.dev.power.power_state.event != PM_EVENT_ON)
+		return;
+
 	if (codec->patch_ops.unsol_event)
 		codec->patch_ops.unsol_event(codec, ev);
 }
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] ALSA: hda/hdmi: Cancel pending works before suspend
  2021-03-10 11:28 [PATCH 0/3] ALSA: hda: Fix potential bad accesses at suspend/resume Takashi Iwai
  2021-03-10 11:28 ` [PATCH 1/3] ALSA: hda: Flush pending unsolicited events before suspend Takashi Iwai
  2021-03-10 11:28 ` [PATCH 2/3] ALSA: hda: Avoid spurious unsol event handling during S3/S4 Takashi Iwai
@ 2021-03-10 11:28 ` Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2021-03-10 11:28 UTC (permalink / raw)
  To: alsa-devel; +Cc: Abhishek Sahu

The per_pin->work might be still floating at the suspend, and this may
hit the access to the hardware at an unexpected timing.  Cancel the
work properly at the suspend callback for avoiding the buggy access.

Note that the bug doesn't trigger easily in the recent kernels since
the work is queued only when the repoll count is set, and usually it's
only at the resume callback, but it's still possible to hit in
theory.

BugLink: https://bugzilla.suse.com/show_bug.cgi?id=1182377
Reported-and-tested-by: Abhishek Sahu <abhsahu@nvidia.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/patch_hdmi.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index e6d0843ee9df..45ae845e82df 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -2480,6 +2480,18 @@ static void generic_hdmi_free(struct hda_codec *codec)
 }
 
 #ifdef CONFIG_PM
+static int generic_hdmi_suspend(struct hda_codec *codec)
+{
+	struct hdmi_spec *spec = codec->spec;
+	int pin_idx;
+
+	for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
+		struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
+		cancel_delayed_work_sync(&per_pin->work);
+	}
+	return 0;
+}
+
 static int generic_hdmi_resume(struct hda_codec *codec)
 {
 	struct hdmi_spec *spec = codec->spec;
@@ -2503,6 +2515,7 @@ static const struct hda_codec_ops generic_hdmi_patch_ops = {
 	.build_controls		= generic_hdmi_build_controls,
 	.unsol_event		= hdmi_unsol_event,
 #ifdef CONFIG_PM
+	.suspend		= generic_hdmi_suspend,
 	.resume			= generic_hdmi_resume,
 #endif
 };
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-03-10 11:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-10 11:28 [PATCH 0/3] ALSA: hda: Fix potential bad accesses at suspend/resume Takashi Iwai
2021-03-10 11:28 ` [PATCH 1/3] ALSA: hda: Flush pending unsolicited events before suspend Takashi Iwai
2021-03-10 11:28 ` [PATCH 2/3] ALSA: hda: Avoid spurious unsol event handling during S3/S4 Takashi Iwai
2021-03-10 11:28 ` [PATCH 3/3] ALSA: hda/hdmi: Cancel pending works before suspend Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).