xref: /openbmc/qemu/hw/scsi/scsi-generic.c (revision 89de4b91)
1 /*
2  * Generic SCSI Device support
3  *
4  * Copyright (c) 2007 Bull S.A.S.
5  * Based on code by Paul Brook
6  * Based on code by Fabrice Bellard
7  *
8  * Written by Laurent Vivier <Laurent.Vivier@bull.net>
9  *
10  * This code is licensed under the LGPL.
11  *
12  */
13 
14 #include "qemu/osdep.h"
15 #include "qapi/error.h"
16 #include "qemu-common.h"
17 #include "qemu/error-report.h"
18 #include "hw/scsi/scsi.h"
19 #include "sysemu/block-backend.h"
20 #include "sysemu/blockdev.h"
21 
22 #ifdef __linux__
23 
24 //#define DEBUG_SCSI
25 
26 #ifdef DEBUG_SCSI
27 #define DPRINTF(fmt, ...) \
28 do { printf("scsi-generic: " fmt , ## __VA_ARGS__); } while (0)
29 #else
30 #define DPRINTF(fmt, ...) do {} while(0)
31 #endif
32 
33 #define BADF(fmt, ...) \
34 do { fprintf(stderr, "scsi-generic: " fmt , ## __VA_ARGS__); } while (0)
35 
36 #include <scsi/sg.h>
37 #include "scsi/constants.h"
38 
39 #ifndef MAX_UINT
40 #define MAX_UINT ((unsigned int)-1)
41 #endif
42 
43 typedef struct SCSIGenericReq {
44     SCSIRequest req;
45     uint8_t *buf;
46     int buflen;
47     int len;
48     sg_io_hdr_t io_header;
49 } SCSIGenericReq;
50 
51 static void scsi_generic_save_request(QEMUFile *f, SCSIRequest *req)
52 {
53     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
54 
55     qemu_put_sbe32s(f, &r->buflen);
56     if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
57         assert(!r->req.sg);
58         qemu_put_buffer(f, r->buf, r->req.cmd.xfer);
59     }
60 }
61 
62 static void scsi_generic_load_request(QEMUFile *f, SCSIRequest *req)
63 {
64     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
65 
66     qemu_get_sbe32s(f, &r->buflen);
67     if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
68         assert(!r->req.sg);
69         qemu_get_buffer(f, r->buf, r->req.cmd.xfer);
70     }
71 }
72 
73 static void scsi_free_request(SCSIRequest *req)
74 {
75     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
76 
77     g_free(r->buf);
78 }
79 
80 /* Helper function for command completion.  */
81 static void scsi_command_complete_noio(SCSIGenericReq *r, int ret)
82 {
83     int status;
84     SCSISense sense;
85 
86     assert(r->req.aiocb == NULL);
87 
88     if (r->req.io_canceled) {
89         scsi_req_cancel_complete(&r->req);
90         goto done;
91     }
92     status = sg_io_sense_from_errno(-ret, &r->io_header, &sense);
93     if (status == CHECK_CONDITION) {
94         if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
95             r->req.sense_len = r->io_header.sb_len_wr;
96         } else {
97             scsi_req_build_sense(&r->req, sense);
98         }
99     }
100 
101     DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
102             r, r->req.tag, status);
103 
104     scsi_req_complete(&r->req, status);
105 done:
106     scsi_req_unref(&r->req);
107 }
108 
109 static void scsi_command_complete(void *opaque, int ret)
110 {
111     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
112     SCSIDevice *s = r->req.dev;
113 
114     assert(r->req.aiocb != NULL);
115     r->req.aiocb = NULL;
116 
117     aio_context_acquire(blk_get_aio_context(s->conf.blk));
118     scsi_command_complete_noio(r, ret);
119     aio_context_release(blk_get_aio_context(s->conf.blk));
120 }
121 
122 static int execute_command(BlockBackend *blk,
123                            SCSIGenericReq *r, int direction,
124                            BlockCompletionFunc *complete)
125 {
126     r->io_header.interface_id = 'S';
127     r->io_header.dxfer_direction = direction;
128     r->io_header.dxferp = r->buf;
129     r->io_header.dxfer_len = r->buflen;
130     r->io_header.cmdp = r->req.cmd.buf;
131     r->io_header.cmd_len = r->req.cmd.len;
132     r->io_header.mx_sb_len = sizeof(r->req.sense);
133     r->io_header.sbp = r->req.sense;
134     r->io_header.timeout = MAX_UINT;
135     r->io_header.usr_ptr = r;
136     r->io_header.flags |= SG_FLAG_DIRECT_IO;
137 
138     r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
139     if (r->req.aiocb == NULL) {
140         return -EIO;
141     }
142 
143     return 0;
144 }
145 
146 static void scsi_read_complete(void * opaque, int ret)
147 {
148     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
149     SCSIDevice *s = r->req.dev;
150     int len;
151 
152     assert(r->req.aiocb != NULL);
153     r->req.aiocb = NULL;
154 
155     aio_context_acquire(blk_get_aio_context(s->conf.blk));
156 
157     if (ret || r->req.io_canceled) {
158         scsi_command_complete_noio(r, ret);
159         goto done;
160     }
161 
162     len = r->io_header.dxfer_len - r->io_header.resid;
163     DPRINTF("Data ready tag=0x%x len=%d\n", r->req.tag, len);
164 
165     r->len = -1;
166     if (len == 0) {
167         scsi_command_complete_noio(r, 0);
168         goto done;
169     }
170 
171     /* Snoop READ CAPACITY output to set the blocksize.  */
172     if (r->req.cmd.buf[0] == READ_CAPACITY_10 &&
173         (ldl_be_p(&r->buf[0]) != 0xffffffffU || s->max_lba == 0)) {
174         s->blocksize = ldl_be_p(&r->buf[4]);
175         s->max_lba = ldl_be_p(&r->buf[0]) & 0xffffffffULL;
176     } else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 &&
177                (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
178         s->blocksize = ldl_be_p(&r->buf[8]);
179         s->max_lba = ldq_be_p(&r->buf[0]);
180     }
181     blk_set_guest_block_size(s->conf.blk, s->blocksize);
182 
183     /* Patch MODE SENSE device specific parameters if the BDS is opened
184      * readonly.
185      */
186     if ((s->type == TYPE_DISK || s->type == TYPE_TAPE) &&
187         blk_is_read_only(s->conf.blk) &&
188         (r->req.cmd.buf[0] == MODE_SENSE ||
189          r->req.cmd.buf[0] == MODE_SENSE_10) &&
190         (r->req.cmd.buf[1] & 0x8) == 0) {
191         if (r->req.cmd.buf[0] == MODE_SENSE) {
192             r->buf[2] |= 0x80;
193         } else  {
194             r->buf[3] |= 0x80;
195         }
196     }
197     if (s->type == TYPE_DISK &&
198         r->req.cmd.buf[0] == INQUIRY &&
199         r->req.cmd.buf[2] == 0xb0) {
200         uint32_t max_transfer =
201             blk_get_max_transfer(s->conf.blk) / s->blocksize;
202 
203         assert(max_transfer);
204         stl_be_p(&r->buf[8], max_transfer);
205         /* Also take care of the opt xfer len. */
206         stl_be_p(&r->buf[12],
207                  MIN_NON_ZERO(max_transfer, ldl_be_p(&r->buf[12])));
208     }
209     scsi_req_data(&r->req, len);
210     scsi_req_unref(&r->req);
211 
212 done:
213     aio_context_release(blk_get_aio_context(s->conf.blk));
214 }
215 
216 /* Read more data from scsi device into buffer.  */
217 static void scsi_read_data(SCSIRequest *req)
218 {
219     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
220     SCSIDevice *s = r->req.dev;
221     int ret;
222 
223     DPRINTF("scsi_read_data tag=0x%x\n", req->tag);
224 
225     /* The request is used as the AIO opaque value, so add a ref.  */
226     scsi_req_ref(&r->req);
227     if (r->len == -1) {
228         scsi_command_complete_noio(r, 0);
229         return;
230     }
231 
232     ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
233                           scsi_read_complete);
234     if (ret < 0) {
235         scsi_command_complete_noio(r, ret);
236     }
237 }
238 
239 static void scsi_write_complete(void * opaque, int ret)
240 {
241     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
242     SCSIDevice *s = r->req.dev;
243 
244     DPRINTF("scsi_write_complete() ret = %d\n", ret);
245 
246     assert(r->req.aiocb != NULL);
247     r->req.aiocb = NULL;
248 
249     aio_context_acquire(blk_get_aio_context(s->conf.blk));
250 
251     if (ret || r->req.io_canceled) {
252         scsi_command_complete_noio(r, ret);
253         goto done;
254     }
255 
256     if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 &&
257         s->type == TYPE_TAPE) {
258         s->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
259         DPRINTF("block size %d\n", s->blocksize);
260     }
261 
262     scsi_command_complete_noio(r, ret);
263 
264 done:
265     aio_context_release(blk_get_aio_context(s->conf.blk));
266 }
267 
268 /* Write data to a scsi device.  Returns nonzero on failure.
269    The transfer may complete asynchronously.  */
270 static void scsi_write_data(SCSIRequest *req)
271 {
272     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
273     SCSIDevice *s = r->req.dev;
274     int ret;
275 
276     DPRINTF("scsi_write_data tag=0x%x\n", req->tag);
277     if (r->len == 0) {
278         r->len = r->buflen;
279         scsi_req_data(&r->req, r->len);
280         return;
281     }
282 
283     /* The request is used as the AIO opaque value, so add a ref.  */
284     scsi_req_ref(&r->req);
285     ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete);
286     if (ret < 0) {
287         scsi_command_complete_noio(r, ret);
288     }
289 }
290 
291 /* Return a pointer to the data buffer.  */
292 static uint8_t *scsi_get_buf(SCSIRequest *req)
293 {
294     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
295 
296     return r->buf;
297 }
298 
299 /* Execute a scsi command.  Returns the length of the data expected by the
300    command.  This will be Positive for data transfers from the device
301    (eg. disk reads), negative for transfers to the device (eg. disk writes),
302    and zero if the command does not transfer any data.  */
303 
304 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
305 {
306     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
307     SCSIDevice *s = r->req.dev;
308     int ret;
309 
310 #ifdef DEBUG_SCSI
311     DPRINTF("Command: data=0x%02x", cmd[0]);
312     {
313         int i;
314         for (i = 1; i < r->req.cmd.len; i++) {
315             printf(" 0x%02x", cmd[i]);
316         }
317         printf("\n");
318     }
319 #endif
320 
321     if (r->req.cmd.xfer == 0) {
322         g_free(r->buf);
323         r->buflen = 0;
324         r->buf = NULL;
325         /* The request is used as the AIO opaque value, so add a ref.  */
326         scsi_req_ref(&r->req);
327         ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
328                               scsi_command_complete);
329         if (ret < 0) {
330             scsi_command_complete_noio(r, ret);
331             return 0;
332         }
333         return 0;
334     }
335 
336     if (r->buflen != r->req.cmd.xfer) {
337         g_free(r->buf);
338         r->buf = g_malloc(r->req.cmd.xfer);
339         r->buflen = r->req.cmd.xfer;
340     }
341 
342     memset(r->buf, 0, r->buflen);
343     r->len = r->req.cmd.xfer;
344     if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
345         r->len = 0;
346         return -r->req.cmd.xfer;
347     } else {
348         return r->req.cmd.xfer;
349     }
350 }
351 
352 static int read_naa_id(const uint8_t *p, uint64_t *p_wwn)
353 {
354     int i;
355 
356     if ((p[1] & 0xF) == 3) {
357         /* NAA designator type */
358         if (p[3] != 8) {
359             return -EINVAL;
360         }
361         *p_wwn = ldq_be_p(p + 4);
362         return 0;
363     }
364 
365     if ((p[1] & 0xF) == 8) {
366         /* SCSI name string designator type */
367         if (p[3] < 20 || memcmp(&p[4], "naa.", 4)) {
368             return -EINVAL;
369         }
370         if (p[3] > 20 && p[24] != ',') {
371             return -EINVAL;
372         }
373         *p_wwn = 0;
374         for (i = 8; i < 24; i++) {
375             char c = qemu_toupper(p[i]);
376             c -= (c >= '0' && c <= '9' ? '0' : 'A' - 10);
377             *p_wwn = (*p_wwn << 4) | c;
378         }
379         return 0;
380     }
381 
382     return -EINVAL;
383 }
384 
385 void scsi_generic_read_device_identification(SCSIDevice *s)
386 {
387     uint8_t cmd[6];
388     uint8_t buf[250];
389     uint8_t sensebuf[8];
390     sg_io_hdr_t io_header;
391     int ret;
392     int i, len;
393 
394     memset(cmd, 0, sizeof(cmd));
395     memset(buf, 0, sizeof(buf));
396     cmd[0] = INQUIRY;
397     cmd[1] = 1;
398     cmd[2] = 0x83;
399     cmd[4] = sizeof(buf);
400 
401     memset(&io_header, 0, sizeof(io_header));
402     io_header.interface_id = 'S';
403     io_header.dxfer_direction = SG_DXFER_FROM_DEV;
404     io_header.dxfer_len = sizeof(buf);
405     io_header.dxferp = buf;
406     io_header.cmdp = cmd;
407     io_header.cmd_len = sizeof(cmd);
408     io_header.mx_sb_len = sizeof(sensebuf);
409     io_header.sbp = sensebuf;
410     io_header.timeout = 6000; /* XXX */
411 
412     ret = blk_ioctl(s->conf.blk, SG_IO, &io_header);
413     if (ret < 0 || io_header.driver_status || io_header.host_status) {
414         return;
415     }
416 
417     len = MIN((buf[2] << 8) | buf[3], sizeof(buf) - 4);
418     for (i = 0; i + 3 <= len; ) {
419         const uint8_t *p = &buf[i + 4];
420         uint64_t wwn;
421 
422         if (i + (p[3] + 4) > len) {
423             break;
424         }
425 
426         if ((p[1] & 0x10) == 0) {
427             /* Associated with the logical unit */
428             if (read_naa_id(p, &wwn) == 0) {
429                 s->wwn = wwn;
430             }
431         } else if ((p[1] & 0x10) == 0x10) {
432             /* Associated with the target port */
433             if (read_naa_id(p, &wwn) == 0) {
434                 s->port_wwn = wwn;
435             }
436         }
437 
438         i += p[3] + 4;
439     }
440 }
441 
442 static int get_stream_blocksize(BlockBackend *blk)
443 {
444     uint8_t cmd[6];
445     uint8_t buf[12];
446     uint8_t sensebuf[8];
447     sg_io_hdr_t io_header;
448     int ret;
449 
450     memset(cmd, 0, sizeof(cmd));
451     memset(buf, 0, sizeof(buf));
452     cmd[0] = MODE_SENSE;
453     cmd[4] = sizeof(buf);
454 
455     memset(&io_header, 0, sizeof(io_header));
456     io_header.interface_id = 'S';
457     io_header.dxfer_direction = SG_DXFER_FROM_DEV;
458     io_header.dxfer_len = sizeof(buf);
459     io_header.dxferp = buf;
460     io_header.cmdp = cmd;
461     io_header.cmd_len = sizeof(cmd);
462     io_header.mx_sb_len = sizeof(sensebuf);
463     io_header.sbp = sensebuf;
464     io_header.timeout = 6000; /* XXX */
465 
466     ret = blk_ioctl(blk, SG_IO, &io_header);
467     if (ret < 0 || io_header.driver_status || io_header.host_status) {
468         return -1;
469     }
470     return (buf[9] << 16) | (buf[10] << 8) | buf[11];
471 }
472 
473 static void scsi_generic_reset(DeviceState *dev)
474 {
475     SCSIDevice *s = SCSI_DEVICE(dev);
476 
477     scsi_device_purge_requests(s, SENSE_CODE(RESET));
478 }
479 
480 static void scsi_generic_realize(SCSIDevice *s, Error **errp)
481 {
482     int rc;
483     int sg_version;
484     struct sg_scsi_id scsiid;
485 
486     if (!s->conf.blk) {
487         error_setg(errp, "drive property not set");
488         return;
489     }
490 
491     if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
492         error_setg(errp, "Device doesn't support drive option werror");
493         return;
494     }
495     if (blk_get_on_error(s->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
496         error_setg(errp, "Device doesn't support drive option rerror");
497         return;
498     }
499 
500     /* check we are using a driver managing SG_IO (version 3 and after */
501     rc = blk_ioctl(s->conf.blk, SG_GET_VERSION_NUM, &sg_version);
502     if (rc < 0) {
503         error_setg(errp, "cannot get SG_IO version number: %s.  "
504                          "Is this a SCSI device?",
505                          strerror(-rc));
506         return;
507     }
508     if (sg_version < 30000) {
509         error_setg(errp, "scsi generic interface too old");
510         return;
511     }
512 
513     /* get LUN of the /dev/sg? */
514     if (blk_ioctl(s->conf.blk, SG_GET_SCSI_ID, &scsiid)) {
515         error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
516         return;
517     }
518 
519     /* define device state */
520     s->type = scsiid.scsi_type;
521     DPRINTF("device type %d\n", s->type);
522 
523     switch (s->type) {
524     case TYPE_TAPE:
525         s->blocksize = get_stream_blocksize(s->conf.blk);
526         if (s->blocksize == -1) {
527             s->blocksize = 0;
528         }
529         break;
530 
531         /* Make a guess for block devices, we'll fix it when the guest sends.
532          * READ CAPACITY.  If they don't, they likely would assume these sizes
533          * anyway. (TODO: they could also send MODE SENSE).
534          */
535     case TYPE_ROM:
536     case TYPE_WORM:
537         s->blocksize = 2048;
538         break;
539     default:
540         s->blocksize = 512;
541         break;
542     }
543 
544     DPRINTF("block size %d\n", s->blocksize);
545 
546     scsi_generic_read_device_identification(s);
547 }
548 
549 const SCSIReqOps scsi_generic_req_ops = {
550     .size         = sizeof(SCSIGenericReq),
551     .free_req     = scsi_free_request,
552     .send_command = scsi_send_command,
553     .read_data    = scsi_read_data,
554     .write_data   = scsi_write_data,
555     .get_buf      = scsi_get_buf,
556     .load_request = scsi_generic_load_request,
557     .save_request = scsi_generic_save_request,
558 };
559 
560 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
561                                      uint8_t *buf, void *hba_private)
562 {
563     return scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
564 }
565 
566 static Property scsi_generic_properties[] = {
567     DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
568     DEFINE_PROP_END_OF_LIST(),
569 };
570 
571 static int scsi_generic_parse_cdb(SCSIDevice *dev, SCSICommand *cmd,
572                                   uint8_t *buf, void *hba_private)
573 {
574     return scsi_bus_parse_cdb(dev, cmd, buf, hba_private);
575 }
576 
577 static void scsi_generic_class_initfn(ObjectClass *klass, void *data)
578 {
579     DeviceClass *dc = DEVICE_CLASS(klass);
580     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
581 
582     sc->realize      = scsi_generic_realize;
583     sc->alloc_req    = scsi_new_request;
584     sc->parse_cdb    = scsi_generic_parse_cdb;
585     dc->fw_name = "disk";
586     dc->desc = "pass through generic scsi device (/dev/sg*)";
587     dc->reset = scsi_generic_reset;
588     dc->props = scsi_generic_properties;
589     dc->vmsd  = &vmstate_scsi_device;
590 }
591 
592 static const TypeInfo scsi_generic_info = {
593     .name          = "scsi-generic",
594     .parent        = TYPE_SCSI_DEVICE,
595     .instance_size = sizeof(SCSIDevice),
596     .class_init    = scsi_generic_class_initfn,
597 };
598 
599 static void scsi_generic_register_types(void)
600 {
601     type_register_static(&scsi_generic_info);
602 }
603 
604 type_init(scsi_generic_register_types)
605 
606 #endif /* __linux__ */
607