# Microchip XEC ESPI configuration options

# Copyright (c) 2019 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

config ESPI_XEC
	bool "XEC Microchip ESPI driver"
	default y
	depends on DT_HAS_MICROCHIP_XEC_ESPI_ENABLED
	help
	  Enable the Microchip XEC ESPI driver for MEC15xx family.

config ESPI_XEC_V2
	bool "XEC Microchip ESPI V2 driver"
	default y
	depends on DT_HAS_MICROCHIP_XEC_ESPI_V2_ENABLED
	help
	  Enable the Microchip XEC ESPI driver for MEC172x series.

if ESPI_XEC || ESPI_XEC_V2

config ESPI_OOB_CHANNEL
	default y

config ESPI_FLASH_CHANNEL
	default y

config ESPI_PERIPHERAL_HOST_IO
	default  y

config ESPI_PERIPHERAL_HOST_IO_PVT
	default  y

config ESPI_PERIPHERAL_DEBUG_PORT_80
	default y

config ESPI_PERIPHERAL_UART
	default y

config ESPI_PERIPHERAL_UART_SOC_MAPPING
	int "SoC port exposed as logical eSPI UART"
	default 2 if SOC_SERIES_MEC1501X
	default 1 if SOC_SERIES_MEC172X
	depends on ESPI_PERIPHERAL_UART
	help
	  This tells the driver to which SoC UART to direct the UART traffic
	  send over eSPI from host.

config ESPI_OOB_BUFFER_SIZE
	int "eSPI OOB channel buffer size in bytes"
	default 128
	depends on ESPI_OOB_CHANNEL
	help
	  Use minimum RAM buffer size by default but allow applications to
	  override the value.
	  Maximum OOB payload is 73 bytes.

config ESPI_FLASH_BUFFER_SIZE
	int "eSPI Flash channel buffer size in bytes"
	default 256
	depends on ESPI_FLASH_CHANNEL
	help
	  Use maximum RAM buffer size defined by spec but allow applications
	  to override if eSPI host doesn't support it.

config ESPI_SAF_XEC
	bool "XEC Microchip ESPI SAF driver"
	default y
	depends on SOC_SERIES_MEC1501X
	depends on DT_HAS_MICROCHIP_XEC_ESPI_SAF_ENABLED
	help
	  Enable the Microchip XEC SAF ESPI driver for MEC15xx family.

config ESPI_SAF_XEC_V2
	bool "XEC Microchip ESPI SAF V2 driver"
	default y
	depends on SOC_SERIES_MEC172X
	depends on DT_HAS_MICROCHIP_XEC_ESPI_SAF_V2_ENABLED
	help
	  Enable the Microchip XEC SAF ESPI driver for MEC172x series.

endif #ESPI_XEC

if ESPI_XEC_V2

config ESPI_XEC_PERIPHERAL_ACPI_SHD_MEM_SIZE
	int "Host I/O peripheral port size for shared memory in MEC172X series"
	depends on ESPI_XEC_V2 || 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.

config ESPI_XEC_PERIPHERAL_HOST_CMD_PARAM_SIZE
	int "Host I/O peripheral port size for ec host command in MEC172X series"
	depends on ESPI_XEC_V2 || 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.

config ESPI_PERIPHERAL_8042_KBC
	default y

if ESPI_PERIPHERAL_CHANNEL

config ESPI_PERIPHERAL_XEC_MAILBOX
	bool "SoC Mailbox over eSPI"
	help
	  Enable a 32 byte mailbox interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_ACPI_EC2
	bool "SoC ACPI EC 2 over eSPI"
	help
	  Enable ACPI EC2 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_ACPI_EC3
	bool "SoC ACPI EC 3 over eSPI"
	help
	  Enable ACPI EC3 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_ACPI_EC4
	bool "SoC ACPI EC 4 over eSPI"
	help
	  Enable ACPI EC4 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_ACPI_PM1
	bool "SoC ACPI PM1 over eSPI"
	help
	  Enable ACPI PM1 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_EMI0
	bool "SoC EMI 0 over eSPI"
	help
	  Enable EMI 0 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_EMI1
	bool "SoC EMI 1 over eSPI"
	help
	  Enable EMI 1 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

config ESPI_PERIPHERAL_XEC_EMI2
	bool "SoC EMI 2 over eSPI"
	help
	  Enable EMI 2 interface accessible via Host I/O over the
	  ESPI Peripheral Channel.

endif #ESPI_PERIPHERAL_CHANNEL

config ESPI_SAF
	bool "XEC Microchip ESPI SAF driver"
	depends on ESPI_FLASH_CHANNEL
	help
	  Enable Slave Attached Flash eSPI driver. SAF depends upon ESPI XEC driver
	  and flash channel.

config ESPI_SAF_INIT_PRIORITY
	int "ESPI SAF driver initialization priority"
	depends on ESPI_SAF
	default 4
	help
	  Driver initialization priority for eSPI SAF driver.

config ESPI_PERIPHERAL_ACPI_EC_IBF_EVT_DATA
	bool "Read ACPI EC Event Data in IBF ISR"
	depends on ESPI_PERIPHERAL_CHANNEL
	help
	  Enable reading event data in ACPI EC IBF ISR. This is used in OS
	  environment where application expects IBF ISR to read data and pass
	  to callback.

endif #ESPI_XEC_V2

if ESPI_XEC_V2 && ESPI_PERIPHERAL_8042_KBC

config ESPI_PERIPHERAL_KBC_IBF_EVT_DATA
	bool "KBC event data format in IBF"
	help
	  Enable espi_evt_data_kbc format for encoding event in KBC IBF ISR

config ESPI_PERIPHERAL_KBC_OBE_CBK
	bool "KBC OBE Callback"
	help
	  Enable KBC OBE callback from OBE ISR

endif #ESPI_XEC_V2 && ESPI_PERIPHERAL_8042_KBC
