1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * (C) Copyright 2001 4 * Denis Peter, MPL AG Switzerland 5 */ 6 #ifndef _SCSI_H 7 #define _SCSI_H 8 9#include <asm/cache.h> 10#include <bouncebuf.h> 11#include <linux/dma-direction.h> 12 13struct udevice; 14 15/** 16 * struct scsi_cmd - information about a SCSI command to be processed 17 * 18 * @cmd: command 19 * @sense_buf: for request sense 20 * @status: SCSI Status 21 * @target: Target ID 22 * @lun: Target LUN 23 * @cmdlen: command len 24 * @datalen: Total data length 25 * @pdata: pointer to data 26 * @msgout: Messge out buffer (NOT USED) 27 * @msgin: Message in buffer 28 * @sensecmdlen: Sense command len 29 * @sensedatalen: Sense data len 30 * @sensecmd: Sense command 31 * @contr_stat: Controller Status 32 * @trans_bytes: tranfered bytes 33 * @priv: Private value 34 * @dma_dir: Direction of data structure 35 */ 36struct scsi_cmd { 37 unsigned char cmd[16]; 38 unsigned char sense_buf[64] 39 __attribute__((aligned(ARCH_DMA_MINALIGN))); 40 unsigned char status; 41 unsigned char target; 42 unsigned char lun; 43 unsigned char cmdlen; 44 unsigned long datalen; 45 unsigned char *pdata; 46 unsigned char msgout[12]; 47 unsigned char msgin[12]; 48 unsigned char sensecmdlen; 49 unsigned long sensedatalen; 50 unsigned char sensecmd[6]; 51 unsigned long contr_stat; 52 unsigned long trans_bytes; 53 54 unsigned int priv; 55 enum dma_data_direction dma_dir; 56}; 57 58/*----------------------------------------------------------- 59** 60** SCSI constants. 61** 62**----------------------------------------------------------- 63*/ 64 65/* 66** Messages 67*/ 68 69#define M_COMPLETE (0x00) 70#define M_EXTENDED (0x01) 71#define M_SAVE_DP (0x02) 72#define M_RESTORE_DP (0x03) 73#define M_DISCONNECT (0x04) 74#define M_ID_ERROR (0x05) 75#define M_ABORT (0x06) 76#define M_REJECT (0x07) 77#define M_NOOP (0x08) 78#define M_PARITY (0x09) 79#define M_LCOMPLETE (0x0a) 80#define M_FCOMPLETE (0x0b) 81#define M_RESET (0x0c) 82#define M_ABORT_TAG (0x0d) 83#define M_CLEAR_QUEUE (0x0e) 84#define M_INIT_REC (0x0f) 85#define M_REL_REC (0x10) 86#define M_TERMINATE (0x11) 87#define M_SIMPLE_TAG (0x20) 88#define M_HEAD_TAG (0x21) 89#define M_ORDERED_TAG (0x22) 90#define M_IGN_RESIDUE (0x23) 91#define M_IDENTIFY (0x80) 92 93#define M_X_MODIFY_DP (0x00) 94#define M_X_SYNC_REQ (0x01) 95#define M_X_WIDE_REQ (0x03) 96#define M_X_PPR_REQ (0x04) 97 98 99/* 100** Status 101*/ 102 103#define S_GOOD (0x00) 104#define S_CHECK_COND (0x02) 105#define S_COND_MET (0x04) 106#define S_BUSY (0x08) 107#define S_INT (0x10) 108#define S_INT_COND_MET (0x14) 109#define S_CONFLICT (0x18) 110#define S_TERMINATED (0x20) 111#define S_QUEUE_FULL (0x28) 112#define S_ILLEGAL (0xff) 113#define S_SENSE (0x80) 114 115/* 116 * Sense_keys 117 */ 118 119#define SENSE_NO_SENSE 0x0 120#define SENSE_RECOVERED_ERROR 0x1 121#define SENSE_NOT_READY 0x2 122#define SENSE_MEDIUM_ERROR 0x3 123#define SENSE_HARDWARE_ERROR 0x4 124#define SENSE_ILLEGAL_REQUEST 0x5 125#define SENSE_UNIT_ATTENTION 0x6 126#define SENSE_DATA_PROTECT 0x7 127#define SENSE_BLANK_CHECK 0x8 128#define SENSE_VENDOR_SPECIFIC 0x9 129#define SENSE_COPY_ABORTED 0xA 130#define SENSE_ABORTED_COMMAND 0xB 131#define SENSE_VOLUME_OVERFLOW 0xD 132#define SENSE_MISCOMPARE 0xE 133 134 135#define SCSI_CHANGE_DEF 0x40 /* Change Definition (Optional) */ 136#define SCSI_COMPARE 0x39 /* Compare (O) */ 137#define SCSI_COPY 0x18 /* Copy (O) */ 138#define SCSI_COP_VERIFY 0x3A /* Copy and Verify (O) */ 139#define SCSI_INQUIRY 0x12 /* Inquiry (MANDATORY) */ 140#define SCSI_LOG_SELECT 0x4C /* Log Select (O) */ 141#define SCSI_LOG_SENSE 0x4D /* Log Sense (O) */ 142#define SCSI_MODE_SEL6 0x15 /* Mode Select 6-byte (Device Specific) */ 143#define SCSI_MODE_SEL10 0x55 /* Mode Select 10-byte (Device Specific) */ 144#define SCSI_MODE_SEN6 0x1A /* Mode Sense 6-byte (Device Specific) */ 145#define SCSI_MODE_SEN10 0x5A /* Mode Sense 10-byte (Device Specific) */ 146#define SCSI_READ_BUFF 0x3C /* Read Buffer (O) */ 147#define SCSI_REQ_SENSE 0x03 /* Request Sense (MANDATORY) */ 148#define SCSI_SEND_DIAG 0x1D /* Send Diagnostic (O) */ 149#define SCSI_TST_U_RDY 0x00 /* Test Unit Ready (MANDATORY) */ 150#define SCSI_WRITE_BUFF 0x3B /* Write Buffer (O) */ 151/*************************************************************************** 152 * %%% Commands Unique to Direct Access Devices %%% 153 ***************************************************************************/ 154#define SCSI_COMPARE 0x39 /* Compare (O) */ 155#define SCSI_FORMAT 0x04 /* Format Unit (MANDATORY) */ 156#define SCSI_LCK_UN_CAC 0x36 /* Lock Unlock Cache (O) */ 157#define SCSI_PREFETCH 0x34 /* Prefetch (O) */ 158#define SCSI_MED_REMOVL 0x1E /* Prevent/Allow medium Removal (O) */ 159#define SCSI_READ6 0x08 /* Read 6-byte (MANDATORY) */ 160#define SCSI_READ10 0x28 /* Read 10-byte (MANDATORY) */ 161#define SCSI_READ16 0x48 162#define SCSI_RD_CAPAC 0x25 /* Read Capacity (MANDATORY) */ 163#define SCSI_RD_CAPAC10 SCSI_RD_CAPAC /* Read Capacity (10) */ 164#define SCSI_RD_CAPAC16 0x9e /* Read Capacity (16) */ 165#define SCSI_RD_DEFECT 0x37 /* Read Defect Data (O) */ 166#define SCSI_READ_LONG 0x3E /* Read Long (O) */ 167#define SCSI_REASS_BLK 0x07 /* Reassign Blocks (O) */ 168#define SCSI_RCV_DIAG 0x1C /* Receive Diagnostic Results (O) */ 169#define SCSI_RELEASE 0x17 /* Release Unit (MANDATORY) */ 170#define SCSI_REZERO 0x01 /* Rezero Unit (O) */ 171#define SCSI_SRCH_DAT_E 0x31 /* Search Data Equal (O) */ 172#define SCSI_SRCH_DAT_H 0x30 /* Search Data High (O) */ 173#define SCSI_SRCH_DAT_L 0x32 /* Search Data Low (O) */ 174#define SCSI_SEEK6 0x0B /* Seek 6-Byte (O) */ 175#define SCSI_SEEK10 0x2B /* Seek 10-Byte (O) */ 176#define SCSI_SEND_DIAG 0x1D /* Send Diagnostics (MANDATORY) */ 177#define SCSI_SET_LIMIT 0x33 /* Set Limits (O) */ 178#define SCSI_START_STP 0x1B /* Start/Stop Unit (O) */ 179#define SCSI_SYNC_CACHE 0x35 /* Synchronize Cache (O) */ 180#define SCSI_VERIFY 0x2F /* Verify (O) */ 181#define SCSI_WRITE6 0x0A /* Write 6-Byte (MANDATORY) */ 182#define SCSI_WRITE10 0x2A /* Write 10-Byte (MANDATORY) */ 183#define SCSI_WRT_VERIFY 0x2E /* Write and Verify (O) */ 184#define SCSI_WRITE_LONG 0x3F /* Write Long (O) */ 185#define SCSI_WRITE_SAME 0x41 /* Write Same (O) */ 186 187/** 188 * enum scsi_cmd_phase - current phase of the SCSI protocol 189 * 190 * @SCSIPH_START: Start phase 191 * @SCSIPH_DATA: Data phase 192 * @SCSIPH_STATUS: Status phase 193 */ 194enum scsi_cmd_phase { 195 SCSIPH_START, 196 SCSIPH_DATA, 197 SCSIPH_STATUS, 198}; 199 200/** 201 * struct scsi_inquiry_resp - holds a SCSI inquiry command 202 * 203 * @type; command type 204 * @flags; command flags 205 * @version; command version 206 * @data_format; data format 207 * @additional_len; additional data length 208 * @spare[3]; spare bytes 209 * @vendor[8]; vendor information 210 * @product[16]; production information 211 * @revision[4]; revision information 212 */ 213struct scsi_inquiry_resp { 214 u8 type; 215 u8 flags; 216 u8 version; 217 u8 data_format; 218 u8 additional_len; 219 u8 spare[3]; 220 char vendor[8]; 221 char product[16]; 222 char revision[4]; 223}; 224 225/** 226 * struct scsi_read_capacity_resp - holds the response to a read-capacity cmd 227 * 228 * @last_block_addr: Logical block address of last block 229 * @block_len: Length of each block in bytes 230 */ 231struct scsi_read_capacity_resp { 232 u32 last_block_addr; 233 u32 block_len; 234}; 235 236/** 237 * struct scsi_read10_req - holds a SCSI READ10 request 238 * 239 * @cmd; command type 240 * @lun_flags; LUN flags 241 * @lba; Logical block address to start reading from 242 * @spare; spare bytes 243 * @xfer_len: number of blocks to read 244 * @spare2: more spare bytes 245 */ 246struct __packed scsi_read10_req { 247 u8 cmd; 248 u8 lun_flags; 249 u32 lba; 250 u8 spare; 251 u16 xfer_len; 252 u8 spare2[3]; 253}; 254 255/** struct scsi_write10_req - data for the write10 command */ 256struct __packed scsi_write10_req { 257 u8 cmd; 258 u8 lun_flags; 259 u32 lba; 260 u8 spare; 261 u16 xfer_len; 262 u8 spare2[3]; 263}; 264 265/** 266 * struct scsi_plat - stores information about SCSI controller 267 * 268 * @base: Controller base address 269 * @max_lun: Maximum number of logical units 270 * @max_id: Maximum number of target ids 271 * @max_bytes_per_req: Maximum number of bytes per read/write request 272 */ 273struct scsi_plat { 274 unsigned long base; 275 unsigned long max_lun; 276 unsigned long max_id; 277 unsigned long max_bytes_per_req; 278}; 279 280/* Operations for SCSI */ 281struct scsi_ops { 282 /** 283 * exec() - execute a command 284 * 285 * @dev: SCSI bus 286 * @cmd: Command to execute 287 * @return 0 if OK, -ve on error 288 */ 289 int (*exec)(struct udevice *dev, struct scsi_cmd *cmd); 290 291 /** 292 * bus_reset() - reset the bus 293 * 294 * @dev: SCSI bus to reset 295 * @return 0 if OK, -ve on error 296 */ 297 int (*bus_reset)(struct udevice *dev); 298 299#if IS_ENABLED(CONFIG_BOUNCE_BUFFER) 300 /** 301 * buffer_aligned() - test memory alignment of block operation buffer 302 * 303 * Some devices have limited DMA capabilities and require that the 304 * buffers passed to them fit specific properties. This optional 305 * callback can be used to indicate whether a buffer alignment is 306 * suitable for the device DMA or not, and trigger use of generic 307 * bounce buffer implementation to help use of unsuitable buffers 308 * at the expense of performance degradation. 309 * 310 * @dev: Block device associated with the request 311 * @state: Bounce buffer state 312 * @return 1 if OK, 0 if unaligned 313 */ 314 int (*buffer_aligned)(struct udevice *dev, struct bounce_buffer *state); 315#endif /* CONFIG_BOUNCE_BUFFER */ 316}; 317 318#define scsi_get_ops(dev) ((struct scsi_ops *)(dev)->driver->ops) 319 320extern struct scsi_ops scsi_ops; 321 322/** 323 * scsi_exec() - execute a command 324 * 325 * @dev: SCSI bus 326 * @cmd: Command to execute 327 * Return: 0 if OK, -ve on error 328 */ 329int scsi_exec(struct udevice *dev, struct scsi_cmd *cmd); 330 331/** 332 * scsi_bus_reset() - reset the bus 333 * 334 * @dev: SCSI bus to reset 335 * Return: 0 if OK, -ve on error 336 */ 337int scsi_bus_reset(struct udevice *dev); 338 339/** 340 * scsi_scan() - Scan all SCSI controllers for available devices 341 * 342 * @vebose: true to show information about each device found 343 */ 344int scsi_scan(bool verbose); 345 346/** 347 * scsi_scan_dev() - scan a SCSI bus and create devices 348 * 349 * @dev: SCSI bus 350 * @verbose: true to show information about each device found 351 */ 352int scsi_scan_dev(struct udevice *dev, bool verbose); 353 354#define SCSI_IDENTIFY 0xC0 /* not used */ 355 356/* Hardware errors */ 357#define SCSI_SEL_TIME_OUT 0x00000101 /* Selection time out */ 358#define SCSI_HNS_TIME_OUT 0x00000102 /* Handshake */ 359#define SCSI_MA_TIME_OUT 0x00000103 /* Phase error */ 360#define SCSI_UNEXP_DIS 0x00000104 /* unexpected disconnect */ 361 362#define SCSI_INT_STATE 0x00010000 /* unknown Interrupt number is stored in 16 LSB */ 363 364#endif /* _SCSI_H */ 365