#
# SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the License); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

if(NOT TARGET freertos_kernel)
    message("Skipping message handler openamp")
    return()
endif()

#############################################################################
# Configuration
#############################################################################

set(MESSAGE_HANDLER_MODEL_0 "" CACHE STRING "Path to built in model 0")
set(MESSAGE_HANDLER_MODEL_1 "" CACHE STRING "Path to built in model 1")
set(MESSAGE_HANDLER_MODEL_2 "" CACHE STRING "Path to built in model 2")
set(MESSAGE_HANDLER_MODEL_3 "" CACHE STRING "Path to built in model 3")

set(MESSAGE_HANDLER_ARENA_SIZE 2000000 CACHE STRING "Total size of all message handler tensor arenas")

#############################################################################
# TFLM arena
#############################################################################

# Split total tensor arena equally for each NPU
if(TARGET ethosu_core_driver AND ETHOSU_TARGET_NPU_COUNT GREATER 0)
    set(NUM_ARENAS ${ETHOSU_TARGET_NPU_COUNT})
else()
    set(NUM_ARENAS 1)
endif()

math(EXPR TENSOR_ARENA_SIZE "${MESSAGE_HANDLER_ARENA_SIZE} / ${NUM_ARENAS}")

#############################################################################
# Message handler application
#############################################################################

ethosu_add_executable(message_handler_openamp
    SOURCES
        main.cpp
        core_driver_mutex.cpp
        freertos_allocator.cpp
        inference_runner.cpp
        message_handler.cpp
        remoteproc.cpp
    LIBRARIES
        $<$<TARGET_EXISTS:ethosu_core_driver>:ethosu_core_driver>
        ethosu_log
        ethosu_mailbox
        freertos_kernel
        inference_process
        openamp-freertos)

target_include_directories(message_handler_openamp PRIVATE
    ${LINUX_DRIVER_STACK_PATH}/kernel)

target_compile_definitions(message_handler_openamp PRIVATE
    TENSOR_ARENA_SIZE=${TENSOR_ARENA_SIZE}
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_0}>:MODEL_0=${MESSAGE_HANDLER_MODEL_0}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_1}>:MODEL_1=${MESSAGE_HANDLER_MODEL_1}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_2}>:MODEL_2=${MESSAGE_HANDLER_MODEL_2}>
    $<$<BOOL:${MESSAGE_HANDLER_MODEL_3}>:MODEL_3=${MESSAGE_HANDLER_MODEL_3}>)
