#*****************************************************************************
#* FILE PURPOSE: 2nd stage makefile for the intermediate boot loader
#*****************************************************************************
#* FILE NAME: makestg2
#*
#* DESCRIPTION: This makefile is invoked with build specific options
#*
#******************************************************************************

ifndef IBL_ROOT
	IBL_ROOT=..
endif

CFG_MODULES= main device
MODULES= ethboot nandboot driver hw interp ecc norboot

# Note that the Hw module is a two stage clean and handled seperately
CLEAN_MODULES=$(addprefix clean_,$(subst hw,,$(MODULES)))
CLEAN_MODULES+=$(addprefix clean_,$(CFG_MODULES))


TARGETS= c6472 c6474 c6474l c6455 c6457 c66x c665x c66xk2x

# The main module needs to know the device address of the i2c where the image map resides
MAINDEFS=-DIBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR=$(I2C_BUS_ADDR)

# Add build time exclusion definitions
MAINDEFS+=$(addprefix -DEXCLUDE_,$(EXCLUDES))

# Add SPI definitions
SPI_CFG= $(addprefix -D,$(SPI_DEFS))


# Common symbols are functions which are loaded with the stage load of the IBL, and
# also referenced from the second stage
#COMMON_SYMBOLS= hwI2Cinit hwI2cMasterRead iblBootBtbl iblMalloc iblFree iblMemset iblMemcpy
COMMON_SYMBOLS= iblBootBtbl iblMalloc iblFree iblMemset iblMemcpy

ifeq ($(ENDIAN),little)
	HEX_OPT= -order L
	IEXT=     le
else
	HEX_OPT= -order M
	IEXT=     be
endif

ifeq ($(COMPACT_I2C),yes)
  COMPACT= -compact
endif

include $(IBL_ROOT)/make/$(ARCH)/makedefs.mk

export ARCH
export TARGET
export EVM
export I2C_MAP_ADDR

.PHONY:  $(TARGETS) i2crom spiRom compare iblInit iblMain $(MODULES) $(CFG_MODULES)
.PHONY:  utils clean clean_modules hwClean cleant

$(TARGETS): iblMain

ifeq (($(TARGET),c66x) || $(TARGET),c665x || $(TARGET),c66xk2x)
    HAS_SPI=1
else
    HAS_SPI=0
endif

ifeq (EXCLUDE_SPI, $(strip $(findstring EXCLUDE_SPI, $(MAINDEFS))))
    HAS_SPI=0
endif

ifeq (EXCLUDE_I2C, $(strip $(findstring EXCLUDE_I2C, $(MAINDEFS))))
    HAS_I2C=0
else 
   HAS_I2C=1
endif

# The I2C creation options. The I2C map file is run through the C pre-processor to generate
# the desired I2C mapping. There are three possible configurations - an i2c which has
# both endians present, or an I2C with only one of the endians

I2C_BE_FILE=      '"ibl_$(TARGET)/ibl.i2c.be.ccs"'
I2C_LE_FILE=      '"ibl_$(TARGET)/ibl.i2c.le.ccs"'
I2C_INIT_BE_FILE= '"ibl_$(TARGET)/ibl_init.i2c.be.ccs"'
I2C_INIT_LE_FILE= '"ibl_$(TARGET)/ibl_init.i2c.le.ccs"'

I2C_DEFS= -DI2C_BUS_ADDR=$(I2C_BUS_ADDR)
I2C_DEFS+= -DI2C_MAP_ADDR=$(I2C_MAP_ADDR)
I2C_DEFS+= -DEVM=$(EVM)

ifeq ($(I2CROM),both) 
 I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
 I2C_DEFS+= -DEXE_FILE_1=$(I2C_LE_FILE) 
 I2C_DEFS+= -DPAD_FILE_ID_1=1 
 I2C_DEFS+= -DEXE_FILE_2=$(I2C_BE_FILE) 
 I2C_DEFS+= -DPAD_FILE_ID_2=2 

 SPI_CFG+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
 SPI_CFG+= -DEXE_FILE_1=$(I2C_LE_FILE) 
 SPI_CFG+= -DPAD_FILE_ID_1=1 
 SPI_CFG+= -DEXE_FILE_2=$(I2C_BE_FILE) 
 SPI_CFG+= -DPAD_FILE_ID_2=2 

else 
 I2C_DEFS+= -DPAD_FILE_ID_1=1
 I2C_DEFS+= -DPAD_FILE_ID_2=1

 SPI_CFG+= -DPAD_FILE_ID_1=1
 SPI_CFG+= -DPAD_FILE_ID_2=1

 ifeq ($(I2CROM),little_endian)
  I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
  I2C_DEFS+= -DEXE_FILE_1=$(I2C_LE_FILE)
  I2C_DEFS+= -DEXE_FILE_2='""'

  SPI_CFG+= -DINIT_EXE_FILE=$(I2C_INIT_LE_FILE)
  SPI_CFG+= -DEXE_FILE_1=$(I2C_LE_FILE)
  SPI_CFG+= -DEXE_FILE_2='""'

 else
  I2C_DEFS+= -DINIT_EXE_FILE=$(I2C_INIT_BE_FILE)
  I2C_DEFS+= -DEXE_FILE_1='""'
  I2C_DEFS+= -DEXE_FILE_2=$(I2C_BE_FILE)

  SPI_CFG+= -DINIT_EXE_FILE=$(I2C_INIT_BE_FILE)
  SPI_CFG+= -DEXE_FILE_1='""'
  SPI_CFG+= -DEXE_FILE_2=$(I2C_BE_FILE)

 endif
endif


i2crom:
	$(CC) -ppo -I../cfg/$(TARGET) $(I2C_DEFS) ibl_$(TARGET)/$@.map.pre
	../util/romparse/romparse.exe $(COMPACT) -rom_base $(I2C_BUS_ADDR) ibl_$(TARGET)/$@.map.pp
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.ccs
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.dat
	../util/btoccs/ccs2bin.exe -swap ibl_$(TARGET)/$@.ccs ibl_$(TARGET)/$@.bin
	cp ibl_$(TARGET)/$@.bin ../util/iblConfig/build/ibl.bin
	(cd ../util/iblConfig/build;./iblConfig.out)
	cp ../util/iblConfig/build/ibl.bin ibl_$(TARGET)/$@.bin
	$(RM) i2crom.ccs ibl_le.b ibl.b

spiRom:
	@echo Making SPI ROM
	$(CC) -ppo -I../cfg/$(TARGET) $(SPI_CFG) ibl_$(TARGET)/$@.map.pre
	../util/romparse/romparse $(COMPACT) -fill 0xff -rom_base 0 ibl_$(TARGET)/$@.map.pp
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.ccs
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.dat





# Target compare checks if the iblInit is compiled the same for both endians
compare:
	@echo -
	@sh -c 'if diff -q ibl_$(TARGET)/ibl_init.le.ccs ibl_$(TARGET)/ibl_init.be.ccs ; then echo IBL init endian neutral ; else echo !!! WARNING !!!! IBL ini NOT endian neutral !!! ; fi '
	@echo -

# For the init code a raw image is created as well as the i2c code to verify
# endian independent code is generated. The symbols required for linking
# the full application are then extracted
iblInit: $(CFG_MODULES) $(MODULES)
	cat ibl_$(TARGET)/ibl_init_objs_template.inc | sed -e s/ENDIAN_TAG/$(IEXT)/g > ibl_$(TARGET)/ibl_init_objs.tmp
	$(CC) -ppo $(MAINDEFS) -DENDIAN_TAG=$(IEXT) ibl_$(TARGET)/ibl_init_objs.tmp
	$(CP) ibl_$(TARGET)/ibl_init_objs.pp ibl_$(TARGET)/ibl_init_objs.inc
	$(LD) -o ibl_$(TARGET)/ibl_$(TARGET)_init.out -m ibl_$(TARGET)/ibl_$(TARGET)_init.map ibl_$(TARGET)/ibl_init.cmd $(RTLIBS)
	$(CP) ibl_$(TARGET)/ibl_$(TARGET)_init.out ibl_$(TARGET)/ibl_$(TARGET)_init.$(IEXT).out
	$(RM) -f ibl_$(TARGET)/ibl_init_obj.inc

	hex6x $(HEX_OPT) ibl_$(TARGET)/ibl_init_image.rmd ibl_$(TARGET)/ibl_$(TARGET)_init.out
	$(CP) ibl_le.b ibl_$(TARGET)/ibl.b
	../util/btoccs/b2ccs.exe ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl_init.$(IEXT).ccs

	hex6x $(HEX_OPT) ibl_$(TARGET)/ibl_init.rmd ibl_$(TARGET)/ibl_$(TARGET)_init.out
	../util/bconvert/bconvert64x.exe -$(IEXT) ibl_le.b ibl.b
	$(CP) ibl.b ibl_$(TARGET)
	../util/btoccs/b2i2c.exe ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl.i2c.b
	../util/btoccs/b2ccs.exe ibl_$(TARGET)/ibl.i2c.b ibl_$(TARGET)/ibl_init.i2c.$(IEXT).ccs

	sed -e 's/\r//' ../util/symExtract/symExtract > ../util/symExtract/symExtract_unix
	bash ../util/symExtract/symExtract_unix ibl_$(TARGET)/ibl_$(TARGET)_init.map ibl_$(TARGET)/ibl_init_symbols.inc $(COMMON_SYMBOLS)
	rm -f ../util/symExtract/symExtract_unix

	
iblMain: iblInit $(CFG_MODULES) $(MODULES)
	cat ibl_$(TARGET)/ibl_objs_template.inc | sed -e s/ENDIAN_TAG/$(IEXT)/g > ibl_$(TARGET)/ibl_objs.tmp
	$(CC) -ppo $(MAINDEFS) -DENDIAN_TAG=$(IEXT) ibl_$(TARGET)/ibl_objs.tmp
	$(CP) ibl_$(TARGET)/ibl_objs.pp ibl_$(TARGET)/ibl_objs.inc
	$(LD) -o ibl_$(TARGET)/ibl_$(TARGET).out -m ibl_$(TARGET)/ibl_$(TARGET).$(IEXT).map  ibl_$(TARGET)/ibl.cmd $(RTLIBS)
	$(CP) ibl_$(TARGET)/ibl_$(TARGET).out ibl_$(TARGET)/ibl_$(TARGET).$(IEXT).out
	$(RM) -f ibl_$(TARGET)/ibl_obj.inc

	hex6x $(HEX_OPT) ibl_$(TARGET)/ibl.rmd ibl_$(TARGET)/ibl_$(TARGET).out
	../util/bconvert/bconvert64x.exe -$(IEXT) ibl_le.b ibl.b
	$(CP) ibl.b ibl_$(TARGET)
	../util/btoccs/b2i2c.exe ibl_$(TARGET)/ibl.b ibl_$(TARGET)/ibl.i2c.b
	../util/btoccs/b2ccs.exe ibl_$(TARGET)/ibl.i2c.b ibl_$(TARGET)/ibl.i2c.$(IEXT).ccs


$(MODULES):
	@echo making $@
	make -C $(IBL_ROOT)/$@/$(ARCH)/make $@

$(CFG_MODULES):
	@echo making $@ SPI_CFG=$(SPI_CFG) CDEFS=$(CDEFS) EXCLUDES=$(EXCLUDES)
	make -C $(IBL_ROOT)/$@/$(ARCH)/make CDEFS='$(MAINDEFS) $(SPI_CFG)' $@

utils:
ifeq ($(HAS_SPI),1)
#make -C $(IBL_ROOT)/util/spiConfig TARGET=$(TARGET) SPI_DEFS='$(SPI_DEFS)' MAINDEFS='$(MAINDEFS) $(SPI_CFG)' $(TARGET)
endif
	make -C $(IBL_ROOT)/util/btoccs
	make -C $(IBL_ROOT)/util/romparse TARGET=$(TARGET)
ifeq ($(HAS_I2C),1)
	make -C $(IBL_ROOT)/util/i2cConfig $(TARGET) MAINDEFS='$(MAINDEFS) $(SPI_CFG)' 
endif
	make -C $(IBL_ROOT)/util/bconvert
	make -C $(IBL_ROOT)/util/iblConfig/build EVM=$(EVM) I2C_MAP_ADDR=$(I2C_MAP_ADDR)

clean: $(CLEAN_MODULES) hwClean
	

$(CLEAN_MODULES):
	@echo cleaning $(subst clean_, ,$@)
	make -C $(IBL_ROOT)/$(subst clean_,,$@)/$(ARCH)/make clean ARCH=c64x TARGET=$(TARGET)

hwClean:
	@echo cleaning hw
	make -C $(IBL_ROOT)/hw/$(ARCH)/make cleant ARCH=$(ARCH) TARGET=$(TARGET)
	
cleant:
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).be.out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).le.out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).be.map
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).le.map
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.map
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.be.map
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.be.out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.le.map
	rm -rf ibl_$(TARGET)/ibl_$(TARGET)_init.le.out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).out
	rm -rf ibl_$(TARGET)/ibl_$(TARGET).map
	rm -rf ibl_$(TARGET)/ibl_le.b
	rm -rf ibl_$(TARGET)/ibl.b
	rm -rf ibl_$(TARGET)/ibl.i2c.b
	rm -rf ibl_$(TARGET)/ibl.i2c.be.ccs
	rm -rf ibl_$(TARGET)/ibl.i2c.le.ccs
	rm -rf ibl_$(TARGET)/ibl_init.i2c.be.ccs
	rm -rf ibl_$(TARGET)/ibl_init.i2c.le.ccs
	rm -rf ibl_$(TARGET)/ibl_init.le.ccs
	rm -rf ibl_$(TARGET)/ibl_init.be.ccs
	rm -rf ibl_$(TARGET)/i2crom*.ccs
	rm -rf ibl_$(TARGET)/i2crom*.dat
	rm -rf ibl_$(TARGET)/i2crom*.bin
	rm -rf ibl_$(TARGET)/i2crom*.map.pp
	rm -rf ibl_$(TARGET)/ibl_init_objs.inc
	rm -rf ibl_$(TARGET)/ibl_init_objs.pp
	rm -rf ibl_$(TARGET)/ibl_init_symbols.inc
	rm -rf ibl_$(TARGET)/ibl_objs.inc
	rm -rf ibl_$(TARGET)/ibl_objs.pp
	rm -rf ibl_$(TARGET)/ibl_objs.tmp
	rm -rf ibl_$(TARGET)/spiRom*.dat
	rm -rf ibl_$(TARGET)/spiRom*.map.pp
	







