@@ -455,6 +455,38 @@ enum nvme_cmd_dword_fields {
455455 NVME_IOCS_COMMON_CDW15_ELBAT_MASK = 0xffff ,
456456 NVME_IOCS_COMMON_CDW15_ELBATM_SHIFT = 16 ,
457457 NVME_IOCS_COMMON_CDW15_ELBATM_MASK = 0xffff ,
458+ NVME_COPY_CDW3_LBTU_SHIFT = 0 ,
459+ NVME_COPY_CDW3_LBTU_MASK = 0xffffffff ,
460+ NVME_COPY_CDW10_SDLBAL_SHIFT = 0 ,
461+ NVME_COPY_CDW10_SDLBAL_MASK = 0xffffffff ,
462+ NVME_COPY_CDW11_SDLBAU_SHIFT = 0 ,
463+ NVME_COPY_CDW11_SDLBAU_MASK = 0xffffffff ,
464+ NVME_COPY_CDW12_NR_SHIFT = 0 ,
465+ NVME_COPY_CDW12_NR_MASK = 0xff ,
466+ NVME_COPY_CDW12_DESFMT_SHIFT = 8 ,
467+ NVME_COPY_CDW12_DESFMT_MASK = 0xf ,
468+ NVME_COPY_CDW12_PRINFOR_SHIFT = 12 ,
469+ NVME_COPY_CDW12_PRINFOR_MASK = 0xf ,
470+ NVME_COPY_CDW12_CETYPE_SHIFT = 16 ,
471+ NVME_COPY_CDW12_CETYPE_MASK = 0xf ,
472+ NVME_COPY_CDW12_DTYPE_SHIFT = 20 ,
473+ NVME_COPY_CDW12_DTYPE_MASK = 0xf ,
474+ NVME_COPY_CDW12_STCW_SHIFT = 24 ,
475+ NVME_COPY_CDW12_STCW_MASK = 0x1 ,
476+ NVME_COPY_CDW12_STCR_SHIFT = 25 ,
477+ NVME_COPY_CDW12_STCR_MASK = 0x1 ,
478+ NVME_COPY_CDW12_PRINFOW_SHIFT = 26 ,
479+ NVME_COPY_CDW12_PRINFOW_MASK = 0xf ,
480+ NVME_COPY_CDW12_FUA_SHIFT = 30 ,
481+ NVME_COPY_CDW12_FUA_MASK = 0x1 ,
482+ NVME_COPY_CDW12_LR_SHIFT = 31 ,
483+ NVME_COPY_CDW12_LR_MASK = 0x1 ,
484+ NVME_COPY_CDW14_LBTL_SHIFT = 0 ,
485+ NVME_COPY_CDW14_LBTL_MASK = 0xffffffff ,
486+ NVME_COPY_CDW15_LBAT_SHIFT = 0 ,
487+ NVME_COPY_CDW15_LBAT_MASK = 0xffff ,
488+ NVME_COPY_CDW15_LBATM_SHIFT = 16 ,
489+ NVME_COPY_CDW15_LBATM_MASK = 0xffff ,
458490};
459491
460492#define NVME_FIELD_ENCODE (value , shift , mask ) \
@@ -4764,15 +4796,89 @@ nvme_init_verify(struct nvme_passthru_cmd *cmd, __u32 nsid, __u64 slba,
47644796}
47654797
47664798/**
4767- * nvme_copy() - Copy command
4768- * @hdl: Transport handle
4769- * @args: &struct nvme_copy_args argument structure
4799+ * nvme_init_copy() - Initialize passthru command for Copy command
4800+ * @cmd: Passthru command to use
4801+ * @nsid: Namespace identifier
4802+ * @sdlba: Start destination LBA
4803+ * @nr: Number of ranges (1-based, 0-based in command)
4804+ * @desfmt: Descriptor format
4805+ * @prinfor: Protection information field for read
4806+ * @prinfow: Protection information field for write
4807+ * @cetype: Command Extension Type
4808+ * @dtype: Directive Type
4809+ * @stcw: Storage Tag Check Write
4810+ * @stcr: Storage Tag Check Read
4811+ * @fua: Force unit access
4812+ * @lr: Limited retry
4813+ * @cev: Command Extension Value
4814+ * @dspec: Directive specific value
4815+ * @cpydsc: Range description buffer
47704816 *
4771- * Return: 0 on success, the nvme command status if a response was
4772- * received (see &enum nvme_status_field) or a negative error otherwise .
4817+ * Initializes the passthru command buffer for the Copy command by calculating
4818+ * the data length and calling the generic I/O initializer .
47734819 */
4774- int nvme_copy (struct nvme_transport_handle * hdl , struct nvme_copy_args * args );
4820+ static inline void
4821+ nvme_init_copy (struct nvme_passthru_cmd * cmd , __u32 nsid , __u64 sdlba ,
4822+ __u16 nr , __u8 desfmt , __u8 prinfor , __u8 prinfow ,
4823+ __u8 cetype , __u8 dtype , bool stcw , bool stcr , bool fua ,
4824+ bool lr , __u16 cev , __u16 dspec , void * cpydsc )
4825+ {
4826+ __u32 data_len ;
4827+
4828+ switch (desfmt ) {
4829+ case 1 :
4830+ data_len = nr * sizeof (struct nvme_copy_range_f1 );
4831+ break ;
4832+ case 2 :
4833+ data_len = nr * sizeof (struct nvme_copy_range_f2 );
4834+ break ;
4835+ case 3 :
4836+ data_len = nr * sizeof (struct nvme_copy_range_f3 );
4837+ break ;
4838+ default :
4839+ data_len = nr * sizeof (struct nvme_copy_range );
4840+ break ;
4841+ }
47754842
4843+ nvme_init_io (cmd , nvme_cmd_copy , nsid , sdlba , cpydsc ,
4844+ data_len , NULL , 0 );
4845+ cmd -> cdw12 = NVME_FIELD_ENCODE (nr - 1 ,
4846+ NVME_COPY_CDW12_NR_SHIFT ,
4847+ NVME_COPY_CDW12_NR_MASK ) |
4848+ NVME_FIELD_ENCODE (desfmt ,
4849+ NVME_COPY_CDW12_DESFMT_SHIFT ,
4850+ NVME_COPY_CDW12_DESFMT_MASK ) |
4851+ NVME_FIELD_ENCODE (prinfor ,
4852+ NVME_COPY_CDW12_PRINFOR_SHIFT ,
4853+ NVME_COPY_CDW12_PRINFOR_MASK ) |
4854+ NVME_FIELD_ENCODE (cetype ,
4855+ NVME_COPY_CDW12_CETYPE_SHIFT ,
4856+ NVME_COPY_CDW12_CETYPE_MASK ) |
4857+ NVME_FIELD_ENCODE (dtype ,
4858+ NVME_COPY_CDW12_DTYPE_SHIFT ,
4859+ NVME_COPY_CDW12_DTYPE_MASK ) |
4860+ NVME_FIELD_ENCODE (stcw ,
4861+ NVME_COPY_CDW12_STCW_SHIFT ,
4862+ NVME_COPY_CDW12_STCW_MASK ) |
4863+ NVME_FIELD_ENCODE (stcr ,
4864+ NVME_COPY_CDW12_STCR_SHIFT ,
4865+ NVME_COPY_CDW12_STCR_MASK ) |
4866+ NVME_FIELD_ENCODE (prinfow ,
4867+ NVME_COPY_CDW12_PRINFOW_SHIFT ,
4868+ NVME_COPY_CDW12_PRINFOW_MASK ) |
4869+ NVME_FIELD_ENCODE (fua ,
4870+ NVME_COPY_CDW12_FUA_SHIFT ,
4871+ NVME_COPY_CDW12_FUA_MASK ) |
4872+ NVME_FIELD_ENCODE (lr ,
4873+ NVME_COPY_CDW12_LR_SHIFT ,
4874+ NVME_COPY_CDW12_LR_MASK );
4875+ cmd -> cdw13 = NVME_FIELD_ENCODE (cev ,
4876+ NVME_IOCS_COMMON_CDW13_CEV_SHIFT ,
4877+ NVME_IOCS_COMMON_CDW13_CEV_MASK ) |
4878+ NVME_FIELD_ENCODE (dspec ,
4879+ NVME_IOCS_COMMON_CDW13_DSPEC_SHIFT ,
4880+ NVME_IOCS_COMMON_CDW13_DSPEC_MASK );
4881+ }
47764882
47774883/**
47784884 * nvme_init_resv_acquire() - Initialize passthru command for
0 commit comments