xref: /openbmc/linux/drivers/nvme/host/nvme.h (revision 1c63dc66)
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 
33*1c63dc66SChristoph Hellwig struct nvme_ctrl {
34*1c63dc66SChristoph Hellwig 	const struct nvme_ctrl_ops *ops;
3557dacad5SJay Sternberg 	struct request_queue *admin_q;
3657dacad5SJay Sternberg 	struct device *dev;
3757dacad5SJay Sternberg 	int instance;
38*1c63dc66SChristoph Hellwig 
3957dacad5SJay Sternberg 	char name[12];
4057dacad5SJay Sternberg 	char serial[20];
4157dacad5SJay Sternberg 	char model[40];
4257dacad5SJay Sternberg 	char firmware_rev[8];
4357dacad5SJay Sternberg 	u16 oncs;
4457dacad5SJay Sternberg 	u16 abort_limit;
4557dacad5SJay Sternberg 	u8 event_limit;
4657dacad5SJay Sternberg 	u8 vwc;
4757dacad5SJay Sternberg };
4857dacad5SJay Sternberg 
4957dacad5SJay Sternberg /*
5057dacad5SJay Sternberg  * An NVM Express namespace is equivalent to a SCSI LUN
5157dacad5SJay Sternberg  */
5257dacad5SJay Sternberg struct nvme_ns {
5357dacad5SJay Sternberg 	struct list_head list;
5457dacad5SJay Sternberg 
55*1c63dc66SChristoph Hellwig 	struct nvme_ctrl *ctrl;
5657dacad5SJay Sternberg 	struct request_queue *queue;
5757dacad5SJay Sternberg 	struct gendisk *disk;
5857dacad5SJay Sternberg 	struct kref kref;
5957dacad5SJay Sternberg 
6057dacad5SJay Sternberg 	unsigned ns_id;
6157dacad5SJay Sternberg 	int lba_shift;
6257dacad5SJay Sternberg 	u16 ms;
6357dacad5SJay Sternberg 	bool ext;
6457dacad5SJay Sternberg 	u8 pi_type;
65ca064085SMatias Bjørling 	int type;
6657dacad5SJay Sternberg 	u64 mode_select_num_blocks;
6757dacad5SJay Sternberg 	u32 mode_select_block_len;
6857dacad5SJay Sternberg };
6957dacad5SJay Sternberg 
70*1c63dc66SChristoph Hellwig struct nvme_ctrl_ops {
71*1c63dc66SChristoph Hellwig 	int (*reg_read32)(struct nvme_ctrl *ctrl, u32 off, u32 *val);
72*1c63dc66SChristoph Hellwig };
73*1c63dc66SChristoph Hellwig 
74*1c63dc66SChristoph Hellwig static inline bool nvme_ctrl_ready(struct nvme_ctrl *ctrl)
75*1c63dc66SChristoph Hellwig {
76*1c63dc66SChristoph Hellwig 	u32 val = 0;
77*1c63dc66SChristoph Hellwig 
78*1c63dc66SChristoph Hellwig 	if (ctrl->ops->reg_read32(ctrl, NVME_REG_CSTS, &val))
79*1c63dc66SChristoph Hellwig 		return false;
80*1c63dc66SChristoph Hellwig 	return val & NVME_CSTS_RDY;
81*1c63dc66SChristoph Hellwig }
82*1c63dc66SChristoph Hellwig 
8357dacad5SJay Sternberg static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector)
8457dacad5SJay Sternberg {
8557dacad5SJay Sternberg 	return (sector >> (ns->lba_shift - 9));
8657dacad5SJay Sternberg }
8757dacad5SJay Sternberg 
8857dacad5SJay Sternberg int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
8957dacad5SJay Sternberg 		void *buf, unsigned bufflen);
9057dacad5SJay Sternberg int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
9157dacad5SJay Sternberg 		void *buffer, void __user *ubuffer, unsigned bufflen,
9257dacad5SJay Sternberg 		u32 *result, unsigned timeout);
93*1c63dc66SChristoph Hellwig int nvme_identify_ctrl(struct nvme_ctrl *dev, struct nvme_id_ctrl **id);
94*1c63dc66SChristoph Hellwig int nvme_identify_ns(struct nvme_ctrl *dev, unsigned nsid,
9557dacad5SJay Sternberg 		struct nvme_id_ns **id);
96*1c63dc66SChristoph Hellwig int nvme_get_log_page(struct nvme_ctrl *dev, struct nvme_smart_log **log);
97*1c63dc66SChristoph Hellwig int nvme_get_features(struct nvme_ctrl *dev, unsigned fid, unsigned nsid,
9857dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
99*1c63dc66SChristoph Hellwig int nvme_set_features(struct nvme_ctrl *dev, unsigned fid, unsigned dword11,
10057dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
10157dacad5SJay Sternberg 
10257dacad5SJay Sternberg struct sg_io_hdr;
10357dacad5SJay Sternberg 
10457dacad5SJay Sternberg int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr);
10557dacad5SJay Sternberg int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg);
10657dacad5SJay Sternberg int nvme_sg_get_version_num(int __user *ip);
10757dacad5SJay Sternberg 
108ca064085SMatias Bjørling int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
109ca064085SMatias Bjørling int nvme_nvm_register(struct request_queue *q, char *disk_name);
110ca064085SMatias Bjørling void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
111ca064085SMatias Bjørling 
11257dacad5SJay Sternberg #endif /* _NVME_H */
113