/* 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 */
|