For the iommu offset we just need and offset into the page.  Calculate
that using the physical address instead of using the virtual address
so that we don't require a virtual mapping.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 arch/x86/kernel/pci-calgary_64.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
index 0497f71..8f1581d 100644
--- a/arch/x86/kernel/pci-calgary_64.c
+++ b/arch/x86/kernel/pci-calgary_64.c
@@ -368,16 +368,14 @@ static int calgary_map_sg(struct device *dev, struct 
scatterlist *sg,
 {
        struct iommu_table *tbl = find_iommu_table(dev);
        struct scatterlist *s;
-       unsigned long vaddr;
+       unsigned long paddr;
        unsigned int npages;
        unsigned long entry;
        int i;
 
        for_each_sg(sg, s, nelems, i) {
-               BUG_ON(!sg_page(s));
-
-               vaddr = (unsigned long) sg_virt(s);
-               npages = iommu_num_pages(vaddr, s->length, PAGE_SIZE);
+               paddr = sg_phys(s);
+               npages = iommu_num_pages(paddr, s->length, PAGE_SIZE);
 
                entry = iommu_range_alloc(dev, tbl, npages);
                if (entry == DMA_ERROR_CODE) {
@@ -389,7 +387,7 @@ static int calgary_map_sg(struct device *dev, struct 
scatterlist *sg,
                s->dma_address = (entry << PAGE_SHIFT) | s->offset;
 
                /* insert into HW table */
-               tce_build(tbl, entry, npages, vaddr & PAGE_MASK, dir);
+               tce_build(tbl, entry, npages, paddr & PAGE_MASK, dir);
 
                s->dma_length = s->length;
        }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-metag" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to