blob: 3eb6069649feea75a6a6e2681f07b3085c3aca3a [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Michal Simekc886f352016-09-08 15:06:45 +02002/*
3 * Copyright (c) 2015 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
5 * Copyright (c) 2016 Xilinx, Inc
6 * Written by Michal Simek
7 *
8 * Based on ahci-uclass.c
Michal Simekc886f352016-09-08 15:06:45 +02009 */
10
Patrick Delaunay81313352021-04-27 11:02:19 +020011#define LOG_CATEGORY UCLASS_SCSI
12
Varadarajan Narayanan5308c802025-05-13 14:47:07 +053013#include <blk.h>
Michal Simekc886f352016-09-08 15:06:45 +020014#include <dm.h>
Varadarajan Narayanan5308c802025-05-13 14:47:07 +053015#include <part.h>
Michal Simekc886f352016-09-08 15:06:45 +020016#include <scsi.h>
17
Simon Glassc4dfa892017-06-14 21:28:43 -060018int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb)
19{
20 struct scsi_ops *ops = scsi_get_ops(dev);
21
22 if (!ops->exec)
23 return -ENOSYS;
24
25 return ops->exec(dev, pccb);
26}
27
Varadarajan Narayanan5308c802025-05-13 14:47:07 +053028int scsi_get_blk_by_uuid(const char *uuid,
29 struct blk_desc **blk_desc_ptr,
30 struct disk_partition *part_info_ptr)
31{
32 static int is_scsi_scanned;
33 struct blk_desc *blk;
34 int i, ret;
35
36 if (!is_scsi_scanned) {
37 scsi_scan(false /* no verbose */);
38 is_scsi_scanned = 1;
39 }
40
41 for (i = 0; i < blk_find_max_devnum(UCLASS_SCSI) + 1; i++) {
42 ret = blk_get_desc(UCLASS_SCSI, i, &blk);
43 if (ret)
44 continue;
45
46 ret = part_get_info_by_uuid(blk, uuid, part_info_ptr);
47 if (ret > 0) {
48 *blk_desc_ptr = blk;
49 return 0;
50 }
51 }
52
53 return -1;
54}
55
Simon Glassc4dfa892017-06-14 21:28:43 -060056int scsi_bus_reset(struct udevice *dev)
57{
58 struct scsi_ops *ops = scsi_get_ops(dev);
59
60 if (!ops->bus_reset)
61 return -ENOSYS;
62
63 return ops->bus_reset(dev);
64}
65
Michal Simekc886f352016-09-08 15:06:45 +020066UCLASS_DRIVER(scsi) = {
67 .id = UCLASS_SCSI,
68 .name = "scsi",
Simon Glassb75b15b2020-12-03 16:55:23 -070069 .per_device_plat_auto = sizeof(struct scsi_plat),
Michal Simekc886f352016-09-08 15:06:45 +020070};