# ST Microelectronics STM32 MCUs Flash driver config

# Copyright (c) 2016 RnDity Sp. z o.o.
# Copyright (c) 2017 BayLibre, SAS
# Copyright (c) 2022 Linaro Limited
# Copyright (c) 2023 Google Inc
# SPDX-License-Identifier: Apache-2.0

config STM32_MEMMAP
	bool "NOR Flash in MemoryMapped for XiP"
	depends on XIP && \
		    (DT_HAS_ST_STM32_OSPI_NOR_ENABLED || \
		     DT_HAS_ST_STM32_QSPI_NOR_ENABLED || \
		     DT_HAS_ST_STM32_XSPI_NOR_ENABLED)
	help
	  This option enables the XIP mode for the external NOR flash
	  mounted on STM32 boards.

menuconfig SOC_FLASH_STM32
	bool "STM32 flash driver"
	depends on DT_HAS_ST_STM32_FLASH_CONTROLLER_ENABLED
	select FLASH_HAS_DRIVER_ENABLED
	default y
	select FLASH_HAS_PAGE_LAYOUT
	select FLASH_HAS_EXPLICIT_ERASE
	select MPU_ALLOW_FLASH_WRITE if ARM_MPU
	select USE_STM32_HAL_FLASH if BT_STM32WBA
	select USE_STM32_HAL_FLASH_EX if BT_STM32WBA
	help
	  Enable flash driver for STM32 series

if SOC_FLASH_STM32

config FLASH_STM32_WRITE_PROTECT
	bool "Extended operation for flash write protection control"
	depends on SOC_SERIES_STM32F4X
	select FLASH_HAS_EX_OP
	default n
	help
	  Enables flash extended operation for enabling/disabling flash write
	  protection.

config FLASH_STM32_WRITE_PROTECT_DISABLE_PREVENTION
	bool "Prevent from disabling flash write protection"
	depends on FLASH_STM32_WRITE_PROTECT
	default n
	help
	  If enabled, all requests to disable flash write protection will be
	  blocked.

config FLASH_STM32_READOUT_PROTECTION
	bool "Extended operation for flash readout protection control"
	depends on SOC_SERIES_STM32F4X || SOC_SERIES_STM32L4X || \
			   SOC_SERIES_STM32G4X || SOC_SERIES_STM32F7X
	select FLASH_HAS_EX_OP
	default n
	help
	  Enables flash extended operation for enabling/disabling flash readout
	  protection.

config FLASH_STM32_READOUT_PROTECTION_DISABLE_ALLOW
	bool "Allow disabling readout protection"
	depends on FLASH_STM32_READOUT_PROTECTION
	default n
	help
	  With this option enabled it will be possible to disable readout
	  protection. On STM32 devices it will trigger flash mass erase!

config FLASH_STM32_READOUT_PROTECTION_PERMANENT_ALLOW
	bool "Allow enabling readout protection permanently"
	depends on FLASH_STM32_READOUT_PROTECTION
	default n
	help
	  With this option enabled it will be possible to enable readout
	  protection permanently.

config FLASH_STM32_BLOCK_REGISTERS
	bool "Extended operation for blocking option and control registers"
	select FLASH_HAS_EX_OP
	default n
	help
	  Enables flash extended operations that can be used to disable access
	  to option and control registers until reset. Disabling access to these
	  registers improves system security, because flash content (or
	  protection settings) can't be changed even when exploit was found.

config USE_MICROCHIP_QSPI_FLASH_WITH_STM32
	bool "Include patch for Microchip qspi flash when running with stm32"
	depends on DT_HAS_ST_STM32_QSPI_NOR_ENABLED
	help
	  Set to use Microchip qspi flash memories which supports
	  the Global Block Protection Unlock instruction (ULBPR - 98H),
	  and write with SPI_NOR_CMD_PP_1_1_4 on 4 lines

endif # SOC_FLASH_STM32
