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 <blk.h>
  15#include <dm.h>
  16#include <command.h>
  17#include <part.h>
  18#include <sata.h>
  19#include <dm/device-internal.h>
  20#include <dm/uclass-internal.h>
  21
  22static int sata_curr_device = -1;
  23
  24int sata_remove(int devnum)
  25{
  26#ifdef CONFIG_AHCI
  27        struct udevice *dev;
  28        int rc;
  29
  30        blk_unbind_all(IF_TYPE_SATA);
  31
  32        rc = uclass_find_device(UCLASS_AHCI, devnum, &dev);
  33        if (!rc && !dev)
  34                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  35        if (rc || !dev) {
  36                printf("Cannot find SATA device %d (err=%d)\n", devnum, rc);
  37                return CMD_RET_FAILURE;
  38        }
  39
  40        rc = device_remove(dev, DM_REMOVE_NORMAL);
  41        if (rc) {
  42                printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name,
  43                       rc);
  44                return CMD_RET_FAILURE;
  45        }
  46
  47        return 0;
  48#else
  49        return sata_stop();
  50#endif
  51}
  52
  53int sata_probe(int devnum)
  54{
  55#ifdef CONFIG_AHCI
  56        struct udevice *dev;
  57        int rc;
  58
  59        rc = uclass_get_device(UCLASS_AHCI, devnum, &dev);
  60        if (rc)
  61                rc = uclass_find_first_device(UCLASS_AHCI, &dev);
  62        if (rc) {
  63                printf("Cannot probe SATA device %d (err=%d)\n", devnum, rc);
  64                return CMD_RET_FAILURE;
  65        }
  66        if (!dev) {
  67                printf("No SATA device found!\n");
  68                return CMD_RET_FAILURE;
  69        }
  70        rc = sata_scan(dev);
  71        if (rc) {
  72                printf("Cannot scan SATA device %d (err=%d)\n", devnum, rc);
  73                return CMD_RET_FAILURE;
  74        }
  75
  76        return 0;
  77#else
  78        return sata_initialize() < 0 ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
  79#endif
  80}
  81
  82static int do_sata(struct cmd_tbl *cmdtp, int flag, int argc,
  83                   char *const argv[])
  84{
  85        int rc = 0;
  86
  87        if (argc >= 2) {
  88                int devnum = 0;
  89
  90                if (argc == 3)
  91                        devnum = (int)dectoul(argv[2], NULL);
  92                if (!strcmp(argv[1], "stop"))
  93                        return sata_remove(devnum);
  94
  95                if (!strcmp(argv[1], "init")) {
  96                        if (sata_curr_device != -1) {
  97                                rc = sata_remove(devnum);
  98                                if (rc)
  99                                        return rc;
 100                        }
 101
 102                        return sata_probe(devnum);
 103                }
 104        }
 105
 106        /* If the user has not yet run `sata init`, do it now */
 107        if (sata_curr_device == -1) {
 108                rc = sata_probe(0);
 109                if (rc)
 110                        return rc;
 111                sata_curr_device = 0;
 112        }
 113
 114        return blk_common_cmd(argc, argv, IF_TYPE_SATA, &sata_curr_device);
 115}
 116
 117U_BOOT_CMD(
 118        sata, 5, 1, do_sata,
 119        "SATA sub system",
 120        "init - init SATA sub system\n"
 121        "sata stop [dev] - disable SATA sub system or device\n"
 122        "sata info - show available SATA devices\n"
 123        "sata device [dev] - show or set current device\n"
 124        "sata part [dev] - print partition table\n"
 125        "sata read addr blk# cnt\n"
 126        "sata write addr blk# cnt"
 127);
 128