summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatias Bjørling <matias@cnexlabs.com>2017-01-31 07:17:15 -0500
committerJens Axboe <axboe@fb.com>2017-01-31 10:32:13 -0500
commit19bd6fe73ca812964963aa30827cff9aae64a715 (patch)
treef01107a5aaa6c09fea5d0ad2454fc9954d8e376c
parentdab8ee9e8a30620a5b5f22d6c0b3749217093803 (diff)
lightnvm: reduce number of nvm_id groups to one
The number of configuration groups has been limited to one in current code, even if there is support for up to four. With the introduction of the open-channel SSD 1.3 specification, only a single group is exposed onwards. Reflect this in the nvm_id structure. Signed-off-by: Matias Bjørling <matias@cnexlabs.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/block/null_blk.c3
-rw-r--r--drivers/lightnvm/core.c12
-rw-r--r--drivers/nvme/host/lightnvm.c87
-rw-r--r--include/linux/lightnvm.h3
4 files changed, 47 insertions, 58 deletions
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index c0e14e54909b..e666095278ab 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -460,7 +460,6 @@ static int null_lnvm_id(struct nvm_dev *dev, struct nvm_id *id)
460 460
461 id->ver_id = 0x1; 461 id->ver_id = 0x1;
462 id->vmnt = 0; 462 id->vmnt = 0;
463 id->cgrps = 1;
464 id->cap = 0x2; 463 id->cap = 0x2;
465 id->dom = 0x1; 464 id->dom = 0x1;
466 465
@@ -479,7 +478,7 @@ static int null_lnvm_id(struct nvm_dev *dev, struct nvm_id *id)
479 478
480 sector_div(size, bs); /* convert size to pages */ 479 sector_div(size, bs); /* convert size to pages */
481 size >>= 8; /* concert size to pgs pr blk */ 480 size >>= 8; /* concert size to pgs pr blk */
482 grp = &id->groups[0]; 481 grp = &id->grp;
483 grp->mtype = 0; 482 grp->mtype = 0;
484 grp->fmtype = 0; 483 grp->fmtype = 0;
485 grp->num_ch = 1; 484 grp->num_ch = 1;
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 0842c85d3b84..80cd7677762d 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -884,7 +884,7 @@ static int nvm_init_mlc_tbl(struct nvm_dev *dev, struct nvm_id_group *grp)
884static int nvm_core_init(struct nvm_dev *dev) 884static int nvm_core_init(struct nvm_dev *dev)
885{ 885{
886 struct nvm_id *id = &dev->identity; 886 struct nvm_id *id = &dev->identity;
887 struct nvm_id_group *grp = &id->groups[0]; 887 struct nvm_id_group *grp = &id->grp;
888 struct nvm_geo *geo = &dev->geo; 888 struct nvm_geo *geo = &dev->geo;
889 int ret; 889 int ret;
890 890
@@ -988,20 +988,14 @@ static int nvm_init(struct nvm_dev *dev)
988 goto err; 988 goto err;
989 } 989 }
990 990
991 pr_debug("nvm: ver:%x nvm_vendor:%x groups:%u\n", 991 pr_debug("nvm: ver:%x nvm_vendor:%x\n",
992 dev->identity.ver_id, dev->identity.vmnt, 992 dev->identity.ver_id, dev->identity.vmnt);
993 dev->identity.cgrps);
994 993
995 if (dev->identity.ver_id != 1) { 994 if (dev->identity.ver_id != 1) {
996 pr_err("nvm: device not supported by kernel."); 995 pr_err("nvm: device not supported by kernel.");
997 goto err; 996 goto err;
998 } 997 }
999 998
1000 if (dev->identity.cgrps != 1) {
1001 pr_err("nvm: only one group configuration supported.");
1002 goto err;
1003 }
1004
1005 ret = nvm_core_init(dev); 999 ret = nvm_core_init(dev);
1006 if (ret) { 1000 if (ret) {
1007 pr_err("nvm: could not initialize core structures.\n"); 1001 pr_err("nvm: could not initialize core structures.\n");
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index ad54ec9c986f..733992a25d6a 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -248,50 +248,48 @@ static int init_grps(struct nvm_id *nvm_id, struct nvme_nvm_id *nvme_nvm_id)
248{ 248{
249 struct nvme_nvm_id_group *src; 249 struct nvme_nvm_id_group *src;
250 struct nvm_id_group *dst; 250 struct nvm_id_group *dst;
251 int i, end; 251
252 252 if (nvme_nvm_id->cgrps != 1)
253 end = min_t(u32, 4, nvm_id->cgrps); 253 return -EINVAL;
254 254
255 for (i = 0; i < end; i++) { 255 src = &nvme_nvm_id->groups[0];
256 src = &nvme_nvm_id->groups[i]; 256 dst = &nvm_id->grp;
257 dst = &nvm_id->groups[i]; 257
258 258 dst->mtype = src->mtype;
259 dst->mtype = src->mtype; 259 dst->fmtype = src->fmtype;
260 dst->fmtype = src->fmtype; 260 dst->num_ch = src->num_ch;
261 dst->num_ch = src->num_ch; 261 dst->num_lun = src->num_lun;
262 dst->num_lun = src->num_lun; 262 dst->num_pln = src->num_pln;
263 dst->num_pln = src->num_pln; 263
264 264 dst->num_pg = le16_to_cpu(src->num_pg);
265 dst->num_pg = le16_to_cpu(src->num_pg); 265 dst->num_blk = le16_to_cpu(src->num_blk);
266 dst->num_blk = le16_to_cpu(src->num_blk); 266 dst->fpg_sz = le16_to_cpu(src->fpg_sz);
267 dst->fpg_sz = le16_to_cpu(src->fpg_sz); 267 dst->csecs = le16_to_cpu(src->csecs);
268 dst->csecs = le16_to_cpu(src->csecs); 268 dst->sos = le16_to_cpu(src->sos);
269 dst->sos = le16_to_cpu(src->sos); 269
270 270 dst->trdt = le32_to_cpu(src->trdt);
271 dst->trdt = le32_to_cpu(src->trdt); 271 dst->trdm = le32_to_cpu(src->trdm);
272 dst->trdm = le32_to_cpu(src->trdm); 272 dst->tprt = le32_to_cpu(src->tprt);
273 dst->tprt = le32_to_cpu(src->tprt); 273 dst->tprm = le32_to_cpu(src->tprm);
274 dst->tprm = le32_to_cpu(src->tprm); 274 dst->tbet = le32_to_cpu(src->tbet);
275 dst->tbet = le32_to_cpu(src->tbet); 275 dst->tbem = le32_to_cpu(src->tbem);
276 dst->tbem = le32_to_cpu(src->tbem); 276 dst->mpos = le32_to_cpu(src->mpos);
277 dst->mpos = le32_to_cpu(src->mpos); 277 dst->mccap = le32_to_cpu(src->mccap);
278 dst->mccap = le32_to_cpu(src->mccap); 278
279 279 dst->cpar = le16_to_cpu(src->cpar);
280 dst->cpar = le16_to_cpu(src->cpar); 280
281 281 if (dst->fmtype == NVM_ID_FMTYPE_MLC) {
282 if (dst->fmtype == NVM_ID_FMTYPE_MLC) { 282 memcpy(dst->lptbl.id, src->lptbl.id, 8);
283 memcpy(dst->lptbl.id, src->lptbl.id, 8); 283 dst->lptbl.mlc.num_pairs =
284 dst->lptbl.mlc.num_pairs = 284 le16_to_cpu(src->lptbl.mlc.num_pairs);
285 le16_to_cpu(src->lptbl.mlc.num_pairs); 285
286 286 if (dst->lptbl.mlc.num_pairs > NVME_NVM_LP_MLC_PAIRS) {
287 if (dst->lptbl.mlc.num_pairs > NVME_NVM_LP_MLC_PAIRS) { 287 pr_err("nvm: number of MLC pairs not supported\n");
288 pr_err("nvm: number of MLC pairs not supported\n"); 288 return -EINVAL;
289 return -EINVAL;
290 }
291
292 memcpy(dst->lptbl.mlc.pairs, src->lptbl.mlc.pairs,
293 dst->lptbl.mlc.num_pairs);
294 } 289 }
290
291 memcpy(dst->lptbl.mlc.pairs, src->lptbl.mlc.pairs,
292 dst->lptbl.mlc.num_pairs);
295 } 293 }
296 294
297 return 0; 295 return 0;
@@ -321,7 +319,6 @@ static int nvme_nvm_identity(struct nvm_dev *nvmdev, struct nvm_id *nvm_id)
321 319
322 nvm_id->ver_id = nvme_nvm_id->ver_id; 320 nvm_id->ver_id = nvme_nvm_id->ver_id;
323 nvm_id->vmnt = nvme_nvm_id->vmnt; 321 nvm_id->vmnt = nvme_nvm_id->vmnt;
324 nvm_id->cgrps = nvme_nvm_id->cgrps;
325 nvm_id->cap = le32_to_cpu(nvme_nvm_id->cap); 322 nvm_id->cap = le32_to_cpu(nvme_nvm_id->cap);
326 nvm_id->dom = le32_to_cpu(nvme_nvm_id->dom); 323 nvm_id->dom = le32_to_cpu(nvme_nvm_id->dom);
327 memcpy(&nvm_id->ppaf, &nvme_nvm_id->ppaf, 324 memcpy(&nvm_id->ppaf, &nvme_nvm_id->ppaf,
@@ -622,7 +619,7 @@ static ssize_t nvm_dev_attr_show(struct device *dev,
622 return 0; 619 return 0;
623 620
624 id = &ndev->identity; 621 id = &ndev->identity;
625 grp = &id->groups[0]; 622 grp = &id->grp;
626 attr = &dattr->attr; 623 attr = &dattr->attr;
627 624
628 if (strcmp(attr->name, "version") == 0) { 625 if (strcmp(attr->name, "version") == 0) {
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index faa0fbfe339a..ce0b2dac84ac 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -200,11 +200,10 @@ struct nvm_addr_format {
200struct nvm_id { 200struct nvm_id {
201 u8 ver_id; 201 u8 ver_id;
202 u8 vmnt; 202 u8 vmnt;
203 u8 cgrps;
204 u32 cap; 203 u32 cap;
205 u32 dom; 204 u32 dom;
206 struct nvm_addr_format ppaf; 205 struct nvm_addr_format ppaf;
207 struct nvm_id_group groups[4]; 206 struct nvm_id_group grp;
208} __packed; 207} __packed;
209 208
210struct nvm_target { 209struct nvm_target {