# Copyright 2024 NXP
# SPDX-License-Identifier: Apache-2.0

config SOC_FAMILY_NXP_IMXRT
	select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE

if SOC_FAMILY_NXP_IMXRT

# Source series Kconfig files first, so SOCs
# can override the defaults given here
rsource "*/Kconfig"

rsource "../common/Kconfig.flexspi_xip"

# Note- When SECOND_CORE_MCUX is set, the dependencies for this Kconfig
# should be set elsewhere, since the determination of which SOC core
# requires the boot header is SOC specific.
config NXP_IMXRT_BOOT_HEADER
	bool "Boot header"
	default y
	depends on !(BOOTLOADER_MCUBOOT || SECOND_CORE_MCUX)
	help
	  Enable data structures required by the boot ROM to boot the
	  application from an external flash device.

if NXP_IMXRT_BOOT_HEADER

rsource "../common/Kconfig.rom_loader"

choice BOOT_DEVICE
	prompt "Boot device"
	default BOOT_FLEXSPI_NOR

config BOOT_FLEXSPI_NOR
	bool "FlexSPI serial NOR"
	depends on HAS_MCUX_FLEXSPI

config BOOT_FLEXSPI_NAND
	bool "FlexSPI serial NAND"
	depends on HAS_MCUX_FLEXSPI

config BOOT_SEMC_NOR
	bool "SEMC parallel NOR"
	depends on HAS_MCUX_SEMC

config BOOT_SEMC_NAND
	bool "SEMC parallel NAND"
	depends on HAS_MCUX_SEMC

endchoice # BOOT_DEVICE

config FLEXSPI_CONFIG_BLOCK_OFFSET
	hex "FlexSPI config block offset"
	default 0x0 if BOOT_FLEXSPI_NOR
	default 0x400
	help
	  FlexSPI configuration block consists of parameters regarding specific
	  flash devices including read command sequence, quad mode enablement
	  sequence (optional), etc. The boot ROM expects FlexSPI configuration
	  parameter to be presented in serial nor flash.

config IMAGE_VECTOR_TABLE_OFFSET
	hex "Image vector table offset"
	default 0x1000 if BOOT_FLEXSPI_NOR || BOOT_SEMC_NOR
	default 0x400 if BOOT_FLEXSPI_NAND || BOOT_SEMC_NAND
	help
	  The Image Vector Table (IVT) provides the boot ROM with pointers to
	  the application entry point and device configuration data. The boot
	  ROM requires a fixed IVT offset for each type of boot device.

config DEVICE_CONFIGURATION_DATA
	bool "Device configuration data"
	help
	  Device configuration data (DCD) provides a sequence of commands to
	  the boot ROM to initialize components such as an SDRAM. This is
	  useful if your application expects components like SDRAM to be
	  initialized at boot time.

config EXTERNAL_MEM_CONFIG_DATA
	bool "External Memory Configuration Data"
	depends on !DEVICE_CONFIGURATION_DATA
	help
	  External memory configuration data (XMDC) provides an alternative
	  configuration sequences which allows to intilialize the external memory
	  at the boot time. This sequence allows to configure
	  external memories (such as SDRAM) with more advanced option.
	  This is a new alternative boot header compared to DCD, and DCD must be disabled
	  in order to select this option.

config EXTERNAL_MEM_CONFIG_OFFSET
	hex "External memory configuration offset"
	depends on EXTERNAL_MEM_CONFIG_DATA
	default 0x800 if SOC_SERIES_IMXRT118X
	default 0x1040 if BOOT_FLEXSPI_NOR || BOOT_SEMC_NOR
	help
	  As specified by the boot ROM, the External Memory configuration data must be
	  placed in a specific address location to be pointed by the boot ROM.

endif # NXP_IMXRT_BOOT_HEADER

config NXP_IMX_EXTERNAL_SDRAM
	bool "Allow access to external SDRAM region"
	help
	  Enable access to external SDRAM region managed by the SEMC. This
	  setting should be enabled when the application uses SDRAM, or
	  an MPU region will be defined to disable cached access to the
	  SDRAM memory space.

config NXP_IMX_EXTERNAL_HYPERRAM
	bool "Allow access to external HYPERRAM region"
	help
	  Enable access to external HYPERRAM region managed by the FLEXSPI.
	  This setting should be enabled when the application uses HYPERRAM,
	  or an MPU region will be defined to disable cached access to the
	  HYPERRAM memory space.
config SECOND_CORE_MCUX
	bool "Dual core operation on the RT11xx series"
	depends on SOC_SERIES_IMXRT11XX
	help
	  Indicates the second core will be enabled, and the part will run
	  in dual core mode. Enables dual core operation on the RT11xx series,
	  by booting an image targeting the Cortex-M4 from the Cortex-M7 CPU.
	  The M4 image will be loaded from flash into RAM based off a
	  generated header specifying the VMA and LMA of each memory section
	  to load

if SOC_SERIES_IMXRT10XX || SOC_SERIES_IMXRT11XX || SOC_SERIES_IMXRT118X

config PM_MCUX_GPC
	bool "MCUX general power controller driver"

config PM_MCUX_DCDC
	bool "MCUX dcdc converter module driver"

config PM_MCUX_PMU
	bool "MCUX power management unit driver"

config DCDC_VALUE
	hex "DCDC value for VDD_SOC"

config INIT_ARM_PLL
	bool "Initialize ARM PLL"

config INIT_VIDEO_PLL
	bool "Initialize Video PLL"

config INIT_ENET_PLL
	bool
	help
	  If y, the Ethernet PLL is initialized. Always enabled on e.g.
	  MIMXRT1021 - see commit 17f4d6bec7 ("soc: nxp_imx: fix ENET_PLL selection
	  for MIMXRT1021").

config INIT_SYS_PLL
	bool "Initialize System PLL"

endif # SOC_SERIES_IMXRT10XX || SOC_SERIES_IMXRT11XX || SOC_SERIES_IMXRT118X

endif # SOC_FAMILY_NXP_IMXRT
