diff options
Diffstat (limited to 'include/linux/lightnvm.h')
-rw-r--r-- | include/linux/lightnvm.h | 125 |
1 files changed, 38 insertions, 87 deletions
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 2d1d9de06728..7f4b60abdf27 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h | |||
@@ -50,10 +50,7 @@ struct nvm_id; | |||
50 | struct nvm_dev; | 50 | struct nvm_dev; |
51 | struct nvm_tgt_dev; | 51 | struct nvm_tgt_dev; |
52 | 52 | ||
53 | typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); | ||
54 | typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *); | 53 | typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *); |
55 | typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32, | ||
56 | nvm_l2p_update_fn *, void *); | ||
57 | typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, u8 *); | 54 | typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, u8 *); |
58 | typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct ppa_addr *, int, int); | 55 | typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct ppa_addr *, int, int); |
59 | typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); | 56 | typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); |
@@ -66,7 +63,6 @@ typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); | |||
66 | 63 | ||
67 | struct nvm_dev_ops { | 64 | struct nvm_dev_ops { |
68 | nvm_id_fn *identity; | 65 | nvm_id_fn *identity; |
69 | nvm_get_l2p_tbl_fn *get_l2p_tbl; | ||
70 | nvm_op_bb_tbl_fn *get_bb_tbl; | 66 | nvm_op_bb_tbl_fn *get_bb_tbl; |
71 | nvm_op_set_bb_fn *set_bb_tbl; | 67 | nvm_op_set_bb_fn *set_bb_tbl; |
72 | 68 | ||
@@ -112,8 +108,6 @@ enum { | |||
112 | NVM_RSP_WARN_HIGHECC = 0x4700, | 108 | NVM_RSP_WARN_HIGHECC = 0x4700, |
113 | 109 | ||
114 | /* Device opcodes */ | 110 | /* Device opcodes */ |
115 | NVM_OP_HBREAD = 0x02, | ||
116 | NVM_OP_HBWRITE = 0x81, | ||
117 | NVM_OP_PWRITE = 0x91, | 111 | NVM_OP_PWRITE = 0x91, |
118 | NVM_OP_PREAD = 0x92, | 112 | NVM_OP_PREAD = 0x92, |
119 | NVM_OP_ERASE = 0x90, | 113 | NVM_OP_ERASE = 0x90, |
@@ -165,12 +159,16 @@ struct nvm_id_group { | |||
165 | u8 fmtype; | 159 | u8 fmtype; |
166 | u8 num_ch; | 160 | u8 num_ch; |
167 | u8 num_lun; | 161 | u8 num_lun; |
168 | u8 num_pln; | 162 | u16 num_chk; |
169 | u16 num_blk; | 163 | u16 clba; |
170 | u16 num_pg; | ||
171 | u16 fpg_sz; | ||
172 | u16 csecs; | 164 | u16 csecs; |
173 | u16 sos; | 165 | u16 sos; |
166 | |||
167 | u16 ws_min; | ||
168 | u16 ws_opt; | ||
169 | u16 ws_seq; | ||
170 | u16 ws_per_chk; | ||
171 | |||
174 | u32 trdt; | 172 | u32 trdt; |
175 | u32 trdm; | 173 | u32 trdm; |
176 | u32 tprt; | 174 | u32 tprt; |
@@ -181,7 +179,10 @@ struct nvm_id_group { | |||
181 | u32 mccap; | 179 | u32 mccap; |
182 | u16 cpar; | 180 | u16 cpar; |
183 | 181 | ||
184 | struct nvm_id_lp_tbl lptbl; | 182 | /* 1.2 compatibility */ |
183 | u8 num_pln; | ||
184 | u16 num_pg; | ||
185 | u16 fpg_sz; | ||
185 | }; | 186 | }; |
186 | 187 | ||
187 | struct nvm_addr_format { | 188 | struct nvm_addr_format { |
@@ -217,6 +218,10 @@ struct nvm_target { | |||
217 | 218 | ||
218 | #define ADDR_EMPTY (~0ULL) | 219 | #define ADDR_EMPTY (~0ULL) |
219 | 220 | ||
221 | #define NVM_TARGET_DEFAULT_OP (101) | ||
222 | #define NVM_TARGET_MIN_OP (3) | ||
223 | #define NVM_TARGET_MAX_OP (80) | ||
224 | |||
220 | #define NVM_VERSION_MAJOR 1 | 225 | #define NVM_VERSION_MAJOR 1 |
221 | #define NVM_VERSION_MINOR 0 | 226 | #define NVM_VERSION_MINOR 0 |
222 | #define NVM_VERSION_PATCH 0 | 227 | #define NVM_VERSION_PATCH 0 |
@@ -239,7 +244,6 @@ struct nvm_rq { | |||
239 | void *meta_list; | 244 | void *meta_list; |
240 | dma_addr_t dma_meta_list; | 245 | dma_addr_t dma_meta_list; |
241 | 246 | ||
242 | struct completion *wait; | ||
243 | nvm_end_io_fn *end_io; | 247 | nvm_end_io_fn *end_io; |
244 | 248 | ||
245 | uint8_t opcode; | 249 | uint8_t opcode; |
@@ -268,31 +272,38 @@ enum { | |||
268 | NVM_BLK_ST_BAD = 0x8, /* Bad block */ | 272 | NVM_BLK_ST_BAD = 0x8, /* Bad block */ |
269 | }; | 273 | }; |
270 | 274 | ||
275 | |||
271 | /* Device generic information */ | 276 | /* Device generic information */ |
272 | struct nvm_geo { | 277 | struct nvm_geo { |
278 | /* generic geometry */ | ||
273 | int nr_chnls; | 279 | int nr_chnls; |
274 | int nr_luns; | 280 | int all_luns; /* across channels */ |
275 | int luns_per_chnl; /* -1 if channels are not symmetric */ | 281 | int nr_luns; /* per channel */ |
276 | int nr_planes; | 282 | int nr_chks; /* per lun */ |
277 | int sec_per_pg; /* only sectors for a single page */ | 283 | |
278 | int pgs_per_blk; | ||
279 | int blks_per_lun; | ||
280 | int fpg_size; | ||
281 | int pfpg_size; /* size of buffer if all pages are to be read */ | ||
282 | int sec_size; | 284 | int sec_size; |
283 | int oob_size; | 285 | int oob_size; |
284 | int mccap; | 286 | int mccap; |
285 | struct nvm_addr_format ppaf; | ||
286 | 287 | ||
287 | /* Calculated/Cached values. These do not reflect the actual usable | 288 | int sec_per_chk; |
288 | * blocks at run-time. | 289 | int sec_per_lun; |
289 | */ | 290 | |
291 | int ws_min; | ||
292 | int ws_opt; | ||
293 | int ws_seq; | ||
294 | int ws_per_chk; | ||
295 | |||
290 | int max_rq_size; | 296 | int max_rq_size; |
291 | int plane_mode; /* drive device in single, double or quad mode */ | ||
292 | 297 | ||
298 | int op; | ||
299 | |||
300 | struct nvm_addr_format ppaf; | ||
301 | |||
302 | /* Legacy 1.2 specific geometry */ | ||
303 | int plane_mode; /* drive device in single, double or quad mode */ | ||
304 | int nr_planes; | ||
305 | int sec_per_pg; /* only sectors for a single page */ | ||
293 | int sec_per_pl; /* all sectors across planes */ | 306 | int sec_per_pl; /* all sectors across planes */ |
294 | int sec_per_blk; | ||
295 | int sec_per_lun; | ||
296 | }; | 307 | }; |
297 | 308 | ||
298 | /* sub-device structure */ | 309 | /* sub-device structure */ |
@@ -320,10 +331,6 @@ struct nvm_dev { | |||
320 | /* Device information */ | 331 | /* Device information */ |
321 | struct nvm_geo geo; | 332 | struct nvm_geo geo; |
322 | 333 | ||
323 | /* lower page table */ | ||
324 | int lps_per_blk; | ||
325 | int *lptbl; | ||
326 | |||
327 | unsigned long total_secs; | 334 | unsigned long total_secs; |
328 | 335 | ||
329 | unsigned long *lun_map; | 336 | unsigned long *lun_map; |
@@ -346,36 +353,6 @@ struct nvm_dev { | |||
346 | struct list_head targets; | 353 | struct list_head targets; |
347 | }; | 354 | }; |
348 | 355 | ||
349 | static inline struct ppa_addr linear_to_generic_addr(struct nvm_geo *geo, | ||
350 | u64 pba) | ||
351 | { | ||
352 | struct ppa_addr l; | ||
353 | int secs, pgs, blks, luns; | ||
354 | sector_t ppa = pba; | ||
355 | |||
356 | l.ppa = 0; | ||
357 | |||
358 | div_u64_rem(ppa, geo->sec_per_pg, &secs); | ||
359 | l.g.sec = secs; | ||
360 | |||
361 | sector_div(ppa, geo->sec_per_pg); | ||
362 | div_u64_rem(ppa, geo->pgs_per_blk, &pgs); | ||
363 | l.g.pg = pgs; | ||
364 | |||
365 | sector_div(ppa, geo->pgs_per_blk); | ||
366 | div_u64_rem(ppa, geo->blks_per_lun, &blks); | ||
367 | l.g.blk = blks; | ||
368 | |||
369 | sector_div(ppa, geo->blks_per_lun); | ||
370 | div_u64_rem(ppa, geo->luns_per_chnl, &luns); | ||
371 | l.g.lun = luns; | ||
372 | |||
373 | sector_div(ppa, geo->luns_per_chnl); | ||
374 | l.g.ch = ppa; | ||
375 | |||
376 | return l; | ||
377 | } | ||
378 | |||
379 | static inline struct ppa_addr generic_to_dev_addr(struct nvm_tgt_dev *tgt_dev, | 356 | static inline struct ppa_addr generic_to_dev_addr(struct nvm_tgt_dev *tgt_dev, |
380 | struct ppa_addr r) | 357 | struct ppa_addr r) |
381 | { | 358 | { |
@@ -418,25 +395,6 @@ static inline struct ppa_addr dev_to_generic_addr(struct nvm_tgt_dev *tgt_dev, | |||
418 | return l; | 395 | return l; |
419 | } | 396 | } |
420 | 397 | ||
421 | static inline int ppa_empty(struct ppa_addr ppa_addr) | ||
422 | { | ||
423 | return (ppa_addr.ppa == ADDR_EMPTY); | ||
424 | } | ||
425 | |||
426 | static inline void ppa_set_empty(struct ppa_addr *ppa_addr) | ||
427 | { | ||
428 | ppa_addr->ppa = ADDR_EMPTY; | ||
429 | } | ||
430 | |||
431 | static inline int ppa_cmp_blk(struct ppa_addr ppa1, struct ppa_addr ppa2) | ||
432 | { | ||
433 | if (ppa_empty(ppa1) || ppa_empty(ppa2)) | ||
434 | return 0; | ||
435 | |||
436 | return ((ppa1.g.ch == ppa2.g.ch) && (ppa1.g.lun == ppa2.g.lun) && | ||
437 | (ppa1.g.blk == ppa2.g.blk)); | ||
438 | } | ||
439 | |||
440 | typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *); | 398 | typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *); |
441 | typedef sector_t (nvm_tgt_capacity_fn)(void *); | 399 | typedef sector_t (nvm_tgt_capacity_fn)(void *); |
442 | typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, | 400 | typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, |
@@ -481,17 +439,10 @@ extern int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr *, | |||
481 | extern int nvm_max_phys_sects(struct nvm_tgt_dev *); | 439 | extern int nvm_max_phys_sects(struct nvm_tgt_dev *); |
482 | extern int nvm_submit_io(struct nvm_tgt_dev *, struct nvm_rq *); | 440 | extern int nvm_submit_io(struct nvm_tgt_dev *, struct nvm_rq *); |
483 | extern int nvm_submit_io_sync(struct nvm_tgt_dev *, struct nvm_rq *); | 441 | extern int nvm_submit_io_sync(struct nvm_tgt_dev *, struct nvm_rq *); |
484 | extern int nvm_erase_sync(struct nvm_tgt_dev *, struct ppa_addr *, int); | ||
485 | extern int nvm_get_l2p_tbl(struct nvm_tgt_dev *, u64, u32, nvm_l2p_update_fn *, | ||
486 | void *); | ||
487 | extern int nvm_get_area(struct nvm_tgt_dev *, sector_t *, sector_t); | ||
488 | extern void nvm_put_area(struct nvm_tgt_dev *, sector_t); | ||
489 | extern void nvm_end_io(struct nvm_rq *); | 442 | extern void nvm_end_io(struct nvm_rq *); |
490 | extern int nvm_bb_tbl_fold(struct nvm_dev *, u8 *, int); | 443 | extern int nvm_bb_tbl_fold(struct nvm_dev *, u8 *, int); |
491 | extern int nvm_get_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr, u8 *); | 444 | extern int nvm_get_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr, u8 *); |
492 | 445 | ||
493 | extern void nvm_part_to_tgt(struct nvm_dev *, sector_t *, int); | ||
494 | |||
495 | #else /* CONFIG_NVM */ | 446 | #else /* CONFIG_NVM */ |
496 | struct nvm_dev_ops; | 447 | struct nvm_dev_ops; |
497 | 448 | ||