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 28enum 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 * */ 38struct 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 * */ 52struct 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 */ 65struct 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 73union 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 78union 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 */ 98int 99ia_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 */ 113void 114ia_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 */ 132int 133ia_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 */ 147void 148ia_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 */ 158void 159ia_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*/ 167struct ia_css_isp_dvs_statistics * 168ia_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*/ 174void 175ia_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*/ 181struct ia_css_isp_dvs_statistics * 182ia_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*/ 188void 189ia_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*/ 195struct ia_css_dvs_statistics * 196ia_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*/ 202void 203ia_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*/ 209struct ia_css_dvs_coefficients * 210ia_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 */ 216void 217ia_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 */ 223struct ia_css_dvs2_statistics * 224ia_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*/ 230void 231ia_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*/ 237struct ia_css_dvs2_coefficients * 238ia_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*/ 244void 245ia_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*/ 251struct ia_css_dvs_6axis_config * 252ia_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 */ 258void 259ia_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*/ 277struct ia_css_isp_dvs_statistics_map * 278ia_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 */ 290void 291ia_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*/ 296struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void); 297 298#endif /* __IA_CSS_DVS_H */ 299