| /* Glue code to lib/swiotlb.c */ |
| |
| #include <linux/pci.h> |
| #include <linux/cache.h> |
| #include <linux/module.h> |
| #include <linux/dma-mapping.h> |
| |
| #include <asm/swiotlb.h> |
| #include <asm/dma.h> |
| #include <asm/iommu.h> |
| #include <asm/machvec.h> |
| |
| int swiotlb __read_mostly; |
| EXPORT_SYMBOL(swiotlb); |
| |
| /* Set this to 1 if there is a HW IOMMU in the system */ |
| int iommu_detected __read_mostly; |
| |
| static dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, |
| unsigned long offset, size_t size, |
| enum dma_data_direction dir, |
| struct dma_attrs *attrs) |
| { |
| return swiotlb_map_single_attrs(dev, page_address(page) + offset, size, |
| dir, attrs); |
| } |
| |
| static void swiotlb_unmap_page(struct device *dev, dma_addr_t dma_handle, |
| size_t size, enum dma_data_direction dir, |
| struct dma_attrs *attrs) |
| { |
| swiotlb_unmap_single_attrs(dev, dma_handle, size, dir, attrs); |
| } |
| |
| struct dma_map_ops swiotlb_dma_ops = { |
| .alloc_coherent = swiotlb_alloc_coherent, |
| .free_coherent = swiotlb_free_coherent, |
| .map_page = swiotlb_map_page, |
| .unmap_page = swiotlb_unmap_page, |
| .map_sg = swiotlb_map_sg_attrs, |
| .unmap_sg = swiotlb_unmap_sg_attrs, |
| .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
| .sync_single_for_device = swiotlb_sync_single_for_device, |
| .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, |
| .sync_single_range_for_device = swiotlb_sync_single_range_for_device, |
| .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
| .sync_sg_for_device = swiotlb_sync_sg_for_device, |
| .dma_supported = swiotlb_dma_supported, |
| .mapping_error = swiotlb_dma_mapping_error, |
| }; |
| |
| void swiotlb_dma_init(void) |
| { |
| dma_ops = &swiotlb_dma_ops; |
| swiotlb_init(); |
| } |
| |
| void __init pci_swiotlb_init(void) |
| { |
| if (!iommu_detected) { |
| #ifdef CONFIG_IA64_GENERIC |
| swiotlb = 1; |
| printk(KERN_INFO "PCI-DMA: Re-initialize machine vector.\n"); |
| machvec_init("dig"); |
| swiotlb_init(); |
| dma_ops = &swiotlb_dma_ops; |
| #else |
| panic("Unable to find Intel IOMMU"); |
| #endif |
| } |
| } |