##################################################################
# create a compressed zImage and Rommable zImage.flash from the original
# vmlinux
#
##################################################################
# Oct 29 2002
# P. Sadik   (Pallathu.Sadik@idt.com)
##################################################################


##################################################################
# The following is taken from IDT/Sim Makefile
##################################################################
TARGET=434
TARGETDIR=S434

MHZ=100000000


#
# following refers to memory type in use in eval board and if more than one
# then the order is implied.  These are values for the switch MEMCFG.
#
SRAM_ONLY=1
SDRAM_ONLY=2
SRAM_N_SDRAM=3
SDRAM_N_SRAM=4

# following refers to size of the DRAM space.
# These are values for the switch DRAMSZ.

MB32=1
MB64=2
MB128=3
MB32SO=4

MACH= -DEB434 -DS434 -DCPU_R32434 -DMIPSEL -DINET -DMEMCFG=$(SDRAM_ONLY) -DDRAMSZ=$(MB64) -DIDTSIM -DMHZ=$(MHZ) -DNVRAM_RTC -DUSE_SPI

#***************** END IDT/Sim Makefile ##################################### 
ZDEBUG=0
export ZDEBUG

include $(TOPDIR)/.config
# size is not exported by main Makefile. Hence, declare it here
SIZE = $(CROSS_COMPILE)size

O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
OBJDUMP_VERSION := $(shell if $(OBJDUMP) -i | head -2 2>&1 | grep 'elf32-tradlittlemips' >/dev/null; then echo y;else echo n;fi)
export OBJDUMP_VERSION

ZLDFLAGS = -static -e zstartup -T $(TOPDIR)/arch/mips/ld.script
RLDFLAGS = -static -e start -T $(TOPDIR)/arch/mips/ld.script
ZLINKFLAGS = -Ttext $(ZIMAGE_OFFSET) $(ZBSS) $(ZLDFLAGS)

COMMSWITCHES= $(INCDIRS) $(MACH)

HEAD = head.o
CSU_IDT = csu_idt.o
SYSTEM = $(TOPDIR)/vmlinux

all: $(TOPDIR)/zImage $(TOPDIR)/zImage.flash 

##################################################################
# board configuration
##################################################################

# ZIMAGE_OFFSET is the load offset of the compression loader
#ifdef BOOT_FROM_ROM
# zImage in ROM after boot code
#ZIMAGE_OFFSET := 0x9fc20000
#ZBSS          := -Tbss 0x80002000
#else
# for loading in RAM
ZIMAGE_OFFSET := 0x80800000
#endif
BFCSTART  := 0xBFC00000

# *MUST* match LOADADDR from arch/mips/Makefile
# Hence, extract the value from vmlinux
#
# Old version of objdump displays addresses starting with 0xffffffff.
# Hence strip that portion of the address.

ifneq ($(OBJDUMP_VERSION),y)

LOADADDR      := 0x$(shell $(NM) $(SYSTEM) | grep _ftext |cut -f1 -d' ' |sed -n -e 's/ffffffff//p')
KERNEL_ENTRY  := $(shell $(OBJDUMP) -f $(SYSTEM) | sed -n -e 's/^start address //p' |sed -n -e 's/ffffffff//p')

else

LOADADDR      := 0x$(shell $(NM) $(SYSTEM) | grep _ftext |cut -f1 -d' ')
KERNEL_ENTRY  := $(shell $(OBJDUMP) -f $(SYSTEM) | sed -n -e 's/^start address //p')

endif

# working space for gunzip:
FREE_RAM      := 0x80C00000
END_RAM       := 0x80E00000

# putc config
ifeq ($(ZDEBUG),3)
PUTC_IMPL     := uart16550.o
endif
##################################################################
OBJECTS = $(HEAD) misc.o $(PUTC_IMPL)

.PHONY: zImage zImage.flash
zImage: $(TOPDIR)/zImage
zImage.flash: $(TOPDIR)/zImage.flash

ifeq ($(ZDEBUG),3)
uart16550.o: uart16550.c Makefile
	$(CC) $(CFLAGS) -c uart16550.c
endif

$(TOPDIR)/zImage: piggy.o $(OBJECTS)
	$(LD) $(ZLINKFLAGS) -o $(TOPDIR)/zImage $(OBJECTS) piggy.o
	@rm -f *.o mhz.h

ifdef  CONFIG_BOOT_FROM_PROM
$(TOPDIR)/zImage.flash: zImage.o $(CSU_IDT)
	@rm -f $(TOPDIR)/*.prm
	$(LD) $(RLDFLAGS) -Ttext $(BFCSTART) -o $(TOPDIR)/zImage.flash $(CSU_IDT) zImage.o
	$(OBJCOPY) -S -O binary -R .note -R .comment $(TOPDIR)/zImage.flash zImage.flash.bin
	$(OBJCOPY) -I binary -S -O srec --srec-forceS3 --srec-len=32 --change-start=0x00000000 zImage.flash.bin $(TOPDIR)/linux.prm 
	$(SIZE) $(TOPDIR)/zImage.flash |awk -F" " '{ print $$4 "\t" $$5 }' > $(TOPDIR)/linux.size
	@rm -f *.o mhz.h zImage.flash.bin $(TOPDIR)/zImage #$(TOPDIR)/zImage.flash 
else
$(TOPDIR)/zImage.flash: $(SYSTEM)
	@echo
	@echo "Error! Re-configure kernel with 'Create ROMMABLE Image' option enabled."
	@echo
endif

head.o: head.S Makefile $(SYSTEM)
	$(CC) $(AFLAGS) -DKERNEL_ENTRY=$(KERNEL_ENTRY) -c head.S

comma	:= ,

misc.o: misc.c Makefile
	$(CC) $(CFLAGS) -DLOADADDR=$(LOADADDR) -DFREE_RAM=$(FREE_RAM) -DEND_RAM=$(END_RAM) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c misc.c -DZDEBUG=$(ZDEBUG)

piggy.o: $(SYSTEM)
	$(OBJCOPY) -S -O binary -R .note -R .comment $(SYSTEM) $(SYSTEM).bin
	gzip -f -9 < $(SYSTEM).bin > $(SYSTEM).gz
	echo "OUTPUT_ARCH(mips) SECTIONS { .initrd : { input_len = .; LONG(input_data_end - input_data) input_data = .; *(.data) input_data_end = .; }}" > ld.script
	echo "O_FORMAT:  " $(O_FORMAT); 
	$(LD) -T ld.script -b binary --oformat $(O_FORMAT) -o piggy.o $(SYSTEM).gz
	rm -f $(SYSTEM).bin $(SYSTEM).gz ld.script

csu_idt.o: csu_idt.S Makefile $(SYSTEM)
	cat $(TOPDIR)/include/asm/rc32434/rc32434.h |grep IDT_BUS_FREQ > mhz.h
	$(CC) $(AFLAGS) $(UFLAGS) $(COMMSWITCHES) -DZIMAGE_OFFSET=$(ZIMAGE_OFFSET) -c csu_idt.S

zImage.o: $(TOPDIR)/zImage
	$(OBJCOPY) -S -O binary -R .note -R .comment $(TOPDIR)/zImage zImage.bin
	echo "OUTPUT_ARCH(mips) SECTIONS { .initrd : { *(.data) } }" > ld.lnk
	echo "O_FORMAT:  " $(O_FORMAT)
	$(LD) -T ld.lnk -b binary --oformat $(O_FORMAT) -o zImage.o zImage.bin
	@rm -f ld.lnk zImage.bin
clean:
	rm -f *.o $(TOPDIR)/zImage $(TOPDIR)/zImage.flash $(TOPDIR)/*.prm $(TOPDIR)/linux.size

