diff --git a/scripts/calc_elf_addresses.py b/scripts/calc_elf_addresses.py new file mode 100755 index 000000000000..22370fc38411 --- /dev/null +++ b/scripts/calc_elf_addresses.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause + +import argparse +from elftools.elf.elffile import ELFFile + +args = None +def parse_args(): + global args + + parser = argparse.ArgumentParser(description='Helper utility to generate a linker command' + ' line with calculated ELF section addresses') + + parser.add_argument("-f", "--file", required=True, type=str, + help='Object file name') + parser.add_argument("-t", "--text-addr", required=True, type=str, + help='.text section address') + + args = parser.parse_args() + +def main(): + parse_args() + + elf = ELFFile(open(args.file, 'rb')) + + text_addr = int(args.text_addr.replace("0x", ""), 16) + + text_offset = elf.get_section_by_name('.text').header.sh_offset + rodata_offset = elf.get_section_by_name('.rodata').header.sh_offset + data_offset = elf.get_section_by_name('.data').header.sh_offset + + upper = rodata_offset - text_offset + int(args.text_addr, 16) + 0xfff + rodata_addr = upper - (upper % 0x1000) + + upper = data_offset - rodata_offset + rodata_addr + 0xf + data_addr = upper - (upper % 0x10) + + print(f'-Wl,-Ttext=0x{text_addr:x} ' + f'-Wl,--section-start=.rodata=0x{rodata_addr:x} ' + f'-Wl,-Tdata=0x{data_addr:x}') + +if __name__ == "__main__": + main() diff --git a/src/samples/audio/Kconfig b/src/samples/audio/Kconfig index a427f0b3172f..e853b0668f1a 100644 --- a/src/samples/audio/Kconfig +++ b/src/samples/audio/Kconfig @@ -3,7 +3,7 @@ menu "Audio component samples" config SAMPLE_SMART_AMP - bool "Smart amplifier test component" + tristate "Smart amplifier test component" default y help Select for test smart amplifier component diff --git a/src/samples/audio/smart_amp_llext/CMakeLists.txt b/src/samples/audio/smart_amp_llext/CMakeLists.txt new file mode 100644 index 000000000000..34b92474bffa --- /dev/null +++ b/src/samples/audio/smart_amp_llext/CMakeLists.txt @@ -0,0 +1,71 @@ +# Copyright (c) 2023 Intel Corporation. +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(smart_amp_test) + +SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE) + +set(MODULE "smart_amp_test") +cmake_path(SET SOF_BASE NORMALIZE ${PROJECT_SOURCE_DIR}/../../../..) + +add_library(${MODULE} SHARED) + +target_sources(${MODULE} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/../smart_amp_test_ipc4.c +) + +sof_append_relative_path_definitions(${MODULE}) + +target_include_directories(${MODULE} PRIVATE + "${ZEPHYR_BASE}/include" + "${ZEPHYR_BASE}/soc/xtensa/intel_adsp/common/include" + "${ZEPHYR_BASE}/soc/xtensa/intel_adsp/ace/include/intel_ace15_mtpm" + "${ZEPHYR_BASE}/../modules/hal/xtensa/include" + "${ZEPHYR_BASE}/../modules/hal/xtensa/zephyr/soc/intel_ace15_mtpm" + "${SOF_BASE}/src/include" + "${SOF_BASE}/src/arch/xtensa/include" + "${SOF_BASE}/src/platform/meteorlake/include" + "${SOF_BASE}/src/platform/intel/ace/include" + "${SOF_BASE}/src/include/sof/audio/module_adapter/iadk" + "${SOF_BASE}/zephyr/include" + "${SOF_BASE}/xtos/include" + "${SOF_BASE}/tools/rimage/src/include" + "${PROJECT_BINARY_DIR}/../include/generated" +) + +set(MODULE_PROPERTIES HPSRAM_ADDR "0xa06c1000") +set_target_properties(${MODULE} PROPERTIES ${MODULE_PROPERTIES}) + +set(MODULE_COMPILE_DEF + __ZEPHYR__=1 + __XTENSA__ + KERNEL + MAJOR_IADSP_API_VERSION=5 + MIDDLE_IADSP_API_VERSION=0 + MINOR_IADSP_API_VERSION=0 +) +target_compile_definitions(${MODULE} PRIVATE ${MODULE_COMPILE_DEF}) + +target_compile_options(${MODULE} PRIVATE + -imacros${PROJECT_BINARY_DIR}/../include/generated/autoconf.h + -save-temps -O2 +) + +set(MODULE_LINKER_PARAMS -nostdlib -nodefaultlibs) +target_link_options(${MODULE} PRIVATE + ${MODULE_LINKER_PARAMS} +) + +add_custom_target(${MODULE}_llext ${CMAKE_C_COMPILER} + ${MODULE_LINKER_PARAMS} + "$$(${SOF_BASE}scripts/calc_elf_addresses.py" -f lib${MODULE}.so -t "A06CA000)" + -shared -fPIC + -o lib${MODULE}_llext.so $ + COMMAND ${CMAKE_STRIP} -R .xt.* -o lib${MODULE}_out.so lib${MODULE}_llext.so + DEPENDS ${MODULE} + COMMAND_EXPAND_LISTS +) + +add_dependencies(${MODULE} zephyr_interface) diff --git a/src/samples/audio/smart_amp_llext/llext.toml.h b/src/samples/audio/smart_amp_llext/llext.toml.h new file mode 100644 index 000000000000..350cdc076e06 --- /dev/null +++ b/src/samples/audio/smart_amp_llext/llext.toml.h @@ -0,0 +1,5 @@ +#include +#include "../smart_amp_test.toml" + +[module] +count = __COUNTER__ diff --git a/src/samples/audio/smart_amp_test_ipc4.c b/src/samples/audio/smart_amp_test_ipc4.c index f6ffd6dae115..3a93c87294ac 100644 --- a/src/samples/audio/smart_amp_test_ipc4.c +++ b/src/samples/audio/smart_amp_test_ipc4.c @@ -33,16 +33,16 @@ DECLARE_TR_CTX(smart_amp_test_comp_tr, SOF_UUID(smart_amp_test_comp_uuid), #include #include -#include #include #include -#include #include