| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Support for Intel Camera Imaging ISP subsystem. |
| * Copyright (c) 2015, Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| */ |
| |
| #ifndef __IA_CSS_DVS_H |
| #define __IA_CSS_DVS_H |
| |
| /* @file |
| * This file contains types for DVS statistics |
| */ |
| |
| #include <type_support.h> |
| #include "ia_css_types.h" |
| #include "ia_css_err.h" |
| #include "ia_css_stream_public.h" |
| |
| enum dvs_statistics_type { |
| DVS_STATISTICS, |
| DVS2_STATISTICS, |
| SKC_DVS_STATISTICS |
| }; |
| |
| /* Structure that holds DVS statistics in the ISP internal |
| * format. Use ia_css_get_dvs_statistics() to translate |
| * this to the format used on the host (DVS engine). |
| * */ |
| struct ia_css_isp_dvs_statistics { |
| ia_css_ptr hor_proj; |
| ia_css_ptr ver_proj; |
| u32 hor_size; |
| u32 ver_size; |
| u32 exp_id; /** see ia_css_event_public.h for more detail */ |
| ia_css_ptr data_ptr; /* base pointer containing all memory */ |
| u32 size; /* size of allocated memory in data_ptr */ |
| }; |
| |
| /* Structure that holds SKC DVS statistics in the ISP internal |
| * format. Use ia_css_dvs_statistics_get() to translate this to |
| * the format used on the host. |
| * */ |
| struct ia_css_isp_skc_dvs_statistics; |
| |
| #define SIZE_OF_IA_CSS_ISP_DVS_STATISTICS_STRUCT \ |
| ((3 * SIZE_OF_IA_CSS_PTR) + \ |
| (4 * sizeof(uint32_t))) |
| |
| /* Map with host-side pointers to ISP-format statistics. |
| * These pointers can either be copies of ISP data or memory mapped |
| * ISP pointers. |
| * All of the data behind these pointers is allocatd contiguously, the |
| * allocated pointer is stored in the data_ptr field. The other fields |
| * point into this one block of data. |
| */ |
| struct ia_css_isp_dvs_statistics_map { |
| void *data_ptr; |
| s32 *hor_proj; |
| s32 *ver_proj; |
| u32 size; /* total size in bytes */ |
| u32 data_allocated; /* indicate whether data was allocated */ |
| }; |
| |
| union ia_css_dvs_statistics_isp { |
| struct ia_css_isp_dvs_statistics *p_dvs_statistics_isp; |
| struct ia_css_isp_skc_dvs_statistics *p_skc_dvs_statistics_isp; |
| }; |
| |
| union ia_css_dvs_statistics_host { |
| struct ia_css_dvs_statistics *p_dvs_statistics_host; |
| struct ia_css_dvs2_statistics *p_dvs2_statistics_host; |
| struct ia_css_skc_dvs_statistics *p_skc_dvs_statistics_host; |
| }; |
| |
| /* @brief Copy DVS statistics from an ISP buffer to a host buffer. |
| * @param[in] host_stats Host buffer |
| * @param[in] isp_stats ISP buffer |
| * @return error value if temporary memory cannot be allocated |
| * |
| * This may include a translation step as well depending |
| * on the ISP version. |
| * Always use this function, never copy the buffer directly. |
| * Note that this function uses the mem_load function from the CSS |
| * environment struct. |
| * In certain environments this may be slow. In those cases it is |
| * advised to map the ISP memory into a host-side pointer and use |
| * the ia_css_translate_dvs_statistics() function instead. |
| */ |
| int |
| ia_css_get_dvs_statistics(struct ia_css_dvs_statistics *host_stats, |
| const struct ia_css_isp_dvs_statistics *isp_stats); |
| |
| /* @brief Translate DVS statistics from ISP format to host format |
| * @param[in] host_stats Host buffer |
| * @param[in] isp_stats ISP buffer |
| * @return None |
| * |
| * This function translates the dvs statistics from the ISP-internal |
| * format to the format used by the DVS library on the CPU. |
| * This function takes a host-side pointer as input. This can either |
| * point to a copy of the data or be a memory mapped pointer to the |
| * ISP memory pages. |
| */ |
| void |
| ia_css_translate_dvs_statistics( |
| struct ia_css_dvs_statistics *host_stats, |
| const struct ia_css_isp_dvs_statistics_map *isp_stats); |
| |
| /* @brief Copy DVS 2.0 statistics from an ISP buffer to a host buffer. |
| * @param[in] host_stats Host buffer |
| * @param[in] isp_stats ISP buffer |
| * @return error value if temporary memory cannot be allocated |
| * |
| * This may include a translation step as well depending |
| * on the ISP version. |
| * Always use this function, never copy the buffer directly. |
| * Note that this function uses the mem_load function from the CSS |
| * environment struct. |
| * In certain environments this may be slow. In those cases it is |
| * advised to map the ISP memory into a host-side pointer and use |
| * the ia_css_translate_dvs2_statistics() function instead. |
| */ |
| int |
| ia_css_get_dvs2_statistics(struct ia_css_dvs2_statistics *host_stats, |
| const struct ia_css_isp_dvs_statistics *isp_stats); |
| |
| /* @brief Translate DVS2 statistics from ISP format to host format |
| * @param[in] host_stats Host buffer |
| * @param[in] isp_stats ISP buffer |
| * @return None |
| * |
| * This function translates the dvs2 statistics from the ISP-internal |
| * format to the format used by the DVS2 library on the CPU. |
| * This function takes a host-side pointer as input. This can either |
| * point to a copy of the data or be a memory mapped pointer to the |
| * ISP memory pages. |
| */ |
| void |
| ia_css_translate_dvs2_statistics( |
| struct ia_css_dvs2_statistics *host_stats, |
| const struct ia_css_isp_dvs_statistics_map *isp_stats); |
| |
| /* @brief Copy DVS statistics from an ISP buffer to a host buffer. |
| * @param[in] type - DVS statistics type |
| * @param[in] host_stats Host buffer |
| * @param[in] isp_stats ISP buffer |
| * @return None |
| */ |
| void |
| ia_css_dvs_statistics_get(enum dvs_statistics_type type, |
| union ia_css_dvs_statistics_host *host_stats, |
| const union ia_css_dvs_statistics_isp *isp_stats); |
| |
| /* @brief Allocate the DVS statistics memory on the ISP |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS statistics buffer on the ISP |
| */ |
| struct ia_css_isp_dvs_statistics * |
| ia_css_isp_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS statistics memory on the ISP |
| * @param[in] me Pointer to the DVS statistics buffer on the ISP. |
| * @return None |
| */ |
| void |
| ia_css_isp_dvs_statistics_free(struct ia_css_isp_dvs_statistics *me); |
| |
| /* @brief Allocate the DVS 2.0 statistics memory |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS statistics buffer on the ISP |
| */ |
| struct ia_css_isp_dvs_statistics * |
| ia_css_isp_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS 2.0 statistics memory |
| * @param[in] me Pointer to the DVS statistics buffer on the ISP. |
| * @return None |
| */ |
| void |
| ia_css_isp_dvs2_statistics_free(struct ia_css_isp_dvs_statistics *me); |
| |
| /* @brief Allocate the DVS statistics memory on the host |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS statistics buffer on the host |
| */ |
| struct ia_css_dvs_statistics * |
| ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS statistics memory on the host |
| * @param[in] me Pointer to the DVS statistics buffer on the host. |
| * @return None |
| */ |
| void |
| ia_css_dvs_statistics_free(struct ia_css_dvs_statistics *me); |
| |
| /* @brief Allocate the DVS coefficients memory |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS coefficients buffer |
| */ |
| struct ia_css_dvs_coefficients * |
| ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS coefficients memory |
| * @param[in] me Pointer to the DVS coefficients buffer. |
| * @return None |
| */ |
| void |
| ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients *me); |
| |
| /* @brief Allocate the DVS 2.0 statistics memory on the host |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS 2.0 statistics buffer on the host |
| */ |
| struct ia_css_dvs2_statistics * |
| ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS 2.0 statistics memory |
| * @param[in] me Pointer to the DVS 2.0 statistics buffer on the host. |
| * @return None |
| */ |
| void |
| ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics *me); |
| |
| /* @brief Allocate the DVS 2.0 coefficients memory |
| * @param[in] grid The grid. |
| * @return Pointer to the allocated DVS 2.0 coefficients buffer |
| */ |
| struct ia_css_dvs2_coefficients * |
| ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info *grid); |
| |
| /* @brief Free the DVS 2.0 coefficients memory |
| * @param[in] me Pointer to the DVS 2.0 coefficients buffer. |
| * @return None |
| */ |
| void |
| ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients *me); |
| |
| /* @brief Allocate the DVS 2.0 6-axis config memory |
| * @param[in] stream The stream. |
| * @return Pointer to the allocated DVS 6axis configuration buffer |
| */ |
| struct ia_css_dvs_6axis_config * |
| ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream *stream); |
| |
| /* @brief Free the DVS 2.0 6-axis config memory |
| * @param[in] dvs_6axis_config Pointer to the DVS 6axis configuration buffer |
| * @return None |
| */ |
| void |
| ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config *dvs_6axis_config); |
| |
| /* @brief Allocate a dvs statistics map structure |
| * @param[in] isp_stats pointer to ISP dvs statistis struct |
| * @param[in] data_ptr host-side pointer to ISP dvs statistics. |
| * @return Pointer to the allocated dvs statistics map |
| * |
| * This function allocates the ISP dvs statistics map structure |
| * and uses the data_ptr as base pointer to set the appropriate |
| * pointers to all relevant subsets of the dvs statistics (dmem, |
| * vmem, hmem). |
| * If the data_ptr is NULL, this function will allocate the host-side |
| * memory. This information is stored in the struct and used in the |
| * ia_css_isp_dvs_statistics_map_free() function to determine whether |
| * the memory should be freed or not. |
| * Note that this function does not allocate or map any ISP |
| * memory. |
| */ |
| struct ia_css_isp_dvs_statistics_map * |
| ia_css_isp_dvs_statistics_map_allocate( |
| const struct ia_css_isp_dvs_statistics *isp_stats, |
| void *data_ptr); |
| |
| /* @brief Free the dvs statistics map |
| * @param[in] me Pointer to the dvs statistics map |
| * @return None |
| * |
| * This function frees the map struct. If the data_ptr inside it |
| * was allocated inside ia_css_isp_dvs_statistics_map_allocate(), it |
| * will be freed in this function. Otherwise it will not be freed. |
| */ |
| void |
| ia_css_isp_dvs_statistics_map_free(struct ia_css_isp_dvs_statistics_map *me); |
| |
| /* @brief Allocate memory for the SKC DVS statistics on the ISP |
| * @return Pointer to the allocated ACC DVS statistics buffer on the ISP |
| */ |
| struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void); |
| |
| #endif /* __IA_CSS_DVS_H */ |