Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
#ifndef ISP2401
/*
 * 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.
 */
#else
/**
Support for Intel Camera Imaging ISP subsystem.
Copyright (c) 2010 - 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.
*/
#endif

#ifndef _COMMON_ISP_EXPRS_H_
#define _COMMON_ISP_EXPRS_H_

/* Binary independent pre-processor expressions */

#include "sh_css_defs.h"
#include "isp_const.h"

#ifdef __HOST
#error "isp_exprs.h: Do not include on HOST, contains ISP specific defines"
#endif

#ifndef __ISP
#if defined(MODE)
#define MODE aap
#error "isp_exprs.h: is mode independent, but MODE is set"
#endif
#if defined(VARIABLE_RESOLUTION)
#define VARIABLE_RESOLUTION noot
#error "isp_exprs.h: is mode independent, but VARIABLE_RESOLUTION is set"
#endif
#if defined(DECI_FACTOR_LOG2)
#define DECI_FACTOR_LOG2 mies
#error "isp_exprs.h: is mode independent, but DECI_FACTOR_LOG2 is set"
#endif
#endif

#define LOG_VECTOR_STEP        _ISP_LOG_VECTOR_STEP(MODE)
/* should be even and multiple of vf downscaling */
#define ISP_OUTPUT_CHUNK_LOG_FACTOR (MAX_VF_LOG_DOWNSCALE<=1 ? LOG_VECTOR_STEP : \
					umax(VF_LOG_DOWNSCALE, LOG_VECTOR_STEP))

#define CEIL_DIV_CHUNKS(n,c)    ((c) == 1 ? (n) \
		  		          : CEIL_SHIFT(CEIL_DIV((n), (c)), ISP_OUTPUT_CHUNK_LOG_FACTOR)<<ISP_OUTPUT_CHUNK_LOG_FACTOR)


#define ISP_VARIABLE_INPUT     (ISP_INPUT == IA_CSS_BINARY_INPUT_VARIABLE)

/* Binary independent versions, see isp_defs.h for binary dependent ones */
#ifndef __ISP 
#define IMAGEFORMAT_IS_RAW(fmt)			((fmt) == IA_CSS_FRAME_FORMAT_RAW)

#define IMAGEFORMAT_IS_RAW_INTERLEAVED(fmt) 	((fmt) == IA_CSS_FRAME_FORMAT_RAW)

#define IMAGEFORMAT_IS_RGB(fmt) 		((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_PLANAR_RGB888 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_RGB565)

#define IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt) 	((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_RGB565)

#define IMAGEFORMAT_UV_INTERLEAVED(fmt) 	((fmt) == IA_CSS_FRAME_FORMAT_NV11    || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV12    || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV16    || (fmt) == IA_CSS_FRAME_FORMAT_NV61 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_UYVY    || (fmt) == IA_CSS_FRAME_FORMAT_YUYV || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12_TILEY)

#define IMAGEFORMAT_YUV_INTERLEAVED(fmt)	((fmt) == IA_CSS_FRAME_FORMAT_UYVY    || (fmt) == IA_CSS_FRAME_FORMAT_YUYV)

#define IMAGEFORMAT_INTERLEAVED(fmt)		(IMAGEFORMAT_UV_INTERLEAVED(fmt) || IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt))

#define IMAGEFORMAT_SUB_SAMPL_420(fmt)		((fmt) == IA_CSS_FRAME_FORMAT_YUV420 || (fmt) == IA_CSS_FRAME_FORMAT_YV12 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV12   || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12TILEY)

#define IMAGEFORMAT_SUB_SAMPL_422(fmt)		((fmt) == IA_CSS_FRAME_FORMAT_YUV422 || (fmt) == IA_CSS_FRAME_FORMAT_YV16 || \
						 (fmt) == IA_CSS_FRAME_FORMAT_NV16   || (fmt) == IA_CSS_FRAME_FORMAT_NV61)

#define IMAGEFORMAT_SUB_SAMPL_444(fmt) 		((fmt) == IA_CSS_FRAME_FORMAT_YUV444)

#define IMAGEFORMAT_UV_SWAPPED(fmt)		((fmt) == IA_CSS_FRAME_FORMAT_NV21 || (fmt) == IA_CSS_FRAME_FORMAT_NV61)

#define IMAGEFORMAT_IS_RGBA(fmt)		((fmt) == IA_CSS_FRAME_FORMAT_RGBA888)

#define IMAGEFORMAT_IS_NV11(fmt)		((fmt) == IA_CSS_FRAME_FORMAT_NV11)

#define IMAGEFORMAT_IS_16BIT(fmt)               ((fmt) == IA_CSS_FRAME_FORMAT_YUV420_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_YUV422_16)

#endif


/******** GDCAC settings *******/
#define GDCAC_BPP			ISP_VEC_ELEMBITS  /* We use 14 bits per pixel component for the GDCAC mode */
#define GDC_INPUT_BLOCK_WIDTH		2 /* Two vectors are needed */
#define GDC_OUTPUT_BLOCK_WIDTH		1 /* One vector is produced */

#if ISP_VEC_NELEMS == 16
/* For 16*16 output block, the distortion fits in 13.312 lines __ALWAYS__ */
#define GDC_INPUT_BLOCK_HEIGHT		14
#elif ISP_VEC_NELEMS == 64
/* For 64*64 output block, the distortion fits in 47.    lines __ALWAYS__ */
#define GDC_INPUT_BLOCK_HEIGHT		48
#endif
/*******************************/


#define ENABLE_HUP ((isp_input_width  - isp_envelope_width)  < isp_output_width)
#define ENABLE_VUP ((isp_input_height - isp_envelope_height) < isp_output_height)

#define ISP_INPUT_WIDTH  (ENABLE_DS | ENABLE_HUP ? isp_input_width  : ISP_INTERNAL_WIDTH)
#define ISP_INPUT_HEIGHT (ENABLE_DS | ENABLE_VUP ? isp_input_height : isp_internal_height)

#define DECI_FACTOR_LOG2 (ISP_FIXED_S3A_DECI_LOG ? ISP_FIXED_S3A_DECI_LOG : isp_deci_log_factor)

#define ISP_S3ATBL_WIDTH \
  _ISP_S3ATBL_ISP_WIDTH(_ISP_S3A_ELEMS_ISP_WIDTH((ENABLE_HUP ? ISP_INTERNAL_WIDTH : ISP_INPUT_WIDTH), ISP_LEFT_CROPPING), \
    DECI_FACTOR_LOG2)
#define S3ATBL_WIDTH_BYTES   (sizeof(struct ia_css_3a_output) * ISP_S3ATBL_WIDTH)
#define S3ATBL_WIDTH_SHORTS  (S3ATBL_WIDTH_BYTES / sizeof(short))

/* should be even?? */
#define ISP_UV_OUTPUT_CHUNK_VECS   	CEIL_DIV(ISP_OUTPUT_CHUNK_VECS, 2)


#if defined(__ISP) || defined(INIT_VARS)

#define ISP_USE_IF	(ISP_INPUT == IA_CSS_BINARY_INPUT_MEMORY ? 0 : \
	       	         ISP_INPUT == IA_CSS_BINARY_INPUT_SENSOR ? 1 : \
	                 isp_online)

#define ISP_DVS_ENVELOPE_WIDTH  0
#define ISP_DVS_ENVELOPE_HEIGHT 0

#define _ISP_INPUT_WIDTH_VECS	_ISP_VECS(ISP_INPUT_WIDTH)

#if !defined(__ISP) || (VARIABLE_RESOLUTION && !__HOST)
#define ISP_INPUT_WIDTH_VECS	isp_vectors_per_input_line
#else
#define ISP_INPUT_WIDTH_VECS	_ISP_INPUT_WIDTH_VECS
#endif

#if !defined(__ISP) || VARIABLE_RESOLUTION
#define ISP_INTERNAL_WIDTH_VECS		isp_vectors_per_line
#else
#define ISP_INTERNAL_WIDTH_VECS		_ISP_INTERNAL_WIDTH_VECS
#endif

#define _ISP_INTERNAL_HEIGHT	__ISP_INTERNAL_HEIGHT(isp_output_height, ISP_TOP_CROPPING, ISP_DVS_ENVELOPE_HEIGHT)

#define ISP_INTERNAL_HEIGHT	isp_internal_height

#define _ISP_INTERNAL_WIDTH	__ISP_INTERNAL_WIDTH(ISP_OUTPUT_WIDTH, ISP_DVS_ENVELOPE_WIDTH, \
			     			     ISP_LEFT_CROPPING, MODE, ISP_C_SUBSAMPLING, \
						     OUTPUT_NUM_CHUNKS, ISP_PIPELINING)

#define ISP_UV_INTERNAL_WIDTH	(ISP_INTERNAL_WIDTH / 2)
#define ISP_UV_INTERNAL_HEIGHT	(ISP_INTERNAL_HEIGHT / 2)

#define _ISP_INTERNAL_WIDTH_VECS	(_ISP_INTERNAL_WIDTH / ISP_VEC_NELEMS)
#define _ISP_UV_INTERNAL_WIDTH_VECS	CEIL_DIV(ISP_UV_INTERNAL_WIDTH, ISP_VEC_NELEMS)

#define ISP_VF_OUTPUT_WIDTH		_ISP_VF_OUTPUT_WIDTH(ISP_VF_OUTPUT_WIDTH_VECS)
#define ISP_VF_OUTPUT_HEIGHT		_ISP_VF_OUTPUT_HEIGHT(isp_output_height, VF_LOG_DOWNSCALE)

#if defined (__ISP) && !VARIABLE_RESOLUTION
#define ISP_INTERNAL_WIDTH         _ISP_INTERNAL_WIDTH
#define ISP_VF_OUTPUT_WIDTH_VECS   _ISP_VF_OUTPUT_WIDTH_VECS
#else
#define ISP_INTERNAL_WIDTH         (VARIABLE_RESOLUTION ? isp_internal_width : _ISP_INTERNAL_WIDTH)
#define ISP_VF_OUTPUT_WIDTH_VECS   (VARIABLE_RESOLUTION ? isp_vf_output_width_vecs : _ISP_VF_OUTPUT_WIDTH_VECS)
#endif

#if defined(__ISP) && !VARIABLE_RESOLUTION
#define ISP_OUTPUT_WIDTH        ISP_MAX_OUTPUT_WIDTH
#define VF_LOG_DOWNSCALE        MAX_VF_LOG_DOWNSCALE
#else
#define ISP_OUTPUT_WIDTH        isp_output_width
#define VF_LOG_DOWNSCALE        isp_vf_downscale_bits
#endif

#if !defined(__ISP) || VARIABLE_RESOLUTION
#define _ISP_MAX_VF_OUTPUT_WIDTH	__ISP_MAX_VF_OUTPUT_WIDTH(2*SH_CSS_MAX_VF_WIDTH, ISP_LEFT_CROPPING)
#elif defined(MODE) && MODE == IA_CSS_BINARY_MODE_PRIMARY && ISP_OUTPUT_WIDTH > 3328
/* Because of vmem issues, should be fixed later */
#define _ISP_MAX_VF_OUTPUT_WIDTH	(SH_CSS_MAX_VF_WIDTH - 2*ISP_VEC_NELEMS + (ISP_LEFT_CROPPING ? 2 * ISP_VEC_NELEMS : 0))
#else
#define _ISP_MAX_VF_OUTPUT_WIDTH	(ISP_VF_OUTPUT_WIDTH + (ISP_LEFT_CROPPING ? (2 >> VF_LOG_DOWNSCALE) * ISP_VEC_NELEMS : 0))
#endif

#define ISP_MAX_VF_OUTPUT_VECS 		CEIL_DIV(_ISP_MAX_VF_OUTPUT_WIDTH, ISP_VEC_NELEMS)



#define ISP_MIN_STRIPE_WIDTH (ISP_PIPELINING * (1<<_ISP_LOG_VECTOR_STEP(MODE)))

/******* STRIPING-RELATED MACROS *******/
#define NO_STRIPING (ISP_NUM_STRIPES == 1)

#define ISP_OUTPUT_CHUNK_VECS \
	(NO_STRIPING 	? CEIL_DIV_CHUNKS(ISP_OUTPUT_VECS_EXTRA_CROP, OUTPUT_NUM_CHUNKS) \
				: ISP_IO_STRIPE_WIDTH_VECS(ISP_OUTPUT_VECS_EXTRA_CROP, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) )

#define VECTORS_PER_LINE \
	(NO_STRIPING 	? ISP_INTERNAL_WIDTH_VECS \
				: ISP_IO_STRIPE_WIDTH_VECS(ISP_INTERNAL_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) )

#define VECTORS_PER_INPUT_LINE \
	(NO_STRIPING 	? ISP_INPUT_WIDTH_VECS \
				: ISP_IO_STRIPE_WIDTH_VECS(ISP_INPUT_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH)+_ISP_EXTRA_PADDING_VECS)


#define ISP_MAX_VF_OUTPUT_STRIPE_VECS \
	(NO_STRIPING 	? ISP_MAX_VF_OUTPUT_VECS \
				: CEIL_MUL(CEIL_DIV(ISP_MAX_VF_OUTPUT_VECS, ISP_NUM_STRIPES), 2))
#define _ISP_VF_OUTPUT_WIDTH_VECS \
	(NO_STRIPING 	? __ISP_VF_OUTPUT_WIDTH_VECS(ISP_OUTPUT_WIDTH, VF_LOG_DOWNSCALE) \
				: __ISP_VF_OUTPUT_WIDTH_VECS(CEIL_DIV(ISP_OUTPUT_WIDTH, ISP_NUM_STRIPES), VF_LOG_DOWNSCALE))

#define ISP_IO_STRIPE_WIDTH_VECS(width, padding, num_stripes, min_stripe) \
	MAX(CEIL_MUL(padding + CEIL_DIV(width-padding, num_stripes) \
		   , 2) \
	  , min_stripe)
////////// INPUT & INTERNAL
/* should be even */
#define INPUT_NUM_CHUNKS	OUTPUT_NUM_CHUNKS

#define INPUT_VECTORS_PER_CHUNK	CEIL_DIV_CHUNKS(VECTORS_PER_INPUT_LINE, INPUT_NUM_CHUNKS)

/* only for ISP code, will be removed: */
#define VECTORS_PER_FULL_LINE         	ISP_INTERNAL_WIDTH_VECS
#define VECTORS_PER_INPUT_FULL_LINE   	ISP_INPUT_WIDTH_VECS

////////// OUTPUT
/* should at least even and also multiple of vf scaling */
#define ISP_OUTPUT_VECS_EXTRA_CROP	CEIL_DIV(ISP_OUTPUT_WIDTH_EXTRA_CROP, ISP_VEC_NELEMS)

/* Output is decoupled from input */
#define ISP_OUTPUT_WIDTH_EXTRA_CROP	CEIL_MUL(CEIL_MUL((ENABLE_DVS_ENVELOPE ? ISP_OUTPUT_WIDTH : ISP_INTERNAL_WIDTH), 2*ISP_VEC_NELEMS), \
		 				ISP_C_SUBSAMPLING * OUTPUT_NUM_CHUNKS *  HIVE_ISP_DDR_WORD_BYTES)

#define ISP_MAX_VF_OUTPUT_CHUNK_VECS \
        (NO_CHUNKING ? ISP_MAX_VF_OUTPUT_STRIPE_VECS \
                                : 2*CEIL_DIV(ISP_MAX_VF_OUTPUT_STRIPE_VECS, 2*OUTPUT_NUM_CHUNKS))

#define OUTPUT_VECTORS_PER_CHUNK	CEIL_DIV_CHUNKS(VECTORS_PER_LINE,OUTPUT_NUM_CHUNKS)

/* should be even?? */
#define OUTPUT_C_VECTORS_PER_CHUNK  	CEIL_DIV(OUTPUT_VECTORS_PER_CHUNK, 2)

#ifndef ISP2401
/**** SCTBL defs *******/
#define ISP_SCTBL_HEIGHT \
	_ISP_SCTBL_HEIGHT(ISP_INPUT_HEIGHT, DECI_FACTOR_LOG2)

#endif
/**** UDS defs *********/
#define UDS_DMACH_STRIDE_B_IN_Y           (( ISP_INTERNAL_WIDTH   /BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES)
#define UDS_DMACH_STRIDE_B_IN_C           (((ISP_INTERNAL_WIDTH/2)/BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES)

#else /* defined(__ISP) || defined(INIT_VARS) */

#define ISP_INTERNAL_WIDTH         isp_internal_width
#define ISP_INTERNAL_HEIGHT        isp_internal_height

#endif /* defined(__ISP) || defined(INIT_VARS) */

#endif /* _COMMON_ISP_EXPRS_H_ */