From: Adnrey Golovko <andrey.golovko@gmail.com>
To: Vijendar.Mukunda@amd.com, superm1@kernel.org
Cc: alsa-devel@alsa-project.org, linux-sound@vger.kernel.org,
pierre-louis.bossart@linux.intel.com, broonie@kernel.org,
tiwai@suse.de, yung-chuan.liao@linux.intel.com
Subject: [BUG] ASoC: amd: ps / soundwire: SDW peripherals unrecoverable after s0i3 on Strix Halo (ACP7.0)
Date: Fri, 22 May 2026 15:54:06 +0300 [thread overview]
Message-ID: <7328cdbf-10fb-46a1-a28c-2f7365fd767d@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 10742 bytes --]
SoundWire slaves lose firmware after s2idle on AMD ACP7.0 (Strix Halo) —
TAS2783 cannot resume
## Summary
On ASUS ProArt PX13 HN7306EAC (AMD Ryzen AI MAX+ 395, Strix Halo)
with ACP PCI
rev 0x70 (ACP7.0), entering s2idle for as little as 3.8 seconds
causes the
Realtek RT721 SDCA and TI TAS2783 SoundWire peripherals to enter an
unrecoverable state. After resume, Peripheral status = unattached
and the
TAS2783 driver reports error playback without fw download . No
software-only
recovery is possible — driver re-bind, PCI hot remove+rescan, and
module reload
all fail. Only a full machine reboot restores audio.
Filed because all available fixes in current upstream/-next are
already applied
and do not address the root cause.
## Hardware
DMI: ASUS HN7306EAC, BIOS HN7306EAC.307 (2026-01-27)
CPU: AMD Ryzen AI MAX+ 395 w/ Radeon 8060S (Strix Halo)
ACP PCI ID: 1022:15e2 rev 0x70 (sysfs: 0000:c4:00.5)
ACP driver: snd_pci_ps
SoundWire link 1: Realtek RT721 SDCA (sdw:0:1:025d:0721:01)
2× TI TAS2783 (sdw:0:1:0102:0000:01:8,
...:01:b)
TAS2783 firmware: /lib/firmware/1714-1-{8,B}.bin (extracted from
Windows
driver — ASUS does not ship to linux-firmware as
of 2026-
05)
ACPI path: \_SB.PCI0.GPPA.ACP.SDWC.SWM1
## Kernel
Linux 7.1.0-rc3 + 3 backports:
c368dd5cbd61 soundwire: don't program SDW_SCP_BUSCLOCK_SCALE on a
unattached
Peripheral
9a0afdd19a01 soundwire: stream: sdw_stream_remove_slave(): Check
stream is
valid
e09bbf11b53f HID: input: delete hid_battery on disconnect
(unrelated)
git log v7.1-rc3..v7.1-rc4 -- sound/soc/amd drivers/soundwire/ is
empty.
broonie/sound#for-next adds sound/soc/amd/acp7x/ (ACP7.D/E/F, rev
0x7D-0x7F)
—
not applicable to ACP7.0.
## DSDT / ACPI properties
SWM1 (active link) has:
amd-sdw-power-mode = 0x02 (AMD_SDW_POWER_OFF_MODE)
amd-sdw-enable = 1
amd-sdw-wakeup-enable = 1
mipi-sdw-clock-stop-mode0-supported = 1
mipi-sdw-clock-stop-mode1-supported = 0
No _PS0 / _PS3 / _PR0 / _PR3 methods for \_SB.PCI0.GPPA.ACP.SDWC
or its
SWM0 / SWM1 children, no _RST method.
With power_mode_mask = AMD_SDW_POWER_OFF_MODE ,
drivers/soundwire/amd_manager.c
correctly takes the full deinit/init path: amd_deinit_sdw_manager() on
suspend,
sdw_clear_slave_status(SDW_UNATTACH_REQUEST_MASTER_RESET) +
amd_sdw_clk_init_ctrl +
amd_init_sdw_manager + amd_enable_sdw_manager +
amd_sdw_set_frameshape on
resume.
snd_acp70_resume() in sound/soc/amd/ps/ps-common.c correctly
takes the slow
path ( acp_hw_init + pad-keeper restore) because sdw_en_stat is
cleared
during
suspend by amd_deinit_sdw_manager . So the driver-level resume code
paths are
exercised correctly. The failure is at a lower level.
## Reproducer
# Cold boot, audio works.
$ aplay -l | grep amdsoundwire
card 1: amdsoundwire ... SDW1-PIN1-PLAYBACK-SmartAmp multicodec-2 []
$ speaker-test -D plughw:1,2 -c2 # → works
# One s2idle cycle:
$ systemctl suspend
# (3.8 sec residency in s0i3, /sys/kernel/debug/amd_pmc/s0ix_stats
confirms)
# (woken by i2c-ASCF1A03:00 touchpad wake event, but issue
reproduces with
# any wake source including RTC alarm)
# After resume:
$ speaker-test -D plughw:1,2 -c2
Setting of hwparams failed: Invalid argument
## Evidence — kernel trace
/sys/power/suspend_stats :
last_failed_dev = sdw:0:1:0102:0000:01:b
last_failed_step = resume
last_hw_sleep = 3825561 (µs)
journalctl -k around suspend/resume:
PM: suspend entry (s2idle)
Freezing user space processes completed
printk: Suspending console(s)
ACPI: EC: interrupt blocked
ACPI: EC: interrupt unblocked
slave-tas2783 sdw:0:1:0102:0000:01:8: PM: dpm_run_callback():
acpi_subsys_resume returns -110
slave-tas2783 sdw:0:1:0102:0000:01:8: PM: failed to resume: error -110
slave-tas2783 sdw:0:1:0102:0000:01:b: PM: dpm_run_callback():
acpi_subsys_resume returns -110
slave-tas2783 sdw:0:1:0102:0000:01:b: PM: failed to resume: error -110
PM: suspend exit
snd_pci_ps 0000:c4:00.5: AMD-Vi: Event logged [IO_PAGE_FAULT
domain=0x0018 address=0xfffffffffffffffc flags=0x0030]
The 0xfffffffffffffffc IOMMU fault address is the sentinel returned
when PCI
config reads return 0xff..ff , i.e., ACP is in an inaccessible state
at the
moment of DMA.
Detailed resume-path trace (excerpts):
amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 1
soundwire sdw-master-0-1: trf on Slave 1 failed:-5 write addr 8089
count 0
amd_sdw amd_sdw: ASoC: PRE_PMD: tas2783-2 FU21 event failed: -5
amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 2
soundwire sdw-master-0-1: trf on Slave 2 failed:-5 write addr 8089
count 0
rt721-sdca sdw:0:1:025d:0721:01: Initialization not complete, timed
out
amd_sdw_manager amd_sdw_manager.1: slave_stat:0x1
soundwire sdw-master-0-1: PING status: 0x1
amd_sdw_manager amd_sdw_manager.1: SDW1 clock stop successful
amd_sdw_manager amd_sdw_manager.1: AMD_SDW_DEVICE_STATE:0xc
amd_sdw_manager amd_sdw_manager.1: mclk 24000000 max 12000000 row
50 col 10
frame_rate:48000
amd_sdw_manager amd_sdw_manager.1: AMD_SDW_DEVICE_STATE:0x0
snd_pci_ps 0000:c4:00.5: AMD-Vi: Event logged [IO_PAGE_FAULT ...
0xfffffffffffffffc ...]
slave-tas2783 sdw:0:1:0102:0000:01:8: resume: initialization timed out
soundwire sdw-master-0-1: PING status: 0x1
Note PING status: 0x1 — the SoundWire PING-frame status returns the
same low
value before and after the manager attempts to re-enumerate.
Peripherals are
not responding on the wire even though clock is running.
Steady-state symptoms after the resume path completes (slave drivers
loaded,
codec link tries to prepare PCM):
slave-tas2783 sdw:0:1:0102:0000:01:8: Peripheral status = unattached
slave-tas2783 sdw:0:1:0102:0000:01:8: error playback without fw
download
slave-tas2783 sdw:0:1:0102:0000:01:8: ASoC error (-22): at
snd_soc_dai_hw_params()
soundwire sdw-master-0-1: Program transport params failed: -61
amd_sdw_manager amd_sdw_manager.1: command is ignored for Slave 2
command is ignored for Slave N from amd_sdw_fill_msg_resp()
indicates the
SoundWire bus sees no ACK for any peripheral command — the
peripherals are not
responding on the wire.
The error playback without fw download from tas2783-sdw.c is the
giveaway —
the TAS2783 driver explicitly knows its firmware blob is no longer
loaded.
During cold boot the firmware is downloaded after slave attach; after
s0i3, the
slave never reaches attached state, so the firmware download path is
never
re-entered.
## Recovery attempts — ALL FAIL
Attempt │Result
───────────────────────────────────────┼────────────────────────────────────────
Stop PipeWire, rmmod snd_soc_tas2783_…│ EBUSY — kernel ALSA-SOC
retry loop ho…
echo 0000:c4:00.5 > /sys/bus/pci/driv…│Probe replays cleanly ( probe
complete …
PCIe Function-Level Reset ( /sys/.../r…│File does not exist — ACP
does not adve…
echo 1 > /sys/bus/pci/devices/0000:c4…│Same as unbind+bind — slaves
enumerate …
pm-utils system-sleep hook running the…│Same
BIOS update 305 → 307 │No change
This is consistent with the underlying SMU behaviour on Strix Halo s0i3:
the ACP power island is power-gated, peripherals connected to the
SoundWire
pads lose state including firmware. There is no software path from
the OS
to re-power the slave chips short of a full machine reboot.
## What I think the bug is
Either (a) the AMD SMU should hold the ACP power island powered
during s0i3
when SoundWire link is active and peripherals require firmware (BIOS
or SMU
firmware change), or (b) the kernel needs an explicit recovery path
that:
1. Detects in snd_acp70_resume() that ACP was actually power-gated
(e.g.
by reading a sentinel register that survives only across non-power-gated
suspend).
2. If power-gated, performs a full peripheral-chip reset (some
platform-specific
GPIO toggle? secondary bus reset on the ACP's PCIe link?) before the SDW
manager attempts to re-enumerate.
3. Triggers each slave driver's firmware-download path on resume.
I cannot find any GPIO under \_SB.PCI0.GPPA.ACP in DSDT that would
let the
kernel toggle slave chip power. Is there an SMU command available via
amd_pmc that would force a re-power of the ACP island? Or is this a
BIOS
deficiency on this specific HN7306EAC firmware?
## Workaround currently used
suspend is disabled in GNOME. hibernate (S4) works because it
goes through
a full cold-boot path.
## Asks
1. Is there a known software path to recover SoundWire peripherals after
ACP power-gate that I missed?
2. If not — would AMD consider adding either a full ACP island re-power
sequence in snd_acp70_resume() or a peripheral-reset hook that
slave drivers can call from their resume path?
3. Should ASUS BIOS be updated to either advertise _RST for SDW nodes
or prevent SMU from power-gating ACP during s0i3 when SDW is active?
(Happy to file with ASUS Linux team if you can confirm direction.)
I have full DSDT/SSDT decode, complete dmesg traces, and a reproducer
environment if more data is helpful. Source tree with all backports at
https://github.com/... (will set up on request).
Tested on 7.1.0-rc3 + backports above. Confirmed same failure on stock
7.1.0-070100rc3-generic from kernel.ubuntu.com/mainline/v7.1-rc3/ .
Thanks,
Andrey Golovko
[-- Attachment #2: dsdt-sdwc.dsl --]
[-- Type: text/x-dsl, Size: 4268 bytes --]
Device (SDWC)
{
Name (_ADR, 0x05) // _ADR: Address
Name (_DSD, Package (0x04) // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x03)
{
Package (0x02)
{
"mipi-sdw-sw-interface-revision",
0x00010000
},
Package (0x02)
{
"mipi-sdw-manager-list",
0x03
},
Package (0x02)
{
"amd-sdw-aggregation-master-id",
0xFFFF
}
},
ToUUID ("dbb8e3e6-5886-4ba6-8795-1319f52a966b") /* Hierarchical Data Extension */,
Package (0x02)
{
Package (0x02)
{
"mipi-sdw-link-0-subproperties",
"SWM0"
},
Package (0x02)
{
"mipi-sdw-link-1-subproperties",
"SWM1"
}
}
})
Name (SWM0, Package (0x02)
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x0E)
{
Package (0x02)
{
--- SWM1 properties (active link with RT721 + 2× TAS2783) ---
Name (SWM1, Package (0x02)
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x0E)
{
Package (0x02)
{
"mipi-sdw-sw-interface-revision",
0x00010000
},
Package (0x02)
{
"mipi-sdw-clock-stop-mode0-supported",
One
},
Package (0x02)
{
"mipi-sdw-clock-stop-mode1-supported",
Zero
},
Package (0x02)
{
"mipi-sdw-max-clock-frequency",
0x00B71B00
},
Package (0x02)
{
"mipi-sdw-supported-clock-scales",
Zero
},
Package (0x02)
{
"mipi-sdw-default-frame-rate",
0xBB80
},
Package (0x02)
{
"mipi-sdw-default-frame-row-size",
0x32
},
Package (0x02)
{
"mipi-sdw-default-frame-col-size",
0x0A
},
Package (0x02)
{
"mipi-sdw-dynamic-frame-shape",
Zero
},
Package (0x02)
{
"mipi-sdw-command-error-threshold",
Zero
},
Package (0x02)
{
"amd-sdw-enable",
One
},
Package (0x02)
{
"amd-sdw-wakeup-enable",
One
},
Package (0x02)
{
"amd-sdw-power-mode",
0x02
},
Package (0x02)
{
"amd-sdw-multi-lane-enable",
One
}
}
})
[-- Attachment #3: sysinfo.txt --]
[-- Type: text/plain, Size: 577 bytes --]
# System info
## DMI
ASUS
ProArt PX13 HN7306EAC
ProArt PX13
BIOS: American Megatrends International, LLC. HN7306EAC.307 01/27/2026
## CPU
model name : AMD RYZEN AI MAX+ 395 w/ Radeon 8060S
## Kernel
Linux asus-px 7.1.0-rc3-px13fix #2 SMP PREEMPT_DYNAMIC Thu May 14 20:38:57 MSK 2026 x86_64 GNU/Linux
## ACP PCI
c4:00.5 Multimedia controller [0480]: Advanced Micro Devices, Inc. [AMD] Audio Coprocessor [1022:15e2] (rev 70)
rev: 0x0x70
driver: snd_pci_ps
## SoundWire devices
sdw-master-0-0
sdw-master-0-1
sdw:0:1:0102:0000:01:8
sdw:0:1:0102:0000:01:b
sdw:0:1:025d:0721:01
[-- Attachment #4: trace-summary.txt --]
[-- Type: text/plain, Size: 4019 bytes --]
# Trace of one failing s2idle cycle (captured 2026-05-22)
## PM events
May 22 15:10:43 asus-px kernel: PM: suspend entry (s2idle)
May 22 15:11:05 asus-px kernel: Freezing user space processes
May 22 15:11:05 asus-px kernel: Freezing user space processes completed (elapsed 0.001 seconds)
May 22 15:11:05 asus-px kernel: Freezing remaining freezable tasks
May 22 15:11:05 asus-px kernel: Freezing remaining freezable tasks completed (elapsed 0.000 seconds)
May 22 15:11:05 asus-px kernel: printk: Suspending console(s) (use no_console_suspend to debug)
May 22 15:11:05 asus-px kernel: ACPI: EC: interrupt blocked
May 22 15:11:05 asus-px kernel: ACPI: EC: interrupt unblocked
May 22 15:11:05 asus-px kernel: snd_pci_ps 0000:c4:00.5: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0018 address=0xfffffffffffffffc flags=0x0030]
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:8: PM: dpm_run_callback(): acpi_subsys_resume returns -110
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:8: PM: failed to resume: error -110
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:b: PM: dpm_run_callback(): acpi_subsys_resume returns -110
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:b: PM: failed to resume: error -110
May 22 15:11:05 asus-px kernel: PM: suspend exit
## Steady-state symptoms after resume (first 20 lines)
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 1
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: trf on Slave 1 failed:-5 write addr 8089 count 0
May 22 15:11:05 asus-px kernel: amd_sdw amd_sdw: ASoC: PRE_PMD: tas2783-2 FU21 event failed: -5
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 1
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: trf on Slave 1 failed:-5 write addr 8109 count 0
May 22 15:11:05 asus-px kernel: amd_sdw amd_sdw: ASoC: PRE_PMD: tas2783-2 FU23 event failed: -5
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 2
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: trf on Slave 2 failed:-5 write addr 8089 count 0
May 22 15:11:05 asus-px kernel: amd_sdw amd_sdw: ASoC: PRE_PMD: tas2783-1 FU21 event failed: -5
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: SCP_addrpage ignored for Slave 2
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: trf on Slave 2 failed:-5 write addr 8109 count 0
May 22 15:11:05 asus-px kernel: amd_sdw amd_sdw: ASoC: PRE_PMD: tas2783-1 FU23 event failed: -5
May 22 15:11:05 asus-px kernel: rt721-sdca sdw:0:1:025d:0721:01: Initialization not complete, timed out
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: slave_stat:0x1
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: PING status: 0x1
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: SDW1 clock stop successful
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: AMD_SDW_DEVICE_STATE:0xc
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: mclk 24000000 max 12000000 row 50 col 10 frame_rate:48000
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: AMD_SDW_DEVICE_STATE:0x0
May 22 15:11:05 asus-px kernel: snd_pci_ps 0000:c4:00.5: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0018 address=0xfffffffffffffffc flags=0x0030]
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:8: resume: initialization timed out
May 22 15:11:05 asus-px kernel: amd_sdw_manager amd_sdw_manager.1: slave_stat:0x1
May 22 15:11:05 asus-px kernel: soundwire sdw-master-0-1: PING status: 0x1
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:8: PM: dpm_run_callback(): acpi_subsys_resume returns -110
May 22 15:11:05 asus-px kernel: slave-tas2783 sdw:0:1:0102:0000:01:8: PM: failed to resume: error -110
## suspend_stats after failure
last_failed_dev: sdw:0:1:0102:0000:01:b
last_failed_step: resume
(captured 2026-05-22)
next reply other threads:[~2026-05-22 12:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-22 12:54 Adnrey Golovko [this message]
2026-05-22 13:01 ` [BUG] ASoC: amd: ps / soundwire: SDW peripherals unrecoverable after s0i3 on Strix Halo (ACP7.0) Mark Brown
2026-05-22 13:07 ` Adnrey Golovko
2026-05-23 13:15 ` Mukunda,Vijendar
2026-05-27 20:23 ` Adnrey Golovko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7328cdbf-10fb-46a1-a28c-2f7365fd767d@gmail.com \
--to=andrey.golovko@gmail.com \
--cc=Vijendar.Mukunda@amd.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=pierre-louis.bossart@linux.intel.com \
--cc=superm1@kernel.org \
--cc=tiwai@suse.de \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.