# 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_GRAPHICS_ATIF
	select VGA_BIOS
	select BOARD_ROMSIZE_KB_16384
	select DRIVERS_AMD_I2S_MACHINE_DEV
	select DISABLE_SPI_FLASH_ROM_SHARING
	select DRIVERS_GENERIC_GPIO_KEYS
	select DRIVERS_I2C_GENERIC
	select DRIVERS_I2C_HID
	select DRIVERS_I2C_SX9324
	select EC_GOOGLE_CHROMEEC
	select EC_GOOGLE_CHROMEEC_AUDIO_CODEC
	select EC_GOOGLE_CHROMEEC_BOARDID
	select EC_GOOGLE_CHROMEEC_ESPI
	select EC_GOOGLE_CHROMEEC_I2C_TUNNEL
	select EC_GOOGLE_CHROMEEC_SKUID
	select ELOG
	select ELOG_BOOT_COUNT
	select ELOG_GSMI
	select GFXUMA
	select GOOGLE_SMBIOS_MAINBOARD_VERSION
	select MAINBOARD_HAS_CHROMEOS
	select AMD_SOC_CONSOLE_UART
	select MAINBOARD_HAS_I2C_TPM_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
	string
	default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/chromeos.fmd"

config MAINBOARD_DIR
	string
	default "google/zork"

config VARIANT_DIR
	string
	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
	string
	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
	string
	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
	string
	default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb"

config MAINBOARD_FAMILY
	string
	default "Google_Zork"

config ONBOARD_VGA_IS_PRIMARY
	bool
	default y

config VBOOT
	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 PICASSO_FW_A_POSITION
	hex
	default 0xFF012040
	depends on VBOOT_SLOTS_RW_AB
	help
	  Location of the AMD firmware in the RW_A region. This is the
	  start of the RW-A region + 64 bytes for the cbfs header.

config PICASSO_FW_B_POSITION
	hex
	default 0xFF312040
	depends on VBOOT_SLOTS_RW_AB
	help
	  Location of the AMD firmware in the RW_B region. This is the
	  start of the RW-A region + 64 bytes for the cbfs header.

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.

config EFS_SPI_READ_MODE
	int
	default 0 if EM100 # Normal read mode
	default 2          # Dual IO (1-1-2)

config EFS_SPI_SPEED
	int
	default 3 if EM100 # 16.66 MHz
	default 0          # 66.66 MHz

config EFS_SPI_MICRON_FLAG
	int
	default 0

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
