12e192b24SSimon Glass /* 22e192b24SSimon Glass * Copyright (C) 2000-2005, DENX Software Engineering 32e192b24SSimon Glass * Wolfgang Denk <wd@denx.de> 42e192b24SSimon Glass * Copyright (C) Procsys. All rights reserved. 52e192b24SSimon Glass * Mushtaq Khan <mushtaq_k@procsys.com> 62e192b24SSimon Glass * <mushtaqk_921@yahoo.co.in> 72e192b24SSimon Glass * Copyright (C) 2008 Freescale Semiconductor, Inc. 82e192b24SSimon Glass * Dave Liu <daveliu@freescale.com> 92e192b24SSimon Glass * 102e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 112e192b24SSimon Glass */ 122e192b24SSimon Glass 132e192b24SSimon Glass #include <common.h> 142e192b24SSimon Glass #include <command.h> 152e192b24SSimon Glass #include <part.h> 162e192b24SSimon Glass #include <sata.h> 172e192b24SSimon Glass 182e192b24SSimon Glass static int sata_curr_device = -1; 192e192b24SSimon Glass 202e192b24SSimon Glass static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 212e192b24SSimon Glass { 222e192b24SSimon Glass int rc = 0; 232e192b24SSimon Glass 242e192b24SSimon Glass if (argc == 2 && strcmp(argv[1], "stop") == 0) 252e192b24SSimon Glass return sata_stop(); 262e192b24SSimon Glass 272e192b24SSimon Glass if (argc == 2 && strcmp(argv[1], "init") == 0) { 282e192b24SSimon Glass if (sata_curr_device != -1) 292e192b24SSimon Glass sata_stop(); 302e192b24SSimon Glass 312e192b24SSimon Glass return sata_initialize(); 322e192b24SSimon Glass } 332e192b24SSimon Glass 342e192b24SSimon Glass /* If the user has not yet run `sata init`, do it now */ 352e192b24SSimon Glass if (sata_curr_device == -1) 362e192b24SSimon Glass if (sata_initialize()) 372e192b24SSimon Glass return 1; 382e192b24SSimon Glass 392e192b24SSimon Glass switch (argc) { 402e192b24SSimon Glass case 0: 412e192b24SSimon Glass case 1: 422e192b24SSimon Glass return CMD_RET_USAGE; 432e192b24SSimon Glass case 2: 442e192b24SSimon Glass if (strncmp(argv[1], "inf", 3) == 0) { 45*d97dc8a0SSimon Glass blk_list_devices(IF_TYPE_SATA); 462e192b24SSimon Glass return 0; 472e192b24SSimon Glass } else if (strncmp(argv[1], "dev", 3) == 0) { 48*d97dc8a0SSimon Glass if (blk_print_device_num(IF_TYPE_SATA, 49*d97dc8a0SSimon Glass sata_curr_device)) { 50*d97dc8a0SSimon Glass printf("\nno SATA devices available\n"); 51*d97dc8a0SSimon Glass return CMD_RET_FAILURE; 522e192b24SSimon Glass } 532e192b24SSimon Glass return 0; 542e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 55*d97dc8a0SSimon Glass if (blk_list_part(IF_TYPE_SATA)) 562e192b24SSimon Glass puts("\nno SATA devices available\n"); 57*d97dc8a0SSimon Glass return 0; 582e192b24SSimon Glass } 592e192b24SSimon Glass return CMD_RET_USAGE; 602e192b24SSimon Glass case 3: 612e192b24SSimon Glass if (strncmp(argv[1], "dev", 3) == 0) { 622e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 632e192b24SSimon Glass 64*d97dc8a0SSimon Glass if (!blk_show_device(IF_TYPE_SATA, dev)) { 652e192b24SSimon Glass sata_curr_device = dev; 66*d97dc8a0SSimon Glass printf("... is now current device\n"); 67*d97dc8a0SSimon Glass } else { 68*d97dc8a0SSimon Glass return CMD_RET_FAILURE; 69*d97dc8a0SSimon Glass } 702e192b24SSimon Glass return 0; 712e192b24SSimon Glass } else if (strncmp(argv[1], "part", 4) == 0) { 722e192b24SSimon Glass int dev = (int)simple_strtoul(argv[2], NULL, 10); 732e192b24SSimon Glass 74*d97dc8a0SSimon Glass if (blk_print_part_devnum(IF_TYPE_SATA, dev)) { 75*d97dc8a0SSimon Glass printf("\nSATA device %d not available\n", 76*d97dc8a0SSimon Glass dev); 77*d97dc8a0SSimon Glass return CMD_RET_FAILURE; 782e192b24SSimon Glass } 792e192b24SSimon Glass return rc; 802e192b24SSimon Glass } 812e192b24SSimon Glass return CMD_RET_USAGE; 822e192b24SSimon Glass 832e192b24SSimon Glass default: /* at least 4 args */ 842e192b24SSimon Glass if (strcmp(argv[1], "read") == 0) { 852e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 862e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 872e192b24SSimon Glass ulong n; 882e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 892e192b24SSimon Glass 902e192b24SSimon Glass printf("\nSATA read: device %d block # %ld, count %ld ... ", 912e192b24SSimon Glass sata_curr_device, blk, cnt); 922e192b24SSimon Glass 93*d97dc8a0SSimon Glass n = blk_read_devnum(IF_TYPE_SATA, sata_curr_device, blk, 94*d97dc8a0SSimon Glass cnt, (ulong *)addr); 952e192b24SSimon Glass 962e192b24SSimon Glass printf("%ld blocks read: %s\n", 972e192b24SSimon Glass n, (n==cnt) ? "OK" : "ERROR"); 982e192b24SSimon Glass return (n == cnt) ? 0 : 1; 992e192b24SSimon Glass } else if (strcmp(argv[1], "write") == 0) { 1002e192b24SSimon Glass ulong addr = simple_strtoul(argv[2], NULL, 16); 1012e192b24SSimon Glass ulong cnt = simple_strtoul(argv[4], NULL, 16); 1022e192b24SSimon Glass ulong n; 1032e192b24SSimon Glass 1042e192b24SSimon Glass lbaint_t blk = simple_strtoul(argv[3], NULL, 16); 1052e192b24SSimon Glass 1062e192b24SSimon Glass printf("\nSATA write: device %d block # %ld, count %ld ... ", 1072e192b24SSimon Glass sata_curr_device, blk, cnt); 1082e192b24SSimon Glass 109*d97dc8a0SSimon Glass n = blk_write_devnum(IF_TYPE_SATA, sata_curr_device, 110*d97dc8a0SSimon Glass blk, cnt, (ulong *)addr); 1112e192b24SSimon Glass 1122e192b24SSimon Glass printf("%ld blocks written: %s\n", 1132e192b24SSimon Glass n, (n == cnt) ? "OK" : "ERROR"); 1142e192b24SSimon Glass return (n == cnt) ? 0 : 1; 1152e192b24SSimon Glass } else { 1162e192b24SSimon Glass return CMD_RET_USAGE; 1172e192b24SSimon Glass } 1182e192b24SSimon Glass 1192e192b24SSimon Glass return rc; 1202e192b24SSimon Glass } 1212e192b24SSimon Glass } 1222e192b24SSimon Glass 1232e192b24SSimon Glass U_BOOT_CMD( 1242e192b24SSimon Glass sata, 5, 1, do_sata, 1252e192b24SSimon Glass "SATA sub system", 1262e192b24SSimon Glass "init - init SATA sub system\n" 1272e192b24SSimon Glass "sata stop - disable SATA sub system\n" 1282e192b24SSimon Glass "sata info - show available SATA devices\n" 1292e192b24SSimon Glass "sata device [dev] - show or set current device\n" 1302e192b24SSimon Glass "sata part [dev] - print partition table\n" 1312e192b24SSimon Glass "sata read addr blk# cnt\n" 1322e192b24SSimon Glass "sata write addr blk# cnt" 1332e192b24SSimon Glass ); 134