Skip to content

WIP: Add a rich developer, debug and test command suite to the SOF zephyr shell#10754

Draft
lgirdwood wants to merge 21 commits intothesofproject:mainfrom
lgirdwood:topic/shell
Draft

WIP: Add a rich developer, debug and test command suite to the SOF zephyr shell#10754
lgirdwood wants to merge 21 commits intothesofproject:mainfrom
lgirdwood:topic/shell

Conversation

@lgirdwood
Copy link
Copy Markdown
Member

@lgirdwood lgirdwood commented May 7, 2026

Add a rich shell full of useful commands that can be used to develop, debug and test code for both humans and agent.

Still WIP, but it also needs thesofproject/linux@topic/sof-dev...lgirdwood:linux:topic/serial to add a SOF client driver to Linux that creates a TTY and a debugFS for loading modules at runtime via shell.

TODO:

  1. Add more commands. Pls make suggestions.
  2. Make this cold and live in IMR.
  3. Make this into a llext debug module that can be loaded as needed.
  4. Add GDB support including polling into this debug module and hook it into exception handlers, including triple fault.

lrgirdwo added 21 commits May 7, 2026 20:52
Add a "SOF shell commands" Kconfig menu (depends on SHELL) with
per-feature symbols that gate each group of diagnostic commands:

  SOF_SHELL_HEAP_USAGE     - module heap usage (default y)
  SOF_SHELL_PIPELINE_STATUS - IPC4 pipeline list (default y)
  SOF_SHELL_MODULE_STATUS  - IPC4 component list (default y)
  SOF_SHELL_CORE_STATUS    - DSP core enable/active states (default y)
  SOF_SHELL_SRAM_STATUS    - HPSRAM heap stats (default y,
                             depends SYS_HEAP_RUNTIME_STATS)
  SOF_SHELL_CLOCK_STATUS   - CPU clock frequency per core (default y,
                             depends !SOF_ZEPHYR_NO_SOF_CLOCK)
  SOF_SHELL_MODULE_LIST    - firmware manifest module list (default y)
  SOF_SHELL_PIPELINE_OPS   - IPC4 pipeline/module construction
                             (default n, depends IPC_MAJOR_4)
  SOF_SHELL_MMU_DBG        - MMU/TLB debug commands (default y,
                             depends MM_DRV_INTEL_ADSP_MTL_TLB || XTENSA_MMU)

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Expand sof_shell.c with a set of diagnostic status commands that
require no active audio stream, add conditional includes, Kconfig
guards and __cold placement for all shell handlers.

New includes (conditional on feature guards):
  - sof/audio/component.h, component_ext.h, pipeline.h, ipc/topology.h
  - sof/lib/cpu.h, memory.h, rtos/clk.h, rtos/alloc.h
  - zephyr/sys/sys_heap.h (CONFIG_SYS_HEAP_RUNTIME_STATS)

Fixes:
  - cmd_sof_module_heap_usage: annotate __cold, add "no components"
    message when the IPC component list is empty, remove redundant
    "max" field that doubled the per-entry output.

New commands:
  sof pipeline_status  (CONFIG_SOF_SHELL_PIPELINE_STATUS)
    Lists all IPC4 pipelines: id, core, priority, period_us, state.

  sof module_status    (CONFIG_SOF_SHELL_MODULE_STATUS)
    Lists all IPC4 components: comp_id, pipeline, core, state.
    Shares a comp_state_str() helper with pipeline_status.

  sof core_status      (CONFIG_SOF_SHELL_CORE_STATUS)
    Reports enabled/active state for each DSP core.

  sof sram_status      (CONFIG_SOF_SHELL_SRAM_STATUS)
    Reports HPSRAM heap allocated/free/peak via sys_heap_runtime_stats_get().

  sof clock_status     (CONFIG_SOF_SHELL_CLOCK_STATUS)
    Reports current CPU clock frequency (Hz and MHz) per core.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add "sof module_list" command (CONFIG_SOF_SHELL_MODULE_LIST):

On IPC4 Intel platforms (CONFIG_IPC4_BASE_FW_INTEL) the firmware
manifest embedded in the binary is walked and each module entry is
printed with:
  - 8-char module name from the manifest
  - UUID
  - max instance count
  - BSS memory per instance (bytes)
  - text segment size (bytes)
  - affinity mask
  - CPC / IBS / OBS from the default module configuration

When CONFIG_LIBRARY_MANAGER is enabled, loaded shared libraries are
also enumerated via lib_manager_get_module_manifest().

If the Intel manifest is not available, the command falls back to
walking the registered component driver list and printing the
component type (UUID) and name from the driver trace context.

Also add parse_module_id() helper: accepts a module name
(case-insensitive, checked against manifest + library manifest) or a
numeric module ID, returning the resolved numeric ID. This helper is
used by the pipeline-ops commands added in the next patch.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add seven shell commands for DSP-side audio pipeline construction and
teardown (CONFIG_SOF_SHELL_PIPELINE_OPS, depends IPC_MAJOR_4).
These are designed for bring-up and debug; UCM/HAL should be used for
production audio paths.

  sof ppl_create <ppl_id> [prio=0] [pages=2] [core=0] [lp=0]
    Allocate and initialise a new IPC4 pipeline via
    ipc4_pipeline_create().

  sof ppl_delete <ppl_id>
    Delete a pipeline and all module instances belonging to it via
    ipc4_pipeline_delete().

  sof ppl_state <ppl_id> <running|paused|reset>
    Drive the pipeline FSM with ipc4_pipeline_set_state().

  sof mod_init <mod_id> <inst_id> <ppl_id> [core=0] [dp=0]
    Instantiate a module via ipc4_init_module_instance().
    <mod_id> accepts either a numeric ID or a module name resolved
    case-insensitively through parse_module_id() against the firmware
    manifest (built-in modules and loaded libraries).
    dp=0 selects LL scheduling; dp=1 selects a DP Zephyr thread.

  sof mod_delete <mod_id> <inst_id>
    Release a module instance via ipc4_deinit_module_instance().

  sof mod_bind <src_mod> <src_inst> <dst_mod> <dst_inst> [sq=0] [dq=0]
    Connect the output queue of the source module to the input queue
    of the destination module via ipc4_module_bind().

  sof mod_unbind <src_mod> <src_inst> <dst_mod> <dst_inst> [sq=0] [dq=0]
    Disconnect two previously bound module instances via
    ipc4_module_unbind().

Module IDs in mod_* commands accept both names (e.g. "COPIER") and
numeric IDs; the helper parse_module_id() introduced in the previous
patch is reused for the lookup.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add three MMU/TLB debug commands under CONFIG_SOF_SHELL_MMU_DBG
(default y when CONFIG_MM_DRV_INTEL_ADSP_MTL_TLB is set):

  sof mmu_status
    Reports the Intel ADSP MTL virtual memory layout: VM base/size,
    page size, total/mapped/free page counts, TLB MMIO base address,
    and the paddr_size / enable / exec / write bit positions read from
    the device tree node "tlb". Also walks sys_mm_drv_query() to list
    mapped memory regions.

  sof tlb_dump
    Iterates every entry in the 16-bit MMIO TLB table and prints a
    row for each active (enable-bit set) entry:
      index, virtual address, physical address, R/W/X flags, raw
      entry word and the HPSRAM 128 KB EBB bank number.

  sof tlb_lookup <vaddr> [end_vaddr]
    Queries one or more 4 KB pages. For each page prints:
    virtual address, physical address (or "not mapped"), R/W/X flags,
    bank index and raw entry word.

TLB entry field positions are read from DT properties
(paddr_size, exec_bit_idx, write_bit_idx) via DT_PROP macros on
DT_NODELABEL(tlb), making the code portable across MTL/ARL/PTL
board variants.

All handlers and string tables are annotated __cold / __cold_rodata
so the linker places them in cold-code sections.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Extend CONFIG_SOF_SHELL_MMU_DBG with two commands for platforms that
have the Xtensa software MMU (CONFIG_XTENSA_MMU=y, e.g. PTL).
These commands probe the hardware DTLB directly using the Xtensa ISA
instructions pdtlb / rdtlb0 / rdtlb1 / rsr.RASID.

  sof rasid
    Reads the RASID special-purpose register and decodes each of its
    four 8-bit fields as the ring-to-ASID mapping:
      ring 0 (kernel), ring 1 (unused), ring 2 (user), ring 3 (shared).

  sof page_info <vaddr> [end_vaddr]
    For each 4 KB page in the given range:
      1. Probe the DTLB with pdtlb(vaddr) — if bit 4 is clear the
         hardware TLB does not have a current entry for that VA and
         "DTLB miss" is reported.
      2. On a hit, read rdtlb0 (VPN | ring[5:4] | CA[3:0]) and
         rdtlb1 (PPN[31:12]) to extract:
           - physical address
           - ring number (0-3) and symbolic name
           - ASID (looked up from RASID via ring index)
           - R/W/X permission bits from the CA field
           - cache mode (WB / WT / uncached / illegal)

Four inline-asm helpers (shell_pdtlb, shell_rdtlb0, shell_rdtlb1,
shell_rsr_rasid) are added in anonymous-block scope; they are NOT
marked __cold because inline-asm functions cannot be placed in
non-default sections.

The SOF_SHELL_MMU_DBG Kconfig depends clause is widened to
"MM_DRV_INTEL_ADSP_MTL_TLB || XTENSA_MMU" so the option is also
visible on pure-MMU platforms that do not have the ADSP MMIO TLB.
On PTL, which has both, all five commands (mmu_status, tlb_dump,
tlb_lookup, rasid, page_info) are compiled in.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Adds a new 'sof llext_load <name> [lib_id]' shell command that lets a
developer load a compiled llext module from the host file system into the
DSP at run time without a full firmware restart.

The command implements the DSP side of a 2-step handshake:
 Step 1 (DSP): allocates an ADSP debug window slot (ADSP_DW_SLOT_LLEXT_LOAD),
   writes the library name and lib_id, then sets state = REQUESTING and
   polls (up to 120 s) for the host to complete the DMA transfer.
 Step 2 (host): cat module.ri > /sys/kernel/debug/sof/llext_load
   The kernel snd-sof-llext-load client reads the slot, drives the HDA
   code-loader DMA (IPC4 LOAD_LIBRARY_PREPARE + LOAD_LIBRARY), and writes
   the result back.  The DSP command wakes up and prints the outcome.

New files:
  zephyr/include/sof/shell_llext_load.h — shared mailbox struct and
    handshake state enum (binary layout must match shell-llext-shm.h on
    the Linux side).
  app/no_auth_llext_overlay.conf — Kconfig overlay that disables CSE
    library authentication for testing on hardware without OTC key support.

Other changes in this commit:
  app/shell_overlay.conf — enable shell log backend and CONFIG_SOF_SHELL_LLEXT_LOAD.
  zephyr/Kconfig — add SOF_SHELL_LLEXT_LOAD and SOF_SHELL_LLEXT_LOAD_SLOT_NUM options.
  zephyr/sof_shell.c — implement cmd_sof_llext_load(); fix ulong → unsigned long
    in strtoul callers to silence -Wconversion warnings.
  src/ipc/ipc4/handler-kernel.c — map errno values to specific IPC4 error codes
    for easier diagnosis from dmesg; call log_panic() before replying on failure.
  src/library_manager/lib_manager.c — extend DMA timeout to 600 ms, add
    diagnostic logging (write-position tracking, store-data errors).
  src/library_manager/llext_manager.c — add tr_err logging in llext_load /
    link failure paths for easier post-mortem analysis.

Requires CONFIG_SND_SOC_SOF_CLIENT_LLEXT_LOAD in the Linux kernel.
Requires zephyr patch: intel/adsp: add ADSP_DW_SLOT_LLEXT_LOAD debug window slot type.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
…cludes

Two fixes:

1. Update the 'sof llext_load' shell command help text and the
   'On host:' hint message to recommend 'dd' instead of 'cat'.
   The sof_llext_dfs_write debugfs handler requires the full library
   binary in a single write() syscall, which 'cat' does not guarantee
   for files larger than ~BUFSIZ (~16 KB).  Using dd with bs=<filesize>
   ensures the entire binary is written atomically.

2. Fix bad includes in lib_manager.c that caused build failures:
   Replace the non-existent <drivers/dma/dma_intel_adsp_hda.h> and
   <intel_adsp_hda.h> with the correct <zephyr/drivers/dma.h> needed
   for dma_get_status() via the Zephyr DMA API.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add two new DSP shell subcommands:

  sof llext_list
    Iterates ext_library.desc[] and prints all llext libraries currently
    held in IMR/DRAM cold storage.  For each library:
      base address, storage size (preload_page_count * PAGE_SZ), manifest
      module count, and llext ELF-file count.
    When CONFIG_LLEXT is enabled and modules have been loaded, also prints
    per-ELF-file state: module name, DRAM=yes, SRAM=yes/no, Zephyr llext
    use_count, and aux-dependency count.

  sof llext_purge <lib_id>
    Calls lib_manager_purge_library() to free the named library slot from
    IMR/DRAM.  Returns -EBUSY if any ELF file still has mapped=true or
    n_dependent>0 (an active pipeline references it).

lib_manager_purge_library() is added to lib_manager.c:
  - validates lib_id range and base_addr presence
  - under CONFIG_LLEXT: refuses if any mod[i].mapped or n_dependent>0
  - frees ctx->mod, ctx->base_addr, ctx, and clears desc[lib_id]
  - logs trace on success

New Kconfig options (default y, depend on SHELL && LIBRARY_MANAGER):
  CONFIG_SOF_SHELL_LLEXT_LIST
  CONFIG_SOF_SHELL_LLEXT_PURGE

Both are enabled in app/shell_overlay.conf alongside LLEXT_LOAD.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
…trol

Add two new DSP shell subcommands:

  sof core_on <core_id>
    Powers on a secondary DSP core by calling cpu_enable_core().
    On platforms with CONFIG_PM this maps to k_smp_cpu_start() on
    first boot or k_smp_cpu_resume() on subsequent wakes, both
    running secondary_core_init() on the target CPU.
    Reports success or the error code from cpu_enable_core().

  sof core_off <core_id>
    Powers off a secondary DSP core by calling cpu_disable_core().
    Requests PM_STATE_SOFT_OFF on the core, broadcasts an IPI,
    then waits up to CONFIG_SECONDARY_CORE_DISABLING_TIMEOUT ms
    for the core to halt before asserting the reset line.
    Reports -EIO if the core fails to go inactive within the
    timeout window.

Both commands:
  - Accept only core IDs in [1 .. CONFIG_CORE_COUNT-1]; core 0
    (primary) is explicitly rejected.
  - Are no-ops (with an informational message) if the core is
    already in the requested state.

New Kconfig option (default y, depends on SHELL && MULTICORE && SMP):
  CONFIG_SOF_SHELL_CORE_POWER
Enabled in app/shell_overlay.conf.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Make sure qemu will build in shell and that we dont immediately quit.
Make sure the scripts know about the shell too.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add vpage_info() and vregion_info_all() helpers that print the
virtual page allocator state and the list of active virtual regions
to a Zephyr shell context. Track all vregions in a global linked
list protected by a mutex so they can be enumerated.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add four new SOF shell commands:

  - vpage_status:    dump virtual page allocator state
  - vregion_status:  dump all active virtual regions
  - pipeline_list:   list active audio pipelines
  - module_list:     list active audio modules

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
…mmands

Add a small struct ipc_stats and helpers (ipc_stats_record_rx,
ipc_stats_record_tx, ipc_stats_inc_rx_error, ipc_stats_get,
ipc_stats_reset) that track per-image counters and a snapshot of the
most recent IPC RX and TX headers (pri/ext words and platform-cycle
timestamps).

The hooks are placed in the platform RX/TX paths in ipc-zephyr.c so
both IPC3 and IPC4 are covered without touching the dispatch
handlers, except for the IPC4 unknown-target case which now bumps
rx_errors.

Two new SOF shell commands expose the counters:

  - sof ipc_stats [reset]   show or clear RX/TX counters
  - sof ipc_last            show last RX and TX headers + timestamps

Also add zephyr/shell.md tracking the functional areas of SOF that
still lack shell coverage and mark task 1 (this commit) as done.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add two SOF shell commands for inspecting audio buffers at runtime:

  - sof buffer_list           list every audio buffer with src/sink
                              component IDs, fill level, channels,
                              rate and frame format
  - sof buffer_info <id>      detailed info for a single buffer:
                              src/sink, core, flags, size/avail/free
                              bytes, rptr, wptr, channels, rate, fmt

Buffers are enumerated by walking ipc->comp_list and visiting each
component's bsink_list via comp_dev_get_first/next_data_consumer().
This works on both IPC3 and IPC4 since every buffer is the sink of
exactly one source component.

A new Kconfig CONFIG_SOF_SHELL_BUFFER_INFO (default y) gates the
commands. Update zephyr/shell.md to mark task 2 as done and document
the new commands.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add a new optional op scheduler_dump_tasks() to struct scheduler_ops
which iterates the scheduler-private task list under the
scheduler-private lock, calling a callback for each task.

Implement it for the Zephyr LL, TWB and DP schedulers; the xtos LL
scheduler is left untouched (not built on the Zephyr ACE targets we
need to debug).

Add two new SOF shell commands gated by CONFIG_SOF_SHELL_SCHED_INFO
(default y):

  - sof sched_tasks  list every task across all schedulers with type,
                     core, priority, state, flags and uid
  - sof sched_load   per-task cycle counters (count, sum, max, derived
                     average) plus aggregate totals; pairs with the
                     existing test_inject_sched_gap

Cycle figures come from struct task::cycles_{sum,max,cnt} which the
schedulers already maintain. Update zephyr/shell.md to mark task 3 as
done.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add two new SOF shell commands for in-firmware log introspection
without rebuilding or attaching host-side tooling.

  sof log_status   - list every Zephyr log backend with its index,
                     internal id, active/inactive state and name,
                     plus the total number of registered log sources
                     in the local domain. Read-only, uses Zephyr's
                     public log_backend_*/log_src_cnt_get() API.

  sof mtrace_dump  - snapshot the unread portion of the ADSP mtrace
                     SRAM ring buffer and print it to the shell
                     without advancing host_ptr, so the host-side
                     mtrace-reader.py keeps receiving the same bytes.

The mtrace slot is re-acquired through adsp_dw_request_slot() when
CONFIG_INTEL_ADSP_DEBUG_SLOT_MANAGER=y (the slot manager returns the
already allocated slot), otherwise via ADSP_DW->slots[] directly. The
slot layout mirrors the one in zephyr/subsys/logging/backends/
log_backend_adsp_mtrace.c.

Two new Kconfigs (default y):
  CONFIG_SOF_SHELL_LOG_INFO     (depends on LOG)
  CONFIG_SOF_SHELL_MTRACE_DUMP  (depends on LOG_BACKEND_ADSP_MTRACE)

Per-source runtime log_level was intentionally not added: it would
require CONFIG_LOG_RUNTIME_FILTERING=y (extra per-call overhead) and
Zephyr already ships an equivalent 'log' shell command
(CONFIG_LOG_CMDS=y). Update zephyr/shell.md.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add two new SOF shell commands for poking at SRAM diagnostics
regions from the live shell, without host-side tooling.

  sof mailbox_hex                          - list the four SOF mailbox
                                             regions (exception, dspbox,
                                             hostbox, debug)
  sof mailbox_hex <region> [off] [len]     - hex-dump that region; off
                                             and len are clamped to the
                                             region size, default 256B

  sof dbgwin_dump                          - list all 15 ADSP debug-
                                             window slot descriptors
                                             (resource_id, type, vma,
                                             decoded type name, core)
  sof dbgwin_dump <slot> [len]             - hex-dump one slot, max
                                             ADSP_DW_SLOT_SIZE (=4096)

mailbox_hex uses the existing MAILBOX_*_BASE/SIZE macros from
sof/lib/mailbox.h. dbgwin_dump re-derives window 2 base from the
device tree (mem_window2) plus WIN2_OFFSET and mirrors struct
adsp_debug_window from
zephyr/soc/intel/intel_adsp/common/debug_window.c, accessed through
an uncached pointer so it works whether or not
CONFIG_INTEL_ADSP_DEBUG_SLOT_MANAGER=y. Both commands share a small
sof_shell_hex_dump() helper.

Two new Kconfigs (default y):
  CONFIG_SOF_SHELL_MAILBOX_HEX
  CONFIG_SOF_SHELL_DBGWIN_DUMP    (depends on SOC_FAMILY_INTEL_ADSP)

Quick-win 5 was originally listed as crash_log/bt; pivoted because
SOF's in-tree panic_dump() is not compiled on Zephyr (Zephyr installs
its own fatal handler) and a live shell cannot backtrace its own CPU
after a panic. mailbox_hex exception still surfaces whatever the
platform-specific fatal path leaves there, covering the same
diagnostic intent as far as is possible from a running shell.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add a new SOF shell command exposing the existing telemetry /
performance_monitor counters from the live shell.

  sof perf_status              - print the ipc4_perf_measurements_state
                                 (disabled/stopped/started/paused) and
                                 per-active-core systick counters from
                                 the SOF telemetry slot (count,
                                 last/max time elapsed, avg_kcps,
                                 peak_kcps, peak4k, peak8k)
  sof perf_status reset        - reset_performance_counters()
  sof perf_status start        - enable_performance_counters() and
                                 transition state to STARTED
  sof perf_status stop|pause   - transition state without zeroing
                                 counters (useful for snapshots)

Per-core data is read via telemetry_get_systick_info_ptr() when the
debug slot manager is enabled, otherwise directly from
ADSP_DW->slots[SOF_DW_TELEMETRY_SLOT]. We iterate only cores enabled
in cpu_enabled_cores() so the output matches the active topology and
matches what get_performance_data() would put on the IPC.

New Kconfig CONFIG_SOF_SHELL_PERF_STATUS (default y, depends on
SOF_TELEMETRY).

The full per-component perf_data_item_comp array (potentially
hundreds of items in MW3) is intentionally not dumped here; that will
land separately as 'perf_components' once there's a stream-friendly
iterator. cpu_load is already available via Zephyr's 'kernel
cpu_load' so it is not duplicated.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add two read-only introspection commands to the SOF shell:

- 'sof dai_list' iterates dai_get_device_list() and prints, per DAI,
  the Zephyr device name, decoded type (ssp/dmic/hda/alh/uaol/sai/
  esai/...), index, current channel count, sample rate, format and
  word size from dai_config_get(), plus per-direction fifo address,
  fifo depth, DMA handshake id and stream id from
  dai_get_properties().

- 'sof dma_status [dma_idx [chan]]' walks dma_info_get()->dma_array
  to list every SOF-registered DMAC (id, channel count, busy count,
  caps/devs bitmasks, base, Zephyr device name) and uses
  sof_dma_get_status() for per-channel state (busy, direction,
  pending/free bytes, read/write positions, total_copied).

Two new Kconfigs (default y, depend on SHELL && ZEPHYR_NATIVE_DRIVERS):
  CONFIG_SOF_SHELL_DAI_LIST
  CONFIG_SOF_SHELL_DMA_STATUS

Pairs with 'sof pipeline_state' for diagnosing P2M/M2P paths without
host-side debug.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Add 'sof kctl_list', a read-only walker over the IPC component
list that prints, per component, the comp_id, pipeline_id, core,
decoded module name (volume / gain / mixin / mixout / eqiir / src /
...) taken from cd->drv->tctx->uuid_p->name, a coarse 'kind' tag
(volume / mixer / blob / config) for control-bearing modules, and
the current comp_state.

Module-adapter components all share SOF_COMP_MODULE_ADAPTER for
drv->type, so the UUID-derived name string is the only stable
per-module label available in firmware. This is enough to identify
which comp_id carries which control before driving the value
through host-side tools.

kctl_get / kctl_set are intentionally not implemented in firmware:
control values flow through per-module IPC4 large_config blobs
(set_configuration / get_configuration), each with their own
config_id namespace and TLV layout, which would duplicate the
host-side tplg / IPC marshalling. Use tinymix / sof-ctl for that.

New Kconfig (default y, depends on SHELL):
  CONFIG_SOF_SHELL_KCTL_LIST

This concludes the documented quick-win list in zephyr/shell.md.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
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.

2 participants