#;/*******************************************************************************
#;Copyright (C) Marvell International Ltd. and its affiliates
#;
#;This software file (the "File") is owned and distributed by Marvell
#;International Ltd. and/or its affiliates ("Marvell") under the following
#;alternative licensing terms.  Once you have made an election to distribute the
#;File under one of the following license alternatives, please (i) delete this
#;introductory statement regarding license alternatives, (ii) delete the two
#;license alternatives that you have not elected to use and (iii) preserve the
#;Marvell copyright notice above.
#;
#;********************************************************************************
#;Marvell Commercial License Option
#;
#;If you received this File from Marvell and you have entered into a commercial
#;license agreement (a "Commercial License") with Marvell, the File is licensed
#;to you under the terms of the applicable Commercial License.
#;
#;********************************************************************************
#;Marvell GPL License Option
#;
#;If you received this File from Marvell, you may opt to use, redistribute and/or
#;modify this File in accordance with the terms and conditions of the General
#;Public License Version 2, June 1991 (the "GPL License"), a copy of which is
#;available along with the File in the license.txt file or by writing to the Free
#;Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
#;on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
#;
#;THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
#;WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
#;DISCLAIMED.  The GPL License provides additional details about this warranty
#;disclaimer.
#;********************************************************************************
#;Marvell BSD License Option
#;
#;If you received this File from Marvell, you may opt to use, redistribute and/or
#;modify this File under the following licensing terms.
#;Redistribution and use in source and binary forms, with or without modification,
#;are permitted provided that the following conditions are met:
#;
#;   *   Redistributions of source code must retain the above copyright notice,
#;	    this list of conditions and the following disclaimer.
#;
#;    *   Redistributions in binary form must reproduce the above copyright
#;        notice, this list of conditions and the following disclaimer in the
#;        documentation and/or other materials provided with the distribution.
#;
#;    ;*   Neither the name of Marvell nor the names of its contributors may be
#;        used to endorse or promote products derived from this software without
#;        specific prior written permission.
#;
#;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
#;ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#;(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
#;ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#;(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#;SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#;
#;*******************************************************************************/

sinclude $(TOPDIR)/include/autoconf.mk

CFLAGS =

# LIBNAME and SILNAME may be overriden in SoC cases bellow
BOARDNAME = $(BOARD)
SILNAME = $(BOARD)
LIBNAME = $(BOARD)
#INCNAME - include path - by default = BOARD, for A90 BOARD=A380 and INCNAME=A390
INCNAME = $(BOARD)

# CUSTOMER
ifeq "$(CONFIG_CUSTOMER_BOARD_SUPPORT)" "y"
  CFLAGS += -DCONFIG_CUSTOMER_BOARD_SUPPORT
endif
ifeq "$(CONFIG_CUSTOMER_BOARD_0)"  "y"
  CFLAGS += -DCONFIG_CUSTOMER_BOARD_0
endif
ifeq "$(CONFIG_CUSTOMER_BOARD_1)"  "y"
  CFLAGS += -DCONFIG_CUSTOMER_BOARD_1
endif
ifeq "$(CONFIG_CLEARFOG_BOARD)"  "y"
  CFLAGS += -DCONFIG_CLEARFOG_BOARD
endif
ifeq "$(CONFIG_GFCH100)"  "y"
  CFLAGS += -DCONFIG_GFCH100
endif

# AXP
ifeq "$(CONFIG_DB_78x60_BP_REV2)"  "y"
  CFLAGS += -DCONFIG_DB_78x60_BP_REV2
endif
ifeq "$(CONFIG_DB_78X60_PCAC_REV2)"  "y"
  CFLAGS += -DCONFIG_DB_78X60_PCAC_REV2
endif
ifeq "$(CONFIG_RD_78460_SERVER_REV2)"  "y"
  CFLAGS += -DCONFIG_RD_78460_SERVER_REV2
endif
ifeq "$(CONFIG_DB_784MP_GP)"  "y"
  CFLAGS += -DCONFIG_DB_784MP_GP
endif
ifeq "$(CONFIG_DB_78X60_AMC)"  "y"
  CFLAGS += -DCONFIG_DB_78X60_AMC
endif
ifeq "$(CONFIG_RD_78460_CUSTOMER)"  "y"
  CFLAGS += -DCONFIG_RD_78460_CUSTOMER
endif

# A370
ifeq "$(CONFIG_DB_88F6710_BP)"  "y"
  CFLAGS += -DCONFIG_DB_88F6710_BP
endif
ifeq "$(CONFIG_RD_88F6710)"  "y"
  CFLAGS += -DCONFIG_RD_88F6710
endif
ifeq "$(CONFIG_DB_88F6710_PCAC)"  "y"
  CFLAGS += -DCONFIG_DB_88F6710_PCAC
endif

# A375
ifeq "$(CONFIG_ARMADA_375)"  "y"
  CFLAGS += -DCONFIG_ARMADA_375
  ifeq "$(CONFIG_ALP_A375_ZX_REV)" "y"
    CFLAGS += -DCONFIG_ALP_A375_ZX_REV
  endif
endif

# ALP
ifeq "$(CONFIG_AVANTA_LP)"  "y"
  CFLAGS += -DCONFIG_AVANTA_LP
  ifeq "$(CONFIG_ALP_A375_ZX_REV)" "y"
    CFLAGS += -DCONFIG_ALP_A375_ZX_REV
  endif
endif

# A38x
ifeq "$(CONFIG_ARMADA_38X)"  "y"
  CFLAGS += -DCONFIG_ARMADA_38X
  NEW_TIP = yes
endif

# A39X
ifeq "$(CONFIG_ARMADA_39X)"  "y"
  CFLAGS += -DCONFIG_ARMADA_39X
  ifneq "$(CONFIG_CUSTOMER_BOARD_SUPPORT)" "y"
    CFLAGS += -DCONFIG_CMD_BOARDCFG
  endif
  NEW_TIP = yes
  LIBNAME = a39x
  INCNAME = a39x
endif

# BOBCAT2
ifeq "$(CONFIG_BOBCAT2)"  "y"
  CFLAGS += -DCONFIG_BOBCAT2
  NEW_TIP = yes
  SILNAME = Bc2
  LIBNAME = msys_bc2
  BOARDNAME = msys_bc2
ifeq "$(CONFIG_DB_BOBCAT2)"  "y"
  CFLAGS += -DCONFIG_DB_BOBCAT2
endif
ifeq "$(CONFIG_RD_BOBCAT2)"  "y"
  CFLAGS += -DCONFIG_RD_BOBCAT2
endif
ifeq "$(CONFIG_RD_MTL_BOBCAT2)"  "y"
  CFLAGS += -DCONFIG_RD_BOBCAT2
endif
endif

# ALLEYCAT3
ifeq "$(CONFIG_ALLEYCAT3)"  "y"
  NEW_TIP = yes
  SILNAME = Ac3
  LIBNAME = msys_ac3
  BOARDNAME = msys_ac3
endif
ifeq "$(CONFIG_ALLEYCAT3)"  "y"
  CFLAGS += -DCONFIG_ALLEYCAT3
endif

CROSS    = $(CROSS_COMPILE_BH)
LD       = $(CROSS)ld
CC       = $(CROSS)gcc
AS       = $(CROSS)as
OBJCOPY  = $(CROSS)objcopy
OBJDUMP  = $(CROSS)objdump
HOSTCC   = gcc

RM       = @rm -rf
CP       = @cp
MKDIR    = @mkdir -p
CD       = @cd
MV       = @mv
CAT      = @cat
PWD      = @pwd
ECHO     = @echo

MVFLAGS = MV_CPU_LE=1
ifeq ($(ARMARCH),7)
CFLAGS += -mno-tune-ldrd -nostdlib -mabi=aapcs
endif

CPUOPTS  = -mthumb -mthumb-interwork -march=armv7 -mlittle-endian

BH_ROOT_DIR  = $(TOPDIR)/tools/marvell/bin_hdr
INCLUDE      = -I$(BH_ROOT_DIR)/src_ddr -I$(BH_ROOT_DIR)/src_phy/$(BOARD) -I$(BH_ROOT_DIR)/inc/common \
	       -I$(BH_ROOT_DIR)/inc/ddr3_soc/$(INCNAME)  -I$(BH_ROOT_DIR)/inc/ddr3_soc/$(BOARD) -I$(BH_ROOT_DIR)/platform/sysEnv/$(BOARD) -I$(TOPDIR)/include -I$(BH_ROOT_DIR)/src_init/$(BOARD)
HOSTCFLAGS   = -Wall $(INCLUDE)

ifeq ($(BIN_HDR_DEBUG),1)
DEBUG_FLAGS += -g -O0
DEBUG_MODE_FLAG = yes
else
ifeq ($(NEW_TIP),yes)
DEBUG_FLAGS += -Os
DEBUG_MODE_FLAG = no
else
DEBUG_FLAGS += -g -O0
DEBUG_MODE_FLAG = no
endif
endif

CFLAGS   += -Wall $(INCLUDE) $(DEBUG_FLAGS) $(CPUOPTS) -msoft-float -mabi=aapcs

ifeq ($(BOARD),msys_bc2)
CFLAGS   += -fPIE -fno-zero-initialized-in-bss -fno-unwind-tables
else
CFLAGS   += -fdata-sections -ffunction-sections
endif

EXTRA_LD_FLAGS = -Wl,--gc-sections --entry=_start

ifeq ($(DDRTYPE),ddr4)
CFLAGS += -DCONFIG_DDR4
else
CFLAGS += -DCONFIG_DDR3
endif

CPPFLAGS = $(foreach FLAG, $(MVFLAGS), $(addprefix -D, $(FLAG)))
ASFLAGS  = $(foreach FLAG, $(MVFLAGS), $(addprefix --defsym , $(FLAG)))
LDFLAGS  = -static -nostartfiles -unwind-tables  -nostdlib -Wl,--build-id=none $(EXTRA_LD_FLAGS)



