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
Draft
WIP: Add a rich developer, debug and test command suite to the SOF zephyr shell#10754lgirdwood wants to merge 21 commits intothesofproject:mainfrom
lgirdwood wants to merge 21 commits intothesofproject:mainfrom
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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: