# General configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# Copyright (c) 2016 Intel Corporation
# Copyright (c) 2023 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

config MCUBOOT
	bool
	help
	  Hidden option used to indicate that the current image is MCUBoot

config BOOTLOADER_MCUBOOT
	bool "MCUboot bootloader support"
	select USE_DT_CODE_PARTITION if !MCUBOOT_BOOTLOADER_MODE_RAM_LOAD
	imply INIT_ARCH_HW_AT_BOOT if ARCH_SUPPORTS_ARCH_HW_INIT
	depends on !MCUBOOT
	help
	  This option signifies that the target uses MCUboot as a bootloader,
	  or in other words that the image is to be chain-loaded by MCUboot.
	  This sets several required build system and Device Tree options in
	  order for the image generated to be bootable using the MCUboot open
	  source bootloader. Currently this includes:

	    * Setting ROM_START_OFFSET to a default value that allows space
	      for the MCUboot image header
	    * Activating SW_VECTOR_RELAY_CLIENT on Cortex-M0
	      (or Armv8-M baseline) targets with no built-in vector relocation
	      mechanisms

	  By default, this option instructs Zephyr to initialize the core
	  architecture HW registers during boot, when this is supported by
	  the application. This removes the need by MCUboot to reset
	  the core registers' state itself.

if BOOTLOADER_MCUBOOT

config MCUBOOT_SIGNATURE_KEY_FILE
	string "Path to the mcuboot signing key file"
	default ""
	depends on !MCUBOOT_GENERATE_UNSIGNED_IMAGE
	help
	  The file contains a key pair whose public half is verified
	  by your target's MCUboot image. The file is in PEM format.

	  If set to a non-empty value, the build system tries to
	  sign the final binaries using a 'west sign -t imgtool' command.
	  The signed binaries are placed in the build directory
	  at zephyr/zephyr.signed.bin and zephyr/zephyr.signed.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

	  This option should contain a path to the same file as the
	  BOOT_SIGNATURE_KEY_FILE option in your MCUboot .config. The path
	  may be absolute or relative to the west workspace topdir. (The MCUboot
	  config option is used for the MCUboot bootloader image; this option is
	  for your application which is to be loaded by MCUboot. The MCUboot
	  config option can be a relative path from the MCUboot repository
	  root.)

	  If left empty, you must sign the Zephyr binaries manually.

config MCUBOOT_ENCRYPTION_KEY_FILE
	string "Path to the mcuboot encryption key file"
	default ""
	depends on MCUBOOT_SIGNATURE_KEY_FILE != ""
	help
	  The file contains the public key that is used to encrypt the
	  ephemeral key that encrypts the image. The corresponding
	  private key is hard coded in the MCUboot source code and is
	  used to decrypt the ephemeral key that is embedded in the
	  image. The file is in PEM format.

	  If set to a non-empty value, the build system tries to
	  sign and encrypt the final binaries using a 'west sign -t imgtool'
	  command. The binaries are placed in the build directory at
	  zephyr/zephyr.signed.encrypted.bin and
	  zephyr/zephyr.signed.encrypted.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

	  This option should either be an absolute path or a path relative to
	  the west workspace topdir.
	  Example: './bootloader/mcuboot/enc-rsa2048-pub.pem'

	  If left empty, you must encrypt the Zephyr binaries manually.

config MCUBOOT_IMGTOOL_SIGN_VERSION
	string "Version to pass to imgtool when signing"
	default "$(APP_VERSION_TWEAK_STRING)" if "$(VERSION_MAJOR)" != ""
	default "0.0.0+0"
	help
	  When signing with imgtool then this setting will be passed as version
	  argument to the tool.
	  The format is major.minor.revision+build.

config MCUBOOT_IMGTOOL_OVERWRITE_ONLY
	bool "Use overwrite-only instead of swap upgrades"
	help
	  If enabled, --overwrite-only option passed to imgtool to avoid
	  adding the swap status area size when calculating overflow.

config MCUBOOT_EXTRA_IMGTOOL_ARGS
	string "Extra arguments to pass to imgtool when signing"
	default ""
	help
	  When signing (CONFIG_MCUBOOT_SIGNATURE_KEY_FILE is a non-empty
	  string) you can use this option to pass extra options to
	  imgtool. For example, you could set this to "--version 1.2".

config MCUBOOT_GENERATE_UNSIGNED_IMAGE
	bool "Generate unsigned binary image bootable with MCUboot"
	help
	  Enabling this configuration allows automatic unsigned binary image
	  generation when MCUboot signing key is not provided,
	  i.e., MCUBOOT_SIGNATURE_KEY_FILE is left empty.

config MCUBOOT_GENERATE_CONFIRMED_IMAGE
	bool "Also generate a padded, confirmed image"
	help
	  The signed, padded, and confirmed binaries are placed in the build
	  directory at zephyr/zephyr.signed.confirmed.bin and
	  zephyr/zephyr.signed.confirmed.hex.

	  The file names can be customized with CONFIG_KERNEL_BIN_NAME.
	  The existence of bin and hex files depends on CONFIG_BUILD_OUTPUT_BIN
	  and CONFIG_BUILD_OUTPUT_HEX.

menu "On board MCUboot operation mode"

choice MCUBOOT_BOOTLOADER_MODE
	prompt "Application assumed MCUboot mode of operation"
	default MCUBOOT_BOOTLOADER_MODE_SWAP_WITHOUT_SCRATCH # MCUBOOT_BOOTLOADER_MODE
	help
	  Informs application build on assumed MCUboot mode of operation.
	  This is important for validataing application against DT configuration,
	  which is done by west sign.

config MCUBOOT_BOOTLOADER_MODE_SINGLE_APP
	bool "MCUboot has been configured for single slot execution"
	select MCUBOOT_IMGTOOL_OVERWRITE_ONLY
	help
	  MCUboot will only boot slot0_partition placed application and does
	  not care about other slots. In this mode application is not able
	  to DFU its own update to secondary slot and all updates need to
	  be performed using MCUboot serial recovery.

config MCUBOOT_BOOTLOADER_MODE_SWAP_WITHOUT_SCRATCH
	bool "MCUboot has been configured for swap without scratch operation"
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	help
	  MCUboot expects slot0_partition and slot1_partition to be present
	  in DT and application will boot from slot0_partition.
	  MCUBOOT_BOOTLOADER_NO_DOWNGRADE should also be selected
	  if MCUboot has been built with MCUBOOT_DOWNGRADE_PREVENTION.

config MCUBOOT_BOOTLOADER_MODE_SWAP_SCRATCH
	bool "MCUboot has been configured for swap using scratch operation"
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	help
	  MCUboot expects slot0_partition, slot1_partition and scratch_partition
	  to be present in DT, and application will boot from slot0_partition.
	  In this mode scratch_partition is used as temporary storage when
	  MCUboot swaps application from the secondary slot to the primary
	  slot.
	  MCUBOOT_BOOTLOADER_NO_DOWNGRADE should also be selected
	  if MCUboot has been built with MCUBOOT_DOWNGRADE_PREVENTION.

config MCUBOOT_BOOTLOADER_MODE_OVERWRITE_ONLY
	bool "MCUboot has been configured to just overwrite primary slot"
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	select MCUBOOT_IMGTOOL_OVERWRITE_ONLY
	help
	  MCUboot will take contents of secondary slot of an image and will
	  overwrite primary slot with it.
	  In this mode it is not possible to revert back to previous version
	  as it is not stored in the secondary slot.
	  This mode supports MCUBOOT_BOOTLOADER_NO_DOWNGRADE which means
	  that the overwrite will not happen unless the version of secondary
	  slot is higher than the version in primary slot.

config MCUBOOT_BOOTLOADER_MODE_RAM_LOAD
	bool "MCUboot has been configured for RAM LOAD operation"
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	select MCUBOOT_BOOTLOADER_NO_DOWNGRADE
	help
	  MCUboot expects slot0_partition and slot1_partition to exist in DT. In this mode, MCUboot
	  will select the image with the higher version number, copy it to RAM and begin execution
	  from there. The image must be linked to execute from RAM, the address that it is copied
	  to is specified using the load-addr argument when running imgtool.
	  This option automatically selectes MCUBOOT_BOOTLOADER_NO_DOWNGRADE as it is not possible
	  to swap back to older version of the application.

config MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP
	bool "MCUboot has been configured for DirectXIP operation"
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	select MCUBOOT_BOOTLOADER_NO_DOWNGRADE
	help
	  MCUboot expects slot0_partition and slot1_partition to exist in DT.
	  In this mode MCUboot can boot from either partition and will
	  select one with higher application image version, which usually
	  means major.minor.patch triple, unless BOOT_VERSION_CMP_USE_BUILD_NUMBER
	  is also selected that enables comparison of build number.
	  This option automatically selectes
	  MCUBOOT_BOOTLOADER_NO_DOWNGRADE as it is not possible
	  to swap back to older version of application.

config MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP_WITH_REVERT
	bool "MCUboot has been configured for DirectXIP with revert"
	select MCUBOOT_BOOTUTIL_LIB_FOR_DIRECT_XIP
	select MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	select MCUBOOT_BOOTLOADER_NO_DOWNGRADE
	help
	  MCUboot expects slot0_partition and slot1_partition to exist in DT.
	  In this mode MCUboot will boot the application with the higher version
	  from either slot, as long as it has been marked to be boot
	  next time for test or permanently. In case when application is marked
	  for test it needs to confirm itself, on the first boot, or it will
	  be removed and MCUboot will revert to booting previously approved
	  application.
	  This mode does not allow freely switching between application
	  versions, as, once higher version application is approved, it is
	  not possible to select lower version for boot.
	  This mode selects MCUBOOT_BOOTLOADER_NO_DOWNGRADE as it is not possible
	  to downgrade running application, but note that MCUboot may do that
	  if application with higher version will not get confirmed.

config MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER
	bool "MCUboot has been configured in firmware updater mode"
	select MCUBOOT_IMGTOOL_OVERWRITE_ONLY
	help
	  MCUboot will only boot slot0_partition for the main application but has
	  an entrance mechanism defined for entering the slot1_partition which is
	  a dedicated firmware updater application used to update the slot0_partition
	  application.

endchoice # MCUBOOT_BOOTLOADER_MODE

config MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
	bool
	help
	  Selected mode supports downgrade prevention, where you cannot switch to
	  an application with lower version than the currently running application.

if MCUBOOT_BOOTLOADER_MODE_HAS_NO_DOWNGRADE
config MCUBOOT_BOOTLOADER_NO_DOWNGRADE
	bool "MCUboot mode has downgrade prevention enabled"
	help
	  Selected MCUboot mode has downgrade prevention enabled, where you are not
	  able to change back to image with lower version number.
	  This options should be selected when MCUboot has been built with
	  MCUBOOT_DOWNGRADE_PREVENTION option enabled.
endif

config MCUBOOT_APPLICATION_FIRMWARE_UPDATER
	bool "Application is firmware updater image"
	depends on MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER
	help
	  Select this if the current image is the firmware updater image. This will use slot 1
	  information when signing the image.

	  Note that the zephyr chosen node ``zephyr,code-partition`` should be set to
	  ``slot1_partition`` for this image.

endmenu # On board MCUboot operation mode

endif # BOOTLOADER_MCUBOOT

menuconfig MCUBOOT_BOOTUTIL_LIB
	bool "MCUboot utility library"
	help
	  Enable MCUboot utility library which implements functions
	  required by the chain-loaded application and the MCUboot.

if MCUBOOT_BOOTUTIL_LIB

# hidden option for disabling module-own log configuration
# while building MCUboot bootloader
config MCUBOOT_BOOTUTIL_LIB_OWN_LOG
	bool
	default y

if MCUBOOT_BOOTUTIL_LIB_OWN_LOG
module = MCUBOOT_UTIL
module-str = MCUboot bootutil
source "subsys/logging/Kconfig.template.log_config"
endif

config BOOT_IMAGE_ACCESS_HOOKS
	bool "Hooks for overriding MCUboot's bootutil native routines"
	help
	  Allow to provide procedures for override or extend native
	  MCUboot's routines required for access the image data.
	  It is up to the application project to add source file which
	  implements hooks to the build.

if MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP_WITH_REVERT

config MCUBOOT_BOOTUTIL_LIB_FOR_DIRECT_XIP
	bool
	help
	  Adds support for setting for test and confirming images
	  when bootloader is in DirectXIP-revert mode.
endif

endif # MCUBOOT_BOOTUTIL_LIB
