// SPDX-License-Identifier: GPL-2.0+
/*
 * (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.
 */

#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(struct cmd_tbl *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]"
);
