/*
 * Copyright (c) Orbacom Systems, Inc <www.orbacom.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are freely
 * permitted provided that the above copyright notice and this
 * paragraph and the following disclaimer are duplicated in all
 * such forms.
 *
 * This software is provided "AS IS" and without any express or
 * implied warranties, including, without limitation, the implied
 * warranties of merchantability and fitness for a particular
 * purpose.
 */

#include <common.h>
#include <asm/processor.h>
#include <image.h>
#include <net.h>

#include <lynxkdi.h>

DECLARE_GLOBAL_DATA_PTR;

#if defined(CONFIG_MPC8260) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
void lynxkdi_boot(image_header_t *hdr)
{
	void (*lynxkdi)(void) = (void(*)(void))image_get_ep(hdr);
	lynxos_bootparms_t *parms = (lynxos_bootparms_t *)0x0020;
	bd_t *kbd;
	u32 *psz = (u32 *)(image_get_load(hdr) + 0x0204);

	memset(parms, 0, sizeof(*parms));
	kbd = gd->bd;
	parms->clock_ref = kbd->bi_busfreq;
	parms->dramsz = kbd->bi_memsize;
	eth_getenv_enetaddr("ethaddr", parms->ethaddr);
	mtspr(SPRN_SPRG2, 0x0020);

	/* Do a simple check for Bluecat so we can pass the
	 * kernel command line parameters.
	 */
	/* FIXME: NOT SURE HERE ! */
	if (le32_to_cpu(*psz) == image_get_data_size(hdr)) {
		char *args;
		char *cmdline = (char *)(image_get_load(hdr) + 0x020c);
		int len;

		printf("Booting Bluecat KDI ...\n");
		udelay(200*1000); /* Allow serial port to flush */
		if ((args = getenv("bootargs")) == NULL)
			args = "";
		/* Prepend the cmdline */
		len = strlen(args);
		if (len && (len + strlen(cmdline) + 2 < (0x0400 - 0x020c))) {
			memmove(cmdline + strlen(args) + 1, cmdline,
				strlen(cmdline));
			strcpy(cmdline, args);
			cmdline[len] = ' ';
		}
	}
	else {
		printf("Booting LynxOS KDI ...\n");
	}

	lynxkdi();
}
#else
#error "Lynx KDI support not implemented for configured CPU"
#endif
