# Configuration for the partitions in the  TF-M Module

# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

if BUILD_WITH_TFM

config TFM_PARTITION_PROTECTED_STORAGE
	bool "Secure partition 'Protected Storage'"
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_PROTECTED_STORAGE'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.

config TFM_PARTITION_INTERNAL_TRUSTED_STORAGE
	bool "Secure partition 'Internal Trusted Storage'"
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_INTERNAL_TRUSTED_STORAGE'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.

config TFM_PARTITION_CRYPTO
	bool "Secure partition 'Crypto'"
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_CRYPTO'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.

config TFM_PARTITION_INITIAL_ATTESTATION
	bool "Secure partition 'Initial Attestation'"
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_INITIAL_ATTESTATION'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.

config TFM_PARTITION_PLATFORM
	bool "Secure partition 'Platform'"
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_PLATFORM'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.

config TFM_PARTITION_AUDIT_LOG
	bool "Secure partition 'Audit Log'" if !TFM_IPC
	depends on !TFM_IPC
	default y
	help
	  Setting this option will cause '-DTFM_PARTITION_AUDIT_LOG'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.
	  Note: the Audit Log service does not implement the IPC model
	  interface so it may not be enabled together with IPC option.

config TFM_PARTITION_FIRMWARE_UPDATE
	bool "Include the secure parition 'Firmware Update'"
	select TFM_MCUBOOT_DATA_SHARING
	default n
	help
	  Setting this option will cause '-DTFM_PARTITION_FIRMWARE_UPDATE'
	  to be passed to the TF-M build system. Look at 'config_default.cmake'
	  in the trusted-firmware-m repository for details regarding this
	  parameter. Any dependencies between the various TFM_PARTITION_*
	  options are handled by the build system in the trusted-firmware-m
	  repository.


choice TFM_PARTITION_LOG_LEVEL
	prompt "TF-M Partition Log Level" if !TFM_LOG_LEVEL_SILENCE
	default TFM_PARTITION_LOG_LEVEL_INFO
config TFM_PARTITION_LOG_LEVEL_DEBUG
	bool "Debug"
config TFM_PARTITION_LOG_LEVEL_INFO
	bool "Info"
config TFM_PARTITION_LOG_LEVEL_ERROR
	bool "Error"
config TFM_PARTITION_LOG_LEVEL_SILENCE
	bool "Off"
endchoice

endif # BUILD_WITH_TFM
