# NPCX eSPI driver configuration options

# Copyright (c) 2020 Nuvoton Technology Corporation.
# SPDX-License-Identifier: Apache-2.0

config ESPI_NPCX
	bool "Nuvoton NPCX embedded controller (EC) ESPI driver"
	default y
	depends on SOC_FAMILY_NPCX
	depends on DT_HAS_NUVOTON_NPCX_ESPI_ENABLED
	help
	  This option enables the Intel Enhanced Serial Peripheral Interface
	  (eSPI) for NPCX family of processors.

config ESPI_NPCX_PERIPHERAL_ACPI_SHD_MEM_SIZE
	int "Host I/O peripheral port size for shared memory in npcx series"
	depends on ESPI_NPCX || ESPI_PERIPHERAL_ACPI_SHM_REGION
	default 256
	help
	  This is the port size used by the Host and EC to communicate over
	  the shared memory region to return the ACPI response data. Please
	  notice the valid value in npcx ec series for this option is 8/16/32/
	  64/128/256/512/1024/2048/4096 bytes.

config ESPI_NPCX_PERIPHERAL_HOST_CMD_PARAM_SIZE
	int "Host I/O peripheral port size for ec host command in npcx series"
	depends on ESPI_NPCX || ESPI_PERIPHERAL_EC_HOST_CMD
	default 256
	help
	  This is the port size used by the Host and EC to communicate over
	  the shared memory region to return the host command parameter data.
	  Please notice the valid value in npcx ec series for this option is
	  8/16/32/64/128/256/512/1024/2048/4096 bytes.

config ESPI_NPCX_BYPASS_CH_ENABLE_FATAL_ERROR
	bool
	depends on SOC_SERIES_NPCX7 || SOC_SERIES_NPCX9
	default y
	help
	  Workaround the issue documented in NPCX99nF errata rev1_2, No.3.10.
	  Enabling an eSPI channel during an eSPI transaction might
	  (with low probability) cause the eSPI_SIF module to transition to
	  a wrong state and therefore response with FATAL_ERROR on an incoming
	  transaction.

config ESPI_NPCX_PERIPHERAL_DEBUG_PORT_80_MULTI_BYTE
	bool "Host can write 1/2/4 bytes of Port80 data in a eSPI transaction"
	depends on SOC_SERIES_NPCX9 && ESPI_PERIPHERAL_DEBUG_PORT_80
	help
	  EC can accept 1/2/4 bytes of Port 80 data written from the Host in an
	  eSPI transaction.

config ESPI_NPCX_PERIPHERAL_DEBUG_PORT_80_RING_BUF_SIZE
	int "Debug Port80 ring buffer size"
	depends on ESPI_NPCX_PERIPHERAL_DEBUG_PORT_80_MULTI_BYTE
	default 256
	help
	  The size of the ring buffer in byte used by the Port80 ISR to store
	  Postcodes from Host.

config ESPI_TAF_NPCX
	bool "Nuvoton NPCX embedded controller (EC) ESPI TAF driver"
	depends on SOC_SERIES_NPCX4
	help
	  This option enables the Intel Enhanced Serial Peripheral Interface
	  Target Attached Flash (eSPI TAF) for NPCX4 family of processors.

choice ESPI_TAF_ACCESS_MODE_CHOICE
	prompt "eSPI TAF Read Access Mode"
	default ESPI_TAF_AUTO_MODE

config ESPI_TAF_AUTO_MODE
	bool "eSPI TAF Automatic Mode"
	help
	  This is the setting to use auto mode for eSPI TAF read.

config ESPI_TAF_MANUAL_MODE
	bool "eSPI TAF Manual Mode"
	help
	  This is the setting to use manual mode for eSPI TAF read.

endchoice

config ESPI_TAF_PR_NUM
	int "Sets of protection region settings"
	default 16
	help
	  This size is display how many group of slave attached flash protection
	  region.

# The default value 'y' for the existing options if ESPI_NPCX is selected.
if ESPI_NPCX

config ESPI_OOB_CHANNEL
	default  y

config ESPI_PERIPHERAL_8042_KBC
	default y

config ESPI_PERIPHERAL_HOST_IO
	default y

config ESPI_PERIPHERAL_DEBUG_PORT_80
	default y

config ESPI_PERIPHERAL_EC_HOST_CMD
	default y

config ESPI_PERIPHERAL_ACPI_SHM_REGION
	default y

config ESPI_PERIPHERAL_CUSTOM_OPCODE
	default y

config ESPI_NPCX_SUPP_VW_GPIO
	bool "Indicates that the eSPI hardware supports virtual wire GPIOs"
	default y if SOC_SERIES_NPCX9 || SOC_SERIES_NPCX4
	help
	  Selected if NPCX series supports virtual wire GPIOs in eSPI module.

config ESPI_NPCX_CAF_GLOBAL_RESET_WORKAROUND
	bool
	default y if SOC_SERIES_NPCX4 && ESPI_FLASH_CHANNEL
	help
	  Workaround the issue "Global Reset" in the npcx4 SoC errata.

endif #ESPI_NPCX
