// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (c) 2012 The Chromium OS Authors.
 */

/*
 * IO space access commands.
 */

#include <common.h>
#include <command.h>
#include <asm/io.h>

/* Display values from last command */
static ulong last_addr, last_size;
static ulong last_length = 0x40;
static ulong base_address;

#define DISP_LINE_LEN	16

/*
 * IO Display
 *
 * Syntax:
 *	iod{.b, .w, .l} {addr}
 */
int do_io_iod(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	ulong addr, length, bytes;
	u8 buf[DISP_LINE_LEN];
	int size, todo;

	/*
	 * We use the last specified parameters, unless new ones are
	 * entered.
	 */
	addr = last_addr;
	size = last_size;
	length = last_length;

	if (argc < 2)
		return CMD_RET_USAGE;

	if ((flag & CMD_FLAG_REPEAT) == 0) {
		/*
		 * New command specified.  Check for a size specification.
		 * Defaults to long if no or incorrect specification.
		 */
		size = cmd_get_data_size(argv[0], 4);
		if (size < 0)
			return 1;

		/* Address is specified since argc > 1 */
		addr = simple_strtoul(argv[1], NULL, 16);
		addr += base_address;

		/*
		 * If another parameter, it is the length to display.
		 * Length is the number of objects, not number of bytes.
		 */
		if (argc > 2)
			length = simple_strtoul(argv[2], NULL, 16);
	}

	bytes = size * length;

	/* Print the lines */
	for (; bytes > 0; addr += todo) {
		u8 *ptr = buf;
		int i;

		todo = min(bytes, (ulong)DISP_LINE_LEN);
		for (i = 0; i < todo; i += size, ptr += size) {
			if (size == 4)
				*(u32 *)ptr = inl(addr + i);
			else if (size == 2)
				*(u16 *)ptr = inw(addr + i);
			else
				*ptr = inb(addr + i);
		}
		print_buffer(addr, buf, size, todo / size,
			     DISP_LINE_LEN / size);
		bytes -= todo;
	}

	last_addr = addr;
	last_length = length;
	last_size = size;

	return 0;
}

int do_io_iow(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	ulong addr, val;
	int size;

	if (argc != 3)
		return CMD_RET_USAGE;

	size = cmd_get_data_size(argv[0], 4);
	if (size < 0)
		return 1;

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

	if (size == 4)
		outl((u32) val, addr);
	else if (size == 2)
		outw((u16) val, addr);
	else
		outb((u8) val, addr);

	return 0;
}

/**************************************************/
U_BOOT_CMD(iod, 3, 1, do_io_iod,
	   "IO space display", "[.b, .w, .l] address");

U_BOOT_CMD(iow, 3, 0, do_io_iow,
	   "IO space modify",
	   "[.b, .w, .l] address value");
