From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Tue, 16 Jun 2015 11:53:53 +0200 Subject: [U-Boot] mmc_write.c: Make mmc_berase do 32bit safe 64bit math In-Reply-To: <1434070411-28082-1-git-send-email-trini@konsulko.com> References: <1434070411-28082-1-git-send-email-trini@konsulko.com> Message-ID: <557FF231.30605@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 12-06-15 02:53, Tom Rini wrote: > We want to see if the requested start or total block count are > unaligned. We discard the whole numbers and only care about the > remainder. Update the code to use div_u64_rem here and add a comment. > > Cc: Hans de Goede > Cc: Pantelis Antoniou > Cc: Bernhard Nortmann > Reported-by: Simon Glass > Signed-off-by: Tom Rini > Tested-by: Bernhard Nortmann Thanks for this, looks good to me: Reviewed-by: Hans de Goede Regards, Hans > --- > drivers/mmc/mmc_write.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c > index 3db9669..7aea7e9 100644 > --- a/drivers/mmc/mmc_write.c > +++ b/drivers/mmc/mmc_write.c > @@ -10,6 +10,8 @@ > #include > #include > #include > +#include > +#include > #include "mmc_private.h" > > static ulong mmc_erase_t(struct mmc *mmc, ulong start, lbaint_t blkcnt) > @@ -66,6 +68,7 @@ err_out: > unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt) > { > int err = 0; > + u32 start_rem, blkcnt_rem; > struct mmc *mmc = find_mmc_device(dev_num); > lbaint_t blk = 0, blk_r = 0; > int timeout = 1000; > @@ -73,7 +76,14 @@ unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt) > if (!mmc) > return -1; > > - if ((start % mmc->erase_grp_size) || (blkcnt % mmc->erase_grp_size)) > + /* > + * We want to see if the requested start or total block count are > + * unaligned. We discard the whole numbers and only care about the > + * remainder. > + */ > + err = div_u64_rem(start, mmc->erase_grp_size, &start_rem); > + err = div_u64_rem(blkcnt, mmc->erase_grp_size, &blkcnt_rem); > + if (start_rem || blkcnt_rem) > printf("\n\nCaution! Your devices Erase group is 0x%x\n" > "The erase range would be change to " > "0x" LBAF "~0x" LBAF "\n\n", >