diff options
Diffstat (limited to 'drivers/lightnvm/rrpc.c')
| -rw-r--r-- | drivers/lightnvm/rrpc.c | 32 | 
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 7ba64c87ba1c..75e59c3a3f96 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c @@ -123,12 +123,42 @@ static u64 block_to_addr(struct rrpc *rrpc, struct rrpc_block *rblk)  	return blk->id * rrpc->dev->pgs_per_blk;  } +static struct ppa_addr linear_to_generic_addr(struct nvm_dev *dev, +							struct ppa_addr r) +{ +	struct ppa_addr l; +	int secs, pgs, blks, luns; +	sector_t ppa = r.ppa; + +	l.ppa = 0; + +	div_u64_rem(ppa, dev->sec_per_pg, &secs); +	l.g.sec = secs; + +	sector_div(ppa, dev->sec_per_pg); +	div_u64_rem(ppa, dev->sec_per_blk, &pgs); +	l.g.pg = pgs; + +	sector_div(ppa, dev->pgs_per_blk); +	div_u64_rem(ppa, dev->blks_per_lun, &blks); +	l.g.blk = blks; + +	sector_div(ppa, dev->blks_per_lun); +	div_u64_rem(ppa, dev->luns_per_chnl, &luns); +	l.g.lun = luns; + +	sector_div(ppa, dev->luns_per_chnl); +	l.g.ch = ppa; + +	return l; +} +  static struct ppa_addr rrpc_ppa_to_gaddr(struct nvm_dev *dev, u64 addr)  {  	struct ppa_addr paddr;  	paddr.ppa = addr; -	return __linear_to_generic_addr(dev, paddr); +	return linear_to_generic_addr(dev, paddr);  }  /* requires lun->lock taken */  | 
