diff options
author | Javier González <javier@cnexlabs.com> | 2018-03-29 18:05:10 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-03-29 19:29:09 -0400 |
commit | e46f4e4822bdecf9bcbc2e71b2a3ae7f37464a2d (patch) | |
tree | f69895ed8945edc7be7e80186ad7b4568d367db5 /drivers/lightnvm/pblk.h | |
parent | 43d47127219de1dd674b917c1835baa14c4c1768 (diff) |
lightnvm: simplify geometry structure
Currently, the device geometry is stored redundantly in the nvm_id and
nvm_geo structures at a device level. Moreover, when instantiating
targets on a specific number of LUNs, these structures are replicated
and manually modified to fit the instance channel and LUN partitioning.
Instead, create a generic geometry around nvm_geo, which can be used by
(i) the underlying device to describe the geometry of the whole device,
and (ii) instances to describe their geometry independently.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm/pblk.h')
-rw-r--r-- | drivers/lightnvm/pblk.h | 83 |
1 files changed, 33 insertions, 50 deletions
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index f0309d8172c0..898c4e49f77d 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h | |||
@@ -551,21 +551,6 @@ struct pblk_line_meta { | |||
551 | unsigned int meta_distance; /* Distance between data and metadata */ | 551 | unsigned int meta_distance; /* Distance between data and metadata */ |
552 | }; | 552 | }; |
553 | 553 | ||
554 | struct pblk_addr_format { | ||
555 | u64 ch_mask; | ||
556 | u64 lun_mask; | ||
557 | u64 pln_mask; | ||
558 | u64 blk_mask; | ||
559 | u64 pg_mask; | ||
560 | u64 sec_mask; | ||
561 | u8 ch_offset; | ||
562 | u8 lun_offset; | ||
563 | u8 pln_offset; | ||
564 | u8 blk_offset; | ||
565 | u8 pg_offset; | ||
566 | u8 sec_offset; | ||
567 | }; | ||
568 | |||
569 | enum { | 554 | enum { |
570 | PBLK_STATE_RUNNING = 0, | 555 | PBLK_STATE_RUNNING = 0, |
571 | PBLK_STATE_STOPPING = 1, | 556 | PBLK_STATE_STOPPING = 1, |
@@ -585,8 +570,8 @@ struct pblk { | |||
585 | struct pblk_line_mgmt l_mg; /* Line management */ | 570 | struct pblk_line_mgmt l_mg; /* Line management */ |
586 | struct pblk_line_meta lm; /* Line metadata */ | 571 | struct pblk_line_meta lm; /* Line metadata */ |
587 | 572 | ||
573 | struct nvm_addrf ppaf; | ||
588 | int ppaf_bitsize; | 574 | int ppaf_bitsize; |
589 | struct pblk_addr_format ppaf; | ||
590 | 575 | ||
591 | struct pblk_rb rwb; | 576 | struct pblk_rb rwb; |
592 | 577 | ||
@@ -941,14 +926,12 @@ static inline int pblk_line_vsc(struct pblk_line *line) | |||
941 | return le32_to_cpu(*line->vsc); | 926 | return le32_to_cpu(*line->vsc); |
942 | } | 927 | } |
943 | 928 | ||
944 | #define NVM_MEM_PAGE_WRITE (8) | ||
945 | |||
946 | static inline int pblk_pad_distance(struct pblk *pblk) | 929 | static inline int pblk_pad_distance(struct pblk *pblk) |
947 | { | 930 | { |
948 | struct nvm_tgt_dev *dev = pblk->dev; | 931 | struct nvm_tgt_dev *dev = pblk->dev; |
949 | struct nvm_geo *geo = &dev->geo; | 932 | struct nvm_geo *geo = &dev->geo; |
950 | 933 | ||
951 | return NVM_MEM_PAGE_WRITE * geo->all_luns * geo->sec_per_pl; | 934 | return geo->mw_cunits * geo->all_luns * geo->ws_opt; |
952 | } | 935 | } |
953 | 936 | ||
954 | static inline int pblk_ppa_to_line(struct ppa_addr p) | 937 | static inline int pblk_ppa_to_line(struct ppa_addr p) |
@@ -964,15 +947,16 @@ static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p) | |||
964 | static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr, | 947 | static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr, |
965 | u64 line_id) | 948 | u64 line_id) |
966 | { | 949 | { |
950 | struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->ppaf; | ||
967 | struct ppa_addr ppa; | 951 | struct ppa_addr ppa; |
968 | 952 | ||
969 | ppa.ppa = 0; | 953 | ppa.ppa = 0; |
970 | ppa.g.blk = line_id; | 954 | ppa.g.blk = line_id; |
971 | ppa.g.pg = (paddr & pblk->ppaf.pg_mask) >> pblk->ppaf.pg_offset; | 955 | ppa.g.pg = (paddr & ppaf->pg_mask) >> ppaf->pg_offset; |
972 | ppa.g.lun = (paddr & pblk->ppaf.lun_mask) >> pblk->ppaf.lun_offset; | 956 | ppa.g.lun = (paddr & ppaf->lun_mask) >> ppaf->lun_offset; |
973 | ppa.g.ch = (paddr & pblk->ppaf.ch_mask) >> pblk->ppaf.ch_offset; | 957 | ppa.g.ch = (paddr & ppaf->ch_mask) >> ppaf->ch_offset; |
974 | ppa.g.pl = (paddr & pblk->ppaf.pln_mask) >> pblk->ppaf.pln_offset; | 958 | ppa.g.pl = (paddr & ppaf->pln_mask) >> ppaf->pln_offset; |
975 | ppa.g.sec = (paddr & pblk->ppaf.sec_mask) >> pblk->ppaf.sec_offset; | 959 | ppa.g.sec = (paddr & ppaf->sec_mask) >> ppaf->sect_offset; |
976 | 960 | ||
977 | return ppa; | 961 | return ppa; |
978 | } | 962 | } |
@@ -980,13 +964,14 @@ static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr, | |||
980 | static inline u64 pblk_dev_ppa_to_line_addr(struct pblk *pblk, | 964 | static inline u64 pblk_dev_ppa_to_line_addr(struct pblk *pblk, |
981 | struct ppa_addr p) | 965 | struct ppa_addr p) |
982 | { | 966 | { |
967 | struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->ppaf; | ||
983 | u64 paddr; | 968 | u64 paddr; |
984 | 969 | ||
985 | paddr = (u64)p.g.pg << pblk->ppaf.pg_offset; | 970 | paddr = (u64)p.g.ch << ppaf->ch_offset; |
986 | paddr |= (u64)p.g.lun << pblk->ppaf.lun_offset; | 971 | paddr |= (u64)p.g.lun << ppaf->lun_offset; |
987 | paddr |= (u64)p.g.ch << pblk->ppaf.ch_offset; | 972 | paddr |= (u64)p.g.pg << ppaf->pg_offset; |
988 | paddr |= (u64)p.g.pl << pblk->ppaf.pln_offset; | 973 | paddr |= (u64)p.g.pl << ppaf->pln_offset; |
989 | paddr |= (u64)p.g.sec << pblk->ppaf.sec_offset; | 974 | paddr |= (u64)p.g.sec << ppaf->sect_offset; |
990 | 975 | ||
991 | return paddr; | 976 | return paddr; |
992 | } | 977 | } |
@@ -1003,18 +988,14 @@ static inline struct ppa_addr pblk_ppa32_to_ppa64(struct pblk *pblk, u32 ppa32) | |||
1003 | ppa64.c.line = ppa32 & ((~0U) >> 1); | 988 | ppa64.c.line = ppa32 & ((~0U) >> 1); |
1004 | ppa64.c.is_cached = 1; | 989 | ppa64.c.is_cached = 1; |
1005 | } else { | 990 | } else { |
1006 | ppa64.g.blk = (ppa32 & pblk->ppaf.blk_mask) >> | 991 | struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->ppaf; |
1007 | pblk->ppaf.blk_offset; | 992 | |
1008 | ppa64.g.pg = (ppa32 & pblk->ppaf.pg_mask) >> | 993 | ppa64.g.ch = (ppa32 & ppaf->ch_mask) >> ppaf->ch_offset; |
1009 | pblk->ppaf.pg_offset; | 994 | ppa64.g.lun = (ppa32 & ppaf->lun_mask) >> ppaf->lun_offset; |
1010 | ppa64.g.lun = (ppa32 & pblk->ppaf.lun_mask) >> | 995 | ppa64.g.blk = (ppa32 & ppaf->blk_mask) >> ppaf->blk_offset; |
1011 | pblk->ppaf.lun_offset; | 996 | ppa64.g.pg = (ppa32 & ppaf->pg_mask) >> ppaf->pg_offset; |
1012 | ppa64.g.ch = (ppa32 & pblk->ppaf.ch_mask) >> | 997 | ppa64.g.pl = (ppa32 & ppaf->pln_mask) >> ppaf->pln_offset; |
1013 | pblk->ppaf.ch_offset; | 998 | ppa64.g.sec = (ppa32 & ppaf->sec_mask) >> ppaf->sect_offset; |
1014 | ppa64.g.pl = (ppa32 & pblk->ppaf.pln_mask) >> | ||
1015 | pblk->ppaf.pln_offset; | ||
1016 | ppa64.g.sec = (ppa32 & pblk->ppaf.sec_mask) >> | ||
1017 | pblk->ppaf.sec_offset; | ||
1018 | } | 999 | } |
1019 | 1000 | ||
1020 | return ppa64; | 1001 | return ppa64; |
@@ -1030,12 +1011,14 @@ static inline u32 pblk_ppa64_to_ppa32(struct pblk *pblk, struct ppa_addr ppa64) | |||
1030 | ppa32 |= ppa64.c.line; | 1011 | ppa32 |= ppa64.c.line; |
1031 | ppa32 |= 1U << 31; | 1012 | ppa32 |= 1U << 31; |
1032 | } else { | 1013 | } else { |
1033 | ppa32 |= ppa64.g.blk << pblk->ppaf.blk_offset; | 1014 | struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->ppaf; |
1034 | ppa32 |= ppa64.g.pg << pblk->ppaf.pg_offset; | 1015 | |
1035 | ppa32 |= ppa64.g.lun << pblk->ppaf.lun_offset; | 1016 | ppa32 |= ppa64.g.ch << ppaf->ch_offset; |
1036 | ppa32 |= ppa64.g.ch << pblk->ppaf.ch_offset; | 1017 | ppa32 |= ppa64.g.lun << ppaf->lun_offset; |
1037 | ppa32 |= ppa64.g.pl << pblk->ppaf.pln_offset; | 1018 | ppa32 |= ppa64.g.blk << ppaf->blk_offset; |
1038 | ppa32 |= ppa64.g.sec << pblk->ppaf.sec_offset; | 1019 | ppa32 |= ppa64.g.pg << ppaf->pg_offset; |
1020 | ppa32 |= ppa64.g.pl << ppaf->pln_offset; | ||
1021 | ppa32 |= ppa64.g.sec << ppaf->sect_offset; | ||
1039 | } | 1022 | } |
1040 | 1023 | ||
1041 | return ppa32; | 1024 | return ppa32; |
@@ -1229,10 +1212,10 @@ static inline int pblk_boundary_ppa_checks(struct nvm_tgt_dev *tgt_dev, | |||
1229 | if (!ppa->c.is_cached && | 1212 | if (!ppa->c.is_cached && |
1230 | ppa->g.ch < geo->nr_chnls && | 1213 | ppa->g.ch < geo->nr_chnls && |
1231 | ppa->g.lun < geo->nr_luns && | 1214 | ppa->g.lun < geo->nr_luns && |
1232 | ppa->g.pl < geo->nr_planes && | 1215 | ppa->g.pl < geo->num_pln && |
1233 | ppa->g.blk < geo->nr_chks && | 1216 | ppa->g.blk < geo->nr_chks && |
1234 | ppa->g.pg < geo->ws_per_chk && | 1217 | ppa->g.pg < geo->num_pg && |
1235 | ppa->g.sec < geo->sec_per_pg) | 1218 | ppa->g.sec < geo->ws_min) |
1236 | continue; | 1219 | continue; |
1237 | 1220 | ||
1238 | print_ppa(ppa, "boundary", i); | 1221 | print_ppa(ppa, "boundary", i); |