1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2015, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15 
16 #ifndef __IA_CSS_DVS_H
17 #define __IA_CSS_DVS_H
18 
19 /* @file
20  * This file contains types for DVS statistics
21  */
22 
23 #include <type_support.h>
24 #include "ia_css_types.h"
25 #include "ia_css_err.h"
26 #include "ia_css_stream_public.h"
27 
28 enum dvs_statistics_type {
29 	DVS_STATISTICS,
30 	DVS2_STATISTICS,
31 	SKC_DVS_STATISTICS
32 };
33 
34 /* Structure that holds DVS statistics in the ISP internal
35  * format. Use ia_css_get_dvs_statistics() to translate
36  * this to the format used on the host (DVS engine).
37  * */
38 struct ia_css_isp_dvs_statistics {
39 	ia_css_ptr hor_proj;
40 	ia_css_ptr ver_proj;
41 	u32   hor_size;
42 	u32   ver_size;
43 	u32   exp_id;   /** see ia_css_event_public.h for more detail */
44 	ia_css_ptr data_ptr; /* base pointer containing all memory */
45 	u32   size;     /* size of allocated memory in data_ptr */
46 };
47 
48 /* Structure that holds SKC DVS statistics in the ISP internal
49  * format. Use ia_css_dvs_statistics_get() to translate this to
50  * the format used on the host.
51  * */
52 struct ia_css_isp_skc_dvs_statistics;
53 
54 #define SIZE_OF_IA_CSS_ISP_DVS_STATISTICS_STRUCT			\
55 	((3 * SIZE_OF_IA_CSS_PTR) +					\
56 	 (4 * sizeof(uint32_t)))
57 
58 /* Map with host-side pointers to ISP-format statistics.
59  * These pointers can either be copies of ISP data or memory mapped
60  * ISP pointers.
61  * All of the data behind these pointers is allocatd contiguously, the
62  * allocated pointer is stored in the data_ptr field. The other fields
63  * point into this one block of data.
64  */
65 struct ia_css_isp_dvs_statistics_map {
66 	void    *data_ptr;
67 	s32 *hor_proj;
68 	s32 *ver_proj;
69 	u32 size;		 /* total size in bytes */
70 	u32 data_allocated; /* indicate whether data was allocated */
71 };
72 
73 union ia_css_dvs_statistics_isp {
74 	struct ia_css_isp_dvs_statistics *p_dvs_statistics_isp;
75 	struct ia_css_isp_skc_dvs_statistics *p_skc_dvs_statistics_isp;
76 };
77 
78 union ia_css_dvs_statistics_host {
79 	struct ia_css_dvs_statistics *p_dvs_statistics_host;
80 	struct ia_css_dvs2_statistics *p_dvs2_statistics_host;
81 	struct ia_css_skc_dvs_statistics *p_skc_dvs_statistics_host;
82 };
83 
84 /* @brief Copy DVS statistics from an ISP buffer to a host buffer.
85  * @param[in]	host_stats Host buffer
86  * @param[in]	isp_stats ISP buffer
87  * @return	error value if temporary memory cannot be allocated
88  *
89  * This may include a translation step as well depending
90  * on the ISP version.
91  * Always use this function, never copy the buffer directly.
92  * Note that this function uses the mem_load function from the CSS
93  * environment struct.
94  * In certain environments this may be slow. In those cases it is
95  * advised to map the ISP memory into a host-side pointer and use
96  * the ia_css_translate_dvs_statistics() function instead.
97  */
98 int
99 ia_css_get_dvs_statistics(struct ia_css_dvs_statistics *host_stats,
100 			  const struct ia_css_isp_dvs_statistics *isp_stats);
101 
102 /* @brief Translate DVS statistics from ISP format to host format
103  * @param[in]	host_stats Host buffer
104  * @param[in]	isp_stats ISP buffer
105  * @return	None
106  *
107  * This function translates the dvs statistics from the ISP-internal
108  * format to the format used by the DVS library on the CPU.
109  * This function takes a host-side pointer as input. This can either
110  * point to a copy of the data or be a memory mapped pointer to the
111  * ISP memory pages.
112  */
113 void
114 ia_css_translate_dvs_statistics(
115     struct ia_css_dvs_statistics *host_stats,
116     const struct ia_css_isp_dvs_statistics_map *isp_stats);
117 
118 /* @brief Copy DVS 2.0 statistics from an ISP buffer to a host buffer.
119  * @param[in]	host_stats Host buffer
120  * @param[in]	isp_stats ISP buffer
121  * @return	error value if temporary memory cannot be allocated
122  *
123  * This may include a translation step as well depending
124  * on the ISP version.
125  * Always use this function, never copy the buffer directly.
126  * Note that this function uses the mem_load function from the CSS
127  * environment struct.
128  * In certain environments this may be slow. In those cases it is
129  * advised to map the ISP memory into a host-side pointer and use
130  * the ia_css_translate_dvs2_statistics() function instead.
131  */
132 int
133 ia_css_get_dvs2_statistics(struct ia_css_dvs2_statistics *host_stats,
134 			   const struct ia_css_isp_dvs_statistics *isp_stats);
135 
136 /* @brief Translate DVS2 statistics from ISP format to host format
137  * @param[in]	host_stats Host buffer
138  * @param[in]	isp_stats ISP buffer
139  * @return		None
140  *
141  * This function translates the dvs2 statistics from the ISP-internal
142  * format to the format used by the DVS2 library on the CPU.
143  * This function takes a host-side pointer as input. This can either
144  * point to a copy of the data or be a memory mapped pointer to the
145  * ISP memory pages.
146  */
147 void
148 ia_css_translate_dvs2_statistics(
149     struct ia_css_dvs2_statistics	   *host_stats,
150     const struct ia_css_isp_dvs_statistics_map *isp_stats);
151 
152 /* @brief Copy DVS statistics from an ISP buffer to a host buffer.
153  * @param[in] type - DVS statistics type
154  * @param[in] host_stats Host buffer
155  * @param[in] isp_stats ISP buffer
156  * @return None
157  */
158 void
159 ia_css_dvs_statistics_get(enum dvs_statistics_type type,
160 			  union ia_css_dvs_statistics_host  *host_stats,
161 			  const union ia_css_dvs_statistics_isp *isp_stats);
162 
163 /* @brief Allocate the DVS statistics memory on the ISP
164  * @param[in]	grid The grid.
165  * @return	Pointer to the allocated DVS statistics buffer on the ISP
166 */
167 struct ia_css_isp_dvs_statistics *
168 ia_css_isp_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid);
169 
170 /* @brief Free the DVS statistics memory on the ISP
171  * @param[in]	me Pointer to the DVS statistics buffer on the ISP.
172  * @return	None
173 */
174 void
175 ia_css_isp_dvs_statistics_free(struct ia_css_isp_dvs_statistics *me);
176 
177 /* @brief Allocate the DVS 2.0 statistics memory
178  * @param[in]	grid The grid.
179  * @return	Pointer to the allocated DVS statistics buffer on the ISP
180 */
181 struct ia_css_isp_dvs_statistics *
182 ia_css_isp_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid);
183 
184 /* @brief Free the DVS 2.0 statistics memory
185  * @param[in]	me Pointer to the DVS statistics buffer on the ISP.
186  * @return	None
187 */
188 void
189 ia_css_isp_dvs2_statistics_free(struct ia_css_isp_dvs_statistics *me);
190 
191 /* @brief Allocate the DVS statistics memory on the host
192  * @param[in]	grid The grid.
193  * @return	Pointer to the allocated DVS statistics buffer on the host
194 */
195 struct ia_css_dvs_statistics *
196 ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid);
197 
198 /* @brief Free the DVS statistics memory on the host
199  * @param[in]	me Pointer to the DVS statistics buffer on the host.
200  * @return	None
201 */
202 void
203 ia_css_dvs_statistics_free(struct ia_css_dvs_statistics *me);
204 
205 /* @brief Allocate the DVS coefficients memory
206  * @param[in]	grid The grid.
207  * @return	Pointer to the allocated DVS coefficients buffer
208 */
209 struct ia_css_dvs_coefficients *
210 ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info *grid);
211 
212 /* @brief Free the DVS coefficients memory
213  * @param[in]	me Pointer to the DVS coefficients buffer.
214  * @return	None
215  */
216 void
217 ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients *me);
218 
219 /* @brief Allocate the DVS 2.0 statistics memory on the host
220  * @param[in]	grid The grid.
221  * @return	Pointer to the allocated DVS 2.0 statistics buffer on the host
222  */
223 struct ia_css_dvs2_statistics *
224 ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid);
225 
226 /* @brief Free the DVS 2.0 statistics memory
227  * @param[in]	me Pointer to the DVS 2.0 statistics buffer on the host.
228  * @return	None
229 */
230 void
231 ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics *me);
232 
233 /* @brief Allocate the DVS 2.0 coefficients memory
234  * @param[in]	grid The grid.
235  * @return	Pointer to the allocated DVS 2.0 coefficients buffer
236 */
237 struct ia_css_dvs2_coefficients *
238 ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info *grid);
239 
240 /* @brief Free the DVS 2.0 coefficients memory
241  * @param[in]	me Pointer to the DVS 2.0 coefficients buffer.
242  * @return	None
243 */
244 void
245 ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients *me);
246 
247 /* @brief Allocate the DVS 2.0 6-axis config memory
248  * @param[in]	stream The stream.
249  * @return	Pointer to the allocated DVS 6axis configuration buffer
250 */
251 struct ia_css_dvs_6axis_config *
252 ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream *stream);
253 
254 /* @brief Free the DVS 2.0 6-axis config memory
255  * @param[in]	dvs_6axis_config Pointer to the DVS 6axis configuration buffer
256  * @return	None
257  */
258 void
259 ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config *dvs_6axis_config);
260 
261 /* @brief Allocate a dvs statistics map structure
262  * @param[in]	isp_stats pointer to ISP dvs statistis struct
263  * @param[in]	data_ptr  host-side pointer to ISP dvs statistics.
264  * @return	Pointer to the allocated dvs statistics map
265  *
266  * This function allocates the ISP dvs statistics map structure
267  * and uses the data_ptr as base pointer to set the appropriate
268  * pointers to all relevant subsets of the dvs statistics (dmem,
269  * vmem, hmem).
270  * If the data_ptr is NULL, this function will allocate the host-side
271  * memory. This information is stored in the struct and used in the
272  * ia_css_isp_dvs_statistics_map_free() function to determine whether
273  * the memory should be freed or not.
274  * Note that this function does not allocate or map any ISP
275  * memory.
276 */
277 struct ia_css_isp_dvs_statistics_map *
278 ia_css_isp_dvs_statistics_map_allocate(
279     const struct ia_css_isp_dvs_statistics *isp_stats,
280     void *data_ptr);
281 
282 /* @brief Free the dvs statistics map
283  * @param[in]	me Pointer to the dvs statistics map
284  * @return	None
285  *
286  * This function frees the map struct. If the data_ptr inside it
287  * was allocated inside ia_css_isp_dvs_statistics_map_allocate(), it
288  * will be freed in this function. Otherwise it will not be freed.
289  */
290 void
291 ia_css_isp_dvs_statistics_map_free(struct ia_css_isp_dvs_statistics_map *me);
292 
293 /* @brief Allocate memory for the SKC DVS statistics on the ISP
294  * @return		Pointer to the allocated ACC DVS statistics buffer on the ISP
295 */
296 struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void);
297 
298 #endif /*  __IA_CSS_DVS_H */
299