Blame view

lib/dma-noop.c 1.65 KB
a8463d4b0   Christian Borntraeger   dma: Provide simp...
1
2
3
4
5
6
7
8
9
10
11
12
  /*
   *	lib/dma-noop.c
   *
   * Simple DMA noop-ops that map 1:1 with memory
   */
  #include <linux/export.h>
  #include <linux/mm.h>
  #include <linux/dma-mapping.h>
  #include <linux/scatterlist.h>
  
  static void *dma_noop_alloc(struct device *dev, size_t size,
  			    dma_addr_t *dma_handle, gfp_t gfp,
00085f1ef   Krzysztof Kozlowski   dma-mapping: use ...
13
  			    unsigned long attrs)
a8463d4b0   Christian Borntraeger   dma: Provide simp...
14
15
16
17
18
19
20
21
22
23
24
  {
  	void *ret;
  
  	ret = (void *)__get_free_pages(gfp, get_order(size));
  	if (ret)
  		*dma_handle = virt_to_phys(ret);
  	return ret;
  }
  
  static void dma_noop_free(struct device *dev, size_t size,
  			  void *cpu_addr, dma_addr_t dma_addr,
00085f1ef   Krzysztof Kozlowski   dma-mapping: use ...
25
  			  unsigned long attrs)
a8463d4b0   Christian Borntraeger   dma: Provide simp...
26
27
28
29
30
31
32
  {
  	free_pages((unsigned long)cpu_addr, get_order(size));
  }
  
  static dma_addr_t dma_noop_map_page(struct device *dev, struct page *page,
  				      unsigned long offset, size_t size,
  				      enum dma_data_direction dir,
00085f1ef   Krzysztof Kozlowski   dma-mapping: use ...
33
  				      unsigned long attrs)
a8463d4b0   Christian Borntraeger   dma: Provide simp...
34
35
36
37
38
  {
  	return page_to_phys(page) + offset;
  }
  
  static int dma_noop_map_sg(struct device *dev, struct scatterlist *sgl, int nents,
00085f1ef   Krzysztof Kozlowski   dma-mapping: use ...
39
40
  			     enum dma_data_direction dir,
  			     unsigned long attrs)
a8463d4b0   Christian Borntraeger   dma: Provide simp...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  {
  	int i;
  	struct scatterlist *sg;
  
  	for_each_sg(sgl, sg, nents, i) {
  		void *va;
  
  		BUG_ON(!sg_page(sg));
  		va = sg_virt(sg);
  		sg_dma_address(sg) = (dma_addr_t)virt_to_phys(va);
  		sg_dma_len(sg) = sg->length;
  	}
  
  	return nents;
  }
  
  static int dma_noop_mapping_error(struct device *dev, dma_addr_t dma_addr)
  {
  	return 0;
  }
  
  static int dma_noop_supported(struct device *dev, u64 mask)
  {
  	return 1;
  }
  
  struct dma_map_ops dma_noop_ops = {
  	.alloc			= dma_noop_alloc,
  	.free			= dma_noop_free,
  	.map_page		= dma_noop_map_page,
  	.map_sg			= dma_noop_map_sg,
  	.mapping_error		= dma_noop_mapping_error,
  	.dma_supported		= dma_noop_supported,
  };
  
  EXPORT_SYMBOL(dma_noop_ops);