#
# Copyright (c) 2019-2022 Arm Limited. All rights reserved.
#
# 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(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m3")
    add_compile_definitions(CPU_CORTEX_M3)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m33")
    add_compile_definitions(CPU_CORTEX_M33)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m4")
    add_compile_definitions(CPU_CORTEX_M4)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m55")
    add_compile_definitions(CPU_CORTEX_M55)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m7")
    add_compile_definitions(CPU_CORTEX_M7)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m85")
    add_compile_definitions(CPU_CORTEX_M85)
else()
    message(FATAL_ERROR "Unsupported compiler ${CMAKE_SYSTEM_PROCESSOR}.")
endif()

if((${TARGET} STREQUAL "mps2") OR (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m55"))
    set("SYSTEM_CORE_CLOCK" "25000000")
else()
    set("SYSTEM_CORE_CLOCK" "32000000")
endif()


configure_file(FreeRTOSConfig.h.in FreeRTOSConfig.h)
set(FREERTOS_CONFIG_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR})

# FreeRTOS kernel library
add_library(freertos_kernel STATIC)

target_compile_options(freertos_kernel PRIVATE
    $<$<COMPILE_LANGUAGE:CXX>:${TOOLCHAIN_CXX_OPTIONS}> "-Wno-redundant-decls")

# Set include directories
target_include_directories(freertos_kernel PUBLIC
    ${FREERTOS_KERNEL_PATH}/include
    ${FREERTOS_CONFIG_INCLUDE_DIR}
)

# Add kernel source files
target_sources(freertos_kernel PRIVATE
    ${FREERTOS_KERNEL_PATH}/tasks.c
    ${FREERTOS_KERNEL_PATH}/list.c
    ${FREERTOS_KERNEL_PATH}/queue.c
)

# Add the heap implementation
# heap_3 uses the compiler supplied malloc & free for the heap.
target_sources(freertos_kernel PRIVATE
    ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_3.c)

if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m3")
target_sources(freertos_kernel PRIVATE
    ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM3/port.c
)
target_include_directories(freertos_kernel PUBLIC
    ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM3
)
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m4")
    target_sources(freertos_kernel PRIVATE
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM4F/port.c
    )
    target_include_directories(freertos_kernel PUBLIC
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM4F
    )
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m7")
    target_sources(freertos_kernel PRIVATE
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM7/r0p1/port.c
    )
    target_include_directories(freertos_kernel PUBLIC
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM7/r0p1
    )
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m33")
    target_sources(freertos_kernel PRIVATE
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
    )
    target_include_directories(freertos_kernel PUBLIC
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure
    )
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m55")
# TODO: using the same port files as Cortex-M33. Update for Cortex-M55.
    target_sources(freertos_kernel PRIVATE
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
    )
    target_include_directories(freertos_kernel PUBLIC
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure
    )
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "cortex-m85")
# TODO: using the same port files as Cortex-M33. Update for Cortex-M85.
    target_sources(freertos_kernel PRIVATE
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
    )
    target_include_directories(freertos_kernel PUBLIC
        ${FREERTOS_KERNEL_PATH}/portable/GCC/ARM_CM33_NTZ/non_secure
    )
else()
    message(FATAL_ERROR "Invalid processor ${CMAKE_SYSTEM_PROCESSOR} when building FreeRTOS kernel")
endif()
