All of lore.kernel.org
 help / color / mirror / Atom feed
From: hch@lst.de (Christoph Hellwig)
Subject: [PATCH] resync nvme.h with the kernel.h
Date: Wed, 28 Jun 2017 20:29:37 +0200	[thread overview]
Message-ID: <20170628182937.GA12703@lst.de> (raw)
In-Reply-To: <20170628182757.10173-1-hch@lst.de>

Meh, the subject should just say:

resync nvme.h with the kernel

On Wed, Jun 28, 2017@11:27:57AM -0700, Christoph Hellwig wrote:
> Copy over the current nvme.h from the for-4.13 block tree, and adjust
> a few callers.  The biggest tweak is that we can't use the kernel uuid.h
> and either need to use libuuid or our own definition.
> 
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
>  fabrics.c    |   2 +
>  linux/nvme.h | 140 +++++++++++++++++++++++++++++++++++++++++++++++++----------
>  nvme-print.c |   8 +---
>  nvme.c       |   4 --
>  nvme.h       |  19 ++++----
>  5 files changed, 129 insertions(+), 44 deletions(-)
> 
> diff --git a/fabrics.c b/fabrics.c
> index 87cdba2..da4e04e 100644
> --- a/fabrics.c
> +++ b/fabrics.c
> @@ -44,6 +44,8 @@
>  
>  #include "common.h"
>  
> +#define NVMF_HOSTID_SIZE	36
> +
>  static struct config {
>  	char *nqn;
>  	char *transport;
> diff --git a/linux/nvme.h b/linux/nvme.h
> index d1a322b..291587a 100644
> --- a/linux/nvme.h
> +++ b/linux/nvme.h
> @@ -16,6 +16,7 @@
>  #define _LINUX_NVME_H
>  
>  #include <linux/types.h>
> +#include <linux/uuid.h>
>  
>  /* NQN names in commands fields specified one size */
>  #define NVMF_NQN_FIELD_LEN	256
> @@ -23,7 +24,6 @@
>  /* However the max length of a qualified name is another size */
>  #define NVMF_NQN_SIZE		223
>  
> -#define NVMF_HOSTID_SIZE        36
>  #define NVMF_TRSVCID_SIZE	32
>  #define NVMF_TRADDR_SIZE	256
>  #define NVMF_TSAS_SIZE		256
> @@ -102,6 +102,7 @@ enum {
>  	NVME_REG_ACQ	= 0x0030,	/* Admin CQ Base Address */
>  	NVME_REG_CMBLOC = 0x0038,	/* Controller Memory Buffer Location */
>  	NVME_REG_CMBSZ	= 0x003c,	/* Controller Memory Buffer Size */
> +	NVME_REG_DBS	= 0x1000,	/* SQ 0 Tail Doorbell */
>  };
>  
>  #define NVME_CAP_MQES(cap)	((cap) & 0xffff)
> @@ -249,7 +250,10 @@ enum {
>  	NVME_CTRL_ONCS_COMPARE			= 1 << 0,
>  	NVME_CTRL_ONCS_WRITE_UNCORRECTABLE	= 1 << 1,
>  	NVME_CTRL_ONCS_DSM			= 1 << 2,
> +	NVME_CTRL_ONCS_WRITE_ZEROES		= 1 << 3,
>  	NVME_CTRL_VWC_PRESENT			= 1 << 0,
> +	NVME_CTRL_OACS_SEC_SUPP                 = 1 << 0,
> +	NVME_CTRL_OACS_DBBUF_SUPP		= 1 << 7,
>  };
>  
>  struct nvme_lbaf {
> @@ -289,6 +293,17 @@ struct nvme_id_ns {
>  };
>  
>  enum {
> +	NVME_ID_CNS_NS			= 0x00,
> +	NVME_ID_CNS_CTRL		= 0x01,
> +	NVME_ID_CNS_NS_ACTIVE_LIST	= 0x02,
> +	NVME_ID_CNS_NS_DESC_LIST	= 0x03,
> +	NVME_ID_CNS_NS_PRESENT_LIST	= 0x10,
> +	NVME_ID_CNS_NS_PRESENT		= 0x11,
> +	NVME_ID_CNS_CTRL_NS_LIST	= 0x12,
> +	NVME_ID_CNS_CTRL_LIST		= 0x13,
> +};
> +
> +enum {
>  	NVME_NS_FEAT_THIN	= 1 << 0,
>  	NVME_NS_FLBAS_LBA_MASK	= 0xf,
>  	NVME_NS_FLBAS_META_EXT	= 0x10,
> @@ -308,6 +323,22 @@ enum {
>  	NVME_NS_DPS_PI_TYPE3	= 3,
>  };
>  
> +struct nvme_ns_id_desc {
> +	__u8 nidt;
> +	__u8 nidl;
> +	__le16 reserved;
> +};
> +
> +#define NVME_NIDT_EUI64_LEN	8
> +#define NVME_NIDT_NGUID_LEN	16
> +#define NVME_NIDT_UUID_LEN	16
> +
> +enum {
> +	NVME_NIDT_EUI64		= 0x01,
> +	NVME_NIDT_NGUID		= 0x02,
> +	NVME_NIDT_UUID		= 0x03,
> +};
> +
>  struct nvme_smart_log {
>  	__u8			critical_warning;
>  	__u8			temperature[2];
> @@ -549,12 +580,42 @@ enum {
>  	NVME_DSMGMT_AD		= 1 << 2,
>  };
>  
> +#define NVME_DSM_MAX_RANGES	256
> +
>  struct nvme_dsm_range {
>  	__le32			cattr;
>  	__le32			nlb;
>  	__le64			slba;
>  };
>  
> +struct nvme_write_zeroes_cmd {
> +	__u8			opcode;
> +	__u8			flags;
> +	__u16			command_id;
> +	__le32			nsid;
> +	__u64			rsvd2;
> +	__le64			metadata;
> +	union nvme_data_ptr	dptr;
> +	__le64			slba;
> +	__le16			length;
> +	__le16			control;
> +	__le32			dsmgmt;
> +	__le32			reftag;
> +	__le16			apptag;
> +	__le16			appmask;
> +};
> +
> +/* Features */
> +
> +struct nvme_feat_auto_pst {
> +	__le64 entries[32];
> +};
> +
> +enum {
> +	NVME_HOST_MEM_ENABLE	= (1 << 0),
> +	NVME_HOST_MEM_RETURN	= (1 << 1),
> +};
> +
>  /* Admin commands */
>  
>  enum nvme_admin_opcode {
> @@ -573,6 +634,7 @@ enum nvme_admin_opcode {
>  	nvme_admin_download_fw		= 0x11,
>  	nvme_admin_ns_attach		= 0x15,
>  	nvme_admin_keep_alive		= 0x18,
> +	nvme_admin_dbbuf		= 0x7C,
>  	nvme_admin_format_nvm		= 0x80,
>  	nvme_admin_security_send	= 0x81,
>  	nvme_admin_security_recv	= 0x82,
> @@ -620,10 +682,14 @@ struct nvme_identify {
>  	__le32			nsid;
>  	__u64			rsvd2[2];
>  	union nvme_data_ptr	dptr;
> -	__le32			cns;
> +	__u8			cns;
> +	__u8			rsvd3;
> +	__le16			ctrlid;
>  	__u32			rsvd11[5];
>  };
>  
> +#define NVME_IDENTIFY_DATA_SIZE 4096
> +
>  struct nvme_features {
>  	__u8			opcode;
>  	__u8			flags;
> @@ -633,7 +699,16 @@ struct nvme_features {
>  	union nvme_data_ptr	dptr;
>  	__le32			fid;
>  	__le32			dword11;
> -	__u32			rsvd12[4];
> +	__le32                  dword12;
> +	__le32                  dword13;
> +	__le32                  dword14;
> +	__le32                  dword15;
> +};
> +
> +struct nvme_host_mem_buf_desc {
> +	__le64			addr;
> +	__le32			size;
> +	__u32			rsvd;
>  };
>  
>  struct nvme_create_cq {
> @@ -809,7 +884,7 @@ struct nvmf_connect_command {
>  };
>  
>  struct nvmf_connect_data {
> -	__u8		hostid[16];
> +	uuid_t		hostid;
>  	__le16		cntlid;
>  	char		resv4[238];
>  	char		subsysnqn[NVMF_NQN_FIELD_LEN];
> @@ -842,6 +917,16 @@ struct nvmf_property_get_command {
>  	__u8		resv4[16];
>  };
>  
> +struct nvme_dbbuf {
> +	__u8			opcode;
> +	__u8			flags;
> +	__u16			command_id;
> +	__u32			rsvd1[5];
> +	__le64			prp1;
> +	__le64			prp2;
> +	__u32			rsvd12[6];
> +};
> +
>  struct nvme_command {
>  	union {
>  		struct nvme_common_command common;
> @@ -854,29 +939,17 @@ struct nvme_command {
>  		struct nvme_download_firmware dlfw;
>  		struct nvme_format_cmd format;
>  		struct nvme_dsm_cmd dsm;
> +		struct nvme_write_zeroes_cmd write_zeroes;
>  		struct nvme_abort_cmd abort;
>  		struct nvme_get_log_page_command get_log_page;
>  		struct nvmf_common_command fabrics;
>  		struct nvmf_connect_command connect;
>  		struct nvmf_property_set_command prop_set;
>  		struct nvmf_property_get_command prop_get;
> +		struct nvme_dbbuf dbbuf;
>  	};
>  };
>  
> -#define NVME_IDENTIFY_CMD_LEN 4096
> -#define NVME_ID_CNS_NS_DESC_LIST 0x3
> -enum {
> -	NVME_NIDT_EUI64		= 0x1,
> -	NVME_NIDT_NGUID		= 0x2,
> -	NVME_NIDT_UUID		= 0x3,
> -};
> -
> -struct nvme_ns_id_desc {
> -	__u8 nidt;
> -	__u8 nidl;
> -	__u16 reserved;
> -};
> -
>  static inline bool nvme_is_write(struct nvme_command *cmd)
>  {
>  	/*
> @@ -958,6 +1031,7 @@ enum {
>  	NVME_SC_BAD_ATTRIBUTES		= 0x180,
>  	NVME_SC_INVALID_PI		= 0x181,
>  	NVME_SC_READ_ONLY		= 0x182,
> +	NVME_SC_ONCS_NOT_SUPPORTED	= 0x183,
>  
>  	/*
>  	 * I/O Command Set Specific - Fabrics commands:
> @@ -984,23 +1058,41 @@ enum {
>  	NVME_SC_UNWRITTEN_BLOCK		= 0x287,
>  
>  	NVME_SC_DNR			= 0x4000,
> +
> +
> +	/*
> +	 * FC Transport-specific error status values for NVME commands
> +	 *
> +	 * Transport-specific status code values must be in the range 0xB0..0xBF
> +	 */
> +
> +	/* Generic FC failure - catchall */
> +	NVME_SC_FC_TRANSPORT_ERROR	= 0x00B0,
> +
> +	/* I/O failure due to FC ABTS'd */
> +	NVME_SC_FC_TRANSPORT_ABORTED	= 0x00B1,
>  };
>  
>  struct nvme_completion {
>  	/*
>  	 * Used by Admin and Fabrics commands to return data:
>  	 */
> -	union {
> -		__le16	result16;
> -		__le32	result;
> -		__le64	result64;
> -	};
> +	union nvme_result {
> +		__le16	u16;
> +		__le32	u32;
> +		__le64	u64;
> +	} result;
>  	__le16	sq_head;	/* how much of this queue may be reclaimed */
>  	__le16	sq_id;		/* submission queue that generated this entry */
>  	__u16	command_id;	/* of the command which completed */
>  	__le16	status;		/* did the command fail, and if so, why? */
>  };
>  
> -#define NVME_VS(major, minor) (((major) << 16) | ((minor) << 8))
> +#define NVME_VS(major, minor, tertiary) \
> +	(((major) << 16) | ((minor) << 8) | (tertiary))
> +
> +#define NVME_MAJOR(ver)		((ver) >> 16)
> +#define NVME_MINOR(ver)		(((ver) >> 8) & 0xff)
> +#define NVME_TERTIARY(ver)	((ver) & 0xff)
>  
>  #endif /* _LINUX_NVME_H */
> diff --git a/nvme-print.c b/nvme-print.c
> index dca4a19..637c695 100644
> --- a/nvme-print.c
> +++ b/nvme-print.c
> @@ -3,10 +3,6 @@
>  #include <string.h>
>  #include <stdlib.h>
>  
> -#ifdef LIBUUID
> -#include <uuid/uuid.h>
> -#endif
> -
>  #include "nvme-print.h"
>  #include "json.h"
>  #include "nvme-models.h"
> @@ -622,7 +618,7 @@ void json_nvme_id_ns_descs(void *data)
>  
>  	root = json_create_object();
>  
> -	for (pos = 0; pos < NVME_IDENTIFY_CMD_LEN; pos += len) {
> +	for (pos = 0; pos < NVME_IDENTIFY_DATA_SIZE; pos += len) {
>  		struct nvme_ns_id_desc *cur = data + pos;
>  
>  		off = pos + sizeof(*cur);
> @@ -680,7 +676,7 @@ void show_nvme_id_ns_descs(void *data)
>  	__u8 eui64[8];
>  	__u8 nguid[16];
>  
> -	for (pos = 0; pos < NVME_IDENTIFY_CMD_LEN; pos += len) {
> +	for (pos = 0; pos < NVME_IDENTIFY_DATA_SIZE; pos += len) {
>  		struct nvme_ns_id_desc *cur = data + pos;
>  
>  		if (cur->nidl == 0)
> diff --git a/nvme.c b/nvme.c
> index f746b74..4cb7d63 100644
> --- a/nvme.c
> +++ b/nvme.c
> @@ -45,10 +45,6 @@
>  #include <sys/stat.h>
>  #include <sys/time.h>
>  
> -#ifdef LIBUUID
> -#include <uuid/uuid.h>
> -#endif
> -
>  #include "nvme-print.h"
>  #include "nvme-ioctl.h"
>  #include "nvme-lightnvm.h"
> diff --git a/nvme.h b/nvme.h
> index 397a1a5..b796961 100644
> --- a/nvme.h
> +++ b/nvme.h
> @@ -21,6 +21,15 @@
>  #include "json.h"
>  
>  #define unlikely(x) x
> +
> +#ifdef LIBUUID
> +#include <uuid/uuid.h>
> +#else
> +typedef struct {
> +	__u8 b[16];
> +} uuid_t;
> +#endif
> +
>  #include "linux/nvme.h"
>  
>  struct nvme_error_log_page {
> @@ -45,16 +54,6 @@ struct nvme_firmware_log_page {
>  /* idle and active power scales occupy the last 2 bits of the field */
>  #define POWER_SCALE(s) ((s) >> 6)
>  
> -enum {
> -	NVME_ID_CNS_NS			= 0x00,
> -	NVME_ID_CNS_CTRL		= 0x01,
> -	NVME_ID_CNS_NS_ACTIVE_LIST	= 0x02,
> -	NVME_ID_CNS_NS_PRESENT_LIST	= 0x10,
> -	NVME_ID_CNS_NS_PRESENT		= 0x11,
> -	NVME_ID_CNS_CTRL_NS_LIST	= 0x12,
> -	NVME_ID_CNS_CTRL_LIST		= 0x13,
> -};
> -
>  struct nvme_host_mem_buffer {
>  	__u32			hsize;
>  	__u32			hmdlal;
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme
---end quoted text---

  reply	other threads:[~2017-06-28 18:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-28 18:27 [PATCH] resync nvme.h with the kernel.h Christoph Hellwig
2017-06-28 18:29 ` Christoph Hellwig [this message]
2017-06-28 20:22   ` Keith Busch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170628182937.GA12703@lst.de \
    --to=hch@lst.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.