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