static inline int
need_iommu(struct device *dev, unsigned long addr, size_t size)
{
- u64 mask = *dev->dma_mask;
- int high = addr + size > mask;
- int mmu = high;
-
- if (force_iommu)
- mmu = 1;
-
- return mmu;
+ return force_iommu ||
+ !is_buffer_dma_capable(*dev->dma_mask, addr, size);
}
static inline int
nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
{
- u64 mask = *dev->dma_mask;
- int high = addr + size > mask;
- int mmu = high;
-
- return mmu;
+ return !is_buffer_dma_capable(*dev->dma_mask, addr, size);
}
/* Map a single continuous physical area into the IOMMU.
gfp_t flag)
{
void *vaddr;
+ dma_addr_t paddr;
unsigned long align_mask;
+ u64 dma_mask = dma_alloc_coherent_mask(dev, flag);
vaddr = (void *)__get_free_pages(flag | __GFP_ZERO, get_order(size));
if (!vaddr)
return NULL;
+ paddr = virt_to_phys(vaddr);
+ if (is_buffer_dma_capable(dma_mask, paddr, size)) {
+ *dma_addr = paddr;
+ return vaddr;
+ }
+
align_mask = (1UL << get_order(size)) - 1;
- *dma_addr = dma_map_area(dev, __pa(vaddr), size, DMA_BIDIRECTIONAL,
+ *dma_addr = dma_map_area(dev, paddr, size, DMA_BIDIRECTIONAL,
align_mask);
flush_gart();
* Out of IOMMU space handling.
* Reserve some invalid pages at the beginning of the GART.
*/
- set_bit_string(iommu_gart_bitmap, 0, EMERGENCY_PAGES);
+ iommu_area_reserve(iommu_gart_bitmap, 0, EMERGENCY_PAGES);
agp_memory_reserved = iommu_size;
printk(KERN_INFO