@@ -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;
}
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 <hch@lst.de> --- arch/x86/kernel/pci-calgary_64.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)