#
# Copyright 2017, Data61
# Commonwealth Scientific and Industrial Research Organisation (CSIRO)
# ABN 41 687 119 230.
#
# This software may be distributed and modified according to the terms of
# the BSD 2-Clause license. Note that NO WARRANTY is provided.
# See "LICENSE_BSD2.txt" for details.
#
# @TAG(DATA61_BSD)
#

cmake_minimum_required(VERSION 3.7.2)

project(libplatsupport C)

# HACK: This is a stop-gap measure for now to allow projects that don't
# use the CMake modules feature of our build system to build properly.
# Some projects in particular that need to be fixed:
#   - rumprun-sel4-demoapps
if(NOT ${PLATSUPPORT_HELPERS} STREQUAL "")
    include(${PLATSUPPORT_HELPERS})
endif()

set(configure_string "")

config_choice(
    LibPlatSupportX86ConsoleDevice
    LIB_PLAT_SUPPORT_X86_CONSOLE_DEVICE
    "X86 console device. The serial port that libplatsupport will use for communication \
        com1 -> 0x3f8 \
        com2 -> 0x2f8 \
        com3 -> 0x3e8 \
        com4 -> 0x2e8 \
        ega -> 80x25 text mode ega screen"
    "com1;LibPlatSupportX86ConsoleDeviceCom1;LIB_PLAT_SUPPORT_SERIAL_PORT_X86_COM1;KernelPlatPC99"
    "com2;LibPlatSupportX86ConsoleDeviceCom2;LIB_PLAT_SUPPORT_SERIAL_PORT_X86_COM1;KernelPlatPC99"
    "com3;LibPlatSupportX86ConsoleDeviceCom3;LIB_PLAT_SUPPORT_SERIAL_PORT_X86_COM1;KernelPlatPC99"
    "com4;LibPlatSupportX86ConsoleDeviceCom4;LIB_PLAT_SUPPORT_SERIAL_PORT_X86_COM1;KernelPlatPC99"
    "ega;LibPlatSupportX86ConsoleDeviceEGA;LIB_PLAT_SUPPORT_SERIAL_TEXT_EGA;KernelPlatPC99"
)

file(
    GLOB
        deps
        src/mach/${KernelArmMach}/*.c
        src/plat/${KernelPlatform}/*.c
        src/*.c
        src/plat/${KernelPlatform}/acpi/*.c
)

if(${KernelArch} STREQUAL "arm")
    list(APPEND deps src/arch/arm/clock.c)
    list(APPEND deps src/arch/arm/delay.c)
    list(APPEND deps src/arch/arm/dma330.c)
    list(APPEND deps src/arch/arm/i2c.c)
    list(APPEND deps src/arch/arm/i2c_bitbang.c)
    list(APPEND deps src/arch/arm/generic_timer.c)
    list(APPEND deps src/arch/arm/irqchip/gic.c)
    list(APPEND deps src/arch/arm/irqchip/tegra.c)
    list(APPEND deps src/arch/arm/irqchip/gicv3.c)
    list(APPEND deps src/arch/arm/irqchip/avic.c)
    list(APPEND deps src/arch/arm/irqchip/omap3.c)
    # Link the IRQ chip parser modules
    list(
        APPEND
            irqchip_modules
            "-Wl,--undefined=arm_gic_ptr,--undefined=tegra_ictlr_ptr,--undefined=arm_gicv3_ptr,\
--undefined=fsl_avic_ptr,--undefined=ti_omap3_ptr"
    )
elseif(${KernelArch} STREQUAL "x86")
    list(APPEND deps src/arch/x86/delay.c)
    list(APPEND deps src/arch/x86/tsc.c)
elseif(${KernelArch} STREQUAL "riscv")
    list(APPEND deps src/arch/riscv/irqchip/plic.c)
    list(APPEND irqchip_modules "-Wl,--undefined=riscv_plic_ptr")
endif()

if(KernelPlatformQEMUArmVirt)
    if(KernelArmExportPCNTUser AND KernelArmExportPTMRUser)
        list(APPEND deps src/arch/arm/generic_ltimer.c)
    endif()
endif()

if(KernelPlatformExynos5422)
    list(APPEND deps src/mach/${KernelArmMach}/clock/exynos_5422_clock.c)
elseif(KernelPlatformExynos4 OR KernelPlatformExynos5410 OR KernelPlatformExynos5250)
    list(APPEND deps src/mach/${KernelArmMach}/clock/exynos_common_clock.c)
endif()

if(
    KernelPlatImx6
    OR KernelPlatformImx7Sabre
    OR KernelPlatformKZM
    OR KernelPlatformImx8mq-evk
    OR KernelPlatformImx8mm-evk
)
    if(NOT (KernelPlatformImx8mq-evk OR KernelPlatformImx8mm-evk))
        list(APPEND deps src/mach/${KernelArmMach}/epit/epit.c)
    endif()
    if(NOT KernelPlatformKZM)
        list(APPEND deps src/mach/${KernelArmMach}/serial/serial.c)
    endif()
endif()
if(KernelPlatformImx8mq-evk OR KernelPlatformImx8mm-evk)
    list(APPEND deps src/plat/imx8m/chardev.c)
    # There's no clock driver at the moment, but this is to allow the libethdrivers to build for imx8mq
    list(APPEND deps src/plat/imx8m/clock.c)
endif()

list(SORT deps)

add_config_library(platsupport "${configure_string}")

add_library(platsupport EXCLUDE_FROM_ALL ${deps})
target_include_directories(platsupport PRIVATE src/plat_include/${KernelPlatform})

if(KernelPlatformImx8mq-evk OR KernelPlatformImx8mm-evk)
    target_include_directories(platsupport PUBLIC plat_include/imx8m)
endif()
target_include_directories(
    platsupport
    PUBLIC include plat_include/${KernelPlatform} arch_include/${KernelArch}
)
if(NOT "${KernelArmMach}" STREQUAL "")
    target_include_directories(platsupport PUBLIC mach_include/${KernelArmMach})
endif()
if("${KernelArch}" STREQUAL "arm")
    set(sel4_arch "${KernelSel4Arch}")
    if("${KernelSel4Arch}" STREQUAL "arm_hyp")
        set(sel4_arch "aarch32")
    endif()
    target_include_directories(platsupport PUBLIC sel4_arch_include/${sel4_arch})
endif()
target_link_libraries(
    platsupport
    muslc
    utils
    fdt
    sel4_autoconf
    platsupport_Config
    ${irqchip_modules}
)
