|
@@ -1,6 +1,8 @@
|
|
|
#ifndef NVM_H
|
|
|
#define NVM_H
|
|
|
|
|
|
+#include <linux/types.h>
|
|
|
+
|
|
|
enum {
|
|
|
NVM_IO_OK = 0,
|
|
|
NVM_IO_REQUEUE = 1,
|
|
@@ -11,10 +13,71 @@ enum {
|
|
|
NVM_IOTYPE_GC = 1,
|
|
|
};
|
|
|
|
|
|
+#define NVM_BLK_BITS (16)
|
|
|
+#define NVM_PG_BITS (16)
|
|
|
+#define NVM_SEC_BITS (8)
|
|
|
+#define NVM_PL_BITS (8)
|
|
|
+#define NVM_LUN_BITS (8)
|
|
|
+#define NVM_CH_BITS (8)
|
|
|
+
|
|
|
+struct ppa_addr {
|
|
|
+ /* Generic structure for all addresses */
|
|
|
+ union {
|
|
|
+ struct {
|
|
|
+ u64 blk : NVM_BLK_BITS;
|
|
|
+ u64 pg : NVM_PG_BITS;
|
|
|
+ u64 sec : NVM_SEC_BITS;
|
|
|
+ u64 pl : NVM_PL_BITS;
|
|
|
+ u64 lun : NVM_LUN_BITS;
|
|
|
+ u64 ch : NVM_CH_BITS;
|
|
|
+ } g;
|
|
|
+
|
|
|
+ u64 ppa;
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+struct nvm_rq;
|
|
|
+struct nvm_id;
|
|
|
+struct nvm_dev;
|
|
|
+
|
|
|
+typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *);
|
|
|
+typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *);
|
|
|
+typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *);
|
|
|
+typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32,
|
|
|
+ nvm_l2p_update_fn *, void *);
|
|
|
+typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int,
|
|
|
+ nvm_bb_update_fn *, void *);
|
|
|
+typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int);
|
|
|
+typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);
|
|
|
+typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *);
|
|
|
+typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *);
|
|
|
+typedef void (nvm_destroy_dma_pool_fn)(void *);
|
|
|
+typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t,
|
|
|
+ dma_addr_t *);
|
|
|
+typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t);
|
|
|
+
|
|
|
+struct nvm_dev_ops {
|
|
|
+ nvm_id_fn *identity;
|
|
|
+ nvm_get_l2p_tbl_fn *get_l2p_tbl;
|
|
|
+ nvm_op_bb_tbl_fn *get_bb_tbl;
|
|
|
+ nvm_op_set_bb_fn *set_bb_tbl;
|
|
|
+
|
|
|
+ nvm_submit_io_fn *submit_io;
|
|
|
+ nvm_erase_blk_fn *erase_block;
|
|
|
+
|
|
|
+ nvm_create_dma_pool_fn *create_dma_pool;
|
|
|
+ nvm_destroy_dma_pool_fn *destroy_dma_pool;
|
|
|
+ nvm_dev_dma_alloc_fn *dev_dma_alloc;
|
|
|
+ nvm_dev_dma_free_fn *dev_dma_free;
|
|
|
+
|
|
|
+ unsigned int max_phys_sect;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
#ifdef CONFIG_NVM
|
|
|
|
|
|
#include <linux/blkdev.h>
|
|
|
-#include <linux/types.h>
|
|
|
#include <linux/file.h>
|
|
|
#include <linux/dmapool.h>
|
|
|
#include <uapi/linux/lightnvm.h>
|
|
@@ -149,29 +212,6 @@ struct nvm_tgt_instance {
|
|
|
#define NVM_VERSION_MINOR 0
|
|
|
#define NVM_VERSION_PATCH 0
|
|
|
|
|
|
-#define NVM_BLK_BITS (16)
|
|
|
-#define NVM_PG_BITS (16)
|
|
|
-#define NVM_SEC_BITS (8)
|
|
|
-#define NVM_PL_BITS (8)
|
|
|
-#define NVM_LUN_BITS (8)
|
|
|
-#define NVM_CH_BITS (8)
|
|
|
-
|
|
|
-struct ppa_addr {
|
|
|
- /* Generic structure for all addresses */
|
|
|
- union {
|
|
|
- struct {
|
|
|
- u64 blk : NVM_BLK_BITS;
|
|
|
- u64 pg : NVM_PG_BITS;
|
|
|
- u64 sec : NVM_SEC_BITS;
|
|
|
- u64 pl : NVM_PL_BITS;
|
|
|
- u64 lun : NVM_LUN_BITS;
|
|
|
- u64 ch : NVM_CH_BITS;
|
|
|
- } g;
|
|
|
-
|
|
|
- u64 ppa;
|
|
|
- };
|
|
|
-};
|
|
|
-
|
|
|
struct nvm_rq;
|
|
|
typedef void (nvm_end_io_fn)(struct nvm_rq *);
|
|
|
|
|
@@ -213,39 +253,6 @@ static inline void *nvm_rq_to_pdu(struct nvm_rq *rqdata)
|
|
|
|
|
|
struct nvm_block;
|
|
|
|
|
|
-typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *);
|
|
|
-typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *);
|
|
|
-typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *);
|
|
|
-typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32,
|
|
|
- nvm_l2p_update_fn *, void *);
|
|
|
-typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int,
|
|
|
- nvm_bb_update_fn *, void *);
|
|
|
-typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int);
|
|
|
-typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);
|
|
|
-typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *);
|
|
|
-typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *);
|
|
|
-typedef void (nvm_destroy_dma_pool_fn)(void *);
|
|
|
-typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t,
|
|
|
- dma_addr_t *);
|
|
|
-typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t);
|
|
|
-
|
|
|
-struct nvm_dev_ops {
|
|
|
- nvm_id_fn *identity;
|
|
|
- nvm_get_l2p_tbl_fn *get_l2p_tbl;
|
|
|
- nvm_op_bb_tbl_fn *get_bb_tbl;
|
|
|
- nvm_op_set_bb_fn *set_bb_tbl;
|
|
|
-
|
|
|
- nvm_submit_io_fn *submit_io;
|
|
|
- nvm_erase_blk_fn *erase_block;
|
|
|
-
|
|
|
- nvm_create_dma_pool_fn *create_dma_pool;
|
|
|
- nvm_destroy_dma_pool_fn *destroy_dma_pool;
|
|
|
- nvm_dev_dma_alloc_fn *dev_dma_alloc;
|
|
|
- nvm_dev_dma_free_fn *dev_dma_free;
|
|
|
-
|
|
|
- unsigned int max_phys_sect;
|
|
|
-};
|
|
|
-
|
|
|
struct nvm_lun {
|
|
|
int id;
|
|
|
|