1 // SPDX-License-Identifier: GPL-2.0
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
16 #include "gdc_device.h" /* gdc_lut_store(), ... */
17 #include "isp.h" /* ISP_VEC_ELEMBITS */
18 #include "vamem.h"
19 #if !defined(HAS_NO_HMEM)
20 #ifndef __INLINE_HMEM__
21 #define __INLINE_HMEM__
22 #endif
23 #include "hmem.h"
24 #endif /* !defined(HAS_NO_HMEM) */
25 #define IA_CSS_INCLUDE_PARAMETERS
26 #define IA_CSS_INCLUDE_ACC_PARAMETERS
27
28 #include "hmm.h"
29 #include "sh_css_params.h"
30 #include "ia_css_queue.h"
31 #include "sw_event_global.h" /* Event IDs */
32
33 #include "platform_support.h"
34 #include "assert_support.h"
35 #include "misc_support.h" /* NOT_USED */
36 #include "math_support.h" /* max(), min() EVEN_FLOOR()*/
37
38 #include "ia_css_stream.h"
39 #include "sh_css_params_internal.h"
40 #include "sh_css_param_shading.h"
41 #include "sh_css_param_dvs.h"
42 #include "ia_css_refcount.h"
43 #include "sh_css_internal.h"
44 #include "ia_css_control.h"
45 #include "ia_css_shading.h"
46 #include "sh_css_defs.h"
47 #include "sh_css_sp.h"
48 #include "ia_css_pipeline.h"
49 #include "ia_css_debug.h"
50
51 #include "ia_css_isp_param.h"
52 #include "ia_css_isp_params.h"
53 #include "ia_css_mipi.h"
54 #include "ia_css_morph.h"
55 #include "ia_css_host_data.h"
56 #include "ia_css_pipe.h"
57 #include "ia_css_pipe_binarydesc.h"
58
59 /* Include all kernel host interfaces for ISP1 */
60
61 #include "anr/anr_1.0/ia_css_anr.host.h"
62 #include "cnr/cnr_1.0/ia_css_cnr.host.h"
63 #include "csc/csc_1.0/ia_css_csc.host.h"
64 #include "de/de_1.0/ia_css_de.host.h"
65 #include "dp/dp_1.0/ia_css_dp.host.h"
66 #include "bnr/bnr_1.0/ia_css_bnr.host.h"
67 #include "dvs/dvs_1.0/ia_css_dvs.host.h"
68 #include "fpn/fpn_1.0/ia_css_fpn.host.h"
69 #include "gc/gc_1.0/ia_css_gc.host.h"
70 #include "macc/macc_1.0/ia_css_macc.host.h"
71 #include "ctc/ctc_1.0/ia_css_ctc.host.h"
72 #include "ob/ob_1.0/ia_css_ob.host.h"
73 #include "raw/raw_1.0/ia_css_raw.host.h"
74 #include "fixedbds/fixedbds_1.0/ia_css_fixedbds_param.h"
75 #include "s3a/s3a_1.0/ia_css_s3a.host.h"
76 #include "sc/sc_1.0/ia_css_sc.host.h"
77 #include "sdis/sdis_1.0/ia_css_sdis.host.h"
78 #include "tnr/tnr_1.0/ia_css_tnr.host.h"
79 #include "uds/uds_1.0/ia_css_uds_param.h"
80 #include "wb/wb_1.0/ia_css_wb.host.h"
81 #include "ynr/ynr_1.0/ia_css_ynr.host.h"
82 #include "xnr/xnr_1.0/ia_css_xnr.host.h"
83
84 /* Include additional kernel host interfaces for ISP2 */
85
86 #include "aa/aa_2/ia_css_aa2.host.h"
87 #include "anr/anr_2/ia_css_anr2.host.h"
88 #include "bh/bh_2/ia_css_bh.host.h"
89 #include "cnr/cnr_2/ia_css_cnr2.host.h"
90 #include "ctc/ctc1_5/ia_css_ctc1_5.host.h"
91 #include "de/de_2/ia_css_de2.host.h"
92 #include "gc/gc_2/ia_css_gc2.host.h"
93 #include "sdis/sdis_2/ia_css_sdis2.host.h"
94 #include "ynr/ynr_2/ia_css_ynr2.host.h"
95 #include "fc/fc_1.0/ia_css_formats.host.h"
96
97 #include "xnr/xnr_3.0/ia_css_xnr3.host.h"
98
99 #if defined(HAS_OUTPUT_SYSTEM)
100 #include <components/output_system/sc_output_system_1.0/host/output_system.host.h>
101 #endif
102
103 #include "sh_css_frac.h"
104 #include "ia_css_bufq.h"
105
106 #define FPNTBL_BYTES(binary) \
107 (sizeof(char) * (binary)->in_frame_info.res.height * \
108 (binary)->in_frame_info.padded_width)
109
110 #define ISP2400_SCTBL_BYTES(binary) \
111 (sizeof(unsigned short) * (binary)->sctbl_height * \
112 (binary)->sctbl_aligned_width_per_color * IA_CSS_SC_NUM_COLORS)
113
114 #define ISP2401_SCTBL_BYTES(binary) \
115 (sizeof(unsigned short) * max((binary)->sctbl_height, (binary)->sctbl_legacy_height) * \
116 /* height should be the larger height between new api and legacy api */ \
117 (binary)->sctbl_aligned_width_per_color * IA_CSS_SC_NUM_COLORS)
118
119 #define MORPH_PLANE_BYTES(binary) \
120 (SH_CSS_MORPH_TABLE_ELEM_BYTES * (binary)->morph_tbl_aligned_width * \
121 (binary)->morph_tbl_height)
122
123 /* We keep a second copy of the ptr struct for the SP to access.
124 Again, this would not be necessary on the chip. */
125 static ia_css_ptr sp_ddr_ptrs;
126
127 /* sp group address on DDR */
128 static ia_css_ptr xmem_sp_group_ptrs;
129
130 static ia_css_ptr xmem_sp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
131 [SH_CSS_MAX_STAGES];
132 static ia_css_ptr xmem_isp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
133 [SH_CSS_MAX_STAGES];
134
135 static ia_css_ptr default_gdc_lut;
136 static int interleaved_lut_temp[4][HRT_GDC_N];
137
138 /* END DO NOT MOVE INTO VIMALS_WORLD */
139
140 /* Digital Zoom lookup table. See documentation for more details about the
141 * contents of this table.
142 */
143 static const int zoom_table[4][HRT_GDC_N] = {
144 {
145 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
146 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
147 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
148 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
149 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
150 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
151 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
152 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
153 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
154 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
155 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
156 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
157 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
158 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
159 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
160 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
161 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
162 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
163 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
164 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
165 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
166 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
167 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
168 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
169 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
170 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
171 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
172 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
173 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
174 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
175 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
176 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
177 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
178 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
179 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
180 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
181 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
182 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
183 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
184 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
185 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
186 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
187 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
188 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
189 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
190 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
191 -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
192 -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
193 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
194 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
195 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
196 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
197 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
198 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
199 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
200 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
201 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
202 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
203 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
204 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
205 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
206 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
207 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
208 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
209 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
210 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
211 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
212 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
213 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
214 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
215 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
216 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
217 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
218 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
219 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
220 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
221 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
222 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
223 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
224 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
225 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
226 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
227 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
228 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
229 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
230 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
231 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
232 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
233 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
234 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
235 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
236 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
237 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
238 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
239 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
240 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
241 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
242 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
243 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
244 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
245 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
246 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
247 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
248 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
249 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
250 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
251 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
252 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
253 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
254 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
255 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
256 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
257 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
258 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
259 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
260 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
261 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
262 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
263 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
264 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
265 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
266 -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4, -7 << 4,
267 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
268 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
269 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
270 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
271 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
272 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4
273 },
274 {
275 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
276 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
277 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4,
278 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4,
279 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4,
280 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4,
281 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4,
282 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4,
283 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4,
284 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4,
285 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4,
286 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4,
287 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4,
288 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4,
289 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4,
290 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4,
291 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4,
292 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4,
293 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4,
294 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4,
295 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4,
296 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4,
297 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4,
298 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4,
299 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4,
300 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4,
301 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4,
302 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4,
303 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4,
304 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4,
305 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4,
306 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4,
307 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4,
308 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4,
309 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4,
310 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4,
311 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4,
312 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4,
313 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4,
314 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4,
315 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4,
316 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4,
317 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4,
318 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4,
319 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4,
320 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4,
321 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4,
322 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4,
323 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4,
324 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4,
325 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
326 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
327 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
328 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
329 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
330 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
331 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
332 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
333 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
334 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
335 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
336 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
337 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
338 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
339 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
340 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
341 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
342 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
343 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
344 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
345 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
346 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
347 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
348 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
349 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
350 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
351 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
352 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
353 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
354 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
355 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
356 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
357 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
358 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
359 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
360 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
361 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
362 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
363 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
364 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
365 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
366 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
367 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
368 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
369 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
370 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
371 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
372 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
373 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
374 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
375 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
376 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
377 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
378 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
379 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
380 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
381 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
382 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
383 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
384 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
385 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
386 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
387 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
388 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
389 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
390 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
391 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
392 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
393 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
394 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
395 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
396 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
397 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
398 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
399 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
400 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
401 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
402 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4
403 },
404 {
405 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4,
406 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4, 256 << 4,
407 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
408 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
409 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
410 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4, 255 << 4,
411 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
412 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4, 254 << 4,
413 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
414 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4, 253 << 4,
415 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
416 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4, 252 << 4,
417 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
418 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4, 250 << 4,
419 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
420 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4, 248 << 4,
421 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
422 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4, 246 << 4,
423 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
424 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4, 244 << 4,
425 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
426 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4, 241 << 4,
427 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
428 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4, 239 << 4,
429 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
430 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4, 236 << 4,
431 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
432 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4, 232 << 4,
433 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
434 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4, 229 << 4,
435 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
436 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4, 225 << 4,
437 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
438 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4, 222 << 4,
439 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
440 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4, 218 << 4,
441 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
442 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4, 213 << 4,
443 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
444 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4, 209 << 4,
445 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
446 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4, 205 << 4,
447 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
448 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4, 200 << 4,
449 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
450 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4, 195 << 4,
451 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
452 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4, 191 << 4,
453 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
454 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4, 186 << 4,
455 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
456 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4, 181 << 4,
457 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
458 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4, 176 << 4,
459 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
460 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4, 170 << 4,
461 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
462 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4, 165 << 4,
463 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
464 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4, 160 << 4,
465 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
466 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4, 154 << 4,
467 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
468 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4, 149 << 4,
469 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
470 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4, 144 << 4,
471 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
472 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4, 138 << 4,
473 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
474 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4, 132 << 4,
475 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
476 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4, 127 << 4,
477 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
478 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4, 121 << 4,
479 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
480 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4, 116 << 4,
481 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
482 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4, 110 << 4,
483 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
484 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4, 105 << 4,
485 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4,
486 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4, 99 << 4,
487 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4,
488 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4, 94 << 4,
489 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4,
490 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4, 88 << 4,
491 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4,
492 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4, 83 << 4,
493 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4,
494 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4, 78 << 4,
495 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4,
496 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4, 73 << 4,
497 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4,
498 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4, 67 << 4,
499 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4,
500 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4, 62 << 4,
501 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4,
502 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4, 58 << 4,
503 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4,
504 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4, 53 << 4,
505 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4,
506 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4, 48 << 4,
507 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4,
508 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4, 43 << 4,
509 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4,
510 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4, 39 << 4,
511 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4,
512 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4, 35 << 4,
513 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4,
514 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4, 31 << 4,
515 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4,
516 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4, 27 << 4,
517 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4,
518 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4, 23 << 4,
519 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4,
520 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4, 19 << 4,
521 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4,
522 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4, 16 << 4,
523 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4,
524 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4, 12 << 4,
525 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4,
526 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4, 9 << 4,
527 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4,
528 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4, 7 << 4,
529 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4,
530 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4, 4 << 4,
531 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4,
532 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4, 2 << 4
533 },
534 {
535 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
536 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
537 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
538 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
539 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
540 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
541 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
542 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
543 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
544 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
545 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
546 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
547 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
548 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
549 -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
550 -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4, -10 << 4,
551 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
552 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
553 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
554 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
555 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
556 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
557 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
558 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
559 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
560 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
561 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
562 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
563 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
564 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
565 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
566 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
567 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
568 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
569 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
570 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
571 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
572 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
573 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
574 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
575 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
576 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
577 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
578 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
579 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
580 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
581 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
582 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
583 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
584 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
585 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
586 -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4, -19 << 4,
587 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
588 -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4, -18 << 4,
589 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
590 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
591 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
592 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
593 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
594 -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4, -17 << 4,
595 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
596 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
597 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
598 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
599 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
600 -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4, -16 << 4,
601 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
602 -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4, -15 << 4,
603 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
604 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
605 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
606 -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4, -14 << 4,
607 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
608 -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4, -13 << 4,
609 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
610 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
611 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
612 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
613 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
614 -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4, -12 << 4,
615 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
616 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
617 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
618 -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4, -11 << 4,
619 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
620 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
621 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
622 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
623 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
624 -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4, -9 << 4,
625 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
626 -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4, -8 << 4,
627 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
628 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
629 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
630 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
631 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
632 -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4, -6 << 4,
633 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
634 -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4, -5 << 4,
635 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
636 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
637 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
638 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
639 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
640 -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4, -4 << 4,
641 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
642 -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4, -3 << 4,
643 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
644 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
645 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
646 -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4, -2 << 4,
647 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
648 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
649 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
650 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
651 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
652 -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4, -1 << 4,
653 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
654 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
655 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4,
656 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4, 1 << 4,
657 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
658 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
659 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
660 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
661 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4,
662 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4, 0 << 4
663 }
664 };
665
666 static const struct ia_css_dz_config default_dz_config = {
667 HRT_GDC_N,
668 HRT_GDC_N,
669 {
670 \
671 {0, 0}, \
672 {0, 0}, \
673 }
674 };
675
676 static const struct ia_css_vector default_motion_config = {
677 0,
678 0
679 };
680
681 /* ------ deprecated(bz675) : from ------ */
682 static const struct ia_css_shading_settings default_shading_settings = {
683 1 /* enable shading table conversion in the css
684 (This matches the legacy way.) */
685 };
686
687 /* ------ deprecated(bz675) : to ------ */
688
689 struct ia_css_isp_skc_dvs_statistics {
690 ia_css_ptr p_data;
691 };
692
693 static int
694 ref_sh_css_ddr_address_map(
695 struct sh_css_ddr_address_map *map,
696 struct sh_css_ddr_address_map *out);
697
698 static int
699 write_ia_css_isp_parameter_set_info_to_ddr(
700 struct ia_css_isp_parameter_set_info *me,
701 ia_css_ptr *out);
702
703 static int
704 free_ia_css_isp_parameter_set_info(ia_css_ptr ptr);
705
706 static int
707 sh_css_params_write_to_ddr_internal(
708 struct ia_css_pipe *pipe,
709 unsigned int pipe_id,
710 struct ia_css_isp_parameters *params,
711 const struct ia_css_pipeline_stage *stage,
712 struct sh_css_ddr_address_map *ddr_map,
713 struct sh_css_ddr_address_map_size *ddr_map_size);
714
715 static int
716 sh_css_create_isp_params(struct ia_css_stream *stream,
717 struct ia_css_isp_parameters **isp_params_out);
718
719 static bool
720 sh_css_init_isp_params_from_global(struct ia_css_stream *stream,
721 struct ia_css_isp_parameters *params,
722 bool use_default_config,
723 struct ia_css_pipe *pipe_in);
724
725 static int
726 sh_css_init_isp_params_from_config(struct ia_css_pipe *pipe,
727 struct ia_css_isp_parameters *params,
728 const struct ia_css_isp_config *config,
729 struct ia_css_pipe *pipe_in);
730
731 static int
732 sh_css_set_global_isp_config_on_pipe(
733 struct ia_css_pipe *curr_pipe,
734 const struct ia_css_isp_config *config,
735 struct ia_css_pipe *pipe);
736
737 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
738 static int
739 sh_css_set_per_frame_isp_config_on_pipe(
740 struct ia_css_stream *stream,
741 const struct ia_css_isp_config *config,
742 struct ia_css_pipe *pipe);
743 #endif
744
745 static int
746 sh_css_update_uds_and_crop_info_based_on_zoom_region(
747 const struct ia_css_binary_info *info,
748 const struct ia_css_frame_info *in_frame_info,
749 const struct ia_css_frame_info *out_frame_info,
750 const struct ia_css_resolution *dvs_env,
751 const struct ia_css_dz_config *zoom,
752 const struct ia_css_vector *motion_vector,
753 struct sh_css_uds_info *uds, /* out */
754 struct sh_css_crop_pos *sp_out_crop_pos, /* out */
755 struct ia_css_resolution pipe_in_res,
756 bool enable_zoom);
757
758 ia_css_ptr
sh_css_params_ddr_address_map(void)759 sh_css_params_ddr_address_map(void)
760 {
761 return sp_ddr_ptrs;
762 }
763
764 /* ****************************************************
765 * Each coefficient is stored as 7bits to fit 2 of them into one
766 * ISP vector element, so we will store 4 coefficents on every
767 * memory word (32bits)
768 *
769 * 0: Coefficient 0 used bits
770 * 1: Coefficient 1 used bits
771 * 2: Coefficient 2 used bits
772 * 3: Coefficient 3 used bits
773 * x: not used
774 *
775 * xx33333332222222 | xx11111110000000
776 *
777 * ***************************************************
778 */
779 static struct ia_css_host_data *
convert_allocate_fpntbl(struct ia_css_isp_parameters * params)780 convert_allocate_fpntbl(struct ia_css_isp_parameters *params)
781 {
782 unsigned int i, j;
783 short *data_ptr;
784 struct ia_css_host_data *me;
785 unsigned int isp_format_data_size;
786 u32 *isp_format_data_ptr;
787
788 assert(params);
789
790 data_ptr = params->fpn_config.data;
791 isp_format_data_size = params->fpn_config.height * params->fpn_config.width *
792 sizeof(uint32_t);
793
794 me = ia_css_host_data_allocate(isp_format_data_size);
795
796 if (!me)
797 return NULL;
798
799 isp_format_data_ptr = (uint32_t *)me->address;
800
801 for (i = 0; i < params->fpn_config.height; i++) {
802 for (j = 0;
803 j < params->fpn_config.width;
804 j += 4, data_ptr += 4, isp_format_data_ptr++) {
805 int data = data_ptr[0] << 0 |
806 data_ptr[1] << 7 |
807 data_ptr[2] << 16 |
808 data_ptr[3] << 23;
809 *isp_format_data_ptr = data;
810 }
811 }
812 return me;
813 }
814
815 static int
store_fpntbl(struct ia_css_isp_parameters * params,ia_css_ptr ptr)816 store_fpntbl(struct ia_css_isp_parameters *params, ia_css_ptr ptr) {
817 struct ia_css_host_data *isp_data;
818
819 assert(params);
820 assert(ptr != mmgr_NULL);
821
822 isp_data = convert_allocate_fpntbl(params);
823 if (!isp_data)
824 {
825 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
826 return -ENOMEM;
827 }
828 ia_css_params_store_ia_css_host_data(ptr, isp_data);
829
830 ia_css_host_data_free(isp_data);
831 return 0;
832 }
833
834 static void
convert_raw_to_fpn(struct ia_css_isp_parameters * params)835 convert_raw_to_fpn(struct ia_css_isp_parameters *params)
836 {
837 int maxval = 0;
838 unsigned int i;
839
840 assert(params);
841
842 /* Find the maximum value in the table */
843 for (i = 0; i < params->fpn_config.height * params->fpn_config.width; i++) {
844 int val = params->fpn_config.data[i];
845 /* Make sure FPN value can be represented in 13-bit unsigned
846 * number (ISP precision - 1), but note that actual input range
847 * depends on precision of input frame data.
848 */
849 if (val < 0) {
850 /* Checkpatch patch */
851 val = 0;
852 } else if (val >= (1 << 13)) {
853 /* Checkpatch patch */
854 /* MW: BUG, is "13" a system or application property */
855 val = (1 << 13) - 1;
856 }
857 maxval = max(maxval, val);
858 }
859 /* Find the lowest shift value to remap the values in the range
860 * 0..maxval to 0..2^shiftval*63.
861 */
862 params->fpn_config.shift = 0;
863 while (maxval > 63) {
864 /* MW: BUG, is "63" a system or application property */
865 maxval >>= 1;
866 params->fpn_config.shift++;
867 }
868 /* Adjust the values in the table for the shift value */
869 for (i = 0; i < params->fpn_config.height * params->fpn_config.width; i++)
870 ((unsigned short *)params->fpn_config.data)[i] >>= params->fpn_config.shift;
871 }
872
873 static void
ia_css_process_kernel(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,void (* process)(unsigned int pipe_id,const struct ia_css_pipeline_stage * stage,struct ia_css_isp_parameters * params))874 ia_css_process_kernel(struct ia_css_stream *stream,
875 struct ia_css_isp_parameters *params,
876 void (*process)(unsigned int pipe_id,
877 const struct ia_css_pipeline_stage *stage,
878 struct ia_css_isp_parameters *params))
879 {
880 int i;
881
882 for (i = 0; i < stream->num_pipes; i++) {
883 struct ia_css_pipe *pipe = stream->pipes[i];
884 struct ia_css_pipeline *pipeline = ia_css_pipe_get_pipeline(pipe);
885 struct ia_css_pipeline_stage *stage;
886
887 /* update the other buffers to the pipe specific copies */
888 for (stage = pipeline->stages; stage; stage = stage->next) {
889 if (!stage || !stage->binary) continue;
890 process(pipeline->pipe_id, stage, params);
891 }
892 }
893 }
894
895 static int
sh_css_select_dp_10bpp_config(const struct ia_css_pipe * pipe,bool * is_dp_10bpp)896 sh_css_select_dp_10bpp_config(const struct ia_css_pipe *pipe,
897 bool *is_dp_10bpp) {
898 int err = 0;
899 /* Currently we check if 10bpp DPC configuration is required based
900 * on the use case,i.e. if BDS and DPC is both enabled. The more cleaner
901 * design choice would be to expose the type of DPC (either 10bpp or 13bpp)
902 * using the binary info, but the current control flow does not allow this
903 * implementation. (This is because the configuration is set before a
904 * binary is selected, and the binary info is not available)
905 */
906 if ((!pipe) || (!is_dp_10bpp))
907 {
908 IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
909 err = -EINVAL;
910 } else
911 {
912 *is_dp_10bpp = false;
913
914 /* check if DPC is enabled from the host */
915 if (pipe->config.enable_dpc) {
916 /*check if BDS is enabled*/
917 unsigned int required_bds_factor = SH_CSS_BDS_FACTOR_1_00;
918
919 if ((pipe->config.bayer_ds_out_res.width != 0) &&
920 (pipe->config.bayer_ds_out_res.height != 0)) {
921 if (0 == binarydesc_calculate_bds_factor(
922 pipe->config.input_effective_res,
923 pipe->config.bayer_ds_out_res,
924 &required_bds_factor)) {
925 if (required_bds_factor != SH_CSS_BDS_FACTOR_1_00) {
926 /*we use 10bpp BDS configuration*/
927 *is_dp_10bpp = true;
928 }
929 }
930 }
931 }
932 }
933
934 return err;
935 }
936
937 int
sh_css_set_black_frame(struct ia_css_stream * stream,const struct ia_css_frame * raw_black_frame)938 sh_css_set_black_frame(struct ia_css_stream *stream,
939 const struct ia_css_frame *raw_black_frame) {
940 struct ia_css_isp_parameters *params;
941 /* this function desperately needs to be moved to the ISP or SP such
942 * that it can use the DMA.
943 */
944 unsigned int height, width, y, x, k, data;
945 ia_css_ptr ptr;
946
947 assert(stream);
948 assert(raw_black_frame);
949
950 params = stream->isp_params_configs;
951 height = raw_black_frame->info.res.height;
952 width = raw_black_frame->info.padded_width,
953
954 ptr = raw_black_frame->data
955 + raw_black_frame->planes.raw.offset;
956
957 IA_CSS_ENTER_PRIVATE("black_frame=%p", raw_black_frame);
958
959 if (params->fpn_config.data &&
960 (params->fpn_config.width != width || params->fpn_config.height != height))
961 {
962 kvfree(params->fpn_config.data);
963 params->fpn_config.data = NULL;
964 }
965 if (!params->fpn_config.data)
966 {
967 params->fpn_config.data = kvmalloc(height * width *
968 sizeof(short), GFP_KERNEL);
969 if (!params->fpn_config.data) {
970 IA_CSS_ERROR("out of memory");
971 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
972 return -ENOMEM;
973 }
974 params->fpn_config.width = width;
975 params->fpn_config.height = height;
976 params->fpn_config.shift = 0;
977 }
978
979 /* store raw to fpntbl */
980 for (y = 0; y < height; y++)
981 {
982 for (x = 0; x < width; x += (ISP_VEC_NELEMS * 2)) {
983 int ofs = y * width + x;
984
985 for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
986 hmm_load(ptr, (void *)(&data), sizeof(int));
987 params->fpn_config.data[ofs + 2 * k] =
988 (short)(data & 0xFFFF);
989 params->fpn_config.data[ofs + 2 * k + 2] =
990 (short)((data >> 16) & 0xFFFF);
991 ptr += sizeof(int); /* byte system address */
992 }
993 for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
994 hmm_load(ptr, (void *)(&data), sizeof(int));
995 params->fpn_config.data[ofs + 2 * k + 1] =
996 (short)(data & 0xFFFF);
997 params->fpn_config.data[ofs + 2 * k + 3] =
998 (short)((data >> 16) & 0xFFFF);
999 ptr += sizeof(int); /* byte system address */
1000 }
1001 }
1002 }
1003
1004 /* raw -> fpn */
1005 convert_raw_to_fpn(params);
1006
1007 /* overwrite isp parameter */
1008 ia_css_process_kernel(stream, params, ia_css_kernel_process_param[IA_CSS_FPN_ID]);
1009
1010 IA_CSS_LEAVE_ERR_PRIVATE(0);
1011
1012 return 0;
1013 }
1014
1015 bool
sh_css_params_set_binning_factor(struct ia_css_stream * stream,unsigned int binning_fact)1016 sh_css_params_set_binning_factor(struct ia_css_stream *stream,
1017 unsigned int binning_fact)
1018 {
1019 struct ia_css_isp_parameters *params;
1020
1021 IA_CSS_ENTER_PRIVATE("void");
1022 assert(stream);
1023
1024 params = stream->isp_params_configs;
1025
1026 if (params->sensor_binning != binning_fact) {
1027 params->sensor_binning = binning_fact;
1028 params->sc_table_changed = true;
1029 }
1030
1031 IA_CSS_LEAVE_PRIVATE("void");
1032
1033 return params->sc_table_changed;
1034 }
1035
1036 static void
sh_css_update_shading_table_status(struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params)1037 sh_css_update_shading_table_status(struct ia_css_pipe *pipe,
1038 struct ia_css_isp_parameters *params)
1039 {
1040 if (params && pipe && (pipe->pipe_num != params->sc_table_last_pipe_num)) {
1041 params->sc_table_dirty = true;
1042 params->sc_table_last_pipe_num = pipe->pipe_num;
1043 }
1044 }
1045
1046 static void
sh_css_set_shading_table(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,const struct ia_css_shading_table * table)1047 sh_css_set_shading_table(struct ia_css_stream *stream,
1048 struct ia_css_isp_parameters *params,
1049 const struct ia_css_shading_table *table)
1050 {
1051 IA_CSS_ENTER_PRIVATE("");
1052 if (!table)
1053 return;
1054 assert(stream);
1055
1056 if (!table->enable)
1057 table = NULL;
1058
1059 if ((table != params->sc_table) || params->sc_table_dirty) {
1060 params->sc_table = table;
1061 params->sc_table_changed = true;
1062 params->sc_table_dirty = false;
1063 /* Not very clean, this goes to sh_css.c to invalidate the
1064 * shading table for all pipes. Should replaced by a loop
1065 * and a pipe-specific call.
1066 */
1067 if (!params->output_frame)
1068 sh_css_invalidate_shading_tables(stream);
1069 }
1070
1071 IA_CSS_LEAVE_PRIVATE("void");
1072 }
1073
1074 void
ia_css_params_store_ia_css_host_data(ia_css_ptr ddr_addr,struct ia_css_host_data * data)1075 ia_css_params_store_ia_css_host_data(
1076 ia_css_ptr ddr_addr,
1077 struct ia_css_host_data *data)
1078 {
1079 assert(data);
1080 assert(data->address);
1081 assert(ddr_addr != mmgr_NULL);
1082
1083 IA_CSS_ENTER_PRIVATE("");
1084
1085 hmm_store(ddr_addr,
1086 (void *)(data->address),
1087 (size_t)data->size);
1088
1089 IA_CSS_LEAVE_PRIVATE("void");
1090 }
1091
1092 struct ia_css_host_data *
ia_css_params_alloc_convert_sctbl(const struct ia_css_pipeline_stage * stage,const struct ia_css_shading_table * shading_table)1093 ia_css_params_alloc_convert_sctbl(
1094 const struct ia_css_pipeline_stage *stage,
1095 const struct ia_css_shading_table *shading_table)
1096 {
1097 const struct ia_css_binary *binary = stage->binary;
1098 struct ia_css_host_data *sctbl;
1099 unsigned int i, j, aligned_width;
1100 unsigned int sctbl_size;
1101 short int *ptr;
1102
1103 assert(binary);
1104 assert(shading_table);
1105
1106 IA_CSS_ENTER_PRIVATE("");
1107
1108 if (!shading_table) {
1109 IA_CSS_LEAVE_PRIVATE("void");
1110 return NULL;
1111 }
1112
1113 aligned_width = binary->sctbl_aligned_width_per_color;
1114 sctbl_size = shading_table->height * IA_CSS_SC_NUM_COLORS * aligned_width *
1115 sizeof(short);
1116
1117 sctbl = ia_css_host_data_allocate((size_t)sctbl_size);
1118
1119 if (!sctbl)
1120 return NULL;
1121 ptr = (short int *)sctbl->address;
1122 memset(ptr,
1123 0,
1124 sctbl_size);
1125
1126 for (i = 0; i < shading_table->height; i++) {
1127 for (j = 0; j < IA_CSS_SC_NUM_COLORS; j++) {
1128 memcpy(ptr,
1129 &shading_table->data[j]
1130 [i * shading_table->width],
1131 shading_table->width * sizeof(short));
1132 ptr += aligned_width;
1133 }
1134 }
1135
1136 IA_CSS_LEAVE_PRIVATE("void");
1137 return sctbl;
1138 }
1139
ia_css_params_store_sctbl(const struct ia_css_pipeline_stage * stage,ia_css_ptr sc_tbl,const struct ia_css_shading_table * sc_config)1140 int ia_css_params_store_sctbl(
1141 const struct ia_css_pipeline_stage *stage,
1142 ia_css_ptr sc_tbl,
1143 const struct ia_css_shading_table *sc_config)
1144 {
1145 struct ia_css_host_data *isp_sc_tbl;
1146
1147 IA_CSS_ENTER_PRIVATE("");
1148
1149 if (!sc_config) {
1150 IA_CSS_LEAVE_PRIVATE("void");
1151 return 0;
1152 }
1153
1154 isp_sc_tbl = ia_css_params_alloc_convert_sctbl(stage, sc_config);
1155 if (!isp_sc_tbl) {
1156 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
1157 return -ENOMEM;
1158 }
1159 /* store the shading table to ddr */
1160 ia_css_params_store_ia_css_host_data(sc_tbl, isp_sc_tbl);
1161 ia_css_host_data_free(isp_sc_tbl);
1162
1163 IA_CSS_LEAVE_PRIVATE("void");
1164
1165 return 0;
1166 }
1167
1168 static void
sh_css_enable_pipeline(const struct ia_css_binary * binary)1169 sh_css_enable_pipeline(const struct ia_css_binary *binary)
1170 {
1171 if (!binary)
1172 return;
1173
1174 IA_CSS_ENTER_PRIVATE("");
1175
1176 ia_css_isp_param_enable_pipeline(&binary->mem_params);
1177
1178 IA_CSS_LEAVE_PRIVATE("void");
1179 }
1180
1181 static int
ia_css_process_zoom_and_motion(struct ia_css_isp_parameters * params,const struct ia_css_pipeline_stage * first_stage)1182 ia_css_process_zoom_and_motion(
1183 struct ia_css_isp_parameters *params,
1184 const struct ia_css_pipeline_stage *first_stage) {
1185 /* first_stage can be NULL */
1186 const struct ia_css_pipeline_stage *stage;
1187 int err = 0;
1188 struct ia_css_resolution pipe_in_res;
1189
1190 pipe_in_res.width = 0;
1191 pipe_in_res.height = 0;
1192
1193 assert(params);
1194
1195 IA_CSS_ENTER_PRIVATE("");
1196
1197 /* Go through all stages to udate uds and cropping */
1198 for (stage = first_stage; stage; stage = stage->next)
1199 {
1200 struct ia_css_binary *binary;
1201 /* note: the var below is made static as it is quite large;
1202 if it is not static it ends up on the stack which could
1203 cause issues for drivers
1204 */
1205 static struct ia_css_binary tmp_binary;
1206
1207 const struct ia_css_binary_xinfo *info = NULL;
1208
1209 binary = stage->binary;
1210 if (binary) {
1211 info = binary->info;
1212 } else {
1213 const struct sh_css_binary_args *args = &stage->args;
1214 const struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS] = {NULL};
1215
1216 if (args->out_frame[0])
1217 out_infos[0] = &args->out_frame[0]->info;
1218 info = &stage->firmware->info.isp;
1219 ia_css_binary_fill_info(info, false, false,
1220 ATOMISP_INPUT_FORMAT_RAW_10,
1221 args->in_frame ? &args->in_frame->info : NULL,
1222 NULL,
1223 out_infos,
1224 args->out_vf_frame ? &args->out_vf_frame->info
1225 : NULL,
1226 &tmp_binary,
1227 NULL,
1228 -1, true);
1229 binary = &tmp_binary;
1230 binary->info = info;
1231 }
1232
1233 if (stage == first_stage) {
1234 /* we will use pipe_in_res to scale the zoom crop region if needed */
1235 pipe_in_res = binary->effective_in_frame_res;
1236 }
1237
1238 assert(stage->stage_num < SH_CSS_MAX_STAGES);
1239 if (params->dz_config.zoom_region.resolution.width == 0 &&
1240 params->dz_config.zoom_region.resolution.height == 0) {
1241 sh_css_update_uds_and_crop_info(
1242 &info->sp,
1243 &binary->in_frame_info,
1244 &binary->out_frame_info[0],
1245 &binary->dvs_envelope,
1246 ¶ms->dz_config,
1247 ¶ms->motion_config,
1248 ¶ms->uds[stage->stage_num].uds,
1249 ¶ms->uds[stage->stage_num].crop_pos,
1250 stage->enable_zoom);
1251 } else {
1252 err = sh_css_update_uds_and_crop_info_based_on_zoom_region(
1253 &info->sp,
1254 &binary->in_frame_info,
1255 &binary->out_frame_info[0],
1256 &binary->dvs_envelope,
1257 ¶ms->dz_config,
1258 ¶ms->motion_config,
1259 ¶ms->uds[stage->stage_num].uds,
1260 ¶ms->uds[stage->stage_num].crop_pos,
1261 pipe_in_res,
1262 stage->enable_zoom);
1263 if (err)
1264 return err;
1265 }
1266 }
1267 params->isp_params_changed = true;
1268
1269 IA_CSS_LEAVE_PRIVATE("void");
1270 return err;
1271 }
1272
1273 static void
sh_css_set_gamma_table(struct ia_css_isp_parameters * params,const struct ia_css_gamma_table * table)1274 sh_css_set_gamma_table(struct ia_css_isp_parameters *params,
1275 const struct ia_css_gamma_table *table)
1276 {
1277 if (!table)
1278 return;
1279 IA_CSS_ENTER_PRIVATE("table=%p", table);
1280
1281 assert(params);
1282 params->gc_table = *table;
1283 params->config_changed[IA_CSS_GC_ID] = true;
1284
1285 IA_CSS_LEAVE_PRIVATE("void");
1286 }
1287
1288 static void
sh_css_get_gamma_table(const struct ia_css_isp_parameters * params,struct ia_css_gamma_table * table)1289 sh_css_get_gamma_table(const struct ia_css_isp_parameters *params,
1290 struct ia_css_gamma_table *table)
1291 {
1292 if (!table)
1293 return;
1294 IA_CSS_ENTER_PRIVATE("table=%p", table);
1295
1296 assert(params);
1297 *table = params->gc_table;
1298
1299 IA_CSS_LEAVE_PRIVATE("void");
1300 }
1301
1302 static void
sh_css_set_ctc_table(struct ia_css_isp_parameters * params,const struct ia_css_ctc_table * table)1303 sh_css_set_ctc_table(struct ia_css_isp_parameters *params,
1304 const struct ia_css_ctc_table *table)
1305 {
1306 if (!table)
1307 return;
1308
1309 IA_CSS_ENTER_PRIVATE("table=%p", table);
1310
1311 assert(params);
1312 params->ctc_table = *table;
1313 params->config_changed[IA_CSS_CTC_ID] = true;
1314
1315 IA_CSS_LEAVE_PRIVATE("void");
1316 }
1317
1318 static void
sh_css_get_ctc_table(const struct ia_css_isp_parameters * params,struct ia_css_ctc_table * table)1319 sh_css_get_ctc_table(const struct ia_css_isp_parameters *params,
1320 struct ia_css_ctc_table *table)
1321 {
1322 if (!table)
1323 return;
1324
1325 IA_CSS_ENTER_PRIVATE("table=%p", table);
1326
1327 assert(params);
1328 *table = params->ctc_table;
1329
1330 IA_CSS_LEAVE_PRIVATE("void");
1331 }
1332
1333 static void
sh_css_set_macc_table(struct ia_css_isp_parameters * params,const struct ia_css_macc_table * table)1334 sh_css_set_macc_table(struct ia_css_isp_parameters *params,
1335 const struct ia_css_macc_table *table)
1336 {
1337 if (!table)
1338 return;
1339
1340 IA_CSS_ENTER_PRIVATE("table=%p", table);
1341
1342 assert(params);
1343 params->macc_table = *table;
1344 params->config_changed[IA_CSS_MACC_ID] = true;
1345
1346 IA_CSS_LEAVE_PRIVATE("void");
1347 }
1348
1349 static void
sh_css_get_macc_table(const struct ia_css_isp_parameters * params,struct ia_css_macc_table * table)1350 sh_css_get_macc_table(const struct ia_css_isp_parameters *params,
1351 struct ia_css_macc_table *table)
1352 {
1353 if (!table)
1354 return;
1355
1356 IA_CSS_ENTER_PRIVATE("table=%p", table);
1357
1358 assert(params);
1359 *table = params->macc_table;
1360
1361 IA_CSS_LEAVE_PRIVATE("void");
1362 }
1363
ia_css_morph_table_free(struct ia_css_morph_table * me)1364 void ia_css_morph_table_free(
1365 struct ia_css_morph_table *me)
1366 {
1367 unsigned int i;
1368
1369 if (!me)
1370 return;
1371
1372 IA_CSS_ENTER("");
1373
1374 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1375 if (me->coordinates_x[i]) {
1376 kvfree(me->coordinates_x[i]);
1377 me->coordinates_x[i] = NULL;
1378 }
1379 if (me->coordinates_y[i]) {
1380 kvfree(me->coordinates_y[i]);
1381 me->coordinates_y[i] = NULL;
1382 }
1383 }
1384
1385 kvfree(me);
1386 IA_CSS_LEAVE("void");
1387 }
1388
ia_css_morph_table_allocate(unsigned int width,unsigned int height)1389 struct ia_css_morph_table *ia_css_morph_table_allocate(
1390 unsigned int width,
1391 unsigned int height)
1392 {
1393 unsigned int i;
1394 struct ia_css_morph_table *me;
1395
1396 IA_CSS_ENTER("");
1397
1398 me = kvmalloc(sizeof(*me), GFP_KERNEL);
1399 if (!me) {
1400 IA_CSS_ERROR("out of memory");
1401 return me;
1402 }
1403
1404 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1405 me->coordinates_x[i] = NULL;
1406 me->coordinates_y[i] = NULL;
1407 }
1408
1409 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1410 me->coordinates_x[i] = kvmalloc(height * width *
1411 sizeof(*me->coordinates_x[i]),
1412 GFP_KERNEL);
1413 me->coordinates_y[i] = kvmalloc(height * width *
1414 sizeof(*me->coordinates_y[i]),
1415 GFP_KERNEL);
1416
1417 if ((!me->coordinates_x[i]) ||
1418 (!me->coordinates_y[i])) {
1419 ia_css_morph_table_free(me);
1420 me = NULL;
1421 return me;
1422 }
1423 }
1424 me->width = width;
1425 me->height = height;
1426 IA_CSS_LEAVE("");
1427 return me;
1428 }
1429
sh_css_params_default_morph_table(struct ia_css_morph_table ** table,const struct ia_css_binary * binary)1430 static int sh_css_params_default_morph_table(
1431 struct ia_css_morph_table **table,
1432 const struct ia_css_binary *binary)
1433 {
1434 /* MW 2400 advanced requires different scaling */
1435 unsigned int i, j, k, step, width, height;
1436 short start_x[IA_CSS_MORPH_TABLE_NUM_PLANES] = { -8, 0, -8, 0, 0, -8 },
1437 start_y[IA_CSS_MORPH_TABLE_NUM_PLANES] = { 0, 0, -8, -8, -8, 0 };
1438 struct ia_css_morph_table *tab;
1439
1440 assert(table);
1441 assert(binary);
1442
1443 IA_CSS_ENTER_PRIVATE("");
1444
1445 step = (ISP_VEC_NELEMS / 16) * 128,
1446 width = binary->morph_tbl_width,
1447 height = binary->morph_tbl_height;
1448
1449 tab = ia_css_morph_table_allocate(width, height);
1450 if (!tab)
1451 return -ENOMEM;
1452
1453 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1454 short val_y = start_y[i];
1455
1456 for (j = 0; j < height; j++) {
1457 short val_x = start_x[i];
1458 unsigned short *x_ptr, *y_ptr;
1459
1460 x_ptr = &tab->coordinates_x[i][j * width];
1461 y_ptr = &tab->coordinates_y[i][j * width];
1462 for (k = 0; k < width;
1463 k++, x_ptr++, y_ptr++, val_x += (short)step) {
1464 if (k == 0)
1465 *x_ptr = 0;
1466 else if (k == width - 1)
1467 *x_ptr = val_x + 2 * start_x[i];
1468 else
1469 *x_ptr = val_x;
1470 if (j == 0)
1471 *y_ptr = 0;
1472 else
1473 *y_ptr = val_y;
1474 }
1475 val_y += (short)step;
1476 }
1477 }
1478 *table = tab;
1479
1480 IA_CSS_LEAVE_ERR_PRIVATE(0);
1481
1482 return 0;
1483 }
1484
1485 static void
sh_css_set_morph_table(struct ia_css_isp_parameters * params,const struct ia_css_morph_table * table)1486 sh_css_set_morph_table(struct ia_css_isp_parameters *params,
1487 const struct ia_css_morph_table *table)
1488 {
1489 if (!table)
1490 return;
1491
1492 IA_CSS_ENTER_PRIVATE("table=%p", table);
1493
1494 assert(params);
1495 if (table->enable == false)
1496 table = NULL;
1497 params->morph_table = table;
1498 params->morph_table_changed = true;
1499 IA_CSS_LEAVE_PRIVATE("void");
1500 }
1501
1502 void
ia_css_translate_3a_statistics(struct ia_css_3a_statistics * host_stats,const struct ia_css_isp_3a_statistics_map * isp_stats)1503 ia_css_translate_3a_statistics(
1504 struct ia_css_3a_statistics *host_stats,
1505 const struct ia_css_isp_3a_statistics_map *isp_stats)
1506 {
1507 IA_CSS_ENTER("");
1508 if (host_stats->grid.use_dmem) {
1509 IA_CSS_LOG("3A: DMEM");
1510 ia_css_s3a_dmem_decode(host_stats, isp_stats->dmem_stats);
1511 } else {
1512 IA_CSS_LOG("3A: VMEM");
1513 ia_css_s3a_vmem_decode(host_stats, isp_stats->vmem_stats_hi,
1514 isp_stats->vmem_stats_lo);
1515 }
1516 #if !defined(HAS_NO_HMEM)
1517 IA_CSS_LOG("3A: HMEM");
1518 ia_css_s3a_hmem_decode(host_stats, isp_stats->hmem_stats);
1519 #endif
1520
1521 IA_CSS_LEAVE("void");
1522 }
1523
1524 void
ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map * me)1525 ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map *me)
1526 {
1527 if (me) {
1528 if (me->data_allocated) {
1529 kvfree(me->data_ptr);
1530 me->data_ptr = NULL;
1531 me->data_allocated = false;
1532 }
1533 kvfree(me);
1534 }
1535 }
1536
1537 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)1538 ia_css_isp_3a_statistics_map_allocate(
1539 const struct ia_css_isp_3a_statistics *isp_stats,
1540 void *data_ptr)
1541 {
1542 struct ia_css_isp_3a_statistics_map *me;
1543 /* Windows compiler does not like adding sizes to a void *
1544 * so we use a local char * instead. */
1545 char *base_ptr;
1546
1547 me = kvmalloc(sizeof(*me), GFP_KERNEL);
1548 if (!me) {
1549 IA_CSS_LEAVE("cannot allocate memory");
1550 goto err;
1551 }
1552
1553 me->data_ptr = data_ptr;
1554 me->data_allocated = !data_ptr;
1555 if (!data_ptr) {
1556 me->data_ptr = kvmalloc(isp_stats->size, GFP_KERNEL);
1557 if (!me->data_ptr) {
1558 IA_CSS_LEAVE("cannot allocate memory");
1559 goto err;
1560 }
1561 }
1562 base_ptr = me->data_ptr;
1563
1564 me->size = isp_stats->size;
1565 /* GCC complains when we assign a char * to a void *, so these
1566 * casts are necessary unfortunately. */
1567 me->dmem_stats = (void *)base_ptr;
1568 me->vmem_stats_hi = (void *)(base_ptr + isp_stats->dmem_size);
1569 me->vmem_stats_lo = (void *)(base_ptr + isp_stats->dmem_size +
1570 isp_stats->vmem_size);
1571 me->hmem_stats = (void *)(base_ptr + isp_stats->dmem_size +
1572 2 * isp_stats->vmem_size);
1573
1574 IA_CSS_LEAVE("map=%p", me);
1575 return me;
1576
1577 err:
1578 if (me)
1579 kvfree(me);
1580 return NULL;
1581 }
1582
1583 int
ia_css_get_3a_statistics(struct ia_css_3a_statistics * host_stats,const struct ia_css_isp_3a_statistics * isp_stats)1584 ia_css_get_3a_statistics(struct ia_css_3a_statistics *host_stats,
1585 const struct ia_css_isp_3a_statistics *isp_stats) {
1586 struct ia_css_isp_3a_statistics_map *map;
1587 int ret = 0;
1588
1589 IA_CSS_ENTER("host_stats=%p, isp_stats=%p", host_stats, isp_stats);
1590
1591 assert(host_stats);
1592 assert(isp_stats);
1593
1594 map = ia_css_isp_3a_statistics_map_allocate(isp_stats, NULL);
1595 if (map)
1596 {
1597 hmm_load(isp_stats->data_ptr, map->data_ptr, isp_stats->size);
1598 ia_css_translate_3a_statistics(host_stats, map);
1599 ia_css_isp_3a_statistics_map_free(map);
1600 } else
1601 {
1602 IA_CSS_ERROR("out of memory");
1603 ret = -ENOMEM;
1604 }
1605
1606 IA_CSS_LEAVE_ERR(ret);
1607 return ret;
1608 }
1609
1610 /* Parameter encoding is not yet orthogonal.
1611 This function hnadles some of the exceptions.
1612 */
1613 static void
ia_css_set_param_exceptions(const struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params)1614 ia_css_set_param_exceptions(const struct ia_css_pipe *pipe,
1615 struct ia_css_isp_parameters *params)
1616 {
1617 assert(params);
1618
1619 /* Copy also to DP. Should be done by the driver. */
1620 params->dp_config.gr = params->wb_config.gr;
1621 params->dp_config.r = params->wb_config.r;
1622 params->dp_config.b = params->wb_config.b;
1623 params->dp_config.gb = params->wb_config.gb;
1624
1625 if (IS_ISP2401) {
1626 assert(pipe);
1627 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1628
1629 if (pipe->mode < IA_CSS_PIPE_ID_NUM) {
1630 params->pipe_dp_config[pipe->mode].gr = params->wb_config.gr;
1631 params->pipe_dp_config[pipe->mode].r = params->wb_config.r;
1632 params->pipe_dp_config[pipe->mode].b = params->wb_config.b;
1633 params->pipe_dp_config[pipe->mode].gb = params->wb_config.gb;
1634 }
1635 }
1636 }
1637
1638 /* ISP2401 */
1639 static void
sh_css_set_dp_config(const struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params,const struct ia_css_dp_config * config)1640 sh_css_set_dp_config(const struct ia_css_pipe *pipe,
1641 struct ia_css_isp_parameters *params,
1642 const struct ia_css_dp_config *config)
1643 {
1644 if (!config)
1645 return;
1646
1647 assert(params);
1648 assert(pipe);
1649 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1650
1651 IA_CSS_ENTER_PRIVATE("config=%p", config);
1652 ia_css_dp_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1653 if (pipe->mode < IA_CSS_PIPE_ID_NUM) {
1654 params->pipe_dp_config[pipe->mode] = *config;
1655 params->pipe_dpc_config_changed[pipe->mode] = true;
1656 }
1657 IA_CSS_LEAVE_PRIVATE("void");
1658 }
1659
1660 static void
sh_css_get_dp_config(const struct ia_css_pipe * pipe,const struct ia_css_isp_parameters * params,struct ia_css_dp_config * config)1661 sh_css_get_dp_config(const struct ia_css_pipe *pipe,
1662 const struct ia_css_isp_parameters *params,
1663 struct ia_css_dp_config *config)
1664 {
1665 if (!config)
1666 return;
1667
1668 assert(params);
1669 assert(pipe);
1670 IA_CSS_ENTER_PRIVATE("config=%p", config);
1671
1672 *config = params->pipe_dp_config[pipe->mode];
1673
1674 IA_CSS_LEAVE_PRIVATE("void");
1675 }
1676
1677 static void
sh_css_set_nr_config(struct ia_css_isp_parameters * params,const struct ia_css_nr_config * config)1678 sh_css_set_nr_config(struct ia_css_isp_parameters *params,
1679 const struct ia_css_nr_config *config)
1680 {
1681 if (!config)
1682 return;
1683 assert(params);
1684
1685 IA_CSS_ENTER_PRIVATE("config=%p", config);
1686
1687 ia_css_nr_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1688 params->nr_config = *config;
1689 params->yee_config.nr = *config;
1690 params->config_changed[IA_CSS_NR_ID] = true;
1691 params->config_changed[IA_CSS_YEE_ID] = true;
1692 params->config_changed[IA_CSS_BNR_ID] = true;
1693
1694 IA_CSS_LEAVE_PRIVATE("void");
1695 }
1696
1697 static void
sh_css_set_ee_config(struct ia_css_isp_parameters * params,const struct ia_css_ee_config * config)1698 sh_css_set_ee_config(struct ia_css_isp_parameters *params,
1699 const struct ia_css_ee_config *config)
1700 {
1701 if (!config)
1702 return;
1703 assert(params);
1704
1705 IA_CSS_ENTER_PRIVATE("config=%p", config);
1706 ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1707
1708 params->ee_config = *config;
1709 params->yee_config.ee = *config;
1710 params->config_changed[IA_CSS_YEE_ID] = true;
1711
1712 IA_CSS_LEAVE_PRIVATE("void");
1713 }
1714
1715 static void
sh_css_get_ee_config(const struct ia_css_isp_parameters * params,struct ia_css_ee_config * config)1716 sh_css_get_ee_config(const struct ia_css_isp_parameters *params,
1717 struct ia_css_ee_config *config)
1718 {
1719 if (!config)
1720 return;
1721
1722 IA_CSS_ENTER_PRIVATE("config=%p", config);
1723
1724 assert(params);
1725 *config = params->ee_config;
1726
1727 ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1728 IA_CSS_LEAVE_PRIVATE("void");
1729 }
1730
1731 static void
sh_css_set_pipe_dvs_6axis_config(const struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params,const struct ia_css_dvs_6axis_config * dvs_config)1732 sh_css_set_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
1733 struct ia_css_isp_parameters *params,
1734 const struct ia_css_dvs_6axis_config *dvs_config)
1735 {
1736 if (!dvs_config)
1737 return;
1738 assert(params);
1739 assert(pipe);
1740 assert(dvs_config->height_y == dvs_config->height_uv);
1741 assert((dvs_config->width_y - 1) == 2 * (dvs_config->width_uv - 1));
1742 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1743
1744 IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
1745
1746 copy_dvs_6axis_table(params->pipe_dvs_6axis_config[pipe->mode], dvs_config);
1747
1748 #if !defined(HAS_NO_DVS_6AXIS_CONFIG_UPDATE)
1749 params->pipe_dvs_6axis_config_changed[pipe->mode] = true;
1750 #endif
1751
1752 IA_CSS_LEAVE_PRIVATE("void");
1753 }
1754
1755 static void
sh_css_get_pipe_dvs_6axis_config(const struct ia_css_pipe * pipe,const struct ia_css_isp_parameters * params,struct ia_css_dvs_6axis_config * dvs_config)1756 sh_css_get_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
1757 const struct ia_css_isp_parameters *params,
1758 struct ia_css_dvs_6axis_config *dvs_config)
1759 {
1760 if (!dvs_config)
1761 return;
1762 assert(params);
1763 assert(pipe);
1764 assert(dvs_config->height_y == dvs_config->height_uv);
1765 assert((dvs_config->width_y - 1) == 2 * dvs_config->width_uv - 1);
1766
1767 IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
1768
1769 if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
1770 (dvs_config->width_y == params->pipe_dvs_6axis_config[pipe->mode]->width_y) &&
1771 (dvs_config->height_y == params->pipe_dvs_6axis_config[pipe->mode]->height_y) &&
1772 (dvs_config->width_uv == params->pipe_dvs_6axis_config[pipe->mode]->width_uv) &&
1773 (dvs_config->height_uv == params->pipe_dvs_6axis_config[pipe->mode]->height_uv)
1774 &&
1775 dvs_config->xcoords_y &&
1776 dvs_config->ycoords_y &&
1777 dvs_config->xcoords_uv &&
1778 dvs_config->ycoords_uv) {
1779 copy_dvs_6axis_table(dvs_config, params->pipe_dvs_6axis_config[pipe->mode]);
1780 }
1781
1782 IA_CSS_LEAVE_PRIVATE("void");
1783 }
1784
1785 static void
sh_css_set_baa_config(struct ia_css_isp_parameters * params,const struct ia_css_aa_config * config)1786 sh_css_set_baa_config(struct ia_css_isp_parameters *params,
1787 const struct ia_css_aa_config *config)
1788 {
1789 if (!config)
1790 return;
1791 assert(params);
1792
1793 IA_CSS_ENTER_PRIVATE("config=%p", config);
1794
1795 params->bds_config = *config;
1796 params->config_changed[IA_CSS_BDS_ID] = true;
1797
1798 IA_CSS_LEAVE_PRIVATE("void");
1799 }
1800
1801 static void
sh_css_get_baa_config(const struct ia_css_isp_parameters * params,struct ia_css_aa_config * config)1802 sh_css_get_baa_config(const struct ia_css_isp_parameters *params,
1803 struct ia_css_aa_config *config)
1804 {
1805 if (!config)
1806 return;
1807 assert(params);
1808
1809 IA_CSS_ENTER_PRIVATE("config=%p", config);
1810
1811 *config = params->bds_config;
1812
1813 IA_CSS_LEAVE_PRIVATE("void");
1814 }
1815
1816 static void
sh_css_set_dz_config(struct ia_css_isp_parameters * params,const struct ia_css_dz_config * config)1817 sh_css_set_dz_config(struct ia_css_isp_parameters *params,
1818 const struct ia_css_dz_config *config)
1819 {
1820 if (!config)
1821 return;
1822 assert(params);
1823
1824 IA_CSS_ENTER_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
1825
1826 assert(config->dx <= HRT_GDC_N);
1827 assert(config->dy <= HRT_GDC_N);
1828
1829 params->dz_config = *config;
1830 params->dz_config_changed = true;
1831 /* JK: Why isp params changed?? */
1832 params->isp_params_changed = true;
1833
1834 IA_CSS_LEAVE_PRIVATE("void");
1835 }
1836
1837 static void
sh_css_get_dz_config(const struct ia_css_isp_parameters * params,struct ia_css_dz_config * config)1838 sh_css_get_dz_config(const struct ia_css_isp_parameters *params,
1839 struct ia_css_dz_config *config)
1840 {
1841 if (!config)
1842 return;
1843 assert(params);
1844
1845 IA_CSS_ENTER_PRIVATE("config=%p", config);
1846
1847 *config = params->dz_config;
1848
1849 IA_CSS_LEAVE_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
1850 }
1851
1852 static void
sh_css_set_motion_vector(struct ia_css_isp_parameters * params,const struct ia_css_vector * motion)1853 sh_css_set_motion_vector(struct ia_css_isp_parameters *params,
1854 const struct ia_css_vector *motion)
1855 {
1856 if (!motion)
1857 return;
1858 assert(params);
1859
1860 IA_CSS_ENTER_PRIVATE("x=%d, y=%d", motion->x, motion->y);
1861
1862 params->motion_config = *motion;
1863 /* JK: Why do isp params change? */
1864 params->motion_config_changed = true;
1865 params->isp_params_changed = true;
1866
1867 IA_CSS_LEAVE_PRIVATE("void");
1868 }
1869
1870 static void
sh_css_get_motion_vector(const struct ia_css_isp_parameters * params,struct ia_css_vector * motion)1871 sh_css_get_motion_vector(const struct ia_css_isp_parameters *params,
1872 struct ia_css_vector *motion)
1873 {
1874 if (!motion)
1875 return;
1876 assert(params);
1877
1878 IA_CSS_ENTER_PRIVATE("motion=%p", motion);
1879
1880 *motion = params->motion_config;
1881
1882 IA_CSS_LEAVE_PRIVATE("x=%d, y=%d", motion->x, motion->y);
1883 }
1884
1885 struct ia_css_isp_config *
sh_css_pipe_isp_config_get(struct ia_css_pipe * pipe)1886 sh_css_pipe_isp_config_get(struct ia_css_pipe *pipe)
1887 {
1888 if (!pipe) {
1889 IA_CSS_ERROR("pipe=%p", NULL);
1890 return NULL;
1891 }
1892 return pipe->config.p_isp_config;
1893 }
1894
1895 int
ia_css_stream_set_isp_config(struct ia_css_stream * stream,const struct ia_css_isp_config * config)1896 ia_css_stream_set_isp_config(
1897 struct ia_css_stream *stream,
1898 const struct ia_css_isp_config *config) {
1899 return ia_css_stream_set_isp_config_on_pipe(stream, config, NULL);
1900 }
1901
1902 int
ia_css_stream_set_isp_config_on_pipe(struct ia_css_stream * stream,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)1903 ia_css_stream_set_isp_config_on_pipe(
1904 struct ia_css_stream *stream,
1905 const struct ia_css_isp_config *config,
1906 struct ia_css_pipe *pipe) {
1907 int err = 0;
1908
1909 if ((!stream) || (!config))
1910 return -EINVAL;
1911
1912 IA_CSS_ENTER("stream=%p, config=%p, pipe=%p", stream, config, pipe);
1913
1914 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1915 if (config->output_frame)
1916 err = sh_css_set_per_frame_isp_config_on_pipe(stream, config, pipe);
1917 else
1918 #endif
1919 err = sh_css_set_global_isp_config_on_pipe(stream->pipes[0], config, pipe);
1920
1921 IA_CSS_LEAVE_ERR(err);
1922 return err;
1923 }
1924
1925 int
ia_css_pipe_set_isp_config(struct ia_css_pipe * pipe,struct ia_css_isp_config * config)1926 ia_css_pipe_set_isp_config(struct ia_css_pipe *pipe,
1927 struct ia_css_isp_config *config) {
1928 struct ia_css_pipe *pipe_in = pipe;
1929 int err = 0;
1930
1931 IA_CSS_ENTER("pipe=%p", pipe);
1932
1933 if ((!pipe) || (!pipe->stream))
1934 return -EINVAL;
1935
1936 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "config=%p\n", config);
1937
1938 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1939 if (config->output_frame)
1940 err = sh_css_set_per_frame_isp_config_on_pipe(pipe->stream, config, pipe);
1941 else
1942 #endif
1943 err = sh_css_set_global_isp_config_on_pipe(pipe, config, pipe_in);
1944 IA_CSS_LEAVE_ERR(err);
1945 return err;
1946 }
1947
1948 static int
sh_css_set_global_isp_config_on_pipe(struct ia_css_pipe * curr_pipe,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)1949 sh_css_set_global_isp_config_on_pipe(
1950 struct ia_css_pipe *curr_pipe,
1951 const struct ia_css_isp_config *config,
1952 struct ia_css_pipe *pipe) {
1953 int err = 0;
1954 int err1 = 0;
1955 int err2 = 0;
1956
1957 IA_CSS_ENTER_PRIVATE("stream=%p, config=%p, pipe=%p", curr_pipe, config, pipe);
1958
1959 err1 = sh_css_init_isp_params_from_config(curr_pipe, curr_pipe->stream->isp_params_configs, config, pipe);
1960
1961 /* Now commit all changes to the SP */
1962 err2 = sh_css_param_update_isp_params(curr_pipe, curr_pipe->stream->isp_params_configs, sh_css_sp_is_running(), pipe);
1963
1964 /* The following code is intentional. The sh_css_init_isp_params_from_config interface
1965 * throws an error when both DPC and BDS is enabled. The CSS API must pass this error
1966 * information to the caller, ie. the host. We do not return this error immediately,
1967 * but instead continue with updating the ISP params to enable testing of features
1968 * which are currently in TR phase. */
1969
1970 err = (err1 != 0) ? err1 : ((err2 != 0) ? err2 : err);
1971
1972 IA_CSS_LEAVE_ERR_PRIVATE(err);
1973 return err;
1974 }
1975
1976 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1977 static int
sh_css_set_per_frame_isp_config_on_pipe(struct ia_css_stream * stream,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe)1978 sh_css_set_per_frame_isp_config_on_pipe(
1979 struct ia_css_stream *stream,
1980 const struct ia_css_isp_config *config,
1981 struct ia_css_pipe *pipe) {
1982 unsigned int i;
1983 bool per_frame_config_created = false;
1984 int err = 0;
1985 int err1 = 0;
1986 int err2 = 0;
1987 int err3 = 0;
1988
1989 struct sh_css_ddr_address_map *ddr_ptrs;
1990 struct sh_css_ddr_address_map_size *ddr_ptrs_size;
1991 struct ia_css_isp_parameters *params;
1992
1993 IA_CSS_ENTER_PRIVATE("stream=%p, config=%p, pipe=%p", stream, config, pipe);
1994
1995 if (!pipe)
1996 {
1997 err = -EINVAL;
1998 goto exit;
1999 }
2000
2001 /* create per-frame ISP params object with default values
2002 * from stream->isp_params_configs if one doesn't already exist
2003 */
2004 if (!stream->per_frame_isp_params_configs)
2005 {
2006 err = sh_css_create_isp_params(stream,
2007 &stream->per_frame_isp_params_configs);
2008 if (err)
2009 goto exit;
2010 per_frame_config_created = true;
2011 }
2012
2013 params = stream->per_frame_isp_params_configs;
2014
2015 /* update new ISP params object with the new config */
2016 if (!sh_css_init_isp_params_from_global(stream, params, false, pipe))
2017 {
2018 err1 = -EINVAL;
2019 }
2020
2021 err2 = sh_css_init_isp_params_from_config(stream->pipes[0], params, config, pipe);
2022
2023 if (per_frame_config_created)
2024 {
2025 ddr_ptrs = ¶ms->ddr_ptrs;
2026 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2027 /* create per pipe reference to general ddr_ptrs */
2028 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2029 ref_sh_css_ddr_address_map(ddr_ptrs, ¶ms->pipe_ddr_ptrs[i]);
2030 params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
2031 }
2032 }
2033
2034 /* now commit to ddr */
2035 err3 = sh_css_param_update_isp_params(stream->pipes[0], params, sh_css_sp_is_running(), pipe);
2036
2037 /* The following code is intentional. The sh_css_init_sp_params_from_config and
2038 * sh_css_init_isp_params_from_config throws an error when both DPC and BDS is enabled.
2039 * The CSS API must pass this error information to the caller, ie. the host.
2040 * We do not return this error immediately, but instead continue with updating the ISP params
2041 * to enable testing of features which are currently in TR phase. */
2042 err = (err1 != 0) ? err1 :
2043 (err2 != 0) ? err2 :
2044 (err3 != 0) ? err3 : err;
2045 exit:
2046 IA_CSS_LEAVE_ERR_PRIVATE(err);
2047 return err;
2048 }
2049 #endif
2050
2051 static int
sh_css_init_isp_params_from_config(struct ia_css_pipe * pipe,struct ia_css_isp_parameters * params,const struct ia_css_isp_config * config,struct ia_css_pipe * pipe_in)2052 sh_css_init_isp_params_from_config(struct ia_css_pipe *pipe,
2053 struct ia_css_isp_parameters *params,
2054 const struct ia_css_isp_config *config,
2055 struct ia_css_pipe *pipe_in) {
2056 int err = 0;
2057 bool is_dp_10bpp = true;
2058
2059 assert(pipe);
2060
2061 IA_CSS_ENTER_PRIVATE("pipe=%p, config=%p, params=%p", pipe, config, params);
2062
2063 ia_css_set_configs(params, config);
2064
2065 sh_css_set_nr_config(params, config->nr_config);
2066 sh_css_set_ee_config(params, config->ee_config);
2067 sh_css_set_baa_config(params, config->baa_config);
2068 if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
2069 (params->pipe_dvs_6axis_config[pipe->mode]))
2070 sh_css_set_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
2071 sh_css_set_dz_config(params, config->dz_config);
2072 sh_css_set_motion_vector(params, config->motion_vector);
2073 sh_css_update_shading_table_status(pipe_in, params);
2074 sh_css_set_shading_table(pipe->stream, params, config->shading_table);
2075 sh_css_set_morph_table(params, config->morph_table);
2076 sh_css_set_macc_table(params, config->macc_table);
2077 sh_css_set_gamma_table(params, config->gamma_table);
2078 sh_css_set_ctc_table(params, config->ctc_table);
2079 /* ------ deprecated(bz675) : from ------ */
2080 sh_css_set_shading_settings(params, config->shading_settings);
2081 /* ------ deprecated(bz675) : to ------ */
2082
2083 params->dis_coef_table_changed = (config->dvs_coefs);
2084 params->dvs2_coef_table_changed = (config->dvs2_coefs);
2085
2086 params->output_frame = config->output_frame;
2087 params->isp_parameters_id = config->isp_config_id;
2088
2089 /* Currently we do not offer CSS interface to set different
2090 * configurations for DPC, i.e. depending on DPC being enabled
2091 * before (NORM+OBC) or after. The folllowing code to set the
2092 * DPC configuration should be updated when this interface is made
2093 * available */
2094 if (IS_ISP2401) {
2095 sh_css_set_dp_config(pipe, params, config->dp_config);
2096 ia_css_set_param_exceptions(pipe, params);
2097 }
2098
2099 if (0 ==
2100 sh_css_select_dp_10bpp_config(pipe, &is_dp_10bpp))
2101 {
2102 /* return an error when both DPC and BDS is enabled by the
2103 * user. */
2104 /* we do not exit from this point immediately to allow internal
2105 * firmware feature testing. */
2106 if (is_dp_10bpp) {
2107 err = -EINVAL;
2108 }
2109 } else
2110 {
2111 err = -EINVAL;
2112 goto exit;
2113 }
2114
2115 if (!IS_ISP2401)
2116 ia_css_set_param_exceptions(pipe, params);
2117
2118 exit:
2119 IA_CSS_LEAVE_ERR_PRIVATE(err);
2120 return err;
2121 }
2122
2123 void
ia_css_stream_get_isp_config(const struct ia_css_stream * stream,struct ia_css_isp_config * config)2124 ia_css_stream_get_isp_config(
2125 const struct ia_css_stream *stream,
2126 struct ia_css_isp_config *config)
2127 {
2128 IA_CSS_ENTER("void");
2129 ia_css_pipe_get_isp_config(stream->pipes[0], config);
2130 IA_CSS_LEAVE("void");
2131 }
2132
2133 void
ia_css_pipe_get_isp_config(struct ia_css_pipe * pipe,struct ia_css_isp_config * config)2134 ia_css_pipe_get_isp_config(struct ia_css_pipe *pipe,
2135 struct ia_css_isp_config *config)
2136 {
2137 struct ia_css_isp_parameters *params = NULL;
2138
2139 assert(config);
2140
2141 IA_CSS_ENTER("config=%p", config);
2142
2143 params = pipe->stream->isp_params_configs;
2144 assert(params);
2145
2146 ia_css_get_configs(params, config);
2147
2148 sh_css_get_ee_config(params, config->ee_config);
2149 sh_css_get_baa_config(params, config->baa_config);
2150 sh_css_get_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
2151 sh_css_get_dp_config(pipe, params, config->dp_config);
2152 sh_css_get_macc_table(params, config->macc_table);
2153 sh_css_get_gamma_table(params, config->gamma_table);
2154 sh_css_get_ctc_table(params, config->ctc_table);
2155 sh_css_get_dz_config(params, config->dz_config);
2156 sh_css_get_motion_vector(params, config->motion_vector);
2157 /* ------ deprecated(bz675) : from ------ */
2158 sh_css_get_shading_settings(params, config->shading_settings);
2159 /* ------ deprecated(bz675) : to ------ */
2160
2161 config->output_frame = params->output_frame;
2162 config->isp_config_id = params->isp_parameters_id;
2163
2164 IA_CSS_LEAVE("void");
2165 }
2166
2167 /*
2168 * coding style says the return of "mmgr_NULL" is the error signal
2169 *
2170 * Deprecated: Implement mmgr_realloc()
2171 */
realloc_isp_css_mm_buf(ia_css_ptr * curr_buf,size_t * curr_size,size_t needed_size,bool force,int * err,uint16_t mmgr_attribute)2172 static bool realloc_isp_css_mm_buf(
2173 ia_css_ptr *curr_buf,
2174 size_t *curr_size,
2175 size_t needed_size,
2176 bool force,
2177 int *err,
2178 uint16_t mmgr_attribute)
2179 {
2180 s32 id;
2181
2182 *err = 0;
2183 /* Possible optimization: add a function sh_css_isp_css_mm_realloc()
2184 * and implement on top of hmm. */
2185
2186 IA_CSS_ENTER_PRIVATE("void");
2187
2188 if (!force && *curr_size >= needed_size) {
2189 IA_CSS_LEAVE_PRIVATE("false");
2190 return false;
2191 }
2192 /* don't reallocate if single ref to buffer and same size */
2193 if (*curr_size == needed_size && ia_css_refcount_is_single(*curr_buf)) {
2194 IA_CSS_LEAVE_PRIVATE("false");
2195 return false;
2196 }
2197
2198 id = IA_CSS_REFCOUNT_PARAM_BUFFER;
2199 ia_css_refcount_decrement(id, *curr_buf);
2200 *curr_buf = ia_css_refcount_increment(id, hmm_alloc(needed_size,
2201 HMM_BO_PRIVATE, 0,
2202 NULL,
2203 mmgr_attribute));
2204
2205 if (!*curr_buf) {
2206 *err = -ENOMEM;
2207 *curr_size = 0;
2208 } else {
2209 *curr_size = needed_size;
2210 }
2211 IA_CSS_LEAVE_PRIVATE("true");
2212 return true;
2213 }
2214
reallocate_buffer(ia_css_ptr * curr_buf,size_t * curr_size,size_t needed_size,bool force,int * err)2215 static bool reallocate_buffer(
2216 ia_css_ptr *curr_buf,
2217 size_t *curr_size,
2218 size_t needed_size,
2219 bool force,
2220 int *err)
2221 {
2222 bool ret;
2223
2224 IA_CSS_ENTER_PRIVATE("void");
2225
2226 ret = realloc_isp_css_mm_buf(curr_buf,
2227 curr_size, needed_size, force, err, 0);
2228
2229 IA_CSS_LEAVE_PRIVATE("ret=%d", ret);
2230 return ret;
2231 }
2232
2233 struct ia_css_isp_3a_statistics *
ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info * grid)2234 ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
2235 {
2236 struct ia_css_isp_3a_statistics *me;
2237
2238 IA_CSS_ENTER("grid=%p", grid);
2239
2240 assert(grid);
2241
2242 /* MW: Does "grid->enable" also control the histogram output ?? */
2243 if (!grid->enable)
2244 return NULL;
2245
2246 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
2247 if (!me)
2248 goto err;
2249
2250 if (grid->use_dmem) {
2251 me->dmem_size = sizeof(struct ia_css_3a_output) *
2252 grid->aligned_width *
2253 grid->aligned_height;
2254 } else {
2255 me->vmem_size = ISP_S3ATBL_HI_LO_STRIDE_BYTES *
2256 grid->aligned_height;
2257 }
2258 #if !defined(HAS_NO_HMEM)
2259 me->hmem_size = sizeof_hmem(HMEM0_ID);
2260 #endif
2261
2262 /* All subsections need to be aligned to the system bus width */
2263 me->dmem_size = CEIL_MUL(me->dmem_size, HIVE_ISP_DDR_WORD_BYTES);
2264 me->vmem_size = CEIL_MUL(me->vmem_size, HIVE_ISP_DDR_WORD_BYTES);
2265 me->hmem_size = CEIL_MUL(me->hmem_size, HIVE_ISP_DDR_WORD_BYTES);
2266
2267 me->size = me->dmem_size + me->vmem_size * 2 + me->hmem_size;
2268 me->data_ptr = hmm_alloc(me->size, HMM_BO_PRIVATE, 0, NULL, 0);
2269 if (me->data_ptr == mmgr_NULL) {
2270 kvfree(me);
2271 me = NULL;
2272 goto err;
2273 }
2274 if (me->dmem_size)
2275 me->data.dmem.s3a_tbl = me->data_ptr;
2276 if (me->vmem_size) {
2277 me->data.vmem.s3a_tbl_hi = me->data_ptr + me->dmem_size;
2278 me->data.vmem.s3a_tbl_lo = me->data_ptr + me->dmem_size + me->vmem_size;
2279 }
2280 if (me->hmem_size)
2281 me->data_hmem.rgby_tbl = me->data_ptr + me->dmem_size + 2 * me->vmem_size;
2282
2283 err:
2284 IA_CSS_LEAVE("return=%p", me);
2285 return me;
2286 }
2287
2288 void
ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics * me)2289 ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics *me)
2290 {
2291 if (me) {
2292 hmm_free(me->data_ptr);
2293 kvfree(me);
2294 }
2295 }
2296
ia_css_skc_dvs_statistics_allocate(void)2297 struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void)
2298 {
2299 return NULL;
2300 }
2301
2302 struct ia_css_metadata *
ia_css_metadata_allocate(const struct ia_css_metadata_info * metadata_info)2303 ia_css_metadata_allocate(const struct ia_css_metadata_info *metadata_info)
2304 {
2305 struct ia_css_metadata *md = NULL;
2306
2307 IA_CSS_ENTER("");
2308
2309 if (metadata_info->size == 0)
2310 return NULL;
2311
2312 md = kvmalloc(sizeof(*md), GFP_KERNEL);
2313 if (!md)
2314 goto error;
2315
2316 md->info = *metadata_info;
2317 md->exp_id = 0;
2318 md->address = hmm_alloc(metadata_info->size, HMM_BO_PRIVATE, 0, NULL, 0);
2319 if (md->address == mmgr_NULL)
2320 goto error;
2321
2322 IA_CSS_LEAVE("return=%p", md);
2323 return md;
2324
2325 error:
2326 ia_css_metadata_free(md);
2327 IA_CSS_LEAVE("return=%p", NULL);
2328 return NULL;
2329 }
2330
2331 void
ia_css_metadata_free(struct ia_css_metadata * me)2332 ia_css_metadata_free(struct ia_css_metadata *me)
2333 {
2334 if (me) {
2335 /* The enter and leave macros are placed inside
2336 * the condition to avoid false logging of metadata
2337 * free events when metadata is disabled.
2338 * We found this to be confusing during development
2339 * and debugging. */
2340 IA_CSS_ENTER("me=%p", me);
2341 hmm_free(me->address);
2342 kvfree(me);
2343 IA_CSS_LEAVE("void");
2344 }
2345 }
2346
2347 void
ia_css_metadata_free_multiple(unsigned int num_bufs,struct ia_css_metadata ** bufs)2348 ia_css_metadata_free_multiple(unsigned int num_bufs,
2349 struct ia_css_metadata **bufs)
2350 {
2351 unsigned int i;
2352
2353 if (bufs) {
2354 for (i = 0; i < num_bufs; i++)
2355 ia_css_metadata_free(bufs[i]);
2356 }
2357 }
2358
2359 static unsigned int g_param_buffer_dequeue_count;
2360 static unsigned int g_param_buffer_enqueue_count;
2361
2362 int
ia_css_stream_isp_parameters_init(struct ia_css_stream * stream)2363 ia_css_stream_isp_parameters_init(struct ia_css_stream *stream) {
2364 int err = 0;
2365 unsigned int i;
2366 struct sh_css_ddr_address_map *ddr_ptrs;
2367 struct sh_css_ddr_address_map_size *ddr_ptrs_size;
2368 struct ia_css_isp_parameters *params;
2369
2370 assert(stream);
2371 IA_CSS_ENTER_PRIVATE("void");
2372
2373 if (!stream)
2374 {
2375 IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
2376 return -EINVAL;
2377 }
2378 /* TMP: tracking of paramsets */
2379 g_param_buffer_dequeue_count = 0;
2380 g_param_buffer_enqueue_count = 0;
2381
2382 stream->per_frame_isp_params_configs = NULL;
2383 err = sh_css_create_isp_params(stream,
2384 &stream->isp_params_configs);
2385 if (err)
2386 goto ERR;
2387
2388 params = stream->isp_params_configs;
2389 if (!sh_css_init_isp_params_from_global(stream, params, true, NULL))
2390 {
2391 /* we do not return the error immediately to enable internal
2392 * firmware feature testing */
2393 err = -EINVAL;
2394 }
2395
2396 ddr_ptrs = ¶ms->ddr_ptrs;
2397 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2398
2399 /* create per pipe reference to general ddr_ptrs */
2400 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++)
2401 {
2402 ref_sh_css_ddr_address_map(ddr_ptrs, ¶ms->pipe_ddr_ptrs[i]);
2403 params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
2404 }
2405
2406 ERR:
2407 IA_CSS_LEAVE_ERR_PRIVATE(err);
2408 return err;
2409 }
2410
2411 static void
ia_css_set_sdis_config(struct ia_css_isp_parameters * params,const struct ia_css_dvs_coefficients * dvs_coefs)2412 ia_css_set_sdis_config(
2413 struct ia_css_isp_parameters *params,
2414 const struct ia_css_dvs_coefficients *dvs_coefs)
2415 {
2416 ia_css_set_sdis_horicoef_config(params, dvs_coefs);
2417 ia_css_set_sdis_vertcoef_config(params, dvs_coefs);
2418 ia_css_set_sdis_horiproj_config(params, dvs_coefs);
2419 ia_css_set_sdis_vertproj_config(params, dvs_coefs);
2420 }
2421
2422 static void
ia_css_set_sdis2_config(struct ia_css_isp_parameters * params,const struct ia_css_dvs2_coefficients * dvs2_coefs)2423 ia_css_set_sdis2_config(
2424 struct ia_css_isp_parameters *params,
2425 const struct ia_css_dvs2_coefficients *dvs2_coefs)
2426 {
2427 ia_css_set_sdis2_horicoef_config(params, dvs2_coefs);
2428 ia_css_set_sdis2_vertcoef_config(params, dvs2_coefs);
2429 ia_css_set_sdis2_horiproj_config(params, dvs2_coefs);
2430 ia_css_set_sdis2_vertproj_config(params, dvs2_coefs);
2431 }
2432
2433 static int
sh_css_create_isp_params(struct ia_css_stream * stream,struct ia_css_isp_parameters ** isp_params_out)2434 sh_css_create_isp_params(struct ia_css_stream *stream,
2435 struct ia_css_isp_parameters **isp_params_out) {
2436 bool succ = true;
2437 unsigned int i;
2438 struct sh_css_ddr_address_map *ddr_ptrs;
2439 struct sh_css_ddr_address_map_size *ddr_ptrs_size;
2440 int err = 0;
2441 size_t params_size;
2442 struct ia_css_isp_parameters *params =
2443 kvmalloc(sizeof(struct ia_css_isp_parameters), GFP_KERNEL);
2444
2445 if (!params)
2446 {
2447 *isp_params_out = NULL;
2448 err = -ENOMEM;
2449 IA_CSS_ERROR("%s:%d error: cannot allocate memory", __FILE__, __LINE__);
2450 IA_CSS_LEAVE_ERR_PRIVATE(err);
2451 return err;
2452 } else
2453 {
2454 memset(params, 0, sizeof(struct ia_css_isp_parameters));
2455 }
2456
2457 ddr_ptrs = ¶ms->ddr_ptrs;
2458 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2459
2460 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++)
2461 {
2462 memset(¶ms->pipe_ddr_ptrs[i], 0,
2463 sizeof(params->pipe_ddr_ptrs[i]));
2464 memset(¶ms->pipe_ddr_ptrs_size[i], 0,
2465 sizeof(params->pipe_ddr_ptrs_size[i]));
2466 }
2467
2468 memset(ddr_ptrs, 0, sizeof(*ddr_ptrs));
2469 memset(ddr_ptrs_size, 0, sizeof(*ddr_ptrs_size));
2470
2471 params_size = sizeof(params->uds);
2472 ddr_ptrs_size->isp_param = params_size;
2473 ddr_ptrs->isp_param =
2474 ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
2475 hmm_alloc(params_size, HMM_BO_PRIVATE, 0, NULL, 0));
2476 succ &= (ddr_ptrs->isp_param != mmgr_NULL);
2477
2478 ddr_ptrs_size->macc_tbl = sizeof(struct ia_css_macc_table);
2479 ddr_ptrs->macc_tbl =
2480 ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
2481 hmm_alloc(sizeof(struct ia_css_macc_table), HMM_BO_PRIVATE, 0, NULL, 0));
2482 succ &= (ddr_ptrs->macc_tbl != mmgr_NULL);
2483
2484 *isp_params_out = params;
2485 return err;
2486 }
2487
2488 static bool
sh_css_init_isp_params_from_global(struct ia_css_stream * stream,struct ia_css_isp_parameters * params,bool use_default_config,struct ia_css_pipe * pipe_in)2489 sh_css_init_isp_params_from_global(struct ia_css_stream *stream,
2490 struct ia_css_isp_parameters *params,
2491 bool use_default_config,
2492 struct ia_css_pipe *pipe_in)
2493 {
2494 bool retval = true;
2495 int i = 0;
2496 bool is_dp_10bpp = true;
2497 unsigned int isp_pipe_version = ia_css_pipe_get_isp_pipe_version(
2498 stream->pipes[0]);
2499 struct ia_css_isp_parameters *stream_params = stream->isp_params_configs;
2500
2501 if (!use_default_config && !stream_params) {
2502 retval = false;
2503 goto exit;
2504 }
2505
2506 params->output_frame = NULL;
2507 params->isp_parameters_id = 0;
2508
2509 if (use_default_config) {
2510 ia_css_set_xnr3_config(params, &default_xnr3_config);
2511
2512 sh_css_set_nr_config(params, &default_nr_config);
2513 sh_css_set_ee_config(params, &default_ee_config);
2514 if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
2515 sh_css_set_macc_table(params, &default_macc_table);
2516 else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
2517 sh_css_set_macc_table(params, &default_macc2_table);
2518 sh_css_set_gamma_table(params, &default_gamma_table);
2519 sh_css_set_ctc_table(params, &default_ctc_table);
2520 sh_css_set_baa_config(params, &default_baa_config);
2521 sh_css_set_dz_config(params, &default_dz_config);
2522 /* ------ deprecated(bz675) : from ------ */
2523 sh_css_set_shading_settings(params, &default_shading_settings);
2524 /* ------ deprecated(bz675) : to ------ */
2525
2526 ia_css_set_s3a_config(params, &default_3a_config);
2527 ia_css_set_wb_config(params, &default_wb_config);
2528 ia_css_set_csc_config(params, &default_cc_config);
2529 ia_css_set_tnr_config(params, &default_tnr_config);
2530 ia_css_set_ob_config(params, &default_ob_config);
2531 ia_css_set_dp_config(params, &default_dp_config);
2532
2533 if (!IS_ISP2401) {
2534 ia_css_set_param_exceptions(pipe_in, params);
2535 } else {
2536 for (i = 0; i < stream->num_pipes; i++) {
2537 if (sh_css_select_dp_10bpp_config(stream->pipes[i],
2538 &is_dp_10bpp) == 0) {
2539 /* set the return value as false if both DPC and
2540 * BDS is enabled by the user. But we do not return
2541 * the value immediately to enable internal firmware
2542 * feature testing. */
2543 if (is_dp_10bpp) {
2544 sh_css_set_dp_config(stream->pipes[i], params, &default_dp_10bpp_config);
2545 } else {
2546 sh_css_set_dp_config(stream->pipes[i], params, &default_dp_config);
2547 }
2548 } else {
2549 retval = false;
2550 goto exit;
2551 }
2552
2553 ia_css_set_param_exceptions(stream->pipes[i], params);
2554 }
2555 }
2556
2557 ia_css_set_de_config(params, &default_de_config);
2558 ia_css_set_gc_config(params, &default_gc_config);
2559 ia_css_set_anr_config(params, &default_anr_config);
2560 ia_css_set_anr2_config(params, &default_anr_thres);
2561 ia_css_set_ce_config(params, &default_ce_config);
2562 ia_css_set_xnr_table_config(params, &default_xnr_table);
2563 ia_css_set_ecd_config(params, &default_ecd_config);
2564 ia_css_set_ynr_config(params, &default_ynr_config);
2565 ia_css_set_fc_config(params, &default_fc_config);
2566 ia_css_set_cnr_config(params, &default_cnr_config);
2567 ia_css_set_macc_config(params, &default_macc_config);
2568 ia_css_set_ctc_config(params, &default_ctc_config);
2569 ia_css_set_aa_config(params, &default_aa_config);
2570 ia_css_set_r_gamma_config(params, &default_r_gamma_table);
2571 ia_css_set_g_gamma_config(params, &default_g_gamma_table);
2572 ia_css_set_b_gamma_config(params, &default_b_gamma_table);
2573 ia_css_set_yuv2rgb_config(params, &default_yuv2rgb_cc_config);
2574 ia_css_set_rgb2yuv_config(params, &default_rgb2yuv_cc_config);
2575 ia_css_set_xnr_config(params, &default_xnr_config);
2576 ia_css_set_sdis_config(params, &default_sdis_config);
2577 ia_css_set_sdis2_config(params, &default_sdis2_config);
2578 ia_css_set_formats_config(params, &default_formats_config);
2579
2580 params->fpn_config.data = NULL;
2581 params->config_changed[IA_CSS_FPN_ID] = true;
2582 params->fpn_config.enabled = 0;
2583
2584 params->motion_config = default_motion_config;
2585 params->motion_config_changed = true;
2586
2587 params->morph_table = NULL;
2588 params->morph_table_changed = true;
2589
2590 params->sc_table = NULL;
2591 params->sc_table_changed = true;
2592 params->sc_table_dirty = false;
2593 params->sc_table_last_pipe_num = 0;
2594
2595 ia_css_sdis2_clear_coefficients(¶ms->dvs2_coefs);
2596 params->dvs2_coef_table_changed = true;
2597
2598 ia_css_sdis_clear_coefficients(¶ms->dvs_coefs);
2599 params->dis_coef_table_changed = true;
2600 } else {
2601 ia_css_set_xnr3_config(params, &stream_params->xnr3_config);
2602
2603 sh_css_set_nr_config(params, &stream_params->nr_config);
2604 sh_css_set_ee_config(params, &stream_params->ee_config);
2605 if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
2606 sh_css_set_macc_table(params, &stream_params->macc_table);
2607 else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
2608 sh_css_set_macc_table(params, &stream_params->macc_table);
2609 sh_css_set_gamma_table(params, &stream_params->gc_table);
2610 sh_css_set_ctc_table(params, &stream_params->ctc_table);
2611 sh_css_set_baa_config(params, &stream_params->bds_config);
2612 sh_css_set_dz_config(params, &stream_params->dz_config);
2613 /* ------ deprecated(bz675) : from ------ */
2614 sh_css_set_shading_settings(params, &stream_params->shading_settings);
2615 /* ------ deprecated(bz675) : to ------ */
2616
2617 ia_css_set_s3a_config(params, &stream_params->s3a_config);
2618 ia_css_set_wb_config(params, &stream_params->wb_config);
2619 ia_css_set_csc_config(params, &stream_params->cc_config);
2620 ia_css_set_tnr_config(params, &stream_params->tnr_config);
2621 ia_css_set_ob_config(params, &stream_params->ob_config);
2622 ia_css_set_dp_config(params, &stream_params->dp_config);
2623 ia_css_set_de_config(params, &stream_params->de_config);
2624 ia_css_set_gc_config(params, &stream_params->gc_config);
2625 ia_css_set_anr_config(params, &stream_params->anr_config);
2626 ia_css_set_anr2_config(params, &stream_params->anr_thres);
2627 ia_css_set_ce_config(params, &stream_params->ce_config);
2628 ia_css_set_xnr_table_config(params, &stream_params->xnr_table);
2629 ia_css_set_ecd_config(params, &stream_params->ecd_config);
2630 ia_css_set_ynr_config(params, &stream_params->ynr_config);
2631 ia_css_set_fc_config(params, &stream_params->fc_config);
2632 ia_css_set_cnr_config(params, &stream_params->cnr_config);
2633 ia_css_set_macc_config(params, &stream_params->macc_config);
2634 ia_css_set_ctc_config(params, &stream_params->ctc_config);
2635 ia_css_set_aa_config(params, &stream_params->aa_config);
2636 ia_css_set_r_gamma_config(params, &stream_params->r_gamma_table);
2637 ia_css_set_g_gamma_config(params, &stream_params->g_gamma_table);
2638 ia_css_set_b_gamma_config(params, &stream_params->b_gamma_table);
2639 ia_css_set_yuv2rgb_config(params, &stream_params->yuv2rgb_cc_config);
2640 ia_css_set_rgb2yuv_config(params, &stream_params->rgb2yuv_cc_config);
2641 ia_css_set_xnr_config(params, &stream_params->xnr_config);
2642 ia_css_set_formats_config(params, &stream_params->formats_config);
2643
2644 for (i = 0; i < stream->num_pipes; i++) {
2645 if (0 ==
2646 sh_css_select_dp_10bpp_config(stream->pipes[i], &is_dp_10bpp)) {
2647 /* set the return value as false if both DPC and
2648 * BDS is enabled by the user. But we do not return
2649 * the value immediately to enable internal firmware
2650 * feature testing. */
2651
2652 if (is_dp_10bpp) {
2653 retval = false;
2654 /* FIXME: should it ignore this error? */
2655 }
2656 } else {
2657 retval = false;
2658 goto exit;
2659 }
2660 if (IS_ISP2401) {
2661 if (stream->pipes[i]->mode < IA_CSS_PIPE_ID_NUM) {
2662 sh_css_set_dp_config(stream->pipes[i], params,
2663 &stream_params->pipe_dp_config[stream->pipes[i]->mode]);
2664 ia_css_set_param_exceptions(stream->pipes[i], params);
2665 } else {
2666 retval = false;
2667 goto exit;
2668 }
2669 }
2670 }
2671
2672 if (!IS_ISP2401)
2673 ia_css_set_param_exceptions(pipe_in, params);
2674
2675 params->fpn_config.data = stream_params->fpn_config.data;
2676 params->config_changed[IA_CSS_FPN_ID] =
2677 stream_params->config_changed[IA_CSS_FPN_ID];
2678 params->fpn_config.enabled = stream_params->fpn_config.enabled;
2679
2680 sh_css_set_motion_vector(params, &stream_params->motion_config);
2681 sh_css_set_morph_table(params, stream_params->morph_table);
2682
2683 if (stream_params->sc_table) {
2684 sh_css_update_shading_table_status(pipe_in, params);
2685 sh_css_set_shading_table(stream, params, stream_params->sc_table);
2686 } else {
2687 params->sc_table = NULL;
2688 params->sc_table_changed = true;
2689 params->sc_table_dirty = false;
2690 params->sc_table_last_pipe_num = 0;
2691 }
2692
2693 /* Only IA_CSS_PIPE_ID_VIDEO & IA_CSS_PIPE_ID_CAPTURE will support dvs_6axis_config*/
2694 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2695 if (stream_params->pipe_dvs_6axis_config[i]) {
2696 if (params->pipe_dvs_6axis_config[i]) {
2697 copy_dvs_6axis_table(params->pipe_dvs_6axis_config[i],
2698 stream_params->pipe_dvs_6axis_config[i]);
2699 } else {
2700 params->pipe_dvs_6axis_config[i] =
2701 generate_dvs_6axis_table_from_config(stream_params->pipe_dvs_6axis_config[i]);
2702 }
2703 }
2704 }
2705 ia_css_set_sdis_config(params, &stream_params->dvs_coefs);
2706 params->dis_coef_table_changed = stream_params->dis_coef_table_changed;
2707
2708 ia_css_set_sdis2_config(params, &stream_params->dvs2_coefs);
2709 params->dvs2_coef_table_changed = stream_params->dvs2_coef_table_changed;
2710 params->sensor_binning = stream_params->sensor_binning;
2711 }
2712
2713 exit:
2714 return retval;
2715 }
2716
2717 int
sh_css_params_init(void)2718 sh_css_params_init(void) {
2719 int i, p;
2720
2721 IA_CSS_ENTER_PRIVATE("void");
2722
2723 /* TMP: tracking of paramsets */
2724 g_param_buffer_dequeue_count = 0;
2725 g_param_buffer_enqueue_count = 0;
2726
2727 for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++)
2728 {
2729 for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
2730 xmem_sp_stage_ptrs[p][i] =
2731 ia_css_refcount_increment(-1,
2732 hmm_alloc(sizeof(struct sh_css_sp_stage),
2733 HMM_BO_PRIVATE, 0, NULL,
2734 ATOMISP_MAP_FLAG_CLEARED));
2735 xmem_isp_stage_ptrs[p][i] =
2736 ia_css_refcount_increment(-1,
2737 hmm_alloc(sizeof(struct sh_css_sp_stage),
2738 HMM_BO_PRIVATE, 0, NULL,
2739 ATOMISP_MAP_FLAG_CLEARED));
2740
2741 if ((xmem_sp_stage_ptrs[p][i] == mmgr_NULL) ||
2742 (xmem_isp_stage_ptrs[p][i] == mmgr_NULL)) {
2743 sh_css_params_uninit();
2744 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
2745 return -ENOMEM;
2746 }
2747 }
2748 }
2749
2750 ia_css_config_gamma_table();
2751 ia_css_config_ctc_table();
2752 ia_css_config_rgb_gamma_tables();
2753 ia_css_config_xnr_table();
2754
2755 sp_ddr_ptrs = ia_css_refcount_increment(-1,
2756 hmm_alloc(CEIL_MUL(sizeof(struct sh_css_ddr_address_map),
2757 HIVE_ISP_DDR_WORD_BYTES),
2758 HMM_BO_PRIVATE, 0, NULL,
2759 ATOMISP_MAP_FLAG_CLEARED));
2760 xmem_sp_group_ptrs = ia_css_refcount_increment(-1,
2761 hmm_alloc(sizeof(struct sh_css_sp_group),
2762 HMM_BO_PRIVATE, 0, NULL,
2763 ATOMISP_MAP_FLAG_CLEARED));
2764
2765 if ((sp_ddr_ptrs == mmgr_NULL) ||
2766 (xmem_sp_group_ptrs == mmgr_NULL))
2767 {
2768 ia_css_uninit();
2769 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
2770 return -ENOMEM;
2771 }
2772 IA_CSS_LEAVE_ERR_PRIVATE(0);
2773 return 0;
2774 }
2775
host_lut_store(const void * lut)2776 static void host_lut_store(const void *lut)
2777 {
2778 unsigned int i;
2779
2780 for (i = 0; i < N_GDC_ID; i++)
2781 gdc_lut_store((gdc_ID_t)i, (const int (*)[HRT_GDC_N]) lut);
2782 }
2783
2784 /* Note that allocation is in ipu address space. */
sh_css_params_alloc_gdc_lut(void)2785 inline ia_css_ptr sh_css_params_alloc_gdc_lut(void)
2786 {
2787 return hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2788 }
2789
sh_css_params_free_gdc_lut(ia_css_ptr addr)2790 inline void sh_css_params_free_gdc_lut(ia_css_ptr addr)
2791 {
2792 if (addr != mmgr_NULL)
2793 hmm_free(addr);
2794 }
2795
ia_css_pipe_set_bci_scaler_lut(struct ia_css_pipe * pipe,const void * lut)2796 int ia_css_pipe_set_bci_scaler_lut(struct ia_css_pipe *pipe,
2797 const void *lut)
2798 {
2799 int err = 0;
2800 bool stream_started = false;
2801
2802 IA_CSS_ENTER("pipe=%p lut=%p", pipe, lut);
2803
2804 if (!lut || !pipe) {
2805 err = -EINVAL;
2806 IA_CSS_LEAVE("err=%d", err);
2807 return err;
2808 }
2809
2810 /* If the pipe belongs to a stream and the stream has started, it is not
2811 * safe to store lut to gdc HW. If pipe->stream is NULL, then no stream is
2812 * created with this pipe, so it is safe to do this operation as long as
2813 * ia_css_init() has been called. */
2814 if (pipe->stream && pipe->stream->started) {
2815 ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
2816 "unable to set scaler lut since stream has started\n");
2817 stream_started = true;
2818 err = -ENOTSUPP;
2819 }
2820
2821 /* Free any existing tables. */
2822 sh_css_params_free_gdc_lut(pipe->scaler_pp_lut);
2823 pipe->scaler_pp_lut = mmgr_NULL;
2824
2825 if (!stream_started) {
2826 if (!IS_ISP2401)
2827 pipe->scaler_pp_lut = hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2828 else
2829 pipe->scaler_pp_lut = sh_css_params_alloc_gdc_lut();
2830
2831 if (pipe->scaler_pp_lut == mmgr_NULL) {
2832 ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
2833 "unable to allocate scaler_pp_lut\n");
2834 err = -ENOMEM;
2835 } else {
2836 gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])lut,
2837 interleaved_lut_temp);
2838 hmm_store(pipe->scaler_pp_lut,
2839 (int *)interleaved_lut_temp,
2840 sizeof(zoom_table));
2841 }
2842 }
2843
2844 IA_CSS_LEAVE("lut(%u) err=%d", pipe->scaler_pp_lut, err);
2845 return err;
2846 }
2847
2848 /* if pipe is NULL, returns default lut addr. */
sh_css_pipe_get_pp_gdc_lut(const struct ia_css_pipe * pipe)2849 ia_css_ptr sh_css_pipe_get_pp_gdc_lut(const struct ia_css_pipe *pipe)
2850 {
2851 assert(pipe);
2852
2853 if (pipe->scaler_pp_lut != mmgr_NULL)
2854 return pipe->scaler_pp_lut;
2855 else
2856 return sh_css_params_get_default_gdc_lut();
2857 }
2858
sh_css_params_map_and_store_default_gdc_lut(void)2859 int sh_css_params_map_and_store_default_gdc_lut(void)
2860 {
2861 int err = 0;
2862
2863 IA_CSS_ENTER_PRIVATE("void");
2864
2865 /* Is table already mapped? Nothing to do if it is mapped. */
2866 if (default_gdc_lut != mmgr_NULL)
2867 return err;
2868
2869 host_lut_store((void *)zoom_table);
2870
2871 if (!IS_ISP2401)
2872 default_gdc_lut = hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2873 else
2874 default_gdc_lut = sh_css_params_alloc_gdc_lut();
2875
2876 if (default_gdc_lut == mmgr_NULL)
2877 return -ENOMEM;
2878
2879 gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])zoom_table,
2880 interleaved_lut_temp);
2881 hmm_store(default_gdc_lut, (int *)interleaved_lut_temp,
2882 sizeof(zoom_table));
2883
2884 IA_CSS_LEAVE_PRIVATE("lut(%u) err=%d", default_gdc_lut, err);
2885 return err;
2886 }
2887
sh_css_params_free_default_gdc_lut(void)2888 void sh_css_params_free_default_gdc_lut(void)
2889 {
2890 IA_CSS_ENTER_PRIVATE("void");
2891
2892 sh_css_params_free_gdc_lut(default_gdc_lut);
2893 default_gdc_lut = mmgr_NULL;
2894
2895 IA_CSS_LEAVE_PRIVATE("void");
2896 }
2897
sh_css_params_get_default_gdc_lut(void)2898 ia_css_ptr sh_css_params_get_default_gdc_lut(void)
2899 {
2900 return default_gdc_lut;
2901 }
2902
free_param_set_callback(ia_css_ptr ptr)2903 static void free_param_set_callback(
2904 ia_css_ptr ptr)
2905 {
2906 IA_CSS_ENTER_PRIVATE("void");
2907
2908 free_ia_css_isp_parameter_set_info(ptr);
2909
2910 IA_CSS_LEAVE_PRIVATE("void");
2911 }
2912
free_buffer_callback(ia_css_ptr ptr)2913 static void free_buffer_callback(
2914 ia_css_ptr ptr)
2915 {
2916 IA_CSS_ENTER_PRIVATE("void");
2917
2918 hmm_free(ptr);
2919
2920 IA_CSS_LEAVE_PRIVATE("void");
2921 }
2922
2923 void
sh_css_param_clear_param_sets(void)2924 sh_css_param_clear_param_sets(void)
2925 {
2926 IA_CSS_ENTER_PRIVATE("void");
2927
2928 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
2929
2930 IA_CSS_LEAVE_PRIVATE("void");
2931 }
2932
2933 /*
2934 * MW: we can define hmm_free() to return a NULL
2935 * then you can write ptr = hmm_free(ptr);
2936 */
2937 #define safe_free(id, x) \
2938 do { \
2939 ia_css_refcount_decrement(id, x); \
2940 (x) = mmgr_NULL; \
2941 } while (0)
2942
free_map(struct sh_css_ddr_address_map * map)2943 static void free_map(struct sh_css_ddr_address_map *map)
2944 {
2945 unsigned int i;
2946
2947 ia_css_ptr *addrs = (ia_css_ptr *)map;
2948
2949 IA_CSS_ENTER_PRIVATE("void");
2950
2951 /* free buffers */
2952 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
2953 sizeof(size_t)); i++) {
2954 if (addrs[i] == mmgr_NULL)
2955 continue;
2956 safe_free(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
2957 }
2958
2959 IA_CSS_LEAVE_PRIVATE("void");
2960 }
2961
2962 void
ia_css_stream_isp_parameters_uninit(struct ia_css_stream * stream)2963 ia_css_stream_isp_parameters_uninit(struct ia_css_stream *stream)
2964 {
2965 int i;
2966 struct ia_css_isp_parameters *params = stream->isp_params_configs;
2967 struct ia_css_isp_parameters *per_frame_params =
2968 stream->per_frame_isp_params_configs;
2969
2970 IA_CSS_ENTER_PRIVATE("void");
2971 if (!params) {
2972 IA_CSS_LEAVE_PRIVATE("isp_param_configs is NULL");
2973 return;
2974 }
2975
2976 /* free existing ddr_ptr maps */
2977 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2978 free_map(¶ms->pipe_ddr_ptrs[i]);
2979 if (per_frame_params)
2980 free_map(&per_frame_params->pipe_ddr_ptrs[i]);
2981 /* Free up theDVS table memory blocks before recomputing new table */
2982 if (params->pipe_dvs_6axis_config[i])
2983 free_dvs_6axis_table(¶ms->pipe_dvs_6axis_config[i]);
2984 if (per_frame_params && per_frame_params->pipe_dvs_6axis_config[i])
2985 free_dvs_6axis_table(&per_frame_params->pipe_dvs_6axis_config[i]);
2986 }
2987 free_map(¶ms->ddr_ptrs);
2988 if (per_frame_params)
2989 free_map(&per_frame_params->ddr_ptrs);
2990
2991 if (params->fpn_config.data) {
2992 kvfree(params->fpn_config.data);
2993 params->fpn_config.data = NULL;
2994 }
2995
2996 /* Free up sc_config (temporal shading table) if it is allocated. */
2997 if (params->sc_config) {
2998 ia_css_shading_table_free(params->sc_config);
2999 params->sc_config = NULL;
3000 }
3001 if (per_frame_params) {
3002 if (per_frame_params->sc_config) {
3003 ia_css_shading_table_free(per_frame_params->sc_config);
3004 per_frame_params->sc_config = NULL;
3005 }
3006 }
3007
3008 kvfree(params);
3009 if (per_frame_params)
3010 kvfree(per_frame_params);
3011 stream->isp_params_configs = NULL;
3012 stream->per_frame_isp_params_configs = NULL;
3013
3014 IA_CSS_LEAVE_PRIVATE("void");
3015 }
3016
3017 void
sh_css_params_uninit(void)3018 sh_css_params_uninit(void)
3019 {
3020 unsigned int p, i;
3021
3022 IA_CSS_ENTER_PRIVATE("void");
3023
3024 ia_css_refcount_decrement(-1, sp_ddr_ptrs);
3025 sp_ddr_ptrs = mmgr_NULL;
3026 ia_css_refcount_decrement(-1, xmem_sp_group_ptrs);
3027 xmem_sp_group_ptrs = mmgr_NULL;
3028
3029 for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++)
3030 for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
3031 ia_css_refcount_decrement(-1, xmem_sp_stage_ptrs[p][i]);
3032 xmem_sp_stage_ptrs[p][i] = mmgr_NULL;
3033 ia_css_refcount_decrement(-1, xmem_isp_stage_ptrs[p][i]);
3034 xmem_isp_stage_ptrs[p][i] = mmgr_NULL;
3035 }
3036
3037 /* go through the pools to clear references */
3038 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
3039 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_BUFFER, &free_buffer_callback);
3040 ia_css_refcount_clear(-1, &free_buffer_callback);
3041
3042 IA_CSS_LEAVE_PRIVATE("void");
3043 }
3044
3045 static struct ia_css_host_data *
convert_allocate_morph_plane(unsigned short * data,unsigned int width,unsigned int height,unsigned int aligned_width)3046 convert_allocate_morph_plane(
3047 unsigned short *data,
3048 unsigned int width,
3049 unsigned int height,
3050 unsigned int aligned_width)
3051 {
3052 unsigned int i, j, padding, w;
3053 struct ia_css_host_data *me;
3054 unsigned int isp_data_size;
3055 u16 *isp_data_ptr;
3056
3057 IA_CSS_ENTER_PRIVATE("void");
3058
3059 /* currently we don't have morph table interpolation yet,
3060 * so we allow a wider table to be used. This will be removed
3061 * in the future. */
3062 if (width > aligned_width) {
3063 padding = 0;
3064 w = aligned_width;
3065 } else {
3066 padding = aligned_width - width;
3067 w = width;
3068 }
3069 isp_data_size = height * (w + padding) * sizeof(uint16_t);
3070
3071 me = ia_css_host_data_allocate((size_t)isp_data_size);
3072
3073 if (!me) {
3074 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3075 return NULL;
3076 }
3077
3078 isp_data_ptr = (uint16_t *)me->address;
3079
3080 memset(isp_data_ptr, 0, (size_t)isp_data_size);
3081
3082 for (i = 0; i < height; i++) {
3083 for (j = 0; j < w; j++)
3084 *isp_data_ptr++ = (uint16_t)data[j];
3085 isp_data_ptr += padding;
3086 data += width;
3087 }
3088
3089 IA_CSS_LEAVE_PRIVATE("void");
3090 return me;
3091 }
3092
3093 static int
store_morph_plane(unsigned short * data,unsigned int width,unsigned int height,ia_css_ptr dest,unsigned int aligned_width)3094 store_morph_plane(
3095 unsigned short *data,
3096 unsigned int width,
3097 unsigned int height,
3098 ia_css_ptr dest,
3099 unsigned int aligned_width) {
3100 struct ia_css_host_data *isp_data;
3101
3102 assert(dest != mmgr_NULL);
3103
3104 isp_data = convert_allocate_morph_plane(data, width, height, aligned_width);
3105 if (!isp_data)
3106 {
3107 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3108 return -ENOMEM;
3109 }
3110 ia_css_params_store_ia_css_host_data(dest, isp_data);
3111
3112 ia_css_host_data_free(isp_data);
3113 return 0;
3114 }
3115
sh_css_update_isp_params_to_ddr(struct ia_css_isp_parameters * params,ia_css_ptr ddr_ptr)3116 static void sh_css_update_isp_params_to_ddr(
3117 struct ia_css_isp_parameters *params,
3118 ia_css_ptr ddr_ptr)
3119 {
3120 size_t size = sizeof(params->uds);
3121
3122 IA_CSS_ENTER_PRIVATE("void");
3123
3124 assert(params);
3125
3126 hmm_store(ddr_ptr, ¶ms->uds, size);
3127 IA_CSS_LEAVE_PRIVATE("void");
3128 }
3129
sh_css_update_isp_mem_params_to_ddr(const struct ia_css_binary * binary,ia_css_ptr ddr_mem_ptr,size_t size,enum ia_css_isp_memories mem)3130 static void sh_css_update_isp_mem_params_to_ddr(
3131 const struct ia_css_binary *binary,
3132 ia_css_ptr ddr_mem_ptr,
3133 size_t size,
3134 enum ia_css_isp_memories mem)
3135 {
3136 const struct ia_css_host_data *params;
3137
3138 IA_CSS_ENTER_PRIVATE("void");
3139
3140 params = ia_css_isp_param_get_mem_init(&binary->mem_params,
3141 IA_CSS_PARAM_CLASS_PARAM, mem);
3142 hmm_store(ddr_mem_ptr, params->address, size);
3143
3144 IA_CSS_LEAVE_PRIVATE("void");
3145 }
3146
ia_css_dequeue_param_buffers(void)3147 void ia_css_dequeue_param_buffers(/*unsigned int pipe_num*/ void)
3148 {
3149 unsigned int i;
3150 ia_css_ptr cpy;
3151 enum sh_css_queue_id param_queue_ids[3] = { IA_CSS_PARAMETER_SET_QUEUE_ID,
3152 IA_CSS_PER_FRAME_PARAMETER_SET_QUEUE_ID,
3153 SH_CSS_INVALID_QUEUE_ID
3154 };
3155
3156 IA_CSS_ENTER_PRIVATE("void");
3157
3158 if (!sh_css_sp_is_running()) {
3159 IA_CSS_LEAVE_PRIVATE("sp is not running");
3160 /* SP is not running. The queues are not valid */
3161 return;
3162 }
3163
3164 for (i = 0; SH_CSS_INVALID_QUEUE_ID != param_queue_ids[i]; i++) {
3165 cpy = (ia_css_ptr)0;
3166 /* clean-up old copy */
3167 while (ia_css_bufq_dequeue_buffer(param_queue_ids[i],
3168 (uint32_t *)&cpy) == 0) {
3169 /* TMP: keep track of dequeued param set count
3170 */
3171 g_param_buffer_dequeue_count++;
3172 ia_css_bufq_enqueue_psys_event(
3173 IA_CSS_PSYS_SW_EVENT_BUFFER_DEQUEUED,
3174 0,
3175 param_queue_ids[i],
3176 0);
3177
3178 IA_CSS_LOG("dequeued param set %x from %d, release ref", cpy, 0);
3179 free_ia_css_isp_parameter_set_info(cpy);
3180 cpy = (ia_css_ptr)0;
3181 }
3182 }
3183
3184 IA_CSS_LEAVE_PRIVATE("void");
3185 }
3186
3187 static void
process_kernel_parameters(unsigned int pipe_id,struct ia_css_pipeline_stage * stage,struct ia_css_isp_parameters * params,unsigned int isp_pipe_version,unsigned int raw_bit_depth)3188 process_kernel_parameters(unsigned int pipe_id,
3189 struct ia_css_pipeline_stage *stage,
3190 struct ia_css_isp_parameters *params,
3191 unsigned int isp_pipe_version,
3192 unsigned int raw_bit_depth)
3193 {
3194 unsigned int param_id;
3195
3196 (void)isp_pipe_version;
3197 (void)raw_bit_depth;
3198
3199 sh_css_enable_pipeline(stage->binary);
3200
3201 if (params->config_changed[IA_CSS_OB_ID]) {
3202 ia_css_ob_configure(¶ms->stream_configs.ob,
3203 isp_pipe_version, raw_bit_depth);
3204 }
3205 if (params->config_changed[IA_CSS_S3A_ID]) {
3206 ia_css_s3a_configure(raw_bit_depth);
3207 }
3208 /* Copy stage uds parameters to config, since they can differ per stage.
3209 */
3210 params->crop_config.crop_pos = params->uds[stage->stage_num].crop_pos;
3211 params->uds_config.crop_pos = params->uds[stage->stage_num].crop_pos;
3212 params->uds_config.uds = params->uds[stage->stage_num].uds;
3213 /* Call parameter process functions for all kernels */
3214 /* Skip SC, since that is called on a temp sc table */
3215 for (param_id = 0; param_id < IA_CSS_NUM_PARAMETER_IDS; param_id++) {
3216 if (param_id == IA_CSS_SC_ID) continue;
3217 if (params->config_changed[param_id])
3218 ia_css_kernel_process_param[param_id](pipe_id, stage, params);
3219 }
3220 }
3221
3222 int
sh_css_param_update_isp_params(struct ia_css_pipe * curr_pipe,struct ia_css_isp_parameters * params,bool commit,struct ia_css_pipe * pipe_in)3223 sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe,
3224 struct ia_css_isp_parameters *params,
3225 bool commit,
3226 struct ia_css_pipe *pipe_in) {
3227 int err = 0;
3228 ia_css_ptr cpy;
3229 int i;
3230 unsigned int raw_bit_depth = 10;
3231 unsigned int isp_pipe_version = SH_CSS_ISP_PIPE_VERSION_1;
3232 bool acc_cluster_params_changed = false;
3233 unsigned int thread_id, pipe_num;
3234
3235 (void)acc_cluster_params_changed;
3236
3237 assert(curr_pipe);
3238
3239 IA_CSS_ENTER_PRIVATE("pipe=%p, isp_parameters_id=%d", pipe_in, params->isp_parameters_id);
3240 raw_bit_depth = ia_css_stream_input_format_bits_per_pixel(curr_pipe->stream);
3241
3242 /* now make the map available to the sp */
3243 if (!commit)
3244 {
3245 IA_CSS_LEAVE_ERR_PRIVATE(err);
3246 return err;
3247 }
3248 /* enqueue a copies of the mem_map to
3249 the designated pipelines */
3250 for (i = 0; i < curr_pipe->stream->num_pipes; i++)
3251 {
3252 struct ia_css_pipe *pipe;
3253 struct sh_css_ddr_address_map *cur_map;
3254 struct sh_css_ddr_address_map_size *cur_map_size;
3255 struct ia_css_isp_parameter_set_info isp_params_info;
3256 struct ia_css_pipeline *pipeline;
3257 struct ia_css_pipeline_stage *stage;
3258
3259 enum sh_css_queue_id queue_id;
3260
3261 pipe = curr_pipe->stream->pipes[i];
3262 pipeline = ia_css_pipe_get_pipeline(pipe);
3263 pipe_num = ia_css_pipe_get_pipe_num(pipe);
3264 isp_pipe_version = ia_css_pipe_get_isp_pipe_version(pipe);
3265 ia_css_pipeline_get_sp_thread_id(pipe_num, &thread_id);
3266
3267 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3268 ia_css_query_internal_queue_id(params->output_frame
3269 ? IA_CSS_BUFFER_TYPE_PER_FRAME_PARAMETER_SET
3270 : IA_CSS_BUFFER_TYPE_PARAMETER_SET,
3271 thread_id, &queue_id);
3272 #else
3273 ia_css_query_internal_queue_id(IA_CSS_BUFFER_TYPE_PARAMETER_SET, thread_id,
3274 &queue_id);
3275 #endif
3276 if (!sh_css_sp_is_running()) {
3277 /* SP is not running. The queues are not valid */
3278 err = -EBUSY;
3279 break;
3280 }
3281 cur_map = ¶ms->pipe_ddr_ptrs[pipeline->pipe_id];
3282 cur_map_size = ¶ms->pipe_ddr_ptrs_size[pipeline->pipe_id];
3283
3284 /* TODO: Normally, zoom and motion parameters shouldn't
3285 * be part of "isp_params" as it is resolution/pipe dependent
3286 * Therefore, move the zoom config elsewhere (e.g. shading
3287 * table can be taken as an example! @GC
3288 * */
3289 {
3290 /* we have to do this per pipeline because */
3291 /* the processing is a.o. resolution dependent */
3292 err = ia_css_process_zoom_and_motion(params,
3293 pipeline->stages);
3294 if (err)
3295 return err;
3296 }
3297 /* check if to actually update the parameters for this pipe */
3298 /* When API change is implemented making good distinction between
3299 * stream config and pipe config this skipping code can be moved out of the #ifdef */
3300 if (pipe_in && (pipe != pipe_in)) {
3301 IA_CSS_LOG("skipping pipe %p", pipe);
3302 continue;
3303 }
3304
3305 /* BZ 125915, should be moved till after "update other buff" */
3306 /* update the other buffers to the pipe specific copies */
3307 for (stage = pipeline->stages; stage; stage = stage->next) {
3308 unsigned int mem;
3309
3310 if (!stage || !stage->binary)
3311 continue;
3312
3313 process_kernel_parameters(pipeline->pipe_id,
3314 stage, params,
3315 isp_pipe_version, raw_bit_depth);
3316
3317 err = sh_css_params_write_to_ddr_internal(
3318 pipe,
3319 pipeline->pipe_id,
3320 params,
3321 stage,
3322 cur_map,
3323 cur_map_size);
3324
3325 if (err)
3326 break;
3327 for (mem = 0; mem < IA_CSS_NUM_MEMORIES; mem++) {
3328 params->isp_mem_params_changed
3329 [pipeline->pipe_id][stage->stage_num][mem] = false;
3330 }
3331 } /* for */
3332 if (err)
3333 break;
3334 /* update isp_params to pipe specific copies */
3335 if (params->isp_params_changed) {
3336 reallocate_buffer(&cur_map->isp_param,
3337 &cur_map_size->isp_param,
3338 cur_map_size->isp_param,
3339 true,
3340 &err);
3341 if (err)
3342 break;
3343 sh_css_update_isp_params_to_ddr(params, cur_map->isp_param);
3344 }
3345
3346 /* last make referenced copy */
3347 err = ref_sh_css_ddr_address_map(
3348 cur_map,
3349 &isp_params_info.mem_map);
3350 if (err)
3351 break;
3352
3353 /* Update Parameters ID */
3354 isp_params_info.isp_parameters_id = params->isp_parameters_id;
3355
3356 /* Update output frame pointer */
3357 isp_params_info.output_frame_ptr =
3358 (params->output_frame) ? params->output_frame->data : mmgr_NULL;
3359
3360 /* now write the copy to ddr */
3361 err = write_ia_css_isp_parameter_set_info_to_ddr(&isp_params_info, &cpy);
3362 if (err)
3363 break;
3364
3365 /* enqueue the set to sp */
3366 IA_CSS_LOG("queue param set %x to %d", cpy, thread_id);
3367
3368 err = ia_css_bufq_enqueue_buffer(thread_id, queue_id, (uint32_t)cpy);
3369 if (err) {
3370 free_ia_css_isp_parameter_set_info(cpy);
3371 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3372 IA_CSS_LOG("pfp: FAILED to add config id %d for OF %d to q %d on thread %d",
3373 isp_params_info.isp_parameters_id,
3374 isp_params_info.output_frame_ptr,
3375 queue_id, thread_id);
3376 #endif
3377 break;
3378 } else {
3379 /* TMP: check discrepancy between nr of enqueued
3380 * parameter sets and dequeued sets
3381 */
3382 g_param_buffer_enqueue_count++;
3383 assert(g_param_buffer_enqueue_count < g_param_buffer_dequeue_count + 50);
3384 /*
3385 * Tell the SP which queues are not empty,
3386 * by sending the software event.
3387 */
3388 if (!sh_css_sp_is_running()) {
3389 /* SP is not running. The queues are not valid */
3390 IA_CSS_LEAVE_ERR_PRIVATE(-EBUSY);
3391 return -EBUSY;
3392 }
3393 ia_css_bufq_enqueue_psys_event(
3394 IA_CSS_PSYS_SW_EVENT_BUFFER_ENQUEUED,
3395 (uint8_t)thread_id,
3396 (uint8_t)queue_id,
3397 0);
3398 #if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3399 IA_CSS_LOG("pfp: added config id %d for OF %d to q %d on thread %d",
3400 isp_params_info.isp_parameters_id,
3401 isp_params_info.output_frame_ptr,
3402 queue_id, thread_id);
3403 #endif
3404 }
3405 /* clean-up old copy */
3406 ia_css_dequeue_param_buffers(/*pipe_num*/);
3407 params->pipe_dvs_6axis_config_changed[pipeline->pipe_id] = false;
3408 } /* end for each 'active' pipeline */
3409 /* clear the changed flags after all params
3410 for all pipelines have been updated */
3411 params->isp_params_changed = false;
3412 params->sc_table_changed = false;
3413 params->dis_coef_table_changed = false;
3414 params->dvs2_coef_table_changed = false;
3415 params->morph_table_changed = false;
3416 params->dz_config_changed = false;
3417 params->motion_config_changed = false;
3418 /* ------ deprecated(bz675) : from ------ */
3419 params->shading_settings_changed = false;
3420 /* ------ deprecated(bz675) : to ------ */
3421
3422 memset(¶ms->config_changed[0], 0, sizeof(params->config_changed));
3423
3424 IA_CSS_LEAVE_ERR_PRIVATE(err);
3425 return err;
3426 }
3427
3428 static int
sh_css_params_write_to_ddr_internal(struct ia_css_pipe * pipe,unsigned int pipe_id,struct ia_css_isp_parameters * params,const struct ia_css_pipeline_stage * stage,struct sh_css_ddr_address_map * ddr_map,struct sh_css_ddr_address_map_size * ddr_map_size)3429 sh_css_params_write_to_ddr_internal(
3430 struct ia_css_pipe *pipe,
3431 unsigned int pipe_id,
3432 struct ia_css_isp_parameters *params,
3433 const struct ia_css_pipeline_stage *stage,
3434 struct sh_css_ddr_address_map *ddr_map,
3435 struct sh_css_ddr_address_map_size *ddr_map_size) {
3436 int err;
3437 const struct ia_css_binary *binary;
3438
3439 unsigned int stage_num;
3440 unsigned int mem;
3441 bool buff_realloced;
3442
3443 /* struct is > 128 bytes so it should not be on stack (see checkpatch) */
3444 static struct ia_css_macc_table converted_macc_table;
3445
3446 IA_CSS_ENTER_PRIVATE("void");
3447 assert(params);
3448 assert(ddr_map);
3449 assert(ddr_map_size);
3450 assert(stage);
3451
3452 binary = stage->binary;
3453 assert(binary);
3454
3455 stage_num = stage->stage_num;
3456
3457 if (binary->info->sp.enable.fpnr)
3458 {
3459 buff_realloced = reallocate_buffer(&ddr_map->fpn_tbl,
3460 &ddr_map_size->fpn_tbl,
3461 (size_t)(FPNTBL_BYTES(binary)),
3462 params->config_changed[IA_CSS_FPN_ID],
3463 &err);
3464 if (err) {
3465 IA_CSS_LEAVE_ERR_PRIVATE(err);
3466 return err;
3467 }
3468 if (params->config_changed[IA_CSS_FPN_ID] || buff_realloced) {
3469 if (params->fpn_config.enabled) {
3470 err = store_fpntbl(params, ddr_map->fpn_tbl);
3471 if (err) {
3472 IA_CSS_LEAVE_ERR_PRIVATE(err);
3473 return err;
3474 }
3475 }
3476 }
3477 }
3478
3479 if (binary->info->sp.enable.sc)
3480 {
3481 u32 enable_conv;
3482 size_t bytes;
3483
3484 if (!IS_ISP2401)
3485 bytes = ISP2400_SCTBL_BYTES(binary);
3486 else
3487 bytes = ISP2401_SCTBL_BYTES(binary);
3488
3489 enable_conv = params->shading_settings.enable_shading_table_conversion;
3490
3491 buff_realloced = reallocate_buffer(&ddr_map->sc_tbl,
3492 &ddr_map_size->sc_tbl,
3493 bytes,
3494 params->sc_table_changed,
3495 &err);
3496 if (err) {
3497 IA_CSS_LEAVE_ERR_PRIVATE(err);
3498 return err;
3499 }
3500
3501 if (params->shading_settings_changed ||
3502 params->sc_table_changed || buff_realloced) {
3503 if (enable_conv == 0) {
3504 if (params->sc_table) {
3505 /* store the shading table to ddr */
3506 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_table);
3507 if (err) {
3508 IA_CSS_LEAVE_ERR_PRIVATE(err);
3509 return err;
3510 }
3511 /* set sc_config to isp */
3512 params->sc_config = (struct ia_css_shading_table *)params->sc_table;
3513 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3514 params->sc_config = NULL;
3515 } else {
3516 /* generate the identical shading table */
3517 if (params->sc_config) {
3518 ia_css_shading_table_free(params->sc_config);
3519 params->sc_config = NULL;
3520 }
3521 sh_css_params_shading_id_table_generate(¶ms->sc_config,
3522 binary->sctbl_width_per_color,
3523 binary->sctbl_height);
3524 if (!params->sc_config) {
3525 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3526 return -ENOMEM;
3527 }
3528
3529 /* store the shading table to ddr */
3530 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
3531 if (err) {
3532 IA_CSS_LEAVE_ERR_PRIVATE(err);
3533 return err;
3534 }
3535
3536 /* set sc_config to isp */
3537 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3538
3539 /* free the shading table */
3540 ia_css_shading_table_free(params->sc_config);
3541 params->sc_config = NULL;
3542 }
3543 } else { /* legacy */
3544 /* ------ deprecated(bz675) : from ------ */
3545 /* shading table is full resolution, reduce */
3546 if (params->sc_config) {
3547 ia_css_shading_table_free(params->sc_config);
3548 params->sc_config = NULL;
3549 }
3550 prepare_shading_table(
3551 (const struct ia_css_shading_table *)params->sc_table,
3552 params->sensor_binning,
3553 ¶ms->sc_config,
3554 binary, pipe->required_bds_factor);
3555 if (!params->sc_config) {
3556 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3557 return -ENOMEM;
3558 }
3559
3560 /* store the shading table to ddr */
3561 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
3562 if (err) {
3563 IA_CSS_LEAVE_ERR_PRIVATE(err);
3564 return err;
3565 }
3566
3567 /* set sc_config to isp */
3568 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3569
3570 /* free the shading table */
3571 ia_css_shading_table_free(params->sc_config);
3572 params->sc_config = NULL;
3573 /* ------ deprecated(bz675) : to ------ */
3574 }
3575 }
3576 }
3577
3578 /* DPC configuration is made pipe specific to allow flexibility in positioning of the
3579 * DPC kernel. The code below sets the pipe specific configuration to
3580 * individual binaries. */
3581 if (IS_ISP2401 &&
3582 params->pipe_dpc_config_changed[pipe_id] && binary->info->sp.enable.dpc)
3583 {
3584 unsigned int size =
3585 stage->binary->info->mem_offsets.offsets.param->dmem.dp.size;
3586
3587 unsigned int offset =
3588 stage->binary->info->mem_offsets.offsets.param->dmem.dp.offset;
3589
3590 if (size) {
3591 ia_css_dp_encode((struct sh_css_isp_dp_params *)
3592 &binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
3593 ¶ms->pipe_dp_config[pipe_id], size);
3594
3595 params->isp_params_changed = true;
3596 params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] =
3597 true;
3598 }
3599 }
3600
3601 if (params->config_changed[IA_CSS_MACC_ID] && binary->info->sp.enable.macc)
3602 {
3603 unsigned int i, j, idx;
3604 unsigned int idx_map[] = {
3605 0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8
3606 };
3607
3608 for (i = 0; i < IA_CSS_MACC_NUM_AXES; i++) {
3609 idx = 4 * idx_map[i];
3610 j = 4 * i;
3611
3612 if (binary->info->sp.pipeline.isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1) {
3613 converted_macc_table.data[idx] =
3614 (int16_t)sDIGIT_FITTING(params->macc_table.data[j],
3615 13, SH_CSS_MACC_COEF_SHIFT);
3616 converted_macc_table.data[idx + 1] =
3617 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 1],
3618 13, SH_CSS_MACC_COEF_SHIFT);
3619 converted_macc_table.data[idx + 2] =
3620 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 2],
3621 13, SH_CSS_MACC_COEF_SHIFT);
3622 converted_macc_table.data[idx + 3] =
3623 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 3],
3624 13, SH_CSS_MACC_COEF_SHIFT);
3625 } else if (binary->info->sp.pipeline.isp_pipe_version ==
3626 SH_CSS_ISP_PIPE_VERSION_2_2) {
3627 converted_macc_table.data[idx] =
3628 params->macc_table.data[j];
3629 converted_macc_table.data[idx + 1] =
3630 params->macc_table.data[j + 1];
3631 converted_macc_table.data[idx + 2] =
3632 params->macc_table.data[j + 2];
3633 converted_macc_table.data[idx + 3] =
3634 params->macc_table.data[j + 3];
3635 }
3636 }
3637 reallocate_buffer(&ddr_map->macc_tbl,
3638 &ddr_map_size->macc_tbl,
3639 ddr_map_size->macc_tbl,
3640 true,
3641 &err);
3642 if (err) {
3643 IA_CSS_LEAVE_ERR_PRIVATE(err);
3644 return err;
3645 }
3646 hmm_store(ddr_map->macc_tbl,
3647 converted_macc_table.data,
3648 sizeof(converted_macc_table.data));
3649 }
3650
3651 if (binary->info->sp.enable.dvs_6axis)
3652 {
3653 /* because UV is packed into the Y plane, calc total
3654 * YYU size = /2 gives size of UV-only,
3655 * total YYU size = UV-only * 3.
3656 */
3657 buff_realloced = reallocate_buffer(
3658 &ddr_map->dvs_6axis_params_y,
3659 &ddr_map_size->dvs_6axis_params_y,
3660 (size_t)((DVS_6AXIS_BYTES(binary) / 2) * 3),
3661 params->pipe_dvs_6axis_config_changed[pipe_id],
3662 &err);
3663 if (err) {
3664 IA_CSS_LEAVE_ERR_PRIVATE(err);
3665 return err;
3666 }
3667
3668 if (params->pipe_dvs_6axis_config_changed[pipe_id] || buff_realloced) {
3669 const struct ia_css_frame_info *dvs_in_frame_info;
3670
3671 if (stage->args.delay_frames[0]) {
3672 /*When delay frames are present(as in case of video),
3673 they are used for dvs. Configure DVS using those params*/
3674 dvs_in_frame_info = &stage->args.delay_frames[0]->info;
3675 } else {
3676 /*Otherwise, use input frame to configure DVS*/
3677 dvs_in_frame_info = &stage->args.in_frame->info;
3678 }
3679
3680 /* Generate default DVS unity table on start up*/
3681 if (!params->pipe_dvs_6axis_config[pipe_id]) {
3682 struct ia_css_resolution dvs_offset = {0};
3683
3684 if (!IS_ISP2401) {
3685 dvs_offset.width = (PIX_SHIFT_FILTER_RUN_IN_X + binary->dvs_envelope.width) / 2;
3686 } else {
3687 if (binary->dvs_envelope.width || binary->dvs_envelope.height) {
3688 dvs_offset.width = (PIX_SHIFT_FILTER_RUN_IN_X + binary->dvs_envelope.width) / 2;
3689 }
3690 }
3691 dvs_offset.height = (PIX_SHIFT_FILTER_RUN_IN_Y + binary->dvs_envelope.height) / 2;
3692
3693 params->pipe_dvs_6axis_config[pipe_id] =
3694 generate_dvs_6axis_table(&binary->out_frame_info[0].res, &dvs_offset);
3695 if (!params->pipe_dvs_6axis_config[pipe_id]) {
3696 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3697 return -ENOMEM;
3698 }
3699 params->pipe_dvs_6axis_config_changed[pipe_id] = true;
3700
3701 store_dvs_6axis_config(params->pipe_dvs_6axis_config[pipe_id],
3702 binary,
3703 dvs_in_frame_info,
3704 ddr_map->dvs_6axis_params_y);
3705 params->isp_params_changed = true;
3706 }
3707 }
3708 }
3709
3710 if (binary->info->sp.enable.ca_gdc)
3711 {
3712 unsigned int i;
3713 ia_css_ptr *virt_addr_tetra_x[
3714
3715 IA_CSS_MORPH_TABLE_NUM_PLANES];
3716 size_t *virt_size_tetra_x[
3717
3718 IA_CSS_MORPH_TABLE_NUM_PLANES];
3719 ia_css_ptr *virt_addr_tetra_y[
3720
3721 IA_CSS_MORPH_TABLE_NUM_PLANES];
3722 size_t *virt_size_tetra_y[
3723
3724 IA_CSS_MORPH_TABLE_NUM_PLANES];
3725
3726 virt_addr_tetra_x[0] = &ddr_map->tetra_r_x;
3727 virt_addr_tetra_x[1] = &ddr_map->tetra_gr_x;
3728 virt_addr_tetra_x[2] = &ddr_map->tetra_gb_x;
3729 virt_addr_tetra_x[3] = &ddr_map->tetra_b_x;
3730 virt_addr_tetra_x[4] = &ddr_map->tetra_ratb_x;
3731 virt_addr_tetra_x[5] = &ddr_map->tetra_batr_x;
3732
3733 virt_size_tetra_x[0] = &ddr_map_size->tetra_r_x;
3734 virt_size_tetra_x[1] = &ddr_map_size->tetra_gr_x;
3735 virt_size_tetra_x[2] = &ddr_map_size->tetra_gb_x;
3736 virt_size_tetra_x[3] = &ddr_map_size->tetra_b_x;
3737 virt_size_tetra_x[4] = &ddr_map_size->tetra_ratb_x;
3738 virt_size_tetra_x[5] = &ddr_map_size->tetra_batr_x;
3739
3740 virt_addr_tetra_y[0] = &ddr_map->tetra_r_y;
3741 virt_addr_tetra_y[1] = &ddr_map->tetra_gr_y;
3742 virt_addr_tetra_y[2] = &ddr_map->tetra_gb_y;
3743 virt_addr_tetra_y[3] = &ddr_map->tetra_b_y;
3744 virt_addr_tetra_y[4] = &ddr_map->tetra_ratb_y;
3745 virt_addr_tetra_y[5] = &ddr_map->tetra_batr_y;
3746
3747 virt_size_tetra_y[0] = &ddr_map_size->tetra_r_y;
3748 virt_size_tetra_y[1] = &ddr_map_size->tetra_gr_y;
3749 virt_size_tetra_y[2] = &ddr_map_size->tetra_gb_y;
3750 virt_size_tetra_y[3] = &ddr_map_size->tetra_b_y;
3751 virt_size_tetra_y[4] = &ddr_map_size->tetra_ratb_y;
3752 virt_size_tetra_y[5] = &ddr_map_size->tetra_batr_y;
3753
3754 buff_realloced = false;
3755 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
3756 buff_realloced |=
3757 reallocate_buffer(virt_addr_tetra_x[i],
3758 virt_size_tetra_x[i],
3759 (size_t)
3760 (MORPH_PLANE_BYTES(binary)),
3761 params->morph_table_changed,
3762 &err);
3763 if (err) {
3764 IA_CSS_LEAVE_ERR_PRIVATE(err);
3765 return err;
3766 }
3767 buff_realloced |=
3768 reallocate_buffer(virt_addr_tetra_y[i],
3769 virt_size_tetra_y[i],
3770 (size_t)
3771 (MORPH_PLANE_BYTES(binary)),
3772 params->morph_table_changed,
3773 &err);
3774 if (err) {
3775 IA_CSS_LEAVE_ERR_PRIVATE(err);
3776 return err;
3777 }
3778 }
3779 if (params->morph_table_changed || buff_realloced) {
3780 const struct ia_css_morph_table *table = params->morph_table;
3781 struct ia_css_morph_table *id_table = NULL;
3782
3783 if ((table) &&
3784 (table->width < binary->morph_tbl_width ||
3785 table->height < binary->morph_tbl_height)) {
3786 table = NULL;
3787 }
3788 if (!table) {
3789 err = sh_css_params_default_morph_table(&id_table,
3790 binary);
3791 if (err) {
3792 IA_CSS_LEAVE_ERR_PRIVATE(err);
3793 return err;
3794 }
3795 table = id_table;
3796 }
3797
3798 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
3799 store_morph_plane(table->coordinates_x[i],
3800 table->width,
3801 table->height,
3802 *virt_addr_tetra_x[i],
3803 binary->morph_tbl_aligned_width);
3804 store_morph_plane(table->coordinates_y[i],
3805 table->width,
3806 table->height,
3807 *virt_addr_tetra_y[i],
3808 binary->morph_tbl_aligned_width);
3809 }
3810 if (id_table)
3811 ia_css_morph_table_free(id_table);
3812 }
3813 }
3814
3815 /* After special cases like SC, FPN since they may change parameters */
3816 for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++)
3817 {
3818 const struct ia_css_isp_data *isp_data =
3819 ia_css_isp_param_get_isp_mem_init(&binary->info->sp.mem_initializers,
3820 IA_CSS_PARAM_CLASS_PARAM, mem);
3821 size_t size = isp_data->size;
3822
3823 if (!size) continue;
3824 buff_realloced = reallocate_buffer(&ddr_map->isp_mem_param[stage_num][mem],
3825 &ddr_map_size->isp_mem_param[stage_num][mem],
3826 size,
3827 params->isp_mem_params_changed[pipe_id][stage_num][mem],
3828 &err);
3829 if (err) {
3830 IA_CSS_LEAVE_ERR_PRIVATE(err);
3831 return err;
3832 }
3833 if (params->isp_mem_params_changed[pipe_id][stage_num][mem] || buff_realloced) {
3834 sh_css_update_isp_mem_params_to_ddr(binary,
3835 ddr_map->isp_mem_param[stage_num][mem],
3836 ddr_map_size->isp_mem_param[stage_num][mem], mem);
3837 }
3838 }
3839
3840 IA_CSS_LEAVE_ERR_PRIVATE(0);
3841 return 0;
3842 }
3843
ia_css_get_fpn_table(struct ia_css_stream * stream)3844 const struct ia_css_fpn_table *ia_css_get_fpn_table(struct ia_css_stream
3845 *stream)
3846 {
3847 struct ia_css_isp_parameters *params;
3848
3849 IA_CSS_ENTER_LEAVE("void");
3850 assert(stream);
3851
3852 params = stream->isp_params_configs;
3853
3854 return ¶ms->fpn_config;
3855 }
3856
ia_css_get_shading_table(struct ia_css_stream * stream)3857 struct ia_css_shading_table *ia_css_get_shading_table(struct ia_css_stream
3858 *stream)
3859 {
3860 struct ia_css_shading_table *table = NULL;
3861 struct ia_css_isp_parameters *params;
3862
3863 IA_CSS_ENTER("void");
3864
3865 assert(stream);
3866
3867 params = stream->isp_params_configs;
3868 if (!params)
3869 return NULL;
3870
3871 if (params->shading_settings.enable_shading_table_conversion == 0) {
3872 if (params->sc_table) {
3873 table = (struct ia_css_shading_table *)params->sc_table;
3874 } else {
3875 const struct ia_css_binary *binary
3876 = ia_css_stream_get_shading_correction_binary(stream);
3877 if (binary) {
3878 /* generate the identical shading table */
3879 if (params->sc_config) {
3880 ia_css_shading_table_free(params->sc_config);
3881 params->sc_config = NULL;
3882 }
3883 sh_css_params_shading_id_table_generate(¶ms->sc_config,
3884 binary->sctbl_width_per_color,
3885 binary->sctbl_height);
3886 table = params->sc_config;
3887 /* The sc_config will be freed in the
3888 * ia_css_stream_isp_parameters_uninit function. */
3889 }
3890 }
3891 } else {
3892 /* ------ deprecated(bz675) : from ------ */
3893 const struct ia_css_binary *binary
3894 = ia_css_stream_get_shading_correction_binary(stream);
3895 struct ia_css_pipe *pipe;
3896
3897 /**********************************************************************/
3898 /* following code is copied from function ia_css_stream_get_shading_correction_binary()
3899 * to match with the binary */
3900 pipe = stream->pipes[0];
3901
3902 if (stream->num_pipes == 2) {
3903 assert(stream->pipes[1]);
3904 if (stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_VIDEO ||
3905 stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_PREVIEW)
3906 pipe = stream->pipes[1];
3907 }
3908 /**********************************************************************/
3909 if (binary) {
3910 if (params->sc_config) {
3911 ia_css_shading_table_free(params->sc_config);
3912 params->sc_config = NULL;
3913 }
3914 prepare_shading_table(
3915 (const struct ia_css_shading_table *)params->sc_table,
3916 params->sensor_binning,
3917 ¶ms->sc_config,
3918 binary, pipe->required_bds_factor);
3919
3920 table = params->sc_config;
3921 /* The sc_config will be freed in the
3922 * ia_css_stream_isp_parameters_uninit function. */
3923 }
3924 /* ------ deprecated(bz675) : to ------ */
3925 }
3926
3927 IA_CSS_LEAVE("table=%p", table);
3928
3929 return table;
3930 }
3931
sh_css_store_sp_group_to_ddr(void)3932 ia_css_ptr sh_css_store_sp_group_to_ddr(void)
3933 {
3934 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3935 hmm_store(xmem_sp_group_ptrs,
3936 &sh_css_sp_group,
3937 sizeof(struct sh_css_sp_group));
3938 return xmem_sp_group_ptrs;
3939 }
3940
sh_css_store_sp_stage_to_ddr(unsigned int pipe,unsigned int stage)3941 ia_css_ptr sh_css_store_sp_stage_to_ddr(
3942 unsigned int pipe,
3943 unsigned int stage)
3944 {
3945 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3946 hmm_store(xmem_sp_stage_ptrs[pipe][stage],
3947 &sh_css_sp_stage,
3948 sizeof(struct sh_css_sp_stage));
3949 return xmem_sp_stage_ptrs[pipe][stage];
3950 }
3951
sh_css_store_isp_stage_to_ddr(unsigned int pipe,unsigned int stage)3952 ia_css_ptr sh_css_store_isp_stage_to_ddr(
3953 unsigned int pipe,
3954 unsigned int stage)
3955 {
3956 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3957 hmm_store(xmem_isp_stage_ptrs[pipe][stage],
3958 &sh_css_isp_stage,
3959 sizeof(struct sh_css_isp_stage));
3960 return xmem_isp_stage_ptrs[pipe][stage];
3961 }
3962
ref_sh_css_ddr_address_map(struct sh_css_ddr_address_map * map,struct sh_css_ddr_address_map * out)3963 static int ref_sh_css_ddr_address_map(
3964 struct sh_css_ddr_address_map *map,
3965 struct sh_css_ddr_address_map *out)
3966 {
3967 int err = 0;
3968 unsigned int i;
3969
3970 /* we will use a union to copy things; overlaying an array
3971 with the struct; that way adding fields in the struct
3972 will keep things working, and we will not get type errors.
3973 */
3974 union {
3975 struct sh_css_ddr_address_map *map;
3976 ia_css_ptr *addrs;
3977 } in_addrs, to_addrs;
3978
3979 IA_CSS_ENTER_PRIVATE("void");
3980 assert(map);
3981 assert(out);
3982
3983 in_addrs.map = map;
3984 to_addrs.map = out;
3985
3986 assert(sizeof(struct sh_css_ddr_address_map_size) / sizeof(size_t) ==
3987 sizeof(struct sh_css_ddr_address_map) / sizeof(ia_css_ptr));
3988
3989 /* copy map using size info */
3990 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
3991 sizeof(size_t)); i++) {
3992 if (in_addrs.addrs[i] == mmgr_NULL)
3993 to_addrs.addrs[i] = mmgr_NULL;
3994 else
3995 to_addrs.addrs[i] = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
3996 in_addrs.addrs[i]);
3997 }
3998
3999 IA_CSS_LEAVE_ERR_PRIVATE(err);
4000 return err;
4001 }
4002
write_ia_css_isp_parameter_set_info_to_ddr(struct ia_css_isp_parameter_set_info * me,ia_css_ptr * out)4003 static int write_ia_css_isp_parameter_set_info_to_ddr(
4004 struct ia_css_isp_parameter_set_info *me,
4005 ia_css_ptr *out)
4006 {
4007 int err = 0;
4008 bool succ;
4009
4010 IA_CSS_ENTER_PRIVATE("void");
4011
4012 assert(me);
4013 assert(out);
4014
4015 *out = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_SET_POOL,
4016 hmm_alloc(sizeof(struct ia_css_isp_parameter_set_info), HMM_BO_PRIVATE, 0, NULL, 0));
4017 succ = (*out != mmgr_NULL);
4018 if (succ)
4019 hmm_store(*out,
4020 me, sizeof(struct ia_css_isp_parameter_set_info));
4021 else
4022 err = -ENOMEM;
4023
4024 IA_CSS_LEAVE_ERR_PRIVATE(err);
4025 return err;
4026 }
4027
4028 static int
free_ia_css_isp_parameter_set_info(ia_css_ptr ptr)4029 free_ia_css_isp_parameter_set_info(
4030 ia_css_ptr ptr) {
4031 int err = 0;
4032 struct ia_css_isp_parameter_set_info isp_params_info;
4033 unsigned int i;
4034 ia_css_ptr *addrs = (ia_css_ptr *)&isp_params_info.mem_map;
4035
4036 IA_CSS_ENTER_PRIVATE("ptr = %u", ptr);
4037
4038 /* sanity check - ptr must be valid */
4039 if (!ia_css_refcount_is_valid(ptr))
4040 {
4041 IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_SET_POOL(0x%x) invalid arg", __func__,
4042 ptr);
4043 err = -EINVAL;
4044 IA_CSS_LEAVE_ERR_PRIVATE(err);
4045 return err;
4046 }
4047
4048 hmm_load(ptr, &isp_params_info.mem_map, sizeof(struct sh_css_ddr_address_map));
4049 /* copy map using size info */
4050 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
4051 sizeof(size_t)); i++)
4052 {
4053 if (addrs[i] == mmgr_NULL)
4054 continue;
4055
4056 /* sanity check - ptr must be valid */
4057 if (!ia_css_refcount_is_valid(addrs[i])) {
4058 IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_BUFFER(0x%x) invalid arg", __func__,
4059 ptr);
4060 err = -EINVAL;
4061 continue;
4062 }
4063
4064 ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
4065 }
4066 ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_SET_POOL, ptr);
4067
4068 IA_CSS_LEAVE_ERR_PRIVATE(err);
4069 return err;
4070 }
4071
4072 /* Mark all parameters as changed to force recomputing the derived ISP parameters */
4073 void
sh_css_invalidate_params(struct ia_css_stream * stream)4074 sh_css_invalidate_params(struct ia_css_stream *stream)
4075 {
4076 struct ia_css_isp_parameters *params;
4077 unsigned int i, j, mem;
4078
4079 IA_CSS_ENTER_PRIVATE("void");
4080 assert(stream);
4081
4082 params = stream->isp_params_configs;
4083 params->isp_params_changed = true;
4084 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
4085 for (j = 0; j < SH_CSS_MAX_STAGES; j++) {
4086 for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++) {
4087 params->isp_mem_params_changed[i][j][mem] = true;
4088 }
4089 }
4090 }
4091
4092 memset(¶ms->config_changed[0], 1, sizeof(params->config_changed));
4093 params->dis_coef_table_changed = true;
4094 params->dvs2_coef_table_changed = true;
4095 params->morph_table_changed = true;
4096 params->sc_table_changed = true;
4097 params->dz_config_changed = true;
4098 params->motion_config_changed = true;
4099
4100 /*Free up theDVS table memory blocks before recomputing new table */
4101 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
4102 if (params->pipe_dvs_6axis_config[i]) {
4103 free_dvs_6axis_table(¶ms->pipe_dvs_6axis_config[i]);
4104 params->pipe_dvs_6axis_config_changed[i] = true;
4105 }
4106 }
4107
4108 IA_CSS_LEAVE_PRIVATE("void");
4109 }
4110
4111 void
sh_css_update_uds_and_crop_info(const struct ia_css_binary_info * info,const struct ia_css_frame_info * in_frame_info,const struct ia_css_frame_info * out_frame_info,const struct ia_css_resolution * dvs_env,const struct ia_css_dz_config * zoom,const struct ia_css_vector * motion_vector,struct sh_css_uds_info * uds,struct sh_css_crop_pos * sp_out_crop_pos,bool enable_zoom)4112 sh_css_update_uds_and_crop_info(
4113 const struct ia_css_binary_info *info,
4114 const struct ia_css_frame_info *in_frame_info,
4115 const struct ia_css_frame_info *out_frame_info,
4116 const struct ia_css_resolution *dvs_env,
4117 const struct ia_css_dz_config *zoom,
4118 const struct ia_css_vector *motion_vector,
4119 struct sh_css_uds_info *uds, /* out */
4120 struct sh_css_crop_pos *sp_out_crop_pos, /* out */
4121
4122 bool enable_zoom)
4123 {
4124 IA_CSS_ENTER_PRIVATE("void");
4125
4126 assert(info);
4127 assert(in_frame_info);
4128 assert(out_frame_info);
4129 assert(dvs_env);
4130 assert(zoom);
4131 assert(motion_vector);
4132 assert(uds);
4133 assert(sp_out_crop_pos);
4134
4135 uds->curr_dx = enable_zoom ? (uint16_t)zoom->dx : HRT_GDC_N;
4136 uds->curr_dy = enable_zoom ? (uint16_t)zoom->dy : HRT_GDC_N;
4137
4138 if (info->enable.dvs_envelope) {
4139 unsigned int crop_x = 0,
4140 crop_y = 0,
4141 uds_xc = 0,
4142 uds_yc = 0,
4143 env_width, env_height;
4144 int half_env_x, half_env_y;
4145 int motion_x = motion_vector->x;
4146 int motion_y = motion_vector->y;
4147 bool upscale_x = in_frame_info->res.width < out_frame_info->res.width;
4148 bool upscale_y = in_frame_info->res.height < out_frame_info->res.height;
4149
4150 if (info->enable.uds && !info->enable.ds) {
4151 /**
4152 * we calculate with the envelope that we can actually
4153 * use, the min dvs envelope is for the filter
4154 * initialization.
4155 */
4156 env_width = dvs_env->width -
4157 SH_CSS_MIN_DVS_ENVELOPE;
4158 env_height = dvs_env->height -
4159 SH_CSS_MIN_DVS_ENVELOPE;
4160 half_env_x = env_width / 2;
4161 half_env_y = env_height / 2;
4162 /**
4163 * for digital zoom, we use the dvs envelope and make
4164 * sure that we don't include the 8 leftmost pixels or
4165 * 8 topmost rows.
4166 */
4167 if (upscale_x) {
4168 uds_xc = (in_frame_info->res.width
4169 + env_width
4170 + SH_CSS_MIN_DVS_ENVELOPE) / 2;
4171 } else {
4172 uds_xc = (out_frame_info->res.width
4173 + env_width) / 2
4174 + SH_CSS_MIN_DVS_ENVELOPE;
4175 }
4176 if (upscale_y) {
4177 uds_yc = (in_frame_info->res.height
4178 + env_height
4179 + SH_CSS_MIN_DVS_ENVELOPE) / 2;
4180 } else {
4181 uds_yc = (out_frame_info->res.height
4182 + env_height) / 2
4183 + SH_CSS_MIN_DVS_ENVELOPE;
4184 }
4185 /* clip the motion vector to +/- half the envelope */
4186 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4187 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4188 uds_xc += motion_x;
4189 uds_yc += motion_y;
4190 /* uds can be pipelined, remove top lines */
4191 crop_y = 2;
4192 } else if (info->enable.ds) {
4193 env_width = dvs_env->width;
4194 env_height = dvs_env->height;
4195 half_env_x = env_width / 2;
4196 half_env_y = env_height / 2;
4197 /* clip the motion vector to +/- half the envelope */
4198 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4199 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4200 /* for video with downscaling, the envelope is included
4201 in the input resolution. */
4202 uds_xc = in_frame_info->res.width / 2 + motion_x;
4203 uds_yc = in_frame_info->res.height / 2 + motion_y;
4204 crop_x = info->pipeline.left_cropping;
4205 /* ds == 2 (yuv_ds) can be pipelined, remove top
4206 lines */
4207 if (info->enable.ds & 1)
4208 crop_y = info->pipeline.top_cropping;
4209 else
4210 crop_y = 2;
4211 } else {
4212 /* video nodz: here we can only crop. We make sure we
4213 crop at least the first 8x8 pixels away. */
4214 env_width = dvs_env->width -
4215 SH_CSS_MIN_DVS_ENVELOPE;
4216 env_height = dvs_env->height -
4217 SH_CSS_MIN_DVS_ENVELOPE;
4218 half_env_x = env_width / 2;
4219 half_env_y = env_height / 2;
4220 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4221 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4222 crop_x = SH_CSS_MIN_DVS_ENVELOPE
4223 + half_env_x + motion_x;
4224 crop_y = SH_CSS_MIN_DVS_ENVELOPE
4225 + half_env_y + motion_y;
4226 }
4227
4228 /* Must enforce that the crop position is even */
4229 crop_x = EVEN_FLOOR(crop_x);
4230 crop_y = EVEN_FLOOR(crop_y);
4231 uds_xc = EVEN_FLOOR(uds_xc);
4232 uds_yc = EVEN_FLOOR(uds_yc);
4233
4234 uds->xc = (uint16_t)uds_xc;
4235 uds->yc = (uint16_t)uds_yc;
4236 sp_out_crop_pos->x = (uint16_t)crop_x;
4237 sp_out_crop_pos->y = (uint16_t)crop_y;
4238 } else {
4239 /* for down scaling, we always use the center of the image */
4240 uds->xc = (uint16_t)in_frame_info->res.width / 2;
4241 uds->yc = (uint16_t)in_frame_info->res.height / 2;
4242 sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
4243 sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
4244 }
4245 IA_CSS_LEAVE_PRIVATE("void");
4246 }
4247
4248 static int
sh_css_update_uds_and_crop_info_based_on_zoom_region(const struct ia_css_binary_info * info,const struct ia_css_frame_info * in_frame_info,const struct ia_css_frame_info * out_frame_info,const struct ia_css_resolution * dvs_env,const struct ia_css_dz_config * zoom,const struct ia_css_vector * motion_vector,struct sh_css_uds_info * uds,struct sh_css_crop_pos * sp_out_crop_pos,struct ia_css_resolution pipe_in_res,bool enable_zoom)4249 sh_css_update_uds_and_crop_info_based_on_zoom_region(
4250 const struct ia_css_binary_info *info,
4251 const struct ia_css_frame_info *in_frame_info,
4252 const struct ia_css_frame_info *out_frame_info,
4253 const struct ia_css_resolution *dvs_env,
4254 const struct ia_css_dz_config *zoom,
4255 const struct ia_css_vector *motion_vector,
4256 struct sh_css_uds_info *uds, /* out */
4257 struct sh_css_crop_pos *sp_out_crop_pos, /* out */
4258 struct ia_css_resolution pipe_in_res,
4259 bool enable_zoom) {
4260 unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
4261 int err = 0;
4262 /* Note:
4263 * Filter_Envelope = 0 for NND/LUT
4264 * Filter_Envelope = 1 for BCI
4265 * Filter_Envelope = 3 for BLI
4266 * Currently, not considering this filter envelope because, In uds.sp.c is recalculating
4267 * the dx/dy based on filter envelope and other information (ia_css_uds_sp_scale_params)
4268 * Ideally, That should be done on host side not on sp side.
4269 */
4270 unsigned int filter_envelope = 0;
4271
4272 IA_CSS_ENTER_PRIVATE("void");
4273
4274 assert(info);
4275 assert(in_frame_info);
4276 assert(out_frame_info);
4277 assert(dvs_env);
4278 assert(zoom);
4279 assert(motion_vector);
4280 assert(uds);
4281 assert(sp_out_crop_pos);
4282 x0 = zoom->zoom_region.origin.x;
4283 y0 = zoom->zoom_region.origin.y;
4284 x1 = zoom->zoom_region.resolution.width + x0;
4285 y1 = zoom->zoom_region.resolution.height + y0;
4286
4287 if ((x0 > x1) || (y0 > y1) || (x1 > pipe_in_res.width) || (y1 > pipe_in_res.height))
4288 return -EINVAL;
4289
4290 if (!enable_zoom)
4291 {
4292 uds->curr_dx = HRT_GDC_N;
4293 uds->curr_dy = HRT_GDC_N;
4294 }
4295
4296 if (info->enable.dvs_envelope)
4297 {
4298 /* Zoom region is only supported by the UDS module on ISP
4299 * 2 and higher. It is not supported in video mode on ISP 1 */
4300 return -EINVAL;
4301 } else
4302 {
4303 if (enable_zoom) {
4304 /* A. Calculate dx/dy based on crop region using in_frame_info
4305 * Scale the crop region if in_frame_info to the stage is not same as
4306 * actual effective input of the pipeline
4307 */
4308 if (in_frame_info->res.width != pipe_in_res.width ||
4309 in_frame_info->res.height != pipe_in_res.height) {
4310 x0 = (x0 * in_frame_info->res.width) / (pipe_in_res.width);
4311 y0 = (y0 * in_frame_info->res.height) / (pipe_in_res.height);
4312 x1 = (x1 * in_frame_info->res.width) / (pipe_in_res.width);
4313 y1 = (y1 * in_frame_info->res.height) / (pipe_in_res.height);
4314 }
4315 uds->curr_dx =
4316 ((x1 - x0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.width;
4317 uds->curr_dy =
4318 ((y1 - y0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.height;
4319
4320 /* B. Calculate xc/yc based on crop region */
4321 uds->xc = (uint16_t)x0 + (((x1) - (x0)) / 2);
4322 uds->yc = (uint16_t)y0 + (((y1) - (y0)) / 2);
4323 } else {
4324 uds->xc = (uint16_t)in_frame_info->res.width / 2;
4325 uds->yc = (uint16_t)in_frame_info->res.height / 2;
4326 }
4327
4328 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
4329 "uds->curr_dx=%d, uds->xc=%d, uds->yc=%d\n",
4330 uds->curr_dx, uds->xc, uds->yc);
4331 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "x0=%d, y0=%d, x1=%d, y1=%d\n",
4332 x0, y0, x1, y1);
4333 sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
4334 sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
4335 }
4336 IA_CSS_LEAVE_PRIVATE("void");
4337 return err;
4338 }
4339
4340 struct ia_css_3a_statistics *
ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info * grid)4341 ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
4342 {
4343 struct ia_css_3a_statistics *me;
4344 int grid_size;
4345
4346 IA_CSS_ENTER("grid=%p", grid);
4347
4348 assert(grid);
4349
4350 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4351 if (!me)
4352 goto err;
4353
4354 me->grid = *grid;
4355 grid_size = grid->width * grid->height;
4356 me->data = kvmalloc(grid_size * sizeof(*me->data), GFP_KERNEL);
4357 if (!me->data)
4358 goto err;
4359 #if !defined(HAS_NO_HMEM)
4360 /* No weighted histogram, no structure, treat the histogram data as a byte dump in a byte array */
4361 me->rgby_data = kvmalloc(sizeof_hmem(HMEM0_ID), GFP_KERNEL);
4362 #else
4363 me->rgby_data = NULL;
4364 #endif
4365
4366 IA_CSS_LEAVE("return=%p", me);
4367 return me;
4368 err:
4369 ia_css_3a_statistics_free(me);
4370
4371 IA_CSS_LEAVE("return=%p", NULL);
4372 return NULL;
4373 }
4374
4375 void
ia_css_3a_statistics_free(struct ia_css_3a_statistics * me)4376 ia_css_3a_statistics_free(struct ia_css_3a_statistics *me)
4377 {
4378 if (me) {
4379 kvfree(me->rgby_data);
4380 kvfree(me->data);
4381 kvfree(me);
4382 }
4383 }
4384
4385 struct ia_css_dvs_statistics *
ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info * grid)4386 ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
4387 {
4388 struct ia_css_dvs_statistics *me;
4389
4390 assert(grid);
4391
4392 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4393 if (!me)
4394 goto err;
4395
4396 me->grid = *grid;
4397 me->hor_proj = kvmalloc(grid->height * IA_CSS_DVS_NUM_COEF_TYPES *
4398 sizeof(*me->hor_proj), GFP_KERNEL);
4399 if (!me->hor_proj)
4400 goto err;
4401
4402 me->ver_proj = kvmalloc(grid->width * IA_CSS_DVS_NUM_COEF_TYPES *
4403 sizeof(*me->ver_proj), GFP_KERNEL);
4404 if (!me->ver_proj)
4405 goto err;
4406
4407 return me;
4408 err:
4409 ia_css_dvs_statistics_free(me);
4410 return NULL;
4411 }
4412
4413 void
ia_css_dvs_statistics_free(struct ia_css_dvs_statistics * me)4414 ia_css_dvs_statistics_free(struct ia_css_dvs_statistics *me)
4415 {
4416 if (me) {
4417 kvfree(me->hor_proj);
4418 kvfree(me->ver_proj);
4419 kvfree(me);
4420 }
4421 }
4422
4423 struct ia_css_dvs_coefficients *
ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info * grid)4424 ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
4425 {
4426 struct ia_css_dvs_coefficients *me;
4427
4428 assert(grid);
4429
4430 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4431 if (!me)
4432 goto err;
4433
4434 me->grid = *grid;
4435
4436 me->hor_coefs = kvmalloc(grid->num_hor_coefs *
4437 IA_CSS_DVS_NUM_COEF_TYPES *
4438 sizeof(*me->hor_coefs), GFP_KERNEL);
4439 if (!me->hor_coefs)
4440 goto err;
4441
4442 me->ver_coefs = kvmalloc(grid->num_ver_coefs *
4443 IA_CSS_DVS_NUM_COEF_TYPES *
4444 sizeof(*me->ver_coefs), GFP_KERNEL);
4445 if (!me->ver_coefs)
4446 goto err;
4447
4448 return me;
4449 err:
4450 ia_css_dvs_coefficients_free(me);
4451 return NULL;
4452 }
4453
4454 void
ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients * me)4455 ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients *me)
4456 {
4457 if (me) {
4458 kvfree(me->hor_coefs);
4459 kvfree(me->ver_coefs);
4460 kvfree(me);
4461 }
4462 }
4463
4464 struct ia_css_dvs2_statistics *
ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info * grid)4465 ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
4466 {
4467 struct ia_css_dvs2_statistics *me;
4468
4469 assert(grid);
4470
4471 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4472 if (!me)
4473 goto err;
4474
4475 me->grid = *grid;
4476
4477 me->hor_prod.odd_real = kvmalloc(grid->aligned_width *
4478 grid->aligned_height *
4479 sizeof(*me->hor_prod.odd_real),
4480 GFP_KERNEL);
4481 if (!me->hor_prod.odd_real)
4482 goto err;
4483
4484 me->hor_prod.odd_imag = kvmalloc(grid->aligned_width *
4485 grid->aligned_height *
4486 sizeof(*me->hor_prod.odd_imag),
4487 GFP_KERNEL);
4488 if (!me->hor_prod.odd_imag)
4489 goto err;
4490
4491 me->hor_prod.even_real = kvmalloc(grid->aligned_width *
4492 grid->aligned_height *
4493 sizeof(*me->hor_prod.even_real),
4494 GFP_KERNEL);
4495 if (!me->hor_prod.even_real)
4496 goto err;
4497
4498 me->hor_prod.even_imag = kvmalloc(grid->aligned_width *
4499 grid->aligned_height *
4500 sizeof(*me->hor_prod.even_imag),
4501 GFP_KERNEL);
4502 if (!me->hor_prod.even_imag)
4503 goto err;
4504
4505 me->ver_prod.odd_real = kvmalloc(grid->aligned_width *
4506 grid->aligned_height *
4507 sizeof(*me->ver_prod.odd_real),
4508 GFP_KERNEL);
4509 if (!me->ver_prod.odd_real)
4510 goto err;
4511
4512 me->ver_prod.odd_imag = kvmalloc(grid->aligned_width *
4513 grid->aligned_height *
4514 sizeof(*me->ver_prod.odd_imag),
4515 GFP_KERNEL);
4516 if (!me->ver_prod.odd_imag)
4517 goto err;
4518
4519 me->ver_prod.even_real = kvmalloc(grid->aligned_width *
4520 grid->aligned_height *
4521 sizeof(*me->ver_prod.even_real),
4522 GFP_KERNEL);
4523 if (!me->ver_prod.even_real)
4524 goto err;
4525
4526 me->ver_prod.even_imag = kvmalloc(grid->aligned_width *
4527 grid->aligned_height *
4528 sizeof(*me->ver_prod.even_imag),
4529 GFP_KERNEL);
4530 if (!me->ver_prod.even_imag)
4531 goto err;
4532
4533 return me;
4534 err:
4535 ia_css_dvs2_statistics_free(me);
4536 return NULL;
4537 }
4538
4539 void
ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics * me)4540 ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics *me)
4541 {
4542 if (me) {
4543 kvfree(me->hor_prod.odd_real);
4544 kvfree(me->hor_prod.odd_imag);
4545 kvfree(me->hor_prod.even_real);
4546 kvfree(me->hor_prod.even_imag);
4547 kvfree(me->ver_prod.odd_real);
4548 kvfree(me->ver_prod.odd_imag);
4549 kvfree(me->ver_prod.even_real);
4550 kvfree(me->ver_prod.even_imag);
4551 kvfree(me);
4552 }
4553 }
4554
4555 struct ia_css_dvs2_coefficients *
ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info * grid)4556 ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
4557 {
4558 struct ia_css_dvs2_coefficients *me;
4559
4560 assert(grid);
4561
4562 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4563 if (!me)
4564 goto err;
4565
4566 me->grid = *grid;
4567
4568 me->hor_coefs.odd_real = kvmalloc(grid->num_hor_coefs *
4569 sizeof(*me->hor_coefs.odd_real),
4570 GFP_KERNEL);
4571 if (!me->hor_coefs.odd_real)
4572 goto err;
4573
4574 me->hor_coefs.odd_imag = kvmalloc(grid->num_hor_coefs *
4575 sizeof(*me->hor_coefs.odd_imag),
4576 GFP_KERNEL);
4577 if (!me->hor_coefs.odd_imag)
4578 goto err;
4579
4580 me->hor_coefs.even_real = kvmalloc(grid->num_hor_coefs *
4581 sizeof(*me->hor_coefs.even_real),
4582 GFP_KERNEL);
4583 if (!me->hor_coefs.even_real)
4584 goto err;
4585
4586 me->hor_coefs.even_imag = kvmalloc(grid->num_hor_coefs *
4587 sizeof(*me->hor_coefs.even_imag),
4588 GFP_KERNEL);
4589 if (!me->hor_coefs.even_imag)
4590 goto err;
4591
4592 me->ver_coefs.odd_real = kvmalloc(grid->num_ver_coefs *
4593 sizeof(*me->ver_coefs.odd_real),
4594 GFP_KERNEL);
4595 if (!me->ver_coefs.odd_real)
4596 goto err;
4597
4598 me->ver_coefs.odd_imag = kvmalloc(grid->num_ver_coefs *
4599 sizeof(*me->ver_coefs.odd_imag),
4600 GFP_KERNEL);
4601 if (!me->ver_coefs.odd_imag)
4602 goto err;
4603
4604 me->ver_coefs.even_real = kvmalloc(grid->num_ver_coefs *
4605 sizeof(*me->ver_coefs.even_real),
4606 GFP_KERNEL);
4607 if (!me->ver_coefs.even_real)
4608 goto err;
4609
4610 me->ver_coefs.even_imag = kvmalloc(grid->num_ver_coefs *
4611 sizeof(*me->ver_coefs.even_imag),
4612 GFP_KERNEL);
4613 if (!me->ver_coefs.even_imag)
4614 goto err;
4615
4616 return me;
4617 err:
4618 ia_css_dvs2_coefficients_free(me);
4619 return NULL;
4620 }
4621
4622 void
ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients * me)4623 ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients *me)
4624 {
4625 if (me) {
4626 kvfree(me->hor_coefs.odd_real);
4627 kvfree(me->hor_coefs.odd_imag);
4628 kvfree(me->hor_coefs.even_real);
4629 kvfree(me->hor_coefs.even_imag);
4630 kvfree(me->ver_coefs.odd_real);
4631 kvfree(me->ver_coefs.odd_imag);
4632 kvfree(me->ver_coefs.even_real);
4633 kvfree(me->ver_coefs.even_imag);
4634 kvfree(me);
4635 }
4636 }
4637
4638 struct ia_css_dvs_6axis_config *
ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream * stream)4639 ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream *stream)
4640 {
4641 struct ia_css_dvs_6axis_config *dvs_config = NULL;
4642 struct ia_css_isp_parameters *params = NULL;
4643 unsigned int width_y;
4644 unsigned int height_y;
4645 unsigned int width_uv;
4646 unsigned int height_uv;
4647
4648 assert(stream);
4649 params = stream->isp_params_configs;
4650
4651 /* Backward compatibility by default consider pipe as Video*/
4652 if (!params || (params &&
4653 !params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO])) {
4654 goto err;
4655 }
4656
4657 dvs_config = kvcalloc(1, sizeof(struct ia_css_dvs_6axis_config),
4658 GFP_KERNEL);
4659 if (!dvs_config)
4660 goto err;
4661
4662 dvs_config->width_y = width_y =
4663 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_y;
4664 dvs_config->height_y = height_y =
4665 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_y;
4666 dvs_config->width_uv = width_uv =
4667 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_uv;
4668 dvs_config->height_uv = height_uv =
4669 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_uv;
4670 IA_CSS_LOG("table Y: W %d H %d", width_y, height_y);
4671 IA_CSS_LOG("table UV: W %d H %d", width_uv, height_uv);
4672 dvs_config->xcoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
4673 GFP_KERNEL);
4674 if (!dvs_config->xcoords_y)
4675 goto err;
4676
4677 dvs_config->ycoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
4678 GFP_KERNEL);
4679 if (!dvs_config->ycoords_y)
4680 goto err;
4681
4682 dvs_config->xcoords_uv = kvmalloc(width_uv * height_uv *
4683 sizeof(uint32_t),
4684 GFP_KERNEL);
4685 if (!dvs_config->xcoords_uv)
4686 goto err;
4687
4688 dvs_config->ycoords_uv = kvmalloc(width_uv * height_uv *
4689 sizeof(uint32_t),
4690 GFP_KERNEL);
4691 if (!dvs_config->ycoords_uv)
4692 goto err;
4693
4694 return dvs_config;
4695 err:
4696 ia_css_dvs2_6axis_config_free(dvs_config);
4697 return NULL;
4698 }
4699
4700 void
ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config * dvs_6axis_config)4701 ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config *dvs_6axis_config)
4702 {
4703 if (dvs_6axis_config) {
4704 kvfree(dvs_6axis_config->xcoords_y);
4705 kvfree(dvs_6axis_config->ycoords_y);
4706 kvfree(dvs_6axis_config->xcoords_uv);
4707 kvfree(dvs_6axis_config->ycoords_uv);
4708 kvfree(dvs_6axis_config);
4709 }
4710 }
4711
4712 void
ia_css_en_dz_capt_pipe(struct ia_css_stream * stream,bool enable)4713 ia_css_en_dz_capt_pipe(struct ia_css_stream *stream, bool enable)
4714 {
4715 struct ia_css_pipe *pipe;
4716 struct ia_css_pipeline *pipeline;
4717 struct ia_css_pipeline_stage *stage;
4718 enum ia_css_pipe_id pipe_id;
4719 int err;
4720 int i;
4721
4722 if (!stream)
4723 return;
4724
4725 for (i = 0; i < stream->num_pipes; i++) {
4726 pipe = stream->pipes[i];
4727 pipeline = ia_css_pipe_get_pipeline(pipe);
4728 pipe_id = pipeline->pipe_id;
4729
4730 if (pipe_id == IA_CSS_PIPE_ID_CAPTURE) {
4731 err = ia_css_pipeline_get_stage(pipeline, IA_CSS_BINARY_MODE_CAPTURE_PP,
4732 &stage);
4733 if (!err)
4734 stage->enable_zoom = enable;
4735 break;
4736 }
4737 }
4738 }
4739