xref: /openbmc/linux/drivers/nvme/host/nvme.h (revision 15a190f7)
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 
331c63dc66SChristoph Hellwig struct nvme_ctrl {
341c63dc66SChristoph Hellwig 	const struct nvme_ctrl_ops *ops;
3557dacad5SJay Sternberg 	struct request_queue *admin_q;
3657dacad5SJay Sternberg 	struct device *dev;
3757dacad5SJay Sternberg 	int instance;
381c63dc66SChristoph 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 
551c63dc66SChristoph 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 
701c63dc66SChristoph Hellwig struct nvme_ctrl_ops {
711c63dc66SChristoph Hellwig 	int (*reg_read32)(struct nvme_ctrl *ctrl, u32 off, u32 *val);
721c63dc66SChristoph Hellwig };
731c63dc66SChristoph Hellwig 
741c63dc66SChristoph Hellwig static inline bool nvme_ctrl_ready(struct nvme_ctrl *ctrl)
751c63dc66SChristoph Hellwig {
761c63dc66SChristoph Hellwig 	u32 val = 0;
771c63dc66SChristoph Hellwig 
781c63dc66SChristoph Hellwig 	if (ctrl->ops->reg_read32(ctrl, NVME_REG_CSTS, &val))
791c63dc66SChristoph Hellwig 		return false;
801c63dc66SChristoph Hellwig 	return val & NVME_CSTS_RDY;
811c63dc66SChristoph Hellwig }
821c63dc66SChristoph 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 
88*15a190f7SChristoph Hellwig static inline int nvme_error_status(u16 status)
89*15a190f7SChristoph Hellwig {
90*15a190f7SChristoph Hellwig 	switch (status & 0x7ff) {
91*15a190f7SChristoph Hellwig 	case NVME_SC_SUCCESS:
92*15a190f7SChristoph Hellwig 		return 0;
93*15a190f7SChristoph Hellwig 	case NVME_SC_CAP_EXCEEDED:
94*15a190f7SChristoph Hellwig 		return -ENOSPC;
95*15a190f7SChristoph Hellwig 	default:
96*15a190f7SChristoph Hellwig 		return -EIO;
97*15a190f7SChristoph Hellwig 	}
98*15a190f7SChristoph Hellwig }
99*15a190f7SChristoph Hellwig 
10057dacad5SJay Sternberg int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
10157dacad5SJay Sternberg 		void *buf, unsigned bufflen);
10257dacad5SJay Sternberg int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
10357dacad5SJay Sternberg 		void *buffer, void __user *ubuffer, unsigned bufflen,
10457dacad5SJay Sternberg 		u32 *result, unsigned timeout);
1051c63dc66SChristoph Hellwig int nvme_identify_ctrl(struct nvme_ctrl *dev, struct nvme_id_ctrl **id);
1061c63dc66SChristoph Hellwig int nvme_identify_ns(struct nvme_ctrl *dev, unsigned nsid,
10757dacad5SJay Sternberg 		struct nvme_id_ns **id);
1081c63dc66SChristoph Hellwig int nvme_get_log_page(struct nvme_ctrl *dev, struct nvme_smart_log **log);
1091c63dc66SChristoph Hellwig int nvme_get_features(struct nvme_ctrl *dev, unsigned fid, unsigned nsid,
11057dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
1111c63dc66SChristoph Hellwig int nvme_set_features(struct nvme_ctrl *dev, unsigned fid, unsigned dword11,
11257dacad5SJay Sternberg 			dma_addr_t dma_addr, u32 *result);
11357dacad5SJay Sternberg 
11457dacad5SJay Sternberg struct sg_io_hdr;
11557dacad5SJay Sternberg 
11657dacad5SJay Sternberg int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr);
11757dacad5SJay Sternberg int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg);
11857dacad5SJay Sternberg int nvme_sg_get_version_num(int __user *ip);
11957dacad5SJay Sternberg 
120ca064085SMatias Bjørling int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
121ca064085SMatias Bjørling int nvme_nvm_register(struct request_queue *q, char *disk_name);
122ca064085SMatias Bjørling void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
123ca064085SMatias Bjørling 
12457dacad5SJay Sternberg #endif /* _NVME_H */
125