# 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'"
	depends on TFM_PARTITION_PLATFORM # Specfically TFM_SP_PLATFORM_NV_COUNTER service
	depends on TFM_PARTITION_INTERNAL_TRUSTED_STORAGE
	depends on TFM_PARTITION_CRYPTO
	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'"
	depends on TFM_PARTITION_CRYPTO
	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
	depends on !TFM_SFN # Currently using PSA Framework version 1.0
	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'"
	depends on TFM_LIBRARY
	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
