1f5fbb83fSMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0 */
29d4fa1a1SMauro Carvalho Chehab /*
39d4fa1a1SMauro Carvalho Chehab  * Support for Intel Camera Imaging ISP subsystem.
49d4fa1a1SMauro Carvalho Chehab  * Copyright (c) 2015, Intel Corporation.
59d4fa1a1SMauro Carvalho Chehab  *
69d4fa1a1SMauro Carvalho Chehab  * This program is free software; you can redistribute it and/or modify it
79d4fa1a1SMauro Carvalho Chehab  * under the terms and conditions of the GNU General Public License,
89d4fa1a1SMauro Carvalho Chehab  * version 2, as published by the Free Software Foundation.
99d4fa1a1SMauro Carvalho Chehab  *
109d4fa1a1SMauro Carvalho Chehab  * This program is distributed in the hope it will be useful, but WITHOUT
119d4fa1a1SMauro Carvalho Chehab  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
129d4fa1a1SMauro Carvalho Chehab  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
139d4fa1a1SMauro Carvalho Chehab  * more details.
149d4fa1a1SMauro Carvalho Chehab  */
159d4fa1a1SMauro Carvalho Chehab 
169d4fa1a1SMauro Carvalho Chehab #ifndef __IA_CSS_3A_H
179d4fa1a1SMauro Carvalho Chehab #define __IA_CSS_3A_H
189d4fa1a1SMauro Carvalho Chehab 
199d4fa1a1SMauro Carvalho Chehab /* @file
209d4fa1a1SMauro Carvalho Chehab  * This file contains types used for 3A statistics
219d4fa1a1SMauro Carvalho Chehab  */
229d4fa1a1SMauro Carvalho Chehab 
239d4fa1a1SMauro Carvalho Chehab #include <type_support.h>
249d4fa1a1SMauro Carvalho Chehab #include "ia_css_types.h"
259d4fa1a1SMauro Carvalho Chehab #include "ia_css_err.h"
269d4fa1a1SMauro Carvalho Chehab #include "system_global.h"
279d4fa1a1SMauro Carvalho Chehab 
289d4fa1a1SMauro Carvalho Chehab enum ia_css_3a_tables {
299d4fa1a1SMauro Carvalho Chehab 	IA_CSS_S3A_TBL_HI,
309d4fa1a1SMauro Carvalho Chehab 	IA_CSS_S3A_TBL_LO,
319d4fa1a1SMauro Carvalho Chehab 	IA_CSS_RGBY_TBL,
329d4fa1a1SMauro Carvalho Chehab 	IA_CSS_NUM_3A_TABLES
339d4fa1a1SMauro Carvalho Chehab };
349d4fa1a1SMauro Carvalho Chehab 
359d4fa1a1SMauro Carvalho Chehab /* Structure that holds 3A statistics in the ISP internal
369d4fa1a1SMauro Carvalho Chehab  * format. Use ia_css_get_3a_statistics() to translate
379d4fa1a1SMauro Carvalho Chehab  * this to the format used on the host (3A library).
389d4fa1a1SMauro Carvalho Chehab  * */
399d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics {
409d4fa1a1SMauro Carvalho Chehab 	union {
419d4fa1a1SMauro Carvalho Chehab 		struct {
429d4fa1a1SMauro Carvalho Chehab 			ia_css_ptr s3a_tbl;
439d4fa1a1SMauro Carvalho Chehab 		} dmem;
449d4fa1a1SMauro Carvalho Chehab 		struct {
459d4fa1a1SMauro Carvalho Chehab 			ia_css_ptr s3a_tbl_hi;
469d4fa1a1SMauro Carvalho Chehab 			ia_css_ptr s3a_tbl_lo;
479d4fa1a1SMauro Carvalho Chehab 		} vmem;
489d4fa1a1SMauro Carvalho Chehab 	} data;
499d4fa1a1SMauro Carvalho Chehab 	struct {
509d4fa1a1SMauro Carvalho Chehab 		ia_css_ptr rgby_tbl;
519d4fa1a1SMauro Carvalho Chehab 	} data_hmem;
529d4fa1a1SMauro Carvalho Chehab 	u32 exp_id;     /** exposure id, to match statistics to a frame,
539d4fa1a1SMauro Carvalho Chehab 				  see ia_css_event_public.h for more detail. */
549d4fa1a1SMauro Carvalho Chehab 	u32 isp_config_id;/** Unique ID to track which config was actually applied to a particular frame */
559d4fa1a1SMauro Carvalho Chehab 	ia_css_ptr data_ptr; /** pointer to base of all data */
569d4fa1a1SMauro Carvalho Chehab 	u32   size;     /** total size of all data */
579d4fa1a1SMauro Carvalho Chehab 	u32   dmem_size;
589d4fa1a1SMauro Carvalho Chehab 	u32   vmem_size; /** both lo and hi have this size */
599d4fa1a1SMauro Carvalho Chehab 	u32   hmem_size;
609d4fa1a1SMauro Carvalho Chehab };
619d4fa1a1SMauro Carvalho Chehab 
629d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_DMEM_STRUCT						\
639d4fa1a1SMauro Carvalho Chehab 	(SIZE_OF_IA_CSS_PTR)
649d4fa1a1SMauro Carvalho Chehab 
659d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_VMEM_STRUCT						\
669d4fa1a1SMauro Carvalho Chehab 	(2 * SIZE_OF_IA_CSS_PTR)
679d4fa1a1SMauro Carvalho Chehab 
689d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_DATA_UNION						\
699d4fa1a1SMauro Carvalho Chehab 	(MAX(SIZE_OF_DMEM_STRUCT, SIZE_OF_VMEM_STRUCT))
709d4fa1a1SMauro Carvalho Chehab 
719d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_DATA_HMEM_STRUCT					\
729d4fa1a1SMauro Carvalho Chehab 	(SIZE_OF_IA_CSS_PTR)
739d4fa1a1SMauro Carvalho Chehab 
749d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_IA_CSS_ISP_3A_STATISTICS_STRUCT				\
759d4fa1a1SMauro Carvalho Chehab 	(SIZE_OF_DATA_UNION +						\
769d4fa1a1SMauro Carvalho Chehab 	 SIZE_OF_DATA_HMEM_STRUCT +					\
779d4fa1a1SMauro Carvalho Chehab 	 sizeof(uint32_t) +						\
789d4fa1a1SMauro Carvalho Chehab 	 sizeof(uint32_t) +						\
799d4fa1a1SMauro Carvalho Chehab 	 SIZE_OF_IA_CSS_PTR +						\
809d4fa1a1SMauro Carvalho Chehab 	 4 * sizeof(uint32_t))
819d4fa1a1SMauro Carvalho Chehab 
829d4fa1a1SMauro Carvalho Chehab /* Map with host-side pointers to ISP-format statistics.
839d4fa1a1SMauro Carvalho Chehab  * These pointers can either be copies of ISP data or memory mapped
849d4fa1a1SMauro Carvalho Chehab  * ISP pointers.
859d4fa1a1SMauro Carvalho Chehab  * All of the data behind these pointers is allocated contiguously, the
869d4fa1a1SMauro Carvalho Chehab  * allocated pointer is stored in the data_ptr field. The other fields
879d4fa1a1SMauro Carvalho Chehab  * point into this one block of data.
889d4fa1a1SMauro Carvalho Chehab  */
899d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics_map {
909d4fa1a1SMauro Carvalho Chehab 	void                    *data_ptr; /** Pointer to start of memory */
919d4fa1a1SMauro Carvalho Chehab 	struct ia_css_3a_output *dmem_stats;
929d4fa1a1SMauro Carvalho Chehab 	u16                *vmem_stats_hi;
939d4fa1a1SMauro Carvalho Chehab 	u16                *vmem_stats_lo;
949d4fa1a1SMauro Carvalho Chehab 	struct ia_css_bh_table  *hmem_stats;
959d4fa1a1SMauro Carvalho Chehab 	u32                 size; /** total size in bytes of data_ptr */
969d4fa1a1SMauro Carvalho Chehab 	u32                 data_allocated; /** indicate whether data_ptr
979d4fa1a1SMauro Carvalho Chehab 						    was allocated or not. */
989d4fa1a1SMauro Carvalho Chehab };
999d4fa1a1SMauro Carvalho Chehab 
1009d4fa1a1SMauro Carvalho Chehab /* @brief Copy and translate 3A statistics from an ISP buffer to a host buffer
1019d4fa1a1SMauro Carvalho Chehab  * @param[out]	host_stats Host buffer.
1029d4fa1a1SMauro Carvalho Chehab  * @param[in]	isp_stats ISP buffer.
1039d4fa1a1SMauro Carvalho Chehab  * @return	error value if temporary memory cannot be allocated
1049d4fa1a1SMauro Carvalho Chehab  *
1059d4fa1a1SMauro Carvalho Chehab  * This copies 3a statistics from an ISP pointer to a host pointer and then
1069d4fa1a1SMauro Carvalho Chehab  * translates some of the statistics, details depend on which ISP binary is
1079d4fa1a1SMauro Carvalho Chehab  * used.
1089d4fa1a1SMauro Carvalho Chehab  * Always use this function, never copy the buffer directly.
1099d4fa1a1SMauro Carvalho Chehab  */
11041022d35SMauro Carvalho Chehab int
1119d4fa1a1SMauro Carvalho Chehab ia_css_get_3a_statistics(struct ia_css_3a_statistics           *host_stats,
1129d4fa1a1SMauro Carvalho Chehab 			 const struct ia_css_isp_3a_statistics *isp_stats);
1139d4fa1a1SMauro Carvalho Chehab 
1149d4fa1a1SMauro Carvalho Chehab /* @brief Translate 3A statistics from ISP format to host format.
1159d4fa1a1SMauro Carvalho Chehab  * @param[out]	host_stats host-format statistics
1169d4fa1a1SMauro Carvalho Chehab  * @param[in]	isp_stats  ISP-format statistics
1179d4fa1a1SMauro Carvalho Chehab  * @return	None
1189d4fa1a1SMauro Carvalho Chehab  *
1199d4fa1a1SMauro Carvalho Chehab  * This function translates statistics from the internal ISP-format to
1209d4fa1a1SMauro Carvalho Chehab  * the host-format. This function does not include an additional copy
1219d4fa1a1SMauro Carvalho Chehab  * step.
1229d4fa1a1SMauro Carvalho Chehab  * */
1239d4fa1a1SMauro Carvalho Chehab void
1249d4fa1a1SMauro Carvalho Chehab ia_css_translate_3a_statistics(
1259d4fa1a1SMauro Carvalho Chehab     struct ia_css_3a_statistics               *host_stats,
1269d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_3a_statistics_map *isp_stats);
1279d4fa1a1SMauro Carvalho Chehab 
1289d4fa1a1SMauro Carvalho Chehab /* Convenience functions for alloc/free of certain datatypes */
1299d4fa1a1SMauro Carvalho Chehab 
1309d4fa1a1SMauro Carvalho Chehab /* @brief Allocate memory for the 3a statistics on the ISP
1319d4fa1a1SMauro Carvalho Chehab  * @param[in]	grid The grid.
1329d4fa1a1SMauro Carvalho Chehab  * @return		Pointer to the allocated 3a statistics buffer on the ISP
1339d4fa1a1SMauro Carvalho Chehab */
1349d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics *
1359d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid);
1369d4fa1a1SMauro Carvalho Chehab 
1379d4fa1a1SMauro Carvalho Chehab /* @brief Free the 3a statistics memory on the isp
1389d4fa1a1SMauro Carvalho Chehab  * @param[in]	me Pointer to the 3a statistics buffer on the ISP.
1399d4fa1a1SMauro Carvalho Chehab  * @return		None
1409d4fa1a1SMauro Carvalho Chehab */
1419d4fa1a1SMauro Carvalho Chehab void
1429d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics *me);
1439d4fa1a1SMauro Carvalho Chehab 
1449d4fa1a1SMauro Carvalho Chehab /* @brief Allocate memory for the 3a statistics on the host
1459d4fa1a1SMauro Carvalho Chehab  * @param[in]	grid The grid.
1469d4fa1a1SMauro Carvalho Chehab  * @return		Pointer to the allocated 3a statistics buffer on the host
1479d4fa1a1SMauro Carvalho Chehab */
1489d4fa1a1SMauro Carvalho Chehab struct ia_css_3a_statistics *
1499d4fa1a1SMauro Carvalho Chehab ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid);
1509d4fa1a1SMauro Carvalho Chehab 
1519d4fa1a1SMauro Carvalho Chehab /* @brief Free the 3a statistics memory on the host
1529d4fa1a1SMauro Carvalho Chehab  * @param[in]	me Pointer to the 3a statistics buffer on the host.
1539d4fa1a1SMauro Carvalho Chehab  * @return		None
1549d4fa1a1SMauro Carvalho Chehab  */
1559d4fa1a1SMauro Carvalho Chehab void
1569d4fa1a1SMauro Carvalho Chehab ia_css_3a_statistics_free(struct ia_css_3a_statistics *me);
1579d4fa1a1SMauro Carvalho Chehab 
1589d4fa1a1SMauro Carvalho Chehab /* @brief Allocate a 3a statistics map structure
1599d4fa1a1SMauro Carvalho Chehab  * @param[in]	isp_stats pointer to ISP 3a statistis struct
1609d4fa1a1SMauro Carvalho Chehab  * @param[in]	data_ptr  host-side pointer to ISP 3a statistics.
1619d4fa1a1SMauro Carvalho Chehab  * @return		Pointer to the allocated 3a statistics map
1629d4fa1a1SMauro Carvalho Chehab  *
1639d4fa1a1SMauro Carvalho Chehab  * This function allocates the ISP 3a statistics map structure
1649d4fa1a1SMauro Carvalho Chehab  * and uses the data_ptr as base pointer to set the appropriate
1659d4fa1a1SMauro Carvalho Chehab  * pointers to all relevant subsets of the 3a statistics (dmem,
1669d4fa1a1SMauro Carvalho Chehab  * vmem, hmem).
1679d4fa1a1SMauro Carvalho Chehab  * If the data_ptr is NULL, this function will allocate the host-side
1689d4fa1a1SMauro Carvalho Chehab  * memory. This information is stored in the struct and used in the
1699d4fa1a1SMauro Carvalho Chehab  * ia_css_isp_3a_statistics_map_free() function to determine whether
1709d4fa1a1SMauro Carvalho Chehab  * the memory should be freed or not.
1719d4fa1a1SMauro Carvalho Chehab  * Note that this function does not allocate or map any ISP
1729d4fa1a1SMauro Carvalho Chehab  * memory.
1739d4fa1a1SMauro Carvalho Chehab */
1749d4fa1a1SMauro Carvalho Chehab struct ia_css_isp_3a_statistics_map *
1759d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_map_allocate(
1769d4fa1a1SMauro Carvalho Chehab     const struct ia_css_isp_3a_statistics *isp_stats,
1779d4fa1a1SMauro Carvalho Chehab     void *data_ptr);
1789d4fa1a1SMauro Carvalho Chehab 
1799d4fa1a1SMauro Carvalho Chehab /* @brief Free the 3a statistics map
1809d4fa1a1SMauro Carvalho Chehab  * @param[in]	me Pointer to the 3a statistics map
1819d4fa1a1SMauro Carvalho Chehab  * @return		None
1829d4fa1a1SMauro Carvalho Chehab  *
1839d4fa1a1SMauro Carvalho Chehab  * This function frees the map struct. If the data_ptr inside it
1849d4fa1a1SMauro Carvalho Chehab  * was allocated inside ia_css_isp_3a_statistics_map_allocate(), it
1859d4fa1a1SMauro Carvalho Chehab  * will be freed in this function. Otherwise it will not be freed.
1869d4fa1a1SMauro Carvalho Chehab  */
1879d4fa1a1SMauro Carvalho Chehab void
1889d4fa1a1SMauro Carvalho Chehab ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map *me);
1899d4fa1a1SMauro Carvalho Chehab 
1909d4fa1a1SMauro Carvalho Chehab #endif /* __IA_CSS_3A_H */
191