GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / staging / media / atomisp / pci / atomisp2 / css2400 / isp / modes / interface / isp_exprs.h
1 #ifndef ISP2401
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2015, Intel Corporation.
5  *
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.
9  *
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
13  * more details.
14  */
15 #else
16 /**
17 Support for Intel Camera Imaging ISP subsystem.
18 Copyright (c) 2010 - 2015, Intel Corporation.
19
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.
23
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
27 more details.
28 */
29 #endif
30
31 #ifndef _COMMON_ISP_EXPRS_H_
32 #define _COMMON_ISP_EXPRS_H_
33
34 /* Binary independent pre-processor expressions */
35
36 #include "sh_css_defs.h"
37 #include "isp_const.h"
38
39 #ifdef __HOST
40 #error "isp_exprs.h: Do not include on HOST, contains ISP specific defines"
41 #endif
42
43 #ifndef __ISP
44 #if defined(MODE)
45 #define MODE aap
46 #error "isp_exprs.h: is mode independent, but MODE is set"
47 #endif
48 #if defined(VARIABLE_RESOLUTION)
49 #define VARIABLE_RESOLUTION noot
50 #error "isp_exprs.h: is mode independent, but VARIABLE_RESOLUTION is set"
51 #endif
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"
55 #endif
56 #endif
57
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))
62
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)
65
66
67 #define ISP_VARIABLE_INPUT     (ISP_INPUT == IA_CSS_BINARY_INPUT_VARIABLE)
68
69 /* Binary independent versions, see isp_defs.h for binary dependent ones */
70 #ifndef __ISP 
71 #define IMAGEFORMAT_IS_RAW(fmt)                 ((fmt) == IA_CSS_FRAME_FORMAT_RAW)
72
73 #define IMAGEFORMAT_IS_RAW_INTERLEAVED(fmt)     ((fmt) == IA_CSS_FRAME_FORMAT_RAW)
74
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)
77
78 #define IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt)     ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888 || (fmt) == IA_CSS_FRAME_FORMAT_RGB565)
79
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)
85
86 #define IMAGEFORMAT_YUV_INTERLEAVED(fmt)        ((fmt) == IA_CSS_FRAME_FORMAT_UYVY    || (fmt) == IA_CSS_FRAME_FORMAT_YUYV)
87
88 #define IMAGEFORMAT_INTERLEAVED(fmt)            (IMAGEFORMAT_UV_INTERLEAVED(fmt) || IMAGEFORMAT_IS_RGB_INTERLEAVED(fmt))
89
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)
93
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)
96
97 #define IMAGEFORMAT_SUB_SAMPL_444(fmt)          ((fmt) == IA_CSS_FRAME_FORMAT_YUV444)
98
99 #define IMAGEFORMAT_UV_SWAPPED(fmt)             ((fmt) == IA_CSS_FRAME_FORMAT_NV21 || (fmt) == IA_CSS_FRAME_FORMAT_NV61)
100
101 #define IMAGEFORMAT_IS_RGBA(fmt)                ((fmt) == IA_CSS_FRAME_FORMAT_RGBA888)
102
103 #define IMAGEFORMAT_IS_NV11(fmt)                ((fmt) == IA_CSS_FRAME_FORMAT_NV11)
104
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)
106
107 #endif
108
109
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 */
114
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
121 #endif
122 /*******************************/
123
124
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)
127
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)
130
131 #define DECI_FACTOR_LOG2 (ISP_FIXED_S3A_DECI_LOG ? ISP_FIXED_S3A_DECI_LOG : isp_deci_log_factor)
132
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), \
135     DECI_FACTOR_LOG2)
136 #define S3ATBL_WIDTH_BYTES   (sizeof(struct ia_css_3a_output) * ISP_S3ATBL_WIDTH)
137 #define S3ATBL_WIDTH_SHORTS  (S3ATBL_WIDTH_BYTES / sizeof(short))
138
139 /* should be even?? */
140 #define ISP_UV_OUTPUT_CHUNK_VECS        CEIL_DIV(ISP_OUTPUT_CHUNK_VECS, 2)
141
142
143 #if defined(__ISP) || defined(INIT_VARS)
144
145 #define ISP_USE_IF      (ISP_INPUT == IA_CSS_BINARY_INPUT_MEMORY ? 0 : \
146                          ISP_INPUT == IA_CSS_BINARY_INPUT_SENSOR ? 1 : \
147                          isp_online)
148
149 #define ISP_DVS_ENVELOPE_WIDTH  0
150 #define ISP_DVS_ENVELOPE_HEIGHT 0
151
152 #define _ISP_INPUT_WIDTH_VECS   _ISP_VECS(ISP_INPUT_WIDTH)
153
154 #if !defined(__ISP) || (VARIABLE_RESOLUTION && !__HOST)
155 #define ISP_INPUT_WIDTH_VECS    isp_vectors_per_input_line
156 #else
157 #define ISP_INPUT_WIDTH_VECS    _ISP_INPUT_WIDTH_VECS
158 #endif
159
160 #if !defined(__ISP) || VARIABLE_RESOLUTION
161 #define ISP_INTERNAL_WIDTH_VECS         isp_vectors_per_line
162 #else
163 #define ISP_INTERNAL_WIDTH_VECS         _ISP_INTERNAL_WIDTH_VECS
164 #endif
165
166 #define _ISP_INTERNAL_HEIGHT    __ISP_INTERNAL_HEIGHT(isp_output_height, ISP_TOP_CROPPING, ISP_DVS_ENVELOPE_HEIGHT)
167
168 #define ISP_INTERNAL_HEIGHT     isp_internal_height
169
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)
173
174 #define ISP_UV_INTERNAL_WIDTH   (ISP_INTERNAL_WIDTH / 2)
175 #define ISP_UV_INTERNAL_HEIGHT  (ISP_INTERNAL_HEIGHT / 2)
176
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)
179
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)
182
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
186 #else
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)
189 #endif
190
191 #if defined(__ISP) && !VARIABLE_RESOLUTION
192 #define ISP_OUTPUT_WIDTH        ISP_MAX_OUTPUT_WIDTH
193 #define VF_LOG_DOWNSCALE        MAX_VF_LOG_DOWNSCALE
194 #else
195 #define ISP_OUTPUT_WIDTH        isp_output_width
196 #define VF_LOG_DOWNSCALE        isp_vf_downscale_bits
197 #endif
198
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))
204 #else
205 #define _ISP_MAX_VF_OUTPUT_WIDTH        (ISP_VF_OUTPUT_WIDTH + (ISP_LEFT_CROPPING ? (2 >> VF_LOG_DOWNSCALE) * ISP_VEC_NELEMS : 0))
206 #endif
207
208 #define ISP_MAX_VF_OUTPUT_VECS          CEIL_DIV(_ISP_MAX_VF_OUTPUT_WIDTH, ISP_VEC_NELEMS)
209
210
211
212 #define ISP_MIN_STRIPE_WIDTH (ISP_PIPELINING * (1<<_ISP_LOG_VECTOR_STEP(MODE)))
213
214 /******* STRIPING-RELATED MACROS *******/
215 #define NO_STRIPING (ISP_NUM_STRIPES == 1)
216
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) )
220
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) )
224
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)
228
229
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))
236
237 #define ISP_IO_STRIPE_WIDTH_VECS(width, padding, num_stripes, min_stripe) \
238         MAX(CEIL_MUL(padding + CEIL_DIV(width-padding, num_stripes) \
239                    , 2) \
240           , min_stripe)
241 ////////// INPUT & INTERNAL
242 /* should be even */
243 #define INPUT_NUM_CHUNKS        OUTPUT_NUM_CHUNKS
244
245 #define INPUT_VECTORS_PER_CHUNK CEIL_DIV_CHUNKS(VECTORS_PER_INPUT_LINE, INPUT_NUM_CHUNKS)
246
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
250
251 ////////// OUTPUT
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)
254
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)
258
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))
262
263 #define OUTPUT_VECTORS_PER_CHUNK        CEIL_DIV_CHUNKS(VECTORS_PER_LINE,OUTPUT_NUM_CHUNKS)
264
265 /* should be even?? */
266 #define OUTPUT_C_VECTORS_PER_CHUNK      CEIL_DIV(OUTPUT_VECTORS_PER_CHUNK, 2)
267
268 #ifndef ISP2401
269 /**** SCTBL defs *******/
270 #define ISP_SCTBL_HEIGHT \
271         _ISP_SCTBL_HEIGHT(ISP_INPUT_HEIGHT, DECI_FACTOR_LOG2)
272
273 #endif
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)
277
278 #else /* defined(__ISP) || defined(INIT_VARS) */
279
280 #define ISP_INTERNAL_WIDTH         isp_internal_width
281 #define ISP_INTERNAL_HEIGHT        isp_internal_height
282
283 #endif /* defined(__ISP) || defined(INIT_VARS) */
284
285 #endif /* _COMMON_ISP_EXPRS_H_ */
286