1 /*
2 * vendor/amlogic/media/common/ge2d/ge2dgen.c
3 *
4 * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 */
17
18 /* Amlogic Headers */
19 #include <linux/amlogic/media/ge2d/ge2d.h>
20
_set_src1_format(struct ge2d_src1_data_s * src1_data_cfg,struct ge2d_src1_gen_s * src1_gen_cfg,struct ge2d_dp_gen_s * dp_gen_cfg,unsigned int format_src,unsigned int format_dst)21 static inline void _set_src1_format(struct ge2d_src1_data_s *src1_data_cfg, struct ge2d_src1_gen_s *src1_gen_cfg,
22 struct ge2d_dp_gen_s *dp_gen_cfg, unsigned int format_src, unsigned int format_dst)
23 {
24 src1_data_cfg->format_all = format_src;
25
26 src1_data_cfg->format = (format_src >> 8L) & 3L;
27 src1_data_cfg->mode_8b_sel = (format_src >> 6L) & 3L;
28 src1_data_cfg->lut_en = (format_src >> 5L) & 1;
29 src1_data_cfg->sep_en = (format_src >> 2L) & 1;
30
31 src1_data_cfg->endian = (format_src & GE2D_ENDIAN_MASK) >> GE2D_ENDIAN_SHIFT;
32 src1_data_cfg->color_map = (format_src & GE2D_COLOR_MAP_MASK) >> GE2D_COLOR_MAP_SHIFT;
33
34 src1_gen_cfg->pic_struct = (format_src >> 3L) & 3L;
35 src1_data_cfg->x_yc_ratio = (format_src >> 1) & 1;
36 src1_data_cfg->y_yc_ratio = (format_src >> 0) & 1;
37
38 if (format_src & GE2D_FORMAT_DEEP_COLOR) {
39 src1_data_cfg->deep_color = 1;
40 } else {
41 src1_data_cfg->deep_color = 0;
42 }
43
44 if ((format_src & GE2D_MATRIX_CUSTOM) || (format_dst & GE2D_MATRIX_CUSTOM)) {
45 dp_gen_cfg->use_matrix_default = MATRIX_CUSTOM;
46 dp_gen_cfg->conv_matrix_en = 1;
47 return;
48 }
49
50 if ((format_src & GE2D_FORMAT_YUV) && ((format_dst & GE2D_FORMAT_YUV) == 0)) {
51 dp_gen_cfg->use_matrix_default =
52 (format_src & GE2D_FORMAT_FULL_RANGE) ? MATRIX_FULL_RANGE_YCC_TO_RGB : MATRIX_YCC_TO_RGB;
53 dp_gen_cfg->conv_matrix_en = 1;
54 } else if (((format_src & GE2D_FORMAT_YUV) == 0) && (format_dst & GE2D_FORMAT_YUV)) {
55 dp_gen_cfg->use_matrix_default =
56 (format_dst & GE2D_FORMAT_FULL_RANGE) ? MATRIX_RGB_TO_FULL_RANGE_YCC : MATRIX_RGB_TO_YCC;
57 dp_gen_cfg->use_matrix_default |= ((format_dst & GE2D_FORMAT_BT_STANDARD) ? MATRIX_BT_709 : MATRIX_BT_601);
58 dp_gen_cfg->conv_matrix_en = 1;
59 } else {
60 dp_gen_cfg->conv_matrix_en = 0;
61 }
62 }
63
_set_src2_format(struct ge2d_src2_dst_data_s * src2_dst_data_cfg,struct ge2d_src2_dst_gen_s * src2_dst_gen_cfg,unsigned int format)64 static inline void _set_src2_format(struct ge2d_src2_dst_data_s *src2_dst_data_cfg,
65 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg, unsigned int format)
66 {
67 src2_dst_data_cfg->src2_format_all = format;
68
69 src2_dst_data_cfg->src2_format = (format >> 8L) & 3L;
70 src2_dst_data_cfg->src2_endian = (format & GE2D_ENDIAN_MASK) >> GE2D_ENDIAN_SHIFT;
71 src2_dst_data_cfg->src2_color_map = (format & GE2D_COLOR_MAP_MASK) >> GE2D_COLOR_MAP_SHIFT;
72
73 src2_dst_data_cfg->src2_mode_8b_sel = (format >> 6L) & 3L;
74
75 src2_dst_gen_cfg->src2_pic_struct = (format >> 3L) & 3L;
76 }
77
_set_dst_format(struct ge2d_src2_dst_data_s * src2_dst_data_cfg,struct ge2d_src2_dst_gen_s * src2_dst_gen_cfg,struct ge2d_dp_gen_s * dp_gen_cfg,unsigned int format_src,unsigned int format_dst)78 static inline void _set_dst_format(struct ge2d_src2_dst_data_s *src2_dst_data_cfg,
79 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg, struct ge2d_dp_gen_s *dp_gen_cfg,
80 unsigned int format_src, unsigned int format_dst)
81 {
82 unsigned int y_yc_ratio;
83
84 src2_dst_data_cfg->dst_format_all = format_dst;
85 src2_dst_data_cfg->dst_format = (format_dst >> 8L) & 3L;
86 src2_dst_data_cfg->dst_endian = (format_dst & GE2D_ENDIAN_MASK) >> GE2D_ENDIAN_SHIFT;
87 src2_dst_data_cfg->dst_color_map = (format_dst & GE2D_COLOR_MAP_MASK) >> GE2D_COLOR_MAP_SHIFT;
88
89 src2_dst_data_cfg->dst_mode_8b_sel = (format_dst >> 6L) & 3L;
90 src2_dst_gen_cfg->dst_pic_struct = (format_dst >> 3L) & 3L;
91
92 y_yc_ratio = (format_dst >> 0) & 1;
93
94 if ((format_dst & GE2D_FORMAT_YUV) && ((src2_dst_data_cfg->dst_color_map | 1) == 15L)) {
95 src2_dst_data_cfg->dst_format = 0;
96 src2_dst_data_cfg->dst_mode_8b_sel = 0;
97 src2_dst_data_cfg->dst2_pixel_byte_width = 1;
98 if (y_yc_ratio == 0) {
99 src2_dst_data_cfg->dst2_discard_mode = 0xc;
100 } else {
101 src2_dst_data_cfg->dst2_discard_mode = 0xf;
102 }
103 src2_dst_data_cfg->dst2_enable = 1;
104 src2_dst_data_cfg->dst2_color_map = src2_dst_data_cfg->dst_color_map - 5L;
105 } else {
106 src2_dst_data_cfg->dst2_enable = 0;
107 }
108 /* #endif */
109
110 if ((format_src & GE2D_MATRIX_CUSTOM) || (format_dst & GE2D_MATRIX_CUSTOM)) {
111 dp_gen_cfg->use_matrix_default = MATRIX_CUSTOM;
112 dp_gen_cfg->conv_matrix_en = 1;
113 return;
114 }
115
116 if ((format_src & GE2D_FORMAT_YUV) && ((format_dst & GE2D_FORMAT_YUV) == 0)) {
117 dp_gen_cfg->use_matrix_default =
118 (format_src & GE2D_FORMAT_FULL_RANGE) ? MATRIX_FULL_RANGE_YCC_TO_RGB : MATRIX_YCC_TO_RGB;
119 dp_gen_cfg->conv_matrix_en = 1;
120 } else if (((format_src & GE2D_FORMAT_YUV) == 0) && (format_dst & GE2D_FORMAT_YUV)) {
121 dp_gen_cfg->use_matrix_default =
122 (format_dst & GE2D_FORMAT_FULL_RANGE) ? MATRIX_RGB_TO_FULL_RANGE_YCC : MATRIX_RGB_TO_YCC;
123 dp_gen_cfg->use_matrix_default |= ((format_dst & GE2D_FORMAT_BT_STANDARD) ? MATRIX_BT_709 : MATRIX_BT_601);
124 dp_gen_cfg->conv_matrix_en = 1;
125 } else {
126 dp_gen_cfg->conv_matrix_en = 0;
127 }
128 }
129
ge2dgen_src(struct ge2d_context_s * wq,unsigned int canvas_addr,unsigned int format,unsigned int phy_addr,unsigned int stride)130 void ge2dgen_src(struct ge2d_context_s *wq, unsigned int canvas_addr, unsigned int format, unsigned int phy_addr,
131 unsigned int stride)
132 {
133 struct ge2d_src1_data_s *src1_data_cfg = ge2d_wq_get_src_data(wq);
134 struct ge2d_src1_gen_s *src1_gen_cfg = ge2d_wq_get_src_gen(wq);
135 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
136 struct ge2d_src2_dst_data_s *src2_dst_data_cfg = ge2d_wq_get_dst_data(wq);
137
138 if ((format != src1_data_cfg->format_all) || (canvas_addr != src1_data_cfg->canaddr) ||
139 (phy_addr != src1_data_cfg->phy_addr) || (stride != src1_data_cfg->stride)) {
140 src1_data_cfg->canaddr = canvas_addr;
141
142 _set_src1_format(src1_data_cfg, src1_gen_cfg, dp_gen_cfg, format, src2_dst_data_cfg->dst_format_all);
143 src1_data_cfg->phy_addr = phy_addr;
144 src1_data_cfg->stride = stride;
145 wq->config.update_flag |= UPDATE_SRC_DATA;
146 wq->config.update_flag |= UPDATE_SRC_GEN;
147 wq->config.update_flag |= UPDATE_DP_GEN;
148 }
149 }
150
ge2dgen_antiflicker(struct ge2d_context_s * wq,unsigned long enable)151 void ge2dgen_antiflicker(struct ge2d_context_s *wq, unsigned long enable)
152 {
153 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
154 unsigned long enable_tmp = enable;
155
156 enable_tmp = enable_tmp ? 1 : 0;
157
158 if (dp_gen_cfg->antiflick_en != enable_tmp) {
159 dp_gen_cfg->antiflick_en = enable_tmp;
160 wq->config.update_flag |= UPDATE_DP_GEN;
161 }
162 }
ge2dgen_post_release_src1buf(struct ge2d_context_s * wq,unsigned int buffer)163 void ge2dgen_post_release_src1buf(struct ge2d_context_s *wq, unsigned int buffer)
164 {
165 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
166
167 ge2d_cmd_cfg->src1_buffer = buffer;
168 ge2d_cmd_cfg->release_flag |= RELEASE_SRC1_BUFFER;
169 }
170
ge2dgen_post_release_src1canvas(struct ge2d_context_s * wq)171 void ge2dgen_post_release_src1canvas(struct ge2d_context_s *wq)
172 {
173 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
174
175 ge2d_cmd_cfg->release_flag |= RELEASE_SRC1_CANVAS;
176 }
177
ge2dgen_post_release_src2buf(struct ge2d_context_s * wq,unsigned int buffer)178 void ge2dgen_post_release_src2buf(struct ge2d_context_s *wq, unsigned int buffer)
179 {
180 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
181
182 ge2d_cmd_cfg->src2_buffer = buffer;
183 ge2d_cmd_cfg->release_flag |= RELEASE_SRC2_BUFFER;
184 }
185
ge2dgen_post_release_src2canvas(struct ge2d_context_s * wq)186 void ge2dgen_post_release_src2canvas(struct ge2d_context_s *wq)
187 {
188 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
189
190 ge2d_cmd_cfg->release_flag |= RELEASE_SRC2_CANVAS;
191 }
192
ge2dgen_cb(struct ge2d_context_s * wq,int (* cmd_cb)(unsigned int),unsigned int param)193 void ge2dgen_cb(struct ge2d_context_s *wq, int (*cmd_cb)(unsigned int), unsigned int param)
194 {
195 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
196
197 ge2d_cmd_cfg->cmd_cb = cmd_cb;
198 ge2d_cmd_cfg->cmd_cb_param = param;
199 ge2d_cmd_cfg->release_flag |= RELEASE_CB;
200 }
201
ge2dgen_src2(struct ge2d_context_s * wq,unsigned int canvas_addr,unsigned int format,unsigned int phy_addr,unsigned int stride)202 void ge2dgen_src2(struct ge2d_context_s *wq, unsigned int canvas_addr, unsigned int format, unsigned int phy_addr,
203 unsigned int stride)
204 {
205 struct ge2d_src2_dst_data_s *src2_dst_data_cfg = ge2d_wq_get_dst_data(wq);
206 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg = ge2d_wq_get_dst_gen(wq);
207
208 if ((format != src2_dst_data_cfg->src2_format_all) || (canvas_addr != src2_dst_data_cfg->src2_canaddr) ||
209 (phy_addr != src2_dst_data_cfg->src2_phyaddr) || (stride != src2_dst_data_cfg->src2_stride)) {
210 src2_dst_data_cfg->src2_canaddr = canvas_addr;
211
212 _set_src2_format(src2_dst_data_cfg, src2_dst_gen_cfg, format);
213 src2_dst_data_cfg->src2_phyaddr = phy_addr;
214 src2_dst_data_cfg->src2_stride = stride;
215 wq->config.update_flag |= UPDATE_DST_DATA;
216 wq->config.update_flag |= UPDATE_DST_GEN;
217 }
218 }
219
ge2dgen_dst(struct ge2d_context_s * wq,unsigned int canvas_addr,unsigned int format,unsigned int phy_addr,unsigned int stride)220 void ge2dgen_dst(struct ge2d_context_s *wq, unsigned int canvas_addr, unsigned int format, unsigned int phy_addr,
221 unsigned int stride)
222 {
223 struct ge2d_src1_data_s *src1_data_cfg = ge2d_wq_get_src_data(wq);
224 struct ge2d_src2_dst_data_s *src2_dst_data_cfg = ge2d_wq_get_dst_data(wq);
225 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg = ge2d_wq_get_dst_gen(wq);
226 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
227
228 if ((format != src2_dst_data_cfg->dst_format_all) || (canvas_addr != src2_dst_data_cfg->dst_canaddr) ||
229 (phy_addr != src2_dst_data_cfg->dst_phyaddr) || (stride != src2_dst_data_cfg->dst_stride)) {
230 src2_dst_data_cfg->dst_canaddr = canvas_addr;
231
232 _set_dst_format(src2_dst_data_cfg, src2_dst_gen_cfg, dp_gen_cfg, src1_data_cfg->format_all, format);
233 src2_dst_data_cfg->dst_phyaddr = phy_addr;
234 src2_dst_data_cfg->dst_stride = stride;
235 wq->config.update_flag |= UPDATE_DST_DATA;
236 wq->config.update_flag |= UPDATE_DST_GEN;
237 wq->config.update_flag |= UPDATE_DP_GEN;
238 }
239 }
240
ge2dgen_src_clip(struct ge2d_context_s * wq,int x,int y,int w,int h)241 void ge2dgen_src_clip(struct ge2d_context_s *wq, int x, int y, int w, int h)
242 {
243 struct ge2d_src1_gen_s *src1_gen_cfg = ge2d_wq_get_src_gen(wq);
244 /* adjust w->x_end h->y_end */
245 int w_tmp = w;
246 int h_tmp = h;
247 w_tmp = x + w_tmp - 1;
248 h_tmp = y + h_tmp - 1;
249 if (src1_gen_cfg->clipx_start != x || src1_gen_cfg->clipx_end != w_tmp || src1_gen_cfg->clipy_start != y ||
250 src1_gen_cfg->clipy_end != h_tmp) {
251 src1_gen_cfg->clipx_start = x;
252 src1_gen_cfg->clipx_end = w_tmp;
253 src1_gen_cfg->clipy_start = y;
254 src1_gen_cfg->clipy_end = h_tmp;
255 wq->config.update_flag |= UPDATE_SRC_GEN;
256 }
257 }
258
ge2dgen_src2_clip(struct ge2d_context_s * wq,int x,int y,int w,int h)259 void ge2dgen_src2_clip(struct ge2d_context_s *wq, int x, int y, int w, int h)
260 {
261 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg = ge2d_wq_get_dst_gen(wq);
262 int w_tmp = w;
263 int h_tmp = h;
264
265 /* adjust w->x_end h->y_end */
266 w_tmp = x + w_tmp - 1;
267 h_tmp = y + h_tmp - 1;
268 if (src2_dst_gen_cfg->src2_clipx_start != x || src2_dst_gen_cfg->src2_clipx_end != w_tmp ||
269 src2_dst_gen_cfg->src2_clipy_start != y || src2_dst_gen_cfg->src2_clipy_end != h_tmp) {
270 src2_dst_gen_cfg->src2_clipx_start = x;
271 src2_dst_gen_cfg->src2_clipx_end = w_tmp;
272 src2_dst_gen_cfg->src2_clipy_start = y;
273 src2_dst_gen_cfg->src2_clipy_end = h_tmp;
274 wq->config.update_flag |= UPDATE_DST_GEN;
275 }
276 }
277
ge2dgen_src_key(struct ge2d_context_s * wq,int en,int key,int keymask,int keymode)278 void ge2dgen_src_key(struct ge2d_context_s *wq, int en, int key, int keymask, int keymode)
279 {
280 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
281
282 if (dp_gen_cfg->src1_key_en != en || dp_gen_cfg->src1_key != key || dp_gen_cfg->src1_key_mask != keymask ||
283 dp_gen_cfg->src1_key_mode != keymode) {
284 dp_gen_cfg->src1_key_en = en & 0x1;
285 dp_gen_cfg->src1_key = key;
286 dp_gen_cfg->src1_key_mask = keymask;
287 dp_gen_cfg->src1_key_mode = keymode & 0x1;
288
289 dp_gen_cfg->src1_vsc_bank_length = 4L;
290 dp_gen_cfg->src1_hsc_bank_length = 4L;
291 wq->config.update_flag |= UPDATE_DP_GEN;
292 }
293 }
294 EXPORT_SYMBOL(ge2dgen_src_key);
295
ge2dgent_src_gbalpha(struct ge2d_context_s * wq,unsigned char alpha1,unsigned char alpha2)296 void ge2dgent_src_gbalpha(struct ge2d_context_s *wq, unsigned char alpha1, unsigned char alpha2)
297 {
298 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
299 #ifdef CONFIG_GE2D_SRC2
300 if ((dp_gen_cfg->src1_gb_alpha != alpha1) || (dp_gen_cfg->src2_gb_alpha != alpha2)) {
301 dp_gen_cfg->src1_gb_alpha = alpha1;
302 dp_gen_cfg->src2_gb_alpha = alpha2;
303 wq->config.update_flag |= UPDATE_DP_GEN;
304 }
305 #else
306 if (dp_gen_cfg->src1_gb_alpha != alpha1) {
307 dp_gen_cfg->src1_gb_alpha = alpha1;
308 wq->config.update_flag |= UPDATE_DP_GEN;
309 }
310 #endif
311 }
312
ge2dgen_src_color(struct ge2d_context_s * wq,unsigned int color)313 void ge2dgen_src_color(struct ge2d_context_s *wq, unsigned int color)
314 {
315 struct ge2d_src1_data_s *src1_data_cfg = ge2d_wq_get_src_data(wq);
316
317 if (src1_data_cfg->def_color != color) {
318 src1_data_cfg->def_color = color;
319 wq->config.update_flag |= UPDATE_SRC_DATA;
320 }
321 }
322
ge2dgen_rendering_dir(struct ge2d_context_s * wq,int src_x_dir,int src_y_dir,int dst_x_dir,int dst_y_dir,int dst_xy_swap)323 void ge2dgen_rendering_dir(struct ge2d_context_s *wq, int src_x_dir, int src_y_dir, int dst_x_dir, int dst_y_dir,
324 int dst_xy_swap)
325 {
326 struct ge2d_cmd_s *ge2d_cmd_cfg = ge2d_wq_get_cmd(wq);
327
328 ge2d_cmd_cfg->src1_x_rev = src_x_dir;
329 ge2d_cmd_cfg->src1_y_rev = src_y_dir;
330 ge2d_cmd_cfg->dst_x_rev = dst_x_dir;
331 ge2d_cmd_cfg->dst_y_rev = dst_y_dir;
332 ge2d_cmd_cfg->dst_xy_swap = dst_xy_swap;
333 }
334
ge2dgen_dst_clip(struct ge2d_context_s * wq,int x,int y,int w,int h,int mode)335 void ge2dgen_dst_clip(struct ge2d_context_s *wq, int x, int y, int w, int h, int mode)
336 {
337 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg = ge2d_wq_get_dst_gen(wq);
338 int w_tmp = w;
339 int h_tmp = h;
340 /* adjust w->x_end h->y_end */
341 w_tmp = x + w_tmp - 1;
342 h_tmp = y + h_tmp - 1;
343 if (src2_dst_gen_cfg->dst_clipx_start != x || src2_dst_gen_cfg->dst_clipx_end != w_tmp ||
344 src2_dst_gen_cfg->dst_clipy_start != y || src2_dst_gen_cfg->dst_clipy_end != h_tmp ||
345 src2_dst_gen_cfg->dst_clip_mode != mode) {
346 src2_dst_gen_cfg->dst_clipx_start = x;
347 src2_dst_gen_cfg->dst_clipx_end = w_tmp;
348 src2_dst_gen_cfg->dst_clipy_start = y;
349 src2_dst_gen_cfg->dst_clipy_end = h_tmp;
350 src2_dst_gen_cfg->dst_clip_mode = mode;
351 wq->config.update_flag |= UPDATE_DST_GEN;
352 }
353 }
354
ge2dgent_src2_clip(struct ge2d_context_s * wq,int x,int y,int w,int h)355 void ge2dgent_src2_clip(struct ge2d_context_s *wq, int x, int y, int w, int h)
356 {
357 struct ge2d_src2_dst_gen_s *src2_dst_gen_cfg = ge2d_wq_get_dst_gen(wq);
358 int w_tmp = w;
359 int h_tmp = h;
360 /* adjust w->x_end h->y_end */
361 w_tmp = x + w_tmp - 1;
362 h_tmp = y + h_tmp - 1;
363 if (src2_dst_gen_cfg->src2_clipx_start != x || src2_dst_gen_cfg->src2_clipx_end != w_tmp ||
364 src2_dst_gen_cfg->src2_clipy_start != y || src2_dst_gen_cfg->src2_clipy_end != h_tmp) {
365 src2_dst_gen_cfg->src2_clipx_start = x;
366 src2_dst_gen_cfg->src2_clipx_end = w_tmp;
367 src2_dst_gen_cfg->src2_clipy_start = y;
368 src2_dst_gen_cfg->src2_clipy_end = h_tmp;
369 wq->config.update_flag |= UPDATE_DST_GEN;
370 }
371 }
372
ge2dgen_const_color(struct ge2d_context_s * wq,unsigned int color)373 void ge2dgen_const_color(struct ge2d_context_s *wq, unsigned int color)
374 {
375 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
376
377 if (dp_gen_cfg->alu_const_color != color) {
378 dp_gen_cfg->alu_const_color = color;
379 wq->config.update_flag |= UPDATE_DP_GEN;
380 }
381 }
382
ge2dgen_disable_matrix(struct ge2d_context_s * wq)383 void ge2dgen_disable_matrix(struct ge2d_context_s *wq)
384 {
385 struct ge2d_dp_gen_s *dp_gen_cfg = ge2d_wq_get_dp_gen(wq);
386
387 dp_gen_cfg->conv_matrix_en = 0;
388 wq->config.update_flag |= UPDATE_DP_GEN;
389 }
390