Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.14.15.
 1/* Glue code to lib/swiotlb.c */
 2
 3#include <linux/pci.h>
 4#include <linux/gfp.h>
 5#include <linux/cache.h>
 6#include <linux/module.h>
 7#include <linux/dma-mapping.h>
 8
 9#include <asm/swiotlb.h>
10#include <asm/dma.h>
11#include <asm/iommu.h>
12#include <asm/machvec.h>
13
14int swiotlb __read_mostly;
15EXPORT_SYMBOL(swiotlb);
16
17static void *ia64_swiotlb_alloc_coherent(struct device *dev, size_t size,
18					 dma_addr_t *dma_handle, gfp_t gfp)
19{
20	if (dev->coherent_dma_mask != DMA_BIT_MASK(64))
21		gfp |= GFP_DMA;
22	return swiotlb_alloc_coherent(dev, size, dma_handle, gfp);
23}
24
25struct dma_map_ops swiotlb_dma_ops = {
26	.alloc_coherent = ia64_swiotlb_alloc_coherent,
27	.free_coherent = swiotlb_free_coherent,
28	.map_page = swiotlb_map_page,
29	.unmap_page = swiotlb_unmap_page,
30	.map_sg = swiotlb_map_sg_attrs,
31	.unmap_sg = swiotlb_unmap_sg_attrs,
32	.sync_single_for_cpu = swiotlb_sync_single_for_cpu,
33	.sync_single_for_device = swiotlb_sync_single_for_device,
34	.sync_sg_for_cpu = swiotlb_sync_sg_for_cpu,
35	.sync_sg_for_device = swiotlb_sync_sg_for_device,
36	.dma_supported = swiotlb_dma_supported,
37	.mapping_error = swiotlb_dma_mapping_error,
38};
39
40void __init swiotlb_dma_init(void)
41{
42	dma_ops = &swiotlb_dma_ops;
43	swiotlb_init(1);
44}
45
46void __init pci_swiotlb_init(void)
47{
48	if (!iommu_detected) {
49#ifdef CONFIG_IA64_GENERIC
50		swiotlb = 1;
51		printk(KERN_INFO "PCI-DMA: Re-initialize machine vector.\n");
52		machvec_init("dig");
53		swiotlb_init(1);
54		dma_ops = &swiotlb_dma_ops;
55#else
56		panic("Unable to find Intel IOMMU");
57#endif
58	}
59}