# Copyright 2022 The Pigweed Authors
#
# 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
#
#     https://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.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/linker_script.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_malloc/backend.gni")
import("$dir_pw_system/system_target.gni")
import("$dir_pw_third_party/smartfusion_mss/mss.gni")
import("$dir_pw_tokenizer/backend.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")

config("pw_malloc_active") {
  if (pw_malloc_BACKEND != "") {
    defines = [ "PW_MALLOC_ACTIVE=1" ]
  }
}

config("emcraft_ddr_init") {
  # Emcraft's DDR config must be manually set by a custom init function. This
  # conflicts with the built-in MSS init function. I have not looked into this
  # myself to see if it's absoutely needed or not.
  defines = [ "MSS_SYS_MDDR_CONFIG_BY_CORTEX=0" ]
}

if (current_toolchain != default_toolchain) {
  pw_linker_script("mddr_debug_linker_script") {
    defines = [
      "PW_BOOT_CODE_BEGIN=0x00000200",  # After vector table.

      # TODO(skeys) Bootloader is capable of loading 16M of uncompressed code
      # from SPI flash to external RAM. For now use the allocated eNVM flash
      # (256K - Bootloader - InSystemProgrammer = 192K)
      "PW_BOOT_CODE_SIZE=0x30000",

      # TODO(b/235348465): Currently "pw_tokenizer/detokenize_test" requires at
      # least 6K bytes in heap when using pw_malloc_freelist. The heap size
      # required for tests should be investigated.
      "PW_BOOT_HEAP_SIZE=4M",

      # With external RAM remapped, we use the entire internal ram for the
      # stack (64K).
      "PW_BOOT_MIN_STACK_SIZE=64K",

      # Using external DDR RAM, we just need to make sure we go past our ROM
      # sections.
      "PW_BOOT_RAM_BEGIN=0xA1000000",

      # We assume that the bootloader loaded all 16M of text.
      "PW_BOOT_RAM_SIZE=48M",
      "PW_BOOT_VECTOR_TABLE_BEGIN=0x00000000",
      "PW_BOOT_VECTOR_TABLE_SIZE=512",
    ]
    linker_script = "emcraft_sf2_som_mddr_debug.ld"
  }
  pw_linker_script("mddr_production_linker_script") {
    defines = [
      "PW_BOOT_FLASH_BEGIN=0x00000200",  # After vector table.

      # TODO(skeys) Bootloader is capable of loading 16M of uncompressed code
      # from SPI flash to external RAM. For now use the allocated eNVM flash
      # (256K - Bootloader - InSystemProgrammer = 192K)
      "PW_BOOT_FLASH_SIZE=0x30000",

      # TODO(b/235348465): Currently "pw_tokenizer/detokenize_test" requires at
      # least 6K bytes in heap when using pw_malloc_freelist. The heap size
      # required for tests should be investigated.
      "PW_BOOT_HEAP_SIZE=4M",

      # With external RAM remapped, we use the entire internal ram for the
      # stack (64K).
      "PW_BOOT_MIN_STACK_SIZE=1024K",

      # Using external DDR RAM, we just need to make sure we go past our ROM
      # sections.
      "PW_BOOT_RAM_BEGIN=0xA1000000",

      # We assume that the bootloader loaded all 16M of text.
      "PW_BOOT_RAM_SIZE=48M",
      "PW_BOOT_VECTOR_TABLE_BEGIN=0x00000000",
      "PW_BOOT_VECTOR_TABLE_SIZE=512",
    ]
    linker_script = "$dir_pw_boot_cortex_m/basic_cortex_m.ld"
  }

  pw_source_set("pre_init") {
    configs = [ ":pw_malloc_active" ]
    deps = [
      "$dir_pw_boot",
      "$dir_pw_boot_cortex_m",
      "$dir_pw_malloc",
      "$dir_pw_preprocessor",
      "$dir_pw_string",
      "$dir_pw_sys_io_emcraft_sf2",
      "$dir_pw_system",
      "$dir_pw_third_party/freertos",
    ]
    sources = [
      "boot.cc",
      "vector_table.c",
    ]
  }

  config("config_includes") {
    include_dirs = [ "config" ]
    configs = [ ":emcraft_ddr_init" ]
  }

  pw_source_set("sf2_mss_hal_config") {
    public_configs = [ ":config_includes" ]
    public =
        [ "config/sf2_mss_hal_conf.h" ]  # SKEYS likely want to put the MDDR
                                         # config by cortex etc stuff here
  }

  pw_source_set("sf2_freertos_config") {
    public_configs = [ ":config_includes" ]
    public_deps = [ "$dir_pw_third_party/freertos:config_assert" ]
    public = [ "config/FreeRTOSConfig.h" ]
  }
}

# Configured for use with a first stage boot loader to configure DDR and
# perform memory remapping.
pw_system_target("emcraft_sf2_som") {
  cpu = PW_SYSTEM_CPU.CORTEX_M3
  scheduler = PW_SYSTEM_SCHEDULER.FREERTOS
  link_deps = [ "$dir_pigweed/targets/emcraft_sf2_som:pre_init" ]

  build_args = {
    pw_log_BACKEND = dir_pw_log_tokenized
    pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND =
        "$dir_pw_system:log_backend.impl"
    pw_third_party_freertos_CONFIG =
        "$dir_pigweed/targets/emcraft_sf2_som:sf2_freertos_config"
    pw_third_party_freertos_PORT = "$dir_pw_third_party/freertos:arm_cm3"
    pw_sys_io_BACKEND = dir_pw_sys_io_emcraft_sf2

    pw_boot_cortex_m_LINKER_SCRIPT =
        "//targets/emcraft_sf2_som:mddr_production_linker_script"
  }
}

# Debug target configured to work with MSS linker script and startup code.
# TODO(skeys) Add linker script and config for debug builds using SoftConsole.
pw_system_target("emcraft_sf2_som_debug") {
  cpu = PW_SYSTEM_CPU.CORTEX_M3
  scheduler = PW_SYSTEM_SCHEDULER.FREERTOS
  link_deps = [ "$dir_pigweed/targets/emcraft_sf2_som:pre_init" ]

  build_args = {
    pw_log_BACKEND = dir_pw_log_tokenized
    pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND =
        "$dir_pw_system:log_backend.impl"
    pw_third_party_freertos_CONFIG =
        "$dir_pigweed/targets/emcraft_sf2_som:sf2_freertos_config"
    pw_third_party_freertos_PORT = "$dir_pw_third_party/freertos:arm_cm3"
    pw_sys_io_BACKEND = dir_pw_sys_io_emcraft_sf2

    # Override the default pw_boot_cortex_m linker script and set the memory
    # regions for the target.
    pw_boot_cortex_m_LINKER_SCRIPT =
        "//targets/emcraft_sf2_som:mddr_debug_linker_script"
    pw_third_party_smartfusion_mss_CONFIG = "debug"
  }
}

pw_doc_group("docs") {
  sources = [ "target_docs.rst" ]
}
