From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> To: linux-omap@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Date: Wed, 1 Jun 2011 15:30:12 +0200 [thread overview] Message-ID: <1306935012-12406-2-git-send-email-laurent.pinchart@ideasonboard.com> (raw) In-Reply-To: <20110601131744.GH11352@atomide.com> The IOMMU virtual memory mapping API requires page-aligned buffers. There's no hardware reason behind such a restriction. Remove it by rounding the address of the first page entry down, and adding the offset back to the IOMMU virtual address. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> --- arch/arm/plat-omap/iovmm.c | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-) diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index b82cef4..fa5ae98 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c @@ -60,6 +60,15 @@ static struct kmem_cache *iovm_area_cachep; +/* return the offset of the first scatterlist entry in a sg table */ +static unsigned int sgtable_offset(const struct sg_table *sgt) +{ + if (!sgt || !sgt->nents) + return 0; + + return sgt->sgl->offset; +} + /* return total bytes of sg buffers */ static size_t sgtable_len(const struct sg_table *sgt) { @@ -72,11 +81,17 @@ static size_t sgtable_len(const struct sg_table *sgt) for_each_sg(sgt->sgl, sg, sgt->nents, i) { size_t bytes; - bytes = sg_dma_len(sg); + bytes = sg_dma_len(sg) + sg->offset; if (!iopgsz_ok(bytes)) { - pr_err("%s: sg[%d] not iommu pagesize(%x)\n", - __func__, i, bytes); + pr_err("%s: sg[%d] not iommu pagesize(%u %u)\n", + __func__, i, bytes, sg->offset); + return 0; + } + + if (i && sg->offset) { + pr_err("%s: sg[%d] offset not allowed in internal " + "entries\n", __func__, i); return 0; } @@ -207,8 +222,8 @@ static void *vmap_sg(const struct sg_table *sgt) u32 pa; int err; - pa = sg_phys(sg); - bytes = sg_dma_len(sg); + pa = sg_phys(sg) - sg->offset; + bytes = sg_dma_len(sg) + sg->offset; BUG_ON(bytes != PAGE_SIZE); @@ -485,8 +500,8 @@ static int map_iovm_area(struct iommu *obj, struct iovm_struct *new, size_t bytes; struct iotlb_entry e; - pa = sg_phys(sg); - bytes = sg_dma_len(sg); + pa = sg_phys(sg) - sg->offset; + bytes = sg_dma_len(sg) + sg->offset; flags &= ~IOVMF_PGSZ_MASK; pgsz = bytes_to_iopgsz(bytes); @@ -666,7 +681,7 @@ u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt, if (IS_ERR_VALUE(da)) vunmap_sg(va); - return da; + return da + sgtable_offset(sgt); } EXPORT_SYMBOL_GPL(iommu_vmap); @@ -685,6 +700,7 @@ struct sg_table *iommu_vunmap(struct iommu *obj, u32 da) * 'sgt' is allocated before 'iommu_vmalloc()' is called. * Just returns 'sgt' to the caller to free */ + da &= PAGE_MASK; sgt = unmap_vm_area(obj, da, vunmap_sg, IOVMF_DISCONT | IOVMF_MMIO); if (!sgt) dev_dbg(obj->dev, "%s: No sgt\n", __func__); -- 1.7.3.4
WARNING: multiple messages have this Message-ID (diff)
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Date: Wed, 1 Jun 2011 15:30:12 +0200 [thread overview] Message-ID: <1306935012-12406-2-git-send-email-laurent.pinchart@ideasonboard.com> (raw) In-Reply-To: <20110601131744.GH11352@atomide.com> The IOMMU virtual memory mapping API requires page-aligned buffers. There's no hardware reason behind such a restriction. Remove it by rounding the address of the first page entry down, and adding the offset back to the IOMMU virtual address. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> --- arch/arm/plat-omap/iovmm.c | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-) diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index b82cef4..fa5ae98 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c @@ -60,6 +60,15 @@ static struct kmem_cache *iovm_area_cachep; +/* return the offset of the first scatterlist entry in a sg table */ +static unsigned int sgtable_offset(const struct sg_table *sgt) +{ + if (!sgt || !sgt->nents) + return 0; + + return sgt->sgl->offset; +} + /* return total bytes of sg buffers */ static size_t sgtable_len(const struct sg_table *sgt) { @@ -72,11 +81,17 @@ static size_t sgtable_len(const struct sg_table *sgt) for_each_sg(sgt->sgl, sg, sgt->nents, i) { size_t bytes; - bytes = sg_dma_len(sg); + bytes = sg_dma_len(sg) + sg->offset; if (!iopgsz_ok(bytes)) { - pr_err("%s: sg[%d] not iommu pagesize(%x)\n", - __func__, i, bytes); + pr_err("%s: sg[%d] not iommu pagesize(%u %u)\n", + __func__, i, bytes, sg->offset); + return 0; + } + + if (i && sg->offset) { + pr_err("%s: sg[%d] offset not allowed in internal " + "entries\n", __func__, i); return 0; } @@ -207,8 +222,8 @@ static void *vmap_sg(const struct sg_table *sgt) u32 pa; int err; - pa = sg_phys(sg); - bytes = sg_dma_len(sg); + pa = sg_phys(sg) - sg->offset; + bytes = sg_dma_len(sg) + sg->offset; BUG_ON(bytes != PAGE_SIZE); @@ -485,8 +500,8 @@ static int map_iovm_area(struct iommu *obj, struct iovm_struct *new, size_t bytes; struct iotlb_entry e; - pa = sg_phys(sg); - bytes = sg_dma_len(sg); + pa = sg_phys(sg) - sg->offset; + bytes = sg_dma_len(sg) + sg->offset; flags &= ~IOVMF_PGSZ_MASK; pgsz = bytes_to_iopgsz(bytes); @@ -666,7 +681,7 @@ u32 iommu_vmap(struct iommu *obj, u32 da, const struct sg_table *sgt, if (IS_ERR_VALUE(da)) vunmap_sg(va); - return da; + return da + sgtable_offset(sgt); } EXPORT_SYMBOL_GPL(iommu_vmap); @@ -685,6 +700,7 @@ struct sg_table *iommu_vunmap(struct iommu *obj, u32 da) * 'sgt' is allocated before 'iommu_vmalloc()' is called. * Just returns 'sgt' to the caller to free */ + da &= PAGE_MASK; sgt = unmap_vm_area(obj, da, vunmap_sg, IOVMF_DISCONT | IOVMF_MMIO); if (!sgt) dev_dbg(obj->dev, "%s: No sgt\n", __func__); -- 1.7.3.4
next prev parent reply other threads:[~2011-06-01 13:30 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-05-30 12:47 [PATCH 0/2] OMAP3 IOMMU fixes Laurent Pinchart 2011-05-30 12:47 ` [PATCH 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Laurent Pinchart 2011-05-31 13:22 ` Tony Lindgren 2011-06-01 12:25 ` [PATCH v2 " Laurent Pinchart 2011-06-01 13:11 ` Tony Lindgren 2011-06-01 12:25 ` [PATCH v2 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Laurent Pinchart 2011-06-01 12:50 ` Tony Lindgren 2011-06-01 13:09 ` Laurent Pinchart 2011-06-01 13:10 ` Tony Lindgren 2011-06-01 13:17 ` Tony Lindgren 2011-06-01 13:30 ` [PATCH v3 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Laurent Pinchart 2011-06-01 13:30 ` Laurent Pinchart 2011-06-01 13:43 ` Russell King - ARM Linux 2011-06-01 13:43 ` Russell King - ARM Linux 2011-06-01 13:50 ` Laurent Pinchart 2011-06-01 13:50 ` Laurent Pinchart 2011-06-01 14:03 ` Russell King - ARM Linux 2011-06-01 14:03 ` Russell King - ARM Linux 2011-06-03 0:12 ` Laurent Pinchart 2011-06-03 0:12 ` Laurent Pinchart 2011-06-03 6:32 ` Russell King - ARM Linux 2011-06-03 6:32 ` Russell King - ARM Linux 2011-06-06 16:23 ` Laurent Pinchart 2011-06-06 16:23 ` Laurent Pinchart 2011-06-06 16:44 ` Russell King - ARM Linux 2011-06-06 16:44 ` Russell King - ARM Linux 2011-06-06 16:54 ` Laurent Pinchart 2011-06-06 16:54 ` Laurent Pinchart 2011-06-06 18:00 ` Russell King - ARM Linux 2011-06-06 18:00 ` Russell King - ARM Linux 2011-06-08 10:33 ` Laurent Pinchart 2011-06-08 10:33 ` Laurent Pinchart 2011-06-03 9:39 ` Felipe Contreras 2011-06-03 9:39 ` Felipe Contreras 2011-06-01 13:30 ` Laurent Pinchart [this message] 2011-06-01 13:30 ` [PATCH v3 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Laurent Pinchart 2011-05-30 12:47 ` [PATCH " Laurent Pinchart 2011-05-30 13:16 ` [PATCH 0/2] OMAP3 IOMMU fixes Hiroshi DOYU 2011-06-08 10:48 ` Laurent Pinchart 2011-06-13 13:40 ` Tony Lindgren 2011-06-13 16:41 ` Laurent Pinchart 2011-06-13 19:34 ` Ohad Ben-Cohen
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1306935012-12406-2-git-send-email-laurent.pinchart@ideasonboard.com \ --to=laurent.pinchart@ideasonboard.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-omap@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.