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