/* 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_3A_H #define __IA_CSS_3A_H /* @file * This file contains types used for 3A statistics */ #include <type_support.h> #include "ia_css_types.h" #include "ia_css_err.h" #include "system_global.h" enum ia_css_3a_tables { IA_CSS_S3A_TBL_HI, IA_CSS_S3A_TBL_LO, IA_CSS_RGBY_TBL, IA_CSS_NUM_3A_TABLES }; /* Structure that holds 3A statistics in the ISP internal * format. Use ia_css_get_3a_statistics() to translate * this to the format used on the host (3A library). * */ struct ia_css_isp_3a_statistics { union { struct { ia_css_ptr s3a_tbl; } dmem; struct { ia_css_ptr s3a_tbl_hi; ia_css_ptr s3a_tbl_lo; } vmem; } data; struct { ia_css_ptr rgby_tbl; } data_hmem; u32 exp_id; /** exposure id, to match statistics to a frame, see ia_css_event_public.h for more detail. */ u32 isp_config_id;/** Unique ID to track which config was actually applied to a particular frame */ ia_css_ptr data_ptr; /** pointer to base of all data */ u32 size; /** total size of all data */ u32 dmem_size; u32 vmem_size; /** both lo and hi have this size */ u32 hmem_size; }; #define SIZE_OF_DMEM_STRUCT \ (SIZE_OF_IA_CSS_PTR) #define SIZE_OF_VMEM_STRUCT \ (2 * SIZE_OF_IA_CSS_PTR) #define SIZE_OF_DATA_UNION \ (MAX(SIZE_OF_DMEM_STRUCT, SIZE_OF_VMEM_STRUCT)) #define SIZE_OF_DATA_HMEM_STRUCT \ (SIZE_OF_IA_CSS_PTR) #define SIZE_OF_IA_CSS_ISP_3A_STATISTICS_STRUCT \ (SIZE_OF_DATA_UNION + \ SIZE_OF_DATA_HMEM_STRUCT + \ sizeof(uint32_t) + \ sizeof(uint32_t) + \ 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 allocated 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_3a_statistics_map { void *data_ptr; /** Pointer to start of memory */ struct ia_css_3a_output *dmem_stats; u16 *vmem_stats_hi; u16 *vmem_stats_lo; struct ia_css_bh_table *hmem_stats; u32 size; /** total size in bytes of data_ptr */ u32 data_allocated; /** indicate whether data_ptr was allocated or not. */ }; /* @brief Copy and translate 3A statistics from an ISP buffer to a host buffer * @param[out] host_stats Host buffer. * @param[in] isp_stats ISP buffer. * @return error value if temporary memory cannot be allocated * * This copies 3a statistics from an ISP pointer to a host pointer and then * translates some of the statistics, details depend on which ISP binary is * used. * Always use this function, never copy the buffer directly. */ int ia_css_get_3a_statistics(struct ia_css_3a_statistics *host_stats, const struct ia_css_isp_3a_statistics *isp_stats); /* @brief Translate 3A statistics from ISP format to host format. * @param[out] host_stats host-format statistics * @param[in] isp_stats ISP-format statistics * @return None * * This function translates statistics from the internal ISP-format to * the host-format. This function does not include an additional copy * step. * */ void ia_css_translate_3a_statistics( struct ia_css_3a_statistics *host_stats, const struct ia_css_isp_3a_statistics_map *isp_stats); /* Convenience functions for alloc/free of certain datatypes */ /* @brief Allocate memory for the 3a statistics on the ISP * @param[in] grid The grid. * @return Pointer to the allocated 3a statistics buffer on the ISP */ struct ia_css_isp_3a_statistics * ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid); /* @brief Free the 3a statistics memory on the isp * @param[in] me Pointer to the 3a statistics buffer on the ISP. * @return None */ void ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics *me); /* @brief Allocate memory for the 3a statistics on the host * @param[in] grid The grid. * @return Pointer to the allocated 3a statistics buffer on the host */ struct ia_css_3a_statistics * ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid); /* @brief Free the 3a statistics memory on the host * @param[in] me Pointer to the 3a statistics buffer on the host. * @return None */ void ia_css_3a_statistics_free(struct ia_css_3a_statistics *me); /* @brief Allocate a 3a statistics map structure * @param[in] isp_stats pointer to ISP 3a statistis struct * @param[in] data_ptr host-side pointer to ISP 3a statistics. * @return Pointer to the allocated 3a statistics map * * This function allocates the ISP 3a statistics map structure * and uses the data_ptr as base pointer to set the appropriate * pointers to all relevant subsets of the 3a 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_3a_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_3a_statistics_map * ia_css_isp_3a_statistics_map_allocate( const struct ia_css_isp_3a_statistics *isp_stats, void *data_ptr); /* @brief Free the 3a statistics map * @param[in] me Pointer to the 3a statistics map * @return None * * This function frees the map struct. If the data_ptr inside it * was allocated inside ia_css_isp_3a_statistics_map_allocate(), it * will be freed in this function. Otherwise it will not be freed. */ void ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map *me); #endif /* __IA_CSS_3A_H */