Example #1
0
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	ulong	addr, rc;
	int     rcode = 0;

	if (argc < 2)
		return CMD_RET_USAGE;

	addr = simple_strtoul(argv[1], NULL, 16);

	printf ("## Starting application at 0x%08lX ...\n", addr);

//add by zdh 
//for go zImage
	if (argc == 2)
	rc = do_go_exec ((void *)addr, 0, 1270);
	else
//end by zdh
	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}
int do_start (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong *	addr;
	ulong rc;
	int     rcode = 0;

	if (argc != 2) {
		cmd_usage(cmdtp);
		return 1;
	}

	(*addr) = simple_strtoul(argv[1], NULL, 16);

	ulong entryPoint = *(addr+1);

	printf ("## Starting application at 0x%08lX ...\n", entryPoint);

	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)entryPoint, argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}
Example #3
0
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	ulong	addr, rc;
	int     rcode = 0;

    if( argv[1][0]=='.' )
    {
        extern void boot_rw_test(int argc, char * const argv[]);
        boot_rw_test(argc, argv);
        return 1;
    }

	if (argc < 2)
//        return cmd_usage(cmdtp);
    {
        printf ("Usage:\n%s\n", cmdtp->usage);
        addr = auto_search_kernel_entry(0x80880000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80780000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80980000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80680000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80A80000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80B80000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80C80000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80580000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80480000) ;
        if( 0==addr )
            addr = auto_search_kernel_entry(0x80D80000) ;
        if( 0==addr )
            return cmd_usage(cmdtp);
            //return 1 ;
        printf( "Auto Search Kernel_Entry: 0x%08luX\n", addr ) ;
    }else
        addr = simple_strtoul(argv[1], NULL, 16);

	printf ("## Starting application at 0x%08lX ...\n", addr);

	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}
Example #4
0
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong	addr, rc;
	int     rcode = 0;

	if (argc < 2) {
		cmd_usage(cmdtp);
		return 1;
	}
	/************* farsight **************/
	char *commandline = getenv("bootargs");
	/************* farsight **************/

	struct param_struct *lht_params=(struct param_struct *)0x20000100;

	printf("setup linux parameters at 0x20000100\n");
	memset(lht_params,0,sizeof(struct param_struct));
	lht_params->u1.s.page_size=4096;
	lht_params->u1.s.nr_pages=0x10000000>>12;
	memcpy(lht_params->commandline,commandline,strlen(commandline)+1);
	printf("linux command line is: \"%s\"\n",commandline);
	/************* farsight **************/

	addr = simple_strtoul(argv[1], NULL, 16);

	printf ("## Starting application at 0x%08lX ...\n", addr);

	/************** farsight *************/
	__asm__(
		"ldr 	r1, =1826\n"
		"mov	ip, #0\n"
		"mcr 	p15, 0, ip, c8, c7, 0\n"
		"mcr	p15, 0, ip, c7, c5, 0\n"
		"mcr 	p15, 0, ip, c7, c5, 6\n"
		"mcr 	p15, 0, ip, c7, c10, 4\n"
		"mcr 	p15, 0, ip, c7, c5, 4\n"

		"mrc	p15, 0, ip, c1, c0, 0\n"
		"bic	ip, ip, #0x00002000\n"
		"bic 	ip, ip, #0x00000007\n"
		"orr 	ip, ip, #0x00000002\n"
		"orr 	ip, ip, #0x00000800\n"
		"bic	ip, ip, #0x00001000\n"
		"mcr	p15, 0, ip, c1, c0, 0\n"
		
		"mov pc, %[zImage]\n"
		"nop\n"
		:
		:[zImage]"r"(addr)
		:"r1"
		);
	/**************** farsight ************/

	/*
	 * pass address parameter as argv[0] (aka command name),
	 * and all remaining args
	 */
	rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
	if (rc != 0) rcode = 1;

	printf ("## Application terminated, rc = 0x%lX\n", rc);
	return rcode;
}
/**
 * This will search for one or more bootloaders in the SPI NOR and boot
 * either the failsafe one or the last valid one found.
 *
 * @param cmdtp		Command data structure
 * @param flag		flags, not used
 * @param argc		argument count, not used, passed on
 * @param argv		arguments, not used, passed on
 *
 * @return		-1 on error otherwise no return.
 */
int do_octbootstage3(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	struct spi_flash *flash;
	struct bootloader_header *header;
	uint32_t addr;
	const int bus = 0;
	const int cs = 0;
	const int speed = CONFIG_SF_DEFAULT_SPEED;
	const int mode = CONFIG_SF_DEFAULT_MODE;
	void *buf;
	int len;
	int offset;
	int found_offset = -1;
	int found_size = 0;
	int rc;
	int failsafe;

	flash = spi_flash_probe(bus, cs, speed, mode);
	if (!flash) {
		printf("Failed to initialize SPI flash at %u:%u", bus, cs);
		return -1;
	}
	addr = getenv_ulong("octeon_stage3_load_addr", 16,
			    CONFIG_OCTEON_STAGE3_LOAD_ADDR);

	header = CASTPTR(struct bootloader_header, addr);
	buf = (void *)header;
#ifdef CONFIG_OCTEON_FAILSAFE_GPIO
	failsafe = gpio_direction_input(CONFIG_OCTEON_FAILSAFE_GPIO);
#else
	failsafe = 0;
#endif

	offset = CONFIG_OCTEON_SPI_BOOT_START;
	do {
		if (spi_flash_read(flash, offset, sizeof(*header), header)) {
			printf("Could not read SPI flash to find bootloader\n");
			return -1;
		}

		if (!validate_bootloader_header(header) ||
		    (header->board_type != gd->arch.board_desc.board_type)) {
			offset += flash->erase_size;
			continue;
		}

		len = header->hlen + header->dlen - sizeof(*header);
		if (len < 0) {
			printf("Invalid length calculated, hlen: %d, dlen: %d\n",
			       header->hlen, header->dlen);
			offset += flash->erase_size;
			continue;
		}
		/* Read rest of bootloader */
		rc = spi_flash_read(flash, offset + sizeof(*header), len,
				    &header[1]);
		if (rc) {
			printf("Could not read %d bytes from SPI flash\n",
			       header->dlen + header->hlen);
			return -1;
		}
		if (calculate_image_crc(header) != header->dcrc) {
			printf("Found corrupted image at offset 0x%x, continuing search\n",
			       offset);
			offset += flash->erase_size;
			continue;
		}
		found_offset = offset;
		found_size = header->hlen + header->dlen;
		printf("Found valid SPI bootloader at offset: 0x%x, size: %d bytes\n",
		       found_offset, found_size);
		if (failsafe)
			break;
		/* Skip past the current image to the next one */
		offset += (found_size + flash->erase_size - 1) &
							~(flash->erase_size);
	} while (offset < CONFIG_OCTEON_SPI_BOOT_END);

	if (found_offset < 0) {
		printf("Could not find stage 3 bootloader\n");
		return -1;
	}

	/* If we searched for multiple bootloaders and didn't stop at the first
	 * one (i.e. failsafe) then re-read the last good one found into
	 * memory.
	 */
	if (found_offset != offset) {
		rc = spi_flash_read(flash, found_offset, found_size, header);
		if (rc) {
			printf("Error reading bootloader from offset 0x%x, size: 0x%x\n",
			       found_offset, found_size);
			return -1;
		}
	}

	do_go_exec(buf, argc - 1, argv + 1);

	return 0;
}
int do_octbootstage3(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	uint32_t addr, rc;
	int rcode = 0;
	char *filename;
	char *failsafe_filename;
	const char *dev_name;
	int failsafe;
	int size = 0;
	int max_size = 0;
	int part_no;
	int dev_no = 0;
	block_dev_desc_t *dev_desc = NULL;

	filename = getenv("octeon_stage3_bootloader");
	addr = getenv_ulong("octeon_stage3_load_addr", 16,
			    CONFIG_OCTEON_STAGE3_LOAD_ADDR);
	max_size = getenv_ulong("octeon_stage3_max_size", 0,
				CONFIG_OCTEON_STAGE3_MAX_SIZE);
	dev_no = getenv_ulong("octeon_stage3_devno", 0,
			   CONFIG_OCTEON_STAGE3_DEVNO);
	dev_name = getenv("octeon_stage3_devname");

	if (!dev_name)
		dev_name = CONFIG_OCTEON_STAGE3_DEVNAME;

	dev_desc = get_dev(dev_name, dev_no);
	if (!dev_desc) {
		printf("Could not find device %s %d\n", dev_name, dev_no);
		return -1;
	}

	part_no = find_bootable_fat_partition(dev_desc);
	if (part_no < 0) {
		printf("No bootable FAT partition found\n");
		return -1;
	}

	if (fat_register_device(dev_desc, part_no) != 0) {
		printf("Unable to use %s %d:%d for FAT partition\n", dev_name,
		       dev_no, part_no);
	}

#ifndef CONFIG_OCTEON_NO_STAGE3_FAILSAFE
	failsafe = gpio_direction_input(CONFIG_OCTEON_FAILSAFE_GPIO);

	if (!filename) {
		failsafe = 1;
	}

	if (!failsafe) {
		size = file_fat_read(filename, (unsigned char *)addr, max_size);
		if (size <= 0) {
			printf("Could not read %s, trying failsafe\n", filename);
			goto failsafe;
		}
		do_go_exec((void *)addr, argc - 1, argv + 1);
	}

failsafe:
	failsafe_filename = getenv("octeon_stage3_failsafe_bootloader");
	if (!failsafe_filename) {
		failsafe_filename = CONFIG_OCTEON_STAGE3_FAILSAFE_FILENAME;
		printf("Error: environment variable octeon_stage3_failsafe_bootloader is not set.\n");
		return 0;
	}
	if (failsafe_filename) {
		size = file_fat_read(filename, (unsigned char *)addr,
				     max_size);
		if (size <= 0) {
			printf("Could not read failsafe bootloader %s, "
			       "trying %s\n", failsafe_filename,
			       CONFIG_OCTEON_STAGE3_FAILSAFE_FILENAME);
			failsafe_filename = CONFIG_OCTEON_STAGE3_FAILSAFE_FILENAME;
		}
	} else {
		printf("No failsafe available!\n");
		return -1;
	}
#else
	if (!filename)
		filename = CONFIG_OCTEON_STAGE3_FILENAME;

	size = file_fat_read(filename, (unsigned char *)addr, max_size);
	if (size <= 0) {
		printf("Could not open stage 3 bootloader %s\n", filename);
		return -1;
	}
	do_go_exec((void *)addr, argc - 1, argv + 1);
#endif
	return -1;
}