1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include "gdc_device.h"
17#include "isp.h"
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
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"
32
33#include "platform_support.h"
34#include "assert_support.h"
35#include "misc_support.h"
36#include "math_support.h"
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
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
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 \
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
124
125static ia_css_ptr sp_ddr_ptrs;
126
127
128static ia_css_ptr xmem_sp_group_ptrs;
129
130static ia_css_ptr xmem_sp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
131[SH_CSS_MAX_STAGES];
132static ia_css_ptr xmem_isp_stage_ptrs[IA_CSS_PIPE_ID_NUM]
133[SH_CSS_MAX_STAGES];
134
135static ia_css_ptr default_gdc_lut;
136static int interleaved_lut_temp[4][HRT_GDC_N];
137
138
139
140
141
142
143static 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
666static 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
676static const struct ia_css_vector default_motion_config = {
677 0,
678 0
679};
680
681
682static const struct ia_css_shading_settings default_shading_settings = {
683 1
684
685};
686
687
688
689struct ia_css_isp_skc_dvs_statistics {
690 ia_css_ptr p_data;
691};
692
693static int
694ref_sh_css_ddr_address_map(
695 struct sh_css_ddr_address_map *map,
696 struct sh_css_ddr_address_map *out);
697
698static int
699write_ia_css_isp_parameter_set_info_to_ddr(
700 struct ia_css_isp_parameter_set_info *me,
701 ia_css_ptr *out);
702
703static int
704free_ia_css_isp_parameter_set_info(ia_css_ptr ptr);
705
706static int
707sh_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
715static int
716sh_css_create_isp_params(struct ia_css_stream *stream,
717 struct ia_css_isp_parameters **isp_params_out);
718
719static bool
720sh_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
725static int
726sh_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
731static int
732sh_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)
738static int
739sh_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
745static int
746sh_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,
754 struct sh_css_crop_pos *sp_out_crop_pos,
755 struct ia_css_resolution pipe_in_res,
756 bool enable_zoom);
757
758ia_css_ptr
759sh_css_params_ddr_address_map(void)
760{
761 return sp_ddr_ptrs;
762}
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779static struct ia_css_host_data *
780convert_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
815static int
816store_fpntbl(struct ia_css_isp_parameters *params, ia_css_ptr ptr)
817{
818 struct ia_css_host_data *isp_data;
819
820 assert(params);
821 assert(ptr != mmgr_NULL);
822
823 isp_data = convert_allocate_fpntbl(params);
824 if (!isp_data) {
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
834static void
835convert_raw_to_fpn(struct ia_css_isp_parameters *params)
836{
837 int maxval = 0;
838 unsigned int i;
839
840 assert(params);
841
842
843 for (i = 0; i < params->fpn_config.height * params->fpn_config.width; i++) {
844 int val = params->fpn_config.data[i];
845
846
847
848
849 if (val < 0) {
850
851 val = 0;
852 } else if (val >= (1 << 13)) {
853
854
855 val = (1 << 13) - 1;
856 }
857 maxval = max(maxval, val);
858 }
859
860
861
862 params->fpn_config.shift = 0;
863 while (maxval > 63) {
864
865 maxval >>= 1;
866 params->fpn_config.shift++;
867 }
868
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
873static void
874ia_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
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
895static int
896sh_css_select_dp_10bpp_config(const struct ia_css_pipe *pipe,
897 bool *is_dp_10bpp)
898{
899 int err = 0;
900
901
902
903
904
905
906
907 if ((!pipe) || (!is_dp_10bpp)) {
908 IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
909 err = -EINVAL;
910 } else {
911 *is_dp_10bpp = false;
912
913
914 if (pipe->config.enable_dpc) {
915
916 unsigned int required_bds_factor = SH_CSS_BDS_FACTOR_1_00;
917
918 if ((pipe->config.bayer_ds_out_res.width != 0) &&
919 (pipe->config.bayer_ds_out_res.height != 0)) {
920 if (0 == binarydesc_calculate_bds_factor(
921 pipe->config.input_effective_res,
922 pipe->config.bayer_ds_out_res,
923 &required_bds_factor)) {
924 if (required_bds_factor != SH_CSS_BDS_FACTOR_1_00) {
925
926 *is_dp_10bpp = true;
927 }
928 }
929 }
930 }
931 }
932
933 return err;
934}
935
936int
937sh_css_set_black_frame(struct ia_css_stream *stream,
938 const struct ia_css_frame *raw_black_frame)
939{
940 struct ia_css_isp_parameters *params;
941
942
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 kvfree(params->fpn_config.data);
962 params->fpn_config.data = NULL;
963 }
964 if (!params->fpn_config.data) {
965 params->fpn_config.data = kvmalloc(height * width *
966 sizeof(short), GFP_KERNEL);
967 if (!params->fpn_config.data) {
968 IA_CSS_ERROR("out of memory");
969 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
970 return -ENOMEM;
971 }
972 params->fpn_config.width = width;
973 params->fpn_config.height = height;
974 params->fpn_config.shift = 0;
975 }
976
977
978 for (y = 0; y < height; y++) {
979 for (x = 0; x < width; x += (ISP_VEC_NELEMS * 2)) {
980 int ofs = y * width + x;
981
982 for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
983 hmm_load(ptr, (void *)(&data), sizeof(int));
984 params->fpn_config.data[ofs + 2 * k] =
985 (short)(data & 0xFFFF);
986 params->fpn_config.data[ofs + 2 * k + 2] =
987 (short)((data >> 16) & 0xFFFF);
988 ptr += sizeof(int);
989 }
990 for (k = 0; k < ISP_VEC_NELEMS; k += 2) {
991 hmm_load(ptr, (void *)(&data), sizeof(int));
992 params->fpn_config.data[ofs + 2 * k + 1] =
993 (short)(data & 0xFFFF);
994 params->fpn_config.data[ofs + 2 * k + 3] =
995 (short)((data >> 16) & 0xFFFF);
996 ptr += sizeof(int);
997 }
998 }
999 }
1000
1001
1002 convert_raw_to_fpn(params);
1003
1004
1005 ia_css_process_kernel(stream, params, ia_css_kernel_process_param[IA_CSS_FPN_ID]);
1006
1007 IA_CSS_LEAVE_ERR_PRIVATE(0);
1008
1009 return 0;
1010}
1011
1012bool
1013sh_css_params_set_binning_factor(struct ia_css_stream *stream,
1014 unsigned int binning_fact)
1015{
1016 struct ia_css_isp_parameters *params;
1017
1018 IA_CSS_ENTER_PRIVATE("void");
1019 assert(stream);
1020
1021 params = stream->isp_params_configs;
1022
1023 if (params->sensor_binning != binning_fact) {
1024 params->sensor_binning = binning_fact;
1025 params->sc_table_changed = true;
1026 }
1027
1028 IA_CSS_LEAVE_PRIVATE("void");
1029
1030 return params->sc_table_changed;
1031}
1032
1033static void
1034sh_css_update_shading_table_status(struct ia_css_pipe *pipe,
1035 struct ia_css_isp_parameters *params)
1036{
1037 if (params && pipe && (pipe->pipe_num != params->sc_table_last_pipe_num)) {
1038 params->sc_table_dirty = true;
1039 params->sc_table_last_pipe_num = pipe->pipe_num;
1040 }
1041}
1042
1043static void
1044sh_css_set_shading_table(struct ia_css_stream *stream,
1045 struct ia_css_isp_parameters *params,
1046 const struct ia_css_shading_table *table)
1047{
1048 IA_CSS_ENTER_PRIVATE("");
1049 if (!table)
1050 return;
1051 assert(stream);
1052
1053 if (!table->enable)
1054 table = NULL;
1055
1056 if ((table != params->sc_table) || params->sc_table_dirty) {
1057 params->sc_table = table;
1058 params->sc_table_changed = true;
1059 params->sc_table_dirty = false;
1060
1061
1062
1063
1064 if (!params->output_frame)
1065 sh_css_invalidate_shading_tables(stream);
1066 }
1067
1068 IA_CSS_LEAVE_PRIVATE("void");
1069}
1070
1071void
1072ia_css_params_store_ia_css_host_data(
1073 ia_css_ptr ddr_addr,
1074 struct ia_css_host_data *data)
1075{
1076 assert(data);
1077 assert(data->address);
1078 assert(ddr_addr != mmgr_NULL);
1079
1080 IA_CSS_ENTER_PRIVATE("");
1081
1082 hmm_store(ddr_addr,
1083 (void *)(data->address),
1084 (size_t)data->size);
1085
1086 IA_CSS_LEAVE_PRIVATE("void");
1087}
1088
1089struct ia_css_host_data *
1090ia_css_params_alloc_convert_sctbl(
1091 const struct ia_css_pipeline_stage *stage,
1092 const struct ia_css_shading_table *shading_table)
1093{
1094 const struct ia_css_binary *binary = stage->binary;
1095 struct ia_css_host_data *sctbl;
1096 unsigned int i, j, aligned_width;
1097 unsigned int sctbl_size;
1098 short int *ptr;
1099
1100 assert(binary);
1101 assert(shading_table);
1102
1103 IA_CSS_ENTER_PRIVATE("");
1104
1105 if (!shading_table) {
1106 IA_CSS_LEAVE_PRIVATE("void");
1107 return NULL;
1108 }
1109
1110 aligned_width = binary->sctbl_aligned_width_per_color;
1111 sctbl_size = shading_table->height * IA_CSS_SC_NUM_COLORS * aligned_width *
1112 sizeof(short);
1113
1114 sctbl = ia_css_host_data_allocate((size_t)sctbl_size);
1115
1116 if (!sctbl)
1117 return NULL;
1118 ptr = (short int *)sctbl->address;
1119 memset(ptr,
1120 0,
1121 sctbl_size);
1122
1123 for (i = 0; i < shading_table->height; i++) {
1124 for (j = 0; j < IA_CSS_SC_NUM_COLORS; j++) {
1125 memcpy(ptr,
1126 &shading_table->data[j]
1127 [i * shading_table->width],
1128 shading_table->width * sizeof(short));
1129 ptr += aligned_width;
1130 }
1131 }
1132
1133 IA_CSS_LEAVE_PRIVATE("void");
1134 return sctbl;
1135}
1136
1137int ia_css_params_store_sctbl(
1138 const struct ia_css_pipeline_stage *stage,
1139 ia_css_ptr sc_tbl,
1140 const struct ia_css_shading_table *sc_config)
1141{
1142 struct ia_css_host_data *isp_sc_tbl;
1143
1144 IA_CSS_ENTER_PRIVATE("");
1145
1146 if (!sc_config) {
1147 IA_CSS_LEAVE_PRIVATE("void");
1148 return 0;
1149 }
1150
1151 isp_sc_tbl = ia_css_params_alloc_convert_sctbl(stage, sc_config);
1152 if (!isp_sc_tbl) {
1153 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
1154 return -ENOMEM;
1155 }
1156
1157 ia_css_params_store_ia_css_host_data(sc_tbl, isp_sc_tbl);
1158 ia_css_host_data_free(isp_sc_tbl);
1159
1160 IA_CSS_LEAVE_PRIVATE("void");
1161
1162 return 0;
1163}
1164
1165static void
1166sh_css_enable_pipeline(const struct ia_css_binary *binary)
1167{
1168 if (!binary)
1169 return;
1170
1171 IA_CSS_ENTER_PRIVATE("");
1172
1173 ia_css_isp_param_enable_pipeline(&binary->mem_params);
1174
1175 IA_CSS_LEAVE_PRIVATE("void");
1176}
1177
1178static int
1179ia_css_process_zoom_and_motion(
1180 struct ia_css_isp_parameters *params,
1181 const struct ia_css_pipeline_stage *first_stage)
1182{
1183
1184 const struct ia_css_pipeline_stage *stage;
1185 int err = 0;
1186 struct ia_css_resolution pipe_in_res;
1187
1188 pipe_in_res.width = 0;
1189 pipe_in_res.height = 0;
1190
1191 assert(params);
1192
1193 IA_CSS_ENTER_PRIVATE("");
1194
1195
1196 for (stage = first_stage; stage; stage = stage->next) {
1197 struct ia_css_binary *binary;
1198
1199
1200
1201
1202 static struct ia_css_binary tmp_binary;
1203
1204 const struct ia_css_binary_xinfo *info = NULL;
1205
1206 binary = stage->binary;
1207 if (binary) {
1208 info = binary->info;
1209 } else {
1210 const struct sh_css_binary_args *args = &stage->args;
1211 const struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS] = {NULL};
1212
1213 if (args->out_frame[0])
1214 out_infos[0] = &args->out_frame[0]->info;
1215 info = &stage->firmware->info.isp;
1216 ia_css_binary_fill_info(info, false, false,
1217 ATOMISP_INPUT_FORMAT_RAW_10,
1218 args->in_frame ? &args->in_frame->info : NULL,
1219 NULL,
1220 out_infos,
1221 args->out_vf_frame ? &args->out_vf_frame->info
1222 : NULL,
1223 &tmp_binary,
1224 NULL,
1225 -1, true);
1226 binary = &tmp_binary;
1227 binary->info = info;
1228 }
1229
1230 if (stage == first_stage) {
1231
1232 pipe_in_res = binary->effective_in_frame_res;
1233 }
1234
1235 assert(stage->stage_num < SH_CSS_MAX_STAGES);
1236 if (params->dz_config.zoom_region.resolution.width == 0 &&
1237 params->dz_config.zoom_region.resolution.height == 0) {
1238 sh_css_update_uds_and_crop_info(
1239 &info->sp,
1240 &binary->in_frame_info,
1241 &binary->out_frame_info[0],
1242 &binary->dvs_envelope,
1243 ¶ms->dz_config,
1244 ¶ms->motion_config,
1245 ¶ms->uds[stage->stage_num].uds,
1246 ¶ms->uds[stage->stage_num].crop_pos,
1247 stage->enable_zoom);
1248 } else {
1249 err = sh_css_update_uds_and_crop_info_based_on_zoom_region(
1250 &info->sp,
1251 &binary->in_frame_info,
1252 &binary->out_frame_info[0],
1253 &binary->dvs_envelope,
1254 ¶ms->dz_config,
1255 ¶ms->motion_config,
1256 ¶ms->uds[stage->stage_num].uds,
1257 ¶ms->uds[stage->stage_num].crop_pos,
1258 pipe_in_res,
1259 stage->enable_zoom);
1260 if (err)
1261 return err;
1262 }
1263 }
1264 params->isp_params_changed = true;
1265
1266 IA_CSS_LEAVE_PRIVATE("void");
1267 return err;
1268}
1269
1270static void
1271sh_css_set_gamma_table(struct ia_css_isp_parameters *params,
1272 const struct ia_css_gamma_table *table)
1273{
1274 if (!table)
1275 return;
1276 IA_CSS_ENTER_PRIVATE("table=%p", table);
1277
1278 assert(params);
1279 params->gc_table = *table;
1280 params->config_changed[IA_CSS_GC_ID] = true;
1281
1282 IA_CSS_LEAVE_PRIVATE("void");
1283}
1284
1285static void
1286sh_css_get_gamma_table(const struct ia_css_isp_parameters *params,
1287 struct ia_css_gamma_table *table)
1288{
1289 if (!table)
1290 return;
1291 IA_CSS_ENTER_PRIVATE("table=%p", table);
1292
1293 assert(params);
1294 *table = params->gc_table;
1295
1296 IA_CSS_LEAVE_PRIVATE("void");
1297}
1298
1299static void
1300sh_css_set_ctc_table(struct ia_css_isp_parameters *params,
1301 const struct ia_css_ctc_table *table)
1302{
1303 if (!table)
1304 return;
1305
1306 IA_CSS_ENTER_PRIVATE("table=%p", table);
1307
1308 assert(params);
1309 params->ctc_table = *table;
1310 params->config_changed[IA_CSS_CTC_ID] = true;
1311
1312 IA_CSS_LEAVE_PRIVATE("void");
1313}
1314
1315static void
1316sh_css_get_ctc_table(const struct ia_css_isp_parameters *params,
1317 struct ia_css_ctc_table *table)
1318{
1319 if (!table)
1320 return;
1321
1322 IA_CSS_ENTER_PRIVATE("table=%p", table);
1323
1324 assert(params);
1325 *table = params->ctc_table;
1326
1327 IA_CSS_LEAVE_PRIVATE("void");
1328}
1329
1330static void
1331sh_css_set_macc_table(struct ia_css_isp_parameters *params,
1332 const struct ia_css_macc_table *table)
1333{
1334 if (!table)
1335 return;
1336
1337 IA_CSS_ENTER_PRIVATE("table=%p", table);
1338
1339 assert(params);
1340 params->macc_table = *table;
1341 params->config_changed[IA_CSS_MACC_ID] = true;
1342
1343 IA_CSS_LEAVE_PRIVATE("void");
1344}
1345
1346static void
1347sh_css_get_macc_table(const struct ia_css_isp_parameters *params,
1348 struct ia_css_macc_table *table)
1349{
1350 if (!table)
1351 return;
1352
1353 IA_CSS_ENTER_PRIVATE("table=%p", table);
1354
1355 assert(params);
1356 *table = params->macc_table;
1357
1358 IA_CSS_LEAVE_PRIVATE("void");
1359}
1360
1361void ia_css_morph_table_free(
1362 struct ia_css_morph_table *me)
1363{
1364 unsigned int i;
1365
1366 if (!me)
1367 return;
1368
1369 IA_CSS_ENTER("");
1370
1371 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1372 if (me->coordinates_x[i]) {
1373 kvfree(me->coordinates_x[i]);
1374 me->coordinates_x[i] = NULL;
1375 }
1376 if (me->coordinates_y[i]) {
1377 kvfree(me->coordinates_y[i]);
1378 me->coordinates_y[i] = NULL;
1379 }
1380 }
1381
1382 kvfree(me);
1383 IA_CSS_LEAVE("void");
1384}
1385
1386struct ia_css_morph_table *ia_css_morph_table_allocate(
1387 unsigned int width,
1388 unsigned int height)
1389{
1390 unsigned int i;
1391 struct ia_css_morph_table *me;
1392
1393 IA_CSS_ENTER("");
1394
1395 me = kvmalloc(sizeof(*me), GFP_KERNEL);
1396 if (!me) {
1397 IA_CSS_ERROR("out of memory");
1398 return me;
1399 }
1400
1401 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1402 me->coordinates_x[i] = NULL;
1403 me->coordinates_y[i] = NULL;
1404 }
1405
1406 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1407 me->coordinates_x[i] = kvmalloc(height * width *
1408 sizeof(*me->coordinates_x[i]),
1409 GFP_KERNEL);
1410 me->coordinates_y[i] = kvmalloc(height * width *
1411 sizeof(*me->coordinates_y[i]),
1412 GFP_KERNEL);
1413
1414 if ((!me->coordinates_x[i]) ||
1415 (!me->coordinates_y[i])) {
1416 ia_css_morph_table_free(me);
1417 me = NULL;
1418 return me;
1419 }
1420 }
1421 me->width = width;
1422 me->height = height;
1423 IA_CSS_LEAVE("");
1424 return me;
1425}
1426
1427static int sh_css_params_default_morph_table(
1428 struct ia_css_morph_table **table,
1429 const struct ia_css_binary *binary)
1430{
1431
1432 unsigned int i, j, k, step, width, height;
1433 short start_x[IA_CSS_MORPH_TABLE_NUM_PLANES] = { -8, 0, -8, 0, 0, -8 },
1434 start_y[IA_CSS_MORPH_TABLE_NUM_PLANES] = { 0, 0, -8, -8, -8, 0 };
1435 struct ia_css_morph_table *tab;
1436
1437 assert(table);
1438 assert(binary);
1439
1440 IA_CSS_ENTER_PRIVATE("");
1441
1442 step = (ISP_VEC_NELEMS / 16) * 128;
1443 width = binary->morph_tbl_width;
1444 height = binary->morph_tbl_height;
1445
1446 tab = ia_css_morph_table_allocate(width, height);
1447 if (!tab)
1448 return -ENOMEM;
1449
1450 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
1451 short val_y = start_y[i];
1452
1453 for (j = 0; j < height; j++) {
1454 short val_x = start_x[i];
1455 unsigned short *x_ptr, *y_ptr;
1456
1457 x_ptr = &tab->coordinates_x[i][j * width];
1458 y_ptr = &tab->coordinates_y[i][j * width];
1459 for (k = 0; k < width;
1460 k++, x_ptr++, y_ptr++, val_x += (short)step) {
1461 if (k == 0)
1462 *x_ptr = 0;
1463 else if (k == width - 1)
1464 *x_ptr = val_x + 2 * start_x[i];
1465 else
1466 *x_ptr = val_x;
1467 if (j == 0)
1468 *y_ptr = 0;
1469 else
1470 *y_ptr = val_y;
1471 }
1472 val_y += (short)step;
1473 }
1474 }
1475 *table = tab;
1476
1477 IA_CSS_LEAVE_ERR_PRIVATE(0);
1478
1479 return 0;
1480}
1481
1482static void
1483sh_css_set_morph_table(struct ia_css_isp_parameters *params,
1484 const struct ia_css_morph_table *table)
1485{
1486 if (!table)
1487 return;
1488
1489 IA_CSS_ENTER_PRIVATE("table=%p", table);
1490
1491 assert(params);
1492 if (table->enable == false)
1493 table = NULL;
1494 params->morph_table = table;
1495 params->morph_table_changed = true;
1496 IA_CSS_LEAVE_PRIVATE("void");
1497}
1498
1499void
1500ia_css_translate_3a_statistics(
1501 struct ia_css_3a_statistics *host_stats,
1502 const struct ia_css_isp_3a_statistics_map *isp_stats)
1503{
1504 IA_CSS_ENTER("");
1505 if (host_stats->grid.use_dmem) {
1506 IA_CSS_LOG("3A: DMEM");
1507 ia_css_s3a_dmem_decode(host_stats, isp_stats->dmem_stats);
1508 } else {
1509 IA_CSS_LOG("3A: VMEM");
1510 ia_css_s3a_vmem_decode(host_stats, isp_stats->vmem_stats_hi,
1511 isp_stats->vmem_stats_lo);
1512 }
1513#if !defined(HAS_NO_HMEM)
1514 IA_CSS_LOG("3A: HMEM");
1515 ia_css_s3a_hmem_decode(host_stats, isp_stats->hmem_stats);
1516#endif
1517
1518 IA_CSS_LEAVE("void");
1519}
1520
1521void
1522ia_css_isp_3a_statistics_map_free(struct ia_css_isp_3a_statistics_map *me)
1523{
1524 if (me) {
1525 if (me->data_allocated) {
1526 kvfree(me->data_ptr);
1527 me->data_ptr = NULL;
1528 me->data_allocated = false;
1529 }
1530 kvfree(me);
1531 }
1532}
1533
1534struct ia_css_isp_3a_statistics_map *
1535ia_css_isp_3a_statistics_map_allocate(
1536 const struct ia_css_isp_3a_statistics *isp_stats,
1537 void *data_ptr)
1538{
1539 struct ia_css_isp_3a_statistics_map *me;
1540
1541
1542 char *base_ptr;
1543
1544 me = kvmalloc(sizeof(*me), GFP_KERNEL);
1545 if (!me) {
1546 IA_CSS_LEAVE("cannot allocate memory");
1547 goto err;
1548 }
1549
1550 me->data_ptr = data_ptr;
1551 me->data_allocated = !data_ptr;
1552 if (!data_ptr) {
1553 me->data_ptr = kvmalloc(isp_stats->size, GFP_KERNEL);
1554 if (!me->data_ptr) {
1555 IA_CSS_LEAVE("cannot allocate memory");
1556 goto err;
1557 }
1558 }
1559 base_ptr = me->data_ptr;
1560
1561 me->size = isp_stats->size;
1562
1563
1564 me->dmem_stats = (void *)base_ptr;
1565 me->vmem_stats_hi = (void *)(base_ptr + isp_stats->dmem_size);
1566 me->vmem_stats_lo = (void *)(base_ptr + isp_stats->dmem_size +
1567 isp_stats->vmem_size);
1568 me->hmem_stats = (void *)(base_ptr + isp_stats->dmem_size +
1569 2 * isp_stats->vmem_size);
1570
1571 IA_CSS_LEAVE("map=%p", me);
1572 return me;
1573
1574err:
1575 kvfree(me);
1576 return NULL;
1577}
1578
1579int
1580ia_css_get_3a_statistics(struct ia_css_3a_statistics *host_stats,
1581 const struct ia_css_isp_3a_statistics *isp_stats)
1582{
1583 struct ia_css_isp_3a_statistics_map *map;
1584 int ret = 0;
1585
1586 IA_CSS_ENTER("host_stats=%p, isp_stats=%p", host_stats, isp_stats);
1587
1588 assert(host_stats);
1589 assert(isp_stats);
1590
1591 map = ia_css_isp_3a_statistics_map_allocate(isp_stats, NULL);
1592 if (map) {
1593 hmm_load(isp_stats->data_ptr, map->data_ptr, isp_stats->size);
1594 ia_css_translate_3a_statistics(host_stats, map);
1595 ia_css_isp_3a_statistics_map_free(map);
1596 } else {
1597 IA_CSS_ERROR("out of memory");
1598 ret = -ENOMEM;
1599 }
1600
1601 IA_CSS_LEAVE_ERR(ret);
1602 return ret;
1603}
1604
1605
1606
1607
1608static void
1609ia_css_set_param_exceptions(const struct ia_css_pipe *pipe,
1610 struct ia_css_isp_parameters *params)
1611{
1612 assert(params);
1613
1614
1615 params->dp_config.gr = params->wb_config.gr;
1616 params->dp_config.r = params->wb_config.r;
1617 params->dp_config.b = params->wb_config.b;
1618 params->dp_config.gb = params->wb_config.gb;
1619
1620 if (IS_ISP2401) {
1621 assert(pipe);
1622 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1623
1624 if (pipe->mode < IA_CSS_PIPE_ID_NUM) {
1625 params->pipe_dp_config[pipe->mode].gr = params->wb_config.gr;
1626 params->pipe_dp_config[pipe->mode].r = params->wb_config.r;
1627 params->pipe_dp_config[pipe->mode].b = params->wb_config.b;
1628 params->pipe_dp_config[pipe->mode].gb = params->wb_config.gb;
1629 }
1630 }
1631}
1632
1633
1634static void
1635sh_css_set_dp_config(const struct ia_css_pipe *pipe,
1636 struct ia_css_isp_parameters *params,
1637 const struct ia_css_dp_config *config)
1638{
1639 if (!config)
1640 return;
1641
1642 assert(params);
1643 assert(pipe);
1644 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1645
1646 IA_CSS_ENTER_PRIVATE("config=%p", config);
1647 ia_css_dp_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1648 if (pipe->mode < IA_CSS_PIPE_ID_NUM) {
1649 params->pipe_dp_config[pipe->mode] = *config;
1650 params->pipe_dpc_config_changed[pipe->mode] = true;
1651 }
1652 IA_CSS_LEAVE_PRIVATE("void");
1653}
1654
1655static void
1656sh_css_get_dp_config(const struct ia_css_pipe *pipe,
1657 const struct ia_css_isp_parameters *params,
1658 struct ia_css_dp_config *config)
1659{
1660 if (!config)
1661 return;
1662
1663 assert(params);
1664 assert(pipe);
1665 IA_CSS_ENTER_PRIVATE("config=%p", config);
1666
1667 *config = params->pipe_dp_config[pipe->mode];
1668
1669 IA_CSS_LEAVE_PRIVATE("void");
1670}
1671
1672static void
1673sh_css_set_nr_config(struct ia_css_isp_parameters *params,
1674 const struct ia_css_nr_config *config)
1675{
1676 if (!config)
1677 return;
1678 assert(params);
1679
1680 IA_CSS_ENTER_PRIVATE("config=%p", config);
1681
1682 ia_css_nr_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1683 params->nr_config = *config;
1684 params->yee_config.nr = *config;
1685 params->config_changed[IA_CSS_NR_ID] = true;
1686 params->config_changed[IA_CSS_YEE_ID] = true;
1687 params->config_changed[IA_CSS_BNR_ID] = true;
1688
1689 IA_CSS_LEAVE_PRIVATE("void");
1690}
1691
1692static void
1693sh_css_set_ee_config(struct ia_css_isp_parameters *params,
1694 const struct ia_css_ee_config *config)
1695{
1696 if (!config)
1697 return;
1698 assert(params);
1699
1700 IA_CSS_ENTER_PRIVATE("config=%p", config);
1701 ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1702
1703 params->ee_config = *config;
1704 params->yee_config.ee = *config;
1705 params->config_changed[IA_CSS_YEE_ID] = true;
1706
1707 IA_CSS_LEAVE_PRIVATE("void");
1708}
1709
1710static void
1711sh_css_get_ee_config(const struct ia_css_isp_parameters *params,
1712 struct ia_css_ee_config *config)
1713{
1714 if (!config)
1715 return;
1716
1717 IA_CSS_ENTER_PRIVATE("config=%p", config);
1718
1719 assert(params);
1720 *config = params->ee_config;
1721
1722 ia_css_ee_debug_dtrace(config, IA_CSS_DEBUG_TRACE_PRIVATE);
1723 IA_CSS_LEAVE_PRIVATE("void");
1724}
1725
1726static void
1727sh_css_set_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
1728 struct ia_css_isp_parameters *params,
1729 const struct ia_css_dvs_6axis_config *dvs_config)
1730{
1731 if (!dvs_config)
1732 return;
1733 assert(params);
1734 assert(pipe);
1735 assert(dvs_config->height_y == dvs_config->height_uv);
1736 assert((dvs_config->width_y - 1) == 2 * (dvs_config->width_uv - 1));
1737 assert(pipe->mode < IA_CSS_PIPE_ID_NUM);
1738
1739 IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
1740
1741 copy_dvs_6axis_table(params->pipe_dvs_6axis_config[pipe->mode], dvs_config);
1742
1743#if !defined(HAS_NO_DVS_6AXIS_CONFIG_UPDATE)
1744 params->pipe_dvs_6axis_config_changed[pipe->mode] = true;
1745#endif
1746
1747 IA_CSS_LEAVE_PRIVATE("void");
1748}
1749
1750static void
1751sh_css_get_pipe_dvs_6axis_config(const struct ia_css_pipe *pipe,
1752 const struct ia_css_isp_parameters *params,
1753 struct ia_css_dvs_6axis_config *dvs_config)
1754{
1755 if (!dvs_config)
1756 return;
1757 assert(params);
1758 assert(pipe);
1759 assert(dvs_config->height_y == dvs_config->height_uv);
1760 assert((dvs_config->width_y - 1) == 2 * dvs_config->width_uv - 1);
1761
1762 IA_CSS_ENTER_PRIVATE("dvs_config=%p", dvs_config);
1763
1764 if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
1765 (dvs_config->width_y == params->pipe_dvs_6axis_config[pipe->mode]->width_y) &&
1766 (dvs_config->height_y == params->pipe_dvs_6axis_config[pipe->mode]->height_y) &&
1767 (dvs_config->width_uv == params->pipe_dvs_6axis_config[pipe->mode]->width_uv) &&
1768 (dvs_config->height_uv == params->pipe_dvs_6axis_config[pipe->mode]->height_uv)
1769 &&
1770 dvs_config->xcoords_y &&
1771 dvs_config->ycoords_y &&
1772 dvs_config->xcoords_uv &&
1773 dvs_config->ycoords_uv) {
1774 copy_dvs_6axis_table(dvs_config, params->pipe_dvs_6axis_config[pipe->mode]);
1775 }
1776
1777 IA_CSS_LEAVE_PRIVATE("void");
1778}
1779
1780static void
1781sh_css_set_baa_config(struct ia_css_isp_parameters *params,
1782 const struct ia_css_aa_config *config)
1783{
1784 if (!config)
1785 return;
1786 assert(params);
1787
1788 IA_CSS_ENTER_PRIVATE("config=%p", config);
1789
1790 params->bds_config = *config;
1791 params->config_changed[IA_CSS_BDS_ID] = true;
1792
1793 IA_CSS_LEAVE_PRIVATE("void");
1794}
1795
1796static void
1797sh_css_get_baa_config(const struct ia_css_isp_parameters *params,
1798 struct ia_css_aa_config *config)
1799{
1800 if (!config)
1801 return;
1802 assert(params);
1803
1804 IA_CSS_ENTER_PRIVATE("config=%p", config);
1805
1806 *config = params->bds_config;
1807
1808 IA_CSS_LEAVE_PRIVATE("void");
1809}
1810
1811static void
1812sh_css_set_dz_config(struct ia_css_isp_parameters *params,
1813 const struct ia_css_dz_config *config)
1814{
1815 if (!config)
1816 return;
1817 assert(params);
1818
1819 IA_CSS_ENTER_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
1820
1821 assert(config->dx <= HRT_GDC_N);
1822 assert(config->dy <= HRT_GDC_N);
1823
1824 params->dz_config = *config;
1825 params->dz_config_changed = true;
1826
1827 params->isp_params_changed = true;
1828
1829 IA_CSS_LEAVE_PRIVATE("void");
1830}
1831
1832static void
1833sh_css_get_dz_config(const struct ia_css_isp_parameters *params,
1834 struct ia_css_dz_config *config)
1835{
1836 if (!config)
1837 return;
1838 assert(params);
1839
1840 IA_CSS_ENTER_PRIVATE("config=%p", config);
1841
1842 *config = params->dz_config;
1843
1844 IA_CSS_LEAVE_PRIVATE("dx=%d, dy=%d", config->dx, config->dy);
1845}
1846
1847static void
1848sh_css_set_motion_vector(struct ia_css_isp_parameters *params,
1849 const struct ia_css_vector *motion)
1850{
1851 if (!motion)
1852 return;
1853 assert(params);
1854
1855 IA_CSS_ENTER_PRIVATE("x=%d, y=%d", motion->x, motion->y);
1856
1857 params->motion_config = *motion;
1858
1859 params->motion_config_changed = true;
1860 params->isp_params_changed = true;
1861
1862 IA_CSS_LEAVE_PRIVATE("void");
1863}
1864
1865static void
1866sh_css_get_motion_vector(const struct ia_css_isp_parameters *params,
1867 struct ia_css_vector *motion)
1868{
1869 if (!motion)
1870 return;
1871 assert(params);
1872
1873 IA_CSS_ENTER_PRIVATE("motion=%p", motion);
1874
1875 *motion = params->motion_config;
1876
1877 IA_CSS_LEAVE_PRIVATE("x=%d, y=%d", motion->x, motion->y);
1878}
1879
1880struct ia_css_isp_config *
1881sh_css_pipe_isp_config_get(struct ia_css_pipe *pipe)
1882{
1883 if (!pipe) {
1884 IA_CSS_ERROR("pipe=%p", NULL);
1885 return NULL;
1886 }
1887 return pipe->config.p_isp_config;
1888}
1889
1890int
1891ia_css_stream_set_isp_config(
1892 struct ia_css_stream *stream,
1893 const struct ia_css_isp_config *config)
1894{
1895 return ia_css_stream_set_isp_config_on_pipe(stream, config, NULL);
1896}
1897
1898int
1899ia_css_stream_set_isp_config_on_pipe(
1900 struct ia_css_stream *stream,
1901 const struct ia_css_isp_config *config,
1902 struct ia_css_pipe *pipe)
1903{
1904 int err = 0;
1905
1906 if ((!stream) || (!config))
1907 return -EINVAL;
1908
1909 IA_CSS_ENTER("stream=%p, config=%p, pipe=%p", stream, config, pipe);
1910
1911#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1912 if (config->output_frame)
1913 err = sh_css_set_per_frame_isp_config_on_pipe(stream, config, pipe);
1914 else
1915#endif
1916 err = sh_css_set_global_isp_config_on_pipe(stream->pipes[0], config, pipe);
1917
1918 IA_CSS_LEAVE_ERR(err);
1919 return err;
1920}
1921
1922int
1923ia_css_pipe_set_isp_config(struct ia_css_pipe *pipe,
1924 struct ia_css_isp_config *config)
1925{
1926 struct ia_css_pipe *pipe_in = pipe;
1927 int err = 0;
1928
1929 IA_CSS_ENTER("pipe=%p", pipe);
1930
1931 if ((!pipe) || (!pipe->stream))
1932 return -EINVAL;
1933
1934 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "config=%p\n", config);
1935
1936#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1937 if (config->output_frame)
1938 err = sh_css_set_per_frame_isp_config_on_pipe(pipe->stream, config, pipe);
1939 else
1940#endif
1941 err = sh_css_set_global_isp_config_on_pipe(pipe, config, pipe_in);
1942 IA_CSS_LEAVE_ERR(err);
1943 return err;
1944}
1945
1946static int
1947sh_css_set_global_isp_config_on_pipe(
1948 struct ia_css_pipe *curr_pipe,
1949 const struct ia_css_isp_config *config,
1950 struct ia_css_pipe *pipe)
1951{
1952 int err = 0;
1953 int err1 = 0;
1954 int err2 = 0;
1955
1956 IA_CSS_ENTER_PRIVATE("stream=%p, config=%p, pipe=%p", curr_pipe, config, pipe);
1957
1958 err1 = sh_css_init_isp_params_from_config(curr_pipe, curr_pipe->stream->isp_params_configs, config, pipe);
1959
1960
1961 err2 = sh_css_param_update_isp_params(curr_pipe, curr_pipe->stream->isp_params_configs, sh_css_sp_is_running(), pipe);
1962
1963
1964
1965
1966
1967
1968
1969 err = (err1 != 0) ? err1 : ((err2 != 0) ? err2 : err);
1970
1971 IA_CSS_LEAVE_ERR_PRIVATE(err);
1972 return err;
1973}
1974
1975#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
1976static int
1977sh_css_set_per_frame_isp_config_on_pipe(
1978 struct ia_css_stream *stream,
1979 const struct ia_css_isp_config *config,
1980 struct ia_css_pipe *pipe)
1981{
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 err = -EINVAL;
1997 goto exit;
1998 }
1999
2000
2001
2002
2003 if (!stream->per_frame_isp_params_configs) {
2004 err = sh_css_create_isp_params(stream,
2005 &stream->per_frame_isp_params_configs);
2006 if (err)
2007 goto exit;
2008 per_frame_config_created = true;
2009 }
2010
2011 params = stream->per_frame_isp_params_configs;
2012
2013
2014 if (!sh_css_init_isp_params_from_global(stream, params, false, pipe)) {
2015 err1 = -EINVAL;
2016 }
2017
2018 err2 = sh_css_init_isp_params_from_config(stream->pipes[0], params, config, pipe);
2019
2020 if (per_frame_config_created) {
2021 ddr_ptrs = ¶ms->ddr_ptrs;
2022 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2023
2024 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2025 ref_sh_css_ddr_address_map(ddr_ptrs, ¶ms->pipe_ddr_ptrs[i]);
2026 params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
2027 }
2028 }
2029
2030
2031 err3 = sh_css_param_update_isp_params(stream->pipes[0], params, sh_css_sp_is_running(), pipe);
2032
2033
2034
2035
2036
2037
2038 err = (err1 != 0) ? err1 :
2039 (err2 != 0) ? err2 :
2040 (err3 != 0) ? err3 : err;
2041exit:
2042 IA_CSS_LEAVE_ERR_PRIVATE(err);
2043 return err;
2044}
2045#endif
2046
2047static int
2048sh_css_init_isp_params_from_config(struct ia_css_pipe *pipe,
2049 struct ia_css_isp_parameters *params,
2050 const struct ia_css_isp_config *config,
2051 struct ia_css_pipe *pipe_in)
2052{
2053 int err = 0;
2054 bool is_dp_10bpp = true;
2055
2056 assert(pipe);
2057
2058 IA_CSS_ENTER_PRIVATE("pipe=%p, config=%p, params=%p", pipe, config, params);
2059
2060 ia_css_set_configs(params, config);
2061
2062 sh_css_set_nr_config(params, config->nr_config);
2063 sh_css_set_ee_config(params, config->ee_config);
2064 sh_css_set_baa_config(params, config->baa_config);
2065 if ((pipe->mode < IA_CSS_PIPE_ID_NUM) &&
2066 (params->pipe_dvs_6axis_config[pipe->mode]))
2067 sh_css_set_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
2068 sh_css_set_dz_config(params, config->dz_config);
2069 sh_css_set_motion_vector(params, config->motion_vector);
2070 sh_css_update_shading_table_status(pipe_in, params);
2071 sh_css_set_shading_table(pipe->stream, params, config->shading_table);
2072 sh_css_set_morph_table(params, config->morph_table);
2073 sh_css_set_macc_table(params, config->macc_table);
2074 sh_css_set_gamma_table(params, config->gamma_table);
2075 sh_css_set_ctc_table(params, config->ctc_table);
2076
2077 sh_css_set_shading_settings(params, config->shading_settings);
2078
2079
2080 params->dis_coef_table_changed = (config->dvs_coefs);
2081 params->dvs2_coef_table_changed = (config->dvs2_coefs);
2082
2083 params->output_frame = config->output_frame;
2084 params->isp_parameters_id = config->isp_config_id;
2085
2086
2087
2088
2089
2090
2091 if (IS_ISP2401) {
2092 sh_css_set_dp_config(pipe, params, config->dp_config);
2093 ia_css_set_param_exceptions(pipe, params);
2094 }
2095
2096 if (0 ==
2097 sh_css_select_dp_10bpp_config(pipe, &is_dp_10bpp)) {
2098
2099
2100
2101
2102 if (is_dp_10bpp) {
2103 err = -EINVAL;
2104 }
2105 } else {
2106 err = -EINVAL;
2107 goto exit;
2108 }
2109
2110 if (!IS_ISP2401)
2111 ia_css_set_param_exceptions(pipe, params);
2112
2113exit:
2114 IA_CSS_LEAVE_ERR_PRIVATE(err);
2115 return err;
2116}
2117
2118void
2119ia_css_stream_get_isp_config(
2120 const struct ia_css_stream *stream,
2121 struct ia_css_isp_config *config)
2122{
2123 IA_CSS_ENTER("void");
2124 ia_css_pipe_get_isp_config(stream->pipes[0], config);
2125 IA_CSS_LEAVE("void");
2126}
2127
2128void
2129ia_css_pipe_get_isp_config(struct ia_css_pipe *pipe,
2130 struct ia_css_isp_config *config)
2131{
2132 struct ia_css_isp_parameters *params = NULL;
2133
2134 assert(config);
2135
2136 IA_CSS_ENTER("config=%p", config);
2137
2138 params = pipe->stream->isp_params_configs;
2139 assert(params);
2140
2141 ia_css_get_configs(params, config);
2142
2143 sh_css_get_ee_config(params, config->ee_config);
2144 sh_css_get_baa_config(params, config->baa_config);
2145 sh_css_get_pipe_dvs_6axis_config(pipe, params, config->dvs_6axis_config);
2146 sh_css_get_dp_config(pipe, params, config->dp_config);
2147 sh_css_get_macc_table(params, config->macc_table);
2148 sh_css_get_gamma_table(params, config->gamma_table);
2149 sh_css_get_ctc_table(params, config->ctc_table);
2150 sh_css_get_dz_config(params, config->dz_config);
2151 sh_css_get_motion_vector(params, config->motion_vector);
2152
2153 sh_css_get_shading_settings(params, config->shading_settings);
2154
2155
2156 config->output_frame = params->output_frame;
2157 config->isp_config_id = params->isp_parameters_id;
2158
2159 IA_CSS_LEAVE("void");
2160}
2161
2162
2163
2164
2165
2166
2167static bool realloc_isp_css_mm_buf(
2168 ia_css_ptr *curr_buf,
2169 size_t *curr_size,
2170 size_t needed_size,
2171 bool force,
2172 int *err,
2173 uint16_t mmgr_attribute)
2174{
2175 s32 id;
2176
2177 *err = 0;
2178
2179
2180
2181 IA_CSS_ENTER_PRIVATE("void");
2182
2183 if (!force && *curr_size >= needed_size) {
2184 IA_CSS_LEAVE_PRIVATE("false");
2185 return false;
2186 }
2187
2188 if (*curr_size == needed_size && ia_css_refcount_is_single(*curr_buf)) {
2189 IA_CSS_LEAVE_PRIVATE("false");
2190 return false;
2191 }
2192
2193 id = IA_CSS_REFCOUNT_PARAM_BUFFER;
2194 ia_css_refcount_decrement(id, *curr_buf);
2195 *curr_buf = ia_css_refcount_increment(id, hmm_alloc(needed_size,
2196 HMM_BO_PRIVATE, 0,
2197 NULL,
2198 mmgr_attribute));
2199
2200 if (!*curr_buf) {
2201 *err = -ENOMEM;
2202 *curr_size = 0;
2203 } else {
2204 *curr_size = needed_size;
2205 }
2206 IA_CSS_LEAVE_PRIVATE("true");
2207 return true;
2208}
2209
2210static bool reallocate_buffer(
2211 ia_css_ptr *curr_buf,
2212 size_t *curr_size,
2213 size_t needed_size,
2214 bool force,
2215 int *err)
2216{
2217 bool ret;
2218
2219 IA_CSS_ENTER_PRIVATE("void");
2220
2221 ret = realloc_isp_css_mm_buf(curr_buf,
2222 curr_size, needed_size, force, err, 0);
2223
2224 IA_CSS_LEAVE_PRIVATE("ret=%d", ret);
2225 return ret;
2226}
2227
2228struct ia_css_isp_3a_statistics *
2229ia_css_isp_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
2230{
2231 struct ia_css_isp_3a_statistics *me;
2232
2233 IA_CSS_ENTER("grid=%p", grid);
2234
2235 assert(grid);
2236
2237
2238 if (!grid->enable)
2239 return NULL;
2240
2241 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
2242 if (!me)
2243 goto err;
2244
2245 if (grid->use_dmem) {
2246 me->dmem_size = sizeof(struct ia_css_3a_output) *
2247 grid->aligned_width *
2248 grid->aligned_height;
2249 } else {
2250 me->vmem_size = ISP_S3ATBL_HI_LO_STRIDE_BYTES *
2251 grid->aligned_height;
2252 }
2253#if !defined(HAS_NO_HMEM)
2254 me->hmem_size = sizeof_hmem(HMEM0_ID);
2255#endif
2256
2257
2258 me->dmem_size = CEIL_MUL(me->dmem_size, HIVE_ISP_DDR_WORD_BYTES);
2259 me->vmem_size = CEIL_MUL(me->vmem_size, HIVE_ISP_DDR_WORD_BYTES);
2260 me->hmem_size = CEIL_MUL(me->hmem_size, HIVE_ISP_DDR_WORD_BYTES);
2261
2262 me->size = me->dmem_size + me->vmem_size * 2 + me->hmem_size;
2263 me->data_ptr = hmm_alloc(me->size, HMM_BO_PRIVATE, 0, NULL, 0);
2264 if (me->data_ptr == mmgr_NULL) {
2265 kvfree(me);
2266 me = NULL;
2267 goto err;
2268 }
2269 if (me->dmem_size)
2270 me->data.dmem.s3a_tbl = me->data_ptr;
2271 if (me->vmem_size) {
2272 me->data.vmem.s3a_tbl_hi = me->data_ptr + me->dmem_size;
2273 me->data.vmem.s3a_tbl_lo = me->data_ptr + me->dmem_size + me->vmem_size;
2274 }
2275 if (me->hmem_size)
2276 me->data_hmem.rgby_tbl = me->data_ptr + me->dmem_size + 2 * me->vmem_size;
2277
2278err:
2279 IA_CSS_LEAVE("return=%p", me);
2280 return me;
2281}
2282
2283void
2284ia_css_isp_3a_statistics_free(struct ia_css_isp_3a_statistics *me)
2285{
2286 if (me) {
2287 hmm_free(me->data_ptr);
2288 kvfree(me);
2289 }
2290}
2291
2292struct ia_css_isp_skc_dvs_statistics *ia_css_skc_dvs_statistics_allocate(void)
2293{
2294 return NULL;
2295}
2296
2297struct ia_css_metadata *
2298ia_css_metadata_allocate(const struct ia_css_metadata_info *metadata_info)
2299{
2300 struct ia_css_metadata *md = NULL;
2301
2302 IA_CSS_ENTER("");
2303
2304 if (metadata_info->size == 0)
2305 return NULL;
2306
2307 md = kvmalloc(sizeof(*md), GFP_KERNEL);
2308 if (!md)
2309 goto error;
2310
2311 md->info = *metadata_info;
2312 md->exp_id = 0;
2313 md->address = hmm_alloc(metadata_info->size, HMM_BO_PRIVATE, 0, NULL, 0);
2314 if (md->address == mmgr_NULL)
2315 goto error;
2316
2317 IA_CSS_LEAVE("return=%p", md);
2318 return md;
2319
2320error:
2321 ia_css_metadata_free(md);
2322 IA_CSS_LEAVE("return=%p", NULL);
2323 return NULL;
2324}
2325
2326void
2327ia_css_metadata_free(struct ia_css_metadata *me)
2328{
2329 if (me) {
2330
2331
2332
2333
2334
2335 IA_CSS_ENTER("me=%p", me);
2336 hmm_free(me->address);
2337 kvfree(me);
2338 IA_CSS_LEAVE("void");
2339 }
2340}
2341
2342void
2343ia_css_metadata_free_multiple(unsigned int num_bufs,
2344 struct ia_css_metadata **bufs)
2345{
2346 unsigned int i;
2347
2348 if (bufs) {
2349 for (i = 0; i < num_bufs; i++)
2350 ia_css_metadata_free(bufs[i]);
2351 }
2352}
2353
2354static unsigned int g_param_buffer_dequeue_count;
2355static unsigned int g_param_buffer_enqueue_count;
2356
2357int
2358ia_css_stream_isp_parameters_init(struct ia_css_stream *stream)
2359{
2360 int err = 0;
2361 unsigned int i;
2362 struct sh_css_ddr_address_map *ddr_ptrs;
2363 struct sh_css_ddr_address_map_size *ddr_ptrs_size;
2364 struct ia_css_isp_parameters *params;
2365
2366 assert(stream);
2367 IA_CSS_ENTER_PRIVATE("void");
2368
2369 if (!stream) {
2370 IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL);
2371 return -EINVAL;
2372 }
2373
2374 g_param_buffer_dequeue_count = 0;
2375 g_param_buffer_enqueue_count = 0;
2376
2377 stream->per_frame_isp_params_configs = NULL;
2378 err = sh_css_create_isp_params(stream,
2379 &stream->isp_params_configs);
2380 if (err)
2381 goto ERR;
2382
2383 params = stream->isp_params_configs;
2384 if (!sh_css_init_isp_params_from_global(stream, params, true, NULL)) {
2385
2386
2387 err = -EINVAL;
2388 }
2389
2390 ddr_ptrs = ¶ms->ddr_ptrs;
2391 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2392
2393
2394 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2395 ref_sh_css_ddr_address_map(ddr_ptrs, ¶ms->pipe_ddr_ptrs[i]);
2396 params->pipe_ddr_ptrs_size[i] = *ddr_ptrs_size;
2397 }
2398
2399ERR:
2400 IA_CSS_LEAVE_ERR_PRIVATE(err);
2401 return err;
2402}
2403
2404static void
2405ia_css_set_sdis_config(
2406 struct ia_css_isp_parameters *params,
2407 const struct ia_css_dvs_coefficients *dvs_coefs)
2408{
2409 ia_css_set_sdis_horicoef_config(params, dvs_coefs);
2410 ia_css_set_sdis_vertcoef_config(params, dvs_coefs);
2411 ia_css_set_sdis_horiproj_config(params, dvs_coefs);
2412 ia_css_set_sdis_vertproj_config(params, dvs_coefs);
2413}
2414
2415static void
2416ia_css_set_sdis2_config(
2417 struct ia_css_isp_parameters *params,
2418 const struct ia_css_dvs2_coefficients *dvs2_coefs)
2419{
2420 ia_css_set_sdis2_horicoef_config(params, dvs2_coefs);
2421 ia_css_set_sdis2_vertcoef_config(params, dvs2_coefs);
2422 ia_css_set_sdis2_horiproj_config(params, dvs2_coefs);
2423 ia_css_set_sdis2_vertproj_config(params, dvs2_coefs);
2424}
2425
2426static int
2427sh_css_create_isp_params(struct ia_css_stream *stream,
2428 struct ia_css_isp_parameters **isp_params_out)
2429{
2430 bool succ = true;
2431 unsigned int i;
2432 struct sh_css_ddr_address_map *ddr_ptrs;
2433 struct sh_css_ddr_address_map_size *ddr_ptrs_size;
2434 int err = 0;
2435 size_t params_size;
2436 struct ia_css_isp_parameters *params =
2437 kvmalloc(sizeof(struct ia_css_isp_parameters), GFP_KERNEL);
2438
2439 if (!params) {
2440 *isp_params_out = NULL;
2441 err = -ENOMEM;
2442 IA_CSS_ERROR("%s:%d error: cannot allocate memory", __FILE__, __LINE__);
2443 IA_CSS_LEAVE_ERR_PRIVATE(err);
2444 return err;
2445 } else {
2446 memset(params, 0, sizeof(struct ia_css_isp_parameters));
2447 }
2448
2449 ddr_ptrs = ¶ms->ddr_ptrs;
2450 ddr_ptrs_size = ¶ms->ddr_ptrs_size;
2451
2452 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2453 memset(¶ms->pipe_ddr_ptrs[i], 0,
2454 sizeof(params->pipe_ddr_ptrs[i]));
2455 memset(¶ms->pipe_ddr_ptrs_size[i], 0,
2456 sizeof(params->pipe_ddr_ptrs_size[i]));
2457 }
2458
2459 memset(ddr_ptrs, 0, sizeof(*ddr_ptrs));
2460 memset(ddr_ptrs_size, 0, sizeof(*ddr_ptrs_size));
2461
2462 params_size = sizeof(params->uds);
2463 ddr_ptrs_size->isp_param = params_size;
2464 ddr_ptrs->isp_param =
2465 ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
2466 hmm_alloc(params_size, HMM_BO_PRIVATE, 0, NULL, 0));
2467 succ &= (ddr_ptrs->isp_param != mmgr_NULL);
2468
2469 ddr_ptrs_size->macc_tbl = sizeof(struct ia_css_macc_table);
2470 ddr_ptrs->macc_tbl =
2471 ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
2472 hmm_alloc(sizeof(struct ia_css_macc_table), HMM_BO_PRIVATE, 0, NULL, 0));
2473 succ &= (ddr_ptrs->macc_tbl != mmgr_NULL);
2474
2475 *isp_params_out = params;
2476 return err;
2477}
2478
2479static bool
2480sh_css_init_isp_params_from_global(struct ia_css_stream *stream,
2481 struct ia_css_isp_parameters *params,
2482 bool use_default_config,
2483 struct ia_css_pipe *pipe_in)
2484{
2485 bool retval = true;
2486 int i = 0;
2487 bool is_dp_10bpp = true;
2488 unsigned int isp_pipe_version = ia_css_pipe_get_isp_pipe_version(
2489 stream->pipes[0]);
2490 struct ia_css_isp_parameters *stream_params = stream->isp_params_configs;
2491
2492 if (!use_default_config && !stream_params) {
2493 retval = false;
2494 goto exit;
2495 }
2496
2497 params->output_frame = NULL;
2498 params->isp_parameters_id = 0;
2499
2500 if (use_default_config) {
2501 ia_css_set_xnr3_config(params, &default_xnr3_config);
2502
2503 sh_css_set_nr_config(params, &default_nr_config);
2504 sh_css_set_ee_config(params, &default_ee_config);
2505 if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
2506 sh_css_set_macc_table(params, &default_macc_table);
2507 else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
2508 sh_css_set_macc_table(params, &default_macc2_table);
2509 sh_css_set_gamma_table(params, &default_gamma_table);
2510 sh_css_set_ctc_table(params, &default_ctc_table);
2511 sh_css_set_baa_config(params, &default_baa_config);
2512 sh_css_set_dz_config(params, &default_dz_config);
2513
2514 sh_css_set_shading_settings(params, &default_shading_settings);
2515
2516
2517 ia_css_set_s3a_config(params, &default_3a_config);
2518 ia_css_set_wb_config(params, &default_wb_config);
2519 ia_css_set_csc_config(params, &default_cc_config);
2520 ia_css_set_tnr_config(params, &default_tnr_config);
2521 ia_css_set_ob_config(params, &default_ob_config);
2522 ia_css_set_dp_config(params, &default_dp_config);
2523
2524 if (!IS_ISP2401) {
2525 ia_css_set_param_exceptions(pipe_in, params);
2526 } else {
2527 for (i = 0; i < stream->num_pipes; i++) {
2528 if (sh_css_select_dp_10bpp_config(stream->pipes[i],
2529 &is_dp_10bpp) == 0) {
2530
2531
2532
2533
2534 if (is_dp_10bpp) {
2535 sh_css_set_dp_config(stream->pipes[i], params, &default_dp_10bpp_config);
2536 } else {
2537 sh_css_set_dp_config(stream->pipes[i], params, &default_dp_config);
2538 }
2539 } else {
2540 retval = false;
2541 goto exit;
2542 }
2543
2544 ia_css_set_param_exceptions(stream->pipes[i], params);
2545 }
2546 }
2547
2548 ia_css_set_de_config(params, &default_de_config);
2549 ia_css_set_gc_config(params, &default_gc_config);
2550 ia_css_set_anr_config(params, &default_anr_config);
2551 ia_css_set_anr2_config(params, &default_anr_thres);
2552 ia_css_set_ce_config(params, &default_ce_config);
2553 ia_css_set_xnr_table_config(params, &default_xnr_table);
2554 ia_css_set_ecd_config(params, &default_ecd_config);
2555 ia_css_set_ynr_config(params, &default_ynr_config);
2556 ia_css_set_fc_config(params, &default_fc_config);
2557 ia_css_set_cnr_config(params, &default_cnr_config);
2558 ia_css_set_macc_config(params, &default_macc_config);
2559 ia_css_set_ctc_config(params, &default_ctc_config);
2560 ia_css_set_aa_config(params, &default_aa_config);
2561 ia_css_set_r_gamma_config(params, &default_r_gamma_table);
2562 ia_css_set_g_gamma_config(params, &default_g_gamma_table);
2563 ia_css_set_b_gamma_config(params, &default_b_gamma_table);
2564 ia_css_set_yuv2rgb_config(params, &default_yuv2rgb_cc_config);
2565 ia_css_set_rgb2yuv_config(params, &default_rgb2yuv_cc_config);
2566 ia_css_set_xnr_config(params, &default_xnr_config);
2567 ia_css_set_sdis_config(params, &default_sdis_config);
2568 ia_css_set_sdis2_config(params, &default_sdis2_config);
2569 ia_css_set_formats_config(params, &default_formats_config);
2570
2571 params->fpn_config.data = NULL;
2572 params->config_changed[IA_CSS_FPN_ID] = true;
2573 params->fpn_config.enabled = 0;
2574
2575 params->motion_config = default_motion_config;
2576 params->motion_config_changed = true;
2577
2578 params->morph_table = NULL;
2579 params->morph_table_changed = true;
2580
2581 params->sc_table = NULL;
2582 params->sc_table_changed = true;
2583 params->sc_table_dirty = false;
2584 params->sc_table_last_pipe_num = 0;
2585
2586 ia_css_sdis2_clear_coefficients(¶ms->dvs2_coefs);
2587 params->dvs2_coef_table_changed = true;
2588
2589 ia_css_sdis_clear_coefficients(¶ms->dvs_coefs);
2590 params->dis_coef_table_changed = true;
2591 } else {
2592 ia_css_set_xnr3_config(params, &stream_params->xnr3_config);
2593
2594 sh_css_set_nr_config(params, &stream_params->nr_config);
2595 sh_css_set_ee_config(params, &stream_params->ee_config);
2596 if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1)
2597 sh_css_set_macc_table(params, &stream_params->macc_table);
2598 else if (isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_2_2)
2599 sh_css_set_macc_table(params, &stream_params->macc_table);
2600 sh_css_set_gamma_table(params, &stream_params->gc_table);
2601 sh_css_set_ctc_table(params, &stream_params->ctc_table);
2602 sh_css_set_baa_config(params, &stream_params->bds_config);
2603 sh_css_set_dz_config(params, &stream_params->dz_config);
2604
2605 sh_css_set_shading_settings(params, &stream_params->shading_settings);
2606
2607
2608 ia_css_set_s3a_config(params, &stream_params->s3a_config);
2609 ia_css_set_wb_config(params, &stream_params->wb_config);
2610 ia_css_set_csc_config(params, &stream_params->cc_config);
2611 ia_css_set_tnr_config(params, &stream_params->tnr_config);
2612 ia_css_set_ob_config(params, &stream_params->ob_config);
2613 ia_css_set_dp_config(params, &stream_params->dp_config);
2614 ia_css_set_de_config(params, &stream_params->de_config);
2615 ia_css_set_gc_config(params, &stream_params->gc_config);
2616 ia_css_set_anr_config(params, &stream_params->anr_config);
2617 ia_css_set_anr2_config(params, &stream_params->anr_thres);
2618 ia_css_set_ce_config(params, &stream_params->ce_config);
2619 ia_css_set_xnr_table_config(params, &stream_params->xnr_table);
2620 ia_css_set_ecd_config(params, &stream_params->ecd_config);
2621 ia_css_set_ynr_config(params, &stream_params->ynr_config);
2622 ia_css_set_fc_config(params, &stream_params->fc_config);
2623 ia_css_set_cnr_config(params, &stream_params->cnr_config);
2624 ia_css_set_macc_config(params, &stream_params->macc_config);
2625 ia_css_set_ctc_config(params, &stream_params->ctc_config);
2626 ia_css_set_aa_config(params, &stream_params->aa_config);
2627 ia_css_set_r_gamma_config(params, &stream_params->r_gamma_table);
2628 ia_css_set_g_gamma_config(params, &stream_params->g_gamma_table);
2629 ia_css_set_b_gamma_config(params, &stream_params->b_gamma_table);
2630 ia_css_set_yuv2rgb_config(params, &stream_params->yuv2rgb_cc_config);
2631 ia_css_set_rgb2yuv_config(params, &stream_params->rgb2yuv_cc_config);
2632 ia_css_set_xnr_config(params, &stream_params->xnr_config);
2633 ia_css_set_formats_config(params, &stream_params->formats_config);
2634
2635 for (i = 0; i < stream->num_pipes; i++) {
2636 if (0 ==
2637 sh_css_select_dp_10bpp_config(stream->pipes[i], &is_dp_10bpp)) {
2638
2639
2640
2641
2642
2643 if (is_dp_10bpp) {
2644 retval = false;
2645
2646 }
2647 } else {
2648 retval = false;
2649 goto exit;
2650 }
2651 if (IS_ISP2401) {
2652 if (stream->pipes[i]->mode < IA_CSS_PIPE_ID_NUM) {
2653 sh_css_set_dp_config(stream->pipes[i], params,
2654 &stream_params->pipe_dp_config[stream->pipes[i]->mode]);
2655 ia_css_set_param_exceptions(stream->pipes[i], params);
2656 } else {
2657 retval = false;
2658 goto exit;
2659 }
2660 }
2661 }
2662
2663 if (!IS_ISP2401)
2664 ia_css_set_param_exceptions(pipe_in, params);
2665
2666 params->fpn_config.data = stream_params->fpn_config.data;
2667 params->config_changed[IA_CSS_FPN_ID] =
2668 stream_params->config_changed[IA_CSS_FPN_ID];
2669 params->fpn_config.enabled = stream_params->fpn_config.enabled;
2670
2671 sh_css_set_motion_vector(params, &stream_params->motion_config);
2672 sh_css_set_morph_table(params, stream_params->morph_table);
2673
2674 if (stream_params->sc_table) {
2675 sh_css_update_shading_table_status(pipe_in, params);
2676 sh_css_set_shading_table(stream, params, stream_params->sc_table);
2677 } else {
2678 params->sc_table = NULL;
2679 params->sc_table_changed = true;
2680 params->sc_table_dirty = false;
2681 params->sc_table_last_pipe_num = 0;
2682 }
2683
2684
2685 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2686 if (stream_params->pipe_dvs_6axis_config[i]) {
2687 if (params->pipe_dvs_6axis_config[i]) {
2688 copy_dvs_6axis_table(params->pipe_dvs_6axis_config[i],
2689 stream_params->pipe_dvs_6axis_config[i]);
2690 } else {
2691 params->pipe_dvs_6axis_config[i] =
2692 generate_dvs_6axis_table_from_config(stream_params->pipe_dvs_6axis_config[i]);
2693 }
2694 }
2695 }
2696 ia_css_set_sdis_config(params, &stream_params->dvs_coefs);
2697 params->dis_coef_table_changed = stream_params->dis_coef_table_changed;
2698
2699 ia_css_set_sdis2_config(params, &stream_params->dvs2_coefs);
2700 params->dvs2_coef_table_changed = stream_params->dvs2_coef_table_changed;
2701 params->sensor_binning = stream_params->sensor_binning;
2702 }
2703
2704exit:
2705 return retval;
2706}
2707
2708int
2709sh_css_params_init(void)
2710{
2711 int i, p;
2712
2713 IA_CSS_ENTER_PRIVATE("void");
2714
2715
2716 g_param_buffer_dequeue_count = 0;
2717 g_param_buffer_enqueue_count = 0;
2718
2719 for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++) {
2720 for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
2721 xmem_sp_stage_ptrs[p][i] =
2722 ia_css_refcount_increment(-1,
2723 hmm_alloc(sizeof(struct sh_css_sp_stage),
2724 HMM_BO_PRIVATE, 0, NULL,
2725 ATOMISP_MAP_FLAG_CLEARED));
2726 xmem_isp_stage_ptrs[p][i] =
2727 ia_css_refcount_increment(-1,
2728 hmm_alloc(sizeof(struct sh_css_sp_stage),
2729 HMM_BO_PRIVATE, 0, NULL,
2730 ATOMISP_MAP_FLAG_CLEARED));
2731
2732 if ((xmem_sp_stage_ptrs[p][i] == mmgr_NULL) ||
2733 (xmem_isp_stage_ptrs[p][i] == mmgr_NULL)) {
2734 sh_css_params_uninit();
2735 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
2736 return -ENOMEM;
2737 }
2738 }
2739 }
2740
2741 ia_css_config_gamma_table();
2742 ia_css_config_ctc_table();
2743 ia_css_config_rgb_gamma_tables();
2744 ia_css_config_xnr_table();
2745
2746 sp_ddr_ptrs = ia_css_refcount_increment(-1,
2747 hmm_alloc(CEIL_MUL(sizeof(struct sh_css_ddr_address_map),
2748 HIVE_ISP_DDR_WORD_BYTES),
2749 HMM_BO_PRIVATE, 0, NULL,
2750 ATOMISP_MAP_FLAG_CLEARED));
2751 xmem_sp_group_ptrs = ia_css_refcount_increment(-1,
2752 hmm_alloc(sizeof(struct sh_css_sp_group),
2753 HMM_BO_PRIVATE, 0, NULL,
2754 ATOMISP_MAP_FLAG_CLEARED));
2755
2756 if ((sp_ddr_ptrs == mmgr_NULL) ||
2757 (xmem_sp_group_ptrs == mmgr_NULL)) {
2758 ia_css_uninit();
2759 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
2760 return -ENOMEM;
2761 }
2762 IA_CSS_LEAVE_ERR_PRIVATE(0);
2763 return 0;
2764}
2765
2766static void host_lut_store(const void *lut)
2767{
2768 unsigned int i;
2769
2770 for (i = 0; i < N_GDC_ID; i++)
2771 gdc_lut_store((gdc_ID_t)i, (const int (*)[HRT_GDC_N]) lut);
2772}
2773
2774
2775inline ia_css_ptr sh_css_params_alloc_gdc_lut(void)
2776{
2777 return hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2778}
2779
2780inline void sh_css_params_free_gdc_lut(ia_css_ptr addr)
2781{
2782 if (addr != mmgr_NULL)
2783 hmm_free(addr);
2784}
2785
2786int ia_css_pipe_set_bci_scaler_lut(struct ia_css_pipe *pipe,
2787 const void *lut)
2788{
2789 int err = 0;
2790 bool stream_started = false;
2791
2792 IA_CSS_ENTER("pipe=%p lut=%p", pipe, lut);
2793
2794 if (!lut || !pipe) {
2795 err = -EINVAL;
2796 IA_CSS_LEAVE("err=%d", err);
2797 return err;
2798 }
2799
2800
2801
2802
2803
2804 if (pipe->stream && pipe->stream->started) {
2805 ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
2806 "unable to set scaler lut since stream has started\n");
2807 stream_started = true;
2808 err = -ENOTSUPP;
2809 }
2810
2811
2812 sh_css_params_free_gdc_lut(pipe->scaler_pp_lut);
2813 pipe->scaler_pp_lut = mmgr_NULL;
2814
2815 if (!stream_started) {
2816 if (!IS_ISP2401)
2817 pipe->scaler_pp_lut = hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2818 else
2819 pipe->scaler_pp_lut = sh_css_params_alloc_gdc_lut();
2820
2821 if (pipe->scaler_pp_lut == mmgr_NULL) {
2822 ia_css_debug_dtrace(IA_CSS_DEBUG_ERROR,
2823 "unable to allocate scaler_pp_lut\n");
2824 err = -ENOMEM;
2825 } else {
2826 gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])lut,
2827 interleaved_lut_temp);
2828 hmm_store(pipe->scaler_pp_lut,
2829 (int *)interleaved_lut_temp,
2830 sizeof(zoom_table));
2831 }
2832 }
2833
2834 IA_CSS_LEAVE("lut(%u) err=%d", pipe->scaler_pp_lut, err);
2835 return err;
2836}
2837
2838
2839ia_css_ptr sh_css_pipe_get_pp_gdc_lut(const struct ia_css_pipe *pipe)
2840{
2841 assert(pipe);
2842
2843 if (pipe->scaler_pp_lut != mmgr_NULL)
2844 return pipe->scaler_pp_lut;
2845 else
2846 return sh_css_params_get_default_gdc_lut();
2847}
2848
2849int sh_css_params_map_and_store_default_gdc_lut(void)
2850{
2851 int err = 0;
2852
2853 IA_CSS_ENTER_PRIVATE("void");
2854
2855
2856 if (default_gdc_lut != mmgr_NULL)
2857 return err;
2858
2859 host_lut_store((void *)zoom_table);
2860
2861 if (!IS_ISP2401)
2862 default_gdc_lut = hmm_alloc(sizeof(zoom_table), HMM_BO_PRIVATE, 0, NULL, 0);
2863 else
2864 default_gdc_lut = sh_css_params_alloc_gdc_lut();
2865
2866 if (default_gdc_lut == mmgr_NULL)
2867 return -ENOMEM;
2868
2869 gdc_lut_convert_to_isp_format((const int(*)[HRT_GDC_N])zoom_table,
2870 interleaved_lut_temp);
2871 hmm_store(default_gdc_lut, (int *)interleaved_lut_temp,
2872 sizeof(zoom_table));
2873
2874 IA_CSS_LEAVE_PRIVATE("lut(%u) err=%d", default_gdc_lut, err);
2875 return err;
2876}
2877
2878void sh_css_params_free_default_gdc_lut(void)
2879{
2880 IA_CSS_ENTER_PRIVATE("void");
2881
2882 sh_css_params_free_gdc_lut(default_gdc_lut);
2883 default_gdc_lut = mmgr_NULL;
2884
2885 IA_CSS_LEAVE_PRIVATE("void");
2886}
2887
2888ia_css_ptr sh_css_params_get_default_gdc_lut(void)
2889{
2890 return default_gdc_lut;
2891}
2892
2893static void free_param_set_callback(
2894 ia_css_ptr ptr)
2895{
2896 IA_CSS_ENTER_PRIVATE("void");
2897
2898 free_ia_css_isp_parameter_set_info(ptr);
2899
2900 IA_CSS_LEAVE_PRIVATE("void");
2901}
2902
2903static void free_buffer_callback(
2904 ia_css_ptr ptr)
2905{
2906 IA_CSS_ENTER_PRIVATE("void");
2907
2908 hmm_free(ptr);
2909
2910 IA_CSS_LEAVE_PRIVATE("void");
2911}
2912
2913void
2914sh_css_param_clear_param_sets(void)
2915{
2916 IA_CSS_ENTER_PRIVATE("void");
2917
2918 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
2919
2920 IA_CSS_LEAVE_PRIVATE("void");
2921}
2922
2923
2924
2925
2926
2927#define safe_free(id, x) \
2928 do { \
2929 ia_css_refcount_decrement(id, x); \
2930 (x) = mmgr_NULL; \
2931 } while (0)
2932
2933static void free_map(struct sh_css_ddr_address_map *map)
2934{
2935 unsigned int i;
2936
2937 ia_css_ptr *addrs = (ia_css_ptr *)map;
2938
2939 IA_CSS_ENTER_PRIVATE("void");
2940
2941
2942 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
2943 sizeof(size_t)); i++) {
2944 if (addrs[i] == mmgr_NULL)
2945 continue;
2946 safe_free(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
2947 }
2948
2949 IA_CSS_LEAVE_PRIVATE("void");
2950}
2951
2952void
2953ia_css_stream_isp_parameters_uninit(struct ia_css_stream *stream)
2954{
2955 int i;
2956 struct ia_css_isp_parameters *params = stream->isp_params_configs;
2957 struct ia_css_isp_parameters *per_frame_params =
2958 stream->per_frame_isp_params_configs;
2959
2960 IA_CSS_ENTER_PRIVATE("void");
2961 if (!params) {
2962 IA_CSS_LEAVE_PRIVATE("isp_param_configs is NULL");
2963 return;
2964 }
2965
2966
2967 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
2968 free_map(¶ms->pipe_ddr_ptrs[i]);
2969 if (per_frame_params)
2970 free_map(&per_frame_params->pipe_ddr_ptrs[i]);
2971
2972 if (params->pipe_dvs_6axis_config[i])
2973 free_dvs_6axis_table(¶ms->pipe_dvs_6axis_config[i]);
2974 if (per_frame_params && per_frame_params->pipe_dvs_6axis_config[i])
2975 free_dvs_6axis_table(&per_frame_params->pipe_dvs_6axis_config[i]);
2976 }
2977 free_map(¶ms->ddr_ptrs);
2978 if (per_frame_params)
2979 free_map(&per_frame_params->ddr_ptrs);
2980
2981 if (params->fpn_config.data) {
2982 kvfree(params->fpn_config.data);
2983 params->fpn_config.data = NULL;
2984 }
2985
2986
2987 if (params->sc_config) {
2988 ia_css_shading_table_free(params->sc_config);
2989 params->sc_config = NULL;
2990 }
2991 if (per_frame_params) {
2992 if (per_frame_params->sc_config) {
2993 ia_css_shading_table_free(per_frame_params->sc_config);
2994 per_frame_params->sc_config = NULL;
2995 }
2996 }
2997
2998 kvfree(params);
2999 kvfree(per_frame_params);
3000 stream->isp_params_configs = NULL;
3001 stream->per_frame_isp_params_configs = NULL;
3002
3003 IA_CSS_LEAVE_PRIVATE("void");
3004}
3005
3006void
3007sh_css_params_uninit(void)
3008{
3009 unsigned int p, i;
3010
3011 IA_CSS_ENTER_PRIVATE("void");
3012
3013 ia_css_refcount_decrement(-1, sp_ddr_ptrs);
3014 sp_ddr_ptrs = mmgr_NULL;
3015 ia_css_refcount_decrement(-1, xmem_sp_group_ptrs);
3016 xmem_sp_group_ptrs = mmgr_NULL;
3017
3018 for (p = 0; p < IA_CSS_PIPE_ID_NUM; p++)
3019 for (i = 0; i < SH_CSS_MAX_STAGES; i++) {
3020 ia_css_refcount_decrement(-1, xmem_sp_stage_ptrs[p][i]);
3021 xmem_sp_stage_ptrs[p][i] = mmgr_NULL;
3022 ia_css_refcount_decrement(-1, xmem_isp_stage_ptrs[p][i]);
3023 xmem_isp_stage_ptrs[p][i] = mmgr_NULL;
3024 }
3025
3026
3027 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_SET_POOL, &free_param_set_callback);
3028 ia_css_refcount_clear(IA_CSS_REFCOUNT_PARAM_BUFFER, &free_buffer_callback);
3029 ia_css_refcount_clear(-1, &free_buffer_callback);
3030
3031 IA_CSS_LEAVE_PRIVATE("void");
3032}
3033
3034static struct ia_css_host_data *
3035convert_allocate_morph_plane(
3036 unsigned short *data,
3037 unsigned int width,
3038 unsigned int height,
3039 unsigned int aligned_width)
3040{
3041 unsigned int i, j, padding, w;
3042 struct ia_css_host_data *me;
3043 unsigned int isp_data_size;
3044 u16 *isp_data_ptr;
3045
3046 IA_CSS_ENTER_PRIVATE("void");
3047
3048
3049
3050
3051 if (width > aligned_width) {
3052 padding = 0;
3053 w = aligned_width;
3054 } else {
3055 padding = aligned_width - width;
3056 w = width;
3057 }
3058 isp_data_size = height * (w + padding) * sizeof(uint16_t);
3059
3060 me = ia_css_host_data_allocate((size_t)isp_data_size);
3061
3062 if (!me) {
3063 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3064 return NULL;
3065 }
3066
3067 isp_data_ptr = (uint16_t *)me->address;
3068
3069 memset(isp_data_ptr, 0, (size_t)isp_data_size);
3070
3071 for (i = 0; i < height; i++) {
3072 for (j = 0; j < w; j++)
3073 *isp_data_ptr++ = (uint16_t)data[j];
3074 isp_data_ptr += padding;
3075 data += width;
3076 }
3077
3078 IA_CSS_LEAVE_PRIVATE("void");
3079 return me;
3080}
3081
3082static int
3083store_morph_plane(
3084 unsigned short *data,
3085 unsigned int width,
3086 unsigned int height,
3087 ia_css_ptr dest,
3088 unsigned int aligned_width)
3089{
3090 struct ia_css_host_data *isp_data;
3091
3092 assert(dest != mmgr_NULL);
3093
3094 isp_data = convert_allocate_morph_plane(data, width, height, aligned_width);
3095 if (!isp_data) {
3096 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3097 return -ENOMEM;
3098 }
3099 ia_css_params_store_ia_css_host_data(dest, isp_data);
3100
3101 ia_css_host_data_free(isp_data);
3102 return 0;
3103}
3104
3105static void sh_css_update_isp_params_to_ddr(
3106 struct ia_css_isp_parameters *params,
3107 ia_css_ptr ddr_ptr)
3108{
3109 size_t size = sizeof(params->uds);
3110
3111 IA_CSS_ENTER_PRIVATE("void");
3112
3113 assert(params);
3114
3115 hmm_store(ddr_ptr, ¶ms->uds, size);
3116 IA_CSS_LEAVE_PRIVATE("void");
3117}
3118
3119static void sh_css_update_isp_mem_params_to_ddr(
3120 const struct ia_css_binary *binary,
3121 ia_css_ptr ddr_mem_ptr,
3122 size_t size,
3123 enum ia_css_isp_memories mem)
3124{
3125 const struct ia_css_host_data *params;
3126
3127 IA_CSS_ENTER_PRIVATE("void");
3128
3129 params = ia_css_isp_param_get_mem_init(&binary->mem_params,
3130 IA_CSS_PARAM_CLASS_PARAM, mem);
3131 hmm_store(ddr_mem_ptr, params->address, size);
3132
3133 IA_CSS_LEAVE_PRIVATE("void");
3134}
3135
3136void ia_css_dequeue_param_buffers( void)
3137{
3138 unsigned int i;
3139 ia_css_ptr cpy;
3140 enum sh_css_queue_id param_queue_ids[3] = { IA_CSS_PARAMETER_SET_QUEUE_ID,
3141 IA_CSS_PER_FRAME_PARAMETER_SET_QUEUE_ID,
3142 SH_CSS_INVALID_QUEUE_ID
3143 };
3144
3145 IA_CSS_ENTER_PRIVATE("void");
3146
3147 if (!sh_css_sp_is_running()) {
3148 IA_CSS_LEAVE_PRIVATE("sp is not running");
3149
3150 return;
3151 }
3152
3153 for (i = 0; SH_CSS_INVALID_QUEUE_ID != param_queue_ids[i]; i++) {
3154 cpy = (ia_css_ptr)0;
3155
3156 while (ia_css_bufq_dequeue_buffer(param_queue_ids[i],
3157 (uint32_t *)&cpy) == 0) {
3158
3159
3160 g_param_buffer_dequeue_count++;
3161 ia_css_bufq_enqueue_psys_event(
3162 IA_CSS_PSYS_SW_EVENT_BUFFER_DEQUEUED,
3163 0,
3164 param_queue_ids[i],
3165 0);
3166
3167 IA_CSS_LOG("dequeued param set %x from %d, release ref", cpy, 0);
3168 free_ia_css_isp_parameter_set_info(cpy);
3169 cpy = (ia_css_ptr)0;
3170 }
3171 }
3172
3173 IA_CSS_LEAVE_PRIVATE("void");
3174}
3175
3176static void
3177process_kernel_parameters(unsigned int pipe_id,
3178 struct ia_css_pipeline_stage *stage,
3179 struct ia_css_isp_parameters *params,
3180 unsigned int isp_pipe_version,
3181 unsigned int raw_bit_depth)
3182{
3183 unsigned int param_id;
3184
3185 (void)isp_pipe_version;
3186 (void)raw_bit_depth;
3187
3188 sh_css_enable_pipeline(stage->binary);
3189
3190 if (params->config_changed[IA_CSS_OB_ID]) {
3191 ia_css_ob_configure(¶ms->stream_configs.ob,
3192 isp_pipe_version, raw_bit_depth);
3193 }
3194 if (params->config_changed[IA_CSS_S3A_ID]) {
3195 ia_css_s3a_configure(raw_bit_depth);
3196 }
3197
3198
3199 params->crop_config.crop_pos = params->uds[stage->stage_num].crop_pos;
3200 params->uds_config.crop_pos = params->uds[stage->stage_num].crop_pos;
3201 params->uds_config.uds = params->uds[stage->stage_num].uds;
3202
3203
3204 for (param_id = 0; param_id < IA_CSS_NUM_PARAMETER_IDS; param_id++) {
3205 if (param_id == IA_CSS_SC_ID) continue;
3206 if (params->config_changed[param_id])
3207 ia_css_kernel_process_param[param_id](pipe_id, stage, params);
3208 }
3209}
3210
3211int
3212sh_css_param_update_isp_params(struct ia_css_pipe *curr_pipe,
3213 struct ia_css_isp_parameters *params,
3214 bool commit,
3215 struct ia_css_pipe *pipe_in)
3216{
3217 int err = 0;
3218 ia_css_ptr cpy;
3219 int i;
3220 unsigned int raw_bit_depth = 10;
3221 unsigned int isp_pipe_version = SH_CSS_ISP_PIPE_VERSION_1;
3222 bool acc_cluster_params_changed = false;
3223 unsigned int thread_id, pipe_num;
3224
3225 (void)acc_cluster_params_changed;
3226
3227 assert(curr_pipe);
3228
3229 IA_CSS_ENTER_PRIVATE("pipe=%p, isp_parameters_id=%d", pipe_in, params->isp_parameters_id);
3230 raw_bit_depth = ia_css_stream_input_format_bits_per_pixel(curr_pipe->stream);
3231
3232
3233 if (!commit) {
3234 IA_CSS_LEAVE_ERR_PRIVATE(err);
3235 return err;
3236 }
3237
3238
3239 for (i = 0; i < curr_pipe->stream->num_pipes; i++) {
3240 struct ia_css_pipe *pipe;
3241 struct sh_css_ddr_address_map *cur_map;
3242 struct sh_css_ddr_address_map_size *cur_map_size;
3243 struct ia_css_isp_parameter_set_info isp_params_info;
3244 struct ia_css_pipeline *pipeline;
3245 struct ia_css_pipeline_stage *stage;
3246
3247 enum sh_css_queue_id queue_id;
3248
3249 pipe = curr_pipe->stream->pipes[i];
3250 pipeline = ia_css_pipe_get_pipeline(pipe);
3251 pipe_num = ia_css_pipe_get_pipe_num(pipe);
3252 isp_pipe_version = ia_css_pipe_get_isp_pipe_version(pipe);
3253 ia_css_pipeline_get_sp_thread_id(pipe_num, &thread_id);
3254
3255#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3256 ia_css_query_internal_queue_id(params->output_frame
3257 ? IA_CSS_BUFFER_TYPE_PER_FRAME_PARAMETER_SET
3258 : IA_CSS_BUFFER_TYPE_PARAMETER_SET,
3259 thread_id, &queue_id);
3260#else
3261 ia_css_query_internal_queue_id(IA_CSS_BUFFER_TYPE_PARAMETER_SET, thread_id,
3262 &queue_id);
3263#endif
3264 if (!sh_css_sp_is_running()) {
3265
3266 err = -EBUSY;
3267 break;
3268 }
3269 cur_map = ¶ms->pipe_ddr_ptrs[pipeline->pipe_id];
3270 cur_map_size = ¶ms->pipe_ddr_ptrs_size[pipeline->pipe_id];
3271
3272
3273
3274
3275
3276
3277 {
3278
3279
3280 err = ia_css_process_zoom_and_motion(params,
3281 pipeline->stages);
3282 if (err)
3283 return err;
3284 }
3285
3286
3287
3288 if (pipe_in && (pipe != pipe_in)) {
3289 IA_CSS_LOG("skipping pipe %p", pipe);
3290 continue;
3291 }
3292
3293
3294
3295 for (stage = pipeline->stages; stage; stage = stage->next) {
3296 unsigned int mem;
3297
3298 if (!stage || !stage->binary)
3299 continue;
3300
3301 process_kernel_parameters(pipeline->pipe_id,
3302 stage, params,
3303 isp_pipe_version, raw_bit_depth);
3304
3305 err = sh_css_params_write_to_ddr_internal(
3306 pipe,
3307 pipeline->pipe_id,
3308 params,
3309 stage,
3310 cur_map,
3311 cur_map_size);
3312
3313 if (err)
3314 break;
3315 for (mem = 0; mem < IA_CSS_NUM_MEMORIES; mem++) {
3316 params->isp_mem_params_changed
3317 [pipeline->pipe_id][stage->stage_num][mem] = false;
3318 }
3319 }
3320 if (err)
3321 break;
3322
3323 if (params->isp_params_changed) {
3324 reallocate_buffer(&cur_map->isp_param,
3325 &cur_map_size->isp_param,
3326 cur_map_size->isp_param,
3327 true,
3328 &err);
3329 if (err)
3330 break;
3331 sh_css_update_isp_params_to_ddr(params, cur_map->isp_param);
3332 }
3333
3334
3335 err = ref_sh_css_ddr_address_map(
3336 cur_map,
3337 &isp_params_info.mem_map);
3338 if (err)
3339 break;
3340
3341
3342 isp_params_info.isp_parameters_id = params->isp_parameters_id;
3343
3344
3345 isp_params_info.output_frame_ptr =
3346 (params->output_frame) ? params->output_frame->data : mmgr_NULL;
3347
3348
3349 err = write_ia_css_isp_parameter_set_info_to_ddr(&isp_params_info, &cpy);
3350 if (err)
3351 break;
3352
3353
3354 IA_CSS_LOG("queue param set %x to %d", cpy, thread_id);
3355
3356 err = ia_css_bufq_enqueue_buffer(thread_id, queue_id, (uint32_t)cpy);
3357 if (err) {
3358 free_ia_css_isp_parameter_set_info(cpy);
3359#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3360 IA_CSS_LOG("pfp: FAILED to add config id %d for OF %d to q %d on thread %d",
3361 isp_params_info.isp_parameters_id,
3362 isp_params_info.output_frame_ptr,
3363 queue_id, thread_id);
3364#endif
3365 break;
3366 } else {
3367
3368
3369
3370 g_param_buffer_enqueue_count++;
3371 assert(g_param_buffer_enqueue_count < g_param_buffer_dequeue_count + 50);
3372
3373
3374
3375
3376 if (!sh_css_sp_is_running()) {
3377
3378 IA_CSS_LEAVE_ERR_PRIVATE(-EBUSY);
3379 return -EBUSY;
3380 }
3381 ia_css_bufq_enqueue_psys_event(
3382 IA_CSS_PSYS_SW_EVENT_BUFFER_ENQUEUED,
3383 (uint8_t)thread_id,
3384 (uint8_t)queue_id,
3385 0);
3386#if defined(SH_CSS_ENABLE_PER_FRAME_PARAMS)
3387 IA_CSS_LOG("pfp: added config id %d for OF %d to q %d on thread %d",
3388 isp_params_info.isp_parameters_id,
3389 isp_params_info.output_frame_ptr,
3390 queue_id, thread_id);
3391#endif
3392 }
3393
3394 ia_css_dequeue_param_buffers();
3395 params->pipe_dvs_6axis_config_changed[pipeline->pipe_id] = false;
3396 }
3397
3398
3399 params->isp_params_changed = false;
3400 params->sc_table_changed = false;
3401 params->dis_coef_table_changed = false;
3402 params->dvs2_coef_table_changed = false;
3403 params->morph_table_changed = false;
3404 params->dz_config_changed = false;
3405 params->motion_config_changed = false;
3406
3407 params->shading_settings_changed = false;
3408
3409
3410 memset(¶ms->config_changed[0], 0, sizeof(params->config_changed));
3411
3412 IA_CSS_LEAVE_ERR_PRIVATE(err);
3413 return err;
3414}
3415
3416static int
3417sh_css_params_write_to_ddr_internal(
3418 struct ia_css_pipe *pipe,
3419 unsigned int pipe_id,
3420 struct ia_css_isp_parameters *params,
3421 const struct ia_css_pipeline_stage *stage,
3422 struct sh_css_ddr_address_map *ddr_map,
3423 struct sh_css_ddr_address_map_size *ddr_map_size)
3424{
3425 int err;
3426 const struct ia_css_binary *binary;
3427
3428 unsigned int stage_num;
3429 unsigned int mem;
3430 bool buff_realloced;
3431
3432
3433 static struct ia_css_macc_table converted_macc_table;
3434
3435 IA_CSS_ENTER_PRIVATE("void");
3436 assert(params);
3437 assert(ddr_map);
3438 assert(ddr_map_size);
3439 assert(stage);
3440
3441 binary = stage->binary;
3442 assert(binary);
3443
3444 stage_num = stage->stage_num;
3445
3446 if (binary->info->sp.enable.fpnr) {
3447 buff_realloced = reallocate_buffer(&ddr_map->fpn_tbl,
3448 &ddr_map_size->fpn_tbl,
3449 (size_t)(FPNTBL_BYTES(binary)),
3450 params->config_changed[IA_CSS_FPN_ID],
3451 &err);
3452 if (err) {
3453 IA_CSS_LEAVE_ERR_PRIVATE(err);
3454 return err;
3455 }
3456 if (params->config_changed[IA_CSS_FPN_ID] || buff_realloced) {
3457 if (params->fpn_config.enabled) {
3458 err = store_fpntbl(params, ddr_map->fpn_tbl);
3459 if (err) {
3460 IA_CSS_LEAVE_ERR_PRIVATE(err);
3461 return err;
3462 }
3463 }
3464 }
3465 }
3466
3467 if (binary->info->sp.enable.sc) {
3468 u32 enable_conv;
3469 size_t bytes;
3470
3471 if (!IS_ISP2401)
3472 bytes = ISP2400_SCTBL_BYTES(binary);
3473 else
3474 bytes = ISP2401_SCTBL_BYTES(binary);
3475
3476 enable_conv = params->shading_settings.enable_shading_table_conversion;
3477
3478 buff_realloced = reallocate_buffer(&ddr_map->sc_tbl,
3479 &ddr_map_size->sc_tbl,
3480 bytes,
3481 params->sc_table_changed,
3482 &err);
3483 if (err) {
3484 IA_CSS_LEAVE_ERR_PRIVATE(err);
3485 return err;
3486 }
3487
3488 if (params->shading_settings_changed ||
3489 params->sc_table_changed || buff_realloced) {
3490 if (enable_conv == 0) {
3491 if (params->sc_table) {
3492
3493 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_table);
3494 if (err) {
3495 IA_CSS_LEAVE_ERR_PRIVATE(err);
3496 return err;
3497 }
3498
3499 params->sc_config = (struct ia_css_shading_table *)params->sc_table;
3500 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3501 params->sc_config = NULL;
3502 } else {
3503
3504 if (params->sc_config) {
3505 ia_css_shading_table_free(params->sc_config);
3506 params->sc_config = NULL;
3507 }
3508 sh_css_params_shading_id_table_generate(¶ms->sc_config,
3509 binary->sctbl_width_per_color,
3510 binary->sctbl_height);
3511 if (!params->sc_config) {
3512 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3513 return -ENOMEM;
3514 }
3515
3516
3517 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
3518 if (err) {
3519 IA_CSS_LEAVE_ERR_PRIVATE(err);
3520 return err;
3521 }
3522
3523
3524 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3525
3526
3527 ia_css_shading_table_free(params->sc_config);
3528 params->sc_config = NULL;
3529 }
3530 } else {
3531
3532
3533 if (params->sc_config) {
3534 ia_css_shading_table_free(params->sc_config);
3535 params->sc_config = NULL;
3536 }
3537 prepare_shading_table(
3538 (const struct ia_css_shading_table *)params->sc_table,
3539 params->sensor_binning,
3540 ¶ms->sc_config,
3541 binary, pipe->required_bds_factor);
3542 if (!params->sc_config) {
3543 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3544 return -ENOMEM;
3545 }
3546
3547
3548 err = ia_css_params_store_sctbl(stage, ddr_map->sc_tbl, params->sc_config);
3549 if (err) {
3550 IA_CSS_LEAVE_ERR_PRIVATE(err);
3551 return err;
3552 }
3553
3554
3555 ia_css_kernel_process_param[IA_CSS_SC_ID](pipe_id, stage, params);
3556
3557
3558 ia_css_shading_table_free(params->sc_config);
3559 params->sc_config = NULL;
3560
3561 }
3562 }
3563 }
3564
3565
3566
3567
3568 if (IS_ISP2401 &&
3569 params->pipe_dpc_config_changed[pipe_id] && binary->info->sp.enable.dpc) {
3570 unsigned int size =
3571 stage->binary->info->mem_offsets.offsets.param->dmem.dp.size;
3572
3573 unsigned int offset =
3574 stage->binary->info->mem_offsets.offsets.param->dmem.dp.offset;
3575
3576 if (size) {
3577 ia_css_dp_encode((struct sh_css_isp_dp_params *)
3578 &binary->mem_params.params[IA_CSS_PARAM_CLASS_PARAM][IA_CSS_ISP_DMEM].address[offset],
3579 ¶ms->pipe_dp_config[pipe_id], size);
3580
3581 params->isp_params_changed = true;
3582 params->isp_mem_params_changed[pipe_id][stage->stage_num][IA_CSS_ISP_DMEM] =
3583 true;
3584 }
3585 }
3586
3587 if (params->config_changed[IA_CSS_MACC_ID] && binary->info->sp.enable.macc) {
3588 unsigned int i, j, idx;
3589 unsigned int idx_map[] = {
3590 0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8
3591 };
3592
3593 for (i = 0; i < IA_CSS_MACC_NUM_AXES; i++) {
3594 idx = 4 * idx_map[i];
3595 j = 4 * i;
3596
3597 if (binary->info->sp.pipeline.isp_pipe_version == SH_CSS_ISP_PIPE_VERSION_1) {
3598 converted_macc_table.data[idx] =
3599 (int16_t)sDIGIT_FITTING(params->macc_table.data[j],
3600 13, SH_CSS_MACC_COEF_SHIFT);
3601 converted_macc_table.data[idx + 1] =
3602 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 1],
3603 13, SH_CSS_MACC_COEF_SHIFT);
3604 converted_macc_table.data[idx + 2] =
3605 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 2],
3606 13, SH_CSS_MACC_COEF_SHIFT);
3607 converted_macc_table.data[idx + 3] =
3608 (int16_t)sDIGIT_FITTING(params->macc_table.data[j + 3],
3609 13, SH_CSS_MACC_COEF_SHIFT);
3610 } else if (binary->info->sp.pipeline.isp_pipe_version ==
3611 SH_CSS_ISP_PIPE_VERSION_2_2) {
3612 converted_macc_table.data[idx] =
3613 params->macc_table.data[j];
3614 converted_macc_table.data[idx + 1] =
3615 params->macc_table.data[j + 1];
3616 converted_macc_table.data[idx + 2] =
3617 params->macc_table.data[j + 2];
3618 converted_macc_table.data[idx + 3] =
3619 params->macc_table.data[j + 3];
3620 }
3621 }
3622 reallocate_buffer(&ddr_map->macc_tbl,
3623 &ddr_map_size->macc_tbl,
3624 ddr_map_size->macc_tbl,
3625 true,
3626 &err);
3627 if (err) {
3628 IA_CSS_LEAVE_ERR_PRIVATE(err);
3629 return err;
3630 }
3631 hmm_store(ddr_map->macc_tbl,
3632 converted_macc_table.data,
3633 sizeof(converted_macc_table.data));
3634 }
3635
3636 if (binary->info->sp.enable.dvs_6axis) {
3637
3638
3639
3640
3641 buff_realloced = reallocate_buffer(
3642 &ddr_map->dvs_6axis_params_y,
3643 &ddr_map_size->dvs_6axis_params_y,
3644 (size_t)((DVS_6AXIS_BYTES(binary) / 2) * 3),
3645 params->pipe_dvs_6axis_config_changed[pipe_id],
3646 &err);
3647 if (err) {
3648 IA_CSS_LEAVE_ERR_PRIVATE(err);
3649 return err;
3650 }
3651
3652 if (params->pipe_dvs_6axis_config_changed[pipe_id] || buff_realloced) {
3653 const struct ia_css_frame_info *dvs_in_frame_info;
3654
3655 if (stage->args.delay_frames[0]) {
3656
3657
3658 dvs_in_frame_info = &stage->args.delay_frames[0]->info;
3659 } else {
3660
3661 dvs_in_frame_info = &stage->args.in_frame->info;
3662 }
3663
3664
3665 if (!params->pipe_dvs_6axis_config[pipe_id]) {
3666 struct ia_css_resolution dvs_offset = {0};
3667
3668 if (!IS_ISP2401) {
3669 dvs_offset.width = (PIX_SHIFT_FILTER_RUN_IN_X + binary->dvs_envelope.width) / 2;
3670 } else {
3671 if (binary->dvs_envelope.width || binary->dvs_envelope.height) {
3672 dvs_offset.width = (PIX_SHIFT_FILTER_RUN_IN_X + binary->dvs_envelope.width) / 2;
3673 }
3674 }
3675 dvs_offset.height = (PIX_SHIFT_FILTER_RUN_IN_Y + binary->dvs_envelope.height) / 2;
3676
3677 params->pipe_dvs_6axis_config[pipe_id] =
3678 generate_dvs_6axis_table(&binary->out_frame_info[0].res, &dvs_offset);
3679 if (!params->pipe_dvs_6axis_config[pipe_id]) {
3680 IA_CSS_LEAVE_ERR_PRIVATE(-ENOMEM);
3681 return -ENOMEM;
3682 }
3683 params->pipe_dvs_6axis_config_changed[pipe_id] = true;
3684
3685 store_dvs_6axis_config(params->pipe_dvs_6axis_config[pipe_id],
3686 binary,
3687 dvs_in_frame_info,
3688 ddr_map->dvs_6axis_params_y);
3689 params->isp_params_changed = true;
3690 }
3691 }
3692 }
3693
3694 if (binary->info->sp.enable.ca_gdc) {
3695 unsigned int i;
3696 ia_css_ptr *virt_addr_tetra_x[
3697
3698 IA_CSS_MORPH_TABLE_NUM_PLANES];
3699 size_t *virt_size_tetra_x[
3700
3701 IA_CSS_MORPH_TABLE_NUM_PLANES];
3702 ia_css_ptr *virt_addr_tetra_y[
3703
3704 IA_CSS_MORPH_TABLE_NUM_PLANES];
3705 size_t *virt_size_tetra_y[
3706
3707 IA_CSS_MORPH_TABLE_NUM_PLANES];
3708
3709 virt_addr_tetra_x[0] = &ddr_map->tetra_r_x;
3710 virt_addr_tetra_x[1] = &ddr_map->tetra_gr_x;
3711 virt_addr_tetra_x[2] = &ddr_map->tetra_gb_x;
3712 virt_addr_tetra_x[3] = &ddr_map->tetra_b_x;
3713 virt_addr_tetra_x[4] = &ddr_map->tetra_ratb_x;
3714 virt_addr_tetra_x[5] = &ddr_map->tetra_batr_x;
3715
3716 virt_size_tetra_x[0] = &ddr_map_size->tetra_r_x;
3717 virt_size_tetra_x[1] = &ddr_map_size->tetra_gr_x;
3718 virt_size_tetra_x[2] = &ddr_map_size->tetra_gb_x;
3719 virt_size_tetra_x[3] = &ddr_map_size->tetra_b_x;
3720 virt_size_tetra_x[4] = &ddr_map_size->tetra_ratb_x;
3721 virt_size_tetra_x[5] = &ddr_map_size->tetra_batr_x;
3722
3723 virt_addr_tetra_y[0] = &ddr_map->tetra_r_y;
3724 virt_addr_tetra_y[1] = &ddr_map->tetra_gr_y;
3725 virt_addr_tetra_y[2] = &ddr_map->tetra_gb_y;
3726 virt_addr_tetra_y[3] = &ddr_map->tetra_b_y;
3727 virt_addr_tetra_y[4] = &ddr_map->tetra_ratb_y;
3728 virt_addr_tetra_y[5] = &ddr_map->tetra_batr_y;
3729
3730 virt_size_tetra_y[0] = &ddr_map_size->tetra_r_y;
3731 virt_size_tetra_y[1] = &ddr_map_size->tetra_gr_y;
3732 virt_size_tetra_y[2] = &ddr_map_size->tetra_gb_y;
3733 virt_size_tetra_y[3] = &ddr_map_size->tetra_b_y;
3734 virt_size_tetra_y[4] = &ddr_map_size->tetra_ratb_y;
3735 virt_size_tetra_y[5] = &ddr_map_size->tetra_batr_y;
3736
3737 buff_realloced = false;
3738 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
3739 buff_realloced |=
3740 reallocate_buffer(virt_addr_tetra_x[i],
3741 virt_size_tetra_x[i],
3742 (size_t)
3743 (MORPH_PLANE_BYTES(binary)),
3744 params->morph_table_changed,
3745 &err);
3746 if (err) {
3747 IA_CSS_LEAVE_ERR_PRIVATE(err);
3748 return err;
3749 }
3750 buff_realloced |=
3751 reallocate_buffer(virt_addr_tetra_y[i],
3752 virt_size_tetra_y[i],
3753 (size_t)
3754 (MORPH_PLANE_BYTES(binary)),
3755 params->morph_table_changed,
3756 &err);
3757 if (err) {
3758 IA_CSS_LEAVE_ERR_PRIVATE(err);
3759 return err;
3760 }
3761 }
3762 if (params->morph_table_changed || buff_realloced) {
3763 const struct ia_css_morph_table *table = params->morph_table;
3764 struct ia_css_morph_table *id_table = NULL;
3765
3766 if ((table) &&
3767 (table->width < binary->morph_tbl_width ||
3768 table->height < binary->morph_tbl_height)) {
3769 table = NULL;
3770 }
3771 if (!table) {
3772 err = sh_css_params_default_morph_table(&id_table,
3773 binary);
3774 if (err) {
3775 IA_CSS_LEAVE_ERR_PRIVATE(err);
3776 return err;
3777 }
3778 table = id_table;
3779 }
3780
3781 for (i = 0; i < IA_CSS_MORPH_TABLE_NUM_PLANES; i++) {
3782 store_morph_plane(table->coordinates_x[i],
3783 table->width,
3784 table->height,
3785 *virt_addr_tetra_x[i],
3786 binary->morph_tbl_aligned_width);
3787 store_morph_plane(table->coordinates_y[i],
3788 table->width,
3789 table->height,
3790 *virt_addr_tetra_y[i],
3791 binary->morph_tbl_aligned_width);
3792 }
3793 if (id_table)
3794 ia_css_morph_table_free(id_table);
3795 }
3796 }
3797
3798
3799 for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++) {
3800 const struct ia_css_isp_data *isp_data =
3801 ia_css_isp_param_get_isp_mem_init(&binary->info->sp.mem_initializers,
3802 IA_CSS_PARAM_CLASS_PARAM, mem);
3803 size_t size = isp_data->size;
3804
3805 if (!size) continue;
3806 buff_realloced = reallocate_buffer(&ddr_map->isp_mem_param[stage_num][mem],
3807 &ddr_map_size->isp_mem_param[stage_num][mem],
3808 size,
3809 params->isp_mem_params_changed[pipe_id][stage_num][mem],
3810 &err);
3811 if (err) {
3812 IA_CSS_LEAVE_ERR_PRIVATE(err);
3813 return err;
3814 }
3815 if (params->isp_mem_params_changed[pipe_id][stage_num][mem] || buff_realloced) {
3816 sh_css_update_isp_mem_params_to_ddr(binary,
3817 ddr_map->isp_mem_param[stage_num][mem],
3818 ddr_map_size->isp_mem_param[stage_num][mem], mem);
3819 }
3820 }
3821
3822 IA_CSS_LEAVE_ERR_PRIVATE(0);
3823 return 0;
3824}
3825
3826const struct ia_css_fpn_table *ia_css_get_fpn_table(struct ia_css_stream
3827 *stream)
3828{
3829 struct ia_css_isp_parameters *params;
3830
3831 IA_CSS_ENTER_LEAVE("void");
3832 assert(stream);
3833
3834 params = stream->isp_params_configs;
3835
3836 return ¶ms->fpn_config;
3837}
3838
3839struct ia_css_shading_table *ia_css_get_shading_table(struct ia_css_stream
3840 *stream)
3841{
3842 struct ia_css_shading_table *table = NULL;
3843 struct ia_css_isp_parameters *params;
3844
3845 IA_CSS_ENTER("void");
3846
3847 assert(stream);
3848
3849 params = stream->isp_params_configs;
3850 if (!params)
3851 return NULL;
3852
3853 if (params->shading_settings.enable_shading_table_conversion == 0) {
3854 if (params->sc_table) {
3855 table = (struct ia_css_shading_table *)params->sc_table;
3856 } else {
3857 const struct ia_css_binary *binary
3858 = ia_css_stream_get_shading_correction_binary(stream);
3859 if (binary) {
3860
3861 if (params->sc_config) {
3862 ia_css_shading_table_free(params->sc_config);
3863 params->sc_config = NULL;
3864 }
3865 sh_css_params_shading_id_table_generate(¶ms->sc_config,
3866 binary->sctbl_width_per_color,
3867 binary->sctbl_height);
3868 table = params->sc_config;
3869
3870
3871 }
3872 }
3873 } else {
3874
3875 const struct ia_css_binary *binary
3876 = ia_css_stream_get_shading_correction_binary(stream);
3877 struct ia_css_pipe *pipe;
3878
3879
3880
3881
3882 pipe = stream->pipes[0];
3883
3884 if (stream->num_pipes == 2) {
3885 assert(stream->pipes[1]);
3886 if (stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_VIDEO ||
3887 stream->pipes[1]->config.mode == IA_CSS_PIPE_MODE_PREVIEW)
3888 pipe = stream->pipes[1];
3889 }
3890
3891 if (binary) {
3892 if (params->sc_config) {
3893 ia_css_shading_table_free(params->sc_config);
3894 params->sc_config = NULL;
3895 }
3896 prepare_shading_table(
3897 (const struct ia_css_shading_table *)params->sc_table,
3898 params->sensor_binning,
3899 ¶ms->sc_config,
3900 binary, pipe->required_bds_factor);
3901
3902 table = params->sc_config;
3903
3904
3905 }
3906
3907 }
3908
3909 IA_CSS_LEAVE("table=%p", table);
3910
3911 return table;
3912}
3913
3914ia_css_ptr sh_css_store_sp_group_to_ddr(void)
3915{
3916 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3917 hmm_store(xmem_sp_group_ptrs,
3918 &sh_css_sp_group,
3919 sizeof(struct sh_css_sp_group));
3920 return xmem_sp_group_ptrs;
3921}
3922
3923ia_css_ptr sh_css_store_sp_stage_to_ddr(
3924 unsigned int pipe,
3925 unsigned int stage)
3926{
3927 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3928 hmm_store(xmem_sp_stage_ptrs[pipe][stage],
3929 &sh_css_sp_stage,
3930 sizeof(struct sh_css_sp_stage));
3931 return xmem_sp_stage_ptrs[pipe][stage];
3932}
3933
3934ia_css_ptr sh_css_store_isp_stage_to_ddr(
3935 unsigned int pipe,
3936 unsigned int stage)
3937{
3938 IA_CSS_ENTER_LEAVE_PRIVATE("void");
3939 hmm_store(xmem_isp_stage_ptrs[pipe][stage],
3940 &sh_css_isp_stage,
3941 sizeof(struct sh_css_isp_stage));
3942 return xmem_isp_stage_ptrs[pipe][stage];
3943}
3944
3945static int ref_sh_css_ddr_address_map(
3946 struct sh_css_ddr_address_map *map,
3947 struct sh_css_ddr_address_map *out)
3948{
3949 int err = 0;
3950 unsigned int i;
3951
3952
3953
3954
3955
3956 union {
3957 struct sh_css_ddr_address_map *map;
3958 ia_css_ptr *addrs;
3959 } in_addrs, to_addrs;
3960
3961 IA_CSS_ENTER_PRIVATE("void");
3962 assert(map);
3963 assert(out);
3964
3965 in_addrs.map = map;
3966 to_addrs.map = out;
3967
3968 assert(sizeof(struct sh_css_ddr_address_map_size) / sizeof(size_t) ==
3969 sizeof(struct sh_css_ddr_address_map) / sizeof(ia_css_ptr));
3970
3971
3972 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
3973 sizeof(size_t)); i++) {
3974 if (in_addrs.addrs[i] == mmgr_NULL)
3975 to_addrs.addrs[i] = mmgr_NULL;
3976 else
3977 to_addrs.addrs[i] = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_BUFFER,
3978 in_addrs.addrs[i]);
3979 }
3980
3981 IA_CSS_LEAVE_ERR_PRIVATE(err);
3982 return err;
3983}
3984
3985static int write_ia_css_isp_parameter_set_info_to_ddr(
3986 struct ia_css_isp_parameter_set_info *me,
3987 ia_css_ptr *out)
3988{
3989 int err = 0;
3990 bool succ;
3991
3992 IA_CSS_ENTER_PRIVATE("void");
3993
3994 assert(me);
3995 assert(out);
3996
3997 *out = ia_css_refcount_increment(IA_CSS_REFCOUNT_PARAM_SET_POOL,
3998 hmm_alloc(sizeof(struct ia_css_isp_parameter_set_info), HMM_BO_PRIVATE, 0, NULL, 0));
3999 succ = (*out != mmgr_NULL);
4000 if (succ)
4001 hmm_store(*out,
4002 me, sizeof(struct ia_css_isp_parameter_set_info));
4003 else
4004 err = -ENOMEM;
4005
4006 IA_CSS_LEAVE_ERR_PRIVATE(err);
4007 return err;
4008}
4009
4010static int
4011free_ia_css_isp_parameter_set_info(
4012 ia_css_ptr ptr)
4013{
4014 int err = 0;
4015 struct ia_css_isp_parameter_set_info isp_params_info;
4016 unsigned int i;
4017 ia_css_ptr *addrs = (ia_css_ptr *)&isp_params_info.mem_map;
4018
4019 IA_CSS_ENTER_PRIVATE("ptr = %u", ptr);
4020
4021
4022 if (!ia_css_refcount_is_valid(ptr)) {
4023 IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_SET_POOL(0x%x) invalid arg", __func__,
4024 ptr);
4025 err = -EINVAL;
4026 IA_CSS_LEAVE_ERR_PRIVATE(err);
4027 return err;
4028 }
4029
4030 hmm_load(ptr, &isp_params_info.mem_map, sizeof(struct sh_css_ddr_address_map));
4031
4032 for (i = 0; i < (sizeof(struct sh_css_ddr_address_map_size) /
4033 sizeof(size_t)); i++) {
4034 if (addrs[i] == mmgr_NULL)
4035 continue;
4036
4037
4038 if (!ia_css_refcount_is_valid(addrs[i])) {
4039 IA_CSS_ERROR("%s: IA_CSS_REFCOUNT_PARAM_BUFFER(0x%x) invalid arg", __func__,
4040 ptr);
4041 err = -EINVAL;
4042 continue;
4043 }
4044
4045 ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_BUFFER, addrs[i]);
4046 }
4047 ia_css_refcount_decrement(IA_CSS_REFCOUNT_PARAM_SET_POOL, ptr);
4048
4049 IA_CSS_LEAVE_ERR_PRIVATE(err);
4050 return err;
4051}
4052
4053
4054void
4055sh_css_invalidate_params(struct ia_css_stream *stream)
4056{
4057 struct ia_css_isp_parameters *params;
4058 unsigned int i, j, mem;
4059
4060 IA_CSS_ENTER_PRIVATE("void");
4061 assert(stream);
4062
4063 params = stream->isp_params_configs;
4064 params->isp_params_changed = true;
4065 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
4066 for (j = 0; j < SH_CSS_MAX_STAGES; j++) {
4067 for (mem = 0; mem < N_IA_CSS_MEMORIES; mem++) {
4068 params->isp_mem_params_changed[i][j][mem] = true;
4069 }
4070 }
4071 }
4072
4073 memset(¶ms->config_changed[0], 1, sizeof(params->config_changed));
4074 params->dis_coef_table_changed = true;
4075 params->dvs2_coef_table_changed = true;
4076 params->morph_table_changed = true;
4077 params->sc_table_changed = true;
4078 params->dz_config_changed = true;
4079 params->motion_config_changed = true;
4080
4081
4082 for (i = 0; i < IA_CSS_PIPE_ID_NUM; i++) {
4083 if (params->pipe_dvs_6axis_config[i]) {
4084 free_dvs_6axis_table(¶ms->pipe_dvs_6axis_config[i]);
4085 params->pipe_dvs_6axis_config_changed[i] = true;
4086 }
4087 }
4088
4089 IA_CSS_LEAVE_PRIVATE("void");
4090}
4091
4092void
4093sh_css_update_uds_and_crop_info(
4094 const struct ia_css_binary_info *info,
4095 const struct ia_css_frame_info *in_frame_info,
4096 const struct ia_css_frame_info *out_frame_info,
4097 const struct ia_css_resolution *dvs_env,
4098 const struct ia_css_dz_config *zoom,
4099 const struct ia_css_vector *motion_vector,
4100 struct sh_css_uds_info *uds,
4101 struct sh_css_crop_pos *sp_out_crop_pos,
4102
4103 bool enable_zoom)
4104{
4105 IA_CSS_ENTER_PRIVATE("void");
4106
4107 assert(info);
4108 assert(in_frame_info);
4109 assert(out_frame_info);
4110 assert(dvs_env);
4111 assert(zoom);
4112 assert(motion_vector);
4113 assert(uds);
4114 assert(sp_out_crop_pos);
4115
4116 uds->curr_dx = enable_zoom ? (uint16_t)zoom->dx : HRT_GDC_N;
4117 uds->curr_dy = enable_zoom ? (uint16_t)zoom->dy : HRT_GDC_N;
4118
4119 if (info->enable.dvs_envelope) {
4120 unsigned int crop_x = 0,
4121 crop_y = 0,
4122 uds_xc = 0,
4123 uds_yc = 0,
4124 env_width, env_height;
4125 int half_env_x, half_env_y;
4126 int motion_x = motion_vector->x;
4127 int motion_y = motion_vector->y;
4128 bool upscale_x = in_frame_info->res.width < out_frame_info->res.width;
4129 bool upscale_y = in_frame_info->res.height < out_frame_info->res.height;
4130
4131 if (info->enable.uds && !info->enable.ds) {
4132
4133
4134
4135
4136
4137 env_width = dvs_env->width -
4138 SH_CSS_MIN_DVS_ENVELOPE;
4139 env_height = dvs_env->height -
4140 SH_CSS_MIN_DVS_ENVELOPE;
4141 half_env_x = env_width / 2;
4142 half_env_y = env_height / 2;
4143
4144
4145
4146
4147
4148 if (upscale_x) {
4149 uds_xc = (in_frame_info->res.width
4150 + env_width
4151 + SH_CSS_MIN_DVS_ENVELOPE) / 2;
4152 } else {
4153 uds_xc = (out_frame_info->res.width
4154 + env_width) / 2
4155 + SH_CSS_MIN_DVS_ENVELOPE;
4156 }
4157 if (upscale_y) {
4158 uds_yc = (in_frame_info->res.height
4159 + env_height
4160 + SH_CSS_MIN_DVS_ENVELOPE) / 2;
4161 } else {
4162 uds_yc = (out_frame_info->res.height
4163 + env_height) / 2
4164 + SH_CSS_MIN_DVS_ENVELOPE;
4165 }
4166
4167 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4168 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4169 uds_xc += motion_x;
4170 uds_yc += motion_y;
4171
4172 crop_y = 2;
4173 } else if (info->enable.ds) {
4174 env_width = dvs_env->width;
4175 env_height = dvs_env->height;
4176 half_env_x = env_width / 2;
4177 half_env_y = env_height / 2;
4178
4179 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4180 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4181
4182
4183 uds_xc = in_frame_info->res.width / 2 + motion_x;
4184 uds_yc = in_frame_info->res.height / 2 + motion_y;
4185 crop_x = info->pipeline.left_cropping;
4186
4187
4188 if (info->enable.ds & 1)
4189 crop_y = info->pipeline.top_cropping;
4190 else
4191 crop_y = 2;
4192 } else {
4193
4194
4195 env_width = dvs_env->width -
4196 SH_CSS_MIN_DVS_ENVELOPE;
4197 env_height = dvs_env->height -
4198 SH_CSS_MIN_DVS_ENVELOPE;
4199 half_env_x = env_width / 2;
4200 half_env_y = env_height / 2;
4201 motion_x = clamp(motion_x, -half_env_x, half_env_x);
4202 motion_y = clamp(motion_y, -half_env_y, half_env_y);
4203 crop_x = SH_CSS_MIN_DVS_ENVELOPE
4204 + half_env_x + motion_x;
4205 crop_y = SH_CSS_MIN_DVS_ENVELOPE
4206 + half_env_y + motion_y;
4207 }
4208
4209
4210 crop_x = EVEN_FLOOR(crop_x);
4211 crop_y = EVEN_FLOOR(crop_y);
4212 uds_xc = EVEN_FLOOR(uds_xc);
4213 uds_yc = EVEN_FLOOR(uds_yc);
4214
4215 uds->xc = (uint16_t)uds_xc;
4216 uds->yc = (uint16_t)uds_yc;
4217 sp_out_crop_pos->x = (uint16_t)crop_x;
4218 sp_out_crop_pos->y = (uint16_t)crop_y;
4219 } else {
4220
4221 uds->xc = (uint16_t)in_frame_info->res.width / 2;
4222 uds->yc = (uint16_t)in_frame_info->res.height / 2;
4223 sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
4224 sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
4225 }
4226 IA_CSS_LEAVE_PRIVATE("void");
4227}
4228
4229static int
4230sh_css_update_uds_and_crop_info_based_on_zoom_region(
4231 const struct ia_css_binary_info *info,
4232 const struct ia_css_frame_info *in_frame_info,
4233 const struct ia_css_frame_info *out_frame_info,
4234 const struct ia_css_resolution *dvs_env,
4235 const struct ia_css_dz_config *zoom,
4236 const struct ia_css_vector *motion_vector,
4237 struct sh_css_uds_info *uds,
4238 struct sh_css_crop_pos *sp_out_crop_pos,
4239 struct ia_css_resolution pipe_in_res,
4240 bool enable_zoom)
4241{
4242 unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
4243 int err = 0;
4244
4245
4246
4247
4248
4249
4250
4251
4252 unsigned int filter_envelope = 0;
4253
4254 IA_CSS_ENTER_PRIVATE("void");
4255
4256 assert(info);
4257 assert(in_frame_info);
4258 assert(out_frame_info);
4259 assert(dvs_env);
4260 assert(zoom);
4261 assert(motion_vector);
4262 assert(uds);
4263 assert(sp_out_crop_pos);
4264 x0 = zoom->zoom_region.origin.x;
4265 y0 = zoom->zoom_region.origin.y;
4266 x1 = zoom->zoom_region.resolution.width + x0;
4267 y1 = zoom->zoom_region.resolution.height + y0;
4268
4269 if ((x0 > x1) || (y0 > y1) || (x1 > pipe_in_res.width) || (y1 > pipe_in_res.height))
4270 return -EINVAL;
4271
4272 if (!enable_zoom) {
4273 uds->curr_dx = HRT_GDC_N;
4274 uds->curr_dy = HRT_GDC_N;
4275 }
4276
4277 if (info->enable.dvs_envelope) {
4278
4279
4280 return -EINVAL;
4281 } else {
4282 if (enable_zoom) {
4283
4284
4285
4286
4287 if (in_frame_info->res.width != pipe_in_res.width ||
4288 in_frame_info->res.height != pipe_in_res.height) {
4289 x0 = (x0 * in_frame_info->res.width) / (pipe_in_res.width);
4290 y0 = (y0 * in_frame_info->res.height) / (pipe_in_res.height);
4291 x1 = (x1 * in_frame_info->res.width) / (pipe_in_res.width);
4292 y1 = (y1 * in_frame_info->res.height) / (pipe_in_res.height);
4293 }
4294 uds->curr_dx =
4295 ((x1 - x0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.width;
4296 uds->curr_dy =
4297 ((y1 - y0 - filter_envelope) * HRT_GDC_N) / in_frame_info->res.height;
4298
4299
4300 uds->xc = (uint16_t)x0 + (((x1) - (x0)) / 2);
4301 uds->yc = (uint16_t)y0 + (((y1) - (y0)) / 2);
4302 } else {
4303 uds->xc = (uint16_t)in_frame_info->res.width / 2;
4304 uds->yc = (uint16_t)in_frame_info->res.height / 2;
4305 }
4306
4307 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
4308 "uds->curr_dx=%d, uds->xc=%d, uds->yc=%d\n",
4309 uds->curr_dx, uds->xc, uds->yc);
4310 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "x0=%d, y0=%d, x1=%d, y1=%d\n",
4311 x0, y0, x1, y1);
4312 sp_out_crop_pos->x = (uint16_t)info->pipeline.left_cropping;
4313 sp_out_crop_pos->y = (uint16_t)info->pipeline.top_cropping;
4314 }
4315 IA_CSS_LEAVE_PRIVATE("void");
4316 return err;
4317}
4318
4319struct ia_css_3a_statistics *
4320ia_css_3a_statistics_allocate(const struct ia_css_3a_grid_info *grid)
4321{
4322 struct ia_css_3a_statistics *me;
4323 int grid_size;
4324
4325 IA_CSS_ENTER("grid=%p", grid);
4326
4327 assert(grid);
4328
4329 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4330 if (!me)
4331 goto err;
4332
4333 me->grid = *grid;
4334 grid_size = grid->width * grid->height;
4335 me->data = kvmalloc(grid_size * sizeof(*me->data), GFP_KERNEL);
4336 if (!me->data)
4337 goto err;
4338#if !defined(HAS_NO_HMEM)
4339
4340 me->rgby_data = kvmalloc(sizeof_hmem(HMEM0_ID), GFP_KERNEL);
4341#else
4342 me->rgby_data = NULL;
4343#endif
4344
4345 IA_CSS_LEAVE("return=%p", me);
4346 return me;
4347err:
4348 ia_css_3a_statistics_free(me);
4349
4350 IA_CSS_LEAVE("return=%p", NULL);
4351 return NULL;
4352}
4353
4354void
4355ia_css_3a_statistics_free(struct ia_css_3a_statistics *me)
4356{
4357 if (me) {
4358 kvfree(me->rgby_data);
4359 kvfree(me->data);
4360 kvfree(me);
4361 }
4362}
4363
4364struct ia_css_dvs_statistics *
4365ia_css_dvs_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
4366{
4367 struct ia_css_dvs_statistics *me;
4368
4369 assert(grid);
4370
4371 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4372 if (!me)
4373 goto err;
4374
4375 me->grid = *grid;
4376 me->hor_proj = kvmalloc(grid->height * IA_CSS_DVS_NUM_COEF_TYPES *
4377 sizeof(*me->hor_proj), GFP_KERNEL);
4378 if (!me->hor_proj)
4379 goto err;
4380
4381 me->ver_proj = kvmalloc(grid->width * IA_CSS_DVS_NUM_COEF_TYPES *
4382 sizeof(*me->ver_proj), GFP_KERNEL);
4383 if (!me->ver_proj)
4384 goto err;
4385
4386 return me;
4387err:
4388 ia_css_dvs_statistics_free(me);
4389 return NULL;
4390}
4391
4392void
4393ia_css_dvs_statistics_free(struct ia_css_dvs_statistics *me)
4394{
4395 if (me) {
4396 kvfree(me->hor_proj);
4397 kvfree(me->ver_proj);
4398 kvfree(me);
4399 }
4400}
4401
4402struct ia_css_dvs_coefficients *
4403ia_css_dvs_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
4404{
4405 struct ia_css_dvs_coefficients *me;
4406
4407 assert(grid);
4408
4409 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4410 if (!me)
4411 goto err;
4412
4413 me->grid = *grid;
4414
4415 me->hor_coefs = kvmalloc(grid->num_hor_coefs *
4416 IA_CSS_DVS_NUM_COEF_TYPES *
4417 sizeof(*me->hor_coefs), GFP_KERNEL);
4418 if (!me->hor_coefs)
4419 goto err;
4420
4421 me->ver_coefs = kvmalloc(grid->num_ver_coefs *
4422 IA_CSS_DVS_NUM_COEF_TYPES *
4423 sizeof(*me->ver_coefs), GFP_KERNEL);
4424 if (!me->ver_coefs)
4425 goto err;
4426
4427 return me;
4428err:
4429 ia_css_dvs_coefficients_free(me);
4430 return NULL;
4431}
4432
4433void
4434ia_css_dvs_coefficients_free(struct ia_css_dvs_coefficients *me)
4435{
4436 if (me) {
4437 kvfree(me->hor_coefs);
4438 kvfree(me->ver_coefs);
4439 kvfree(me);
4440 }
4441}
4442
4443struct ia_css_dvs2_statistics *
4444ia_css_dvs2_statistics_allocate(const struct ia_css_dvs_grid_info *grid)
4445{
4446 struct ia_css_dvs2_statistics *me;
4447
4448 assert(grid);
4449
4450 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4451 if (!me)
4452 goto err;
4453
4454 me->grid = *grid;
4455
4456 me->hor_prod.odd_real = kvmalloc(grid->aligned_width *
4457 grid->aligned_height *
4458 sizeof(*me->hor_prod.odd_real),
4459 GFP_KERNEL);
4460 if (!me->hor_prod.odd_real)
4461 goto err;
4462
4463 me->hor_prod.odd_imag = kvmalloc(grid->aligned_width *
4464 grid->aligned_height *
4465 sizeof(*me->hor_prod.odd_imag),
4466 GFP_KERNEL);
4467 if (!me->hor_prod.odd_imag)
4468 goto err;
4469
4470 me->hor_prod.even_real = kvmalloc(grid->aligned_width *
4471 grid->aligned_height *
4472 sizeof(*me->hor_prod.even_real),
4473 GFP_KERNEL);
4474 if (!me->hor_prod.even_real)
4475 goto err;
4476
4477 me->hor_prod.even_imag = kvmalloc(grid->aligned_width *
4478 grid->aligned_height *
4479 sizeof(*me->hor_prod.even_imag),
4480 GFP_KERNEL);
4481 if (!me->hor_prod.even_imag)
4482 goto err;
4483
4484 me->ver_prod.odd_real = kvmalloc(grid->aligned_width *
4485 grid->aligned_height *
4486 sizeof(*me->ver_prod.odd_real),
4487 GFP_KERNEL);
4488 if (!me->ver_prod.odd_real)
4489 goto err;
4490
4491 me->ver_prod.odd_imag = kvmalloc(grid->aligned_width *
4492 grid->aligned_height *
4493 sizeof(*me->ver_prod.odd_imag),
4494 GFP_KERNEL);
4495 if (!me->ver_prod.odd_imag)
4496 goto err;
4497
4498 me->ver_prod.even_real = kvmalloc(grid->aligned_width *
4499 grid->aligned_height *
4500 sizeof(*me->ver_prod.even_real),
4501 GFP_KERNEL);
4502 if (!me->ver_prod.even_real)
4503 goto err;
4504
4505 me->ver_prod.even_imag = kvmalloc(grid->aligned_width *
4506 grid->aligned_height *
4507 sizeof(*me->ver_prod.even_imag),
4508 GFP_KERNEL);
4509 if (!me->ver_prod.even_imag)
4510 goto err;
4511
4512 return me;
4513err:
4514 ia_css_dvs2_statistics_free(me);
4515 return NULL;
4516}
4517
4518void
4519ia_css_dvs2_statistics_free(struct ia_css_dvs2_statistics *me)
4520{
4521 if (me) {
4522 kvfree(me->hor_prod.odd_real);
4523 kvfree(me->hor_prod.odd_imag);
4524 kvfree(me->hor_prod.even_real);
4525 kvfree(me->hor_prod.even_imag);
4526 kvfree(me->ver_prod.odd_real);
4527 kvfree(me->ver_prod.odd_imag);
4528 kvfree(me->ver_prod.even_real);
4529 kvfree(me->ver_prod.even_imag);
4530 kvfree(me);
4531 }
4532}
4533
4534struct ia_css_dvs2_coefficients *
4535ia_css_dvs2_coefficients_allocate(const struct ia_css_dvs_grid_info *grid)
4536{
4537 struct ia_css_dvs2_coefficients *me;
4538
4539 assert(grid);
4540
4541 me = kvcalloc(1, sizeof(*me), GFP_KERNEL);
4542 if (!me)
4543 goto err;
4544
4545 me->grid = *grid;
4546
4547 me->hor_coefs.odd_real = kvmalloc(grid->num_hor_coefs *
4548 sizeof(*me->hor_coefs.odd_real),
4549 GFP_KERNEL);
4550 if (!me->hor_coefs.odd_real)
4551 goto err;
4552
4553 me->hor_coefs.odd_imag = kvmalloc(grid->num_hor_coefs *
4554 sizeof(*me->hor_coefs.odd_imag),
4555 GFP_KERNEL);
4556 if (!me->hor_coefs.odd_imag)
4557 goto err;
4558
4559 me->hor_coefs.even_real = kvmalloc(grid->num_hor_coefs *
4560 sizeof(*me->hor_coefs.even_real),
4561 GFP_KERNEL);
4562 if (!me->hor_coefs.even_real)
4563 goto err;
4564
4565 me->hor_coefs.even_imag = kvmalloc(grid->num_hor_coefs *
4566 sizeof(*me->hor_coefs.even_imag),
4567 GFP_KERNEL);
4568 if (!me->hor_coefs.even_imag)
4569 goto err;
4570
4571 me->ver_coefs.odd_real = kvmalloc(grid->num_ver_coefs *
4572 sizeof(*me->ver_coefs.odd_real),
4573 GFP_KERNEL);
4574 if (!me->ver_coefs.odd_real)
4575 goto err;
4576
4577 me->ver_coefs.odd_imag = kvmalloc(grid->num_ver_coefs *
4578 sizeof(*me->ver_coefs.odd_imag),
4579 GFP_KERNEL);
4580 if (!me->ver_coefs.odd_imag)
4581 goto err;
4582
4583 me->ver_coefs.even_real = kvmalloc(grid->num_ver_coefs *
4584 sizeof(*me->ver_coefs.even_real),
4585 GFP_KERNEL);
4586 if (!me->ver_coefs.even_real)
4587 goto err;
4588
4589 me->ver_coefs.even_imag = kvmalloc(grid->num_ver_coefs *
4590 sizeof(*me->ver_coefs.even_imag),
4591 GFP_KERNEL);
4592 if (!me->ver_coefs.even_imag)
4593 goto err;
4594
4595 return me;
4596err:
4597 ia_css_dvs2_coefficients_free(me);
4598 return NULL;
4599}
4600
4601void
4602ia_css_dvs2_coefficients_free(struct ia_css_dvs2_coefficients *me)
4603{
4604 if (me) {
4605 kvfree(me->hor_coefs.odd_real);
4606 kvfree(me->hor_coefs.odd_imag);
4607 kvfree(me->hor_coefs.even_real);
4608 kvfree(me->hor_coefs.even_imag);
4609 kvfree(me->ver_coefs.odd_real);
4610 kvfree(me->ver_coefs.odd_imag);
4611 kvfree(me->ver_coefs.even_real);
4612 kvfree(me->ver_coefs.even_imag);
4613 kvfree(me);
4614 }
4615}
4616
4617struct ia_css_dvs_6axis_config *
4618ia_css_dvs2_6axis_config_allocate(const struct ia_css_stream *stream)
4619{
4620 struct ia_css_dvs_6axis_config *dvs_config = NULL;
4621 struct ia_css_isp_parameters *params = NULL;
4622 unsigned int width_y;
4623 unsigned int height_y;
4624 unsigned int width_uv;
4625 unsigned int height_uv;
4626
4627 assert(stream);
4628 params = stream->isp_params_configs;
4629
4630
4631 if (!params || !params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO])
4632 goto err;
4633
4634 dvs_config = kvcalloc(1, sizeof(struct ia_css_dvs_6axis_config),
4635 GFP_KERNEL);
4636 if (!dvs_config)
4637 goto err;
4638
4639 dvs_config->width_y = width_y =
4640 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_y;
4641 dvs_config->height_y = height_y =
4642 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_y;
4643 dvs_config->width_uv = width_uv =
4644 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->width_uv;
4645 dvs_config->height_uv = height_uv =
4646 params->pipe_dvs_6axis_config[IA_CSS_PIPE_ID_VIDEO]->height_uv;
4647 IA_CSS_LOG("table Y: W %d H %d", width_y, height_y);
4648 IA_CSS_LOG("table UV: W %d H %d", width_uv, height_uv);
4649 dvs_config->xcoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
4650 GFP_KERNEL);
4651 if (!dvs_config->xcoords_y)
4652 goto err;
4653
4654 dvs_config->ycoords_y = kvmalloc(width_y * height_y * sizeof(uint32_t),
4655 GFP_KERNEL);
4656 if (!dvs_config->ycoords_y)
4657 goto err;
4658
4659 dvs_config->xcoords_uv = kvmalloc(width_uv * height_uv *
4660 sizeof(uint32_t),
4661 GFP_KERNEL);
4662 if (!dvs_config->xcoords_uv)
4663 goto err;
4664
4665 dvs_config->ycoords_uv = kvmalloc(width_uv * height_uv *
4666 sizeof(uint32_t),
4667 GFP_KERNEL);
4668 if (!dvs_config->ycoords_uv)
4669 goto err;
4670
4671 return dvs_config;
4672err:
4673 ia_css_dvs2_6axis_config_free(dvs_config);
4674 return NULL;
4675}
4676
4677void
4678ia_css_dvs2_6axis_config_free(struct ia_css_dvs_6axis_config *dvs_6axis_config)
4679{
4680 if (dvs_6axis_config) {
4681 kvfree(dvs_6axis_config->xcoords_y);
4682 kvfree(dvs_6axis_config->ycoords_y);
4683 kvfree(dvs_6axis_config->xcoords_uv);
4684 kvfree(dvs_6axis_config->ycoords_uv);
4685 kvfree(dvs_6axis_config);
4686 }
4687}
4688
4689void
4690ia_css_en_dz_capt_pipe(struct ia_css_stream *stream, bool enable)
4691{
4692 struct ia_css_pipe *pipe;
4693 struct ia_css_pipeline *pipeline;
4694 struct ia_css_pipeline_stage *stage;
4695 enum ia_css_pipe_id pipe_id;
4696 int err;
4697 int i;
4698
4699 if (!stream)
4700 return;
4701
4702 for (i = 0; i < stream->num_pipes; i++) {
4703 pipe = stream->pipes[i];
4704 pipeline = ia_css_pipe_get_pipeline(pipe);
4705 pipe_id = pipeline->pipe_id;
4706
4707 if (pipe_id == IA_CSS_PIPE_ID_CAPTURE) {
4708 err = ia_css_pipeline_get_stage(pipeline, IA_CSS_BINARY_MODE_CAPTURE_PP,
4709 &stage);
4710 if (!err)
4711 stage->enable_zoom = enable;
4712 break;
4713 }
4714 }
4715}
4716