Messages in this thread | | | Date | Mon, 29 May 2017 11:13:53 +0200 | From | Boris Brezillon <> | Subject | Re: [PATCH v4 3/5] mtd: handle partitioning on devices with 0 erasesize |
| |
On Thu, 25 May 2017 11:49:14 +1200 Chris Packham <chris.packham@alliedtelesis.co.nz> wrote:
> erasesize is meaningful for flash devices but for SRAM there is no > concept of an erase block so erasesize is set to 0. When partitioning > these devices instead of ensuring partitions fall on erasesize > boundaries we ensure they fall on writesize boundaries. > > Helped-by: Boris Brezillon <boris.brezillon@free-electrons.com> > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> --- > Changes in v3: > - new > Changes in v4: > - None > > drivers/mtd/mtdpart.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c > index ea5e5307f667..5cef1247806c 100644 > --- a/drivers/mtd/mtdpart.c > +++ b/drivers/mtd/mtdpart.c > @@ -393,8 +393,11 @@ static struct mtd_part *allocate_partition(struct mtd_info *master, > const struct mtd_partition *part, int partno, > uint64_t cur_offset) > { > + int wr_alignment = master->erasesize ? : master->writesize; > struct mtd_part *slave; > + u32 remainder; > char *name; > + u64 tmp; > > /* allocate the partition structure */ > slave = kzalloc(sizeof(*slave), GFP_KERNEL); > @@ -499,10 +502,11 @@ static struct mtd_part *allocate_partition(struct mtd_info *master, > if (slave->offset == MTDPART_OFS_APPEND) > slave->offset = cur_offset; > if (slave->offset == MTDPART_OFS_NXTBLK) { > + tmp = cur_offset; > slave->offset = cur_offset; > - if (mtd_mod_by_eb(cur_offset, master) != 0) { > - /* Round up to next erasesize */ > - slave->offset = (mtd_div_by_eb(cur_offset, master) + 1) * master->erasesize; > + remainder = do_div(tmp, wr_alignment); > + if (remainder) { > + slave->offset += wr_alignment - remainder; > printk(KERN_NOTICE "Moving partition %d: " > "0x%012llx -> 0x%012llx\n", partno, > (unsigned long long)cur_offset, (unsigned long long)slave->offset); > @@ -567,19 +571,22 @@ static struct mtd_part *allocate_partition(struct mtd_info *master, > slave->mtd.erasesize = master->erasesize; > } > > - if ((slave->mtd.flags & MTD_WRITEABLE) && > - mtd_mod_by_eb(slave->offset, &slave->mtd)) { > + tmp = slave->offset; > + remainder = do_div(tmp, wr_alignment); > + if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { > /* Doesn't start on a boundary of major erase size */ > /* FIXME: Let it be writable if it is on a boundary of > * _minor_ erase size though */ > slave->mtd.flags &= ~MTD_WRITEABLE; > - printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n", > + printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", > part->name); > } > - if ((slave->mtd.flags & MTD_WRITEABLE) && > - mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) { > + > + tmp = slave->mtd.size; > + remainder = do_div(tmp, wr_alignment); > + if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) { > slave->mtd.flags &= ~MTD_WRITEABLE; > - printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n", > + printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", > part->name); > } >
| |