xref: /openbmc/linux/drivers/nvme/host/nvme.h (revision 21d34711)
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 
2521d34711SChristoph Hellwig extern unsigned char admin_timeout;
2621d34711SChristoph Hellwig #define ADMIN_TIMEOUT	(admin_timeout * HZ)
2721d34711SChristoph Hellwig 
28ca064085SMatias Bjørling enum {
29ca064085SMatias Bjørling 	NVME_NS_LBA		= 0,
30ca064085SMatias Bjørling 	NVME_NS_LIGHTNVM	= 1,
31ca064085SMatias Bjørling };
32ca064085SMatias Bjørling 
3357dacad5SJay Sternberg /*
3457dacad5SJay Sternberg  * Represents an NVM Express device.  Each nvme_dev is a PCI function.
3557dacad5SJay Sternberg  */
3657dacad5SJay Sternberg struct nvme_dev {
3757dacad5SJay Sternberg 	struct list_head node;
3857dacad5SJay Sternberg 	struct nvme_queue **queues;
3957dacad5SJay Sternberg 	struct request_queue *admin_q;
4057dacad5SJay Sternberg 	struct blk_mq_tag_set tagset;
4157dacad5SJay Sternberg 	struct blk_mq_tag_set admin_tagset;
4257dacad5SJay Sternberg 	u32 __iomem *dbs;
4357dacad5SJay Sternberg 	struct device *dev;
4457dacad5SJay Sternberg 	struct dma_pool *prp_page_pool;
4557dacad5SJay Sternberg 	struct dma_pool *prp_small_pool;
4657dacad5SJay Sternberg 	int instance;
4757dacad5SJay Sternberg 	unsigned queue_count;
4857dacad5SJay Sternberg 	unsigned online_queues;
4957dacad5SJay Sternberg 	unsigned max_qid;
5057dacad5SJay Sternberg 	int q_depth;
5157dacad5SJay Sternberg 	u32 db_stride;
5257dacad5SJay Sternberg 	u32 ctrl_config;
5357dacad5SJay Sternberg 	struct msix_entry *entry;
5457dacad5SJay Sternberg 	struct nvme_bar __iomem *bar;
5557dacad5SJay Sternberg 	struct list_head namespaces;
5657dacad5SJay Sternberg 	struct kref kref;
5757dacad5SJay Sternberg 	struct device *device;
5857dacad5SJay Sternberg 	struct work_struct reset_work;
5957dacad5SJay Sternberg 	struct work_struct probe_work;
6057dacad5SJay Sternberg 	struct work_struct scan_work;
6157dacad5SJay Sternberg 	char name[12];
6257dacad5SJay Sternberg 	char serial[20];
6357dacad5SJay Sternberg 	char model[40];
6457dacad5SJay Sternberg 	char firmware_rev[8];
6557dacad5SJay Sternberg 	bool subsystem;
6657dacad5SJay Sternberg 	u32 max_hw_sectors;
6757dacad5SJay Sternberg 	u32 stripe_size;
6857dacad5SJay Sternberg 	u32 page_size;
6957dacad5SJay Sternberg 	void __iomem *cmb;
7057dacad5SJay Sternberg 	dma_addr_t cmb_dma_addr;
7157dacad5SJay Sternberg 	u64 cmb_size;
7257dacad5SJay Sternberg 	u32 cmbsz;
7357dacad5SJay Sternberg 	u16 oncs;
7457dacad5SJay Sternberg 	u16 abort_limit;
7557dacad5SJay Sternberg 	u8 event_limit;
7657dacad5SJay Sternberg 	u8 vwc;
7757dacad5SJay Sternberg };
7857dacad5SJay Sternberg 
7957dacad5SJay Sternberg /*
8057dacad5SJay Sternberg  * An NVM Express namespace is equivalent to a SCSI LUN
8157dacad5SJay Sternberg  */
8257dacad5SJay Sternberg struct nvme_ns {
8357dacad5SJay Sternberg 	struct list_head list;
8457dacad5SJay Sternberg 
8557dacad5SJay Sternberg 	struct nvme_dev *dev;
8657dacad5SJay Sternberg 	struct request_queue *queue;
8757dacad5SJay Sternberg 	struct gendisk *disk;
8857dacad5SJay Sternberg 	struct kref kref;
8957dacad5SJay Sternberg 
9057dacad5SJay Sternberg 	unsigned ns_id;
9157dacad5SJay Sternberg 	int lba_shift;
9257dacad5SJay Sternberg 	u16 ms;
9357dacad5SJay Sternberg 	bool ext;
9457dacad5SJay Sternberg 	u8 pi_type;
95ca064085SMatias Bjørling 	int type;
9657dacad5SJay Sternberg 	u64 mode_select_num_blocks;
9757dacad5SJay Sternberg 	u32 mode_select_block_len;
9857dacad5SJay Sternberg };
9957dacad5SJay Sternberg 
10057dacad5SJay Sternberg static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector)
10157dacad5SJay Sternberg {
10257dacad5SJay Sternberg 	return (sector >> (ns->lba_shift - 9));
10357dacad5SJay Sternberg }
10457dacad5SJay Sternberg 
10557dacad5SJay Sternberg int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
10657dacad5SJay Sternberg 		void *buf, unsigned bufflen);
10757dacad5SJay Sternberg int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
10857dacad5SJay Sternberg 		void *buffer, void __user *ubuffer, unsigned bufflen,
10957dacad5SJay Sternberg 		u32 *result, unsigned timeout);
11057dacad5SJay Sternberg int nvme_identify_ctrl(struct nvme_dev *dev, struct nvme_id_ctrl **id);
11157dacad5SJay Sternberg int nvme_identify_ns(struct nvme_dev *dev, unsigned nsid,
11257dacad5SJay Sternberg 		struct nvme_id_ns **id);
11357dacad5SJay Sternberg int nvme_get_log_page(struct nvme_dev *dev, struct nvme_smart_log **log);
11457dacad5SJay Sternberg int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid,
11557dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
11657dacad5SJay Sternberg int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11,
11757dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
11857dacad5SJay Sternberg 
11957dacad5SJay Sternberg struct sg_io_hdr;
12057dacad5SJay Sternberg 
12157dacad5SJay Sternberg int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr);
12257dacad5SJay Sternberg int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg);
12357dacad5SJay Sternberg int nvme_sg_get_version_num(int __user *ip);
12457dacad5SJay Sternberg 
125ca064085SMatias Bjørling int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
126ca064085SMatias Bjørling int nvme_nvm_register(struct request_queue *q, char *disk_name);
127ca064085SMatias Bjørling void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
128ca064085SMatias Bjørling 
12957dacad5SJay Sternberg #endif /* _NVME_H */
130