My Project
mali_kbase_mem.h
Go to the documentation of this file.
1 /*
2  *
3  * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
4  *
5  * This program is free software and is provided to you under the terms of the
6  * GNU General Public License version 2 as published by the Free Software
7  * Foundation, and any use by you of this program is subject to the terms
8  * of such GNU licence.
9  *
10  * A copy of the licence is included with the program, and can also be obtained
11  * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12  * Boston, MA 02110-1301, USA.
13  *
14  */
15 
16 
17 
18 
19 
25 #ifndef _KBASE_MEM_H_
26 #define _KBASE_MEM_H_
27 
28 #ifndef _KBASE_H_
29 #error "Don't include this file directly, use mali_kbase.h instead"
30 #endif
31 
32 #include <linux/kref.h>
33 #ifdef CONFIG_KDS
34 #include <linux/kds.h>
35 #endif /* CONFIG_KDS */
36 #ifdef CONFIG_UMP
37 #include <linux/ump.h>
38 #endif /* CONFIG_UMP */
39 #include "mali_base_kernel.h"
40 #include <mali_kbase_hw.h>
41 #include "mali_kbase_pm.h"
42 #include "mali_kbase_defs.h"
43 #if defined(CONFIG_MALI_GATOR_SUPPORT)
44 #include "mali_kbase_gator.h"
45 #endif
46 /* Required for kbase_mem_evictable_unmake */
47 #include "mali_kbase_mem_linux.h"
48 
49 /* Part of the workaround for uTLB invalid pages is to ensure we grow/shrink tmem by 4 pages at a time */
50 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316 (2) /* round to 4 pages */
51 
52 /* Part of the workaround for PRLAM-9630 requires us to grow/shrink memory by 8 pages.
53 The MMU reads in 8 page table entries from memory at a time, if we have more than one page fault within the same 8 pages and
54 page tables are updated accordingly, the MMU does not re-read the page table entries from memory for the subsequent page table
55 updates and generates duplicate page faults as the page table information used by the MMU is not valid. */
56 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630 (3) /* round to 8 pages */
57 
58 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2 (0) /* round to 1 page */
59 
60 /* This must always be a power of 2 */
61 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2)
62 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_8316 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316)
63 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_9630 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630)
64 
68  struct list_head mappings_list;
69  struct kbase_mem_phy_alloc *alloc;
70  struct kbase_context *kctx;
71  struct kbase_va_region *region;
72  int count;
73  int free_on_close;
74 };
75 
76 enum kbase_memory_type {
77  KBASE_MEM_TYPE_NATIVE,
78  KBASE_MEM_TYPE_IMPORTED_UMP,
79  KBASE_MEM_TYPE_IMPORTED_UMM,
80  KBASE_MEM_TYPE_IMPORTED_USER_BUF,
81  KBASE_MEM_TYPE_ALIAS,
82  KBASE_MEM_TYPE_TB,
83  KBASE_MEM_TYPE_RAW
84 };
85 
86 /* internal structure, mirroring base_mem_aliasing_info,
87  * but with alloc instead of a gpu va (handle) */
88 struct kbase_aliased {
89  struct kbase_mem_phy_alloc *alloc; /* NULL for special, non-NULL for native */
90  u64 offset; /* in pages */
91  u64 length; /* in pages */
92 };
93 
97 #define KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED (1ul << 0)
98 #define KBASE_MEM_PHY_ALLOC_LARGE (1ul << 1)
99 
100 /* physical pages tracking object.
101  * Set up to track N pages.
102  * N not stored here, the creator holds that info.
103  * This object only tracks how many elements are actually valid (present).
104  * Changing of nents or *pages should only happen if the kbase_mem_phy_alloc is not
105  * shared with another region or client. CPU mappings are OK to exist when changing, as
106  * long as the tracked mappings objects are updated as part of the change.
107  */
109  struct kref kref; /* number of users of this alloc */
110  atomic_t gpu_mappings;
111  size_t nents; /* 0..N */
112  phys_addr_t *pages; /* N elements, only 0..nents are valid */
113 
114  /* kbase_cpu_mappings */
115  struct list_head mappings;
116 
117  /* Node used to store this allocation on the eviction list */
118  struct list_head evict_node;
119  /* Physical backing size when the pages where evicted */
120  size_t evicted;
121  /*
122  * Back reference to the region structure which created this
123  * allocation, or NULL if it has been freed.
124  */
125  struct kbase_va_region *reg;
126 
127  /* type of buffer */
128  enum kbase_memory_type type;
129 
130  unsigned long properties;
131 
132  struct list_head zone_cache;
133 
134  /* member in union valid based on @a type */
135  union {
136 #ifdef CONFIG_UMP
137  ump_dd_handle ump_handle;
138 #endif /* CONFIG_UMP */
139 #if defined(CONFIG_DMA_SHARED_BUFFER)
140  struct {
141  struct dma_buf *dma_buf;
142  struct dma_buf_attachment *dma_attachment;
143  unsigned int current_mapping_usage_count;
144  struct sg_table *sgt;
145  } umm;
146 #endif /* defined(CONFIG_DMA_SHARED_BUFFER) */
147  struct {
148  u64 stride;
149  size_t nents;
150  struct kbase_aliased *aliased;
151  } alias;
152  /* Used by type = (KBASE_MEM_TYPE_NATIVE, KBASE_MEM_TYPE_TB) */
153  struct kbase_context *kctx;
154  struct {
155  unsigned long address;
156  unsigned long size;
157  unsigned long nr_pages;
158  struct page **pages;
159  unsigned int current_mapping_usage_count;
160  struct mm_struct *mm;
161  dma_addr_t *dma_addrs;
162  } user_buf;
163  } imported;
164 };
165 
166 static inline void kbase_mem_phy_alloc_gpu_mapped(struct kbase_mem_phy_alloc *alloc)
167 {
168  KBASE_DEBUG_ASSERT(alloc);
169  /* we only track mappings of NATIVE buffers */
170  if (alloc->type == KBASE_MEM_TYPE_NATIVE)
171  atomic_inc(&alloc->gpu_mappings);
172 }
173 
174 static inline void kbase_mem_phy_alloc_gpu_unmapped(struct kbase_mem_phy_alloc *alloc)
175 {
176  KBASE_DEBUG_ASSERT(alloc);
177  /* we only track mappings of NATIVE buffers */
178  if (alloc->type == KBASE_MEM_TYPE_NATIVE)
179  if (0 > atomic_dec_return(&alloc->gpu_mappings)) {
180  pr_err("Mismatched %s:\n", __func__);
181  dump_stack();
182  }
183 }
184 
185 void kbase_mem_kref_free(struct kref *kref);
186 
187 int kbase_mem_init(struct kbase_device *kbdev);
188 void kbase_mem_halt(struct kbase_device *kbdev);
189 void kbase_mem_term(struct kbase_device *kbdev);
190 
191 static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_get(struct kbase_mem_phy_alloc *alloc)
192 {
193  kref_get(&alloc->kref);
194  return alloc;
195 }
196 
197 static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_put(struct kbase_mem_phy_alloc *alloc)
198 {
199  kref_put(&alloc->kref, kbase_mem_kref_free);
200  return NULL;
201 }
202 
207  struct rb_node rblink;
208  struct list_head link;
209 
210  struct kbase_context *kctx; /* Backlink to base context */
211 
212  u64 start_pfn; /* The PFN in GPU space */
213  size_t nr_pages;
214 
215 /* Free region */
216 #define KBASE_REG_FREE (1ul << 0)
217 /* CPU write access */
218 #define KBASE_REG_CPU_WR (1ul << 1)
219 /* GPU write access */
220 #define KBASE_REG_GPU_WR (1ul << 2)
221 /* No eXecute flag */
222 #define KBASE_REG_GPU_NX (1ul << 3)
223 /* Is CPU cached? */
224 #define KBASE_REG_CPU_CACHED (1ul << 4)
225 /* Is GPU cached? */
226 #define KBASE_REG_GPU_CACHED (1ul << 5)
227 
228 #define KBASE_REG_GROWABLE (1ul << 6)
229 /* Can grow on pf? */
230 #define KBASE_REG_PF_GROW (1ul << 7)
231 
232 /* VA managed by us */
233 #define KBASE_REG_CUSTOM_VA (1ul << 8)
234 
235 /* inner shareable coherency */
236 #define KBASE_REG_SHARE_IN (1ul << 9)
237 /* inner & outer shareable coherency */
238 #define KBASE_REG_SHARE_BOTH (1ul << 10)
239 
240 /* Space for 4 different zones */
241 #define KBASE_REG_ZONE_MASK (3ul << 11)
242 #define KBASE_REG_ZONE(x) (((x) & 3) << 11)
243 
244 /* GPU read access */
245 #define KBASE_REG_GPU_RD (1ul<<13)
246 /* CPU read access */
247 #define KBASE_REG_CPU_RD (1ul<<14)
248 
249 /* Index of chosen MEMATTR for this region (0..7) */
250 #define KBASE_REG_MEMATTR_MASK (7ul << 16)
251 #define KBASE_REG_MEMATTR_INDEX(x) (((x) & 7) << 16)
252 #define KBASE_REG_MEMATTR_VALUE(x) (((x) & KBASE_REG_MEMATTR_MASK) >> 16)
253 
254 #define KBASE_REG_SECURE (1ul << 19)
255 
256 #define KBASE_REG_DONT_NEED (1ul << 20)
257 
258 #define KBASE_REG_ZONE_SAME_VA KBASE_REG_ZONE(0)
259 
260 /* only used with 32-bit clients */
261 /*
262  * On a 32bit platform, custom VA should be wired from (4GB + shader region)
263  * to the VA limit of the GPU. Unfortunately, the Linux mmap() interface
264  * limits us to 2^32 pages (2^44 bytes, see mmap64 man page for reference).
265  * So we put the default limit to the maximum possible on Linux and shrink
266  * it down, if required by the GPU, during initialization.
267  */
268 
269 /*
270  * Dedicated 16MB region for shader code:
271  * VA range 0x101000000-0x102000000
272  */
273 #define KBASE_REG_ZONE_EXEC KBASE_REG_ZONE(1)
274 #define KBASE_REG_ZONE_EXEC_BASE (0x101000000ULL >> PAGE_SHIFT)
275 #define KBASE_REG_ZONE_EXEC_SIZE ((16ULL * 1024 * 1024) >> PAGE_SHIFT)
276 
277 #define KBASE_REG_ZONE_CUSTOM_VA KBASE_REG_ZONE(2)
278 #define KBASE_REG_ZONE_CUSTOM_VA_BASE (KBASE_REG_ZONE_EXEC_BASE + KBASE_REG_ZONE_EXEC_SIZE) /* Starting after KBASE_REG_ZONE_EXEC */
279 #define KBASE_REG_ZONE_CUSTOM_VA_SIZE (((1ULL << 44) >> PAGE_SHIFT) - KBASE_REG_ZONE_CUSTOM_VA_BASE)
280 /* end 32-bit clients only */
281 
282  unsigned long flags;
283 
284  size_t extent; /* nr of pages alloc'd on PF */
285 
286  struct kbase_mem_phy_alloc *cpu_alloc; /* the one alloc object we mmap to the CPU when mapping this region */
287  struct kbase_mem_phy_alloc *gpu_alloc; /* the one alloc object we mmap to the GPU when mapping this region */
288 
289  /* non-NULL if this memory object is a kds_resource */
290  struct kds_resource *kds_res;
291 
292  /* List head used to store the region in the JIT allocation pool */
293  struct list_head jit_node;
294 };
295 
296 /* Common functions */
297 static inline phys_addr_t *kbase_get_cpu_phy_pages(struct kbase_va_region *reg)
298 {
299  KBASE_DEBUG_ASSERT(reg);
300  KBASE_DEBUG_ASSERT(reg->cpu_alloc);
301  KBASE_DEBUG_ASSERT(reg->gpu_alloc);
302  KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
303 
304  return reg->cpu_alloc->pages;
305 }
306 
307 static inline phys_addr_t *kbase_get_gpu_phy_pages(struct kbase_va_region *reg)
308 {
309  KBASE_DEBUG_ASSERT(reg);
310  KBASE_DEBUG_ASSERT(reg->cpu_alloc);
311  KBASE_DEBUG_ASSERT(reg->gpu_alloc);
312  KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
313 
314  return reg->gpu_alloc->pages;
315 }
316 
317 static inline size_t kbase_reg_current_backed_size(struct kbase_va_region *reg)
318 {
319  KBASE_DEBUG_ASSERT(reg);
320  /* if no alloc object the backed size naturally is 0 */
321  if (!reg->cpu_alloc)
322  return 0;
323 
324  KBASE_DEBUG_ASSERT(reg->cpu_alloc);
325  KBASE_DEBUG_ASSERT(reg->gpu_alloc);
326  KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
327 
328  return reg->cpu_alloc->nents;
329 }
330 
331 #define KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD ((size_t)(4*1024)) /* size above which vmalloc is used over kmalloc */
332 
333 static inline struct kbase_mem_phy_alloc *kbase_alloc_create(size_t nr_pages, enum kbase_memory_type type)
334 {
335  struct kbase_mem_phy_alloc *alloc;
336  size_t alloc_size = sizeof(*alloc) + sizeof(*alloc->pages) * nr_pages;
337  size_t per_page_size = sizeof(*alloc->pages);
338 
339  /* Imported pages may have page private data already in use */
340  if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF) {
341  alloc_size += nr_pages *
342  sizeof(*alloc->imported.user_buf.dma_addrs);
343  per_page_size += sizeof(*alloc->imported.user_buf.dma_addrs);
344  }
345 
346  /*
347  * Prevent nr_pages*per_page_size + sizeof(*alloc) from
348  * wrapping around.
349  */
350  if (nr_pages > ((((size_t) -1) - sizeof(*alloc))
351  / per_page_size))
352  return ERR_PTR(-ENOMEM);
353 
354  /* Allocate based on the size to reduce internal fragmentation of vmem */
355  if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
356  alloc = vzalloc(alloc_size);
357  else
358  alloc = kzalloc(alloc_size, GFP_KERNEL);
359 
360  if (!alloc)
361  return ERR_PTR(-ENOMEM);
362 
363  /* Store allocation method */
364  if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
365  alloc->properties |= KBASE_MEM_PHY_ALLOC_LARGE;
366 
367  kref_init(&alloc->kref);
368  atomic_set(&alloc->gpu_mappings, 0);
369  alloc->nents = 0;
370  alloc->pages = (void *)(alloc + 1);
371  INIT_LIST_HEAD(&alloc->mappings);
372  alloc->type = type;
373  INIT_LIST_HEAD(&alloc->zone_cache);
374 
375  if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF)
376  alloc->imported.user_buf.dma_addrs =
377  (void *) (alloc->pages + nr_pages);
378 
379  return alloc;
380 }
381 
382 static inline int kbase_reg_prepare_native(struct kbase_va_region *reg,
383  struct kbase_context *kctx)
384 {
385  KBASE_DEBUG_ASSERT(reg);
386  KBASE_DEBUG_ASSERT(!reg->cpu_alloc);
387  KBASE_DEBUG_ASSERT(!reg->gpu_alloc);
388  KBASE_DEBUG_ASSERT(reg->flags & KBASE_REG_FREE);
389 
390  reg->cpu_alloc = kbase_alloc_create(reg->nr_pages,
391  KBASE_MEM_TYPE_NATIVE);
392  if (IS_ERR(reg->cpu_alloc))
393  return PTR_ERR(reg->cpu_alloc);
394  else if (!reg->cpu_alloc)
395  return -ENOMEM;
396  reg->cpu_alloc->imported.kctx = kctx;
397  INIT_LIST_HEAD(&reg->cpu_alloc->evict_node);
398  if (kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE)
399  && (reg->flags & KBASE_REG_CPU_CACHED)) {
400  reg->gpu_alloc = kbase_alloc_create(reg->nr_pages,
401  KBASE_MEM_TYPE_NATIVE);
402  reg->gpu_alloc->imported.kctx = kctx;
403  INIT_LIST_HEAD(&reg->gpu_alloc->evict_node);
404  } else {
405  reg->gpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
406  }
407 
408  INIT_LIST_HEAD(&reg->jit_node);
409  reg->flags &= ~KBASE_REG_FREE;
410  return 0;
411 }
412 
413 static inline int kbase_atomic_add_pages(int num_pages, atomic_t *used_pages)
414 {
415  int new_val = atomic_add_return(num_pages, used_pages);
416 #if defined(CONFIG_MALI_GATOR_SUPPORT)
417  kbase_trace_mali_total_alloc_pages_change((long long int)new_val);
418 #endif
419  return new_val;
420 }
421 
422 static inline int kbase_atomic_sub_pages(int num_pages, atomic_t *used_pages)
423 {
424  int new_val = atomic_sub_return(num_pages, used_pages);
425 #if defined(CONFIG_MALI_GATOR_SUPPORT)
426  kbase_trace_mali_total_alloc_pages_change((long long int)new_val);
427 #endif
428  return new_val;
429 }
430 
431 /*
432  * Max size for kbdev memory pool (in pages)
433  */
434 #define KBASE_MEM_POOL_MAX_SIZE_KBDEV (SZ_64M >> PAGE_SHIFT)
435 
436 /*
437  * Max size for kctx memory pool (in pages)
438  */
439 //#define KBASE_MEM_POOL_MAX_SIZE_KCTX (SZ_64M >> PAGE_SHIFT)
440 #define KBASE_MEM_POOL_MAX_SIZE_KCTX (SZ_4M >> PAGE_SHIFT)
441 
465 int kbase_mem_pool_init(struct kbase_mem_pool *pool,
466  size_t max_size,
467  struct kbase_device *kbdev,
468  struct kbase_mem_pool *next_pool);
469 
477 void kbase_mem_pool_term(struct kbase_mem_pool *pool);
478 
491 struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool);
492 
505 void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *page,
506  bool dirty);
507 
519 int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages,
520  phys_addr_t *pages);
521 
534 void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages,
535  phys_addr_t *pages, bool dirty, bool reclaimed);
536 
545 static inline size_t kbase_mem_pool_size(struct kbase_mem_pool *pool)
546 {
547  return ACCESS_ONCE(pool->cur_size);
548 }
549 
556 static inline size_t kbase_mem_pool_max_size(struct kbase_mem_pool *pool)
557 {
558  return pool->max_size;
559 }
560 
561 
570 void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size);
571 
582 int kbase_mem_pool_grow(struct kbase_mem_pool *pool, size_t nr_to_grow);
583 
593 void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size);
594 
595 /*
596  * kbase_mem_alloc_page - Allocate a new page for a device
597  * @kbdev: The kbase device
598  *
599  * Most uses should use kbase_mem_pool_alloc to allocate a page. However that
600  * function can fail in the event the pool is empty.
601  *
602  * Return: A new page or NULL if no memory
603  */
604 struct page *kbase_mem_alloc_page(struct kbase_device *kbdev);
605 
606 int kbase_region_tracker_init(struct kbase_context *kctx);
607 int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages);
608 void kbase_region_tracker_term(struct kbase_context *kctx);
609 
610 struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr);
611 
618 
619 struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone);
621 int kbase_add_va_region(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align);
622 
623 bool kbase_check_alloc_flags(unsigned long flags);
624 bool kbase_check_import_flags(unsigned long flags);
625 
639  struct kbase_va_region *reg, unsigned long flags);
640 
641 void kbase_gpu_vm_lock(struct kbase_context *kctx);
642 void kbase_gpu_vm_unlock(struct kbase_context *kctx);
643 
644 int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size);
645 
646 int kbase_mmu_init(struct kbase_context *kctx);
647 void kbase_mmu_term(struct kbase_context *kctx);
648 
649 phys_addr_t kbase_mmu_alloc_pgd(struct kbase_context *kctx);
650 void kbase_mmu_free_pgd(struct kbase_context *kctx);
651 int kbase_mmu_insert_pages_no_flush(struct kbase_context *kctx, u64 vpfn,
652  phys_addr_t *phys, size_t nr,
653  unsigned long flags);
654 int kbase_mmu_insert_pages(struct kbase_context *kctx, u64 vpfn,
655  phys_addr_t *phys, size_t nr,
656  unsigned long flags);
657 int kbase_mmu_insert_single_page(struct kbase_context *kctx, u64 vpfn,
658  phys_addr_t phys, size_t nr,
659  unsigned long flags);
660 
661 int kbase_mmu_teardown_pages(struct kbase_context *kctx, u64 vpfn, size_t nr);
662 int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, phys_addr_t *phys, size_t nr, unsigned long flags);
663 
669 int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align);
670 
676 int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg);
677 
683 void kbase_mmu_update(struct kbase_context *kctx);
684 
696 void kbase_mmu_disable(struct kbase_context *kctx);
697 
709 void kbase_mmu_disable_as(struct kbase_device *kbdev, int as_nr);
710 
711 void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat);
712 
728 void *kbase_mmu_dump(struct kbase_context *kctx, int nr_pages);
729 
730 int kbase_sync_now(struct kbase_context *kctx, struct base_syncset *syncset);
731 void kbase_sync_single(struct kbase_context *kctx, phys_addr_t cpu_pa,
732  phys_addr_t gpu_pa, off_t offset, size_t size,
733  enum kbase_sync_type sync_fn);
734 void kbase_pre_job_sync(struct kbase_context *kctx, struct base_syncset *syncsets, size_t nr);
735 void kbase_post_job_sync(struct kbase_context *kctx, struct base_syncset *syncsets, size_t nr);
736 
737 /* OS specific functions */
738 int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr);
739 int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *reg);
740 void kbase_os_mem_map_lock(struct kbase_context *kctx);
741 void kbase_os_mem_map_unlock(struct kbase_context *kctx);
742 
753 void kbasep_os_process_page_usage_update(struct kbase_context *kctx, int pages);
754 
765 static inline void kbase_process_page_usage_inc(struct kbase_context *kctx, int pages)
766 {
768 }
769 
780 static inline void kbase_process_page_usage_dec(struct kbase_context *kctx, int pages)
781 {
782  kbasep_os_process_page_usage_update(kctx, 0 - pages);
783 }
784 
802  struct kbase_context *kctx,
803  unsigned long uaddr, size_t size, u64 *offset);
804 
805 enum hrtimer_restart kbasep_as_poke_timer_callback(struct hrtimer *timer);
806 void kbase_as_poking_timer_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom);
807 void kbase_as_poking_timer_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom);
808 
819 int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_requested);
820 
829 int kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_to_free);
830 
831 static inline void kbase_set_dma_addr(struct page *p, dma_addr_t dma_addr)
832 {
833  SetPagePrivate(p);
834  if (sizeof(dma_addr_t) > sizeof(p->private)) {
835  /* on 32-bit ARM with LPAE dma_addr_t becomes larger, but the
836  * private field stays the same. So we have to be clever and
837  * use the fact that we only store DMA addresses of whole pages,
838  * so the low bits should be zero */
839  KBASE_DEBUG_ASSERT(!(dma_addr & (PAGE_SIZE - 1)));
840  set_page_private(p, dma_addr >> PAGE_SHIFT);
841  } else {
842  set_page_private(p, dma_addr);
843  }
844 }
845 
846 static inline dma_addr_t kbase_dma_addr(struct page *p)
847 {
848  if (sizeof(dma_addr_t) > sizeof(p->private))
849  return ((dma_addr_t)page_private(p)) << PAGE_SHIFT;
850 
851  return (dma_addr_t)page_private(p);
852 }
853 
854 static inline void kbase_clear_dma_addr(struct page *p)
855 {
856  ClearPagePrivate(p);
857 }
858 
869 void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
870  struct kbase_context *kctx, struct kbase_as *as);
871 
877 void page_fault_worker(struct work_struct *data);
878 
884 void bus_fault_worker(struct work_struct *data);
885 
894 void kbase_flush_mmu_wqs(struct kbase_device *kbdev);
895 
904 void kbase_sync_single_for_device(struct kbase_device *kbdev, dma_addr_t handle,
905  size_t size, enum dma_data_direction dir);
906 
915 void kbase_sync_single_for_cpu(struct kbase_device *kbdev, dma_addr_t handle,
916  size_t size, enum dma_data_direction dir);
917 
918 #ifdef CONFIG_HISI_DEBUG_FS
919 
923 void kbase_jit_debugfs_init(struct kbase_context *kctx);
924 #endif /* CONFIG_HISI_DEBUG_FS */
925 
932 int kbase_jit_init(struct kbase_context *kctx);
933 
942  struct base_jit_alloc_info *info);
943 
951 void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg);
952 
957 void kbase_jit_backing_lost(struct kbase_va_region *reg);
958 
968 bool kbase_jit_evict(struct kbase_context *kctx);
969 
974 void kbase_jit_term(struct kbase_context *kctx);
975 
990  struct kbase_context *kctx, struct kbase_va_region *reg,
991  struct mm_struct *locked_mm
992 #ifdef CONFIG_KDS
993  , u32 *kds_res_count, struct kds_resource **kds_resources,
994  unsigned long *kds_access_bitmap, bool exclusive
995 #endif
996  );
997 
1005  struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc);
1006 
1013 int kbase_sticky_resource_init(struct kbase_context *kctx);
1014 
1024  struct kbase_context *kctx, u64 gpu_addr);
1025 
1039  struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr);
1040 
1045 void kbase_sticky_resource_term(struct kbase_context *kctx);
1046 
1061  size_t start_offset);
1062 
1072 int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc);
1073 
1078 void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc);
1079 
1080 #endif /* _KBASE_MEM_H_ */
int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_requested)
Allocates physical pages.
Definition: mali_kbase_mem.c:1373
void kbase_free_alloced_region(struct kbase_va_region *reg)
Free a region object.
Definition: mali_kbase_mem.c:831
void kbase_unmap_external_resource(struct kbase_context *kctx, struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc)
Definition: mali_kbase_mem.c:2432
Definition: mali_kbase_defs.h:409
void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
Definition: mali_kbase_mem.c:2028
int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages, phys_addr_t *pages)
Definition: mali_kbase_mem_pool.c:451
struct page * kbase_mem_pool_alloc(struct kbase_mem_pool *pool)
Definition: mali_kbase_mem_pool.c:412
void kbase_as_poking_timer_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom)
Definition: mali_kbase_mmu.c:1919
Definition: mali_kbase_mem.h:88
Definition: mali_kbase_defs.h:1534
struct kbase_va_region * kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone)
Allocate a free region object.
Definition: mali_kbase_mem.c:789
void * kbase_mmu_dump(struct kbase_context *kctx, int nr_pages)
Definition: mali_kbase_mmu.c:1377
void kbase_gpu_vm_unlock(struct kbase_context *kctx)
Release the per-context region list lock.
Definition: mali_kbase_mem.c:1668
int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc)
Definition: mali_kbase_mem_linux.c:534
Definition: mali_kbase_defs.h:1340
void kbase_mmu_disable_as(struct kbase_device *kbdev, int as_nr)
Definition: mali_kbase_mmu.c:994
void kbase_jit_term(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:2084
void page_fault_worker(struct work_struct *data)
Process a page fault.
Definition: mali_kbase_mmu.c:112
int kbase_region_tracker_init(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:549
void kbase_mmu_update(struct kbase_context *kctx)
Definition: mali_kbase_mmu.c:980
a basic memory operation (sync-set).
Definition: mali_base_kernel.h:315
void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size)
Definition: mali_kbase_mem_pool.c:261
int kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_to_free)
Free physical pages.
Definition: mali_kbase_mem.c:1423
int kbase_mem_pool_init(struct kbase_mem_pool *pool, size_t max_size, struct kbase_device *kbdev, struct kbase_mem_pool *next_pool)
Definition: mali_kbase_mem_pool.c:333
int kbase_add_va_region(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align)
Add a VA region to the list.
Definition: mali_kbase_mem.c:412
bool kbase_sticky_resource_release(struct kbase_context *kctx, struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
Definition: mali_kbase_mem.c:2538
void kbase_sticky_resource_term(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:2584
void kbasep_os_process_page_usage_update(struct kbase_context *kctx, int pages)
Update the memory allocation counters for the current process.
Definition: mali_kbase_mem_linux.c:2437
bool kbase_jit_evict(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:2063
int kbase_sticky_resource_init(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:2577
int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn, phys_addr_t *phys, size_t nr, unsigned long flags)
Definition: mali_kbase_mmu.c:1120
Definition: mali_kbase_defs.h:937
void kbase_as_poking_timer_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom)
Definition: mali_kbase_mmu.c:1881
Definition: mali_kbase_defs.h:668
int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
Free the region from the GPU and unregister it.
Definition: mali_kbase_mem.c:1262
void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size)
Definition: mali_kbase_mem_pool.c:276
Definition: mali_kbase_mem.h:108
struct kbase_va_region * kbase_jit_allocate(struct kbase_context *kctx, struct base_jit_alloc_info *info)
Definition: mali_kbase_mem.c:1900
Definition: mali_kbase_defs.h:951
int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align)
Register region and map it on the GPU.
Definition: mali_kbase_mem.c:883
int kbase_zone_cache_update(struct kbase_mem_phy_alloc *alloc, size_t start_offset)
Definition: mali_kbase_mem_linux.c:521
struct kbase_mem_phy_alloc * kbase_map_external_resource(struct kbase_context *kctx, struct kbase_va_region *reg, struct mm_struct *locked_mm)
Definition: mali_kbase_mem.c:2356
int kbasep_find_enclosing_cpu_mapping_offset(struct kbase_context *kctx, unsigned long uaddr, size_t size, u64 *offset)
Definition: mali_kbase_mem.c:1023
int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
Remove the region from the GPU and unregister it.
Definition: mali_kbase_mem.c:964
Definition: mali_kbase_mem.h:67
Definition: mali_base_kernel.h:418
Definition: mali_kbase_mem.h:206
void kbase_mmu_interrupt_process(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_as *as)
Process a bus or page fault.
Definition: mali_kbase_mmu.c:1975
void kbase_flush_mmu_wqs(struct kbase_device *kbdev)
Flush MMU workqueues.
Definition: mali_kbase_mmu.c:2064
int kbase_update_region_flags(struct kbase_context *kctx, struct kbase_va_region *reg, unsigned long flags)
Definition: mali_kbase_mem.c:1319
struct kbase_va_region * kbase_region_tracker_find_region_base_address(struct kbase_context *kctx, u64 gpu_addr)
Check that a pointer is actually a valid region.
Definition: mali_kbase_mem.c:203
int kbase_mem_pool_grow(struct kbase_mem_pool *pool, size_t nr_to_grow)
Definition: mali_kbase_mem_pool.c:245
void kbase_mmu_disable(struct kbase_context *kctx)
Definition: mali_kbase_mmu.c:1002
int kbase_jit_init(struct kbase_context *kctx)
Definition: mali_kbase_mem.c:1887
void kbase_jit_backing_lost(struct kbase_va_region *reg)
Definition: mali_kbase_mem.c:2040
void kbase_mem_pool_term(struct kbase_mem_pool *pool)
Definition: mali_kbase_mem_pool.c:366
void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, phys_addr_t *pages, bool dirty, bool reclaimed)
Definition: mali_kbase_mem_pool.c:536
void bus_fault_worker(struct work_struct *data)
Process a bus fault.
Definition: mali_kbase_mmu.c:1455
struct kbase_ctx_ext_res_meta * kbase_sticky_resource_acquire(struct kbase_context *kctx, u64 gpu_addr)
Definition: mali_kbase_mem.c:2477
void kbase_gpu_vm_lock(struct kbase_context *kctx)
Acquire the per-context region list lock.
Definition: mali_kbase_mem.c:1657
void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc)
Definition: mali_kbase_mem_linux.c:543