xref: /qemu/hw/scsi/emulation.c (revision 3d4a8bf0)
1*3d4a8bf0SPaolo Bonzini #include "qemu/osdep.h"
2*3d4a8bf0SPaolo Bonzini #include "qemu/units.h"
3*3d4a8bf0SPaolo Bonzini #include "qemu/bswap.h"
4*3d4a8bf0SPaolo Bonzini #include "hw/scsi/emulation.h"
5*3d4a8bf0SPaolo Bonzini 
scsi_emulate_block_limits(uint8_t * outbuf,const SCSIBlockLimits * bl)6*3d4a8bf0SPaolo Bonzini int scsi_emulate_block_limits(uint8_t *outbuf, const SCSIBlockLimits *bl)
7*3d4a8bf0SPaolo Bonzini {
8*3d4a8bf0SPaolo Bonzini     /* required VPD size with unmap support */
9*3d4a8bf0SPaolo Bonzini     memset(outbuf, 0, 0x3c);
10*3d4a8bf0SPaolo Bonzini 
11*3d4a8bf0SPaolo Bonzini     outbuf[0] = bl->wsnz; /* wsnz */
12*3d4a8bf0SPaolo Bonzini 
13*3d4a8bf0SPaolo Bonzini     if (bl->max_io_sectors) {
14*3d4a8bf0SPaolo Bonzini         /* optimal transfer length granularity.  This field and the optimal
15*3d4a8bf0SPaolo Bonzini          * transfer length can't be greater than maximum transfer length.
16*3d4a8bf0SPaolo Bonzini          */
17*3d4a8bf0SPaolo Bonzini         stw_be_p(outbuf + 2, MIN(bl->min_io_size, bl->max_io_sectors));
18*3d4a8bf0SPaolo Bonzini 
19*3d4a8bf0SPaolo Bonzini         /* maximum transfer length */
20*3d4a8bf0SPaolo Bonzini         stl_be_p(outbuf + 4, bl->max_io_sectors);
21*3d4a8bf0SPaolo Bonzini 
22*3d4a8bf0SPaolo Bonzini         /* optimal transfer length */
23*3d4a8bf0SPaolo Bonzini         stl_be_p(outbuf + 8, MIN(bl->opt_io_size, bl->max_io_sectors));
24*3d4a8bf0SPaolo Bonzini     } else {
25*3d4a8bf0SPaolo Bonzini         stw_be_p(outbuf + 2, bl->min_io_size);
26*3d4a8bf0SPaolo Bonzini         stl_be_p(outbuf + 8, bl->opt_io_size);
27*3d4a8bf0SPaolo Bonzini     }
28*3d4a8bf0SPaolo Bonzini 
29*3d4a8bf0SPaolo Bonzini     /* max unmap LBA count */
30*3d4a8bf0SPaolo Bonzini     stl_be_p(outbuf + 16, bl->max_unmap_sectors);
31*3d4a8bf0SPaolo Bonzini 
32*3d4a8bf0SPaolo Bonzini     /* max unmap descriptors */
33*3d4a8bf0SPaolo Bonzini     stl_be_p(outbuf + 20, bl->max_unmap_descr);
34*3d4a8bf0SPaolo Bonzini 
35*3d4a8bf0SPaolo Bonzini     /* optimal unmap granularity; alignment is zero */
36*3d4a8bf0SPaolo Bonzini     stl_be_p(outbuf + 24, bl->unmap_sectors);
37*3d4a8bf0SPaolo Bonzini 
38*3d4a8bf0SPaolo Bonzini     /* max write same size, make it the same as maximum transfer length */
39*3d4a8bf0SPaolo Bonzini     stl_be_p(outbuf + 36, bl->max_io_sectors);
40*3d4a8bf0SPaolo Bonzini 
41*3d4a8bf0SPaolo Bonzini     return 0x3c;
42*3d4a8bf0SPaolo Bonzini }
43