1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Medifield PNW Camera Imaging ISP subsystem.
4  *
5  * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
6  *
7  * Copyright (c) 2010 Silicon Hive www.siliconhive.com.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version
11  * 2 as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  *
19  */
20 
21 #ifndef	__HMM_H__
22 #define	__HMM_H__
23 
24 #include <linux/kernel.h>
25 #include <linux/types.h>
26 #include <linux/slab.h>
27 #include <linux/mm.h>
28 
29 #include "hmm/hmm_pool.h"
30 #include "ia_css_types.h"
31 
32 #define mmgr_NULL              ((ia_css_ptr)0)
33 #define mmgr_EXCEPTION         ((ia_css_ptr) - 1)
34 
35 int hmm_pool_register(unsigned int pool_size, enum hmm_pool_type pool_type);
36 void hmm_pool_unregister(enum hmm_pool_type pool_type);
37 
38 int hmm_init(void);
39 void hmm_cleanup(void);
40 
41 ia_css_ptr hmm_alloc(size_t bytes, enum hmm_bo_type type,
42 		     int from_highmem, const void __user *userptr,
43 		     const uint16_t attrs);
44 void hmm_free(ia_css_ptr ptr);
45 int hmm_load(ia_css_ptr virt, void *data, unsigned int bytes);
46 int hmm_store(ia_css_ptr virt, const void *data, unsigned int bytes);
47 int hmm_set(ia_css_ptr virt, int c, unsigned int bytes);
48 int hmm_flush(ia_css_ptr virt, unsigned int bytes);
49 
50 /*
51  * get kernel memory physical address from ISP virtual address.
52  */
53 phys_addr_t hmm_virt_to_phys(ia_css_ptr virt);
54 
55 /*
56  * map ISP memory starts with virt to kernel virtual address
57  * by using vmap. return NULL if failed.
58  *
59  * virt must be the start address of ISP memory (return by hmm_alloc),
60  * do not pass any other address.
61  */
62 void *hmm_vmap(ia_css_ptr virt, bool cached);
63 void hmm_vunmap(ia_css_ptr virt);
64 
65 /*
66  * flush the cache for the vmapped buffer.
67  * if the buffer has not been vmapped, return directly.
68  */
69 void hmm_flush_vmap(ia_css_ptr virt);
70 
71 /*
72  * Address translation from ISP shared memory address to kernel virtual address
73  * if the memory is not vmmaped,  then do it.
74  */
75 void *hmm_isp_vaddr_to_host_vaddr(ia_css_ptr ptr, bool cached);
76 
77 /*
78  * Address translation from kernel virtual address to ISP shared memory address
79  */
80 ia_css_ptr hmm_host_vaddr_to_hrt_vaddr(const void *ptr);
81 
82 /*
83  * map ISP memory starts with virt to specific vma.
84  *
85  * used for mmap operation.
86  *
87  * virt must be the start address of ISP memory (return by hmm_alloc),
88  * do not pass any other address.
89  */
90 int hmm_mmap(struct vm_area_struct *vma, ia_css_ptr virt);
91 
92 /* show memory statistic
93  */
94 void hmm_show_mem_stat(const char *func, const int line);
95 
96 /* init memory statistic
97  */
98 void hmm_init_mem_stat(int res_pgnr, int dyc_en, int dyc_pgnr);
99 
100 extern bool dypool_enable;
101 extern unsigned int dypool_pgnr;
102 extern struct hmm_bo_device bo_device;
103 
104 #endif
105