Blame nvme-lightnvm.h

Packit Service b7b338
/*
Packit Service b7b338
 * Copyright (C) 2016 CNEX Labs.  All rights reserved.
Packit Service b7b338
 *
Packit Service b7b338
 * Author: Matias Bjoerling <matias@cnexlabs.com>
Packit Service b7b338
 *
Packit Service b7b338
 * This program is free software; you can redistribute it and/or
Packit Service b7b338
 * modify it under the terms of the GNU General Public License version
Packit Service b7b338
 * 2 as published by the Free Software Foundation.
Packit Service b7b338
 *
Packit Service b7b338
 * This program is distributed in the hope that it will be useful, but
Packit Service b7b338
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b7b338
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service b7b338
 * General Public License for more details.
Packit Service b7b338
 *
Packit Service b7b338
 * You should have received a copy of the GNU General Public License
Packit Service b7b338
 * along with this program; see the file COPYING.  If not, write to
Packit Service b7b338
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
Packit Service b7b338
 * USA.
Packit Service b7b338
 */
Packit Service b7b338
Packit Service b7b338
#ifndef NVME_LIGHTNVM_H_
Packit Service b7b338
#define NVME_LIGHTNVM_H_
Packit Service b7b338
Packit Service b7b338
#include "linux/lightnvm.h"
Packit Service b7b338
Packit Service b7b338
enum nvme_nvm_admin_opcode {
Packit Service b7b338
	nvme_nvm_admin_identity		= 0xe2,
Packit Service b7b338
	nvme_nvm_admin_get_bb_tbl	= 0xf2,
Packit Service b7b338
	nvme_nvm_admin_set_bb_tbl	= 0xf1,
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_identity {
Packit Service b7b338
	__u8	opcode;
Packit Service b7b338
	__u8	flags;
Packit Service b7b338
	__le16	command_id;
Packit Service b7b338
	__le32	nsid;
Packit Service b7b338
	__le64	rsvd[2];
Packit Service b7b338
	__le64	prp1;
Packit Service b7b338
	__le64	prp2;
Packit Service b7b338
	__le32	chnl_off;
Packit Service b7b338
	__le32	rsvd11[5];
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_setbbtbl {
Packit Service b7b338
	__u8	opcode;
Packit Service b7b338
	__u8	flags;
Packit Service b7b338
	__le16	rsvd1;
Packit Service b7b338
	__le32	nsid;
Packit Service b7b338
	__le32	cdw2;
Packit Service b7b338
	__le32	cdw3;
Packit Service b7b338
	__le64	metadata;
Packit Service b7b338
	__u64	addr;
Packit Service b7b338
	__le32	metadata_len;
Packit Service b7b338
	__le32	data_len;
Packit Service b7b338
	__le64	ppa;
Packit Service b7b338
	__le16	nlb;
Packit Service b7b338
	__u8	value;
Packit Service b7b338
	__u8	rsvd2;
Packit Service b7b338
	__le32	cdw14;
Packit Service b7b338
	__le32	cdw15;
Packit Service b7b338
	__le32	timeout_ms;
Packit Service b7b338
	__le32	result;
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_getbbtbl {
Packit Service b7b338
	__u8	opcode;
Packit Service b7b338
	__u8	flags;
Packit Service b7b338
	__le16	rsvd1;
Packit Service b7b338
	__le32	nsid;
Packit Service b7b338
	__le32	cdw2;
Packit Service b7b338
	__le32	cdw3;
Packit Service b7b338
	__u64	metadata;
Packit Service b7b338
	__u64	addr;
Packit Service b7b338
	__u32	metadata_len;
Packit Service b7b338
	__u32	data_len;
Packit Service b7b338
	__le64	ppa;
Packit Service b7b338
	__le32	cdw12;
Packit Service b7b338
	__le32	cdw13;
Packit Service b7b338
	__le32	cdw14;
Packit Service b7b338
	__le32	cdw15;
Packit Service b7b338
	__le32	timeout_ms;
Packit Service b7b338
	__le32	result;
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_command {
Packit Service b7b338
	union {
Packit Service b7b338
		struct nvme_nvm_identity identity;
Packit Service b7b338
		struct nvme_nvm_getbbtbl get_bb;
Packit Service b7b338
	};
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_completion {
Packit Service b7b338
	__le64	result;		/* Used by LightNVM to return ppa completions */
Packit Service b7b338
	__le16	sq_head;	/* how much of this queue may be reclaimed */
Packit Service b7b338
	__le16	sq_id;		/* submission queue that generated this entry */
Packit Service b7b338
	__le16	command_id;	/* of the command which completed */
Packit Service b7b338
	__le16	status;		/* did the command fail, and if so, why? */
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
#define NVME_NVM_LP_MLC_PAIRS 886
Packit Service b7b338
struct nvme_nvm_lp_mlc {
Packit Service b7b338
	__le16			num_pairs;
Packit Service b7b338
	__u8			pairs[NVME_NVM_LP_MLC_PAIRS];
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_lp_tbl {
Packit Service b7b338
	__u8			id[8];
Packit Service b7b338
	struct nvme_nvm_lp_mlc	mlc;
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_id12_group {
Packit Service b7b338
	__u8			mtype;
Packit Service b7b338
	__u8			fmtype;
Packit Service b7b338
	__le16			res16;
Packit Service b7b338
	__u8			num_ch;
Packit Service b7b338
	__u8			num_lun;
Packit Service b7b338
	__u8			num_pln;
Packit Service b7b338
	__u8			rsvd1;
Packit Service b7b338
	__le16			num_blk;
Packit Service b7b338
	__le16			num_pg;
Packit Service b7b338
	__le16			fpg_sz;
Packit Service b7b338
	__le16			csecs;
Packit Service b7b338
	__le16			sos;
Packit Service b7b338
	__le16			rsvd2;
Packit Service b7b338
	__le32			trdt;
Packit Service b7b338
	__le32			trdm;
Packit Service b7b338
	__le32			tprt;
Packit Service b7b338
	__le32			tprm;
Packit Service b7b338
	__le32			tbet;
Packit Service b7b338
	__le32			tbem;
Packit Service b7b338
	__le32			mpos;
Packit Service b7b338
	__le32			mccap;
Packit Service b7b338
	__le16			cpar;
Packit Service b7b338
	__u8			reserved[10];
Packit Service b7b338
	struct nvme_nvm_lp_tbl lptbl;
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_addr_format {
Packit Service b7b338
	__u8			ch_offset;
Packit Service b7b338
	__u8			ch_len;
Packit Service b7b338
	__u8			lun_offset;
Packit Service b7b338
	__u8			lun_len;
Packit Service b7b338
	__u8			pln_offset;
Packit Service b7b338
	__u8			pln_len;
Packit Service b7b338
	__u8			blk_offset;
Packit Service b7b338
	__u8			blk_len;
Packit Service b7b338
	__u8			pg_offset;
Packit Service b7b338
	__u8			pg_len;
Packit Service b7b338
	__u8			sect_offset;
Packit Service b7b338
	__u8			sect_len;
Packit Service b7b338
	__u8			res[4];
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
enum {
Packit Service b7b338
	LNVM_IDFY_CAP_BAD_BLK_TBL_MGMT	= 0,
Packit Service b7b338
	LNVM_IDFY_CAP_HYBRID_CMD_SUPP	= 1,
Packit Service b7b338
	LNVM_IDFY_CAP_VCOPY		= 0,
Packit Service b7b338
	LNVM_IDFY_CAP_MRESETS		= 1,
Packit Service b7b338
	LNVM_IDFY_DOM_HYBRID_MODE	= 0,
Packit Service b7b338
	LNVM_IDFY_DOM_ECC_MODE		= 1,
Packit Service b7b338
	LNVM_IDFY_GRP_MTYPE_NAND	= 0,
Packit Service b7b338
	LNVM_IDFY_GRP_FMTYPE_SLC	= 0,
Packit Service b7b338
	LNVM_IDFY_GRP_FMTYPE_MLC	= 1,
Packit Service b7b338
	LNVM_IDFY_GRP_FMTYPE_TLC	= 2,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_SNGL_PLN_RD	= 0,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_DUAL_PLN_RD	= 1,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_QUAD_PLN_RD	= 2,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_SNGL_PLN_PRG	= 8,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_DUAL_PLN_PRG	= 9,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_QUAD_PLN_PRG	= 10,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_SNGL_PLN_ERS	= 16,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_DUAL_PLN_ERS	= 17,
Packit Service b7b338
	LNVM_IDFY_GRP_MPOS_QUAD_PLN_ERS	= 18,
Packit Service b7b338
	LNVM_IDFY_GRP_MCCAP_SLC		= 0,
Packit Service b7b338
	LNVM_IDFY_GRP_MCCAP_CMD_SUSP	= 1,
Packit Service b7b338
	LNVM_IDFY_GRP_MCCAP_SCRAMBLE	= 2,
Packit Service b7b338
	LNVM_IDFY_GRP_MCCAP_ENCRYPT	= 3,
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_id12 {
Packit Service b7b338
	__u8			ver_id;
Packit Service b7b338
	__u8			vmnt;
Packit Service b7b338
	__u8			cgrps;
Packit Service b7b338
	__u8			res;
Packit Service b7b338
	__le32			cap;
Packit Service b7b338
	__le32			dom;
Packit Service b7b338
	struct nvme_nvm_addr_format ppaf;
Packit Service b7b338
	__u8			resv[228];
Packit Service b7b338
	struct nvme_nvm_id12_group groups[4];
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_id20_addrf {
Packit Service b7b338
	__u8			grp_len;
Packit Service b7b338
	__u8			pu_len;
Packit Service b7b338
	__u8			chk_len;
Packit Service b7b338
	__u8			lba_len;
Packit Service b7b338
	__u8			resv[4];
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_id20 {
Packit Service b7b338
	__u8			mjr;
Packit Service b7b338
	__u8			mnr;
Packit Service b7b338
	__u8			resv[6];
Packit Service b7b338
Packit Service b7b338
	struct nvme_nvm_id20_addrf lbaf;
Packit Service b7b338
Packit Service b7b338
	__le32			mccap;
Packit Service b7b338
	__u8			resv2[12];
Packit Service b7b338
Packit Service b7b338
	__u8			wit;
Packit Service b7b338
	__u8			resv3[31];
Packit Service b7b338
Packit Service b7b338
	/* Geometry */
Packit Service b7b338
	__le16			num_grp;
Packit Service b7b338
	__le16			num_pu;
Packit Service b7b338
	__le32			num_chk;
Packit Service b7b338
	__le32			clba;
Packit Service b7b338
	__u8			resv4[52];
Packit Service b7b338
Packit Service b7b338
	/* Write data requirements */
Packit Service b7b338
	__le32			ws_min;
Packit Service b7b338
	__le32			ws_opt;
Packit Service b7b338
	__le32			mw_cunits;
Packit Service b7b338
	__le32			maxoc;
Packit Service b7b338
	__le32			maxocpu;
Packit Service b7b338
	__u8			resv5[44];
Packit Service b7b338
Packit Service b7b338
	/* Performance related metrics */
Packit Service b7b338
	__le32			trdt;
Packit Service b7b338
	__le32			trdm;
Packit Service b7b338
	__le32			twrt;
Packit Service b7b338
	__le32			twrm;
Packit Service b7b338
	__le32			tcrst;
Packit Service b7b338
	__le32			tcrsm;
Packit Service b7b338
	__u8			resv6[40];
Packit Service b7b338
Packit Service b7b338
	/* Reserved area */
Packit Service b7b338
	__u8			resv7[2816];
Packit Service b7b338
Packit Service b7b338
	/* Vendor specific */
Packit Service b7b338
	__u8			vs[1024];
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_id {
Packit Service b7b338
	__u8			ver_id;
Packit Service b7b338
	__u8			resv[4095];
Packit Service b7b338
} __attribute__((packed));
Packit Service b7b338
Packit Service b7b338
enum {
Packit Service b7b338
	NVM_LID_CHUNK_INFO = 0xCA,
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_chunk_desc {
Packit Service b7b338
	__u8	cs;
Packit Service b7b338
	__u8	ct;
Packit Service b7b338
	__u8	wli;
Packit Service b7b338
	__u8	rsvd_7_3[5];
Packit Service b7b338
	__u64	slba;
Packit Service b7b338
	__u64	cnlb;
Packit Service b7b338
	__u64	wp;
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
struct nvme_nvm_bb_tbl {
Packit Service b7b338
	__u8	tblid[4];
Packit Service b7b338
	__le16	verid;
Packit Service b7b338
	__le16	revid;
Packit Service b7b338
	__le32	rvsd1;
Packit Service b7b338
	__le32	tblks;
Packit Service b7b338
	__le32	tfact;
Packit Service b7b338
	__le32	tgrown;
Packit Service b7b338
	__le32	tdresv;
Packit Service b7b338
	__le32	thresv;
Packit Service b7b338
	__le32	rsvd2[8];
Packit Service b7b338
	__u8	blk[0];
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
#define NVM_BLK_BITS (16)
Packit Service b7b338
#define NVM_PG_BITS  (16)
Packit Service b7b338
#define NVM_SEC_BITS (8)
Packit Service b7b338
#define NVM_PL_BITS  (8)
Packit Service b7b338
#define NVM_LUN_BITS (8)
Packit Service b7b338
#define NVM_CH_BITS  (7)
Packit Service b7b338
Packit Service b7b338
struct ppa_addr {
Packit Service b7b338
	/* Generic structure for all addresses */
Packit Service b7b338
	union {
Packit Service b7b338
		struct {
Packit Service b7b338
			__u64 blk	: NVM_BLK_BITS;
Packit Service b7b338
			__u64 pg	: NVM_PG_BITS;
Packit Service b7b338
			__u64 sec	: NVM_SEC_BITS;
Packit Service b7b338
			__u64 pl	: NVM_PL_BITS;
Packit Service b7b338
			__u64 lun	: NVM_LUN_BITS;
Packit Service b7b338
			__u64 ch	: NVM_CH_BITS;
Packit Service b7b338
			__u64 reserved	: 1;
Packit Service b7b338
		} g;
Packit Service b7b338
Packit Service b7b338
		__u64 ppa;
Packit Service b7b338
	};
Packit Service b7b338
};
Packit Service b7b338
Packit Service b7b338
static inline struct ppa_addr generic_to_dev_addr(
Packit Service b7b338
			struct nvme_nvm_addr_format *ppaf, struct ppa_addr r)
Packit Service b7b338
{
Packit Service b7b338
	struct ppa_addr l;
Packit Service b7b338
Packit Service b7b338
	l.ppa = ((__u64)r.g.blk) << ppaf->blk_offset;
Packit Service b7b338
	l.ppa |= ((__u64)r.g.pg) << ppaf->pg_offset;
Packit Service b7b338
	l.ppa |= ((__u64)r.g.sec) << ppaf->sect_offset;
Packit Service b7b338
	l.ppa |= ((__u64)r.g.pl) << ppaf->pln_offset;
Packit Service b7b338
	l.ppa |= ((__u64)r.g.lun) << ppaf->lun_offset;
Packit Service b7b338
	l.ppa |= ((__u64)r.g.ch) << ppaf->ch_offset;
Packit Service b7b338
Packit Service b7b338
	return l;
Packit Service b7b338
}
Packit Service b7b338
Packit Service b7b338
int lnvm_get_identity(int fd, int nsid, struct nvme_nvm_id *nvm_id);
Packit Service b7b338
Packit Service b7b338
int lnvm_do_init(char *, char *);
Packit Service b7b338
int lnvm_do_list_devices(void);
Packit Service b7b338
int lnvm_do_info(void);
Packit Service b7b338
int lnvm_do_create_tgt(char *, char *, char *, int, int, int, int);
Packit Service b7b338
int lnvm_do_remove_tgt(char *);
Packit Service b7b338
int lnvm_do_factory_init(char *, int, int, int);
Packit Service b7b338
int lnvm_do_id_ns(int, int, unsigned int);
Packit Service b7b338
int lnvm_do_chunk_log(int, __u32, __u32, void *, unsigned int);
Packit Service b7b338
int lnvm_do_get_bbtbl(int, int, int, int, unsigned int);
Packit Service b7b338
int lnvm_do_set_bbtbl(int, int, int, int, int, int, __u8);
Packit Service b7b338
Packit Service b7b338
#endif