mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 20:18:18 +00:00 
			
		
		
		
	Move this out of the common header and include it only where needed. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			126 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * Copyright (c) 2012 The Chromium OS Authors.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * IO space access commands.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <command.h>
 | |
| #include <display_options.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 = hextoul(argv[1], NULL);
 | |
| 		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 = hextoul(argv[2], NULL);
 | |
| 	}
 | |
| 
 | |
| 	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 = hextoul(argv[1], NULL);
 | |
| 	val = hextoul(argv[2], NULL);
 | |
| 
 | |
| 	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");
 |