Skip to content

topology2: uaol: Expose both stream pairs of the UAOL link - #11395

Merged
lgirdwood merged 3 commits into
thesofproject:mainfrom
ujfalusi:peter/pr/uaol-all-streams
Nov 3, 2026
Merged

lgirdwood merged 3 commits into
thesofproject:mainfrom
ujfalusi:peter/pr/uaol-all-streams

Conversation

@ujfalusi

@ujfalusi ujfalusi commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

A UAOL link runs two streams per direction and the kernel now creates a backend for each of them (UAOL-Play / UAOL-Cap, in the order Play0, Cap0, Play1, Cap1). This PR makes the topologies follow: the UAOL function exposes two PCMs, UAOL0 (21) and UAOL1 (22), each with a deep buffer (23, 24), on both the cavs-uaol function topology of the sof_sdw card and the development sof-hda-generic-uaol.

Second stream pair — backends renamed to UAOL0-Play0/UAOL0-Cap0, second pair added in platform/intel/uaol-stream1.conf behind UAOL_NUM_STREAMS. The names stay short on purpose: alsa-lib keeps element ids in SNDRV_CTL_ELEM_ID_NAME_MAXLEN bytes and a dai-copier widget name of 38+ characters silently loses one of its tuple sections. The sof-uaol-idN variants take the IDs of all four backends.
Deep buffer per stream — platform/intel/uaol-deep-buffer.conf / uaol-deep-buffer1.conf are instances of their own instead of the global deep-buffer.conf, which can only be included once per topology; that lets sof-hda-generic-uaol have them next to the HDA jack's.
sof-hda-generic-idisp-uaol — the development topology without the HDA codec paths, for HDMI-only machines.
Kernel side: the backend-per-stream series on the SOF UAOL branch. A kernel without it does not load these topologies, and the previous single-pair topologies do not load on the new kernel; UAOL has not shipped anywhere yet, so there is nothing to stay compatible with.

Tested on PTL with the sof_sdw card (CUBILUX CA7, two USB PCMs) and the HDA card (Sennheiser full-speed + Yamaha MG-XU with feedback): each PCM and deep buffer alone and all together, 2 playback + 2 capture concurrently, and the route selection controls.

A UAOL link runs two streams per direction on the current hardware, and
the kernel creates a backend for each of them, named UAOL<link>-Play<n>
and UAOL<link>-Cap<n> in the order Play0, Cap0, Play1, Cap1. The first
pair keeps the two consecutive dai link IDs it had.

Rename the backends of the UAOL function to UAOL0-Play0 and UAOL0-Cap0
and take the hw_config names from the same variables. Add the second
pair of paths in platform/intel/uaol-stream1.conf, the same paths on the
UAOL_*1_* variables, pulled in when UAOL_NUM_STREAMS is 2. Its deep
buffer is a second instance of the deepbuffer-playback pipeline in
platform/intel/uaol-deep-buffer1.conf, on the UAOL_DB1_* variables,
because platform/intel/deep-buffer.conf works on the global DEEP_BUFFER_*
variables and can only be pulled in once. Both the development
sof-hda-generic-uaol topology and the cavs-uaol function topology of the
sof_sdw card expose both pairs, UAOL0 on PCM 21 and UAOL1 on PCM 22, the
PCM names carrying the same ordinal as the route kcontrols; the sof_sdw
one has a deep buffer for each, on PCM 23 and 24. The sof-uaol-id
variants take the IDs of all four backends.

The backend names stay abbreviated: alsa-lib keeps element ids in
SNDRV_CTL_ELEM_ID_NAME_MAXLEN bytes, so once the dai-copier widget name
'dai-copier.UAOL.<backend>.<direction>' reaches 38 characters the ids of
its 'dai.word' and 'dai.string' tuple sections collide and one set is
silently dropped from the topology.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
The development sof-hda-generic-uaol topology had no deep buffer for its
UAOL PCMs: the first stream's deep buffer came from
platform/intel/deep-buffer.conf, which builds its pipeline and PCM from
the global DEEP_BUFFER_* variables and so can only be pulled in once per
topology, and the HDA jack of sof-hda-generic already has that one.

Give the first stream a deep buffer instance of its own, the way the
second stream already has: platform/intel/uaol-deep-buffer.conf, the
deepbuffer-playback pipeline on the UAOL_DB_* variables, routed into the
mixer of the stream itself. UAOL_DEEP_BUFFER now only says whether a
topology wants the UAOL deep buffers at all, independent of any other
deep buffer it has. The cavs-uaol function topology keeps its two on PCM
23 and 24, and sof-hda-generic-uaol gets the same pair next to the
Deepbuffer HDA Analog PCM.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
…-only machines

sof-hda-generic-uaol carries the HDA codec paths, which the machine
driver would have dropped by picking sof-hda-generic-idisp on a machine
with only an iDisp codec; with the topology named through tplg_filename
that selection does not happen, and a backend for a codec the machine
does not have fails the whole topology.

Build the same file once more without HDA_CONFIG as sof-hda-generic-idisp-uaol,
the HDMI passthrough paths of sof-hda-generic-idisp plus the UAOL
function, for testing the USB audio offload on such a machine.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The incompatible backend layout requires validation against the unavailable companion UAOL kernel series, including both machine drivers’ four-backend mapping and loading of the new HDMI-only HDA variant.

No open issues 🎉

What changed in this PR

Updates SOF topology2 definitions to expose both UAOL stream pairs, matching the kernel’s four-backend layout. These topologies require the corresponding kernel changes.

Changes:

  • Exposes UAOL0 and UAOL1 PCMs with separate playback and capture backends.
  • Adds a dedicated deep-buffer PCM for each stream pair, allowing coexistence with HDA deep buffers.
  • Adds an HDMI-only UAOL development target and updates backend IDs and documentation.
File Description
tools/​topology/​topology2/​README.md Documents PCM and pipeline IDs for both stream pairs and deep buffers.
tools/​topology/​topology2/​production/​tplg-targets-sdca-generic.cmake Assigns four backend IDs to each UAOL function variant.
tools/​topology/​topology2/​platform/​intel/​uaol-stream1.conf Defines the second stream pair’s backends, pipelines, PCM, and routes.
tools/​topology/​topology2/​platform/​intel/​uaol-generic.conf Uses a dedicated deep buffer and conditionally includes the second pair.
tools/​topology/​topology2/​platform/​intel/​uaol-deep-buffer1.conf Adds the second pair’s deep-buffer PCM and routing.
tools/​topology/​topology2/​platform/​intel/​uaol-deep-buffer.conf Adds the first pair’s independent deep-buffer PCM and routing.
tools/​topology/​topology2/​development/​tplg-targets.cmake Registers the HDMI-only UAOL development target.
tools/​topology/​topology2/​development/​sof-hda-generic-uaol.conf Enables both stream pairs and deep buffers in the HDA topology.
tools/​topology/​topology2/​cavs-uaol.conf Configures both stream pairs and deep buffers for the SoundWire function topology.

Review effort: Balanced

@intel-sofci

intel-sofci commented Nov 3, 2026 •

Copy link
Copy Markdown

PR 11395: test results

Run date: 2026-11-03 15:11 UTC

Tested commit: b52f44da7f8579c040648d11704d52c9a5afeb44

mtl pass rate lnl pass rate ptl pass rate wcl pass rate nvl pass rate

@lgirdwood
lgirdwood merged commit 0b0592c into thesofproject:main Nov 3, 2026
44 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants