| /* | 
 |  * (C) Copyright 2013 | 
 |  * Dirk Eibach,  Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc | 
 |  * | 
 |  * based on cmd_mem.c | 
 |  * (C) Copyright 2000 | 
 |  * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | 
 |  * | 
 |  * SPDX-License-Identifier:	GPL-2.0+ | 
 |  */ | 
 |  | 
 | #include <common.h> | 
 | #include <command.h> | 
 | #include <console.h> | 
 |  | 
 | #include <gdsys_fpga.h> | 
 |  | 
 | static uint	dp_last_fpga; | 
 | static uint	dp_last_addr; | 
 | static uint	dp_last_length = 0x40; | 
 |  | 
 | /* | 
 |  * FPGA Memory Display | 
 |  * | 
 |  * Syntax: | 
 |  *	fpgad {fpga} {addr} {len} | 
 |  */ | 
 | #define DISP_LINE_LEN	16 | 
 | int do_fpga_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | 
 | { | 
 | 	unsigned int k; | 
 | 	unsigned int fpga; | 
 | 	ulong	addr, length; | 
 | 	int rc = 0; | 
 | 	u16 linebuf[DISP_LINE_LEN/sizeof(u16)]; | 
 | 	ulong nbytes; | 
 |  | 
 | 	/* | 
 | 	 * We use the last specified parameters, unless new ones are | 
 | 	 * entered. | 
 | 	 */ | 
 | 	fpga = dp_last_fpga; | 
 | 	addr = dp_last_addr; | 
 | 	length = dp_last_length; | 
 |  | 
 | 	if (argc < 3) | 
 | 		return CMD_RET_USAGE; | 
 |  | 
 | 	if ((flag & CMD_FLAG_REPEAT) == 0) { | 
 | 		/* | 
 | 		 * FPGA is specified since argc > 2 | 
 | 		 */ | 
 | 		fpga = simple_strtoul(argv[1], NULL, 16); | 
 |  | 
 | 		/* | 
 | 		 * Address is specified since argc > 2 | 
 | 		 */ | 
 | 		addr = simple_strtoul(argv[2], NULL, 16); | 
 |  | 
 | 		/* | 
 | 		 * If another parameter, it is the length to display. | 
 | 		 * Length is the number of objects, not number of bytes. | 
 | 		 */ | 
 | 		if (argc > 3) | 
 | 			length = simple_strtoul(argv[3], NULL, 16); | 
 | 	} | 
 |  | 
 | 	nbytes = length * sizeof(u16); | 
 | 	do { | 
 | 		ulong linebytes = (nbytes > DISP_LINE_LEN) ? | 
 | 				  DISP_LINE_LEN : nbytes; | 
 |  | 
 | 		for (k = 0; k < linebytes / sizeof(u16); ++k) | 
 | 			fpga_get_reg(fpga, | 
 | 				     (u16 *)fpga_ptr[fpga] + addr | 
 | 				     / sizeof(u16) + k, | 
 | 				     addr + k * sizeof(u16), | 
 | 				     &linebuf[k]); | 
 | 		print_buffer(addr, (void *)linebuf, sizeof(u16), | 
 | 			     linebytes / sizeof(u16), | 
 | 			     DISP_LINE_LEN / sizeof(u16)); | 
 |  | 
 | 		nbytes -= linebytes; | 
 | 		addr += linebytes; | 
 | 		if (ctrlc()) { | 
 | 			rc = 1; | 
 | 			break; | 
 | 		} | 
 | 	} while (nbytes > 0); | 
 |  | 
 | 	dp_last_fpga = fpga; | 
 | 	dp_last_addr = addr; | 
 | 	dp_last_length = length; | 
 | 	return rc; | 
 | } | 
 |  | 
 | U_BOOT_CMD( | 
 | 	fpgad,	4,	1,	do_fpga_md, | 
 | 	"fpga register display", | 
 | 	"fpga address [# of objects]" | 
 | ); |