#############################################
#	Arch/Board Generic Setting	    #
#############################################
#CPU=mips
OS=linux

ifeq ($(KVER),$(filter 3.14%,$(KVER)))
	OS_VER=3_14
endif

ifeq ($(KVER),$(filter 4.4%,$(KVER)))
	OS_VER=4_4
endif

ifeq ($(KVER),$(filter 4.1%,$(KVER)))
	OS_VER=4_1
endif

ifeq ($(KVER),$(filter 4.9%,$(KVER)))
	OS_VER=4_9
endif

ifeq ($(KVER),$(filter 5.4%,$(KVER)))
	OS_VER=5_4
endif

ifeq ($(KVER),$(filter 6.1%,$(KVER)))
	OS_VER=6_1
endif
ifeq ($(KVER), 3.4.0)
	OS_VER=3_4
endif

ifeq ($(KVER), 3.18)
	OS_VER=3_18
endif

ifeq ($(KVER), 3.18.21)
	OS_VER=3_18
endif

ifeq ($(KVER), 3.4.103)
	OS_VER=3_4
endif

ifeq ($(KVER), 3.3.8)
	OS_VER=3_2
endif

ifeq ($(ARCH), arm)
	BOARD=ipq806x
endif

ifeq ($(ARCH), mips)
	BOARD=ar71xx
endif

ifeq ($(BOARD), ar71xx)
	BOARD_NAME=BOARD_AR71XX
endif

ifeq ($(BOARD), ipq806x)
	BOARD_NAME=BOARD_IPQ806X
endif

OS_SUB=31

ifndef OS_VER
	OS_VER=2_6
endif

#OS subversion, 2.6.31 for WASP (db120)
#OS_SUB=31

#GCC version, 3 or 4
#GCC_VER=4

#############################################
#	MIPS Linux2.6 Specfic Setting       #
#############################################
#pb45
#TOOL_PATH=/disk/pb45/sw/build/gcc-3.4.4-2.16.1/build_mips_nofpu/bin
#SYS_PATH=/disk/pb45/sw/linux/kernels/mips-linux-2.6.15

#ap81 compatiable with OpenWRT
ifndef TOOL_PATH
	TOOL_PATH=/disk/ap81fus/sw/build/gcc-3.4.4-2.16.1/build_mips/bin
endif

ifndef SYS_PATH
	SYS_PATH=/disk/ap81fus/sw/linux/kernels/mips-linux-2.6.15
endif

ifeq ($(ARCH), mips)
	CPU_CFLAG=-Wstrict-prototypes -fomit-frame-pointer -G 0 -mno-abicalls -fno-common -fno-strict-aliasing -O2 -fno-pic -pipe -mabi=32 -march=mips32r2 -DMODULE -mlong-calls -DEXPORT_SYMTAB -D$(BOARD_NAME)
endif

#db120
ifeq ($(BOARD_TYPE),db12x)
	OS_SUB=31
	GCC_VER=4
	TOOL_PATH=$(TOPDIR)/build/gcc-4.3.3/build_mips/staging_dir/usr/bin
	SYS_PATH=$(TOPDIR)/linux/kernels/mips-linux-2.6.31
	CPU_CFLAG=-Wstrict-prototypes -fomit-frame-pointer -G 0 -mno-abicalls -fno-strict-aliasing -O2 -fno-pic -pipe -mabi=32 -march=mips32r2 -DMODULE -mlong-calls -DEXPORT_SYMTAB
endif

#############################################
#	ARM Specfic Setting                 #
#############################################
ifeq ($(ARCH), arm)
	ifeq ($(KVER), 3.4.0)
		CPU_CFLAG=-D__LINUX_ARM_ARCH__=7  -DMODULE -fno-common -DCONFIG_MMU -D$(BOARD_NAME)
	endif
	ifeq ($(KVER), 3.4.103)
		CPU_CFLAG=-D__LINUX_ARM_ARCH__=7  -DMODULE -fno-common -DCONFIG_MMU -D$(BOARD_NAME)
	endif
	ifeq ($(KVER), 3.18.21)
		CPU_CFLAG=-D__LINUX_ARM_ARCH__=7  -DMODULE -fno-common -DCONFIG_MMU -D$(BOARD_NAME)
	endif
	ifeq ($(KVER),$(filter 4.4% 5.4%,$(KVER)))
		CPU_CFLAG=-D__LINUX_ARM_ARCH__=7  -DMODULE -fno-common -DCONFIG_MMU -D$(BOARD_NAME)
	endif
	
	ifeq ($(KVER),$(filter 3.14%,$(KVER)))
		CPU_CFLAG= -DMODULE -nostdinc -D$(BOARD_NAME) -Wundef -Wstrict-prototypes -Wno-trigraphs -Werror -fno-strict-aliasing -fno-common -Wno-format-security -fno-delete-null-pointer-checks -O2 -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(mem)"
	endif
	
	ifeq ($(KVER),$(filter 4.9% 4.4% 5.4%,$(KVER)))
		CPU_CFLAG= -DMODULE -nostdinc -D$(BOARD_NAME) -Wundef -Wstrict-prototypes -Wno-trigraphs -Werror -fno-strict-aliasing -fno-common -Wno-format-security -fno-delete-null-pointer-checks -Os -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=2048 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(mem)"
	endif
	
	ifeq ($(KVER),$(filter 3.18%,$(KVER)))
		CPU_CFLAG= -DMODULE -nostdinc -D$(BOARD_NAME) -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Wno-format-security -fno-delete-null-pointer-checks -O2 -fno-dwarf2-cfi-asm -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(mem)"
	endif
endif

ifeq ($(ARCH), arm64)
	ifeq ($(KVER),$(filter 4.1% 4.4% 4.9% 5.4%,$(KVER)))
		CPU_CFLAG=  -DMODULE -Os -pipe -march=armv8-a -mcpu=cortex-a53+crypto -fno-caller-saves -fno-strict-aliasing -Werror -fno-common -Wno-format-security -Wno-pointer-sign -Wno-unused-but-set-variable -Wno-error=unused-result -mcmodel=large
	endif
endif

#############################################
#	Board Specfic Setting		    #
#############################################
ifeq ($(BOARD_TYPE), ap136)
	OS_SUB=31
	GCC_VER=4
	TOOL_PATH=$(TOPDIR)/build/gcc-4.3.3/build_mips/staging_dir/usr/bin
	SYS_PATH=$(TOPDIR)/linux/kernels/mips-linux-2.6.31
	CPU_CFLAG=-Wstrict-prototypes -fomit-frame-pointer -G 0 -mno-abicalls -fno-strict-aliasing -O2 -fno-pic -pipe -mabi=32 -march=mips32r2 -DMODULE -mlong-calls -DEXPORT_SYMTAB
endif

#############################################
#	OS Specfic Setting		    #
#############################################
#For MIPS Linux2.4
#TOOL_PATH=/home/perforce/kernel2.4/5.3.1.20/tools/gcc-3.3.3-2.4.25/toolchain_mips/bin
#SYS_PATH=/home/perforce/kernel2.4/5.3.1.20/src/kernels/mips-linux-2.4.25

#TOOLPREFIX=$(CPU)-$(OS)-
#CPU_CFLAG=-Wstrict-prototypes -Wundef -fomit-frame-pointer -G 0 -mno-abicalls -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fno-pic -pipe -mabi=32 -march=r4600 -Wa,-32 -Wa,-march=r4600 -Wa,--trap -DMODULE -mlong-calls -DEXPORT_SYMTAB

#############################################
#	SDK Generic Setting	            #
#############################################
ifeq ($(SWCONFIG_FEATURE), disable)
	SWCONFIG=FALSE
else
	SWCONFIG=TRUE
endif

KERNEL_MODE=TRUE

#compatiable with OpenWRT
ifeq ($(SWITCH_SSDK_MODE),user)
	KERNEL_MODE=FLASE
endif

#FAL=FALSE or not define FAL, FAL will not be included in SSDK
FAL=TRUE

#############################################
#	SDK Chip Setting		    #
#############################################
#CHIP_TYPE can be defined as ATHENA, GARUDA, SHIVA, HORUS, ISIS, ISISC, DESS, HPPE, CPPE, MP and ALL_CHIP(ALL_CHIP means GARUDA, SHIVA, HORUS, ISIS, ISISC, DESS and HPPE CPPE MP)
ifndef CHIP_TYPE
	CHIP_TYPE=ALL_CHIP
endif


#############################################
#	SDK OS Specfic Setting		    #
#############################################
#UK_IF=FALSE or not define UK_IF, UK_IF will not be included in SSDK
#when UK_IF=TRUE one of UK_NETLINK,UK_IOCTL must be defined as TRUE
UK_IF=TRUE
#UK_IOCTL=TRUE define user-kernel space communication based on ioctl
UK_IOCTL=TRUE
UK_MINOR_DEV=254

#API_LOCK=FALSE or not define API_LOCK, API_LOCK will not be included in SSDK
API_LOCK=FALSE

#REG_ACCESS_SPEEDUP=FALSE or not define REG_ACCESS_SPEEDUP, REG_ACCESS_SPEEDUP will not be enabled, now only ISIS supports
REG_ACCESS_SPEEDUP=FALSE


#############################################
#	All Supported Features	    	    #
#############################################
#ACL FDB IGMP LEAKY LED MIB MIRROR MISC PORTCONTROL PORTVLAN QOS RATE STP VLAN
#IN_X=FALSE or not define IN_X, X will not be included in SSDK
IN_ACL=TRUE
IN_FDB=TRUE
IN_IGMP=TRUE
IN_LEAKY=TRUE
IN_LED=TRUE
IN_MIB=TRUE
IN_MIRROR=TRUE
IN_MISC=TRUE
IN_PORTCONTROL=TRUE
IN_PORTVLAN=TRUE
IN_QOS=TRUE
IN_RATE=TRUE
IN_STP=TRUE
IN_VLAN=TRUE
IN_REDUCED_ACL=FALSE
IN_COSMAP=TRUE
IN_IP=TRUE
IN_NAT=TRUE
IN_TRUNK=TRUE
IN_SEC=TRUE
IN_PPPOE=TRUE

ifeq ($(HNAT_FEATURE), enable)
	IN_NAT_HELPER=TRUE
else
	IN_NAT_HELPER=FALSE
endif

ifeq ($(RFS_FEATURE), enable)
	IN_RFS=TRUE
else
	IN_RFS=FALSE
endif

IN_INTERFACECONTROL=TRUE
IN_MACBLOCK=FALSE

#############################################
#        Platform Special Features          #
#############################################
ifeq ($(SoC),$(filter $(SoC),ipq53xx ipq95xx ipq807x ipq60xx))
	PTP_FEATURE=enable
endif

ifeq ($(SoC),$(filter $(SoC),ipq53xx ipq95xx))
	MHT_ENABLE=enable
endif

ifeq ($(SoC),$(filter $(SoC),ipq53xx ipq807x ipq60xx ipq50xx))
	ISISC_ENABLE=enable
endif

ifeq ($(SoC),$(filter $(SoC),ipq40xx ipq806x))
	CHIP_TYPE=NONHK_CHIP
endif

#############################################
# PHY CHIP Features According To Switch     #
#############################################
ifeq (ALL_CHIP, $(CHIP_TYPE))
	IN_AQUANTIA_PHY=TRUE
	IN_QCA803X_PHY=TRUE
	IN_QCA808X_PHY=TRUE
	IN_PHY_I2C_MODE=TRUE
	IN_MALIBU_PHY=TRUE
	IN_SFP_PHY=TRUE
	IN_SFP=TRUE
else ifeq (HPPE, $(CHIP_TYPE))
	IN_AQUANTIA_PHY=TRUE
	IN_QCA803X_PHY=TRUE
	IN_QCA808X_PHY=TRUE
	IN_PHY_I2C_MODE=TRUE
	IN_SFP_PHY=TRUE
	IN_SFP=TRUE
	IN_MALIBU_PHY=TRUE
else ifeq (CPPE, $(CHIP_TYPE))
	IN_QCA808X_PHY=TRUE
	IN_PHY_I2C_MODE=TRUE
	IN_MALIBU_PHY=TRUE
else ifeq (DESS, $(CHIP_TYPE))
	IN_MALIBU_PHY=TRUE
else ifeq (MP, $(CHIP_TYPE))
	IN_QCA803X_PHY=TRUE
	IN_QCA808X_PHY=TRUE
	IN_SFP_PHY=TRUE
	IN_SFP=TRUE
else ifeq (APPE, $(CHIP_TYPE))
	IN_AQUANTIA_PHY=TRUE
	IN_QCA803X_PHY=TRUE
	IN_QCA808X_PHY=TRUE
	IN_SFP_PHY=TRUE
	IN_SFP=TRUE
	IN_MALIBU_PHY=TRUE
else ifeq (MPPE, $(CHIP_TYPE))
	ifeq ($(LOWMEM_FLASH), enable)
		IN_QCA808X_PHY=TRUE
		IN_SFP_PHY=TRUE
		IN_SFP=TRUE
	else ifeq ($(LOWMEM_256), enable)
		LNX_LOCAL_CFLAGS += -DSW_MAX_NR_DEV=2 \
			-DSW_MAX_NR_PORT=8
		IN_QCA808X_PHY=TRUE
		IN_SFP_PHY=TRUE
		IN_SFP=TRUE
	else
		IN_AQUANTIA_PHY=TRUE
		IN_QCA803X_PHY=TRUE
		IN_QCA808X_PHY=TRUE
		IN_SFP_PHY=TRUE
		IN_SFP=TRUE
	endif
else
	IN_QCA803X_PHY=FALSE
	IN_QCA808X_PHY=FALSE
	IN_AQUANTIA_PHY=FALSE
	IN_MALIBU_PHY=FALSE
	IN_SFP_PHY=FALSE
	IN_SFP=FALSE
endif

ifeq ($(SFE_FEATURE), enable)
	IN_SFE=TRUE
else
	IN_SFE=FALSE
endif

#QCA808X PHY features
ifeq ($(IN_QCA808X_PHY), TRUE)
	ifeq ($(PTP_FEATURE), enable)
		IN_PTP=TRUE
	else
		IN_PTP=FALSE
	endif
endif

#IN_PHY_I2C_MODE depends on IN_SFP_PHY
ifeq ($(IN_PHY_I2C_MODE), TRUE)
	IN_SFP_PHY=TRUE
endif

#############################################
# SDK Features According To Switch Chip     #
#############################################
ifneq (, $(filter MPPE APPE HPPE CPPE ALL_CHIP, $(CHIP_TYPE)))
	IN_FLOW=TRUE
	IN_RSS_HASH=TRUE
	IN_QM=TRUE
	IN_VSI=TRUE
	IN_CTRLPKT=TRUE
	IN_SERVCODE=TRUE
	IN_BM=TRUE
	IN_SHAPER=TRUE
	IN_POLICER=TRUE
	IN_UNIPHY=TRUE
	IN_NETLINK=TRUE
endif

ifneq (, $(filter MP, $(CHIP_TYPE)))
	IN_UNIPHY=TRUE
endif

#############################################
# 	MINI SSDK Features Selection        #
#############################################
ifeq ($(MINI_SSDK), enable)
	IN_FDB_MINI=TRUE
	IN_MISC_MINI=TRUE
	IN_PORTCONTROL_MINI=TRUE
	IN_QOS_MINI=TRUE
	IN_COSMAP_MINI=TRUE
	IN_PORTVLAN_MINI=TRUE
	IN_VLAN_MINI=TRUE
	IN_VSI_MINI=TRUE
	IN_BM_MINI=TRUE
	IN_SHAPER_MINI=TRUE
	IN_POLICER_MINI=TRUE
	IN_FLOW_MINI=TRUE
	IN_QM_MINI=TRUE
	IN_UNIPHY_MINI=TRUE
	IN_IP_MINI=TRUE
	IN_SEC_MINI=TRUE
	IN_SFP=FALSE
	IN_PTP=FALSE

	#disable modules for MINI HPPE/CPPE/APPE/MPPE
	ifneq (, $(filter MPPE APPE HPPE CPPE, $(CHIP_TYPE)))
		IN_NAT=FALSE
		IN_COSMAP=FALSE
		IN_RATE=FALSE
		IN_IGMP=FALSE
		IN_LEAKY=FALSE
		IN_LED=FALSE
		IN_INTERFACECONTROL=FALSE
	endif

	ifeq ($(MHT_ENABLE), enable)
		IN_INTERFACECONTROL=TRUE
		IN_NAT=TRUE
	endif
	
	ifeq ($(HNAT_FEATURE), enable)
		IN_MISC_MINI=FALSE
		IN_PORTVLAN_MINI=FALSE
		IN_IP_MINI=FALSE
		IN_MISC=TRUE
		IN_PORTVLAN=TRUE
		IN_IP=TRUE
		IN_NAT=TRUE
	endif
endif

#############################################
# SDK Features According To Specfic Switch  #
#############################################
ifeq (MP, $(CHIP_TYPE))
	ifeq (disable, $(ISISC_ENABLE))
		IN_ACL=FALSE
		IN_FDB=FALSE
		IN_IGMP=FALSE
		IN_LEAKY=FALSE
		IN_LED=FALSE
		IN_MIRROR=FALSE
		IN_MISC=FALSE
		IN_PORTVLAN=FALSE
		IN_QOS=FALSE
		IN_RATE=FALSE
		IN_STP=FALSE
		IN_VLAN=FALSE
		IN_REDUCED_ACL=FALSE
		IN_COSMAP=FALSE
		IN_IP=FALSE
		IN_NAT=FALSE
		IN_FLOW=FALSE
		IN_TRUNK=FALSE
		IN_RSS_HASH=FALSE
		IN_SEC=FALSE
		IN_QM=FALSE
		IN_PPPOE=FALSE
		IN_VSI=FALSE
		IN_SERVCODE=FALSE
		IN_BM=FALSE
		IN_SHAPER=FALSE
		IN_POLICER=FALSE
	endif
	IN_CTRLPKT=TRUE
endif

ifneq (, $(filter MPPE APPE , $(CHIP_TYPE)))
	IN_VPORT=TRUE
	IN_TUNNEL=TRUE
	IN_VXLAN=TRUE
	IN_GENEVE=TRUE
	IN_TUNNEL_PROGRAM=TRUE
	IN_MAPT=TRUE
	ifeq ($(MINI_SSDK), enable)
		IN_TUNNEL_MINI=TRUE
		IN_VXLAN_MINI=TRUE
		IN_GENEVE=FALSE
	endif
endif

ifneq (, $(filter MPPE , $(CHIP_TYPE)))
	IN_ATHTAG=TRUE
endif

#auto_insert_flag
