• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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