From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751345AbdE2JOV (ORCPT ); Mon, 29 May 2017 05:14:21 -0400 Received: from mail.free-electrons.com ([62.4.15.54]:53900 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750955AbdE2JOF (ORCPT ); Mon, 29 May 2017 05:14:05 -0400 Date: Mon, 29 May 2017 11:13:53 +0200 From: Boris Brezillon To: Chris Packham Cc: linux-mtd@lists.infradead.org, andrew@lunn.ch, computersforpeace@gmail.com, dwmw2@infradead.org, linux-kernel@vger.kernel.org, Marek Vasut , Richard Weinberger , Cyrille Pitchen Subject: Re: [PATCH v4 3/5] mtd: handle partitioning on devices with 0 erasesize Message-ID: <20170529111353.2287279f@bbrezillon> In-Reply-To: <20170524234916.16181-4-chris.packham@alliedtelesis.co.nz> References: <20170524234916.16181-1-chris.packham@alliedtelesis.co.nz> <20170524234916.16181-4-chris.packham@alliedtelesis.co.nz> X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 25 May 2017 11:49:14 +1200 Chris Packham 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 > Signed-off-by: Chris Packham Acked-by: Boris Brezillon > --- > 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); > } >