Commit 929443b
committed
soundwire: amd: Add BRA/BPT firmware download support
Add Bulk Register Access (BRA) / Bulk Payload Transport (BPT) support
for AMD SoundWire platforms. This enables high-speed firmware download
to SoundWire peripherals via DP0, using the ACP BRA DMA engine.
Key design points:
- Uses the SoundWire stream framework (sdw_prepare_stream,
sdw_enable_stream, sdw_disable_stream, sdw_deprepare_stream)
for all DP0 port programming and bank switches. No manual DP0
register writes or bank mirrors are needed.
- BRA transport parameters (hstart, hstop, SampleInterval,
BytesPerFrame) are computed dynamically from the current bus
frame shape, not hardcoded.
- The ACP BPT DMA engine is triggered by the bank switch
performed inside sdw_enable_stream(), and stopped by the
bank switch in sdw_disable_stream().
- Non-contiguous firmware sections are handled by iterating
per-section: large sections use BRA DMA, small sections
(< one BRA frame) fall back to sdw_nwrite/sdw_nread.
- BPT stream m_rt entries are skipped in audio compute_params
to prevent BPT transport parameters from corrupting audio
port block offset calculations.
- DP0 port_params, xport_params, and port_enable callbacks
return early for BPT streams since the ACP BRA descriptor
registers handle DP0 configuration independently.
- bus->bpt_stream is published with WRITE_ONCE() only after the stream
runtime is added and bpt_stream_refcount is raised under bus_lock, and
is cleared before the runtime is removed and the stream is freed, so
the lockless DP0 port callbacks never observe a half-initialised or
freed stream pointer.
- bus->bpt_fw_download is set around the transfer so sdw_master_rt_alloc()
admits the BPT allocation while audio streams on the same bus are
allocated but idle (for example an amplifier left DISABLED across a
power-off-mode suspend that must re-download firmware on resume). It is
cleared on the close and open error paths. An audio stream that is
actively using the bus still blocks the transfer.
- On an aborted or timed-out transfer the ACP BPT DMA engine is disarmed
(PORT_EN=0) before the sdw_disable_stream() bank switch, so the bank
switch cannot re-trigger a DMA write into the buffer that is freed once
the transfer returns.
- A per-manager bpt_lock serialises concurrent BPT transfers
from multiple slave probes. pm_runtime keeps the bus clock
active during transfers.
- PTE-based ACP ATU mapping provides DMA scatter-gather for the
firmware buffer. The ATU maps up to 512 4KB pages (2 MB per
transfer); each transfer is additionally bounded by the SoundWire
BPT limit of 1 MB (SDW_BPT_MSG_MAX_BYTES), which the driver enforces.
Signed-off-by: Syed Saba Kareem <Syed.SabaKareem@amd.com>1 parent e0324a8 commit 929443b
8 files changed
Lines changed: 1367 additions & 5 deletions
File tree
- drivers/soundwire
- include/linux/soundwire
- sound/soc
- amd/ps
- sof/amd
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| 123 | + | |
123 | 124 | | |
124 | 125 | | |
125 | 126 | | |
| |||
0 commit comments