]> git.ipfire.org Git - thirdparty/u-boot.git/blame - include/scsi_emul.h
imx: imxrt1050-evk: Add support for SPI flash booting
[thirdparty/u-boot.git] / include / scsi_emul.h
CommitLineData
1377d448
SG
1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Emulation of enough SCSI commands to find and read from a unit
4 *
5 * Copyright 2022 Google LLC
6 * Written by Simon Glass <sjg@chromium.org>
7 *
8 * implementations of SCSI functions required so that CONFIG_SCSI can be enabled
9 * for sandbox
10 */
11
12#ifndef __scsi_emul_h
13#define __scsi_emul_h
14
15/**
16 * struct scsi_emul_info - information for emulating a SCSI device
17 *
0c12d9dd
SG
18 * @vendor: Vendor name
19 * @product: Product name
a3718f1e 20 * @block_size: Block size of device in bytes (normally 512)
f148ad1b 21 * @file_size: Size of the backing file for this emulator, in bytes
02cea114 22 * @seek_block: Seek position for file (block number)
0c12d9dd 23 *
1377d448
SG
24 * @phase: Current SCSI phase
25 * @buff_used: Number of bytes ready to transfer back to host
26 * @read_len: Number of bytes of data left in the current read command
27 * @alloc_len: Allocation length from the last incoming command
28 * @transfer_len: Transfer length from CBW header
fc7a7ed3 29 * @buff: Data buffer for outgoing data
1377d448
SG
30 */
31struct scsi_emul_info {
fc7a7ed3
SG
32 /* provided by the caller: */
33 void *buff;
0c12d9dd
SG
34 const char *vendor;
35 const char *product;
a3718f1e 36 int block_size;
f148ad1b 37 loff_t file_size;
02cea114 38 int seek_block;
fc7a7ed3
SG
39
40 /* state maintained by the emulator: */
1377d448
SG
41 enum scsi_cmd_phase phase;
42 int buff_used;
43 int read_len;
2ff3db3a 44 int write_len;
02cea114 45 uint seek_pos;
1377d448
SG
46 int alloc_len;
47 uint transfer_len;
48};
49
2ff3db3a
SG
50/**
51 * Return value from sb_scsi_emul_command() indicates that a read or write is
52 * being started
53 */
54enum {
55 SCSI_EMUL_DO_READ = 1,
56 SCSI_EMUL_DO_WRITE = 2,
57};
02cea114
SG
58
59/**
60 * sb_scsi_emul_command() - Process a SCSI command
61 *
62 * This sets up the response in info->buff and updates various other values
63 * in info.
64 *
65 * If SCSI_EMUL_DO_READ is returned then the caller should set up so that the
66 * backing file can be read, or return an error status if there is no file.
67 *
68 * @info: Emulation information
69 * @req: Request to process
70 * @len: Length of request in bytes
2ff3db3a
SG
71 * @return SCSI_EMUL_DO_READ if a read has started, SCSI_EMUL_DO_WRITE if a
72 * write has started, 0 if some other operation has started, -ve if there
73 * was an error
02cea114
SG
74 */
75int sb_scsi_emul_command(struct scsi_emul_info *info,
76 const struct scsi_cmd *req, int len);
77
1377d448 78#endif