Skip to content

Commit

Permalink
lmdk: loadable smart-amp-test built from original sources
Browse files Browse the repository at this point in the history
Modify LMDK to build a smart-amp-test audio sample from the same
sources as the built-in version.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
  • Loading branch information
lyakh committed Oct 4, 2023
1 parent 13fe3c2 commit e4d646d
Show file tree
Hide file tree
Showing 13 changed files with 467 additions and 134 deletions.
2 changes: 2 additions & 0 deletions app/prj.conf
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,5 @@ CONFIG_SCHED_CPU_MASK_PIN_ONLY=y
CONFIG_SYS_CLOCK_TICKS_PER_SEC=15000
CONFIG_DAI=y
CONFIG_HEAP_MEM_POOL_SIZE=2048

CONFIG_LLEXT=y
94 changes: 75 additions & 19 deletions lmdk/cmake/build.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,49 @@ endif()

include(${CMAKE_CURRENT_LIST_DIR}/config.cmake)

list(PREPEND CMAKE_MODULE_PATH ${ZEPHYR_BASE}/cmake/modules)

include(${SOF_BASE}/scripts/cmake/misc.cmake)
include(extensions)

import_kconfig(CONFIG "${ZEPHYR_BUILD}/.config")

SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)

add_custom_target(all_modules)
set(MODULE_LINKER_PARAMS -nostdlib -nodefaultlibs)

foreach(MODULE ${MODULES_LIST})
add_executable(${MODULE})
add_subdirectory(${LMDK_BASE}/modules/${MODULE} ${MODULE}_module)
add_library(${MODULE} SHARED)
include(${SOF_BASE}/src/samples/audio/pic-${MODULE}.cmake)

target_compile_options(${MODULE} PRIVATE
-imacros${ZEPHYR_BUILD}/include/generated/autoconf.h
-save-temps -O2
)
target_compile_definitions(${MODULE} PRIVATE ${MODULE_COMPILE_DEF})
set_target_properties(${MODULE} PROPERTIES ${MODULE_PROPERTIES})

### set_target_properties(${MODULE} PROPERTIES OUTPUT_NAME ${MODULE}.mod)

target_include_directories(${MODULE} PRIVATE
"${LMDK_BASE}/include"
"${SOF_BASE}/src/include"
"${SOF_BASE}/src/include/sof/audio/module_adapter/iadk"
"${SOF_BASE}/src/include/ipc"
"${SOF_BASE}/src/include/ipc4"
"${SOF_BASE}/src/include/math"
"${SOF_BASE}/src/include/lib"
"${SOF_BASE}/src/arch/xtensa/include"
"${SOF_BASE}/zephyr/include"
"${SOF_BASE}/xtos/include"
"${SOF_BASE}/src/platform/${PLATFORM}/include"
"${SOF_BASE}/src/platform/intel/${ARCH}/include"
"${ZEPHYR_BASE}/../modules/hal/xtensa/include"
"${ZEPHYR_BASE}/../modules/hal/xtensa/zephyr/soc/intel_ace15_mtpm"
"${ZEPHYR_BASE}/include"
"${ZEPHYR_BASE}/soc/xtensa/intel_adsp/common/include"
"${ZEPHYR_BASE}/soc/xtensa/intel_adsp/ace/include/intel_ace15_mtpm"
"${ZEPHYR_BUILD}/include/generated"
"${RIMAGE_INCLUDE_DIR}"
)

Expand All @@ -27,27 +62,46 @@ foreach(MODULE ${MODULES_LIST})
message(FATAL_ERROR "Please define HPSRAM_ADDR for module ${MODULE}")
endif()

add_custom_command(TARGET ${MODULE} PRE_LINK
COMMAND ${CMAKE_COMMAND}
-DMODULE=${MODULE}
-DHPSRAM_ADDR=${HPSRAM_ADDR}
-P ${CMAKE_CURRENT_LIST_DIR}/ldscripts.cmake
)

target_link_options(${MODULE} PRIVATE
"-nostdlib" "-nodefaultlibs"
"-Wl,--no-undefined" "-Wl,--unresolved-symbols=report-all" "-Wl,--error-unresolved-symbols"
${MODULE_LINKER_PARAMS}
#"-Wl,--gc-sections" # may remove .bss and that will result in rimage error, do not use for now
"-Wl,-Map,$<TARGET_FILE:${MODULE}>.map" # optional: just for debug
"-T" "${MODULE}_ldscripts/elf32xtensa.x"
)

# The ${MODULE} cmake "native" shared library target builds a shared
# object with automatically assigned addresses. That object is then used
# by the calc_elf_addresses.sh script to calculate section sizes and use
# them for linker parameters to place sections correctly. The script
# generates linker parameters similar to
# "-Wl,-Ttext=0xa06ca000"
# "-Wl,--section-start=.rodata=0xa06cb100"
# "-Wl,-Tdata=0xa06cb000"
# This custom target then re-builds the shared object with correct
# addresses while otherwise using the same linker parameters. This is
# obviously important to make sure we generate sections with the same
# sizes.
add_custom_target(${MODULE}_calc ${CMAKE_C_COMPILER}
${MODULE_LINKER_PARAMS}
"$$(../../../cmake/calc_elf_addresses.sh" lib${MODULE}.so "A06CA000)"
-shared -fPIC
-o lib${MODULE}_calc.so $<TARGET_OBJECTS:${MODULE}>
COMMAND ${CMAKE_STRIP} -R .xt.* -o lib${MODULE}_out.so lib${MODULE}_calc.so
DEPENDS ${MODULE}
COMMAND_EXPAND_LISTS
)

add_dependencies(all_modules ${MODULE}_calc)

set(LIB_LIST ${LIB_LIST} lib${MODULE}_out.so)

sof_append_relative_path_definitions(${MODULE})
endforeach()

set(RIMAGE_OUTPUT_FILE ${PROJECT_NAME}_noextmft)
set(OUTPUT_FILE ${PROJECT_NAME}.bin)

if(RIMAGE_INSTALL_DIR)
cmake_path(ABSOLUTE_PATH RIMAGE_INSTALL_DIR BASE_DIRECTORY ${CMAKE_SOURCE_DIR} NORMALIZE)
cmake_path(ABSOLUTE_PATH RIMAGE_INSTALL_DIR BASE_DIRECTORY ${CMAKE_SOURCE_DIR} NORMALIZE)
endif()

# Create a hint - rimage may be installed to directory where SOF project installs it
Expand All @@ -56,12 +110,14 @@ cmake_path(NORMAL_PATH RIMAGE_SOF_INSTALL_DIR)
cmake_path(ABSOLUTE_PATH SIGNING_KEY BASE_DIRECTORY ${CMAKE_SOURCE_DIR} NORMALIZE)

find_program(RIMAGE_COMMAND NAMES rimage
PATHS "${RIMAGE_INSTALL_DIR}"
HINTS "${RIMAGE_SOF_INSTALL_DIR}"
REQUIRED)
PATHS "${RIMAGE_INSTALL_DIR}"
HINTS "${RIMAGE_SOF_INSTALL_DIR}"
REQUIRED
)

# "-r" flag makes rimage copy the whole module into the resulting image
add_custom_target(${PROJECT_NAME}_target ALL
DEPENDS ${MODULES_LIST}
COMMAND ${RIMAGE_COMMAND} -k ${SIGNING_KEY} -f 2.0.0 -b 1 -o ${RIMAGE_OUTPUT_FILE} -c ${TOML} -e ${MODULES_LIST}
DEPENDS all_modules
COMMAND ${RIMAGE_COMMAND} -k ${SIGNING_KEY} -f 2.0.0 -b 1 -o ${RIMAGE_OUTPUT_FILE} -c ${TOML} -e -r ${LIB_LIST}
COMMAND ${CMAKE_COMMAND} -E cat ${RIMAGE_OUTPUT_FILE}.xman ${RIMAGE_OUTPUT_FILE} > ${OUTPUT_FILE}
)
21 changes: 21 additions & 0 deletions lmdk/cmake/calc_elf_addresses.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/bin/bash

file=$1
text_addr=$2

# We need to take addresses of .text, .data, .rodata and .bss and calculate
# offsets, because the linker will keep everything between .data and .rodata and
# between .rodata and .bss in the final image too, when we specify section
# addresses. So just taking sizes of .text, .data and .rodata isn't enough.
# We use file offset from the objdump command output to avoid unused sections.

source <(
objdump -h $file | awk '/ .text / {print "text="toupper($6)} / .rodata / {print "rodata="toupper($6)} / .data / {print "data="toupper($6)}'
)

# round up to 4KiB
rodata_addr=$(echo "obase=16; ibase=16; upper=($rodata - $text + $text_addr + FFF); upper - (upper % 1000)" | bc)
# round up to 16 bytes
data_addr=$(echo "obase=16; ibase=16; upper=($data - $rodata + $rodata_addr + F); upper - (upper % 10)" | bc)

echo "-Wl,-Ttext=0x$text_addr -Wl,--section-start=.rodata=0x$rodata_addr -Wl,-Tdata=0x$data_addr"
8 changes: 8 additions & 0 deletions lmdk/cmake/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,13 @@ cmake_path(ABSOLUTE_PATH LMDK_BASE NORMALIZE)
set(SOF_BASE ${LMDK_BASE}/..)
cmake_path(ABSOLUTE_PATH SOF_BASE NORMALIZE)

# zephyr root dir
set(ZEPHYR_BASE ${SOF_BASE}/../../../zephyr)
cmake_path(ABSOLUTE_PATH ZEPHYR_BASE NORMALIZE)

# zephyr build root dir
set(ZEPHYR_BUILD ${BUILD_DIR}/zephyr)
cmake_path(ABSOLUTE_PATH ZEPHYR_BUILD NORMALIZE)

set(RIMAGE_INCLUDE_DIR ${SOF_BASE}/rimage/src/include)
cmake_path(ABSOLUTE_PATH RIMAGE_INCLUDE_DIR NORMALIZE)
4 changes: 2 additions & 2 deletions lmdk/cmake/ldscripts/bss_linker_script.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ PHDRS {

SECTIONS {
max_instances = 1;
max_instances-1 = max_instances - 1;
max_instances_1 = max_instances - 1;

.bss (NOLOAD) : ALIGN(4096) {
_first_start = ABSOLUTE(.);
*(.first)
_first_end = ABSOLUTE(.);
_next_start = ABSOLUTE(.);
. += (_first_end - _first_start) * max_instances-1;
. += (_first_end - _first_start) * max_instances_1;
_next_end = ABSOLUTE(.);
*(.bss)
*(.bss.*)
Expand Down
51 changes: 40 additions & 11 deletions lmdk/cmake/xtensa-toolchain.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Xtensa CMake toolchain file. Apply it using CMAKE_TOOLCHAIN_FILE variable.

set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)

Expand All @@ -9,22 +12,45 @@ if(NOT XTENSA_TOOLCHAIN_PATH)
set(XTENSA_TOOLCHAIN_PATH $ENV{XTENSA_TOOLCHAIN_PATH})
endif()

if(NOT XTENSA_TOOLCHAIN_PATH)
message(FATAL_ERROR "Failed to find Xtensa toolchain: XTENSA_TOOLCHAIN_PATH (env or CMake) variable not defined.")
if(XTENSA_TOOLCHAIN_PATH)
cmake_path(CONVERT ${XTENSA_TOOLCHAIN_PATH} TO_CMAKE_PATH_LIST XTENSA_TOOLCHAIN_PATH)
cmake_path(APPEND XTENSA_TOOLCHAIN_PATH "XtensaTools" OUTPUT_VARIABLE TOOLCHAIN_BASE)
else()
cmake_path(CONVERT $ENV{XTENSA_SDK} TO_CMAKE_PATH_LIST TOOLCHAIN_BASE)
cmake_path(CONVERT $ENV{XTENSA_TOOLS} TO_CMAKE_PATH_LIST XTENSA_TOOLS)
endif()

cmake_path(CONVERT ${XTENSA_TOOLCHAIN_PATH} TO_CMAKE_PATH_LIST XTENSA_TOOLCHAIN_PATH)
cmake_path(APPEND XTENSA_TOOLCHAIN_PATH "XtensaTools" OUTPUT_VARIABLE TOOLCHAIN_BASE)
set(CROSS_COMPILE xt-)
cmake_path(CONVERT $ENV{XTENSA_ROOT} TO_CMAKE_PATH_LIST XTENSA_ROOT)
set(SYSROOT_DIR ${XTENSA_ROOT})

# clang or xcc
find_program(CMAKE_C_COMPILER NAMES ${CROSS_COMPILE}xcc
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
set(CROSS_COMPILE ${XTENSA_TOOLS}/xt-)
find_program(CMAKE_C_COMPILER NAMES ${CROSS_COMPILE}clang
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" NO_DEFAULT_PATH
)
# clang++ or xc++
find_program(CMAKE_CXX_COMPILER NAMES ${CROSS_COMPILE}xc++
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
find_program(CMAKE_CXX_COMPILER NAMES ${CROSS_COMPILE}clang++
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" NO_DEFAULT_PATH
)

if(NOT CMAKE_C_COMPILER)
set(CROSS_COMPILE ${XTENSA_TOOLS}/xt-)
find_program(CMAKE_C_COMPILER NAMES ${CROSS_COMPILE}xcc
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" NO_DEFAULT_PATH
)
find_program(CMAKE_CXX_COMPILER NAMES ${CROSS_COMPILE}xc++
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" NO_DEFAULT_PATH
)
endif()

if(NOT CMAKE_C_COMPILER)
set(CROSS_COMPILE ${XTENSA_TOOLS}/xtensa-intel_ace15_mtpm_zephyr-elf-)
find_program(CMAKE_C_COMPILER NAMES ${CROSS_COMPILE}gcc
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
)
find_program(CMAKE_CXX_COMPILER NAMES ${CROSS_COMPILE}g++
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
)
endif()

find_program(CMAKE_LD NAMES ${CROSS_COMPILE}ld
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
)
Expand All @@ -43,6 +69,9 @@ find_program(CMAKE_OBJDUMP NAMES ${CROSS_COMPILE}objdump
find_program(CMAKE_NM NAMES ${CROSS_COMPILE}nm
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
)
find_program(CMAKE_STRIP NAMES ${CROSS_COMPILE}strip
PATHS ${TOOLCHAIN_BASE} PATH_SUFFIXES "bin" REQUIRED NO_DEFAULT_PATH
)

cmake_path(APPEND TOOLCHAIN_BASE "xtensa-elf" OUTPUT_VARIABLE XTENSA_ELF_ROOT)
set(CMAKE_FIND_ROOT_PATH ${XTENSA_ELF_ROOT})
Expand Down
23 changes: 23 additions & 0 deletions lmdk/pic/smart_amp_test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.20)

set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../../cmake/xtensa-toolchain.cmake")

project(smart_amp_test)

# list of modules to be built and included into this loadable library
set(MODULES_LIST smart_amp_test)

# toml file for rimage to generate manifets
set(TOML "${CMAKE_CURRENT_LIST_DIR}/smart_amp_test.toml")

# TODO: Move it somewhere???
add_definitions(-DMAJOR_IADSP_API_VERSION=5)
add_definitions(-DMIDDLE_IADSP_API_VERSION=0)
add_definitions(-DMINOR_IADSP_API_VERSION=0)

set(MODULE_PROPERTIES HPSRAM_ADDR "0xa06c1000")
set(MODULE_COMPILE_DEF
__ZEPHYR__=1
)

include(../../cmake/build.cmake)
80 changes: 80 additions & 0 deletions lmdk/pic/smart_amp_test/smart_amp_test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
version = [3, 0]

[adsp]
name = "mtl"
image_size = "0x2C0000" # (22) bank * 128KB
alias_mask = "0xE0000000"

[[adsp.mem_zone]]
type = "ROM"
base = "0x1FF80000"
size = "0x400"
[[adsp.mem_zone]]
type = "IMR"
base = "0xA104A000"
size = "0x2000"
[[adsp.mem_zone]]
type = "SRAM"
base = "0xa00f0000"
size = "0x100000"

[[adsp.mem_alias]]
type = "uncached"
base = "0x40000000"
[[adsp.mem_alias]]
type = "cached"
base = "0xA0000000"

[cse]
partition_name = "ADSP"
[[cse.entry]]
name = "ADSP.man"
offset = "0x5c"
length = "0x464"
[[cse.entry]]
name = "ADSP.met"
offset = "0x4c0"
length = "0x70"
[[cse.entry]]
name = "ADSP"
offset = "0x540"
length = "0x0" # calculated by rimage

[css]

[signed_pkg]
name = "ADSP"
partition_usage = "0x23"
[[signed_pkg.module]]
name = "ADSP.met"

[adsp_file]
[[adsp_file.comp]]
base_offset = "0x2000"

[fw_desc.header]
name = "ADSPFW"
load_offset = "0x40000"

[module]
count = 1

[[module.entry]]
name = "SMATEST"
uuid = "167A961E-8AE4-11EA-89F1-000C29CE1635"
affinity_mask = "0x1"
instance_count = "1"
domain_types = "0"
load_type = "0"
init_config = "1"
module_type = "0xD"
auto_start = "0"
sched_caps = [1, 0x00008000]

# pin = [dir, type, sample rate, size, container, channel-cfg]
pin = [0, 0, 0xfeef, 0xf, 0xa, 0x45ff,
0, 0, 0xfeef, 0xf, 0xa, 0x45ff,
1, 0, 0xfeef, 0xf, 0xa, 0x45ff]

# mod_cfg [PAR_0 PAR_1 PAR_2 PAR_3 IS_BYTES CPS IBS OBS MOD_FLAGS CPC OBLS]
mod_cfg = [0, 0, 0, 0, 4096, 1000000, 128, 128, 0, 0, 0]
Loading

0 comments on commit e4d646d

Please sign in to comment.