3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 Support for Intel Camera Imaging ISP subsystem.
18 Copyright (c) 2010 - 2015, Intel Corporation.
20 This program is free software; you can redistribute it and/or modify it
21 under the terms and conditions of the GNU General Public License,
22 version 2, as published by the Free Software Foundation.
24 This program is distributed in the hope it will be useful, but WITHOUT
25 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
26 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
31 #ifndef _COMMON_ISP_EXPRS_H_
32 #define _COMMON_ISP_EXPRS_H_
34 /* Binary independent pre-processor expressions */
36 #include "sh_css_defs.h"
37 #include "isp_const.h"
40 #error "isp_exprs.h: Do not include on HOST, contains ISP specific defines"
46 #error "isp_exprs.h: is mode independent, but MODE is set"
48 #if defined(VARIABLE_RESOLUTION)
49 #define VARIABLE_RESOLUTION noot
50 #error "isp_exprs.h: is mode independent, but VARIABLE_RESOLUTION is set"
52 #if defined(DECI_FACTOR_LOG2)
53 #define DECI_FACTOR_LOG2 mies
54 #error "isp_exprs.h: is mode independent, but DECI_FACTOR_LOG2 is set"
58 #define LOG_VECTOR_STEP _ISP_LOG_VECTOR_STEP(MODE)
59 /* should be even and multiple of vf downscaling */
60 #define ISP_OUTPUT_CHUNK_LOG_FACTOR (MAX_VF_LOG_DOWNSCALE<=1 ? LOG_VECTOR_STEP : \
61 umax(VF_LOG_DOWNSCALE, LOG_VECTOR_STEP))
63 #define CEIL_DIV_CHUNKS(n,c) ((c) == 1 ? (n) \
64 : CEIL_SHIFT(CEIL_DIV((n), (c)), ISP_OUTPUT_CHUNK_LOG_FACTOR)<<ISP_OUTPUT_CHUNK_LOG_FACTOR)
67 #define ISP_VARIABLE_INPUT (ISP_INPUT == IA_CSS_BINARY_INPUT_VARIABLE)
69 /* Binary independent versions, see isp_defs.h for binary dependent ones */
71 #define IMAGEFORMAT_IS_RAW(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RAW)
73 #define IMAGEFORMAT_IS_RAW_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RAW)
75 #define IMAGEFORMAT_IS_RGB(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_PLANAR_RGB888 || \
76 (fmt) == IA_CSS_FRAME_FORMAT_RGB565)
78 #define IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_RGB565)
80 #define IMAGEFORMAT_UV_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV11 || \
81 (fmt) == IA_CSS_FRAME_FORMAT_NV12 || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \
82 (fmt) == IA_CSS_FRAME_FORMAT_NV16 || (fmt) == IA_CSS_FRAME_FORMAT_NV61 || \
83 (fmt) == IA_CSS_FRAME_FORMAT_UYVY || (fmt) == IA_CSS_FRAME_FORMAT_YUYV || \
84 (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12_TILEY)
86 #define IMAGEFORMAT_YUV_INTERLEAVED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_UYVY || (fmt) == IA_CSS_FRAME_FORMAT_YUYV)
88 #define IMAGEFORMAT_INTERLEAVED(fmt) (IMAGEFORMAT_UV_INTERLEAVED(fmt) || IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt))
90 #define IMAGEFORMAT_SUB_SAMPL_420(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV420 || (fmt) == IA_CSS_FRAME_FORMAT_YV12 || \
91 (fmt) == IA_CSS_FRAME_FORMAT_NV12 || (fmt) == IA_CSS_FRAME_FORMAT_NV21 || \
92 (fmt) == IA_CSS_FRAME_FORMAT_NV12_16 || (fmt) == IA_CSS_FRAME_FORMAT_NV12TILEY)
94 #define IMAGEFORMAT_SUB_SAMPL_422(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV422 || (fmt) == IA_CSS_FRAME_FORMAT_YV16 || \
95 (fmt) == IA_CSS_FRAME_FORMAT_NV16 || (fmt) == IA_CSS_FRAME_FORMAT_NV61)
97 #define IMAGEFORMAT_SUB_SAMPL_444(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_YUV444)
99 #define IMAGEFORMAT_UV_SWAPPED(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV21 || (fmt) == IA_CSS_FRAME_FORMAT_NV61)
101 #define IMAGEFORMAT_IS_RGBA(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888)
103 #define IMAGEFORMAT_IS_NV11(fmt) ((fmt) == IA_CSS_FRAME_FORMAT_NV11)
105 #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)
110 /******** GDCAC settings *******/
111 #define GDCAC_BPP ISP_VEC_ELEMBITS /* We use 14 bits per pixel component for the GDCAC mode */
112 #define GDC_INPUT_BLOCK_WIDTH 2 /* Two vectors are needed */
113 #define GDC_OUTPUT_BLOCK_WIDTH 1 /* One vector is produced */
115 #if ISP_VEC_NELEMS == 16
116 /* For 16*16 output block, the distortion fits in 13.312 lines __ALWAYS__ */
117 #define GDC_INPUT_BLOCK_HEIGHT 14
118 #elif ISP_VEC_NELEMS == 64
119 /* For 64*64 output block, the distortion fits in 47. lines __ALWAYS__ */
120 #define GDC_INPUT_BLOCK_HEIGHT 48
122 /*******************************/
125 #define ENABLE_HUP ((isp_input_width - isp_envelope_width) < isp_output_width)
126 #define ENABLE_VUP ((isp_input_height - isp_envelope_height) < isp_output_height)
128 #define ISP_INPUT_WIDTH (ENABLE_DS | ENABLE_HUP ? isp_input_width : ISP_INTERNAL_WIDTH)
129 #define ISP_INPUT_HEIGHT (ENABLE_DS | ENABLE_VUP ? isp_input_height : isp_internal_height)
131 #define DECI_FACTOR_LOG2 (ISP_FIXED_S3A_DECI_LOG ? ISP_FIXED_S3A_DECI_LOG : isp_deci_log_factor)
133 #define ISP_S3ATBL_WIDTH \
134 _ISP_S3ATBL_ISP_WIDTH(_ISP_S3A_ELEMS_ISP_WIDTH((ENABLE_HUP ? ISP_INTERNAL_WIDTH : ISP_INPUT_WIDTH), ISP_LEFT_CROPPING), \
136 #define S3ATBL_WIDTH_BYTES (sizeof(struct ia_css_3a_output) * ISP_S3ATBL_WIDTH)
137 #define S3ATBL_WIDTH_SHORTS (S3ATBL_WIDTH_BYTES / sizeof(short))
139 /* should be even?? */
140 #define ISP_UV_OUTPUT_CHUNK_VECS CEIL_DIV(ISP_OUTPUT_CHUNK_VECS, 2)
143 #if defined(__ISP) || defined(INIT_VARS)
145 #define ISP_USE_IF (ISP_INPUT == IA_CSS_BINARY_INPUT_MEMORY ? 0 : \
146 ISP_INPUT == IA_CSS_BINARY_INPUT_SENSOR ? 1 : \
149 #define ISP_DVS_ENVELOPE_WIDTH 0
150 #define ISP_DVS_ENVELOPE_HEIGHT 0
152 #define _ISP_INPUT_WIDTH_VECS _ISP_VECS(ISP_INPUT_WIDTH)
154 #if !defined(__ISP) || (VARIABLE_RESOLUTION && !__HOST)
155 #define ISP_INPUT_WIDTH_VECS isp_vectors_per_input_line
157 #define ISP_INPUT_WIDTH_VECS _ISP_INPUT_WIDTH_VECS
160 #if !defined(__ISP) || VARIABLE_RESOLUTION
161 #define ISP_INTERNAL_WIDTH_VECS isp_vectors_per_line
163 #define ISP_INTERNAL_WIDTH_VECS _ISP_INTERNAL_WIDTH_VECS
166 #define _ISP_INTERNAL_HEIGHT __ISP_INTERNAL_HEIGHT(isp_output_height, ISP_TOP_CROPPING, ISP_DVS_ENVELOPE_HEIGHT)
168 #define ISP_INTERNAL_HEIGHT isp_internal_height
170 #define _ISP_INTERNAL_WIDTH __ISP_INTERNAL_WIDTH(ISP_OUTPUT_WIDTH, ISP_DVS_ENVELOPE_WIDTH, \
171 ISP_LEFT_CROPPING, MODE, ISP_C_SUBSAMPLING, \
172 OUTPUT_NUM_CHUNKS, ISP_PIPELINING)
174 #define ISP_UV_INTERNAL_WIDTH (ISP_INTERNAL_WIDTH / 2)
175 #define ISP_UV_INTERNAL_HEIGHT (ISP_INTERNAL_HEIGHT / 2)
177 #define _ISP_INTERNAL_WIDTH_VECS (_ISP_INTERNAL_WIDTH / ISP_VEC_NELEMS)
178 #define _ISP_UV_INTERNAL_WIDTH_VECS CEIL_DIV(ISP_UV_INTERNAL_WIDTH, ISP_VEC_NELEMS)
180 #define ISP_VF_OUTPUT_WIDTH _ISP_VF_OUTPUT_WIDTH(ISP_VF_OUTPUT_WIDTH_VECS)
181 #define ISP_VF_OUTPUT_HEIGHT _ISP_VF_OUTPUT_HEIGHT(isp_output_height, VF_LOG_DOWNSCALE)
183 #if defined (__ISP) && !VARIABLE_RESOLUTION
184 #define ISP_INTERNAL_WIDTH _ISP_INTERNAL_WIDTH
185 #define ISP_VF_OUTPUT_WIDTH_VECS _ISP_VF_OUTPUT_WIDTH_VECS
187 #define ISP_INTERNAL_WIDTH (VARIABLE_RESOLUTION ? isp_internal_width : _ISP_INTERNAL_WIDTH)
188 #define ISP_VF_OUTPUT_WIDTH_VECS (VARIABLE_RESOLUTION ? isp_vf_output_width_vecs : _ISP_VF_OUTPUT_WIDTH_VECS)
191 #if defined(__ISP) && !VARIABLE_RESOLUTION
192 #define ISP_OUTPUT_WIDTH ISP_MAX_OUTPUT_WIDTH
193 #define VF_LOG_DOWNSCALE MAX_VF_LOG_DOWNSCALE
195 #define ISP_OUTPUT_WIDTH isp_output_width
196 #define VF_LOG_DOWNSCALE isp_vf_downscale_bits
199 #if !defined(__ISP) || VARIABLE_RESOLUTION
200 #define _ISP_MAX_VF_OUTPUT_WIDTH __ISP_MAX_VF_OUTPUT_WIDTH(2*SH_CSS_MAX_VF_WIDTH, ISP_LEFT_CROPPING)
201 #elif defined(MODE) && MODE == IA_CSS_BINARY_MODE_PRIMARY && ISP_OUTPUT_WIDTH > 3328
202 /* Because of vmem issues, should be fixed later */
203 #define _ISP_MAX_VF_OUTPUT_WIDTH (SH_CSS_MAX_VF_WIDTH - 2*ISP_VEC_NELEMS + (ISP_LEFT_CROPPING ? 2 * ISP_VEC_NELEMS : 0))
205 #define _ISP_MAX_VF_OUTPUT_WIDTH (ISP_VF_OUTPUT_WIDTH + (ISP_LEFT_CROPPING ? (2 >> VF_LOG_DOWNSCALE) * ISP_VEC_NELEMS : 0))
208 #define ISP_MAX_VF_OUTPUT_VECS CEIL_DIV(_ISP_MAX_VF_OUTPUT_WIDTH, ISP_VEC_NELEMS)
212 #define ISP_MIN_STRIPE_WIDTH (ISP_PIPELINING * (1<<_ISP_LOG_VECTOR_STEP(MODE)))
214 /******* STRIPING-RELATED MACROS *******/
215 #define NO_STRIPING (ISP_NUM_STRIPES == 1)
217 #define ISP_OUTPUT_CHUNK_VECS \
218 (NO_STRIPING ? CEIL_DIV_CHUNKS(ISP_OUTPUT_VECS_EXTRA_CROP, OUTPUT_NUM_CHUNKS) \
219 : ISP_IO_STRIPE_WIDTH_VECS(ISP_OUTPUT_VECS_EXTRA_CROP, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) )
221 #define VECTORS_PER_LINE \
222 (NO_STRIPING ? ISP_INTERNAL_WIDTH_VECS \
223 : ISP_IO_STRIPE_WIDTH_VECS(ISP_INTERNAL_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH) )
225 #define VECTORS_PER_INPUT_LINE \
226 (NO_STRIPING ? ISP_INPUT_WIDTH_VECS \
227 : ISP_IO_STRIPE_WIDTH_VECS(ISP_INPUT_WIDTH_VECS, ISP_LEFT_PADDING_VECS, ISP_NUM_STRIPES, ISP_MIN_STRIPE_WIDTH)+_ISP_EXTRA_PADDING_VECS)
230 #define ISP_MAX_VF_OUTPUT_STRIPE_VECS \
231 (NO_STRIPING ? ISP_MAX_VF_OUTPUT_VECS \
232 : CEIL_MUL(CEIL_DIV(ISP_MAX_VF_OUTPUT_VECS, ISP_NUM_STRIPES), 2))
233 #define _ISP_VF_OUTPUT_WIDTH_VECS \
234 (NO_STRIPING ? __ISP_VF_OUTPUT_WIDTH_VECS(ISP_OUTPUT_WIDTH, VF_LOG_DOWNSCALE) \
235 : __ISP_VF_OUTPUT_WIDTH_VECS(CEIL_DIV(ISP_OUTPUT_WIDTH, ISP_NUM_STRIPES), VF_LOG_DOWNSCALE))
237 #define ISP_IO_STRIPE_WIDTH_VECS(width, padding, num_stripes, min_stripe) \
238 MAX(CEIL_MUL(padding + CEIL_DIV(width-padding, num_stripes) \
241 ////////// INPUT & INTERNAL
243 #define INPUT_NUM_CHUNKS OUTPUT_NUM_CHUNKS
245 #define INPUT_VECTORS_PER_CHUNK CEIL_DIV_CHUNKS(VECTORS_PER_INPUT_LINE, INPUT_NUM_CHUNKS)
247 /* only for ISP code, will be removed: */
248 #define VECTORS_PER_FULL_LINE ISP_INTERNAL_WIDTH_VECS
249 #define VECTORS_PER_INPUT_FULL_LINE ISP_INPUT_WIDTH_VECS
252 /* should at least even and also multiple of vf scaling */
253 #define ISP_OUTPUT_VECS_EXTRA_CROP CEIL_DIV(ISP_OUTPUT_WIDTH_EXTRA_CROP, ISP_VEC_NELEMS)
255 /* Output is decoupled from input */
256 #define ISP_OUTPUT_WIDTH_EXTRA_CROP CEIL_MUL(CEIL_MUL((ENABLE_DVS_ENVELOPE ? ISP_OUTPUT_WIDTH : ISP_INTERNAL_WIDTH), 2*ISP_VEC_NELEMS), \
257 ISP_C_SUBSAMPLING * OUTPUT_NUM_CHUNKS * HIVE_ISP_DDR_WORD_BYTES)
259 #define ISP_MAX_VF_OUTPUT_CHUNK_VECS \
260 (NO_CHUNKING ? ISP_MAX_VF_OUTPUT_STRIPE_VECS \
261 : 2*CEIL_DIV(ISP_MAX_VF_OUTPUT_STRIPE_VECS, 2*OUTPUT_NUM_CHUNKS))
263 #define OUTPUT_VECTORS_PER_CHUNK CEIL_DIV_CHUNKS(VECTORS_PER_LINE,OUTPUT_NUM_CHUNKS)
265 /* should be even?? */
266 #define OUTPUT_C_VECTORS_PER_CHUNK CEIL_DIV(OUTPUT_VECTORS_PER_CHUNK, 2)
269 /**** SCTBL defs *******/
270 #define ISP_SCTBL_HEIGHT \
271 _ISP_SCTBL_HEIGHT(ISP_INPUT_HEIGHT, DECI_FACTOR_LOG2)
274 /**** UDS defs *********/
275 #define UDS_DMACH_STRIDE_B_IN_Y (( ISP_INTERNAL_WIDTH /BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES)
276 #define UDS_DMACH_STRIDE_B_IN_C (((ISP_INTERNAL_WIDTH/2)/BITS8_ELEMENTS_PER_XMEM_ADDR)*HIVE_ISP_DDR_WORD_BYTES)
278 #else /* defined(__ISP) || defined(INIT_VARS) */
280 #define ISP_INTERNAL_WIDTH isp_internal_width
281 #define ISP_INTERNAL_HEIGHT isp_internal_height
283 #endif /* defined(__ISP) || defined(INIT_VARS) */
285 #endif /* _COMMON_ISP_EXPRS_H_ */