# SPDX-License-Identifier: GPL-2.0-or-later

config BOARD_GOOGLE_BASEBOARD_TREMBYLE
	def_bool n

config BOARD_GOOGLE_BASEBOARD_DALBOZ
	def_bool n

if BOARD_GOOGLE_BASEBOARD_TREMBYLE || BOARD_GOOGLE_BASEBOARD_DALBOZ

config BOARD_SPECIFIC_OPTIONS
	def_bool y
	select SOC_AMD_COMMON_BLOCK_USE_ESPI
	select SOC_AMD_PICASSO
	select SOC_AMD_COMMON_BLOCK_ACPI_DPTC if BOARD_GOOGLE_MORPHIUS
	select SOC_AMD_COMMON_BLOCK_GRAPHICS_ATIF
	select BOARD_ROMSIZE_KB_16384
	select DRIVERS_AMD_I2S_MACHINE_DEV
	select DISABLE_SPI_FLASH_ROM_SHARING
	select DRIVERS_GENERIC_GPIO_KEYS
	select DRIVERS_GENERIC_ALC1015
	select DRIVERS_I2C_GENERIC
	select DRIVERS_I2C_HID
	select EC_GOOGLE_CHROMEEC
	select EC_GOOGLE_CHROMEEC_AUDIO_CODEC
	select EC_GOOGLE_CHROMEEC_BOARDID
	select EC_GOOGLE_CHROMEEC_ESPI
	select EC_GOOGLE_CHROMEEC_INCLUDE_SSFC_IN_FW_CONFIG
	select EC_GOOGLE_CHROMEEC_I2C_TUNNEL
	select EC_GOOGLE_CHROMEEC_SKUID
	select ELOG
	select ELOG_BOOT_COUNT
	select ELOG_GSMI
	select FW_CONFIG
	select FW_CONFIG_SOURCE_CHROMEEC_CBI
	select GFXUMA
	select GOOGLE_SMBIOS_MAINBOARD_VERSION
	select MAINBOARD_HAS_CHROMEOS
	select AMD_SOC_CONSOLE_UART
	select I2C_TPM
	select TPM_GOOGLE_CR50
	select MAINBOARD_HAS_TPM2
	select PCIEXP_ASPM
	select PCIEXP_CLK_PM
	select PCIEXP_COMMON_CLOCK
	select PCIEXP_L1_SUB_STATE
	select HAVE_EM100_SUPPORT
	select SYSTEM_TYPE_LAPTOP
	select DRIVERS_GENERIC_MAX98357A
	select HAVE_ACPI_RESUME
	select DRIVERS_USB_ACPI
	select DRIVERS_UART_ACPI
	select DRIVERS_GENERIC_BAYHUB_LV2

config ELOG_BOOT_COUNT_CMOS_OFFSET
	int
	default 144

# FMDFILE is set here so that coreboot build picks up this flash map layout
# even when CHROMEOS is not selected when building upstream.
config FMDFILE
	default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/chromeos.fmd"

config MAINBOARD_DIR
	default "google/zork"

config VARIANT_DIR
	default "ezkinil" if BOARD_GOOGLE_EZKINIL
	default "morphius" if BOARD_GOOGLE_MORPHIUS
	default "trembyle" if BOARD_GOOGLE_TREMBYLE
	default "dalboz" if BOARD_GOOGLE_DALBOZ
	default "berknip" if BOARD_GOOGLE_BERKNIP
	default "vilboz" if BOARD_GOOGLE_VILBOZ
	default "woomax" if BOARD_GOOGLE_WOOMAX
	default "dirinboz" if BOARD_GOOGLE_DIRINBOZ
	default "shuboz" if BOARD_GOOGLE_SHUBOZ
	default "gumboz" if BOARD_GOOGLE_GUMBOZ

config MAINBOARD_PART_NUMBER
	default "Ezkinil" if BOARD_GOOGLE_EZKINIL
	default "Morphius" if BOARD_GOOGLE_MORPHIUS
	default "Trembyle" if BOARD_GOOGLE_TREMBYLE
	default "Dalboz" if BOARD_GOOGLE_DALBOZ
	default "Berknip" if BOARD_GOOGLE_BERKNIP
	default "Vilboz" if BOARD_GOOGLE_VILBOZ
	default "Woomax" if BOARD_GOOGLE_WOOMAX
	default "Dirinboz" if BOARD_GOOGLE_DIRINBOZ
	default "Shuboz" if BOARD_GOOGLE_SHUBOZ
	default "Gumboz" if BOARD_GOOGLE_GUMBOZ

config DEVICETREE
	default "variants/baseboard/devicetree_trembyle.cb" if BOARD_GOOGLE_BASEBOARD_TREMBYLE
	default "variants/baseboard/devicetree_dalboz.cb" if BOARD_GOOGLE_BASEBOARD_DALBOZ

config OVERRIDE_DEVICETREE
	default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb"

config MAINBOARD_FAMILY
	string
	default "Google_Zork"

config ONBOARD_VGA_IS_PRIMARY
	bool
	default y

config VGA_BIOS
	default y if USE_AMD_BLOBS

config VBOOT
	bool
	# selected by default as PSP verstage required for booting at present time
	default y
	select EC_GOOGLE_CHROMEEC_SWITCHES
	select VBOOT_LID_SWITCH
	select VBOOT_STARTS_BEFORE_BOOTBLOCK

config VBOOT_VBNV_OFFSET
	hex
	default 0x2A

config CHROMEOS
	# Use default libpayload config
	select LP_DEFCONFIG_OVERRIDE if PAYLOAD_DEPTHCHARGE

config AMD_FWM_POSITION_INDEX
	int
	default 2

config DRIVER_TPM_I2C_BUS
	hex
	default 0x03

config DRIVER_TPM_I2C_ADDR
	hex
	default 0x50

config VARIANT_SUPPORTS_PRE_V3_SCHEMATICS
	bool
	default y if BOARD_GOOGLE_TREMBYLE
	default y if BOARD_GOOGLE_EZKINIL
	default y if BOARD_GOOGLE_MORPHIUS
	default y if BOARD_GOOGLE_BERKNIP
	default y if BOARD_GOOGLE_DALBOZ
	default n
	help
	  Whether this variant supports pre-v3 version of schematics.
	  Eventually, when a variant moves to a point where it no
	  longer has to support pre-v3 schematics, `default y` entry
	  for it can be dropped.

config VARIANT_SUPPORTS_PRE_V3_6_SCHEMATICS
	bool
	default y if BOARD_GOOGLE_TREMBYLE
	default y if BOARD_GOOGLE_EZKINIL
	default y if BOARD_GOOGLE_MORPHIUS
	default y if BOARD_GOOGLE_BERKNIP
	default y if BOARD_GOOGLE_DALBOZ
	default y if BOARD_GOOGLE_WOOMAX
	default y if BOARD_GOOGLE_VILBOZ
	default y if BOARD_GOOGLE_DIRINBOZ
	default n

config VARIANT_MIN_BOARD_ID_V3_6_SCHEMATICS
	int
	depends on VARIANT_SUPPORTS_PRE_V3_6_SCHEMATICS
	default 4 if BOARD_GOOGLE_TREMBYLE
	default 3 if BOARD_GOOGLE_EZKINIL
	default 4 if BOARD_GOOGLE_MORPHIUS
	default 3 if BOARD_GOOGLE_BERKNIP
	default 3 if BOARD_GOOGLE_DALBOZ
	default 1 if BOARD_GOOGLE_WOOMAX
	default 2 if BOARD_GOOGLE_VILBOZ
	default 2 if BOARD_GOOGLE_DIRINBOZ
	default 256
	help
	  Minimum board version where the variant starts supporting
	  v3.6+ version of reference schematics.

config VARIANT_MIN_BOARD_ID_V3_SCHEMATICS
	int
	depends on VARIANT_SUPPORTS_PRE_V3_SCHEMATICS
	default 4 if BOARD_GOOGLE_TREMBYLE
	default 3 if BOARD_GOOGLE_EZKINIL
	default 3 if BOARD_GOOGLE_MORPHIUS
	default 2 if BOARD_GOOGLE_BERKNIP
	default 3 if BOARD_GOOGLE_DALBOZ
	default 256
	help
	  Minimum board version where the variant starts supporting
	  v3 version of reference schematics.

config VARIANT_SUPPORTS_WIFI_POWER_ACTIVE_HIGH
	bool
	default y if VARIANT_SUPPORTS_PRE_V3_SCHEMATICS
	default y if BOARD_GOOGLE_BERKNIP
	default y if BOARD_GOOGLE_VILBOZ
	default y if BOARD_GOOGLE_WOOMAX
	default n
	help
	  Whether this variant supports active high power enable for
	  WiFi. For pre-v3 schematics, this is always true. There are
	  some variants which used v3 schematics, but did not pick up
	  the change for active low WiFi power enable. Those variants
	  will have to set this config to true. Eventually, when a
	  variant needs to only support v3 schematics with active low
	  power enable for WiFi, `default y` entry for it can be
	  dropped.

config VARIANT_MIN_BOARD_ID_WIFI_POWER_ACTIVE_LOW
	int
	depends on VARIANT_SUPPORTS_WIFI_POWER_ACTIVE_HIGH
	default 3 if BOARD_GOOGLE_BERKNIP
	default 2 if BOARD_GOOGLE_VILBOZ
	default 1 if BOARD_GOOGLE_WOOMAX
	default VARIANT_MIN_BOARD_ID_V3_SCHEMATICS
	help
	  Minimum board version where the variant starts supporting
	  active low power enable for WiFi.

config VARIANT_HAS_FPMCU
	bool
	default y if BOARD_GOOGLE_BERKNIP
	default y if BOARD_GOOGLE_MORPHIUS
	default n
	help
	  Select y if any SKU of the board has a fingerprint sensor

config VARIANT_MAX_BOARD_ID_BROKEN_FMPCU_POWER
	int
	default 4 if BOARD_GOOGLE_MORPHIUS
	default 3 if BOARD_GOOGLE_BERKNIP
	default 0
	help
	  Last board version that needs the extra delay for FPMCU init.

if !EM100	# EM100 defaults in soc/amd/common/blocks/spi/Kconfig
config EFS_SPI_READ_MODE
	default 4          # Dual IO (1-2-2)

config EFS_SPI_SPEED
	default 0	# 66MHz

config EFS_SPI_MICRON_FLAG
	default 0

config NORMAL_READ_SPI_SPEED
	default 1	# 33MHz

config ALT_SPI_SPEED
	default 0	# 66MHz

config TPM_SPI_SPEED
	default 0	# 66MHz

endif # !EM100

config CHROMEOS_WIFI_SAR
	bool
	default y if CHROMEOS
	select DRIVERS_WIFI_GENERIC
	select DSAR_ENABLE
	select SAR_ENABLE
	select USE_SAR
	select GEO_SAR_ENABLE

endif # BOARD_GOOGLE_BASEBOARD_TREMBYLE || BOARD_GOOGLE_BASEBOARD_DALBOZ
