Skip to content

Commit a8f62aa

Browse files
committed
topology2: doc: add full RT721 WCL multi-slot WoV architecture graph
Add complete Mermaid system architecture flowchart and PCM configuration matrix for the production SoundWire RT721 + 4-channel DMIC + multi-slot WoV topology (sof-wcl-rt721-4ch-wov-multi.tplg). Includes: - Headphone playback (PCM 0 & PCM 31 deep buffer -> ALH Jack Out) - Headset microphone capture (ALH Jack In -> PCM 1) - SmartAmp speaker playback (PCM 2 & PCM 35 deep buffer with IIR/FIR/DRC -> ALH SmartAmp) - SmartMic capture (ALH SmartMic with TDFB beamformer & DRC -> PCM 4) - Intel Display Audio playback (PCM 5, 6, 7 -> iDisp 1, 2, 3) - 4-channel DMIC subsystem with ECNS, KPB, 3x microWakeWord slots, and 4-pin D0i3-compatible WOV Arbiter (PCM 10, 11, 12).
1 parent 984a2b0 commit a8f62aa

1 file changed

Lines changed: 241 additions & 0 deletions

File tree

‎tools/topology/topology2/README.md‎

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,247 @@ alsatplg -I $PWD/tools/topology/topology2 -p \
598598
-o build/sof-wcl-dmic-wov-multi-4ch.tplg
599599
```
600600

601+
### Full Production Platform Topology: Wildcat Lake SoundWire RT721 + Multi-Slot WoV (`sof-wcl-rt721-4ch-wov-multi.tplg`)
602+
603+
While standalone manifests isolate the DMIC and WoV pipelines for component-level verification, production hardware integrates the full multi-slot WoV subsystem alongside the platform's SoundWire codecs and Intel Display Audio interfaces.
604+
605+
The **`sof-wcl-rt721-4ch-wov-multi.tplg`** (and corresponding PTL variant `sof-ptl-rt721-4ch-wov-multi.tplg`) includes:
606+
- **SoundWire RT721 Headphone Subsystem**: Standard playback (`PCM 0`, `Jack Out`) and low-power deep buffer (`PCM 31`, `Deepbuffer Jack Out`) mixed into ALH endpoint `Playback-SimpleJack`.
607+
- **SoundWire RT721 Headset Mic Subsystem**: Hardware capture (`PCM 1`, `Jack In`) via ALH endpoint `Capture-SimpleJack` with dedicated IIR EQ.
608+
- **SoundWire SmartAmp Speaker Subsystem**: Standard speaker playback (`PCM 2`, `Speaker`) and deep buffer (`PCM 35`, `Deepbuffer Speaker`) mixed into a post-mixer DSP pipeline (IIR, FIR, DRC) before output to ALH endpoint `Playback-SmartAmp`.
609+
- **SoundWire SmartMic Subsystem**: Microphone capture (`PCM 4`, `Microphone`) with hardware Time-Domain Filtered Beamforming (TDFB), Dynamic Range Compression (DRC), and IIR filter via ALH endpoint `Capture-SmartMic`.
610+
- **Intel Display Audio (HDMI / DP)**: Three independent playback streams (`PCM 5`, `PCM 6`, `PCM 7`) connected to HDA copiers (`iDisp1`, `iDisp2`, `iDisp3`).
611+
- **4-Channel DMIC Subsystem with Multi-Slot WoV**:
612+
- `PCM 10` (`DMIC Raw`): Continuous 4-channel 16 kHz raw capture.
613+
- `PCM 11` (`DMIC ECNS Capture`): Continuous clean stereo 16 kHz capture processed via 20ms DP ECNS.
614+
- 20ms DP Key Phrase Buffer (KPB, 64 KB history buffer) with dual-sink topology fanout.
615+
- 3 concurrent microWakeWord detector slots (10ms DP MFCC + MWW) armed individually via ALSA volatile controls `wovdebug_111`, `wovdebug_112`, and `wovdebug_113`.
616+
- 4-pin WOV Arbiter with active slot selection and host wake support (`PCM 12`, `DMIC Multi-WOV`, `capture_compatible_d0i3 true`).
617+
618+
#### Full System Architecture Graph
619+
620+
```mermaid
621+
graph TD
622+
%% --- SOUNDWIRE PLAYBACK: HEADPHONE & DEEPBUFFER ---
623+
subgraph P0["Pipeline 0 — Jack Playback (Core 0, LL 1ms)"]
624+
HC0["host-copier.0.playback\n(PCM 0: 'Jack Out')\n2ch · 48 kHz · S16/S24/S32_LE"]
625+
G0["gain.0.1\n(Pre-Mixer Jack Out Volume)"]
626+
MIX0["mixin.0.1"]
627+
HC0 --> G0 --> MIX0
628+
end
629+
630+
subgraph P15["Pipeline 15 — Deepbuffer Jack (Core 0, DP 10ms)"]
631+
HC31["host-copier.31.playback\n(PCM 31: 'Deepbuffer Jack Out')\n2ch · 48 kHz · S16/S24/S32_LE"]
632+
G15["gain.15.1\n(Pre-Mixer Deepbuffer Jack Volume)"]
633+
MIX15["mixin.15.1"]
634+
HC31 --> G15 --> MIX15
635+
end
636+
637+
subgraph P1["Pipeline 1 — Jack Mixer & DAI Out (Core 0, LL 1ms)"]
638+
MO1["mixout.1.1"]
639+
G1["gain.1.1\n(Post-Mixer Jack Out Volume)"]
640+
MC1["module-copier.1.12"]
641+
ALH0["alh-copier.Playback-SimpleJack.0\n(ALH Link 0 · DAI Playback-SimpleJack)"]
642+
MO1 --> G1 --> MC1 --> ALH0
643+
end
644+
MIX0 --> MO1
645+
MIX15 --> MO1
646+
647+
%% --- SOUNDWIRE CAPTURE: HEADSET MIC ---
648+
subgraph P11["Pipeline 11 — Jack Mic In (DAI Capture)"]
649+
ALH1["alh-copier.Capture-SimpleJack.0\n(ALH Link 1 · DAI Capture-SimpleJack)"]
650+
EQIIR11["eqiir.11.0\n(Jack In Capture IIR Eq)"]
651+
MC11["module-copier.11.0"]
652+
ALH1 --> EQIIR11 --> MC11
653+
end
654+
655+
subgraph P10["Pipeline 10 — Jack Mic Host Capture (Core 0, LL 1ms)"]
656+
HC1["host-copier.1.capture\n(PCM 1: 'Jack In')\n2ch · 48 kHz · S16/S24/S32_LE"]
657+
MC11 --> HC1
658+
end
659+
660+
%% --- SOUNDWIRE PLAYBACK: SMARTAMP SPEAKER & DEEPBUFFER ---
661+
subgraph P20["Pipeline 20 — Speaker Playback (Core 0, LL 1ms)"]
662+
HC2["host-copier.2.playback\n(PCM 2: 'Speaker')\n2ch · 48 kHz · S16/S24/S32_LE"]
663+
G20["gain.20.1\n(Pre-Mixer Speaker Playback Volume)"]
664+
MIX20["mixin.20.1"]
665+
HC2 --> G20 --> MIX20
666+
end
667+
668+
subgraph P16["Pipeline 16 — Deepbuffer Speaker (Core 0, DP 10ms)"]
669+
HC35["host-copier.35.playback\n(PCM 35: 'Deepbuffer Speaker')\n2ch · 48 kHz · S16/S24/S32_LE"]
670+
G16["gain.16.1\n(Pre-Mixer Deepbuffer Speaker Volume)"]
671+
MIX16["mixin.16.1"]
672+
HC35 --> G16 --> MIX16
673+
end
674+
675+
subgraph P21["Pipeline 21 — SmartAmp Mixer, DSP & DAI (Core 0, LL 1ms)"]
676+
MO21["mixout.21.1"]
677+
G21["gain.21.1\n(Post-Mixer Speaker Volume)"]
678+
EQIIR21["eqiir.21.1\n(Speaker IIR Eq)"]
679+
EQFIR21["eqfir.21.1\n(Speaker FIR Eq)"]
680+
DRC21["drc.21.1\n(Speaker DRC)"]
681+
MC21["module-copier.21.22"]
682+
ALH2["alh-copier.Playback-SmartAmp.0\n(ALH Link 2 · DAI Playback-SmartAmp)"]
683+
MO21 --> G21 --> EQIIR21 --> EQFIR21 --> DRC21 --> MC21 --> ALH2
684+
end
685+
MIX20 --> MO21
686+
MIX16 --> MO21
687+
688+
%% --- SOUNDWIRE CAPTURE: SMARTMIC ---
689+
subgraph P41["Pipeline 41 — SmartMic DAI Capture"]
690+
ALH4["alh-copier.Capture-SmartMic.0\n(DAI Capture-SmartMic)"]
691+
EQIIR41["eqiir.41.0\n(Microphone Capture IIR Eq)"]
692+
MC41["module-copier.41.0"]
693+
ALH4 --> EQIIR41 --> MC41
694+
end
695+
696+
subgraph P40["Pipeline 40 — SmartMic DSP Host Capture (Core 0, LL 1ms)"]
697+
TDFB40["tdfb.40.1\n(Microphone TDFB Beamformer)"]
698+
DRC40["drc.40.1\n(Microphone DRC)"]
699+
HC4["host-copier.4.capture\n(PCM 4: 'Microphone')\n2ch · 48 kHz · S16/S24/S32_LE"]
700+
MC41 --> TDFB40 --> DRC40 --> HC4
701+
end
702+
703+
%% --- HDMI DISPLAY AUDIO PLAYBACK ---
704+
subgraph HDMI["HDMI / DP Display Audio Playback"]
705+
subgraph P50_51["HDMI 1 (PCM 5)"]
706+
HC5["host-copier.5.playback\n(PCM 5: 'HDMI1')"] --> DAI5["dai-copier.HDA.iDisp1.playback\n(iDisp1 DAI)"]
707+
end
708+
subgraph P60_61["HDMI 2 (PCM 6)"]
709+
HC6["host-copier.6.playback\n(PCM 6: 'HDMI2')"] --> DAI6["dai-copier.HDA.iDisp2.playback\n(iDisp2 DAI)"]
710+
end
711+
subgraph P70_71["HDMI 3 (PCM 7)"]
712+
HC7["host-copier.7.playback\n(PCM 7: 'HDMI3')"] --> DAI7["dai-copier.HDA.iDisp3.playback\n(iDisp3 DAI)"]
713+
end
714+
end
715+
716+
%% --- 4-CHANNEL HARDWARE DMIC & MULTI-SLOT WOV SUBSYSTEM ---
717+
subgraph P110["Pipeline 110 — 4ch DMIC Hardware In (Core 0, LL 1ms)"]
718+
DMIC_DAI["dai-copier.DMIC.dmic01.capture\n(dmic01 · 4ch · 16 kHz · S16_LE)"]
719+
MIX110["mixin.110.1\n(4ch pass-through)"]
720+
DMIC_DAI --> MIX110
721+
end
722+
723+
subgraph P118["Pipeline 118 — DMIC Raw Host Capture (Core 0, LL 1ms)"]
724+
MO118["mixout.118.1\n(4ch raw audio)"]
725+
HC10["host-copier.10.capture\n(PCM 10: 'DMIC Raw')\n4ch · 16 kHz · S16/S32_LE"]
726+
MO118 --> HC10
727+
end
728+
MIX110 --> MO118
729+
730+
subgraph P115["Pipeline 115 — 20ms DP ECNS Audio Processing (Core 0, DP 20ms)"]
731+
MO115["mixout.115.1\n(4ch input: mics + echo-ref)"]
732+
ECNS115["ecns.115.1\n(Echo Cancellation & Noise Suppression)\n320 frames / 20ms period"]
733+
MIX115_1["mixin.115.1\n(Pin 0: Mono Beamformed Clean Audio)"]
734+
MIX115_2["mixin.115.2\n(Pin 1: Stereo Clean Audio)"]
735+
MO115 --> ECNS115
736+
ECNS115 -- "Pin 0 (Mono)" --> MIX115_1
737+
ECNS115 -- "Pin 1 (Stereo)" --> MIX115_2
738+
end
739+
MIX110 --> MO115
740+
741+
subgraph P117["Pipeline 117 — ECNS Clean Host Capture (Core 0, LL 1ms)"]
742+
MO117["mixout.117.1\n(2ch clean stereo)"]
743+
HC11["host-copier.11.capture\n(PCM 11: 'DMIC ECNS Capture')\n2ch · 16 kHz · S16/S32_LE"]
744+
MO117 --> HC11
745+
end
746+
MIX115_2 --> MO117
747+
748+
subgraph P116["Pipeline 116 — 20ms DP KPB History Buffer (Core 0, DP 20ms)"]
749+
MO116["mixout.116.1\n(1ch mono input)"]
750+
KPB116["kpb.116.1\n(Key Phrase Buffer · 2000ms = 64 KB)\nPin 0: sel_sink (Real-time)\nPin 1: host_sink (Drain History)"]
751+
MIX116["mixin.116.1\n(3-way detector fanout)"]
752+
MO116 --> KPB116
753+
KPB116 -- "Pin 0 (sel_sink)" --> MIX116
754+
end
755+
MIX115_1 --> MO116
756+
757+
subgraph P111["Pipeline 111 — Slot 0 Detector (Core 0, DP 10ms)"]
758+
MO111["mixout.111.1"]
759+
MFCC0["mfcc.111.1\n(Mel-40 10ms Compress)"]
760+
MWW0["mww.111.1\n(microWakeWord Slot 0)\nControl: 'wovdebug_111'"]
761+
MO111 --> MFCC0 --> MWW0
762+
end
763+
764+
subgraph P112["Pipeline 112 — Slot 1 Detector (Core 0, DP 10ms)"]
765+
MO112["mixout.112.1"]
766+
MFCC1["mfcc.112.1\n(Mel-40 10ms Compress)"]
767+
MWW1["mww.112.1\n(microWakeWord Slot 1)\nControl: 'wovdebug_112'"]
768+
MO112 --> MFCC1 --> MWW1
769+
end
770+
771+
subgraph P113["Pipeline 113 — Slot 2 Detector (Core 0, DP 10ms)"]
772+
MO113["mixout.113.1"]
773+
MFCC2["mfcc.113.1\n(Mel-40 10ms Compress)"]
774+
MWW2["mww.113.1\n(microWakeWord Slot 2)\nControl: 'wovdebug_113'"]
775+
MO113 --> MFCC2 --> MWW2
776+
end
777+
MIX116 --> MO111
778+
MIX116 --> MO112
779+
MIX116 --> MO113
780+
781+
subgraph P114["Pipeline 114 — WOV Arbiter & Host Capture (Core 0, LL 1ms)"]
782+
ARB["wov-arbiter.114.1\n(4-Pin Arbiter · Active Slot Routing)\nPin 0: Audio Drain | Pins 1-3: Features"]
783+
HC12["host-copier.12.capture\n(PCM 12: 'DMIC Multi-WOV')\n1ch · 16 kHz · S16/S32_LE\ncapture_compatible_d0i3 = true"]
784+
ARB --> HC12
785+
end
786+
787+
KPB116 -- "Pin 1 (host_sink: 2s history drain)" --> ARB
788+
MWW0 -- "Pin 1 (Features / Trigger)" --> ARB
789+
MWW1 -- "Pin 2 (Features / Trigger)" --> ARB
790+
MWW2 -- "Pin 3 (Features / Trigger)" --> ARB
791+
792+
MWW0 -. "Notifier WOV_DETECT (slot=0)" .-> ARB
793+
MWW1 -. "Notifier WOV_DETECT (slot=1)" .-> ARB
794+
MWW2 -. "Notifier WOV_DETECT (slot=2)" .-> ARB
795+
MWW0 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB116
796+
MWW1 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB116
797+
MWW2 -. "Notifier KPB_CLIENT_EVT (DRAIN 2s)" .-> KPB116
798+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW0
799+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW1
800+
ARB -. "Notifier WOV_CTRL (PAUSE/RESUME)" .-> MWW2
801+
802+
style ECNS115 fill:#1b4f72,stroke:#555,color:#fff
803+
style KPB116 fill:#1c4966,stroke:#555,color:#fff
804+
style MFCC0 fill:#7d6608,stroke:#555,color:#fff
805+
style MFCC1 fill:#7d6608,stroke:#555,color:#fff
806+
style MFCC2 fill:#7d6608,stroke:#555,color:#fff
807+
style MWW0 fill:#922b21,stroke:#555,color:#fff
808+
style MWW1 fill:#b7950b,stroke:#555,color:#fff
809+
style MWW2 fill:#d35400,stroke:#555,color:#fff
810+
style ARB fill:#4a235a,stroke:#555,color:#fff
811+
style HC12 fill:#2d5a27,stroke:#555,color:#fff
812+
style HC10 fill:#1e8449,stroke:#555,color:#fff
813+
style HC11 fill:#1e8449,stroke:#555,color:#fff
814+
style HC0 fill:#1e8449,stroke:#555,color:#fff
815+
style HC1 fill:#1e8449,stroke:#555,color:#fff
816+
style HC2 fill:#1e8449,stroke:#555,color:#fff
817+
style HC4 fill:#1e8449,stroke:#555,color:#fff
818+
style HC5 fill:#1e8449,stroke:#555,color:#fff
819+
style HC6 fill:#1e8449,stroke:#555,color:#fff
820+
style HC7 fill:#1e8449,stroke:#555,color:#fff
821+
style HC31 fill:#1e8449,stroke:#555,color:#fff
822+
style HC35 fill:#1e8449,stroke:#555,color:#fff
823+
```
824+
825+
#### Endpoint & PCM Configuration Matrix
826+
827+
| PCM ID | Stream Name | Direction | Channels | Sample Rate | Audio Formats | Pipelines | Processing / DSP Modules | D0i3 Compatible |
828+
|---|---|---|---|---|---|---|---|---|
829+
| **PCM 0** | `Jack Out` | Playback | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P0, P1 | SoundWire headphone playback (`host-copier.0.playback` -> `gain.0.1` -> `mixin.0.1` -> `mixout.1.1` -> `gain.1.1` -> `alh-copier.Playback-SimpleJack.0`) | No |
830+
| **PCM 1** | `Jack In` | Capture | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P11, P10 | SoundWire headset mic capture (`alh-copier.Capture-SimpleJack.0` -> `eqiir.11.0` -> `module-copier.11.0` -> `host-copier.1.capture`) | No |
831+
| **PCM 2** | `Speaker` | Playback | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P20, P21 | SoundWire SmartAmp speaker playback with post-mixer DSP chain (`host-copier.2.playback` -> `gain.20.1` -> `mixin.20.1` -> `mixout.21.1` -> `gain.21.1` -> `eqiir.21.1` -> `eqfir.21.1` -> `drc.21.1` -> `alh-copier.Playback-SmartAmp.0`) | No |
832+
| **PCM 4** | `Microphone` | Capture | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P41, P40 | SoundWire SmartMic capture with beamformer & compression (`alh-copier.Capture-SmartMic.0` -> `eqiir.41.0` -> `tdfb.40.1` -> `drc.40.1` -> `host-copier.4.capture`) | No |
833+
| **PCM 5** | `HDMI1` | Playback | 2–8 | 48 kHz | S16_LE, S32_LE | P50, P51 | Intel Display Audio HDMI/DP 1 (`host-copier.5.playback` -> `dai-copier.HDA.iDisp1.playback`) | No |
834+
| **PCM 6** | `HDMI2` | Playback | 2–8 | 48 kHz | S16_LE, S32_LE | P60, P61 | Intel Display Audio HDMI/DP 2 (`host-copier.6.playback` -> `dai-copier.HDA.iDisp2.playback`) | No |
835+
| **PCM 7** | `HDMI3` | Playback | 2–8 | 48 kHz | S16_LE, S32_LE | P70, P71 | Intel Display Audio HDMI/DP 3 (`host-copier.7.playback` -> `dai-copier.HDA.iDisp3.playback`) | No |
836+
| **PCM 10** | `DMIC Raw` | Capture | 4 | 16 kHz | S16_LE, S32_LE | P110, P118 | Continuous 4-channel unprocessed digital microphone capture directly from PDM DAI (`dai-copier.DMIC.dmic01.capture` -> `mixin.110.1` -> `mixout.118.1` -> `host-copier.10.capture`) | No |
837+
| **PCM 11** | `DMIC ECNS Capture` | Capture | 2 | 16 kHz | S16_LE, S32_LE | P110, P115, P117 | Continuous clean stereo audio capture processed through 20ms DP ECNS module (`ecns.115.1` -> `mixin.115.2` -> `mixout.117.1` -> `host-copier.11.capture`) | No |
838+
| **PCM 12** | `DMIC Multi-WOV` | Capture | 1 | 16 kHz | S16_LE, S32_LE | P110, P115, P116, P111-113, P114 | Gated mono Wake-on-Voice capture stream from 4-pin WOV Arbiter. Supports S0 keyword detection and D0i3 platform suspend/wake via AudioDSP MSI IRQ. | **Yes** (`capture_compatible_d0i3 true`) |
839+
| **PCM 31** | `Deepbuffer Jack Out` | Playback | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P15, P1 | Low-power deep-buffer playback to headphone jack (`host-copier.31.playback` -> `gain.15.1` -> `mixin.15.1` -> `mixout.1.1`) | No |
840+
| **PCM 35** | `Deepbuffer Speaker` | Playback | 2 | 48 kHz | S16_LE, S24_LE, S32_LE | P16, P21 | Low-power deep-buffer playback to SmartAmp speakers (`host-copier.35.playback` -> `gain.16.1` -> `mixin.16.1` -> `mixout.21.1`) | No |
841+
601842
---
602843

603844
## Wake-on-Voice (WoV) S0 / D0i3 Multi-Slot Testing & Verification

0 commit comments

Comments
 (0)