Message ID | CAK=WgbaOSaKcxmsG2L3G3g+bORvtq4nyzCg9yhA=tTLhsYmh3w@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Ohad, On Thursday 01 September 2011 13:47:26 Ohad Ben-Cohen wrote: > On Wed, Aug 31, 2011 at 1:52 PM, Ohad Ben-Cohen <ohad@wizery.com> wrote: > > From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > omap_iovmm requires page-aligned buffers, and that sometimes causes > > omap3isp failures (i.e. whenever the buffer passed from userspace is not > > page-aligned). > > > > Remove this limitation by rounding the address of the first page entry > > down, and adding the offset back to the device address. > > Seems like the unmap paths were skipped (need to adjust the sizes in > the unmap path too). > > Laurent, if it looks good to you, I'll just squash it to the original > patch and repost: Do you have a tree where the current code base can be found ? > diff --git a/drivers/iommu/omap-iovmm.c b/drivers/iommu/omap-iovmm.c > index d28a256..39bdb92 100644 > --- a/drivers/iommu/omap-iovmm.c > +++ b/drivers/iommu/omap-iovmm.c > @@ -447,7 +447,7 @@ err_out: > for_each_sg(sgt->sgl, sg, i, j) { > size_t bytes; > > - bytes = sg->length; > + bytes = sg->length + sg->offset; > order = get_order(bytes); > > /* ignore failures.. we're already handling one */ > @@ -476,7 +476,7 @@ static void unmap_iovm_area(struct iommu_domain > *domain, str size_t bytes; > int order; > > - bytes = sg->length; > + bytes = sg->length + sg->offset; > order = get_order(bytes); > > err = iommu_unmap(domain, start, order);
On Thu, Sep 01, 2011 at 09:31:13AM -0400, Laurent Pinchart wrote: > Hi Ohad, > > On Thursday 01 September 2011 13:47:26 Ohad Ben-Cohen wrote: > > On Wed, Aug 31, 2011 at 1:52 PM, Ohad Ben-Cohen <ohad@wizery.com> wrote: > > > From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > > > omap_iovmm requires page-aligned buffers, and that sometimes causes > > > omap3isp failures (i.e. whenever the buffer passed from userspace is not > > > page-aligned). > > > > > > Remove this limitation by rounding the address of the first page entry > > > down, and adding the offset back to the device address. > > > > Seems like the unmap paths were skipped (need to adjust the sizes in > > the unmap path too). > > > > Laurent, if it looks good to you, I'll just squash it to the original > > patch and repost: > > Do you have a tree where the current code base can be found ? Please base your upstream-patches against git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git arm/omap Thanks, Joerg
Hi Ohad, On Thursday 01 September 2011 13:47:26 Ohad Ben-Cohen wrote: > On Wed, Aug 31, 2011 at 1:52 PM, Ohad Ben-Cohen <ohad@wizery.com> wrote: > > From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > omap_iovmm requires page-aligned buffers, and that sometimes causes > > omap3isp failures (i.e. whenever the buffer passed from userspace is not > > page-aligned). > > > > Remove this limitation by rounding the address of the first page entry > > down, and adding the offset back to the device address. > > Seems like the unmap paths were skipped (need to adjust the sizes in > the unmap path too). > > Laurent, if it looks good to you, I'll just squash it to the original > patch and repost: It looks good to me. I haven't tested it though. > diff --git a/drivers/iommu/omap-iovmm.c b/drivers/iommu/omap-iovmm.c > index d28a256..39bdb92 100644 > --- a/drivers/iommu/omap-iovmm.c > +++ b/drivers/iommu/omap-iovmm.c > @@ -447,7 +447,7 @@ err_out: > for_each_sg(sgt->sgl, sg, i, j) { > size_t bytes; > > - bytes = sg->length; > + bytes = sg->length + sg->offset; > order = get_order(bytes); > > /* ignore failures.. we're already handling one */ > @@ -476,7 +476,7 @@ static void unmap_iovm_area(struct iommu_domain > *domain, str size_t bytes; > int order; > > - bytes = sg->length; > + bytes = sg->length + sg->offset; > order = get_order(bytes); > > err = iommu_unmap(domain, start, order);
On Thu, Sep 1, 2011 at 4:59 PM, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > It looks good to me. Thanks. > I haven't tested it though. I did, but I always get aligned buffers so my testing is a bit moot. I can't see how unmap could work without this patch, though, so I'll squash this and re-post. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thursday 01 September 2011 16:02:35 Ohad Ben-Cohen wrote: > On Thu, Sep 1, 2011 at 4:59 PM, Laurent Pinchart > > <laurent.pinchart@ideasonboard.com> wrote: > > It looks good to me. > > Thanks. > > > I haven't tested it though. > > I did, but I always get aligned buffers so my testing is a bit moot. I > can't see how unmap could work without this patch, though, so I'll > squash this and re-post. You can allocate a page-aligned buffer with posix_memalign() and add an offset (64 should do the job, smaller values can get rejected by the OMAP3 ISP driver).
diff --git a/drivers/iommu/omap-iovmm.c b/drivers/iommu/omap-iovmm.c index d28a256..39bdb92 100644 --- a/drivers/iommu/omap-iovmm.c +++ b/drivers/iommu/omap-iovmm.c @@ -447,7 +447,7 @@ err_out: for_each_sg(sgt->sgl, sg, i, j) { size_t bytes; - bytes = sg->length; + bytes = sg->length + sg->offset; order = get_order(bytes); /* ignore failures.. we're already handling one */ @@ -476,7 +476,7 @@ static void unmap_iovm_area(struct iommu_domain *domain, str size_t bytes; int order; - bytes = sg->length; + bytes = sg->length + sg->offset; order = get_order(bytes); err = iommu_unmap(domain, start, order);