# Makefile for 3pp/linux-st710x


### Requires these modules

REQUIRES += base/common/hw/include
REQUIRES += bootimage/tools
REQUIRES += utils/ukeytool


### Component specification

COMPONENT_IS_3PP  = true

COMPONENT_TARGETS = $(TARGET_NAME_VIP1900)
NEEDS_ABS_PATHS = true
FLAVOURS = kernel kernel-debug


### Tar archive

ver            = 2.6.17
full_ver       = $(ver).14-sh
SRC_ARCHIVE    = linux-$(ver).tar.bz2
SRC_DIR        = linux-$(ver)
src_done       = $(SRC_DIR)/.source_done

config         = $(FLAVOUR).config
modules_dir    = $(CURDIR)/modules/$(FLAVOUR)
modules_done   = $(modules_dir)/.modules_done

build_dir      = $(CURDIR)/$(TARGET)/$(FLAVOUR)
build_config   = $(build_dir)/.config
oldconfig_done = $(build_dir)/.oldconfig_done

yaffs2_archive = yaffs2-2006.07.06.tar.gz

pwc_version    = v4l2-20070509-042701
pwc_dir        = pwc-$(pwc_version)
pwc_archive    = $(pwc_dir).tar.bz2

PATCHES	       = $(CURDIR)/PATCHES

kreatel_stuff  = include drivers

memfile        = $(TARGET)/memfile


### Targets

SETUP_TARGETS += $(src_done)

linux_kernel           = $(TARGET)/$(FLAVOUR).pre_$(TARGET)
linux_kernel_nfs       = $(TARGET)/kernel-nfs_$(TARGET)
linux_kernel_nfs_nosec = $(TARGET)/kernel-nfs.nosec_$(TARGET)

PRODUCT_TARGETS += $(linux_kernel)

ifeq ($(FLAVOUR),kernel)
  modules  = sound/core/snd-timer.ko
  modules += sound/core/snd-rawmidi.ko
  modules += sound/core/snd-hwdep.ko
  modules += sound/core/oss/snd-pcm-oss.ko
  modules += sound/core/oss/snd-mixer-oss.ko
  modules += sound/core/snd.ko
  modules += sound/core/snd-page-alloc.ko
  modules += sound/core/snd-pcm.ko
  modules += sound/usb/snd-usb-audio.ko
  modules += sound/usb/snd-usb-lib.ko
  modules += sound/soundcore.ko
  modules += crypto/aes.ko
  modules += crypto/arc4.ko
  modules += crypto/michael_mic.ko
  modules += drivers/base/firmware_class.ko
  modules += drivers/ide/ide-generic.ko
  modules += drivers/ide/ide-disk.ko
  modules += drivers/ide/ide-core.ko
  modules += drivers/mtd/nand/nand_ids.ko
  modules += drivers/mtd/nand/kreatel_nand.ko
  modules += drivers/mtd/nand/nand.ko
  modules += drivers/mtd/nand/nand_ecc.ko
  modules += drivers/usb/storage/usb-storage.ko
  modules += drivers/usb/host/ohci-hcd.ko
  modules += drivers/usb/host/ehci-hcd.ko
  modules += drivers/usb/input/usbhid.ko
  modules += drivers/usb/core/usbcore.ko
  modules += drivers/media/video/pwc/pwc.ko
  modules += drivers/media/video/videodev.ko
  modules += drivers/media/video/v4l2-common.ko
  modules += drivers/media/video/v4l1-compat.ko
  modules += drivers/media/video/compat_ioctl32.ko
  modules += drivers/scsi/libata.ko
  modules += drivers/scsi/sd_mod.ko
  modules += drivers/scsi/sata_stm.ko
  modules += drivers/scsi/scsi_mod.ko
  modules += fs/yaffs/yaffs.ko
  modules += fs/fat/fat.ko
  modules += fs/vfat/vfat.ko
  modules += fs/jfs/jfs.ko
  modules += fs/msdos/msdos.ko
  modules += net/netfilter/x_tables.ko
  modules += net/ieee80211/ieee80211.ko
  modules += net/ieee80211/ieee80211_crypt.ko
  modules += net/ieee80211/ieee80211_crypt_ccmp.ko
  modules += net/ieee80211/ieee80211_crypt_wep.ko
  modules += net/ieee80211/ieee80211_crypt_tkip.ko
  modules += net/ieee80211/softmac/ieee80211softmac.ko
  modules += net/ipv4/netfilter/ip_tables.ko
  modules += net/ipv4/netfilter/iptable_mangle.ko

  headers  = linux
  headers += mtd
  headers += video
  headers += sound
  headers += media
  headers += asm-sh
  headers += asm-generic
  headers += net/checksum.h
  headers += net/inet_sock.h
  headers += net/flow.h
  headers += net/sock.h
  headers += net/request_sock.h
  headers += net/dst.h
  headers += net/neighbour.h

  headers_target = $(addprefix $(TARGET_INSTALL_DIR)/include/,$(headers))
  OTHER_TARGETS += $(headers_target)
  OTHER_TARGETS += $(build_dir)/include/linux
  OTHER_TARGETS += $(build_dir)/include/asm-sh

  driver_headers  = serial/stasc.h
  driver_headers += media/video/pwc/pwc-ioctl.h

  OTHER_TARGETS += $(TARGET_INSTALL_DIR)/linux
endif

ifeq ($(FLAVOUR),kernel-debug)
  PRODUCT_TARGETS += $(linux_kernel_nfs)
  modules  = arch/sh/oprofile/oprofile.ko
  modules += drivers/net/netconsole.ko
endif

MODULE_TARGETS += $(addprefix $(modules_dir)/lib/modules/$(full_ver)/kernel/,$(modules))

gen_init_cpio_src = $(SRC_DIR)/usr/gen_init_cpio.c
gen_init_cpio = $(SRC_DIR)/usr/gen_init_cpio
OTHER_TARGETS += $(HOST_DIST_DIR)/bin/gen_init_cpio

SCRIPT_TARGETS += $(SRC_DIR)/scripts/gen_initramfs_list.sh
SCRIPT_TARGETS += patch_mem.sh

DOC_TARGETS = $(SRC_DIR)/COPYING
DOC_OMIT_SOURCE_DIR = yes
DOC_PATH = ../../doc/doc

HACK_TARGETS = modules menuconfig nfsboot nfsboot.mem
HACK_FLAVOUR = kernel-debug


### Extra cleanup

CLEANUP_FILES += $(SRC_DIR) modules


### Common.mk

include ../../../makesystem/common.mk


### Dependencies

$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
	$(UNPACK_SRC_ARCHIVE)
	$(APPLY_PATCHES)

	@echo "Adding yaffs2 support"
	@tar -xzf external_packages/$(yaffs2_archive)
	@mkdir -p $(SRC_DIR)/fs/yaffs
	@cp yaffs2/*.c $(SRC_DIR)/fs/yaffs/
	@cp yaffs2/*.h $(SRC_DIR)/fs/yaffs/
	@cp yaffs2/Makefile.kernel $(SRC_DIR)/fs/yaffs/Makefile
	@cp yaffs2/patches/yaffs_mtdif2.c $(SRC_DIR)/fs/yaffs/
	@rm -rf yaffs2

	@echo "Adding pwc support"
	@tar -xjf external_packages/$(pwc_archive)
        # This patch will do some minor backport stuff and
        # a workaround for some kind of buffer overrun problem.
	@cd $(pwc_dir) && patch -p1 < $(CURDIR)/patches/pwc.patch
	@cp $(pwc_dir)/* $(SRC_DIR)/drivers/media/video/pwc
	@rm -rf $(pwc_dir)

	@echo "Adding ST cryptocore network patch (7100)"
	patch -d $(SRC_DIR) -p1 < cryptocore/linux-sh4-2.6.11.12-stm20-33-cryptocore.patch
	@cp cryptocore/cryptocore.h $(SRC_DIR)/include/linux/stm
	@cp cryptocore/cryptocore_v16.c $(SRC_DIR)/drivers/stm/cryptocore

	@echo "Adding network driver (7100)"
	@cp smsc_911x/* $(SRC_DIR)/drivers/net/smsc_911x

	@echo "Updating network driver (7109)"
	@echo "Excluding smsc8700.c and phy.c since they overwrites patches."
	@tar -xzf moto_stmmac_test.tgz --exclude=smsc8700.c --exclude=phy.c -C $(SRC_DIR)
	patch -d $(SRC_DIR) -p1 < patches/udpfilter.patch
	patch -d $(SRC_DIR) -p1 < patches/smsc911x_crypto.patch
	patch -d $(SRC_DIR) -p1 < patches/stmmac.patch
	patch -d $(SRC_DIR) -p1 < patches/stmmac.c.quota.patch
	patch -d $(SRC_DIR) -p1 < patches/stmmac_reboot.patch

	@echo "Adding K-box drivers"
	@for dir in $(kreatel_stuff) ; do \
	  for f in $$(find $$dir); do \
            if [ \( ! -z "$${f##*svn*}" \) -a \( -f "$$f" \) ]; then \
	      echo "Copying" $$f "to $(SRC_DIR)/$${f%/*}" ; \
	      mkdir -p $(SRC_DIR)/$${f%/*} ; \
	      cp $$f $(SRC_DIR)/$${f%/*} ; \
	    fi ; \
	  done ; \
	done
	@touch $@

LMAKE := $(BSG_DEVSETUP) BSG_INCLUDE=$(TARGET_DIST_DIR)/include \
         $(MAKE) -C $(SRC_DIR) ARCH=sh CROSS_COMPILE="$(CROSS_PREFIX)" \
	 O="$(build_dir)"

$(build_config): $(src_done) $(config)
	@mkdir -p $(build_dir)
	@cp $(config) $@

$(oldconfig_done): $(build_config)
	+$(LMAKE) oldconfig
	@touch $@

$(linux_kernel): $(oldconfig_done)
	+$(LMAKE) vmlinux
	cp $(build_dir)/vmlinux $@

$(modules_done): $(linux_kernel)
	+$(LMAKE) modules
	+$(LMAKE) modules_install DEPMOD=true INSTALL_MOD_PATH=$(modules_dir)
	@touch $@

$(MODULE_TARGETS): $(modules_done)

$(linux_kernel_nfs_nosec): $(linux_kernel)
	@$(BSG_DEVSETUP) $(DIST_DIR)/bin/build_sh4_initramfs_image \
	  $^ /dev/null $@.bin $(DIST_DIR)/bin
	@gzip -9 < $@.bin > $@
	@rm $@.bin

$(linux_kernel_nfs): $(linux_kernel_nfs_nosec)
	@$(HOST_DIST_DIR)/bin/ukeytool sign \
	  -i $^ \
	  -o $@ \
	  -k $(DIST_DIR)/config/keys/kreatel_ak_private.key \
	  -c $(DIST_DIR)/config/keys/kreatel_aes.key \
	  -s 1 -e aes

$(headers_target): $(src_done)
	rm -rf $@
	@mkdir -p $(dir $@)
	cp -a $(patsubst $(TARGET_INSTALL_DIR)/%,$(SRC_DIR)/%,$@) $@
	@touch $@

$(build_dir)/include/linux: $(TARGET_INSTALL_DIR)/include/linux $(linux_kernel)
	cp $@/*.h $<
	cp -a $(addprefix $(SRC_DIR)/drivers/,$(driver_headers)) $<
	@touch $@

$(build_dir)/include/asm-sh: $(TARGET_INSTALL_DIR)/include/asm-sh $(linux_kernel)
	cp $@/*.h $<
	ln -sfn asm-sh $(dir $<)asm
	ln -sfn cpu-sh4 $</cpu
	ln -sfn stb7100ref $</mach
	@touch $@

$(SCRIPT_TARGETS): $(src_done)

$(DOC_TARGETS): $(src_done)

$(gen_init_cpio_src): $(src_done)

$(gen_init_cpio): $(gen_init_cpio_src)
	$(HOST_CC) $< -o $@

$(HOST_DIST_DIR)/bin/gen_init_cpio: $(gen_init_cpio)
	@mkdir -p $(@D)
	cp $< $@

$(TARGET_INSTALL_DIR)/linux: $(modules_done)
	@echo "Creating $@ for building external modules"
	@rm -rf $@
	@mkdir -p $@
        # Copy makesystem
	cd $(SRC_DIR) && \
	  cp --parents $$(find -type f -name 'Kconfig*' -o -name 'Makefile*') $@
        # Remove stuff we don't want
	@rm -rf $@/Documentation
	@rm -rf $@/include
	@rm -rf $@/scripts
        # Copy includes
	@mkdir $@/include
	cd $(SRC_DIR)/include && \
	  cp -a $$(find -maxdepth 1 ! -name 'asm*' -a ! -name . -o -name asm-generic) \
	  $@/include
	cp -a $(SRC_DIR)/include/asm-sh $@/include
        # Copy scripts
	cp -a $(SRC_DIR)/scripts $@
	@cd $(build_dir) && cp --parents -a $$(find -type d -name scripts) $@
	@find $@/scripts -name '*.o' -print0 | xargs -0 rm -f
        # Stuff generated from build
	cp -a $(build_dir)/.kernelrelease $@
	cp -a $(build_dir)/Module.symvers $@
	cp -a $(build_dir)/System.map $@
	cp -a $(build_dir)/include/config $@/include
	cp -a $(build_dir)/include/linux/*.h $@/include/linux
	cp -a $(build_dir)/include/asm-sh/*.h $@/include/asm-sh
        # Kernel config
	cp -a $(build_config) $@
	cp -a $(build_config) $@/include/config/auto.conf
        # Symlinks
	@ln -sfn asm-sh $@/include/asm
	@ln -sfn cpu-sh4 $@/include/asm-sh/cpu
	@ln -sfn stb7100ref $@/include/asm-sh/mach
	@touch $@

# Hack targets

unpack: $(src_done)

menuconfig: $(build_config)
	$(LMAKE) menuconfig

modules: $(oldconfig_done)
	+$(LMAKE) modules
	+$(LMAKE) modules_install DEPMOD=true INSTALL_MOD_PATH=$(modules_dir)

nfsboot: $(oldconfig_done)
	+$(LMAKE) vmlinux
	@$(BSG_DEVSETUP) $(DIST_DIR)/bin/build_sh4_initramfs_image \
	  $(build_dir)/vmlinux /dev/null $@.bin $(DIST_DIR)/bin
	@gzip -9 < $@.bin > $@.nosec
	@rm $@.bin
	@$(HOST_DIST_DIR)/bin/ukeytool sign \
	  -i $@.nosec \
	  -o $@ \
	  -k $(DIST_DIR)/config/keys/kreatel_ak_private.key \
	  -c $(DIST_DIR)/config/keys/kreatel_aes.key \
	  -s 1 -e aes

$(memfile):
	echo -en "\x00\xb0\x34\x00" > $@

nfsboot.mem: $(oldconfig_done) $(memfile)
	+$(LMAKE) vmlinux
	@$(BSG_DEVSETUP) ./patch_mem.sh $(build_dir)/vmlinux $(memfile) $(build_dir)/vmlinux.mem
	@$(BSG_DEVSETUP) $(DIST_DIR)/bin/build_sh4_initramfs_image \
	  $(build_dir)/vmlinux.mem /dev/null $@.bin $(DIST_DIR)/bin
	@gzip -9 < $@.bin > $@.nosec
	@rm $@.bin
	@$(HOST_DIST_DIR)/bin/ukeytool sign \
	  -i $@.nosec \
	  -o $@ \
	  -k $(DIST_DIR)/config/keys/kreatel_ak_private.key \
	  -c $(DIST_DIR)/config/keys/kreatel_aes.key \
	  -s 1 -e aes

.PHONY: unpack menuconfig modules nfsboot nfsboot.mem
