diff options
author | Christoph Hellwig <hch@lst.de> | 2015-10-03 09:46:41 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-10-09 12:40:37 -0400 |
commit | f11bb3e244c4b14e2d0a3b9d7e41895752997170 (patch) | |
tree | ae9c92c0749b4c399134da4d9fa436e9738e53e3 | |
parent | 2659e57b906562bb020fb093b0c1b670b9700314 (diff) |
nvme: add a local nvme.h header
Add a new drivers/block/nvme.h which contains all the driver internal
interface.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | drivers/block/nvme-core.c | 3 | ||||
-rw-r--r-- | drivers/block/nvme-scsi.c | 2 | ||||
-rw-r--r-- | drivers/block/nvme.h | 133 | ||||
-rw-r--r-- | include/linux/nvme.h | 114 |
4 files changed, 136 insertions, 116 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 01a6d1b2d7e5..a20f66a44b96 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -12,7 +12,6 @@ | |||
12 | * more details. | 12 | * more details. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/nvme.h> | ||
16 | #include <linux/bitops.h> | 15 | #include <linux/bitops.h> |
17 | #include <linux/blkdev.h> | 16 | #include <linux/blkdev.h> |
18 | #include <linux/blk-mq.h> | 17 | #include <linux/blk-mq.h> |
@@ -43,6 +42,8 @@ | |||
43 | #include <scsi/sg.h> | 42 | #include <scsi/sg.h> |
44 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | 43 | #include <asm-generic/io-64-nonatomic-lo-hi.h> |
45 | 44 | ||
45 | #include "nvme.h" | ||
46 | |||
46 | #define NVME_MINORS (1U << MINORBITS) | 47 | #define NVME_MINORS (1U << MINORBITS) |
47 | #define NVME_Q_DEPTH 1024 | 48 | #define NVME_Q_DEPTH 1024 |
48 | #define NVME_AQ_DEPTH 256 | 49 | #define NVME_AQ_DEPTH 256 |
diff --git a/drivers/block/nvme-scsi.c b/drivers/block/nvme-scsi.c index e5a63f06fb0f..c3d8d3887a31 100644 --- a/drivers/block/nvme-scsi.c +++ b/drivers/block/nvme-scsi.c | |||
@@ -17,7 +17,6 @@ | |||
17 | * each command is translated. | 17 | * each command is translated. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/nvme.h> | ||
21 | #include <linux/bio.h> | 20 | #include <linux/bio.h> |
22 | #include <linux/bitops.h> | 21 | #include <linux/bitops.h> |
23 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
@@ -45,6 +44,7 @@ | |||
45 | #include <scsi/sg.h> | 44 | #include <scsi/sg.h> |
46 | #include <scsi/scsi.h> | 45 | #include <scsi/scsi.h> |
47 | 46 | ||
47 | #include "nvme.h" | ||
48 | 48 | ||
49 | static int sg_version_num = 30534; /* 2 digits for each component */ | 49 | static int sg_version_num = 30534; /* 2 digits for each component */ |
50 | 50 | ||
diff --git a/drivers/block/nvme.h b/drivers/block/nvme.h new file mode 100644 index 000000000000..c1f41bf3c0f2 --- /dev/null +++ b/drivers/block/nvme.h | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2011-2014, Intel Corporation. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | */ | ||
13 | |||
14 | #ifndef _NVME_H | ||
15 | #define _NVME_H | ||
16 | |||
17 | #include <linux/nvme.h> | ||
18 | #include <linux/pci.h> | ||
19 | #include <linux/kref.h> | ||
20 | #include <linux/blk-mq.h> | ||
21 | |||
22 | extern unsigned char nvme_io_timeout; | ||
23 | #define NVME_IO_TIMEOUT (nvme_io_timeout * HZ) | ||
24 | |||
25 | /* | ||
26 | * Represents an NVM Express device. Each nvme_dev is a PCI function. | ||
27 | */ | ||
28 | struct nvme_dev { | ||
29 | struct list_head node; | ||
30 | struct nvme_queue **queues; | ||
31 | struct request_queue *admin_q; | ||
32 | struct blk_mq_tag_set tagset; | ||
33 | struct blk_mq_tag_set admin_tagset; | ||
34 | u32 __iomem *dbs; | ||
35 | struct device *dev; | ||
36 | struct dma_pool *prp_page_pool; | ||
37 | struct dma_pool *prp_small_pool; | ||
38 | int instance; | ||
39 | unsigned queue_count; | ||
40 | unsigned online_queues; | ||
41 | unsigned max_qid; | ||
42 | int q_depth; | ||
43 | u32 db_stride; | ||
44 | u32 ctrl_config; | ||
45 | struct msix_entry *entry; | ||
46 | struct nvme_bar __iomem *bar; | ||
47 | struct list_head namespaces; | ||
48 | struct kref kref; | ||
49 | struct device *device; | ||
50 | struct work_struct reset_work; | ||
51 | struct work_struct probe_work; | ||
52 | struct work_struct scan_work; | ||
53 | char name[12]; | ||
54 | char serial[20]; | ||
55 | char model[40]; | ||
56 | char firmware_rev[8]; | ||
57 | bool subsystem; | ||
58 | u32 max_hw_sectors; | ||
59 | u32 stripe_size; | ||
60 | u32 page_size; | ||
61 | void __iomem *cmb; | ||
62 | dma_addr_t cmb_dma_addr; | ||
63 | u64 cmb_size; | ||
64 | u32 cmbsz; | ||
65 | u16 oncs; | ||
66 | u16 abort_limit; | ||
67 | u8 event_limit; | ||
68 | u8 vwc; | ||
69 | }; | ||
70 | |||
71 | /* | ||
72 | * An NVM Express namespace is equivalent to a SCSI LUN | ||
73 | */ | ||
74 | struct nvme_ns { | ||
75 | struct list_head list; | ||
76 | |||
77 | struct nvme_dev *dev; | ||
78 | struct request_queue *queue; | ||
79 | struct gendisk *disk; | ||
80 | struct kref kref; | ||
81 | |||
82 | unsigned ns_id; | ||
83 | int lba_shift; | ||
84 | u16 ms; | ||
85 | bool ext; | ||
86 | u8 pi_type; | ||
87 | u64 mode_select_num_blocks; | ||
88 | u32 mode_select_block_len; | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * The nvme_iod describes the data in an I/O, including the list of PRP | ||
93 | * entries. You can't see it in this data structure because C doesn't let | ||
94 | * me express that. Use nvme_alloc_iod to ensure there's enough space | ||
95 | * allocated to store the PRP list. | ||
96 | */ | ||
97 | struct nvme_iod { | ||
98 | unsigned long private; /* For the use of the submitter of the I/O */ | ||
99 | int npages; /* In the PRP list. 0 means small pool in use */ | ||
100 | int offset; /* Of PRP list */ | ||
101 | int nents; /* Used in scatterlist */ | ||
102 | int length; /* Of data, in bytes */ | ||
103 | dma_addr_t first_dma; | ||
104 | struct scatterlist meta_sg[1]; /* metadata requires single contiguous buffer */ | ||
105 | struct scatterlist sg[0]; | ||
106 | }; | ||
107 | |||
108 | static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) | ||
109 | { | ||
110 | return (sector >> (ns->lba_shift - 9)); | ||
111 | } | ||
112 | |||
113 | int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, | ||
114 | void *buf, unsigned bufflen); | ||
115 | int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, | ||
116 | void *buffer, void __user *ubuffer, unsigned bufflen, | ||
117 | u32 *result, unsigned timeout); | ||
118 | int nvme_identify_ctrl(struct nvme_dev *dev, struct nvme_id_ctrl **id); | ||
119 | int nvme_identify_ns(struct nvme_dev *dev, unsigned nsid, | ||
120 | struct nvme_id_ns **id); | ||
121 | int nvme_get_log_page(struct nvme_dev *dev, struct nvme_smart_log **log); | ||
122 | int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid, | ||
123 | dma_addr_t dma_addr, u32 *result); | ||
124 | int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11, | ||
125 | dma_addr_t dma_addr, u32 *result); | ||
126 | |||
127 | struct sg_io_hdr; | ||
128 | |||
129 | int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr); | ||
130 | int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg); | ||
131 | int nvme_sg_get_version_num(int __user *ip); | ||
132 | |||
133 | #endif /* _NVME_H */ | ||
diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 7725b4c8b718..364cb9adbbbc 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h | |||
@@ -16,9 +16,6 @@ | |||
16 | #define _LINUX_NVME_H | 16 | #define _LINUX_NVME_H |
17 | 17 | ||
18 | #include <uapi/linux/nvme.h> | 18 | #include <uapi/linux/nvme.h> |
19 | #include <linux/pci.h> | ||
20 | #include <linux/kref.h> | ||
21 | #include <linux/blk-mq.h> | ||
22 | 19 | ||
23 | struct nvme_bar { | 20 | struct nvme_bar { |
24 | __u64 cap; /* Controller Capabilities */ | 21 | __u64 cap; /* Controller Capabilities */ |
@@ -76,115 +73,4 @@ enum { | |||
76 | NVME_CSTS_SHST_MASK = 3 << 2, | 73 | NVME_CSTS_SHST_MASK = 3 << 2, |
77 | }; | 74 | }; |
78 | 75 | ||
79 | extern unsigned char nvme_io_timeout; | ||
80 | #define NVME_IO_TIMEOUT (nvme_io_timeout * HZ) | ||
81 | |||
82 | /* | ||
83 | * Represents an NVM Express device. Each nvme_dev is a PCI function. | ||
84 | */ | ||
85 | struct nvme_dev { | ||
86 | struct list_head node; | ||
87 | struct nvme_queue **queues; | ||
88 | struct request_queue *admin_q; | ||
89 | struct blk_mq_tag_set tagset; | ||
90 | struct blk_mq_tag_set admin_tagset; | ||
91 | u32 __iomem *dbs; | ||
92 | struct device *dev; | ||
93 | struct dma_pool *prp_page_pool; | ||
94 | struct dma_pool *prp_small_pool; | ||
95 | int instance; | ||
96 | unsigned queue_count; | ||
97 | unsigned online_queues; | ||
98 | unsigned max_qid; | ||
99 | int q_depth; | ||
100 | u32 db_stride; | ||
101 | u32 ctrl_config; | ||
102 | struct msix_entry *entry; | ||
103 | struct nvme_bar __iomem *bar; | ||
104 | struct list_head namespaces; | ||
105 | struct kref kref; | ||
106 | struct device *device; | ||
107 | struct work_struct reset_work; | ||
108 | struct work_struct probe_work; | ||
109 | struct work_struct scan_work; | ||
110 | char name[12]; | ||
111 | char serial[20]; | ||
112 | char model[40]; | ||
113 | char firmware_rev[8]; | ||
114 | bool subsystem; | ||
115 | u32 max_hw_sectors; | ||
116 | u32 stripe_size; | ||
117 | u32 page_size; | ||
118 | void __iomem *cmb; | ||
119 | dma_addr_t cmb_dma_addr; | ||
120 | u64 cmb_size; | ||
121 | u32 cmbsz; | ||
122 | u16 oncs; | ||
123 | u16 abort_limit; | ||
124 | u8 event_limit; | ||
125 | u8 vwc; | ||
126 | }; | ||
127 | |||
128 | /* | ||
129 | * An NVM Express namespace is equivalent to a SCSI LUN | ||
130 | */ | ||
131 | struct nvme_ns { | ||
132 | struct list_head list; | ||
133 | |||
134 | struct nvme_dev *dev; | ||
135 | struct request_queue *queue; | ||
136 | struct gendisk *disk; | ||
137 | struct kref kref; | ||
138 | |||
139 | unsigned ns_id; | ||
140 | int lba_shift; | ||
141 | u16 ms; | ||
142 | bool ext; | ||
143 | u8 pi_type; | ||
144 | u64 mode_select_num_blocks; | ||
145 | u32 mode_select_block_len; | ||
146 | }; | ||
147 | |||
148 | /* | ||
149 | * The nvme_iod describes the data in an I/O, including the list of PRP | ||
150 | * entries. You can't see it in this data structure because C doesn't let | ||
151 | * me express that. Use nvme_alloc_iod to ensure there's enough space | ||
152 | * allocated to store the PRP list. | ||
153 | */ | ||
154 | struct nvme_iod { | ||
155 | unsigned long private; /* For the use of the submitter of the I/O */ | ||
156 | int npages; /* In the PRP list. 0 means small pool in use */ | ||
157 | int offset; /* Of PRP list */ | ||
158 | int nents; /* Used in scatterlist */ | ||
159 | int length; /* Of data, in bytes */ | ||
160 | dma_addr_t first_dma; | ||
161 | struct scatterlist meta_sg[1]; /* metadata requires single contiguous buffer */ | ||
162 | struct scatterlist sg[0]; | ||
163 | }; | ||
164 | |||
165 | static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector) | ||
166 | { | ||
167 | return (sector >> (ns->lba_shift - 9)); | ||
168 | } | ||
169 | |||
170 | int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, | ||
171 | void *buf, unsigned bufflen); | ||
172 | int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, | ||
173 | void *buffer, void __user *ubuffer, unsigned bufflen, | ||
174 | u32 *result, unsigned timeout); | ||
175 | int nvme_identify_ctrl(struct nvme_dev *dev, struct nvme_id_ctrl **id); | ||
176 | int nvme_identify_ns(struct nvme_dev *dev, unsigned nsid, | ||
177 | struct nvme_id_ns **id); | ||
178 | int nvme_get_log_page(struct nvme_dev *dev, struct nvme_smart_log **log); | ||
179 | int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid, | ||
180 | dma_addr_t dma_addr, u32 *result); | ||
181 | int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11, | ||
182 | dma_addr_t dma_addr, u32 *result); | ||
183 | |||
184 | struct sg_io_hdr; | ||
185 | |||
186 | int nvme_sg_io(struct nvme_ns *ns, struct sg_io_hdr __user *u_hdr); | ||
187 | int nvme_sg_io32(struct nvme_ns *ns, unsigned long arg); | ||
188 | int nvme_sg_get_version_num(int __user *ip); | ||
189 | |||
190 | #endif /* _LINUX_NVME_H */ | 76 | #endif /* _LINUX_NVME_H */ |