linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization
@ 2020-10-23 10:23 Kai-Heng Feng
  2020-10-23 10:23 ` [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI Kai-Heng Feng
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 10:23 UTC (permalink / raw)
  To: tiwai
  Cc: Kai-Heng Feng, Jaroslav Kysela, Pierre-Louis Bossart,
	Ranjani Sridharan, Kai Vehmanen, Mark Brown, Harsha Priya,
	Randy Dunlap, Gustavo A. R. Silva, moderated list:SOUND,
	open list

Upon system resume, hda_codec_pm_resume() uses hda_codec_force_resume()
to resume the codec. However, pm_runtime_force_resume() won't really
resume the codec because of pm_runtime_need_not_resume() check.

Hence, hda_codec_force_resume() schedules a jackpoll work, which is to
really power up the codec.

Instead of doing that, we can use direct-complete to make the PM flow
more straightforward, and keep codec always suspended through system PM
flow if conditions are met.

On system suspend, PM core will decide what to do based on
hda_codec_pm_prepare():
- If codec is not runtime-suspended, PM core will suspend and resume the
device as normal.
- If codec is runtime-suspended, PM core will try to keep it suspended.
If it's still suspended after system resume, we use
hda_codec_pm_complete() to resume codec if it's needed.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 sound/pci/hda/hda_codec.c | 45 +++++++++++++++++++++++++--------------
 1 file changed, 29 insertions(+), 16 deletions(-)

diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index a356c21edb90..c2a510cc81bb 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -2934,7 +2934,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
 	snd_hdac_leave_pm(&codec->core);
 }
 
-static int hda_codec_runtime_suspend(struct device *dev)
+static int hda_codec_suspend(struct device *dev)
 {
 	struct hda_codec *codec = dev_to_hda_codec(dev);
 	unsigned int state;
@@ -2953,7 +2953,7 @@ static int hda_codec_runtime_suspend(struct device *dev)
 	return 0;
 }
 
-static int hda_codec_runtime_resume(struct device *dev)
+static int hda_codec_resume(struct device *dev)
 {
 	struct hda_codec *codec = dev_to_hda_codec(dev);
 
@@ -2967,57 +2967,70 @@ static int hda_codec_runtime_resume(struct device *dev)
 	pm_runtime_mark_last_busy(dev);
 	return 0;
 }
+
+static int hda_codec_runtime_suspend(struct device *dev)
+{
+	return hda_codec_suspend(dev);
+}
+
+static int hda_codec_runtime_resume(struct device *dev)
+{
+	return hda_codec_resume(dev);
+}
+
 #endif /* CONFIG_PM */
 
 #ifdef CONFIG_PM_SLEEP
-static int hda_codec_force_resume(struct device *dev)
+static int hda_codec_pm_prepare(struct device *dev)
+{
+	return pm_runtime_suspended(dev);
+}
+
+static void hda_codec_pm_complete(struct device *dev)
 {
 	struct hda_codec *codec = dev_to_hda_codec(dev);
-	int ret;
 
-	ret = pm_runtime_force_resume(dev);
-	/* schedule jackpoll work for jack detection update */
-	if (codec->jackpoll_interval ||
-	    (pm_runtime_suspended(dev) && hda_codec_need_resume(codec)))
-		schedule_delayed_work(&codec->jackpoll_work,
-				      codec->jackpoll_interval);
-	return ret;
+	if (pm_runtime_suspended(dev) &&
+	    (hda_codec_need_resume(codec) || codec->forced_resume))
+		pm_request_resume(dev);
 }
 
 static int hda_codec_pm_suspend(struct device *dev)
 {
 	dev->power.power_state = PMSG_SUSPEND;
-	return pm_runtime_force_suspend(dev);
+	return hda_codec_suspend(dev);
 }
 
 static int hda_codec_pm_resume(struct device *dev)
 {
 	dev->power.power_state = PMSG_RESUME;
-	return hda_codec_force_resume(dev);
+	return hda_codec_resume(dev);
 }
 
 static int hda_codec_pm_freeze(struct device *dev)
 {
 	dev->power.power_state = PMSG_FREEZE;
-	return pm_runtime_force_suspend(dev);
+	return hda_codec_suspend(dev);
 }
 
 static int hda_codec_pm_thaw(struct device *dev)
 {
 	dev->power.power_state = PMSG_THAW;
-	return hda_codec_force_resume(dev);
+	return hda_codec_resume(dev);
 }
 
 static int hda_codec_pm_restore(struct device *dev)
 {
 	dev->power.power_state = PMSG_RESTORE;
-	return hda_codec_force_resume(dev);
+	return hda_codec_resume(dev);
 }
 #endif /* CONFIG_PM_SLEEP */
 
 /* referred in hda_bind.c */
 const struct dev_pm_ops hda_codec_driver_pm = {
 #ifdef CONFIG_PM_SLEEP
+	.prepare = hda_codec_pm_prepare,
+	.complete = hda_codec_pm_complete,
 	.suspend = hda_codec_pm_suspend,
 	.resume = hda_codec_pm_resume,
 	.freeze = hda_codec_pm_freeze,
-- 
2.17.1


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

* [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI
  2020-10-23 10:23 [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Kai-Heng Feng
@ 2020-10-23 10:23 ` Kai-Heng Feng
  2020-10-23 11:34   ` Takashi Iwai
  2020-10-23 10:23 ` [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization Kai-Heng Feng
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 10:23 UTC (permalink / raw)
  To: tiwai
  Cc: Kai-Heng Feng, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list

The code predates 2005, it should be unnecessary now as PCI core handles
MSI much better nowadays.

So stop PCI MSI mangling in suspend/resume callbacks.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 sound/pci/hda/hda_intel.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 749b88090970..b4aa1dcf1aae 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1022,13 +1022,11 @@ static int azx_suspend(struct device *dev)
 {
 	struct snd_card *card = dev_get_drvdata(dev);
 	struct azx *chip;
-	struct hdac_bus *bus;
 
 	if (!azx_is_pm_ready(card))
 		return 0;
 
 	chip = card->private_data;
-	bus = azx_bus(chip);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
 	/* An ugly workaround: direct call of __azx_runtime_suspend() and
 	 * __azx_runtime_resume() for old Intel platforms that suffer from
@@ -1038,14 +1036,6 @@ static int azx_suspend(struct device *dev)
 		__azx_runtime_suspend(chip);
 	else
 		pm_runtime_force_suspend(dev);
-	if (bus->irq >= 0) {
-		free_irq(bus->irq, chip);
-		bus->irq = -1;
-		chip->card->sync_irq = -1;
-	}
-
-	if (chip->msi)
-		pci_disable_msi(chip->pci);
 
 	trace_azx_suspend(chip);
 	return 0;
@@ -1060,11 +1050,6 @@ static int azx_resume(struct device *dev)
 		return 0;
 
 	chip = card->private_data;
-	if (chip->msi)
-		if (pci_enable_msi(chip->pci) < 0)
-			chip->msi = 0;
-	if (azx_acquire_irq(chip, 1) < 0)
-		return -EIO;
 
 	if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
 		__azx_runtime_resume(chip, false);
-- 
2.17.1


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

* [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization
  2020-10-23 10:23 [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Kai-Heng Feng
  2020-10-23 10:23 ` [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI Kai-Heng Feng
@ 2020-10-23 10:23 ` Kai-Heng Feng
  2020-10-23 11:36   ` Takashi Iwai
  2020-10-23 15:31   ` kernel test robot
  2020-10-23 10:23 ` [PATCH 4/4] ALSA: hda: Reinstate runtime_allow() for all hda controllers Kai-Heng Feng
  2020-10-23 11:32 ` [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Takashi Iwai
  3 siblings, 2 replies; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 10:23 UTC (permalink / raw)
  To: tiwai
  Cc: Kai-Heng Feng, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list

Similar to codec, we can use direct-complete optimization to keep HDA
controller suspended if conditions are met.

For most integrated HDA controllers, direct-complete won't happen because
ACPI wakeup is enabled for runtime suspend, but wakeup needs to be
disabled for system suspend.

For most HDA controller in discrete graphics, they will stay suspended
through system PM.

Note that HDA controllers don't need to use a complete() callback.
Codecs will decide if resume is needed.

While at it, also remove AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP, as the
original bug commit a6630529aecb ("ALSA: hda: Workaround for spurious
wakeups on some Intel platforms") solves doesn't happen with this
patch.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 sound/pci/hda/hda_controller.h |  2 +-
 sound/pci/hda/hda_intel.c      | 39 ++++++++++++----------------------
 2 files changed, 15 insertions(+), 26 deletions(-)

diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h
index be63ead8161f..fe171685492d 100644
--- a/sound/pci/hda/hda_controller.h
+++ b/sound/pci/hda/hda_controller.h
@@ -41,7 +41,7 @@
 /* 24 unused */
 #define AZX_DCAPS_COUNT_LPIB_DELAY  (1 << 25)	/* Take LPIB as delay */
 #define AZX_DCAPS_PM_RUNTIME	(1 << 26)	/* runtime PM support */
-#define AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP (1 << 27) /* Workaround for spurious wakeups after suspend */
+/* 27 unused */
 #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28)	/* CORBRP clears itself after reset */
 #define AZX_DCAPS_NO_MSI64      (1 << 29)	/* Stick to 32-bit MSIs */
 #define AZX_DCAPS_SEPARATE_STREAM_TAG	(1 << 30) /* capture and playback use separate stream tag */
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index b4aa1dcf1aae..14d935d8805f 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -297,8 +297,7 @@ enum {
 /* PCH for HSW/BDW; with runtime PM */
 /* no i915 binding for this as HSW/BDW has another controller for HDMI */
 #define AZX_DCAPS_INTEL_PCH \
-	(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\
-	 AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
+	(AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME)
 
 /* HSW HDMI */
 #define AZX_DCAPS_INTEL_HASWELL \
@@ -1018,6 +1017,11 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt)
 }
 
 #ifdef CONFIG_PM_SLEEP
+static int azx_prepare(struct device *dev)
+{
+	return pm_runtime_suspended(dev);
+}
+
 static int azx_suspend(struct device *dev)
 {
 	struct snd_card *card = dev_get_drvdata(dev);
@@ -1028,14 +1032,7 @@ static int azx_suspend(struct device *dev)
 
 	chip = card->private_data;
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-	/* An ugly workaround: direct call of __azx_runtime_suspend() and
-	 * __azx_runtime_resume() for old Intel platforms that suffer from
-	 * spurious wakeups after S3 suspend
-	 */
-	if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
-		__azx_runtime_suspend(chip);
-	else
-		pm_runtime_force_suspend(dev);
+	__azx_runtime_suspend(chip);
 
 	trace_azx_suspend(chip);
 	return 0;
@@ -1050,11 +1047,7 @@ static int azx_resume(struct device *dev)
 		return 0;
 
 	chip = card->private_data;
-
-	if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
-		__azx_runtime_resume(chip, false);
-	else
-		pm_runtime_force_resume(dev);
+	__azx_runtime_resume(chip, false);
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
 
 	trace_azx_resume(chip);
@@ -1103,10 +1096,8 @@ static int azx_runtime_suspend(struct device *dev)
 	chip = card->private_data;
 
 	/* enable controller wake up event */
-	if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) {
-		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
-			   STATESTS_INT_MASK);
-	}
+	azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
+		   STATESTS_INT_MASK);
 
 	__azx_runtime_suspend(chip);
 	trace_azx_runtime_suspend(chip);
@@ -1117,18 +1108,15 @@ static int azx_runtime_resume(struct device *dev)
 {
 	struct snd_card *card = dev_get_drvdata(dev);
 	struct azx *chip;
-	bool from_rt = snd_power_get_state(card) == SNDRV_CTL_POWER_D0;
 
 	if (!azx_is_pm_ready(card))
 		return 0;
 	chip = card->private_data;
-	__azx_runtime_resume(chip, from_rt);
+	__azx_runtime_resume(chip, true);
 
 	/* disable controller Wake Up event*/
-	if (from_rt) {
-		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
-			   ~STATESTS_INT_MASK);
-	}
+	azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
+		   ~STATESTS_INT_MASK);
 
 	trace_azx_runtime_resume(chip);
 	return 0;
@@ -1160,6 +1148,7 @@ static int azx_runtime_idle(struct device *dev)
 }
 
 static const struct dev_pm_ops azx_pm = {
+	.prepare = azx_prepare,
 	SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
 #ifdef CONFIG_PM_SLEEP
 	.freeze_noirq = azx_freeze_noirq,
-- 
2.17.1


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

* [PATCH 4/4] ALSA: hda: Reinstate runtime_allow() for all hda controllers
  2020-10-23 10:23 [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Kai-Heng Feng
  2020-10-23 10:23 ` [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI Kai-Heng Feng
  2020-10-23 10:23 ` [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization Kai-Heng Feng
@ 2020-10-23 10:23 ` Kai-Heng Feng
  2020-10-23 11:32 ` [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Takashi Iwai
  3 siblings, 0 replies; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 10:23 UTC (permalink / raw)
  To: tiwai
  Cc: Kai-Heng Feng, Jaroslav Kysela, Alex Deucher, Kai Vehmanen,
	Pierre-Louis Bossart, moderated list:SOUND, open list

The broken jack detection should be fixed by commit a6e7d0a4bdb0 ("ALSA:
hda: fix jack detection with Realtek codecs when in D3"), let's try
enabling runtime PM by default again.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 sound/pci/hda/hda_intel.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 14d935d8805f..6e83d00e1a51 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -2330,6 +2330,7 @@ static int azx_probe_continue(struct azx *chip)
 
 	if (azx_has_pm_runtime(chip)) {
 		pm_runtime_use_autosuspend(&pci->dev);
+		pm_runtime_allow(&pci->dev);
 		pm_runtime_put_autosuspend(&pci->dev);
 	}
 
-- 
2.17.1


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

* Re: [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization
  2020-10-23 10:23 [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Kai-Heng Feng
                   ` (2 preceding siblings ...)
  2020-10-23 10:23 ` [PATCH 4/4] ALSA: hda: Reinstate runtime_allow() for all hda controllers Kai-Heng Feng
@ 2020-10-23 11:32 ` Takashi Iwai
  2020-10-23 12:44   ` Kai-Heng Feng
  3 siblings, 1 reply; 13+ messages in thread
From: Takashi Iwai @ 2020-10-23 11:32 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: tiwai, Jaroslav Kysela, Pierre-Louis Bossart, Ranjani Sridharan,
	Kai Vehmanen, Mark Brown, Harsha Priya, Randy Dunlap,
	Gustavo A. R. Silva, moderated list:SOUND, open list

On Fri, 23 Oct 2020 12:23:35 +0200,
Kai-Heng Feng wrote:
> 
> +static void hda_codec_pm_complete(struct device *dev)
>  {
>  	struct hda_codec *codec = dev_to_hda_codec(dev);
> -	int ret;
>  
> -	ret = pm_runtime_force_resume(dev);
> -	/* schedule jackpoll work for jack detection update */
> -	if (codec->jackpoll_interval ||
> -	    (pm_runtime_suspended(dev) && hda_codec_need_resume(codec)))
> -		schedule_delayed_work(&codec->jackpoll_work,
> -				      codec->jackpoll_interval);
> -	return ret;
> +	if (pm_runtime_suspended(dev) &&
> +	    (hda_codec_need_resume(codec) || codec->forced_resume))
> +		pm_request_resume(dev);

You shouldn't drop the check of codec->jackpoll_interval.  If this
field is set, the codec driver has to resume no matter what it was, so
that the polling can start up again.


thanks,

Takashi

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

* Re: [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI
  2020-10-23 10:23 ` [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI Kai-Heng Feng
@ 2020-10-23 11:34   ` Takashi Iwai
  2020-10-23 12:53     ` Kai-Heng Feng
  0 siblings, 1 reply; 13+ messages in thread
From: Takashi Iwai @ 2020-10-23 11:34 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: tiwai, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list

On Fri, 23 Oct 2020 12:23:36 +0200,
Kai-Heng Feng wrote:
> 
> @@ -1038,14 +1036,6 @@ static int azx_suspend(struct device *dev)
>  		__azx_runtime_suspend(chip);
>  	else
>  		pm_runtime_force_suspend(dev);
> -	if (bus->irq >= 0) {
> -		free_irq(bus->irq, chip);
> -		bus->irq = -1;
> -		chip->card->sync_irq = -1;
> -	}

This release of irq has nothing to do with MSI.  There has been PCI
controllers that assign to a different IRQ line after the resume.

> -	if (azx_acquire_irq(chip, 1) < 0)
> -		return -EIO;

Ditto.


thanks,

Takashi

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

* Re: [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization
  2020-10-23 10:23 ` [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization Kai-Heng Feng
@ 2020-10-23 11:36   ` Takashi Iwai
  2020-10-23 13:02     ` Kai-Heng Feng
  2020-10-23 15:31   ` kernel test robot
  1 sibling, 1 reply; 13+ messages in thread
From: Takashi Iwai @ 2020-10-23 11:36 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: tiwai, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list

On Fri, 23 Oct 2020 12:23:37 +0200,
Kai-Heng Feng wrote:
> @@ -1103,10 +1096,8 @@ static int azx_runtime_suspend(struct device *dev)
>  	chip = card->private_data;
>  
>  	/* enable controller wake up event */
> -	if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) {
> -		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
> -			   STATESTS_INT_MASK);
> -	}
> +	azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
> +		   STATESTS_INT_MASK);

Hrm, this doesn't look safe.  Applying WAKEEN unconditionally means
that the machine may get woken up from the system suspend, and we
don't want that.


thanks,

Takashi

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

* Re: [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization
  2020-10-23 11:32 ` [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Takashi Iwai
@ 2020-10-23 12:44   ` Kai-Heng Feng
  2020-10-23 13:04     ` Takashi Iwai
  0 siblings, 1 reply; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 12:44 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: tiwai, Jaroslav Kysela, Pierre-Louis Bossart, Ranjani Sridharan,
	Kai Vehmanen, Mark Brown, Harsha Priya, Randy Dunlap,
	Gustavo A. R. Silva, moderated list:SOUND, open list



> On Oct 23, 2020, at 19:32, Takashi Iwai <tiwai@suse.de> wrote:
> 
> On Fri, 23 Oct 2020 12:23:35 +0200,
> Kai-Heng Feng wrote:
>> 
>> +static void hda_codec_pm_complete(struct device *dev)
>> {
>> 	struct hda_codec *codec = dev_to_hda_codec(dev);
>> -	int ret;
>> 
>> -	ret = pm_runtime_force_resume(dev);
>> -	/* schedule jackpoll work for jack detection update */
>> -	if (codec->jackpoll_interval ||
>> -	    (pm_runtime_suspended(dev) && hda_codec_need_resume(codec)))
>> -		schedule_delayed_work(&codec->jackpoll_work,
>> -				      codec->jackpoll_interval);
>> -	return ret;
>> +	if (pm_runtime_suspended(dev) &&
>> +	    (hda_codec_need_resume(codec) || codec->forced_resume))
>> +		pm_request_resume(dev);
> 
> You shouldn't drop the check of codec->jackpoll_interval.  If this
> field is set, the codec driver has to resume no matter what it was, so
> that the polling can start up again.

Ok, will address in v2.

Kai-Heng

> 
> 
> thanks,
> 
> Takashi


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

* Re: [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI
  2020-10-23 11:34   ` Takashi Iwai
@ 2020-10-23 12:53     ` Kai-Heng Feng
  2020-10-23 12:59       ` Takashi Iwai
  0 siblings, 1 reply; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 12:53 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: tiwai, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list



> On Oct 23, 2020, at 19:34, Takashi Iwai <tiwai@suse.de> wrote:
> 
> On Fri, 23 Oct 2020 12:23:36 +0200,
> Kai-Heng Feng wrote:
>> 
>> @@ -1038,14 +1036,6 @@ static int azx_suspend(struct device *dev)
>> 		__azx_runtime_suspend(chip);
>> 	else
>> 		pm_runtime_force_suspend(dev);
>> -	if (bus->irq >= 0) {
>> -		free_irq(bus->irq, chip);
>> -		bus->irq = -1;
>> -		chip->card->sync_irq = -1;
>> -	}
> 
> This release of irq has nothing to do with MSI.  There has been PCI
> controllers that assign to a different IRQ line after the resume.

Can this issue happened before commit 41017f0cac925 ("[PATCH] PCI: MSI(X) save/restore for suspend/resume") was merged?

Kai-Heng

> 
>> -	if (azx_acquire_irq(chip, 1) < 0)
>> -		return -EIO;
> 
> Ditto.
> 
> 
> thanks,
> 
> Takashi


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

* Re: [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI
  2020-10-23 12:53     ` Kai-Heng Feng
@ 2020-10-23 12:59       ` Takashi Iwai
  0 siblings, 0 replies; 13+ messages in thread
From: Takashi Iwai @ 2020-10-23 12:59 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: tiwai, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list

On Fri, 23 Oct 2020 14:53:08 +0200,
Kai-Heng Feng wrote:
> 
> 
> 
> > On Oct 23, 2020, at 19:34, Takashi Iwai <tiwai@suse.de> wrote:
> > 
> > On Fri, 23 Oct 2020 12:23:36 +0200,
> > Kai-Heng Feng wrote:
> >> 
> >> @@ -1038,14 +1036,6 @@ static int azx_suspend(struct device *dev)
> >> 		__azx_runtime_suspend(chip);
> >> 	else
> >> 		pm_runtime_force_suspend(dev);
> >> -	if (bus->irq >= 0) {
> >> -		free_irq(bus->irq, chip);
> >> -		bus->irq = -1;
> >> -		chip->card->sync_irq = -1;
> >> -	}
> > 
> > This release of irq has nothing to do with MSI.  There has been PCI
> > controllers that assign to a different IRQ line after the resume.
> 
> Can this issue happened before commit 41017f0cac925 ("[PATCH] PCI: MSI(X) save/restore for suspend/resume") was merged?

It's not about MSI.  The IRQ number itself may change after the
resume.

But I guess it's hard to prove it; the system was tad old, and I don't
know who own it now.


Takashi

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

* Re: [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization
  2020-10-23 11:36   ` Takashi Iwai
@ 2020-10-23 13:02     ` Kai-Heng Feng
  0 siblings, 0 replies; 13+ messages in thread
From: Kai-Heng Feng @ 2020-10-23 13:02 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: tiwai, Jaroslav Kysela, Kai Vehmanen, Alex Deucher,
	Pierre-Louis Bossart, moderated list:SOUND, open list



> On Oct 23, 2020, at 19:36, Takashi Iwai <tiwai@suse.de> wrote:
> 
> On Fri, 23 Oct 2020 12:23:37 +0200,
> Kai-Heng Feng wrote:
>> @@ -1103,10 +1096,8 @@ static int azx_runtime_suspend(struct device *dev)
>> 	chip = card->private_data;
>> 
>> 	/* enable controller wake up event */
>> -	if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) {
>> -		azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
>> -			   STATESTS_INT_MASK);
>> -	}
>> +	azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
>> +		   STATESTS_INT_MASK);
> 
> Hrm, this doesn't look safe.  Applying WAKEEN unconditionally means
> that the machine may get woken up from the system suspend, and we
> don't want that.

Yes, WAKEEN should be enabled for runtime suspend and disabled for system suspend.
In principle we should always do runtime-resume -> suspend flow when runtime and system PM requires different wakeup settings.

That also means HDA controllers can't use direct-complete at all.

However, I did some testing on keeping WAKEEN enabled for graphics card's audio controller, and they didn't wake system up.
But yes, in principle they are not safe, I'll change it in v2.

Kai-Heng

> 
> 
> thanks,
> 
> Takashi


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

* Re: [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization
  2020-10-23 12:44   ` Kai-Heng Feng
@ 2020-10-23 13:04     ` Takashi Iwai
  0 siblings, 0 replies; 13+ messages in thread
From: Takashi Iwai @ 2020-10-23 13:04 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: tiwai, Jaroslav Kysela, Pierre-Louis Bossart, Ranjani Sridharan,
	Kai Vehmanen, Mark Brown, Harsha Priya, Randy Dunlap,
	Gustavo A. R. Silva, moderated list:SOUND, open list

On Fri, 23 Oct 2020 14:44:18 +0200,
Kai-Heng Feng wrote:
> 
> 
> 
> > On Oct 23, 2020, at 19:32, Takashi Iwai <tiwai@suse.de> wrote:
> > 
> > On Fri, 23 Oct 2020 12:23:35 +0200,
> > Kai-Heng Feng wrote:
> >> 
> >> +static void hda_codec_pm_complete(struct device *dev)
> >> {
> >> 	struct hda_codec *codec = dev_to_hda_codec(dev);
> >> -	int ret;
> >> 
> >> -	ret = pm_runtime_force_resume(dev);
> >> -	/* schedule jackpoll work for jack detection update */
> >> -	if (codec->jackpoll_interval ||
> >> -	    (pm_runtime_suspended(dev) && hda_codec_need_resume(codec)))
> >> -		schedule_delayed_work(&codec->jackpoll_work,
> >> -				      codec->jackpoll_interval);
> >> -	return ret;
> >> +	if (pm_runtime_suspended(dev) &&
> >> +	    (hda_codec_need_resume(codec) || codec->forced_resume))
> >> +		pm_request_resume(dev);
> > 
> > You shouldn't drop the check of codec->jackpoll_interval.  If this
> > field is set, the codec driver has to resume no matter what it was, so
> > that the polling can start up again.
> 
> Ok, will address in v2.

Thanks.  And, could you submit v2 series with a cover letter?


Takashi

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

* Re: [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization
  2020-10-23 10:23 ` [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization Kai-Heng Feng
  2020-10-23 11:36   ` Takashi Iwai
@ 2020-10-23 15:31   ` kernel test robot
  1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2020-10-23 15:31 UTC (permalink / raw)
  To: Kai-Heng Feng, tiwai
  Cc: kbuild-all, clang-built-linux, Kai-Heng Feng, Jaroslav Kysela,
	Kai Vehmanen, Alex Deucher, Pierre-Louis Bossart,
	moderated list:SOUND, open list

[-- Attachment #1: Type: text/plain, Size: 2375 bytes --]

Hi Kai-Heng,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on sound/for-next]
[also build test ERROR on v5.9 next-20201023]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kai-Heng-Feng/ALSA-hda-Refactor-codec-PM-to-use-direct-complete-optimization/20201023-182616
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
config: x86_64-randconfig-a016-20201023 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 147b9497e79a98a8614b2b5eb4ba653b44f6b6f0)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://github.com/0day-ci/linux/commit/8add6f1976839b15db076e618d38e3634e86c0b0
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kai-Heng-Feng/ALSA-hda-Refactor-codec-PM-to-use-direct-complete-optimization/20201023-182616
        git checkout 8add6f1976839b15db076e618d38e3634e86c0b0
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> sound/pci/hda/hda_intel.c:1151:13: error: use of undeclared identifier 'azx_prepare'
           .prepare = azx_prepare,
                      ^
   1 error generated.

vim +/azx_prepare +1151 sound/pci/hda/hda_intel.c

  1149	
  1150	static const struct dev_pm_ops azx_pm = {
> 1151		.prepare = azx_prepare,
  1152		SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
  1153	#ifdef CONFIG_PM_SLEEP
  1154		.freeze_noirq = azx_freeze_noirq,
  1155		.thaw_noirq = azx_thaw_noirq,
  1156	#endif
  1157		SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
  1158	};
  1159	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35773 bytes --]

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

end of thread, other threads:[~2020-10-23 15:32 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-23 10:23 [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Kai-Heng Feng
2020-10-23 10:23 ` [PATCH 2/4] ALSA: hda: Stop mangling PCI MSI Kai-Heng Feng
2020-10-23 11:34   ` Takashi Iwai
2020-10-23 12:53     ` Kai-Heng Feng
2020-10-23 12:59       ` Takashi Iwai
2020-10-23 10:23 ` [PATCH 3/4] ALSA: hda: Refactor controller PM to use direct-complete optimization Kai-Heng Feng
2020-10-23 11:36   ` Takashi Iwai
2020-10-23 13:02     ` Kai-Heng Feng
2020-10-23 15:31   ` kernel test robot
2020-10-23 10:23 ` [PATCH 4/4] ALSA: hda: Reinstate runtime_allow() for all hda controllers Kai-Heng Feng
2020-10-23 11:32 ` [PATCH 1/4] ALSA: hda: Refactor codec PM to use direct-complete optimization Takashi Iwai
2020-10-23 12:44   ` Kai-Heng Feng
2020-10-23 13:04     ` 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).