[scsilib] Definitions for SCSI READ CAPACITY (16) command

READ CAPACITY (16) is a service action of the SERVICE ACTION command.
It reports the size of a block device's blocks and the number of blocks.

ZX-2314

Tested: Built

Change-Id: Id76096e8510e6b5653a99bcb5f51d1386e8cef66
diff --git a/system/dev/bus/virtio/scsilib.h b/system/dev/bus/virtio/scsilib.h
index cc7e612..d8d832a 100644
--- a/system/dev/bus/virtio/scsilib.h
+++ b/system/dev/bus/virtio/scsilib.h
@@ -19,6 +19,7 @@
     MODE_SENSE_6 = 0x1A,
     READ_16 = 0x88,
     WRITE_16 = 0x8A,
+    READ_CAPACITY_16 = 0x9E,
 };
 
 // SCSI command structures (CDBs)
@@ -92,6 +93,28 @@
 
 static_assert(sizeof(ModeSense6ParameterHeader) == 4, "Mode sense 6 parameters must be 4 bytes");
 
+struct ReadCapacity16CDB {
+    Opcode opcode;
+    uint8_t service_action;
+    uint64_t reserved;
+    uint32_t allocation_length;
+    uint8_t pmi;
+    uint8_t control;
+} __PACKED;
+
+static_assert(sizeof(ReadCapacity16CDB) == 16, "Read Capacity 16 CDB must be 16 bytes");
+
+struct ReadCapacity16ParameterData {
+    uint64_t returned_logical_block_address;
+    uint32_t block_length_in_bytes;
+    uint8_t prot_info;
+    uint8_t logical_blocks_exponent_info;
+    uint16_t lowest_aligned_logical_block;
+    uint8_t reserved[16];
+} __PACKED;
+
+static_assert(sizeof(ReadCapacity16ParameterData) == 32, "Read Capacity 16 Params are 32 bytes");
+
 class Disk;
 using DeviceType = ddk::Device<Disk, ddk::GetSizable, ddk::Unbindable>;