GNU Linux-libre 4.14.332-gnu1
[releases.git] / drivers / staging / media / atomisp / pci / atomisp2 / css2400 / sh_css_param_dvs.h
1 /*
2  * Support for Intel Camera Imaging ISP subsystem.
3  * Copyright (c) 2015, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  */
14
15 #ifndef _SH_CSS_PARAMS_DVS_H_
16 #define _SH_CSS_PARAMS_DVS_H_
17
18 #include <math_support.h>
19 #include <ia_css_types.h>
20 #ifdef ISP2401
21 #include <sh_css_dvs_info.h>
22 #endif
23 #include "gdc_global.h" /* gdc_warp_param_mem_t */
24
25 #define DVS_ENV_MIN_X (12)
26 #define DVS_ENV_MIN_Y (12)
27
28 #define DVS_BLOCKDIM_X (64)        /* X block height*/
29 #define DVS_BLOCKDIM_Y_LUMA (64)   /* Y block height*/
30 #define DVS_BLOCKDIM_Y_CHROMA (32) /* UV height block size is half the Y block height*/
31
32 #ifndef ISP2401
33 /* horizontal 64x64 blocks round up to DVS_BLOCKDIM_X, make even */
34 #define DVS_NUM_BLOCKS_X(X)             (CEIL_MUL(CEIL_DIV((X), DVS_BLOCKDIM_X), 2))
35
36 /* vertical   64x64 blocks round up to DVS_BLOCKDIM_Y */
37 #define DVS_NUM_BLOCKS_Y(X)             (CEIL_DIV((X), DVS_BLOCKDIM_Y_LUMA))
38 #define DVS_NUM_BLOCKS_X_CHROMA(X)      (CEIL_DIV((X), DVS_BLOCKDIM_X))
39 #define DVS_NUM_BLOCKS_Y_CHROMA(X)      (CEIL_DIV((X), DVS_BLOCKDIM_Y_CHROMA))
40
41
42 #endif
43 #define DVS_TABLE_IN_BLOCKDIM_X_LUMA(X) (DVS_NUM_BLOCKS_X(X) + 1)  /* N blocks have N + 1 set of coords */
44 #define DVS_TABLE_IN_BLOCKDIM_X_CHROMA(X)   (DVS_NUM_BLOCKS_X_CHROMA(X) + 1)
45 #define DVS_TABLE_IN_BLOCKDIM_Y_LUMA(X)         (DVS_NUM_BLOCKS_Y(X) + 1)
46 #define DVS_TABLE_IN_BLOCKDIM_Y_CHROMA(X)       (DVS_NUM_BLOCKS_Y_CHROMA(X) + 1)
47
48 #define DVS_ENVELOPE_X(X) (((X) == 0) ? (DVS_ENV_MIN_X) : (X))
49 #define DVS_ENVELOPE_Y(X) (((X) == 0) ? (DVS_ENV_MIN_Y) : (X))
50
51 #define DVS_COORD_FRAC_BITS (10)
52 #ifndef ISP2401
53 #define DVS_INPUT_BYTES_PER_PIXEL (1)
54 #endif
55 #define XMEM_ALIGN_LOG2 (5)
56
57 #define DVS_6AXIS_COORDS_ELEMS CEIL_MUL(sizeof(gdc_warp_param_mem_t) \
58                                         , HIVE_ISP_DDR_WORD_BYTES)
59
60 /* currently we only support two output with the same resolution, output 0 is th default one. */
61 #define DVS_6AXIS_BYTES(binary) \
62         (DVS_6AXIS_COORDS_ELEMS \
63         * DVS_NUM_BLOCKS_X((binary)->out_frame_info[0].res.width) \
64         * DVS_NUM_BLOCKS_Y((binary)->out_frame_info[0].res.height))
65
66 #ifndef ISP2401
67 /* Bilinear interpolation (HRT_GDC_BLI_MODE) is the supported method currently.
68  * Bicubic interpolation (HRT_GDC_BCI_MODE) is not supported yet */
69 #define DVS_GDC_INTERP_METHOD HRT_GDC_BLI_MODE
70
71 #endif
72 struct ia_css_dvs_6axis_config *
73 generate_dvs_6axis_table(const struct ia_css_resolution *frame_res, const struct ia_css_resolution *dvs_offset);
74
75 struct ia_css_dvs_6axis_config *
76 generate_dvs_6axis_table_from_config(struct ia_css_dvs_6axis_config  *dvs_config_src);
77
78 void
79 free_dvs_6axis_table(struct ia_css_dvs_6axis_config  **dvs_6axis_config);
80
81 void
82 copy_dvs_6axis_table(struct ia_css_dvs_6axis_config *dvs_config_dst,
83                          const struct ia_css_dvs_6axis_config *dvs_config_src);
84
85
86 #endif