@@ -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