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