Blame view

include/linux/dma-contiguous.h 4.45 KB
c64be2bb1   Marek Szyprowski   drivers: add Cont...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  #ifndef __LINUX_CMA_H
  #define __LINUX_CMA_H
  
  /*
   * Contiguous Memory Allocator for DMA mapping framework
   * Copyright (c) 2010-2011 by Samsung Electronics.
   * Written by:
   *	Marek Szyprowski <m.szyprowski@samsung.com>
   *	Michal Nazarewicz <mina86@mina86.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
   * published by the Free Software Foundation; either version 2 of the
   * License or (at your optional) any later version of the license.
   */
  
  /*
   * Contiguous Memory Allocator
   *
   *   The Contiguous Memory Allocator (CMA) makes it possible to
   *   allocate big contiguous chunks of memory after the system has
   *   booted.
   *
   * Why is it needed?
   *
   *   Various devices on embedded systems have no scatter-getter and/or
   *   IO map support and require contiguous blocks of memory to
   *   operate.  They include devices such as cameras, hardware video
   *   coders, etc.
   *
   *   Such devices often require big memory buffers (a full HD frame
   *   is, for instance, more then 2 mega pixels large, i.e. more than 6
   *   MB of memory), which makes mechanisms such as kmalloc() or
   *   alloc_page() ineffective.
   *
   *   At the same time, a solution where a big memory region is
   *   reserved for a device is suboptimal since often more memory is
   *   reserved then strictly required and, moreover, the memory is
   *   inaccessible to page system even if device drivers don't use it.
   *
   *   CMA tries to solve this issue by operating on memory regions
   *   where only movable pages can be allocated from.  This way, kernel
   *   can use the memory for pagecache and when device driver requests
   *   it, allocated pages can be migrated.
   *
   * Driver usage
   *
   *   CMA should not be used by the device drivers directly. It is
   *   only a helper framework for dma-mapping subsystem.
   *
   *   For more information, see kernel-docs in drivers/base/dma-contiguous.c
   */
  
  #ifdef __KERNEL__
a254129e8   Joonsoo Kim   CMA: generalize C...
55
  #include <linux/device.h>
c64be2bb1   Marek Szyprowski   drivers: add Cont...
56
57
  struct cma;
  struct page;
c64be2bb1   Marek Szyprowski   drivers: add Cont...
58

f825c736e   Aneesh Kumar K.V   mm/cma: Move dma ...
59
  #ifdef CONFIG_DMA_CMA
c64be2bb1   Marek Szyprowski   drivers: add Cont...
60

c64be2bb1   Marek Szyprowski   drivers: add Cont...
61
  extern struct cma *dma_contiguous_default_area;
a25473803   Marek Szyprowski   drivers: dma-cont...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  static inline struct cma *dev_get_cma_area(struct device *dev)
  {
  	if (dev && dev->cma_area)
  		return dev->cma_area;
  	return dma_contiguous_default_area;
  }
  
  static inline void dev_set_cma_area(struct device *dev, struct cma *cma)
  {
  	if (dev)
  		dev->cma_area = cma;
  }
  
  static inline void dma_contiguous_set_default(struct cma *cma)
  {
  	dma_contiguous_default_area = cma;
  }
c64be2bb1   Marek Szyprowski   drivers: add Cont...
79
  void dma_contiguous_reserve(phys_addr_t addr_limit);
a25473803   Marek Szyprowski   drivers: dma-cont...
80
81
  
  int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
5ea3b1b2f   Akinobu Mita   cma: add placemen...
82
83
  				       phys_addr_t limit, struct cma **res_cma,
  				       bool fixed);
a25473803   Marek Szyprowski   drivers: dma-cont...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  
  /**
   * dma_declare_contiguous() - reserve area for contiguous memory handling
   *			      for particular device
   * @dev:   Pointer to device structure.
   * @size:  Size of the reserved memory.
   * @base:  Start address of the reserved memory (optional, 0 for any).
   * @limit: End address of the reserved memory (optional, 0 for any).
   *
   * This function reserves memory for specified device. It should be
   * called by board specific code when early allocator (memblock or bootmem)
   * is still activate.
   */
  
  static inline int dma_declare_contiguous(struct device *dev, phys_addr_t size,
  					 phys_addr_t base, phys_addr_t limit)
  {
  	struct cma *cma;
  	int ret;
5ea3b1b2f   Akinobu Mita   cma: add placemen...
103
  	ret = dma_contiguous_reserve_area(size, base, limit, &cma, true);
a25473803   Marek Szyprowski   drivers: dma-cont...
104
105
106
107
108
  	if (ret == 0)
  		dev_set_cma_area(dev, cma);
  
  	return ret;
  }
c64be2bb1   Marek Szyprowski   drivers: add Cont...
109

67a2e213e   Rohit Vaswani   mm: cma: fix inco...
110
  struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
c64be2bb1   Marek Szyprowski   drivers: add Cont...
111
112
113
114
115
  				       unsigned int order);
  bool dma_release_from_contiguous(struct device *dev, struct page *pages,
  				 int count);
  
  #else
a25473803   Marek Szyprowski   drivers: dma-cont...
116
117
118
119
120
121
122
123
  static inline struct cma *dev_get_cma_area(struct device *dev)
  {
  	return NULL;
  }
  
  static inline void dev_set_cma_area(struct device *dev, struct cma *cma) { }
  
  static inline void dma_contiguous_set_default(struct cma *cma) { }
c64be2bb1   Marek Szyprowski   drivers: add Cont...
124
  static inline void dma_contiguous_reserve(phys_addr_t limit) { }
a25473803   Marek Szyprowski   drivers: dma-cont...
125
  static inline int dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
5ea3b1b2f   Akinobu Mita   cma: add placemen...
126
127
128
  				       phys_addr_t limit, struct cma **res_cma,
  				       bool fixed)
  {
a25473803   Marek Szyprowski   drivers: dma-cont...
129
130
  	return -ENOSYS;
  }
c64be2bb1   Marek Szyprowski   drivers: add Cont...
131
  static inline
4009793e1   Vitaly Andrianov   drivers: cma: rep...
132
  int dma_declare_contiguous(struct device *dev, phys_addr_t size,
c64be2bb1   Marek Szyprowski   drivers: add Cont...
133
134
135
136
137
138
  			   phys_addr_t base, phys_addr_t limit)
  {
  	return -ENOSYS;
  }
  
  static inline
67a2e213e   Rohit Vaswani   mm: cma: fix inco...
139
  struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
c64be2bb1   Marek Szyprowski   drivers: add Cont...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  				       unsigned int order)
  {
  	return NULL;
  }
  
  static inline
  bool dma_release_from_contiguous(struct device *dev, struct page *pages,
  				 int count)
  {
  	return false;
  }
  
  #endif
  
  #endif
  
  #endif