#include <boot.h>
#include <c2k_otp.h>
#include <common.h>
#include <command.h>
#include <init.h>
#include <clock.h>
#include <config.h>
#include <malloc.h>
#include <secure_boot.h>
#include <sha1.h>
#include <rsa_verify.h>
#include <xyzModem.h>
#include <mach/comcerto-2000.h>
#include <mach/gpio.h>
#include <asm/io.h>

#define ULOADER_PART_SIZE 0x20000 /* 128 KB */
#define BAREBOX_PART_SIZE 0x80000
#define BAREBOX_HEADER_SIZE 0x10	/* 16 bytes */
#define BAREBOX_LODING_ADDR \
	(COMCERTO_AXI_DDR_BASE + 0x1000000 - BAREBOX_HEADER_SIZE)

#ifdef CONFIG_COMCERTO_NAND_ULOADER
extern int read_nand(ulong src, ulong offset, ulong count);
#endif

#if 0 
static int bb_timeout(int timeout)
{
	int ret = 1;
	int countdown;
	uint64_t start, second;
	char c;

	start = get_time_ns();
	second = start;

	countdown = timeout;

	printf("Press Ctrl-X to interrupt");
	printf("\n%2d", countdown--);

	do {
		if (tstc()) {
			c = getc();
			/* User can get a barebox prompt by pressing Ctrl-X */
			if (c == 24) {
				ret = 1;
				goto  out;
			}
		}

		if (is_timeout(second, SECOND)) {
			printf("\b\b%2d", countdown--);
			second += SECOND;
		}
	} while (!is_timeout(start, timeout * SECOND));

	ret = 0;
out:
	printf("\n");

	return ret;
}
#endif

static void bb_go(void *addr)
{
	int	(*func)(void);

	printf("\n## Starting Barebox at 0x%p ...\n", addr);

	console_flush();

	func = addr;

	shutdown_barebox();
	func();

	/*
	 * The application returned. Since we have shutdown barebox and
	 * we know nothing about the state of the cpu/memory we can't
	 * do anything here.
	 */
	while (1);
}

#ifdef CONFIG_CMD_BOOTB_UART_DOWNLOAD
static int getcxmodem(void)
{
	if (tstc())
		return (getc());
	return -1;
}

static int load_serial_ymodem(void *dst)
{
	int err;
	int res;
	connection_info_t info;
	void *addr = dst;

	info.mode = xyzModem_ymodem;
	res = xyzModem_stream_open(&info, &err);
	if (!res) {
		res = xyzModem_stream_read(addr, 16*1024*1024, &err);
	} else {
		printf("%s\n", xyzModem_error(err));
		return 1;
	}
	xyzModem_stream_close(&err);
	xyzModem_stream_terminate(false, &getcxmodem);

	printf("## Total Size = %d Bytes\n", res);

	return 0;
}
#else /* CONFIG_CMD_BOOTB_UART_DOWNLOAD */
static int load_serial_ymodem(void *dst)
{
	printf("YMODEM download not supported\n");
	return -1;
}
#endif /* CONFIG_CMD_BOOTB_UART_DOWNLOAD */

static int verify_image(u8 *image_ptr, u32 max_image_len) {
	sha1_context ctx;
	u8 *sig, hash[20];
	u32 image_len, sig_offset;

	image_len = _get_le_uint32(image_ptr);
	if (image_len > max_image_len) {
		printf("ERROR: barebox image verification failed (bad header)\n");
		return -1;
	}
	image_ptr += 4;

	sig_offset = _get_le_uint32(image_ptr);
	image_ptr += 4;

	image_ptr += 8;

	sha1_starts(&ctx);
	sha1_update(&ctx, image_ptr, image_len);
	sha1_finish(&ctx, hash);

	image_ptr += sig_offset;
	sig = image_ptr;

	return rsa_verify(sig, 256, hash);
}

static int do_bootb_barebox(void)
{
	volatile u32 *src = (u32 *)(COMCERTO_AXI_EXP_BASE + ULOADER_PART_SIZE); /* Start of NOR + uLdr size(128K) */
	volatile u32 *dst = (u32*)BAREBOX_LODING_ADDR;
	int count = BAREBOX_PART_SIZE;
	u32 bootopt;
#if 0
	int timeout = 1;
#endif
#ifdef CONFIG_FORCE_BAREBOX_AUTH
	bool secure_boot = true;
#else
	bool secure_boot;
	secure_boot_mode_t boot_mode = get_secure_boot_mode();

	if (boot_mode == UNKNOWN) {
		printf("Error: Unable to determine secure boot mode.\n");
		return -1;
	}
	secure_boot = (boot_mode == SECURE);
#endif

#if 0
	if(!secure_boot && bb_timeout(timeout))
		return 0;
#endif

#ifdef CONFIG_COMCERTO_NAND_ULOADER
	/* this option is used when uloader is in NOR flash or I2C EEPROM and 
	barebox is in NAND */
	printf("\nCopying Bb from NAND\n");
	read_nand(BAREBOX_LODING_ADDR, 0x0, BAREBOX_PART_SIZE);
#else

	bootopt = ((readl(COMCERTO_GPIO_SYSTEM_CONFIG) >>  BOOTSTRAP_BOOT_OPT_SHIFT) & BOOTSTRAP_BOOT_OPT_MASK);
	
	switch(bootopt){
		case BOOT_UART:
			printf("\nReady to receive Barebox over UART (bootopt=%d)\n", \
					bootopt);
			if (load_serial_ymodem((void *) dst)) return -1;
			break;
		default:
			/*
			   -With NOR boot the barebox will be loaded from NOR flash.
			   -With I2C boot the barebox will be loaded either from NOR flash or NAND. 
			   If NAND then this part of code won't be compiled as CONFIG_COMCERTO_NAND_ULOADER 
			   will be selected.
			   -With other boot option like UART boot, barebox will be loaded from NOR by default
			 */
			printf("\nCopying Barebox from NOR Flash(bootopt=%d)\n", \
					bootopt);
			memcpy((void *)dst, (void *)src, count);
			break;
	}

#endif

	if (secure_boot) {
		printf("\nSecure boot detected; verifying Barebox image\n");

		if (verify_image((u8 *) BAREBOX_LODING_ADDR, BAREBOX_PART_SIZE) == 0) {
			printf("Barebox image verified!\n");
		} else {
			printf("ERROR: Barebox image verification failed!\n");
			return -1;
		}
	} else {
		printf("Secure boot not enabled; skipping barebox verification.\n");
	}

	bb_go((void*)(BAREBOX_LODING_ADDR + BAREBOX_HEADER_SIZE));

	return -1;
}

late_initcall(do_bootb_barebox);

