123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- // 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(struct cmd_tbl *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(struct cmd_tbl *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");
|