Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ target_sources(app PRIVATE
)

zephyr_library_include_directories(app PUBLIC
${sof_module}/src/arch/xtensa/include
${sof_module}/src/include
${CMAKE_CURRENT_SOURCE_DIR}/../src/arch/xtensa/include
${CMAKE_CURRENT_SOURCE_DIR}/../src/include
)
5 changes: 5 additions & 0 deletions app/boards/qemu_xtensa_dc233c.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SPDX-License-Identifier: BSD-3-Clause
CONFIG_IPC_MAJOR_4=y
CONFIG_ZTEST=y
CONFIG_MM_DRV=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
7 changes: 7 additions & 0 deletions app/boards/qemu_xtensa_dc233c_mmu.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# SPDX-License-Identifier: BSD-3-Clause
CONFIG_IPC_MAJOR_4=y
CONFIG_USERSPACE=y
CONFIG_ZTEST=y
CONFIG_TEST_USERSPACE=y
CONFIG_MM_DRV=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
11 changes: 10 additions & 1 deletion app/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,16 @@
*/

#include <zephyr/kernel.h>

#include <sof/boot_test.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);

/* define qemu boot tests if any qemu target is defined, add targets to end */
#if defined(CONFIG_BOARD_QEMU_XTENSA_DC233C) ||\
defined(CONFIG_BOARD_QEMU_XTENSA_DC233C_MMU)
#define QEMU_BOOT_TESTS
#endif

/**
* Should be included from sof/schedule/task.h
* but triggers include chain issue
Expand Down Expand Up @@ -54,6 +60,9 @@ static int sof_app_main(void)
void test_main(void)
{
sof_app_main();
#if CONFIG_SOF_BOOT_TEST && defined(QEMU_BOOT_TESTS)
sof_run_boot_tests();
#endif
}
#else
int main(void)
Expand Down
8 changes: 8 additions & 0 deletions scripts/set_xtensa_params.sh
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,12 @@ case "$platform" in
HOST="xtensa-mt8365-elf"
TOOLCHAIN_VER="RG-2018.9-linux"
;;
qemu_xtensa | qemu_xtensa_mmu)
PLATFORM="$1"
XTENSA_CORE=""
HOST="xtensa-zephyr-elf"
TOOLCHAIN_VER=""
;;
*)
>&2 printf 'Unknown xtensa platform=%s\n' "$platform"
return 1
Expand All @@ -166,6 +172,8 @@ esac

# For Zephyr unit tests
case "$platform" in
qemu_xtensa | qemu_xtensa_mmu)
ZEPHYR_TOOLCHAIN_VARIANT='zephyr';;
imx8*|mtl|lnl)
ZEPHYR_TOOLCHAIN_VARIANT='xt-clang';;
*) # The previous, main case/esac already caught invalid input.
Expand Down
16 changes: 14 additions & 2 deletions scripts/xtensa-build-zephyr.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,14 @@ class PlatformConfig:
"imx", "imx95_evk/mimx9596/m7/ddr",
"", "", "", ""
),
"qemu_xtensa" : PlatformConfig(
"zephyr", "qemu_xtensa/dc233c",
"", "", "zephyr"
),
"qemu_xtensa_mmu" : PlatformConfig(
"zephyr", "qemu_xtensa/dc233c/mmu",
"", "", "zephyr"
),
}

platform_configs = platform_configs_all.copy()
Expand Down Expand Up @@ -894,6 +902,7 @@ def build_platforms():
platform_build_dir_name = f"build-{platform}"

PLAT_CONFIG = platform_dict["PLAT_CONFIG"]

build_cmd = ["west"]
build_cmd += ["-v"] * args.verbose
if args.menuconfig:
Expand Down Expand Up @@ -1144,8 +1153,9 @@ def install_platform(platform, sof_output_dir, platf_build_environ, platform_wco
install_key_dir = install_key_dir / args.key_type_subdir

os.makedirs(install_key_dir, exist_ok=True)
# looses file owner and group - file is commonly accessible
shutil.copy2(abs_build_dir / "zephyr.ri", install_key_dir / output_fwname)
# looses file owner and group - file is commonly accessible, dont install qemu.
if platform not in ("qemu_xtensa", "qemu_xtensa_mmu"):
shutil.copy2(abs_build_dir / "zephyr.ri", install_key_dir / output_fwname)

if args.deployable_build and platform_configs[platform].ipc4:
# IPC4 deployable builds are using separate directories per platforms
Expand Down Expand Up @@ -1298,6 +1308,8 @@ def gzip_compress(fname, gzdst=None):
RI_INFO_UNSUPPORTED += ['imx8', 'imx8x', 'imx8m', 'imx8ulp', 'imx95']
RI_INFO_UNSUPPORTED += ['rn', 'acp_6_0']
RI_INFO_UNSUPPORTED += ['mt8186', 'mt8188', 'mt8195', 'mt8196', 'mt8365']
RI_INFO_UNSUPPORTED += ['qemu_xtensa', 'qemu_xtensa_mmu']


# For temporary workarounds. Unlike _UNSUPPORTED above, the platforms below will print a warning.
RI_INFO_FIXME = [ ]
Expand Down
3 changes: 3 additions & 0 deletions src/audio/module_adapter/module/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,8 @@ EXPORT_SYMBOL(z_impl_mod_free);

#ifdef CONFIG_USERSPACE
#include <zephyr/internal/syscall_handler.h>

#if CONFIG_FAST_GET
const void *z_vrfy_mod_fast_get(struct processing_module *mod, const void * const dram_ptr,
size_t size)
{
Expand All @@ -424,6 +426,7 @@ const void *z_vrfy_mod_fast_get(struct processing_module *mod, const void * cons
return z_impl_mod_fast_get(mod, dram_ptr, size);
}
#include <zephyr/syscalls/mod_fast_get_mrsh.c>
#endif

void *z_vrfy_mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t size,
size_t alignment)
Expand Down
2 changes: 2 additions & 0 deletions src/platform/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ elseif(CONFIG_MT8196)
add_subdirectory(mt8196)
elseif(CONFIG_MT8365)
add_subdirectory(mt8365)
elseif(PLATFORM STREQUAL "qemu_xtensa")
add_subdirectory(qemu_xtensa)
endif()
3 changes: 3 additions & 0 deletions src/platform/qemu_xtensa/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# SPDX-License-Identifier: BSD-3-Clause

add_local_sources(sof platform.c)
13 changes: 13 additions & 0 deletions src/platform/qemu_xtensa/include/platform/lib/clk.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_LIB_CLK_H__
#define __PLATFORM_LIB_CLK_H__

/* Dummy clk header for qemu_xtensa */
#define CLK_MAX_CPU_HZ 10000000
#define CPU_LOWEST_FREQ_IDX 0

#endif /* __PLATFORM_LIB_CLK_H__ */
11 changes: 11 additions & 0 deletions src/platform/qemu_xtensa/include/platform/lib/dai.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_LIB_DAI_H__
#define __PLATFORM_LIB_DAI_H__

/* Dummy dai header for qemu_xtensa */

#endif /* __PLATFORM_LIB_DAI_H__ */
16 changes: 16 additions & 0 deletions src/platform/qemu_xtensa/include/platform/lib/dma.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_LIB_DMA_H__
#define __PLATFORM_LIB_DMA_H__

/* Dummy dma header for qemu_xtensa */
struct dma;

struct sof_dma {
const struct device *z_dev;
};

#endif /* __PLATFORM_LIB_DMA_H__ */
34 changes: 34 additions & 0 deletions src/platform/qemu_xtensa/include/platform/lib/mailbox.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_LIB_MAILBOX_H__
#define __PLATFORM_LIB_MAILBOX_H__

/* Dummy mailbox header for qemu_xtensa */
#define MAILBOX_HOSTBOX_BASE 0x10000000
#define MAILBOX_HOSTBOX_SIZE 0x1000
#define MAILBOX_DSPBOX_BASE 0x10005000
#define MAILBOX_DSPBOX_SIZE 0x1000
#define MAILBOX_STREAM_BASE 0x10001000
#define MAILBOX_STREAM_SIZE 0x1000
#define MAILBOX_TRACE_BASE 0x10002000
#define MAILBOX_TRACE_SIZE 0x1000
#define MAILBOX_EXCEPTION_BASE 0x10003000
#define MAILBOX_EXCEPTION_SIZE 0x1000
#define MAILBOX_DEBUG_BASE 0x10004000
#define MAILBOX_DEBUG_SIZE 0x1000
#define MAILBOX_SW_REG_BASE 0x10005000
#define MAILBOX_SW_REG_SIZE 0x1000

#include <stddef.h>
#include <stdint.h>

static inline void mailbox_sw_regs_write(size_t offset, const void *src, size_t bytes) {}
static inline void mailbox_sw_reg_write(size_t offset, uint32_t val) {}
static inline void mailbox_sw_reg_write64(size_t offset, uint64_t val) {}
static inline uint32_t mailbox_sw_reg_read(size_t offset) { return 0; }
static inline uint64_t mailbox_sw_reg_read64(size_t offset) { return 0; }

#endif /* __PLATFORM_LIB_MAILBOX_H__ */
20 changes: 20 additions & 0 deletions src/platform/qemu_xtensa/include/platform/lib/memory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_LIB_MEMORY_H__
#define __PLATFORM_LIB_MEMORY_H__

/* Dummy memory header for qemu_xtensa */

static inline void *platform_shared_get(void *ptr, int bytes)
{
return ptr;
}

#define PLATFORM_DCACHE_ALIGN sizeof(void *)
#define HOST_PAGE_SIZE 4096
#define SHARED_DATA

#endif /* __PLATFORM_LIB_MEMORY_H__ */
20 changes: 20 additions & 0 deletions src/platform/qemu_xtensa/include/platform/platform.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_PLATFORM_H__
#define __PLATFORM_PLATFORM_H__

/* Dummy platform header for qemu_xtensa */
#define PLATFORM_CORE_COUNT 1
#define PLATFORM_MAX_CHANNELS 8
#define PLATFORM_MAX_STREAMS 8

#define HW_CFG_VERSION 0x010000
#define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE

struct ipc_msg;
static inline void ipc_platform_send_msg_direct(const struct ipc_msg *msg) {}

#endif /* __PLATFORM_PLATFORM_H__ */
12 changes: 12 additions & 0 deletions src/platform/qemu_xtensa/include/platform/trace/trace.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2026 Intel Corporation.
*/

#ifndef __PLATFORM_TRACE_TRACE_H__
#define __PLATFORM_TRACE_TRACE_H__

/* Dummy trace header for qemu_xtensa */
#define PLATFORM_TRACE_DICT_FRONT 0

#endif /* __PLATFORM_TRACE_TRACE_H__ */
21 changes: 21 additions & 0 deletions src/platform/qemu_xtensa/platform.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: BSD-3-Clause
//
// Copyright(c) 2026 Intel Corporation.
//
#include <sof/lib/mailbox.h>
#include <sof/ipc/common.h>
#include <rtos/sof.h>

void ipc_platform_complete_cmd(struct ipc *ipc)
{
}

int platform_boot_complete(uint32_t boot_message)
{
return 0;
}

int platform_init(struct sof *sof)
{
return 0;
}
7 changes: 7 additions & 0 deletions zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ set_property(TARGET modules_sof PROPERTY CXX_STANDARD 17)
zephyr_include_directories(include)
zephyr_include_directories(${ZEPHYR_BASE}/kernel/include)
zephyr_include_directories(${ZEPHYR_BASE}/arch/${ARCH}/include)
zephyr_include_directories(${SOF_SRC_PATH}/include/sof/audio/module_adapter/iadk/)
zephyr_include_directories(${SOF_SRC_PATH}/include/sof/audio/module_adapter/library/)

# SOC level sources
# Files that are commented may not be needed.
Expand Down Expand Up @@ -485,6 +487,11 @@ zephyr_library_sources_ifdef(CONFIG_ZEPHYR_POSIX
${SOF_PLATFORM_PATH}/posix/fuzz.c
)

if (CONFIG_BOARD_QEMU_XTENSA)
set(PLATFORM "qemu_xtensa")
zephyr_library_sources(${SOF_PLATFORM_PATH}/qemu_xtensa/platform.c)
endif()

if(NOT DEFINED PLATFORM)
message(FATAL_ERROR "PLATFORM is not defined, check your Kconfiguration?")
endif()
Expand Down
8 changes: 8 additions & 0 deletions zephyr/test/userspace/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ Running test:
sudo ./cavstool.py sof-ptl.ri
- Test results printed to cavstool.py

Running test on QEMU (dc233c MMU):
- Tests can also be built and run locally using Zephyr's QEMU simulator.
- First, build the test application using `xtensa-build-zephyr.py`:
./scripts/xtensa-build-zephyr.py qemu_xtensa_mmu --cmake-args=-DCONFIG_SOF_BOOT_TEST_STANDALONE=y \
--cmake-args=-DCONFIG_SOF_USERSPACE_INTERFACE_DMA=y --cmake-args=-DCONFIG_SOF_USERSPACE_LL=y
- Once built, run the test in QEMU:
west build -d build-qemu_xtensa_mmu -t run

References to related assets in Zephyr codebase:
- cavstool.py
- zephyr/soc/intel/intel_adsp/tools/cavstool.py
Expand Down
Loading