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