diff options
author | Matias Bjørling <m@bjorling.me> | 2016-05-06 14:02:57 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-05-06 14:51:10 -0400 |
commit | 4891d120b9cd419f4350b11e1231083745dcdc8b (patch) | |
tree | c5da30d99e92644a30cdf2d620dc56cbace69add /drivers/lightnvm | |
parent | 1145e6351a9fefe0965df4c6dba2a04156dc47d2 (diff) |
lightnvm: add fpg_size and pfpg_size to struct nvm_dev
The flash page size (fpg) and size across planes (pfpg) are convenient
to know when allocating buffer sizes. This has previously been a
calculated in various places. Replace with the pre-calculated values.
Reviewed by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Matias Bjørling <m@bjorling.me>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r-- | drivers/lightnvm/core.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/sysblk.c | 17 |
2 files changed, 9 insertions, 10 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index f4e04a505859..652b8c7673ee 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c | |||
@@ -476,6 +476,8 @@ static int nvm_core_init(struct nvm_dev *dev) | |||
476 | dev->pgs_per_blk = grp->num_pg; | 476 | dev->pgs_per_blk = grp->num_pg; |
477 | dev->blks_per_lun = grp->num_blk; | 477 | dev->blks_per_lun = grp->num_blk; |
478 | dev->nr_planes = grp->num_pln; | 478 | dev->nr_planes = grp->num_pln; |
479 | dev->fpg_size = grp->fpg_sz; | ||
480 | dev->pfpg_size = grp->fpg_sz * grp->num_pln; | ||
479 | dev->sec_size = grp->csecs; | 481 | dev->sec_size = grp->csecs; |
480 | dev->oob_size = grp->sos; | 482 | dev->oob_size = grp->sos; |
481 | dev->sec_per_pg = grp->fpg_sz / grp->csecs; | 483 | dev->sec_per_pg = grp->fpg_sz / grp->csecs; |
diff --git a/drivers/lightnvm/sysblk.c b/drivers/lightnvm/sysblk.c index b1e1404e6951..b6971f8ae3c0 100644 --- a/drivers/lightnvm/sysblk.c +++ b/drivers/lightnvm/sysblk.c | |||
@@ -154,13 +154,12 @@ static int nvm_scan_block(struct nvm_dev *dev, struct ppa_addr *ppa, | |||
154 | struct nvm_system_block *sblk) | 154 | struct nvm_system_block *sblk) |
155 | { | 155 | { |
156 | struct nvm_system_block *cur; | 156 | struct nvm_system_block *cur; |
157 | int pg, cursz, ret, found = 0; | 157 | int pg, ret, found = 0; |
158 | 158 | ||
159 | /* the full buffer for a flash page is allocated. Only the first of it | 159 | /* the full buffer for a flash page is allocated. Only the first of it |
160 | * contains the system block information | 160 | * contains the system block information |
161 | */ | 161 | */ |
162 | cursz = dev->sec_size * dev->sec_per_pg * dev->nr_planes; | 162 | cur = kmalloc(dev->pfpg_size, GFP_KERNEL); |
163 | cur = kmalloc(cursz, GFP_KERNEL); | ||
164 | if (!cur) | 163 | if (!cur) |
165 | return -ENOMEM; | 164 | return -ENOMEM; |
166 | 165 | ||
@@ -169,7 +168,7 @@ static int nvm_scan_block(struct nvm_dev *dev, struct ppa_addr *ppa, | |||
169 | ppa->g.pg = ppa_to_slc(dev, pg); | 168 | ppa->g.pg = ppa_to_slc(dev, pg); |
170 | 169 | ||
171 | ret = nvm_submit_ppa(dev, ppa, 1, NVM_OP_PREAD, NVM_IO_SLC_MODE, | 170 | ret = nvm_submit_ppa(dev, ppa, 1, NVM_OP_PREAD, NVM_IO_SLC_MODE, |
172 | cur, cursz); | 171 | cur, dev->pfpg_size); |
173 | if (ret) { | 172 | if (ret) { |
174 | if (ret == NVM_RSP_ERR_EMPTYPAGE) { | 173 | if (ret == NVM_RSP_ERR_EMPTYPAGE) { |
175 | pr_debug("nvm: sysblk scan empty ppa (%u %u %u %u)\n", | 174 | pr_debug("nvm: sysblk scan empty ppa (%u %u %u %u)\n", |
@@ -272,14 +271,12 @@ static int nvm_write_and_verify(struct nvm_dev *dev, struct nvm_sb_info *info, | |||
272 | { | 271 | { |
273 | struct nvm_system_block nvmsb; | 272 | struct nvm_system_block nvmsb; |
274 | void *buf; | 273 | void *buf; |
275 | int i, sect, ret = 0, bufsz; | 274 | int i, sect, ret = 0; |
276 | struct ppa_addr *ppas; | 275 | struct ppa_addr *ppas; |
277 | 276 | ||
278 | nvm_cpu_to_sysblk(&nvmsb, info); | 277 | nvm_cpu_to_sysblk(&nvmsb, info); |
279 | 278 | ||
280 | /* buffer for flash page */ | 279 | buf = kzalloc(dev->pfpg_size, GFP_KERNEL); |
281 | bufsz = dev->sec_size * dev->sec_per_pg * dev->nr_planes; | ||
282 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
283 | if (!buf) | 280 | if (!buf) |
284 | return -ENOMEM; | 281 | return -ENOMEM; |
285 | memcpy(buf, &nvmsb, sizeof(struct nvm_system_block)); | 282 | memcpy(buf, &nvmsb, sizeof(struct nvm_system_block)); |
@@ -309,7 +306,7 @@ static int nvm_write_and_verify(struct nvm_dev *dev, struct nvm_sb_info *info, | |||
309 | } | 306 | } |
310 | 307 | ||
311 | ret = nvm_submit_ppa(dev, ppas, dev->sec_per_pg, NVM_OP_PWRITE, | 308 | ret = nvm_submit_ppa(dev, ppas, dev->sec_per_pg, NVM_OP_PWRITE, |
312 | NVM_IO_SLC_MODE, buf, bufsz); | 309 | NVM_IO_SLC_MODE, buf, dev->pfpg_size); |
313 | if (ret) { | 310 | if (ret) { |
314 | pr_err("nvm: sysblk failed program (%u %u %u)\n", | 311 | pr_err("nvm: sysblk failed program (%u %u %u)\n", |
315 | ppas[0].g.ch, | 312 | ppas[0].g.ch, |
@@ -319,7 +316,7 @@ static int nvm_write_and_verify(struct nvm_dev *dev, struct nvm_sb_info *info, | |||
319 | } | 316 | } |
320 | 317 | ||
321 | ret = nvm_submit_ppa(dev, ppas, dev->sec_per_pg, NVM_OP_PREAD, | 318 | ret = nvm_submit_ppa(dev, ppas, dev->sec_per_pg, NVM_OP_PREAD, |
322 | NVM_IO_SLC_MODE, buf, bufsz); | 319 | NVM_IO_SLC_MODE, buf, dev->pfpg_size); |
323 | if (ret) { | 320 | if (ret) { |
324 | pr_err("nvm: sysblk failed read (%u %u %u)\n", | 321 | pr_err("nvm: sysblk failed read (%u %u %u)\n", |
325 | ppas[0].g.ch, | 322 | ppas[0].g.ch, |