diff options
Diffstat (limited to 'drivers/block/mtip32xx/mtip32xx.h')
-rw-r--r-- | drivers/block/mtip32xx/mtip32xx.h | 423 |
1 files changed, 423 insertions, 0 deletions
diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h new file mode 100644 index 00000000000..723d7c4946d --- /dev/null +++ b/drivers/block/mtip32xx/mtip32xx.h | |||
@@ -0,0 +1,423 @@ | |||
1 | /* | ||
2 | * mtip32xx.h - Header file for the P320 SSD Block Driver | ||
3 | * Copyright (C) 2011 Micron Technology, Inc. | ||
4 | * | ||
5 | * Portions of this code were derived from works subjected to the | ||
6 | * following copyright: | ||
7 | * Copyright (C) 2009 Integrated Device Technology, Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #ifndef __MTIP32XX_H__ | ||
22 | #define __MTIP32XX_H__ | ||
23 | |||
24 | #include <linux/spinlock.h> | ||
25 | #include <linux/rwsem.h> | ||
26 | #include <linux/ata.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | #include <linux/genhd.h> | ||
29 | #include <linux/version.h> | ||
30 | |||
31 | /* Offset of Subsystem Device ID in pci confoguration space */ | ||
32 | #define PCI_SUBSYSTEM_DEVICEID 0x2E | ||
33 | |||
34 | /* offset of Device Control register in PCIe extended capabilites space */ | ||
35 | #define PCIE_CONFIG_EXT_DEVICE_CONTROL_OFFSET 0x48 | ||
36 | |||
37 | /* # of times to retry timed out IOs */ | ||
38 | #define MTIP_MAX_RETRIES 5 | ||
39 | |||
40 | /* Various timeout values in ms */ | ||
41 | #define MTIP_NCQ_COMMAND_TIMEOUT_MS 5000 | ||
42 | #define MTIP_IOCTL_COMMAND_TIMEOUT_MS 5000 | ||
43 | #define MTIP_INTERNAL_COMMAND_TIMEOUT_MS 5000 | ||
44 | |||
45 | /* check for timeouts every 500ms */ | ||
46 | #define MTIP_TIMEOUT_CHECK_PERIOD 500 | ||
47 | |||
48 | /* ftl rebuild */ | ||
49 | #define MTIP_FTL_REBUILD_OFFSET 142 | ||
50 | #define MTIP_FTL_REBUILD_MAGIC 0xED51 | ||
51 | #define MTIP_FTL_REBUILD_TIMEOUT_MS 2400000 | ||
52 | |||
53 | /* Macro to extract the tag bit number from a tag value. */ | ||
54 | #define MTIP_TAG_BIT(tag) (tag & 0x1F) | ||
55 | |||
56 | /* | ||
57 | * Macro to extract the tag index from a tag value. The index | ||
58 | * is used to access the correct s_active/Command Issue register based | ||
59 | * on the tag value. | ||
60 | */ | ||
61 | #define MTIP_TAG_INDEX(tag) (tag >> 5) | ||
62 | |||
63 | /* | ||
64 | * Maximum number of scatter gather entries | ||
65 | * a single command may have. | ||
66 | */ | ||
67 | #define MTIP_MAX_SG 128 | ||
68 | |||
69 | /* | ||
70 | * Maximum number of slot groups (Command Issue & s_active registers) | ||
71 | * NOTE: This is the driver maximum; check dd->slot_groups for actual value. | ||
72 | */ | ||
73 | #define MTIP_MAX_SLOT_GROUPS 8 | ||
74 | |||
75 | /* Internal command tag. */ | ||
76 | #define MTIP_TAG_INTERNAL 0 | ||
77 | |||
78 | /* Micron Vendor ID & P320x SSD Device ID */ | ||
79 | #define PCI_VENDOR_ID_MICRON 0x1344 | ||
80 | #define P320_DEVICE_ID 0x5150 | ||
81 | |||
82 | /* Driver name and version strings */ | ||
83 | #define MTIP_DRV_NAME "mtip32xx" | ||
84 | #define MTIP_DRV_VERSION "1.2.6os3" | ||
85 | |||
86 | /* Maximum number of minor device numbers per device. */ | ||
87 | #define MTIP_MAX_MINORS 16 | ||
88 | |||
89 | /* Maximum number of supported command slots. */ | ||
90 | #define MTIP_MAX_COMMAND_SLOTS (MTIP_MAX_SLOT_GROUPS * 32) | ||
91 | |||
92 | /* | ||
93 | * Per-tag bitfield size in longs. | ||
94 | * Linux bit manipulation functions | ||
95 | * (i.e. test_and_set_bit, find_next_zero_bit) | ||
96 | * manipulate memory in longs, so we try to make the math work. | ||
97 | * take the slot groups and find the number of longs, rounding up. | ||
98 | * Careful! i386 and x86_64 use different size longs! | ||
99 | */ | ||
100 | #define U32_PER_LONG (sizeof(long) / sizeof(u32)) | ||
101 | #define SLOTBITS_IN_LONGS ((MTIP_MAX_SLOT_GROUPS + \ | ||
102 | (U32_PER_LONG-1))/U32_PER_LONG) | ||
103 | |||
104 | /* BAR number used to access the HBA registers. */ | ||
105 | #define MTIP_ABAR 5 | ||
106 | |||
107 | /* Forced Unit Access Bit */ | ||
108 | #define FUA_BIT 0x80 | ||
109 | |||
110 | #ifdef DEBUG | ||
111 | #define dbg_printk(format, arg...) \ | ||
112 | printk(pr_fmt(format), ##arg); | ||
113 | #else | ||
114 | #define dbg_printk(format, arg...) | ||
115 | #endif | ||
116 | |||
117 | #define __force_bit2int (unsigned int __force) | ||
118 | |||
119 | /* below are bit numbers in 'flags' defined in mtip_port */ | ||
120 | #define MTIP_FLAG_IC_ACTIVE_BIT 0 | ||
121 | #define MTIP_FLAG_EH_ACTIVE_BIT 1 | ||
122 | #define MTIP_FLAG_SVC_THD_ACTIVE_BIT 2 | ||
123 | #define MTIP_FLAG_ISSUE_CMDS_BIT 4 | ||
124 | #define MTIP_FLAG_REBUILD_BIT 5 | ||
125 | #define MTIP_FLAG_SVC_THD_SHOULD_STOP_BIT 8 | ||
126 | |||
127 | /* Register Frame Information Structure (FIS), host to device. */ | ||
128 | struct host_to_dev_fis { | ||
129 | /* | ||
130 | * FIS type. | ||
131 | * - 27h Register FIS, host to device. | ||
132 | * - 34h Register FIS, device to host. | ||
133 | * - 39h DMA Activate FIS, device to host. | ||
134 | * - 41h DMA Setup FIS, bi-directional. | ||
135 | * - 46h Data FIS, bi-directional. | ||
136 | * - 58h BIST Activate FIS, bi-directional. | ||
137 | * - 5Fh PIO Setup FIS, device to host. | ||
138 | * - A1h Set Device Bits FIS, device to host. | ||
139 | */ | ||
140 | unsigned char type; | ||
141 | unsigned char opts; | ||
142 | unsigned char command; | ||
143 | unsigned char features; | ||
144 | |||
145 | union { | ||
146 | unsigned char lba_low; | ||
147 | unsigned char sector; | ||
148 | }; | ||
149 | union { | ||
150 | unsigned char lba_mid; | ||
151 | unsigned char cyl_low; | ||
152 | }; | ||
153 | union { | ||
154 | unsigned char lba_hi; | ||
155 | unsigned char cyl_hi; | ||
156 | }; | ||
157 | union { | ||
158 | unsigned char device; | ||
159 | unsigned char head; | ||
160 | }; | ||
161 | |||
162 | union { | ||
163 | unsigned char lba_low_ex; | ||
164 | unsigned char sector_ex; | ||
165 | }; | ||
166 | union { | ||
167 | unsigned char lba_mid_ex; | ||
168 | unsigned char cyl_low_ex; | ||
169 | }; | ||
170 | union { | ||
171 | unsigned char lba_hi_ex; | ||
172 | unsigned char cyl_hi_ex; | ||
173 | }; | ||
174 | unsigned char features_ex; | ||
175 | |||
176 | unsigned char sect_count; | ||
177 | unsigned char sect_cnt_ex; | ||
178 | unsigned char res2; | ||
179 | unsigned char control; | ||
180 | |||
181 | unsigned int res3; | ||
182 | }; | ||
183 | |||
184 | /* Command header structure. */ | ||
185 | struct mtip_cmd_hdr { | ||
186 | /* | ||
187 | * Command options. | ||
188 | * - Bits 31:16 Number of PRD entries. | ||
189 | * - Bits 15:8 Unused in this implementation. | ||
190 | * - Bit 7 Prefetch bit, informs the drive to prefetch PRD entries. | ||
191 | * - Bit 6 Write bit, should be set when writing data to the device. | ||
192 | * - Bit 5 Unused in this implementation. | ||
193 | * - Bits 4:0 Length of the command FIS in DWords (DWord = 4 bytes). | ||
194 | */ | ||
195 | unsigned int opts; | ||
196 | /* This field is unsed when using NCQ. */ | ||
197 | union { | ||
198 | unsigned int byte_count; | ||
199 | unsigned int status; | ||
200 | }; | ||
201 | /* | ||
202 | * Lower 32 bits of the command table address associated with this | ||
203 | * header. The command table addresses must be 128 byte aligned. | ||
204 | */ | ||
205 | unsigned int ctba; | ||
206 | /* | ||
207 | * If 64 bit addressing is used this field is the upper 32 bits | ||
208 | * of the command table address associated with this command. | ||
209 | */ | ||
210 | unsigned int ctbau; | ||
211 | /* Reserved and unused. */ | ||
212 | unsigned int res[4]; | ||
213 | }; | ||
214 | |||
215 | /* Command scatter gather structure (PRD). */ | ||
216 | struct mtip_cmd_sg { | ||
217 | /* | ||
218 | * Low 32 bits of the data buffer address. For P320 this | ||
219 | * address must be 8 byte aligned signified by bits 2:0 being | ||
220 | * set to 0. | ||
221 | */ | ||
222 | unsigned int dba; | ||
223 | /* | ||
224 | * When 64 bit addressing is used this field is the upper | ||
225 | * 32 bits of the data buffer address. | ||
226 | */ | ||
227 | unsigned int dba_upper; | ||
228 | /* Unused. */ | ||
229 | unsigned int reserved; | ||
230 | /* | ||
231 | * Bit 31: interrupt when this data block has been transferred. | ||
232 | * Bits 30..22: reserved | ||
233 | * Bits 21..0: byte count (minus 1). For P320 the byte count must be | ||
234 | * 8 byte aligned signified by bits 2:0 being set to 1. | ||
235 | */ | ||
236 | unsigned int info; | ||
237 | }; | ||
238 | struct mtip_port; | ||
239 | |||
240 | /* Structure used to describe a command. */ | ||
241 | struct mtip_cmd { | ||
242 | |||
243 | struct mtip_cmd_hdr *command_header; /* ptr to command header entry */ | ||
244 | |||
245 | dma_addr_t command_header_dma; /* corresponding physical address */ | ||
246 | |||
247 | void *command; /* ptr to command table entry */ | ||
248 | |||
249 | dma_addr_t command_dma; /* corresponding physical address */ | ||
250 | |||
251 | void *comp_data; /* data passed to completion function comp_func() */ | ||
252 | /* | ||
253 | * Completion function called by the ISR upon completion of | ||
254 | * a command. | ||
255 | */ | ||
256 | void (*comp_func)(struct mtip_port *port, | ||
257 | int tag, | ||
258 | void *data, | ||
259 | int status); | ||
260 | /* Additional callback function that may be called by comp_func() */ | ||
261 | void (*async_callback)(void *data, int status); | ||
262 | |||
263 | void *async_data; /* Addl. data passed to async_callback() */ | ||
264 | |||
265 | int scatter_ents; /* Number of scatter list entries used */ | ||
266 | |||
267 | struct scatterlist sg[MTIP_MAX_SG]; /* Scatter list entries */ | ||
268 | |||
269 | int retries; /* The number of retries left for this command. */ | ||
270 | |||
271 | int direction; /* Data transfer direction */ | ||
272 | |||
273 | unsigned long comp_time; /* command completion time, in jiffies */ | ||
274 | |||
275 | atomic_t active; /* declares if this command sent to the drive. */ | ||
276 | }; | ||
277 | |||
278 | /* Structure used to describe a port. */ | ||
279 | struct mtip_port { | ||
280 | /* Pointer back to the driver data for this port. */ | ||
281 | struct driver_data *dd; | ||
282 | /* | ||
283 | * Used to determine if the data pointed to by the | ||
284 | * identify field is valid. | ||
285 | */ | ||
286 | unsigned long identify_valid; | ||
287 | /* Base address of the memory mapped IO for the port. */ | ||
288 | void __iomem *mmio; | ||
289 | /* Array of pointers to the memory mapped s_active registers. */ | ||
290 | void __iomem *s_active[MTIP_MAX_SLOT_GROUPS]; | ||
291 | /* Array of pointers to the memory mapped completed registers. */ | ||
292 | void __iomem *completed[MTIP_MAX_SLOT_GROUPS]; | ||
293 | /* Array of pointers to the memory mapped Command Issue registers. */ | ||
294 | void __iomem *cmd_issue[MTIP_MAX_SLOT_GROUPS]; | ||
295 | /* | ||
296 | * Pointer to the beginning of the command header memory as used | ||
297 | * by the driver. | ||
298 | */ | ||
299 | void *command_list; | ||
300 | /* | ||
301 | * Pointer to the beginning of the command header memory as used | ||
302 | * by the DMA. | ||
303 | */ | ||
304 | dma_addr_t command_list_dma; | ||
305 | /* | ||
306 | * Pointer to the beginning of the RX FIS memory as used | ||
307 | * by the driver. | ||
308 | */ | ||
309 | void *rxfis; | ||
310 | /* | ||
311 | * Pointer to the beginning of the RX FIS memory as used | ||
312 | * by the DMA. | ||
313 | */ | ||
314 | dma_addr_t rxfis_dma; | ||
315 | /* | ||
316 | * Pointer to the beginning of the command table memory as used | ||
317 | * by the driver. | ||
318 | */ | ||
319 | void *command_table; | ||
320 | /* | ||
321 | * Pointer to the beginning of the command table memory as used | ||
322 | * by the DMA. | ||
323 | */ | ||
324 | dma_addr_t command_tbl_dma; | ||
325 | /* | ||
326 | * Pointer to the beginning of the identify data memory as used | ||
327 | * by the driver. | ||
328 | */ | ||
329 | u16 *identify; | ||
330 | /* | ||
331 | * Pointer to the beginning of the identify data memory as used | ||
332 | * by the DMA. | ||
333 | */ | ||
334 | dma_addr_t identify_dma; | ||
335 | /* | ||
336 | * Pointer to the beginning of a sector buffer that is used | ||
337 | * by the driver when issuing internal commands. | ||
338 | */ | ||
339 | u16 *sector_buffer; | ||
340 | /* | ||
341 | * Pointer to the beginning of a sector buffer that is used | ||
342 | * by the DMA when the driver issues internal commands. | ||
343 | */ | ||
344 | dma_addr_t sector_buffer_dma; | ||
345 | /* | ||
346 | * Bit significant, used to determine if a command slot has | ||
347 | * been allocated. i.e. the slot is in use. Bits are cleared | ||
348 | * when the command slot and all associated data structures | ||
349 | * are no longer needed. | ||
350 | */ | ||
351 | unsigned long allocated[SLOTBITS_IN_LONGS]; | ||
352 | /* | ||
353 | * used to queue commands when an internal command is in progress | ||
354 | * or error handling is active | ||
355 | */ | ||
356 | unsigned long cmds_to_issue[SLOTBITS_IN_LONGS]; | ||
357 | /* | ||
358 | * Array of command slots. Structure includes pointers to the | ||
359 | * command header and command table, and completion function and data | ||
360 | * pointers. | ||
361 | */ | ||
362 | struct mtip_cmd commands[MTIP_MAX_COMMAND_SLOTS]; | ||
363 | /* Used by mtip_service_thread to wait for an event */ | ||
364 | wait_queue_head_t svc_wait; | ||
365 | /* | ||
366 | * indicates the state of the port. Also, helps the service thread | ||
367 | * to determine its action on wake up. | ||
368 | */ | ||
369 | unsigned long flags; | ||
370 | /* | ||
371 | * Timer used to complete commands that have been active for too long. | ||
372 | */ | ||
373 | struct timer_list cmd_timer; | ||
374 | /* | ||
375 | * Semaphore used to block threads if there are no | ||
376 | * command slots available. | ||
377 | */ | ||
378 | struct semaphore cmd_slot; | ||
379 | /* Spinlock for working around command-issue bug. */ | ||
380 | spinlock_t cmd_issue_lock; | ||
381 | }; | ||
382 | |||
383 | /* | ||
384 | * Driver private data structure. | ||
385 | * | ||
386 | * One structure is allocated per probed device. | ||
387 | */ | ||
388 | struct driver_data { | ||
389 | void __iomem *mmio; /* Base address of the HBA registers. */ | ||
390 | |||
391 | int major; /* Major device number. */ | ||
392 | |||
393 | int instance; /* Instance number. First device probed is 0, ... */ | ||
394 | |||
395 | struct gendisk *disk; /* Pointer to our gendisk structure. */ | ||
396 | |||
397 | struct pci_dev *pdev; /* Pointer to the PCI device structure. */ | ||
398 | |||
399 | struct request_queue *queue; /* Our request queue. */ | ||
400 | |||
401 | struct mtip_port *port; /* Pointer to the port data structure. */ | ||
402 | |||
403 | /* Tasklet used to process the bottom half of the ISR. */ | ||
404 | struct tasklet_struct tasklet; | ||
405 | |||
406 | unsigned product_type; /* magic value declaring the product type */ | ||
407 | |||
408 | unsigned slot_groups; /* number of slot groups the product supports */ | ||
409 | |||
410 | atomic_t drv_cleanup_done; /* Atomic variable for SRSI */ | ||
411 | |||
412 | unsigned long index; /* Index to determine the disk name */ | ||
413 | |||
414 | unsigned int ftlrebuildflag; /* FTL rebuild flag */ | ||
415 | |||
416 | atomic_t resumeflag; /* Atomic variable to track suspend/resume */ | ||
417 | |||
418 | atomic_t eh_active; /* Flag for error handling tracking */ | ||
419 | |||
420 | struct task_struct *mtip_svc_handler; /* task_struct of svc thd */ | ||
421 | }; | ||
422 | |||
423 | #endif | ||