diff options
| author | Stefan Roese <sr@denx.de> | 2009-06-04 13:35:36 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2009-06-12 20:47:18 +0200 | 
| commit | 0e5ef07d0d91bd3d87ebea0534f538561aa974d5 (patch) | |
| tree | 66e784af215917c54183f523e26acd7b66646847 | |
| parent | 0a14d6b8f4d21ff59a9b7686a49a77069a9fcd2a (diff) | |
| download | olio-uboot-2014.01-0e5ef07d0d91bd3d87ebea0534f538561aa974d5.tar.xz olio-uboot-2014.01-0e5ef07d0d91bd3d87ebea0534f538561aa974d5.zip | |
74xx_7xx: CPCI750: Add loadpci command
This command is used to load/boot an OS-image which is transferred from
the CPCI host to the CPCI target/adapter.
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Reinhard Arlt <reinhard.arlt@esd-electronics.com>
| -rw-r--r-- | board/esd/cpci750/cpci750.c | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/board/esd/cpci750/cpci750.c b/board/esd/cpci750/cpci750.c index 258d8b234..cd806e1c1 100644 --- a/board/esd/cpci750/cpci750.c +++ b/board/esd/cpci750/cpci750.c @@ -122,6 +122,9 @@ static char show_config_tab[][15] = {{"PCI0DLL_2     "},  /* 31 */  extern flash_info_t flash_info[]; +extern int do_bootm (cmd_tbl_t *, int, int, char *[]); +extern int do_bootvx (cmd_tbl_t *, int, int, char *[]); +  /* ------------------------------------------------------------------------- */  /* this is the current GT register space location */ @@ -538,6 +541,79 @@ int display_mem_map (void)  	return (0);  } +/* + * Command loadpci: wait for signal from host and boot image. + */ +int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	volatile unsigned int *ptr; +	int count = 0; +	int count2 = 0; +	int status; +	char addr[16]; +	char str[] = "\\|/-"; +	char *local_args[2]; + +	/* +	 * Mark sync address +	 */ +	ptr = 0; +	ptr[0] = 0xffffffff; +	ptr[1] = 0xffffffff; +	puts("\nWaiting for image from pci host -"); + +	/* +	 * Wait for host to write the start address +	 */ +	while (*ptr == 0xffffffff) { +		count++; +		if (!(count % 100)) { +			count2++; +			putc(0x08); /* backspace */ +			putc(str[count2 % 4]); +		} + +		/* Abort if ctrl-c was pressed */ +		if (ctrlc()) { +			puts("\nAbort\n"); +			return 0; +		} + +		udelay(1000); +	} + +	sprintf(addr, "%08x", *ptr); +	printf("\nBooting Image at addr 0x%s ...\n", addr); +	setenv("loadaddr", addr); + +	switch (ptr[1] == 0) { +	case 0: +		/* +		 * Boot image via bootm +		 */ +		local_args[0] = argv[0]; +		local_args[1] = NULL; +		status = do_bootm (cmdtp, 0, 1, local_args); +		break; +	case 1: +		/* +		 * Boot image via bootvx +		 */ +		local_args[0] = argv[0]; +		local_args[1] = NULL; +		status = do_bootvx (cmdtp, 0, 1, local_args); +		break; +	} + +	return 0; +} + +U_BOOT_CMD( +	loadpci,	1,	1,	do_loadpci, +	"loadpci - Wait for pci-image and boot it\n", +	NULL +	); +  /* DRAM check routines copied from gw8260 */  #if defined (CONFIG_SYS_DRAM_TEST) |