summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk.h
diff options
context:
space:
mode:
authorJavier González <javier@cnexlabs.com>2018-03-29 18:05:10 -0400
committerJens Axboe <axboe@kernel.dk>2018-03-29 19:29:09 -0400
commite46f4e4822bdecf9bcbc2e71b2a3ae7f37464a2d (patch)
treef69895ed8945edc7be7e80186ad7b4568d367db5 /drivers/lightnvm/pblk.h
parent43d47127219de1dd674b917c1835baa14c4c1768 (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.h83
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
554struct 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
569enum { 554enum {
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
946static inline int pblk_pad_distance(struct pblk *pblk) 929static 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
954static inline int pblk_ppa_to_line(struct ppa_addr p) 937static 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)
964static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr, 947static 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,
980static inline u64 pblk_dev_ppa_to_line_addr(struct pblk *pblk, 964static 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);