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 25ca064085SMatias Bjørling enum { 26ca064085SMatias Bjørling NVME_NS_LBA = 0, 27ca064085SMatias Bjørling NVME_NS_LIGHTNVM = 1, 28ca064085SMatias Bjørling }; 29ca064085SMatias Bjørling 3057dacad5SJay Sternberg /* 3157dacad5SJay Sternberg * Represents an NVM Express device. Each nvme_dev is a PCI function. 3257dacad5SJay Sternberg */ 3357dacad5SJay Sternberg struct nvme_dev { 3457dacad5SJay Sternberg struct list_head node; 3557dacad5SJay Sternberg struct nvme_queue **queues; 3657dacad5SJay Sternberg struct request_queue *admin_q; 3757dacad5SJay Sternberg struct blk_mq_tag_set tagset; 3857dacad5SJay Sternberg struct blk_mq_tag_set admin_tagset; 3957dacad5SJay Sternberg u32 __iomem *dbs; 4057dacad5SJay Sternberg struct device *dev; 4157dacad5SJay Sternberg struct dma_pool *prp_page_pool; 4257dacad5SJay Sternberg struct dma_pool *prp_small_pool; 4357dacad5SJay Sternberg int instance; 4457dacad5SJay Sternberg unsigned queue_count; 4557dacad5SJay Sternberg unsigned online_queues; 4657dacad5SJay Sternberg unsigned max_qid; 4757dacad5SJay Sternberg int q_depth; 4857dacad5SJay Sternberg u32 db_stride; 4957dacad5SJay Sternberg u32 ctrl_config; 5057dacad5SJay Sternberg struct msix_entry *entry; 5157dacad5SJay Sternberg struct nvme_bar __iomem *bar; 5257dacad5SJay Sternberg struct list_head namespaces; 5357dacad5SJay Sternberg struct kref kref; 5457dacad5SJay Sternberg struct device *device; 5557dacad5SJay Sternberg struct work_struct reset_work; 5657dacad5SJay Sternberg struct work_struct probe_work; 5757dacad5SJay Sternberg struct work_struct scan_work; 5857dacad5SJay Sternberg char name[12]; 5957dacad5SJay Sternberg char serial[20]; 6057dacad5SJay Sternberg char model[40]; 6157dacad5SJay Sternberg char firmware_rev[8]; 6257dacad5SJay Sternberg bool subsystem; 6357dacad5SJay Sternberg u32 max_hw_sectors; 6457dacad5SJay Sternberg u32 stripe_size; 6557dacad5SJay Sternberg u32 page_size; 6657dacad5SJay Sternberg void __iomem *cmb; 6757dacad5SJay Sternberg dma_addr_t cmb_dma_addr; 6857dacad5SJay Sternberg u64 cmb_size; 6957dacad5SJay Sternberg u32 cmbsz; 7057dacad5SJay Sternberg u16 oncs; 7157dacad5SJay Sternberg u16 abort_limit; 7257dacad5SJay Sternberg u8 event_limit; 7357dacad5SJay Sternberg u8 vwc; 7457dacad5SJay Sternberg }; 7557dacad5SJay Sternberg 7657dacad5SJay Sternberg /* 7757dacad5SJay Sternberg * An NVM Express namespace is equivalent to a SCSI LUN 7857dacad5SJay Sternberg */ 7957dacad5SJay Sternberg struct nvme_ns { 8057dacad5SJay Sternberg struct list_head list; 8157dacad5SJay Sternberg 8257dacad5SJay Sternberg struct nvme_dev *dev; 8357dacad5SJay Sternberg struct request_queue *queue; 8457dacad5SJay Sternberg struct gendisk *disk; 8557dacad5SJay Sternberg struct kref kref; 8657dacad5SJay Sternberg 8757dacad5SJay Sternberg unsigned ns_id; 8857dacad5SJay Sternberg int lba_shift; 8957dacad5SJay Sternberg u16 ms; 9057dacad5SJay Sternberg bool ext; 9157dacad5SJay Sternberg u8 pi_type; 92ca064085SMatias Bjørling int type; 9357dacad5SJay Sternberg u64 mode_select_num_blocks; 9457dacad5SJay Sternberg u32 mode_select_block_len; 9557dacad5SJay Sternberg }; 9657dacad5SJay Sternberg 9757dacad5SJay Sternberg /* 9857dacad5SJay Sternberg * The nvme_iod describes the data in an I/O, including the list of PRP 9957dacad5SJay Sternberg * entries. You can't see it in this data structure because C doesn't let 10057dacad5SJay Sternberg * me express that. Use nvme_alloc_iod to ensure there's enough space 10157dacad5SJay Sternberg * allocated to store the PRP list. 10257dacad5SJay Sternberg */ 10357dacad5SJay Sternberg struct nvme_iod { 10457dacad5SJay Sternberg unsigned long private; /* For the use of the submitter of the I/O */ 10557dacad5SJay Sternberg int npages; /* In the PRP list. 0 means small pool in use */ 10657dacad5SJay Sternberg int offset; /* Of PRP list */ 10757dacad5SJay Sternberg int nents; /* Used in scatterlist */ 10857dacad5SJay Sternberg int length; /* Of data, in bytes */ 10957dacad5SJay Sternberg dma_addr_t first_dma; 11057dacad5SJay Sternberg struct scatterlist meta_sg[1]; /* metadata requires single contiguous buffer */ 11157dacad5SJay Sternberg struct scatterlist sg[0]; 11257dacad5SJay Sternberg }; 11357dacad5SJay Sternberg 11457dacad5SJay Sternberg static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) 11557dacad5SJay Sternberg { 11657dacad5SJay Sternberg return (sector >> (ns->lba_shift - 9)); 11757dacad5SJay Sternberg } 11857dacad5SJay Sternberg 11957dacad5SJay Sternberg int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, 12057dacad5SJay Sternberg void *buf, unsigned bufflen); 12157dacad5SJay Sternberg int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, 12257dacad5SJay Sternberg void *buffer, void __user *ubuffer, unsigned bufflen, 12357dacad5SJay Sternberg u32 *result, unsigned timeout); 12457dacad5SJay Sternberg int nvme_identify_ctrl(struct nvme_dev *dev, struct nvme_id_ctrl **id); 12557dacad5SJay Sternberg int nvme_identify_ns(struct nvme_dev *dev, unsigned nsid, 12657dacad5SJay Sternberg struct nvme_id_ns **id); 12757dacad5SJay Sternberg int nvme_get_log_page(struct nvme_dev *dev, struct nvme_smart_log **log); 12857dacad5SJay Sternberg int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid, 12957dacad5SJay Sternberg dma_addr_t dma_addr, u32 *result); 13057dacad5SJay Sternberg int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11, 13157dacad5SJay Sternberg dma_addr_t dma_addr, u32 *result); 13257dacad5SJay Sternberg 13357dacad5SJay Sternberg struct sg_io_hdr; 13457dacad5SJay Sternberg 13557dacad5SJay Sternberg int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr); 13657dacad5SJay Sternberg int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg); 13757dacad5SJay Sternberg int nvme_sg_get_version_num(int __user *ip); 13857dacad5SJay Sternberg 139ca064085SMatias Bjørling int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id); 140ca064085SMatias Bjørling int nvme_nvm_register(struct request_queue *q, char *disk_name); 141ca064085SMatias Bjørling void nvme_nvm_unregister(struct request_queue *q, char *disk_name); 142ca064085SMatias Bjørling 14357dacad5SJay Sternberg #endif /* _NVME_H */ 144