##
## This file is part of the coreboot project.
##
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; version 2 of the License.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
if BOARD_ASUS_P2B || BOARD_ASUS_P2B_D || BOARD_ASUS_P2B_DS || BOARD_ASUS_P2B_F || BOARD_ASUS_P2B_LS

config BASE_ASUS_P2B_D
	def_bool n
	select SDRAMPWR_4DIMM
	select HAVE_MP_TABLE
	select IOAPIC
	select SMP

config BOARD_SPECIFIC_OPTIONS
	def_bool y
	select CPU_INTEL_SLOT_1
	select NORTHBRIDGE_INTEL_I440BX
	select SOUTHBRIDGE_INTEL_I82371EB
	select SUPERIO_WINBOND_W83977TF
	select HAVE_PIRQ_TABLE
	select BOARD_ROMSIZE_KB_256
	select SDRAMPWR_4DIMM if BOARD_ASUS_P2B_LS
	select HAVE_ACPI_TABLES if BOARD_ASUS_P2B || BOARD_ASUS_P2B_LS
	select BASE_ASUS_P2B_D if BOARD_ASUS_P2B_D || BOARD_ASUS_P2B_DS

config MAX_CPUS
	int
	default 2 if BASE_ASUS_P2B_D

config MAINBOARD_DIR
	string
	default "asus/p2b"

config MAINBOARD_PART_NUMBER
	string
	default "P2B" if BOARD_ASUS_P2B
	default "P2B-D" if BOARD_ASUS_P2B_D
	default "P2B-DS" if BOARD_ASUS_P2B_DS
	default "P2B-F" if BOARD_ASUS_P2B_F
	default "P2B-LS" if BOARD_ASUS_P2B_LS

config VARIANT_DIR
	string
	default "p2b" if BOARD_ASUS_P2B
	default "p2b-d" if BOARD_ASUS_P2B_D
	default "p2b-ds" if BOARD_ASUS_P2B_DS
	default "p2b-f" if BOARD_ASUS_P2B_F
	default "p2b-ls" if BOARD_ASUS_P2B_LS

config DEVICETREE
	string
	default "variants/$(CONFIG_VARIANT_DIR)/devicetree.cb" if ! BOARD_ASUS_P2B

config IRQ_SLOT_COUNT
	int
	default 8 if BOARD_ASUS_P2B_LS
	default 7 if BOARD_ASUS_P2B_F || BOARD_ASUS_P2B_DS
	default 6

endif
