uboot/cmd/sata.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2000-2005, DENX Software Engineering
   4 *              Wolfgang Denk <wd@denx.de>
   5 * Copyright (C) Procsys. All rights reserved.
   6 *              Mushtaq Khan <mushtaq_k@procsys.com>
   7 *                      <mushtaqk_921@yahoo.co.in>
   8 * Copyright (C) 2008 Freescale Semiconductor, Inc.
   9 *              Dave Liu <daveliu@freescale.com>
  10 */
  11
  12#include <common.h>
  13#include <ahci.h>
  14#include <dm.h>
  15#include <command.h>
  16#include <part.h>
  17#include <sata.h>
  18#include <dm/device-internal.h>
  19#include <dm/uclass-internal.h>
  20
  21static int sata_curr_device = -1;
  22
  23int sata_remove(int devnum)
  24{
  25#ifdef CONFIG_AHCI
  26        struct udevice *dev;
  27        int rc;
  28
  29        rc = uclass_find_device(UCLASS_AHCI, devnum, &dev);
  30        if (!rc && !dev)
  31                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  32        if (rc || !dev) {
  33                printf("Cannot find SATA device %d (err=%d)\n", devnum, rc);
  34                return CMD_RET_FAILURE;
  35        }
  36
  37        rc = device_remove(dev, DM_REMOVE_NORMAL);
  38        if (rc) {
  39                printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name,
  40                       rc);
  41                return CMD_RET_FAILURE;
  42        }
  43
  44        return 0;
  45#else
  46        return sata_stop();
  47#endif
  48}
  49
  50int sata_probe(int devnum)
  51{
  52#ifdef CONFIG_AHCI
  53        struct udevice *dev;
  54        int rc;
  55
  56        rc = uclass_get_device(UCLASS_AHCI, devnum, &dev);
  57        if (rc)
  58                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  59        if (rc) {
  60                printf("Cannot probe SATA device %d (err=%d)\n", devnum, rc);
  61                return CMD_RET_FAILURE;
  62        }
  63        rc = sata_scan(dev);
  64        if (rc) {
  65                printf("Cannot scan SATA device %d (err=%d)\n", devnum, rc);
  66                return CMD_RET_FAILURE;
  67        }
  68
  69        return 0;
  70#else
  71        return sata_initialize() < 0 ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
  72#endif
  73}
  74
  75static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  76{
  77        int rc = 0;
  78
  79        if (argc >= 2) {
  80                int devnum = 0;
  81
  82                if (argc == 3)
  83                        devnum = (int)simple_strtoul(argv[2], NULL, 10);
  84                if (!strcmp(argv[1], "stop"))
  85                        return sata_remove(devnum);
  86
  87                if (!strcmp(argv[1], "init")) {
  88                        if (sata_curr_device != -1) {
  89                                rc = sata_remove(devnum);
  90                                if (rc)
  91                                        return rc;
  92                        }
  93
  94                        return sata_probe(devnum);
  95                }
  96        }
  97
  98        /* If the user has not yet run `sata init`, do it now */
  99        if (sata_curr_device == -1) {
 100                rc = sata_probe(0);
 101                if (rc)
 102                        return rc;
 103                sata_curr_device = 0;
 104        }
 105
 106        return blk_common_cmd(argc, argv, IF_TYPE_SATA, &sata_curr_device);
 107}
 108
 109U_BOOT_CMD(
 110        sata, 5, 1, do_sata,
 111        "SATA sub system",
 112        "init - init SATA sub system\n"
 113        "sata stop [dev] - disable SATA sub system or device\n"
 114        "sata info - show available SATA devices\n"
 115        "sata device [dev] - show or set current device\n"
 116        "sata part [dev] - print partition table\n"
 117        "sata read addr blk# cnt\n"
 118        "sata write addr blk# cnt"
 119);
 120