29 #error "Don't include this file directly, use mali_kbase.h instead" 32 #include <linux/kref.h> 34 #include <linux/kds.h> 37 #include <linux/ump.h> 43 #if defined(CONFIG_MALI_GATOR_SUPPORT) 44 #include "mali_kbase_gator.h" 50 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316 (2) 56 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630 (3) 58 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2 (0) 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) 68 struct list_head mappings_list;
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,
97 #define KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED (1ul << 0) 98 #define KBASE_MEM_PHY_ALLOC_LARGE (1ul << 1) 110 atomic_t gpu_mappings;
115 struct list_head mappings;
118 struct list_head evict_node;
128 enum kbase_memory_type type;
130 unsigned long properties;
132 struct list_head zone_cache;
137 ump_dd_handle ump_handle;
139 #if defined(CONFIG_DMA_SHARED_BUFFER) 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;
155 unsigned long address;
157 unsigned long nr_pages;
159 unsigned int current_mapping_usage_count;
160 struct mm_struct *mm;
161 dma_addr_t *dma_addrs;
168 KBASE_DEBUG_ASSERT(alloc);
170 if (alloc->type == KBASE_MEM_TYPE_NATIVE)
171 atomic_inc(&alloc->gpu_mappings);
176 KBASE_DEBUG_ASSERT(alloc);
178 if (alloc->type == KBASE_MEM_TYPE_NATIVE)
179 if (0 > atomic_dec_return(&alloc->gpu_mappings)) {
180 pr_err(
"Mismatched %s:\n", __func__);
185 void kbase_mem_kref_free(
struct kref *kref);
193 kref_get(&alloc->kref);
199 kref_put(&alloc->kref, kbase_mem_kref_free);
207 struct rb_node rblink;
208 struct list_head link;
216 #define KBASE_REG_FREE (1ul << 0) 218 #define KBASE_REG_CPU_WR (1ul << 1) 220 #define KBASE_REG_GPU_WR (1ul << 2) 222 #define KBASE_REG_GPU_NX (1ul << 3) 224 #define KBASE_REG_CPU_CACHED (1ul << 4) 226 #define KBASE_REG_GPU_CACHED (1ul << 5) 228 #define KBASE_REG_GROWABLE (1ul << 6) 230 #define KBASE_REG_PF_GROW (1ul << 7) 233 #define KBASE_REG_CUSTOM_VA (1ul << 8) 236 #define KBASE_REG_SHARE_IN (1ul << 9) 238 #define KBASE_REG_SHARE_BOTH (1ul << 10) 241 #define KBASE_REG_ZONE_MASK (3ul << 11) 242 #define KBASE_REG_ZONE(x) (((x) & 3) << 11) 245 #define KBASE_REG_GPU_RD (1ul<<13) 247 #define KBASE_REG_CPU_RD (1ul<<14) 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) 254 #define KBASE_REG_SECURE (1ul << 19) 256 #define KBASE_REG_DONT_NEED (1ul << 20) 258 #define KBASE_REG_ZONE_SAME_VA KBASE_REG_ZONE(0) 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) 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) 279 #define KBASE_REG_ZONE_CUSTOM_VA_SIZE (((1ULL << 44) >> PAGE_SHIFT) - KBASE_REG_ZONE_CUSTOM_VA_BASE) 290 struct kds_resource *kds_res;
293 struct list_head jit_node;
297 static inline phys_addr_t *kbase_get_cpu_phy_pages(
struct kbase_va_region *reg)
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);
304 return reg->cpu_alloc->pages;
307 static inline phys_addr_t *kbase_get_gpu_phy_pages(
struct kbase_va_region *reg)
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);
314 return reg->gpu_alloc->pages;
317 static inline size_t kbase_reg_current_backed_size(
struct kbase_va_region *reg)
319 KBASE_DEBUG_ASSERT(reg);
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);
328 return reg->cpu_alloc->nents;
331 #define KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD ((size_t)(4*1024)) 333 static inline struct kbase_mem_phy_alloc *kbase_alloc_create(
size_t nr_pages,
enum kbase_memory_type type)
336 size_t alloc_size =
sizeof(*alloc) +
sizeof(*alloc->pages) * nr_pages;
337 size_t per_page_size =
sizeof(*alloc->pages);
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);
350 if (nr_pages > ((((
size_t) -1) -
sizeof(*alloc))
352 return ERR_PTR(-ENOMEM);
355 if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
356 alloc = vzalloc(alloc_size);
358 alloc = kzalloc(alloc_size, GFP_KERNEL);
361 return ERR_PTR(-ENOMEM);
364 if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
365 alloc->properties |= KBASE_MEM_PHY_ALLOC_LARGE;
367 kref_init(&alloc->kref);
368 atomic_set(&alloc->gpu_mappings, 0);
370 alloc->pages = (
void *)(alloc + 1);
371 INIT_LIST_HEAD(&alloc->mappings);
373 INIT_LIST_HEAD(&alloc->zone_cache);
375 if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF)
376 alloc->imported.user_buf.dma_addrs =
377 (
void *) (alloc->pages + nr_pages);
382 static inline int kbase_reg_prepare_native(
struct kbase_va_region *reg,
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);
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)
396 reg->cpu_alloc->imported.kctx = kctx;
397 INIT_LIST_HEAD(®->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(®->gpu_alloc->evict_node);
405 reg->gpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
408 INIT_LIST_HEAD(®->jit_node);
409 reg->flags &= ~KBASE_REG_FREE;
413 static inline int kbase_atomic_add_pages(
int num_pages, atomic_t *used_pages)
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);
422 static inline int kbase_atomic_sub_pages(
int num_pages, atomic_t *used_pages)
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);
434 #define KBASE_MEM_POOL_MAX_SIZE_KBDEV (SZ_64M >> PAGE_SHIFT) 440 #define KBASE_MEM_POOL_MAX_SIZE_KCTX (SZ_4M >> PAGE_SHIFT) 505 void kbase_mem_pool_free(
struct kbase_mem_pool *pool,
struct page *page,
535 phys_addr_t *pages,
bool dirty,
bool reclaimed);
545 static inline size_t kbase_mem_pool_size(
struct kbase_mem_pool *pool)
547 return ACCESS_ONCE(pool->cur_size);
556 static inline size_t kbase_mem_pool_max_size(
struct kbase_mem_pool *pool)
558 return pool->max_size;
604 struct page *kbase_mem_alloc_page(
struct kbase_device *kbdev);
607 int kbase_region_tracker_init_jit(
struct kbase_context *kctx, u64 jit_va_pages);
623 bool kbase_check_alloc_flags(
unsigned long flags);
624 bool kbase_check_import_flags(
unsigned long flags);
644 int kbase_alloc_phy_pages(
struct kbase_va_region *reg,
size_t vsize,
size_t size);
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);
661 int kbase_mmu_teardown_pages(
struct kbase_context *kctx, u64 vpfn,
size_t nr);
711 void kbase_mmu_interrupt(
struct kbase_device *kbdev, u32 irq_stat);
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);
765 static inline void kbase_process_page_usage_inc(
struct kbase_context *kctx,
int pages)
780 static inline void kbase_process_page_usage_dec(
struct kbase_context *kctx,
int pages)
803 unsigned long uaddr,
size_t size, u64 *offset);
805 enum hrtimer_restart kbasep_as_poke_timer_callback(
struct hrtimer *timer);
831 static inline void kbase_set_dma_addr(
struct page *p, dma_addr_t dma_addr)
834 if (
sizeof(dma_addr_t) >
sizeof(p->private)) {
839 KBASE_DEBUG_ASSERT(!(dma_addr & (PAGE_SIZE - 1)));
840 set_page_private(p, dma_addr >> PAGE_SHIFT);
842 set_page_private(p, dma_addr);
846 static inline dma_addr_t kbase_dma_addr(
struct page *p)
848 if (
sizeof(dma_addr_t) >
sizeof(p->private))
849 return ((dma_addr_t)page_private(p)) << PAGE_SHIFT;
851 return (dma_addr_t)page_private(p);
854 static inline void kbase_clear_dma_addr(
struct page *p)
904 void kbase_sync_single_for_device(
struct kbase_device *kbdev, dma_addr_t handle,
905 size_t size,
enum dma_data_direction dir);
915 void kbase_sync_single_for_cpu(
struct kbase_device *kbdev, dma_addr_t handle,
916 size_t size,
enum dma_data_direction dir);
918 #ifdef CONFIG_HISI_DEBUG_FS 991 struct mm_struct *locked_mm
993 , u32 *kds_res_count,
struct kds_resource **kds_resources,
994 unsigned long *kds_access_bitmap,
bool exclusive
1061 size_t start_offset);
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
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