# i.MX RT6XX series configuration options

# Copyright (c) 2020, NXP
# SPDX-License-Identifier: Apache-2.0

if SOC_SERIES_IMX_RT6XX

config SOC_SERIES
	default "rt6xx"

config ROM_START_OFFSET
	default 0x1200 if NXP_IMX_RT6XX_BOOT_HEADER

config NUM_IRQS
	default 60

config ZTEST_NO_YIELD
	default y if (ZTEST && PM)


# The base address is determined from the zephyr,flash node with the following
# precedence:
# FlexSPI base address (if flash node is on a FlexSPI bus)
# node reg property (used for memory regions such as SRAM)

# Workaround for not being able to have commas in macro arguments

DT_CHOSEN_Z_FLASH := zephyr,flash
DT_COMPAT_FLEXSPI := nxp,imx-flexspi

# Macros to shorten Kconfig definitions
DT_CHOSEN_FLASH_NODE := $(dt_chosen_path,$(DT_CHOSEN_Z_FLASH))
DT_CHOSEN_FLASH_PARENT := $(dt_node_parent,$(DT_CHOSEN_FLASH_NODE))

config FLASH_BASE_ADDRESS
	default $(dt_node_reg_addr_hex,$(DT_CHOSEN_FLASH_PARENT),1) \
		if $(dt_node_has_compat,$(DT_CHOSEN_FLASH_PARENT),$(DT_COMPAT_FLEXSPI))
	default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_FLASH))

# The RT6xx has no internal flash. If the flash node has a size property,
# use that over the reg property. This is used for the external flash
# present on the board. Otherwise, fallback to the reg property
config FLASH_SIZE
	default $(dt_node_int_prop_int,$(DT_CHOSEN_FLASH_NODE),size,Kb) \
		if $(dt_node_has_prop,$(DT_CHOSEN_FLASH_NODE),size)
	default $(dt_chosen_reg_size_int,$(DT_CHOSEN_Z_FLASH),0,K)

if FLASH_MCUX_FLEXSPI_XIP

# Avoid RWW hazards by defaulting logging to disabled
choice FLASH_LOG_LEVEL_CHOICE
	default FLASH_LOG_LEVEL_OFF
endchoice

choice MEMC_LOG_LEVEL_CHOICE
	default MEMC_LOG_LEVEL_OFF
endchoice

endif

#
# MBEDTLS is larger but much faster than TinyCrypt so choose wisely
#
config MBEDTLS
#config TINYCRYPT
	default y if CSPRNG_ENABLED
	depends on ENTROPY_GENERATOR

if MBEDTLS
#
# MBEDTLS CTR_DRBG code path needs extra stack space for initialization than
# what the ztest_thread_stack defaults to.
#
config TEST_EXTRA_STACK_SIZE
	int
	default 1024
endif # MBEDTLS

source "soc/arm/nxp_imx/rt6xx/Kconfig.defconfig.mimxrt6*"

endif # SOC_SERIES_MIMXRT6XX
