#*******************************************************
#*
#* Makefile for IXP2XXX Network Address Translator
#*
#*******************************************************
# path to IXA SDK
IXA_SDK_ROOT=/opt/ixa_sdk_3.5
# path to Linux Kernel source
KERNEL_DIR=/opt/hardhat/previewkit/lsp/intel-ixdp2400-previewkit-arm_xscale_be.orig/linux-2.4.18_mvl30
# path to XScale C compiler 
CC = /opt/hardhat/previewkit/arm/xscale_be/bin/xscale_be-gcc
# path to XScale linker
LD = /opt/hardhat/previewkit/arm/xscale_be/bin/xscale_be-ld
# path to microcode assembler
UCA = $(IXA_SDK_ROOT)/me_tools/bin/uca
# path to microcode linker
UCLD = $(IXA_SDK_ROOT)/me_tools/bin/ucld

.PHONY: core
.PHONY:	control
.PHONY:	microcode

all:	core control microcode

# making core component 
CORE_COMP = NAT_core_comp
CORE_COMP_H = NAT_shared_defs.h NAT_types.h NAT_scratch_rings.h 
CORE_COMP_C = NAT_pseudo_dev.c NAT_pkt_handler.c
CORE_COMP_OBJS=$(CORE_COMP_C:.c=.o)

CORE_COMP_INCLUDE = -I$(KERNEL_DIR)/include -I$(IXA_SDK_ROOT)/src/include\
                    -I$(IXA_SDK_ROOT)/me_tools/include -I$(IXA_SDK_ROOT)/build/include
CORE_COMP_CFLAGS = -Wall -DMODULE -D__KERNEL__ -DLINUX \
                   -D_IX_HARDWARE_TYPE_=1 -DIX_PLATFORM_2400

core:	$(CORE_COMP).o

$(CORE_COMP).o:	$(CORE_COMP_OBJS)
	$(LD) -r -o $(CORE_COMP).o $(CORE_COMP_OBJS)

NAT_pseudo_dev.o:	NAT_pseudo_dev.c NAT_shared_defs.h NAT_scratch_rings.h
	$(CC) $(CORE_COMP_CFLAGS) $(CORE_COMP_INCLUDE) -c NAT_pseudo_dev.c

NAT_pkt_handler.o:	NAT_pkt_handler.c NAT_shared_defs.h NAT_types.h NAT_net.h
	$(CC) $(CORE_COMP_CFLAGS) $(CORE_COMP_INCLUDE) -c NAT_pkt_handler.c

# making user control interface
CONTROL = NAT
CONTROL_INCLUDE = NAT_shared_defs.h NAT_types.h
CONTROL_SRC = $(CONTROL)_control.c

control: $(CONTROL)

$(CONTROL): $(CONTROL_SRC) $(CONTROL_INCLUDE)
	$(CC) -I$(KERNEL_DIR)/include -o $(CONTROL) $(CONTROL_SRC)
	
# making microcode 
UE_BINARY= UE_NAT
NAT_FILE = NAT_microblock
INC_FILES = dispatch_loop.uc dl_source.uc dl_system.h
NAT_INC_FILES = NAT_shared_defs.h NAT_scratch_rings.h NAT_macros.uc $(INC_FILES)
IXA_UE_LIB_ROOT=$(IXA_SDK_ROOT)/src
RX_LOCATION = $(IXA_UE_LIB_ROOT)/building_blocks/rx/microengine/packet_rx/microcode
RX_FILE = packet_rx
RX_INC_FILES = system_init.uc $(INC_FILES)
TX_LOCATION = $(IXA_UE_LIB_ROOT)/building_blocks/tx/microengine/packet_tx/sphy_mphy4/microcode
TX_FILE = sphy_mphy4_tx
TX__INC_FILES = $(INC_FILES)

UE_INCLUDE = -I$(IXA_UE_LIB_ROOT)/library/microblocks_library/include/ \
             -I$(IXA_UE_LIB_ROOT)/library/microblocks_library/microcode \
             -I$(IXA_UE_LIB_ROOT)/library/dataplane_library/microcode/\
             -I$(IXA_UE_LIB_ROOT)/include/ -I./

UCA_FLAGS = -ixp2400 -REVISION_MIN=0x01 -W3 -R -lm 0 -g $(UE_INCLUDE)  -DUSE_IMPORT_VAR

microcode:	$(UE_BINARY).uof

$(UE_BINARY).uof:	$(RX_FILE).list $(NAT_FILE).list $(TX_FILE).list
	$(UCLD) -u 0x00 $(RX_FILE).list -u 0x01 0x11 $(NAT_FILE).list -u 0x10 $(TX_FILE).list\
        $(UCLD_FLAGS) -o $(UE_BINARY).uof

$(NAT_FILE).list:	$(NAT_FILE).uc $(NAT_INC_FILES)
	$(UCA) $(UCA_FLAGS) -o$(NAT_FILE).list $(NAT_FILE).uc

$(RX_FILE).list:	$(RX_LOCATION)/$(RX_FILE).uc $(RX_INC_FILES)
	$(UCA) $(UCA_FLAGS) -DETHER_RECEIVE -DPOS_PHY_LEVEL_3 -D_DEBUG_COUNTERS_ -DODD_PARITY\
               -I$(RX_LOCATION) -o$(RX_FILE).list $(RX_LOCATION)/$(RX_FILE).uc

$(TX_FILE).list:	$(TX_LOCATION)/$(TX_FILE).uc $(TX_INC_FILES)
	$(UCA) $(UCA_FLAGS) -DTHIS_ME=ONLY_ONE_ME_FOR_PACKET_TX -D_DEBUG_COUNTERS_ -DDISABLE_TX2SCHED_FEEDBACK\
               -DODD_PARITY -DCOUNTERS -I$(TX_LOCATION) -o$(TX_FILE).list $(TX_LOCATION)/$(TX_FILE).uc

cleancore:	
	rm -rf $(CORE_COMP).o $(CORE_COMP_OBJS)
cleancontrol:
	rm -rf $(CONTROL)
cleanmicrocode: 
	rm -rf $(UE_BINARY).uof

clean: cleancore cleancontrol cleanmicrocode

distclean: clean
	rm -rf $(RX_FILE).list $(NAT_FILE).list $(TX_FILE).list 
	rm -rf $(RX_FILE).uci  $(NAT_FILE).uci  $(TX_FILE).uci
	rm -rf $(RX_FILE).ucp  $(NAT_FILE).ucp  $(TX_FILE).ucp
