xref: /openbmc/linux/drivers/nvme/host/nvme.h (revision ca064085)
157dacad5SJay Sternberg /*
257dacad5SJay Sternberg  * Copyright (c) 2011-2014, Intel Corporation.
357dacad5SJay Sternberg  *
457dacad5SJay Sternberg  * This program is free software; you can redistribute it and/or modify it
557dacad5SJay Sternberg  * under the terms and conditions of the GNU General Public License,
657dacad5SJay Sternberg  * version 2, as published by the Free Software Foundation.
757dacad5SJay Sternberg  *
857dacad5SJay Sternberg  * This program is distributed in the hope it will be useful, but WITHOUT
957dacad5SJay Sternberg  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1057dacad5SJay Sternberg  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1157dacad5SJay Sternberg  * more details.
1257dacad5SJay Sternberg  */
1357dacad5SJay Sternberg 
1457dacad5SJay Sternberg #ifndef _NVME_H
1557dacad5SJay Sternberg #define _NVME_H
1657dacad5SJay Sternberg 
1757dacad5SJay Sternberg #include <linux/nvme.h>
1857dacad5SJay Sternberg #include <linux/pci.h>
1957dacad5SJay Sternberg #include <linux/kref.h>
2057dacad5SJay Sternberg #include <linux/blk-mq.h>
2157dacad5SJay Sternberg 
2257dacad5SJay Sternberg extern unsigned char nvme_io_timeout;
2357dacad5SJay Sternberg #define NVME_IO_TIMEOUT	(nvme_io_timeout * HZ)
2457dacad5SJay Sternberg 
25ca064085SMatias Bjørling enum {
26ca064085SMatias Bjørling 	NVME_NS_LBA		= 0,
27ca064085SMatias Bjørling 	NVME_NS_LIGHTNVM	= 1,
28ca064085SMatias Bjørling };
29ca064085SMatias Bjørling 
3057dacad5SJay Sternberg /*
3157dacad5SJay Sternberg  * Represents an NVM Express device.  Each nvme_dev is a PCI function.
3257dacad5SJay Sternberg  */
3357dacad5SJay Sternberg struct nvme_dev {
3457dacad5SJay Sternberg 	struct list_head node;
3557dacad5SJay Sternberg 	struct nvme_queue **queues;
3657dacad5SJay Sternberg 	struct request_queue *admin_q;
3757dacad5SJay Sternberg 	struct blk_mq_tag_set tagset;
3857dacad5SJay Sternberg 	struct blk_mq_tag_set admin_tagset;
3957dacad5SJay Sternberg 	u32 __iomem *dbs;
4057dacad5SJay Sternberg 	struct device *dev;
4157dacad5SJay Sternberg 	struct dma_pool *prp_page_pool;
4257dacad5SJay Sternberg 	struct dma_pool *prp_small_pool;
4357dacad5SJay Sternberg 	int instance;
4457dacad5SJay Sternberg 	unsigned queue_count;
4557dacad5SJay Sternberg 	unsigned online_queues;
4657dacad5SJay Sternberg 	unsigned max_qid;
4757dacad5SJay Sternberg 	int q_depth;
4857dacad5SJay Sternberg 	u32 db_stride;
4957dacad5SJay Sternberg 	u32 ctrl_config;
5057dacad5SJay Sternberg 	struct msix_entry *entry;
5157dacad5SJay Sternberg 	struct nvme_bar __iomem *bar;
5257dacad5SJay Sternberg 	struct list_head namespaces;
5357dacad5SJay Sternberg 	struct kref kref;
5457dacad5SJay Sternberg 	struct device *device;
5557dacad5SJay Sternberg 	struct work_struct reset_work;
5657dacad5SJay Sternberg 	struct work_struct probe_work;
5757dacad5SJay Sternberg 	struct work_struct scan_work;
5857dacad5SJay Sternberg 	char name[12];
5957dacad5SJay Sternberg 	char serial[20];
6057dacad5SJay Sternberg 	char model[40];
6157dacad5SJay Sternberg 	char firmware_rev[8];
6257dacad5SJay Sternberg 	bool subsystem;
6357dacad5SJay Sternberg 	u32 max_hw_sectors;
6457dacad5SJay Sternberg 	u32 stripe_size;
6557dacad5SJay Sternberg 	u32 page_size;
6657dacad5SJay Sternberg 	void __iomem *cmb;
6757dacad5SJay Sternberg 	dma_addr_t cmb_dma_addr;
6857dacad5SJay Sternberg 	u64 cmb_size;
6957dacad5SJay Sternberg 	u32 cmbsz;
7057dacad5SJay Sternberg 	u16 oncs;
7157dacad5SJay Sternberg 	u16 abort_limit;
7257dacad5SJay Sternberg 	u8 event_limit;
7357dacad5SJay Sternberg 	u8 vwc;
7457dacad5SJay Sternberg };
7557dacad5SJay Sternberg 
7657dacad5SJay Sternberg /*
7757dacad5SJay Sternberg  * An NVM Express namespace is equivalent to a SCSI LUN
7857dacad5SJay Sternberg  */
7957dacad5SJay Sternberg struct nvme_ns {
8057dacad5SJay Sternberg 	struct list_head list;
8157dacad5SJay Sternberg 
8257dacad5SJay Sternberg 	struct nvme_dev *dev;
8357dacad5SJay Sternberg 	struct request_queue *queue;
8457dacad5SJay Sternberg 	struct gendisk *disk;
8557dacad5SJay Sternberg 	struct kref kref;
8657dacad5SJay Sternberg 
8757dacad5SJay Sternberg 	unsigned ns_id;
8857dacad5SJay Sternberg 	int lba_shift;
8957dacad5SJay Sternberg 	u16 ms;
9057dacad5SJay Sternberg 	bool ext;
9157dacad5SJay Sternberg 	u8 pi_type;
92ca064085SMatias Bjørling 	int type;
9357dacad5SJay Sternberg 	u64 mode_select_num_blocks;
9457dacad5SJay Sternberg 	u32 mode_select_block_len;
9557dacad5SJay Sternberg };
9657dacad5SJay Sternberg 
9757dacad5SJay Sternberg /*
9857dacad5SJay Sternberg  * The nvme_iod describes the data in an I/O, including the list of PRP
9957dacad5SJay Sternberg  * entries.  You can't see it in this data structure because C doesn't let
10057dacad5SJay Sternberg  * me express that.  Use nvme_alloc_iod to ensure there's enough space
10157dacad5SJay Sternberg  * allocated to store the PRP list.
10257dacad5SJay Sternberg  */
10357dacad5SJay Sternberg struct nvme_iod {
10457dacad5SJay Sternberg 	unsigned long private;	/* For the use of the submitter of the I/O */
10557dacad5SJay Sternberg 	int npages;		/* In the PRP list. 0 means small pool in use */
10657dacad5SJay Sternberg 	int offset;		/* Of PRP list */
10757dacad5SJay Sternberg 	int nents;		/* Used in scatterlist */
10857dacad5SJay Sternberg 	int length;		/* Of data, in bytes */
10957dacad5SJay Sternberg 	dma_addr_t first_dma;
11057dacad5SJay Sternberg 	struct scatterlist meta_sg[1]; /* metadata requires single contiguous buffer */
11157dacad5SJay Sternberg 	struct scatterlist sg[0];
11257dacad5SJay Sternberg };
11357dacad5SJay Sternberg 
11457dacad5SJay Sternberg static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector)
11557dacad5SJay Sternberg {
11657dacad5SJay Sternberg 	return (sector >> (ns->lba_shift - 9));
11757dacad5SJay Sternberg }
11857dacad5SJay Sternberg 
11957dacad5SJay Sternberg int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
12057dacad5SJay Sternberg 		void *buf, unsigned bufflen);
12157dacad5SJay Sternberg int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
12257dacad5SJay Sternberg 		void *buffer, void __user *ubuffer, unsigned bufflen,
12357dacad5SJay Sternberg 		u32 *result, unsigned timeout);
12457dacad5SJay Sternberg int nvme_identify_ctrl(struct nvme_dev *dev, struct nvme_id_ctrl **id);
12557dacad5SJay Sternberg int nvme_identify_ns(struct nvme_dev *dev, unsigned nsid,
12657dacad5SJay Sternberg 		struct nvme_id_ns **id);
12757dacad5SJay Sternberg int nvme_get_log_page(struct nvme_dev *dev, struct nvme_smart_log **log);
12857dacad5SJay Sternberg int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid,
12957dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
13057dacad5SJay Sternberg int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11,
13157dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
13257dacad5SJay Sternberg 
13357dacad5SJay Sternberg struct sg_io_hdr;
13457dacad5SJay Sternberg 
13557dacad5SJay Sternberg int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr);
13657dacad5SJay Sternberg int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg);
13757dacad5SJay Sternberg int nvme_sg_get_version_num(int __user *ip);
13857dacad5SJay Sternberg 
139ca064085SMatias Bjørling int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
140ca064085SMatias Bjørling int nvme_nvm_register(struct request_queue *q, char *disk_name);
141ca064085SMatias Bjørling void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
142ca064085SMatias Bjørling 
14357dacad5SJay Sternberg #endif /* _NVME_H */
144