1*4395f667SSimon Glass /* 2*4395f667SSimon Glass * Handling of common block commands 3*4395f667SSimon Glass * 4*4395f667SSimon Glass * Copyright (c) 2017 Google, Inc 5*4395f667SSimon Glass * 6*4395f667SSimon Glass * (C) Copyright 2000-2011 7*4395f667SSimon Glass * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 8*4395f667SSimon Glass * 9*4395f667SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 10*4395f667SSimon Glass */ 11*4395f667SSimon Glass 12*4395f667SSimon Glass #include <common.h> 13*4395f667SSimon Glass #include <blk.h> 14*4395f667SSimon Glass 15*4395f667SSimon Glass #ifdef HAVE_BLOCK_DEVICE 16*4395f667SSimon Glass int blk_common_cmd(int argc, char * const argv[], enum if_type if_type, 17*4395f667SSimon Glass int *cur_devnump) 18*4395f667SSimon Glass { 19*4395f667SSimon Glass const char *if_name = blk_get_if_type_name(if_type); 20*4395f667SSimon Glass 21*4395f667SSimon Glass switch (argc) { 22*4395f667SSimon Glass case 0: 23*4395f667SSimon Glass case 1: 24*4395f667SSimon Glass return CMD_RET_USAGE; 25*4395f667SSimon Glass case 2: 26*4395f667SSimon Glass if (strncmp(argv[1], "inf", 3) == 0) { 27*4395f667SSimon Glass blk_list_devices(if_type); 28*4395f667SSimon Glass return 0; 29*4395f667SSimon Glass } else if (strncmp(argv[1], "dev", 3) == 0) { 30*4395f667SSimon Glass if (blk_print_device_num(if_type, *cur_devnump)) { 31*4395f667SSimon Glass printf("\nno %s devices available\n", if_name); 32*4395f667SSimon Glass return CMD_RET_FAILURE; 33*4395f667SSimon Glass } 34*4395f667SSimon Glass return 0; 35*4395f667SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 36*4395f667SSimon Glass if (blk_list_part(if_type)) 37*4395f667SSimon Glass printf("\nno %s devices available\n", if_name); 38*4395f667SSimon Glass return 0; 39*4395f667SSimon Glass } 40*4395f667SSimon Glass return CMD_RET_USAGE; 41*4395f667SSimon Glass case 3: 42*4395f667SSimon Glass if (strncmp(argv[1], "dev", 3) == 0) { 43*4395f667SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 44*4395f667SSimon Glass 45*4395f667SSimon Glass if (!blk_show_device(if_type, dev)) { 46*4395f667SSimon Glass *cur_devnump = dev; 47*4395f667SSimon Glass printf("... is now current device\n"); 48*4395f667SSimon Glass } else { 49*4395f667SSimon Glass return CMD_RET_FAILURE; 50*4395f667SSimon Glass } 51*4395f667SSimon Glass return 0; 52*4395f667SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 53*4395f667SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 54*4395f667SSimon Glass 55*4395f667SSimon Glass if (blk_print_part_devnum(if_type, dev)) { 56*4395f667SSimon Glass printf("\n%s device %d not available\n", 57*4395f667SSimon Glass if_name, dev); 58*4395f667SSimon Glass return CMD_RET_FAILURE; 59*4395f667SSimon Glass } 60*4395f667SSimon Glass return 0; 61*4395f667SSimon Glass } 62*4395f667SSimon Glass return CMD_RET_USAGE; 63*4395f667SSimon Glass 64*4395f667SSimon Glass default: /* at least 4 args */ 65*4395f667SSimon Glass if (strcmp(argv[1], "read") == 0) { 66*4395f667SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 67*4395f667SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 68*4395f667SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 69*4395f667SSimon Glass ulong n; 70*4395f667SSimon Glass 71*4395f667SSimon Glass printf("\n%s read: device %d block # %lld, count %ld ... ", 72*4395f667SSimon Glass if_name, *cur_devnump, (unsigned long long)blk, 73*4395f667SSimon Glass cnt); 74*4395f667SSimon Glass 75*4395f667SSimon Glass n = blk_read_devnum(if_type, *cur_devnump, blk, cnt, 76*4395f667SSimon Glass (ulong *)addr); 77*4395f667SSimon Glass 78*4395f667SSimon Glass printf("%ld blocks read: %s\n", n, 79*4395f667SSimon Glass n == cnt ? "OK" : "ERROR"); 80*4395f667SSimon Glass return n == cnt ? 0 : 1; 81*4395f667SSimon Glass } else if (strcmp(argv[1], "write") == 0) { 82*4395f667SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 83*4395f667SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 84*4395f667SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 85*4395f667SSimon Glass ulong n; 86*4395f667SSimon Glass 87*4395f667SSimon Glass printf("\n%s write: device %d block # %lld, count %ld ... ", 88*4395f667SSimon Glass if_name, *cur_devnump, (unsigned long long)blk, 89*4395f667SSimon Glass cnt); 90*4395f667SSimon Glass 91*4395f667SSimon Glass n = blk_write_devnum(if_type, *cur_devnump, blk, cnt, 92*4395f667SSimon Glass (ulong *)addr); 93*4395f667SSimon Glass 94*4395f667SSimon Glass printf("%ld blocks written: %s\n", n, 95*4395f667SSimon Glass n == cnt ? "OK" : "ERROR"); 96*4395f667SSimon Glass return n == cnt ? 0 : 1; 97*4395f667SSimon Glass } else { 98*4395f667SSimon Glass return CMD_RET_USAGE; 99*4395f667SSimon Glass } 100*4395f667SSimon Glass 101*4395f667SSimon Glass return 0; 102*4395f667SSimon Glass } 103*4395f667SSimon Glass } 104*4395f667SSimon Glass #endif 105