1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 #include "tde_hal_k.h"
20 #ifdef HI_BUILD_IN_BOOT
21 #include "higo_list.h"
22 #endif
23 #include "tde_hal.h"
24 #include "wmalloc.h"
25 #include "securec.h"
26 #include "hi_common.h"
27 #include "hi_math.h"
28 #include "tde_filterpara.h"
29 #include "tde_adp.h"
30 #include "tde_osictl_k.h"
31 #include "hi_osal.h"
32
33 /* compute struct member's offset */
34 #define tde_offset_of(type, member) ((hi_u32)(&((type *)0)->member))
35
36 #define UPDATE_SIZE 64
37
38 #define NO_HSCALE_STEP 0x100000
39 #define NO_VSCALE_STEP 0x1000
40
41 #ifndef HI_BUILD_IN_BOOT
42 #define drv_tde_node_blend_mode(node, a, b) \
43 do { \
44 (node)->src1_cbmpara.bits.s1_blendmode = (a); \
45 (node)->src2_cbmpara.bits.s2_blendmode = (b); \
46 } while (0)
47 #endif
48
49 /* R/W register's encapsulation */
50 #define tde_read_reg(base, offset) (*(volatile hi_u32 *)((hi_u8 *)(base) + (offset)))
51 #define tde_write_reg(base, offset, val) (*(volatile hi_u32 *)((hi_u8 *)(base) + (offset)) = val)
52 /* TDE register's Address range */
53 #define TDE_REG_SIZE 0x4100
54
55 /* Step range's type by algorithm team */
56 #define TDE_RESIZE_PARA_AREA_0 4096 /* 1.0 */
57 #define TDE_RESIZE_PARA_AREA_1 5461 /* 0.75 */
58 #define TDE_RESIZE_PARA_AREA_2 8192 /* 0.5 */
59 #define TDE_RESIZE_PARA_AREA_3 12412 /* 0.33 */
60 #define TDE_RESIZE_PARA_AREA_4 16384 /* 0.25 */
61
62 /* coefficient table rangle of 8*32 area */
63 #define TDE_RESIZE_8X32_AREA_0 1048576 /* 1.0 */
64 #define TDE_RESIZE_8X32_AREA_1 1398101 /* 0.75 */
65 #define TDE_RESIZE_8X32_AREA_2 2097152 /* 0.5 */
66 #define TDE_RESIZE_8X32_AREA_3 3177503 /* 0.33 */
67 #define TDE_RESIZE_8X32_AREA_4 4194304 /* 0.25 */
68
69 /* Colorkey mode of CMOS chip */
70 #define TDE_COLORKEY_IGNORE 2
71 #define TDE_COLORKEY_AREA_OUT 1
72 #define TDE_COLORKEY_AREA_IN 0
73
74 /* Aq control mode */
75 #define TDE_AQ_CTRL_COMP_LIST 0x0 /* start next AQ list, after complete current list's operations */
76 #define TDE_AQ_CTRL_COMP_LINE 0x4 /* start next AQ list, after complete current node and line */
77
78 #define TDE_MAX_READ_STATUS_TIME 10
79
80 #define TDE_TWENTYFOUR_BITS_SHIFT 24
81 #define TDE_EIGHT_BITS_SHIFT 8
82 #define TDE_SIXTEEN_BITS_SHIFT 16
83
84 /* Head address of argument table used as config */
85 typedef struct {
86 hi_u64 hf_coef_addr;
87 hi_u64 vf_coef_addr;
88 #ifndef HI_BUILD_IN_BOOT
89
90 #if (TDE_CAPABILITY & DEFLICKER)
91 hi_u64 deflicker_vf_coef_addr;
92 #endif
93
94 #endif
95 } tde_para_table;
96
97 typedef struct {
98 hi_u32 alpha_en;
99 hi_u32 luma_en;
100 hi_u32 chrome_en;
101 } tde_filtermode;
102
103 /* Base addr of register after mapping */
104 volatile hi_u32 *g_base_vir_addr = HI_NULL;
105 static hi_bool g_use_dtsi = HI_TRUE;
106
107 /* Pointer of TDE clock register after mapping */
108 static volatile hi_u32 *g_tde_clock_vir = HI_NULL;
109 /* Head address of config argument table */
110 static tde_para_table g_para_table = {0};
111
112 /* Deflicker level, default is auto */
113 #ifndef HI_BUILD_IN_BOOT
114
115 #if (TDE_CAPABILITY & DEFLICKER)
116 static hi_tde_deflicker_level g_deflicker_level = HI_TDE_DEFLICKER_LEVEL_AUTO;
117 #endif
118
119 #endif
120 /* alpha threshold switch */
121 static hi_bool g_alpha_threshold = HI_FALSE;
122
123 /* alpha threshold value */
124 static hi_u8 g_alpha_threshold_value = 0xff;
125
126 static tde_alu_mode g_cbmctrl_alu_mode[TDE_BUTT + 1] = {
127 TDE_SRC2_BYPASS, TDE_ALU_NONE, TDE_ALU_ROP, TDE_SRC2_BYPASS, TDE_ALU_MASK_ROP1, TDE_ALU_MASK_ROP2,
128 TDE_ALU_MASK_BLEND, TDE_SRC2_BYPASS, TDE_SRC2_BYPASS, TDE_SRC2_BYPASS, TDE_SRC2_BYPASS, TDE_BUTT
129 };
130
131 static hi_s32 tde_hal_init_para_table(hi_void);
132
133 #ifndef HI_BUILD_IN_BOOT
134 static hi_void tde_hal_node_set_clutcolor_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key);
135 static hi_void tde_hal_node_set_ycbcr_color_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key);
136 static hi_void tde_hal_node_set_argbcolor_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key);
137
138 static hi_u32 tde_hal_get_color_key_mode(hi_tde_color_key_comp *color_key);
139 static hi_u32 tde_hal_get_ycb_cr_key_mask(hi_u8 cr, hi_u8 cb, hi_u8 cy, hi_u8 alpha);
140 static hi_u32 tde_hal_get_clut_key_mask(hi_u8 clut, hi_u8 alpha);
141 static hi_u32 tde_hal_get_argb_key_mask(hi_u8 blue, hi_u8 green, hi_u8 red, hi_u8 alpha);
142
143 #endif
144
145 static hi_s32 tde_hal_getbpp_by_fmt(tde_color_fmt fmt);
146 static hi_u32 tde_hal_get_resize_para_htable(hi_u32 step);
147 static hi_u32 tde_hal_get_resize_para_vtable(hi_u32 step);
148
149 static hi_void tde_hal_init_queue(hi_void);
150 hi_void tde_hal_set_clock(hi_bool enable);
151 static hi_s32 tde_hal_getbpp_by_fmt1(tde_color_fmt fmt);
152 static hi_s32 tde_hal_getbpp_by_fmt2(tde_color_fmt fmt);
153 static hi_s32 tde_hal_getbpp_by_fmt4(tde_color_fmt fmt);
154 static hi_s32 tde_hal_getbpp_by_fmt8(tde_color_fmt fmt);
155 static hi_s32 tde_hal_getbpp_by_fmt16(tde_color_fmt fmt);
156 static hi_s32 tde_hal_getbpp_by_fmt24(tde_color_fmt fmt);
157 static hi_s32 tde_hal_getbpp_by_fmt32(tde_color_fmt fmt);
158 #ifndef HI_BUILD_IN_BOOT
159 #define registder_flush() mb()
160 #else
161 #define registder_flush() \
162 { \
163 do { \
164 } while (0); \
165 }
166 #endif
167 static hi_bool tde_hal_is_operation_support(tde_alu_mode alu_mode, hi_u32 capability, hi_u32 oper_mode);
168 static hi_u32 tde_hal_get_zme_in_fmt(tde_color_fmt in_drv_fmt);
169 static hi_u32 tde_hal_get_hpzme_mode(hi_u32 out_rect_width, hi_u32 in_rect_width);
170 static hi_void tde_hal_get_filter_mode(hi_tde_filter_mode filter_mode, tde_filtermode *flt_mode);
171 static hi_s32 tde_hal_get_ver_scale_coeff(hi_u32 out_rect_height, hi_u32 in_rect_height, hi_s32 *ver_scale_coeff);
172
tde_fill_data_by_fmt(tde_hw_node * hw_node,hi_u32 data,tde_color_fmt fmt,hi_u8 flag)173 static hi_void tde_fill_data_by_fmt(tde_hw_node *hw_node, hi_u32 data, tde_color_fmt fmt, hi_u8 flag)
174 {
175 hi_u32 bpp, i, cell;
176 bpp = tde_hal_getbpp_by_fmt(fmt);
177 if (bpp != 0xffffffff) {
178 cell = data & (0xffffffff >> (32 - bpp)); /* 32 bpp The not, 0xffffffff mask */
179 for (i = 0; i < (32 / bpp); i++) { /* 32 bpp fmt */
180 if (flag) {
181 (hw_node->src2_fill.bits.src2_color_fill) |= (cell << (i * bpp));
182 } else {
183 (hw_node->src1_fill.bits.src1_color_fill) |= (cell << (i * bpp));
184 }
185 }
186 } else {
187 if (flag) {
188 (hw_node->src2_fill.bits.src2_color_fill) = data;
189 } else {
190 (hw_node->src1_fill.bits.src1_color_fill) = data;
191 }
192 }
193 return;
194 }
195
tde_hal_set_base_vir_addr(hi_u32 * temp_base_vir_addr)196 hi_void tde_hal_set_base_vir_addr(hi_u32 *temp_base_vir_addr)
197 {
198 g_base_vir_addr = temp_base_vir_addr;
199 }
200
tde_hal_get_base_vir_addr(hi_void)201 volatile hi_u32 *tde_hal_get_base_vir_addr(hi_void)
202 {
203 return g_base_vir_addr;
204 }
205
206 /*
207 * Function: tde_hal_init
208 * Description: map the base address for tde
209 * Input: base_addr: the base address of tde
210 * Return: success/fail
211 */
tde_hal_init(hi_u32 base_addr)212 hi_s32 tde_hal_init(hi_u32 base_addr)
213 {
214 /* init the pool memory of tde, CNcomment: Initialize the TDE memory pool */
215 if (wmeminit() != HI_SUCCESS) {
216 goto TDE_INIT_ERR;
217 }
218 /* config start address for the parameter, CNcomment: The first address configuration parameter table */
219 if (tde_hal_init_para_table() != HI_SUCCESS) {
220 wmemterm();
221 goto TDE_INIT_ERR;
222 }
223 #ifndef HI_BUILD_IN_BOOT
224 /* map address for the register, CNcomment: Register mapping */
225 g_use_dtsi = HI_TRUE;
226 if (g_base_vir_addr == HI_NULL) {
227 g_base_vir_addr = (volatile hi_u32 *)tde_reg_map(base_addr, TDE_REG_SIZE);
228 g_use_dtsi = HI_FALSE;
229 }
230
231 if (g_base_vir_addr == HI_NULL) {
232 wmemterm();
233 goto TDE_INIT_ERR;
234 }
235 /* set limit of clock and div, CNcomment: Set the clock threshold, clock frequency division */
236 g_tde_clock_vir = (volatile hi_u32 *)tde_reg_map(TDE_REG_CLOCK, 4); /* 4 size */
237 if (g_tde_clock_vir == HI_NULL) {
238 wmemterm();
239 tde_reg_unmap(g_base_vir_addr);
240 goto TDE_INIT_ERR;
241 }
242 #else
243 g_base_vir_addr = (hi_u32 *)base_addr;
244 #endif
245 tde_hal_set_clock(HI_TRUE);
246 return HI_SUCCESS;
247
248 TDE_INIT_ERR:
249 return HI_FAILURE;
250 }
251
252 #ifndef HI_BUILD_IN_BOOT
tde_hal_resume_init(hi_void)253 hi_void tde_hal_resume_init(hi_void)
254 {
255 tde_hal_set_clock(HI_TRUE);
256
257 tde_hal_ctl_reset();
258
259 tde_hal_init_queue();
260
261 return;
262 }
263
tde_hal_suspend(hi_void)264 hi_void tde_hal_suspend(hi_void)
265 {
266 tde_hal_set_clock(HI_FALSE);
267 return;
268 }
269
tde_hal_close(hi_void)270 hi_s32 tde_hal_close(hi_void)
271 {
272 tde_hal_set_clock(HI_FALSE);
273 return HI_SUCCESS;
274 }
275
tde_hal_open(hi_void)276 hi_s32 tde_hal_open(hi_void)
277 {
278 return HI_SUCCESS;
279 }
280
281 /*
282 * Function: tde_hal_release
283 * Description: release the address that had map
284 * Return: success/fail
285 */
tde_hal_release(hi_void)286 hi_void tde_hal_release(hi_void)
287 {
288 hi_void *buf = HI_NULL;
289 if (g_para_table.hf_coef_addr != 0) {
290 buf = (hi_void *)wgetvrt(g_para_table.hf_coef_addr);
291 if (buf != HI_NULL) {
292 tde_free(buf);
293 buf = HI_NULL;
294 g_para_table.hf_coef_addr = 0;
295 }
296 }
297 if (g_para_table.vf_coef_addr != 0) {
298 buf = (hi_void *)wgetvrt(g_para_table.vf_coef_addr);
299 if (buf != HI_NULL) {
300 tde_free(buf);
301 buf = HI_NULL;
302 g_para_table.vf_coef_addr = 0;
303 }
304 }
305 #ifndef HI_BUILD_IN_BOOT
306
307 #if (TDE_CAPABILITY & DEFLICKER)
308 if (g_para_table.deflicker_vf_coef_addr != 0) {
309 buf = (hi_void *)wgetvrt(g_para_table.deflicker_vf_coef_addr);
310 if (buf != HI_NULL) {
311 tde_free(buf);
312 buf = HI_NULL;
313 g_para_table.deflicker_vf_coef_addr = 0;
314 }
315 }
316 #endif
317
318 #endif
319 /* unmap, CNcomment: Remove the mapping */
320 if (g_tde_clock_vir != HI_NULL) {
321 tde_reg_unmap(g_tde_clock_vir);
322 }
323 g_tde_clock_vir = HI_NULL;
324 /* unmap the base address, CNcomment: Reflect the base address */
325 if (g_use_dtsi == HI_FALSE) {
326 tde_reg_unmap(g_base_vir_addr);
327 }
328 g_base_vir_addr = HI_NULL;
329
330 /* free the pool of memory, CNcomment: TDE memory pool to initialize */
331 wmemterm();
332
333 return;
334 }
335 #endif /* HI_BUILD_IN_BOOT */
336
337 #if (HICHIP == HI3516C_V500)
tde_hal_ctl_is_idle(hi_void)338 hi_bool tde_hal_ctl_is_idle(hi_void)
339 {
340 return (hi_bool)(!(tde_read_reg(g_base_vir_addr, TDE_STA) & 0xff));
341 }
342 #else
tde_hal_ctl_is_idle(hi_void)343 hi_bool tde_hal_ctl_is_idle(hi_void)
344 {
345 return (hi_bool)(!(tde_read_reg(g_base_vir_addr, TDE_STA) & 0x1));
346 }
347 #endif
348
349 /*
350 * Function: tde_hal_ctl_is_idle_safely
351 * Description: get the state of tde one more time ,make sure it's idle
352 * Return: True: Idle/False: Busy
353 */
tde_hal_ctl_is_idle_safely(hi_void)354 hi_bool tde_hal_ctl_is_idle_safely(hi_void)
355 {
356 hi_u32 i;
357
358 /*
359 * get the state of tde one more time ,make sure it's idle
360 * CNcomment: Continuous read hardware status for many times, make sure complete TDE
361 */
362 for (i = 0; i < TDE_MAX_READ_STATUS_TIME; i++) {
363 if (!tde_hal_ctl_is_idle()) {
364 return HI_FALSE;
365 }
366 }
367 return HI_TRUE;
368 }
369
tde_hal_ctl_int_status(hi_void)370 hi_u32 tde_hal_ctl_int_status(hi_void)
371 {
372 hi_u32 value;
373
374 value = tde_read_reg(g_base_vir_addr, TDE_INT);
375 /* clear all status */
376 tde_write_reg(g_base_vir_addr, TDE_INTCLR, value);
377 return value;
378 }
379
tde_hal_ctl_reset(hi_void)380 hi_void tde_hal_ctl_reset(hi_void)
381 {
382 tde_write_reg(g_base_vir_addr, TDE_INTCLR, 0xf);
383 tde_write_reg(g_base_vir_addr, TDE_MISCELLANEOUS, 0x0100647f);
384 return;
385 }
386
387 /*
388 * Function: tde_hal_set_clock
389 * Description: enable or disable the clock of TDE
390 * Input: hi_bool enable:enable/disable
391 */
tde_hal_set_clock(hi_bool enable)392 hi_void tde_hal_set_clock(hi_bool enable)
393 {
394 if (enable) {
395 /* cancel reset */
396 *g_tde_clock_vir &= ~0x1;
397
398 /* 0x2 enable clock */
399 *g_tde_clock_vir |= 0x2;
400 } else {
401 #ifdef TDE_LOWPOWER
402 /* 0x2 disable clock */
403 *g_tde_clock_vir &= ~0x2;
404
405 /* reset */
406 *g_tde_clock_vir |= 0x1;
407 #endif
408 }
409 }
410
411 #ifndef HI_BUILD_IN_BOOT
412 /*
413 * Function: tde_hal_ctl_int_clear
414 * Description: clear the state of interrupt
415 * Input: stats: state that need clear
416 */
tde_hal_ctl_int_clear(hi_u32 stats)417 hi_void tde_hal_ctl_int_clear(hi_u32 stats)
418 {
419 hi_u32 read_stats;
420
421 read_stats = tde_read_reg(g_base_vir_addr, TDE_INT);
422 /* 16 left to the highest level, 0x0000ffff 0xffff0000 mask */
423 read_stats = (read_stats & 0x0000ffff) | ((stats << 16) & 0xffff0000);
424
425 tde_write_reg(g_base_vir_addr, TDE_INT, read_stats);
426 }
427 #endif
428
429 /*
430 * Function: tde_hal_node_init_nd
431 * Description: init the software node struct for tde
432 * Input: hw_node: the pointer of software node struct
433 */
tde_hal_node_init_nd(tde_hw_node ** hw_node)434 hi_s32 tde_hal_node_init_nd(tde_hw_node **hw_node)
435 {
436 hi_void *buf = HI_NULL;
437
438 if (hw_node == HI_NULL) {
439 return HI_FAILURE;
440 }
441 buf = (hi_void *)tde_malloc(sizeof(tde_hw_node) + TDE_NODE_HEAD_BYTE + TDE_NODE_TAIL_BYTE);
442 if (buf == HI_NULL) {
443 tde_error("malloc (%lu) failed, wgetfreenum(%u)!\n",
444 (unsigned long)(sizeof(tde_hw_node) + TDE_NODE_HEAD_BYTE + TDE_NODE_TAIL_BYTE), wgetfreenum());
445 return HI_ERR_TDE_NO_MEM;
446 }
447
448 *hw_node = (tde_hw_node *)((hi_u8 *)buf + TDE_NODE_HEAD_BYTE);
449
450 return HI_SUCCESS;
451 }
452
453 #ifdef CONFIG_GFX_MMU_SUPPORT
tde_hal_free_tmp_buf(tde_hw_node * hw_node)454 hi_void tde_hal_free_tmp_buf(tde_hw_node *hw_node)
455 {
456 return;
457 }
458 #endif
459
460 /*
461 * Function: tde_hal_free_node_buf
462 * Description: Free TDE operate node buffer
463 * Input: hw_node:Node struct pointer.
464 */
tde_hal_free_node_buf(tde_hw_node * hw_node)465 hi_void tde_hal_free_node_buf(tde_hw_node *hw_node)
466 {
467 hi_void *buf = HI_NULL;
468
469 if (hw_node == HI_NULL) {
470 return;
471 }
472 buf = (hi_u8 *)hw_node - TDE_NODE_HEAD_BYTE;
473
474 #ifdef CONFIG_GFX_MMU_SUPPORT
475 tde_hal_free_tmp_buf(hw_node);
476 #endif
477
478 tde_free(buf);
479 return;
480 }
481
482 /*
483 * Function: tde_hal_node_execute
484 * Description: start list of tde
485 * Input: nodephy_addr: the start address of head node address
486 * update:the head node update set
487 * aq_use_buff: whether use temp buffer
488 */
tde_hal_node_execute(hi_u64 nodephy_addr,hi_u64 update,hi_bool aq_use_buff)489 hi_s32 tde_hal_node_execute(hi_u64 nodephy_addr, hi_u64 update, hi_bool aq_use_buff)
490 {
491 hi_unused(update);
492 hi_unused(aq_use_buff);
493 /* tde is idle */
494 if (tde_hal_ctl_is_idle_safely()) {
495 tde_hal_set_clock(HI_TRUE);
496 tde_hal_ctl_reset();
497 tde_hal_init_queue();
498
499 /* write the first node address */
500 tde_write_reg(g_base_vir_addr, TDE_AQ_NADDR_LOW, GetLowAddr(nodephy_addr));
501 tde_write_reg(g_base_vir_addr, TDE_AQ_NADDR_HI, GetHighAddr(nodephy_addr));
502 #ifndef HI_BUILD_IN_BOOT
503 osal_dmb();
504 #endif
505 osal_udelay(100); /* 100 time out */
506 /* start Aq list, CNcomment : Start the Aq */
507 tde_write_reg(g_base_vir_addr, TDE_CTRL, 0x1);
508 } else {
509 return HI_FAILURE;
510 }
511
512 return HI_SUCCESS;
513 }
514
515 /*
516 * Function: tde_hal_node_enable_complete_int
517 * Description: enable the finish interrupt of node
518 * Input: buf: buffer of node
519 */
tde_hal_node_enable_complete_int(hi_void * buf)520 hi_void tde_hal_node_enable_complete_int(hi_void *buf)
521 {
522 tde_hw_node *hw_node = (tde_hw_node *)buf;
523 if (buf == HI_NULL) {
524 tde_error("pBuf is null %s(line=%d)\n", __FUNCTION__, __LINE__);
525 return;
526 }
527 hw_node->tde_intmask.bits.eof_mask = 0;
528 hw_node->tde_intmask.bits.timeout_mask = 0x1;
529 hw_node->tde_intmask.bits.bus_err_mask = 0x1;
530 #ifdef TDE_HWC_COOPERATE
531 hw_node->tde_intmask.bits.eof_end_mask = 0x0;
532 #else
533 hw_node->tde_intmask.bits.eof_end_mask = 0x1;
534 #endif
535 return;
536 }
537
tde_hal_next_node_addr(hi_void * buf,hi_u64 phy_addr)538 hi_void tde_hal_next_node_addr(hi_void *buf, hi_u64 phy_addr)
539 {
540 tde_hw_node *hw_node = (tde_hw_node *)buf;
541 if (buf == HI_NULL) {
542 tde_error("pBuf is null %s(line=%d)\n", __FUNCTION__, __LINE__);
543 return;
544 }
545 hw_node->tde_pnext_low.bits.next_low = GetLowAddr(phy_addr);
546 hw_node->tde_pnext_hi.bits.next_hi = GetHighAddr(phy_addr);
547 return;
548 }
549
550 #if (TDE_CAPABILITY & SYNC)
tde_hal_node_enable_sync(hi_void * buf)551 hi_void tde_hal_node_enable_sync(hi_void *buf)
552 {
553 tde_hw_node *hw_node = (tde_hw_node *)buf;
554 if (buf == HI_NULL) {
555 tde_error("pBuf is null %s(line=%d)\n", __FUNCTION__, __LINE__);
556 return;
557 }
558 hw_node->des_ctrl.bits.des_bind_en = 0x1;
559 if ((hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_YCBCR888) ||
560 (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_YCBCR422)) {
561 hw_node->des_ctrl.bits.des_bind_mode = 0x0;
562 } else {
563 hw_node->des_ctrl.bits.des_bind_mode = 0x1;
564 }
565 hw_node->DES_SAFE_DIST.all = hw_node->des_ch0_stride.all / 4; /* 4 buf narrow */
566 hw_node->DES_SAFE_DIST_INVERSE.all = hw_node->des_ch0_stride.all / 4; /* 4 buf narrow */
567 return;
568 }
569 #endif
570
571 /*
572 * Function: tde_hal_node_set_src1
573 * Description: set the info for source of bitmap 1
574 * Input: hw_node: pointer of node
575 * drv_surface: bitmap info
576 */
tde_hal_node_set_src1(tde_hw_node * hw_node,tde_surface_msg * drv_surface)577 hi_void tde_hal_node_set_src1(tde_hw_node *hw_node, tde_surface_msg *drv_surface)
578 {
579 hi_u32 bpp;
580 hi_u64 phy_addr;
581 if (hw_node == HI_NULL) {
582 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
583 return;
584 }
585 if (drv_surface == HI_NULL) {
586 tde_error("pDrvSurface is null %s(line=%d)\n", __FUNCTION__, __LINE__);
587 return;
588 }
589 /* set the source bitmap attribute info, CNcomment: Configure attribute information source bitmap */
590 hw_node->src1_ctrl.bits.src1_fmt = (hi_u32)drv_surface->color_fmt;
591 hw_node->src1_ctrl.bits.src1_alpha_range = 1 - (hi_u32)drv_surface->alpha_max_is_255;
592 hw_node->src1_ctrl.bits.src1_h_scan_ord = (hi_u32)drv_surface->h_scan;
593 hw_node->src1_ctrl.bits.src1_v_scan_ord = (hi_u32)drv_surface->v_scan;
594 /*
595 * file zero of low area and top area use low area extend
596 * CNcomment: Have been using low filling is 0, high use low expansion mode
597 */
598 hw_node->src1_ctrl.bits.src1_rgb_exp = 0;
599
600 hw_node->src1_imgsize.bits.src1_width = drv_surface->width - 1;
601 hw_node->src1_imgsize.bits.src1_height = drv_surface->height - 1;
602
603 bpp = tde_hal_getbpp_by_fmt(drv_surface->color_fmt);
604
605 phy_addr = drv_surface->phy_addr + (hi_u64)(drv_surface->ypos) * (hi_u64)(drv_surface->pitch) +
606 (((hi_u64)(drv_surface->xpos) * (hi_u64)(bpp)) >> 3); /* bpp 2^3 */
607
608 hw_node->src1_ch0_addr_low.bits.src1_ch0_addr_low = GetLowAddr(phy_addr);
609 hw_node->src1_ch0_addr_high.bits.src1_ch0_addr_high = GetHighAddr(phy_addr);
610
611 if (drv_surface->color_fmt <= TDE_DRV_COLOR_FMT_RGB565) {
612 hw_node->src1_ctrl.bits.src1_argb_order = drv_surface->rgb_order;
613 }
614 /*
615 * target bitmapis same with source bitmap 1,so not need set.
616 * config the node, CNcomment: Configure the cache node
617 */
618 hw_node->src1_ch0_stride.bits.src1_ch0_stride = drv_surface->pitch;
619 return;
620 }
621
tde_hal_set_src2_ctrl(tde_hw_node * hw_node,tde_surface_msg * drv_surface)622 static hi_void tde_hal_set_src2_ctrl(tde_hw_node *hw_node, tde_surface_msg *drv_surface)
623 {
624 hw_node->src2_ctrl.bits.src2_fmt = (hi_u32)drv_surface->color_fmt;
625 hw_node->src2_ctrl.bits.src2_alpha_range = 0;
626 hw_node->src2_ctrl.bits.src2_h_scan_ord = (hi_u32)drv_surface->h_scan;
627 hw_node->src2_ctrl.bits.src2_v_scan_ord = (hi_u32)drv_surface->v_scan;
628 }
629
tde_hal_set_src2_img_size(tde_hw_node * hw_node,tde_surface_msg * drv_surface)630 static hi_void tde_hal_set_src2_img_size(tde_hw_node *hw_node, tde_surface_msg *drv_surface)
631 {
632 hw_node->src2_imgsize.bits.src2_width = drv_surface->width - 1;
633 hw_node->src2_imgsize.bits.src2_height = drv_surface->height - 1;
634 }
635
tde_hal_set_src2_addr(tde_hw_node * hw_node,tde_surface_msg * drv_surface,hi_u64 * phy_addr,hi_u64 * cb_crphy_addr)636 static hi_void tde_hal_set_src2_addr(tde_hw_node *hw_node, tde_surface_msg *drv_surface, hi_u64 *phy_addr,
637 hi_u64 *cb_crphy_addr)
638 {
639 hi_u32 bpp = tde_hal_getbpp_by_fmt(drv_surface->color_fmt);
640 if (drv_surface->color_fmt >= TDE_DRV_COLOR_FMT_YCBCR400MBP) {
641 *phy_addr = drv_surface->phy_addr + (hi_u64)(drv_surface->ypos) *
642 (hi_u64)(drv_surface->pitch) + (((hi_u64)(drv_surface->xpos) * 8) >> 3); /* 3 8 xpos alg data */
643
644 hw_node->src2_ch0_addr_low.bits.src2_ch0_addr_low = GetLowAddr(*phy_addr);
645 hw_node->src2_ch0_addr_high.bits.src2_ch0_addr_high = GetHighAddr(*phy_addr);
646 switch (drv_surface->color_fmt) {
647 case TDE_DRV_COLOR_FMT_YCBCR422MBH:
648 *cb_crphy_addr = drv_surface->cbcr_phy_addr +
649 (hi_u64)(drv_surface->ypos) * (hi_u64)(drv_surface->cb_cr_pitch) +
650 ((hi_u64)(drv_surface->xpos) / 2 * 2); /* 2 xpos alg data cb_crphy_addr */
651 break;
652 case TDE_DRV_COLOR_FMT_YCBCR422MBV:
653 *cb_crphy_addr = drv_surface->cbcr_phy_addr +
654 /* 2 ypos size */
655 (hi_u64)(drv_surface->ypos / 2) * (hi_u64)(drv_surface->cb_cr_pitch) +
656 (((hi_u64)(drv_surface->xpos) * 16) >> 3); /* 16 3 alg data cb_crphy_addr */
657 break;
658 case TDE_DRV_COLOR_FMT_YCBCR420MB:
659 *cb_crphy_addr = drv_surface->cbcr_phy_addr +
660 /* 2 alg data */
661 (hi_u64)(drv_surface->ypos / 2) * (hi_u64)(drv_surface->cb_cr_pitch) +
662 ((hi_u64)(drv_surface->xpos) / 2 * 2); /* 2 xpos alg data cb_crphy_addr */
663 break;
664 case TDE_DRV_COLOR_FMT_YCBCR444MB:
665 *cb_crphy_addr = drv_surface->cbcr_phy_addr +
666 (hi_u64)(drv_surface->ypos) * (hi_u64)(drv_surface->cb_cr_pitch) +
667 (((hi_u64)(drv_surface->xpos) * 16) >> 3); /* 16 3 alg data */
668 break;
669 default:;
670 }
671
672 hw_node->src2_ch1_addr_low.bits.src2_ch1_addr_low = GetLowAddr(*cb_crphy_addr);
673 hw_node->src2_ch1_addr_high.bits.src2_ch1_addr_high = GetHighAddr(*cb_crphy_addr);
674
675 if (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_YCBCR422MBV) {
676 hw_node->src2_ctrl.bits.src2_422v_pro = 1;
677 }
678 } else {
679 *phy_addr = drv_surface->phy_addr + (hi_u64)(drv_surface->ypos) *
680 /* alg data 2^3 */
681 (hi_u64)(drv_surface->pitch) + (((hi_u64)(drv_surface->xpos) * (hi_u64)(bpp)) >> 3);
682 hw_node->src2_ch0_addr_low.bits.src2_ch0_addr_low = GetLowAddr(*phy_addr);
683 hw_node->src2_ch0_addr_high.bits.src2_ch0_addr_high = GetHighAddr(*phy_addr);
684
685 if (drv_surface->color_fmt <= TDE_DRV_COLOR_FMT_RGB565) {
686 hw_node->src2_ctrl.bits.src2_argb_order = drv_surface->rgb_order;
687 }
688 }
689 }
690
691 /*
692 * Function: tde_hal_node_set_src2
693 * Description: set the source bitmap 2
694 * Input: hw_node: pointer of node
695 * drv_surface: bitmap info
696 */
tde_hal_node_set_src2(tde_hw_node * hw_node,tde_surface_msg * drv_surface)697 hi_void tde_hal_node_set_src2(tde_hw_node *hw_node, tde_surface_msg *drv_surface)
698 {
699 hi_u64 phy_addr;
700 hi_u64 cb_crphy_addr;
701
702 if (hw_node == HI_NULL) {
703 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
704 return;
705 }
706 if (drv_surface == HI_NULL) {
707 tde_error("pDrvSurface is null %s(line=%d)\n", __FUNCTION__, __LINE__);
708 return;
709 }
710
711 /* set attribute info for source bitmap, CNcomment:Configure attribute information source bitmap */
712 tde_hal_set_src2_ctrl(hw_node, drv_surface);
713 /*
714 * file zero of low area and top area use low area extend
715 * CNcomment: Have been using low filling is 0, high use low expansion mode
716 */
717 hw_node->src2_ctrl.bits.src2_rgb_exp = 0;
718
719 tde_hal_set_src2_img_size(hw_node, drv_surface);
720
721 phy_addr = drv_surface->phy_addr;
722 cb_crphy_addr = drv_surface->cbcr_phy_addr;
723
724 tde_hal_set_src2_addr(hw_node, drv_surface, &phy_addr, &cb_crphy_addr);
725 if (drv_surface->color_fmt <= TDE_DRV_COLOR_FMT_A1) {
726 hw_node->src2_alpha.bits.src2_alpha0 = 0x00;
727 hw_node->src2_alpha.bits.src2_alpha1 = 0xff;
728 }
729 hw_node->src2_ch0_stride.bits.src2_ch0_stride = drv_surface->pitch;
730 hw_node->src2_ch1_stride.bits.src2_ch1_stride = drv_surface->cb_cr_pitch;
731
732 return;
733 }
734
735 #if (TDE_CAPABILITY & COMPRESS)
tde_hal_node_set_src_to_decompress(tde_hw_node * hw_node,tde_surface_msg * drv_surface)736 hi_void tde_hal_node_set_src_to_decompress(tde_hw_node *hw_node, tde_surface_msg *drv_surface)
737 {
738 if (hw_node == HI_NULL) {
739 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
740 return;
741 }
742 tde_hal_node_set_src2(hw_node, drv_surface);
743
744 hw_node->src2_ctrl.bits.src2_is_lossless = 0;
745 hw_node->src2_ctrl.bits.src2_is_lossless_a = 0;
746 hw_node->src2_ctrl.bits.src2_dcmp_en = 1;
747 hw_node->src2_ctrl.bits.src2_top_pred_en = 1;
748
749 return;
750 }
751 #endif
752
tde_hal_node_set_hw_node(tde_hw_node * hw_node,tde_surface_msg * drv_surface,hi_tde_out_alpha_from alpha_from)753 static hi_void tde_hal_node_set_hw_node(tde_hw_node *hw_node, tde_surface_msg *drv_surface,
754 hi_tde_out_alpha_from alpha_from)
755 {
756 /* set bitmap attribute info, CNcomment:Configure attribute information source bitmap */
757 hw_node->des_ctrl.bits.des_en = 1;
758 hw_node->des_ctrl.bits.des_fmt = drv_surface->color_fmt;
759 hw_node->des_ctrl.bits.des_alpha_range = 1 - (hi_u32)drv_surface->alpha_max_is_255;
760 hw_node->des_ctrl.bits.des_h_scan_ord = (hi_u32)drv_surface->h_scan;
761 hw_node->des_ctrl.bits.des_v_scan_ord = (hi_u32)drv_surface->v_scan;
762 hw_node->des_ctrl.bits.des_alpha_range = 1 - (hi_u32)drv_surface->alpha_max_is_255;
763 hw_node->des_ctrl.bits.des_rgb_round = 1; /* CNcomment:Always use four shed no into the way of cutting bit */
764
765 hw_node->cbmalupara.bits.alpha_from = (hi_u32)alpha_from;
766 hw_node->des_alpha.bits.des_alpha_thd = g_alpha_threshold_value;
767
768 /* set bitmap size info, CNcomment: Configure the bitmap size information */
769 hw_node->des_imgsize.bits.des_width = (hi_u32)drv_surface->width - 1;
770 hw_node->des_imgsize.bits.des_height = (hi_u32)drv_surface->height - 1;
771 }
772
773 /*
774 * Function: tde_hal_node_set_tqt
775 * Description: set target bitmap info
776 * Input: hw_node: pointer of node
777 * drv_surface: bitmap info
778 * alpha_from: alpha from
779 */
tde_hal_node_set_tqt(tde_hw_node * hw_node,tde_surface_msg * drv_surface,hi_tde_out_alpha_from alpha_from)780 hi_void tde_hal_node_set_tqt(tde_hw_node *hw_node, tde_surface_msg *drv_surface,
781 hi_tde_out_alpha_from alpha_from)
782 {
783 hi_u32 bpp;
784 hi_u64 phy_addr;
785 hi_u64 cb_crphy_addr;
786
787 if (hw_node == HI_NULL) {
788 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
789 return;
790 }
791 tde_hal_node_set_hw_node(hw_node, drv_surface, alpha_from);
792 if (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_AYCBCR8888) {
793 drv_surface->color_fmt = TDE_DRV_COLOR_FMT_ARGB8888;
794 hw_node->des_ctrl.bits.des_argb_order = 0x17;
795 }
796
797 if ((drv_surface->color_fmt <= TDE_DRV_COLOR_FMT_RGB565) ||
798 (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_AYCBCR8888)) {
799 hw_node->des_ctrl.bits.des_argb_order = drv_surface->rgb_order;
800 if (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_AYCBCR8888) {
801 drv_surface->color_fmt = TDE_DRV_COLOR_FMT_ARGB8888;
802 hw_node->des_ctrl.bits.des_argb_order = 0x17;
803 }
804 }
805 if (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_RABG8888) {
806 hw_node->des_ctrl.bits.des_argb_order = TDE_DRV_ORDER_RABG; /* RABG */
807 hw_node->des_ctrl.bits.des_fmt = TDE_DRV_COLOR_FMT_ARGB8888;
808 }
809
810 bpp = tde_hal_getbpp_by_fmt(drv_surface->color_fmt);
811 phy_addr = drv_surface->phy_addr + (hi_u64)(drv_surface->ypos) * (hi_u64)(drv_surface->pitch) +
812 (((hi_u64)(drv_surface->xpos) * (hi_u64)(bpp)) >> 3); /* 3 bpp narrow 8 */
813 hw_node->des_ch0_addr_low.bits.des_ch0_addr_low = GetLowAddr(phy_addr);
814 hw_node->des_ch0_addr_high.bits.des_ch0_addr_high = GetHighAddr(phy_addr);
815
816 cb_crphy_addr = drv_surface->cbcr_phy_addr + (hi_u64)(drv_surface->ypos) * (hi_u64)(drv_surface->pitch) +
817 (((hi_u64)(drv_surface->xpos) * (hi_u64)(bpp)) >> 3); /* 3 bpp narrow 8 */
818 hw_node->des_ch1_addr_low.bits.des_ch1_addr_low = GetLowAddr(cb_crphy_addr);
819 hw_node->des_ch1_addr_high.bits.des_ch1_addr_hi = GetHighAddr(cb_crphy_addr);
820
821 hw_node->des_ch1_stride.bits.des_ch1_stride = (hi_u32)drv_surface->pitch;
822
823 if (drv_surface->color_fmt == TDE_DRV_COLOR_FMT_YCBCR422) {
824 hw_node->des_dswm.bits.des_h_dswm_mode = 1;
825 }
826 hw_node->des_ch0_stride.bits.des_ch0_stride = (hi_u32)drv_surface->pitch;
827 return;
828 }
829
830 #if (TDE_CAPABILITY & COMPRESS)
831 #if (HICHIP == HI3519A_V100)
tde_hal_node_set_argb8888_320(tde_hw_node * hw_node)832 static hi_void tde_hal_node_set_argb8888_320(tde_hw_node *hw_node)
833 {
834 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 994; /* 994 budget_bits_mb data */
835 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 750; /* 750 min_mb_bits data */
836
837 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
838 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 0;
839
840 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 5; /* 5 max_qp data */
841 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
842 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
843 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 4; /* 4 rc_smth_ngain data */
844 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 0;
845
846 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
847 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
848
849 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
850 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
851 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
852
853 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
854 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
855 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
856 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
857
858 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
859 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
860
861 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 0;
862
863 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 0;
864 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
865 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 130; /* 130 qp_dec2_bits_thr data */
866 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
867
868 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
869 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
870 }
871
tde_hal_node_set_argb8888_720(tde_hw_node * hw_node)872 static hi_void tde_hal_node_set_argb8888_720(tde_hw_node *hw_node)
873 {
874 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 492; /* 492 budget_bits_mb data */
875 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
876
877 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
878 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 0;
879
880 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 5; /* 5 max_qp data */
881 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
882 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
883 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 3; /* 3 rc_smth_ngain data */
884 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 0;
885
886 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
887 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
888
889 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
890 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
891 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
892
893 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
894 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
895 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
896 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
897
898 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
899 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
900
901 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 8; /* 8 adj_sad_bits_thr data */
902
903 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 20; /* 20 qp_inc1_bits_thr data */
904 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
905 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 130; /* 130 qp_dec2_bits_thr data */
906 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
907
908 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
909 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
910 }
911
tde_hal_node_set_argb8888_3840(tde_hw_node * hw_node)912 static hi_void tde_hal_node_set_argb8888_3840(tde_hw_node *hw_node)
913 {
914 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 492; /* 492 budget_bits_mb data */
915 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
916
917 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
918 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 10; /* 10 max_trow_bits data */
919
920 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 5; /* 5 max_qp data */
921 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
922 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
923 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 4; /* 4 rc_smth_ngain data */
924 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 4; /* 4 special_bits_gain data */
925
926 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
927 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
928
929 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
930 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
931 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
932
933 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
934 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
935 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
936 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
937
938 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
939 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
940
941 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 30; /* 30 adj_sad_bits_thr data */
942
943 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 40; /* 40 qp_inc1_bits_thr data */
944 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
945 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 100; /* 100 qp_dec2_bits_thr data */
946 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
947
948 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
949 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
950 }
951
tde_hal_node_set_rgb888_320(tde_hw_node * hw_node)952 static hi_void tde_hal_node_set_rgb888_320(tde_hw_node *hw_node)
953 {
954 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 930; /* 930 budget_bits_mb data */
955 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 702; /* 702 min_mb_bits data */
956
957 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
958 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 0;
959
960 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 4; /* 4 max_qp data */
961 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
962 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
963 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 4; /* 4 rc_smth_ngain data */
964 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 0;
965
966 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
967 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
968
969 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
970 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
971 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
972
973 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
974 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
975 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
976 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
977
978 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
979 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
980
981 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 0;
982
983 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 0;
984 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
985 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 130; /* 130 qp_dec2_bits_thr data */
986 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
987
988 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
989 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
990 }
991
tde_hal_node_set_rgb888_720(tde_hw_node * hw_node)992 static hi_void tde_hal_node_set_rgb888_720(tde_hw_node *hw_node)
993 {
994 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 500; /* 500 budget_bits_mb data */
995 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
996
997 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
998 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 0;
999
1000 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 4; /* 4 max_qp data */
1001 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
1002 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
1003 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 3; /* 3 rc_smth_ngain data */
1004 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 0;
1005
1006 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
1007 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
1008
1009 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
1010 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
1011 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
1012
1013 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
1014 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
1015 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
1016 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
1017
1018 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
1019 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
1020
1021 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 8; /* 8 adj_sad_bits_thr data */
1022
1023 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 20; /* 20 qp_inc1_bits_thr data */
1024 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
1025 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 130; /* 130 qp_dec2_bits_thr data */
1026 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
1027
1028 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
1029 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
1030 }
1031
tde_hal_node_set_rgb888_3840(tde_hw_node * hw_node)1032 static hi_void tde_hal_node_set_rgb888_3840(tde_hw_node *hw_node)
1033 {
1034 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 500; /* 500 budget_bits_mb data */
1035 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
1036
1037 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
1038 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 10; /* 10 max_trow_bits data */
1039
1040 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 4; /* 4 max_qp data */
1041 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
1042 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
1043 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 4; /* 4 rc_smth_ngain data */
1044 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 4; /* 4 special_bits_gain data */
1045
1046 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
1047 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
1048
1049 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
1050 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
1051 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
1052
1053 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
1054 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
1055 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
1056 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
1057
1058 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
1059 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
1060
1061 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 30; /* 30 adj_sad_bits_thr data */
1062
1063 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 40; /* 40 qp_inc1_bits_thr data */
1064 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
1065 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 100; /* 100 qp_dec2_bits_thr data */
1066 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 250; /* 250 qp_dec3_bits_thr data */
1067
1068 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
1069 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
1070 }
1071
tde_hal_node_set_argb15555_or_argb4444_720(tde_hw_node * hw_node)1072 static hi_void tde_hal_node_set_argb15555_or_argb4444_720(tde_hw_node *hw_node)
1073 {
1074 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 492; /* 492 budget_bits_mb data */
1075 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
1076
1077 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
1078 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 10; /* 10 max_trow_bits data */
1079
1080 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 1;
1081 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
1082 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
1083 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 3; /* 3 rc_smth_ngain data */
1084 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 2; /* 2 special_bits_gain data */
1085
1086 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
1087 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
1088
1089 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
1090 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
1091 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
1092
1093 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
1094 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
1095 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
1096 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
1097
1098 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
1099 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
1100
1101 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 10; /* 10 adj_sad_bits_thr data */
1102
1103 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 20; /* 20 qp_inc1_bits_thr data */
1104 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
1105 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 100; /* 100 qp_dec2_bits_thr data */
1106 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 130; /* 130 qp_dec3_bits_thr data */
1107
1108 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
1109 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
1110 }
1111
tde_hal_node_set_argb15555_or_argb4444_3840(tde_hw_node * hw_node)1112 static hi_void tde_hal_node_set_argb15555_or_argb4444_3840(tde_hw_node *hw_node)
1113 {
1114 hw_node->tde_od_pic_osd_rc_cfg0.bits.budget_bits_mb = 492; /* 492 budget_bits_mb data */
1115 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits = 375; /* 375 min_mb_bits data */
1116
1117 hw_node->tde_od_pic_osd_rc_cfg1.bits.budget_bits_mb_cap = 512; /* 512 budget_bits_mb_cap data */
1118 hw_node->tde_od_pic_osd_rc_cfg7.bits.max_trow_bits = 10; /* 10 max_trow_bits data */
1119
1120 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_qp = 1;
1121 hw_node->tde_od_pic_osd_rc_cfg2.bits.smth_qp = 2; /* 2 smth_qp data */
1122
1123 hw_node->tde_od_pic_osd_rc_cfg2.bits.sad_bits_ngain = 10; /* 10 sad_bits_ngain data */
1124 hw_node->tde_od_pic_osd_rc_cfg2.bits.rc_smth_ngain = 3; /* 3 rc_smth_ngain data */
1125 hw_node->tde_od_pic_osd_rc_cfg2.bits.special_bits_gain = 2; /* 2 special_bits_gain data */
1126
1127 hw_node->tde_od_pic_osd_rc_cfg3.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
1128 hw_node->tde_od_pic_osd_rc_cfg3.bits.min_sad_thr = 12; /* 12 min_sad_thr data */
1129
1130 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_thr = 3; /* 3 smth_thr data */
1131 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_thr = 1;
1132 hw_node->tde_od_pic_osd_rc_cfg4.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
1133
1134 hw_node->tde_od_pic_osd_rc_cfg5.bits.smth_pix_num_thr = 6; /* 6 smth_pix_num_thr data */
1135 hw_node->tde_od_pic_osd_rc_cfg5.bits.still_pix_num_thr = 3; /* 3 still_pix_num_thr data */
1136 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_pix_num_thr = 24; /* 24 noise_pix_num_thr data */
1137 hw_node->tde_od_pic_osd_rc_cfg5.bits.large_smth_pix_num_thr = 10; /* 10 large_smth_pix_num_thr data */
1138
1139 hw_node->tde_od_pic_osd_rc_cfg6.bits.noise_sad = 32; /* 32 noise_sad data */
1140 hw_node->tde_od_pic_osd_rc_cfg6.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
1141
1142 hw_node->tde_od_pic_osd_rc_cfg7.bits.adj_sad_bits_thr = 10; /* 10 adj_sad_bits_thr data */
1143
1144 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_inc1_bits_thr = 20; /* 20 qp_inc1_bits_thr data */
1145 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec1_bits_thr = 60; /* 60 qp_dec1_bits_thr data */
1146 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec2_bits_thr = 100; /* 100 qp_dec2_bits_thr data */
1147 hw_node->tde_od_pic_osd_rc_cfg8.bits.qp_dec3_bits_thr = 130; /* 130 qp_dec3_bits_thr data */
1148
1149 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr = 70; /* 70 force_qp_thr data */
1150 hw_node->tde_od_pic_osd_rc_cfg9.bits.force_qp_thr_cap = 20; /* 20 force_qp_thr_cap data */
1151 }
1152
tde_hal_node_set_compress(tde_hw_node * hw_node)1153 hi_void tde_hal_node_set_compress(tde_hw_node *hw_node)
1154 {
1155 if (hw_node == HI_NULL) {
1156 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1157 return;
1158 }
1159
1160 hw_node->tde_od_pic_osd_glb_info.bits.is_lossless = 0;
1161 hw_node->tde_od_pic_osd_glb_info.bits.is_lossless_alpha = hw_node->tde_od_pic_osd_glb_info.bits.is_lossless;
1162 hw_node->tde_od_pic_osd_glb_info.bits.cmp_mode = 0;
1163 hw_node->tde_od_pic_osd_glb_info.bits.osd_mode =
1164 (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB8888) ? 0 :
1165 (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_RGB888 ? 1 :
1166 ((hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB1555) ? 2 : 3)); /* 2 3 des_fmt value */
1167 hw_node->tde_od_pic_osd_glb_info.bits.partition_en = 0;
1168 hw_node->tde_od_pic_osd_glb_info.bits.part_num = 1;
1169
1170 hw_node->tde_od_pic_osd_frame_size.bits.frame_width = hw_node->des_imgsize.bits.des_width;
1171 hw_node->tde_od_pic_osd_frame_size.bits.frame_height = hw_node->des_imgsize.bits.des_height;
1172
1173 if (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB8888) {
1174 if (hw_node->des_imgsize.bits.des_width <= 320) { /* 320 set argb8888 */
1175 tde_hal_node_set_argb8888_320(hw_node);
1176 } else if (hw_node->des_imgsize.bits.des_width <= 720) { /* 720 set argb8888 */
1177 tde_hal_node_set_argb8888_720(hw_node);
1178 } else if (hw_node->des_imgsize.bits.des_width <= 3840) { /* 3840 set argb8888 */
1179 tde_hal_node_set_argb8888_3840(hw_node);
1180 }
1181 } else if (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_RGB888) {
1182 if (hw_node->des_imgsize.bits.des_width <= 320) { /* 320 set rgb888 */
1183 tde_hal_node_set_rgb888_320(hw_node);
1184 } else if (hw_node->des_imgsize.bits.des_width <= 720) { /* 720 set rgb888 */
1185 tde_hal_node_set_rgb888_720(hw_node);
1186 } else if (hw_node->des_imgsize.bits.des_width <= 3840) { /* 3840 set rgb888 */
1187 tde_hal_node_set_rgb888_3840(hw_node);
1188 }
1189 } else if ((hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB1555) ||
1190 (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB4444)) {
1191 if (hw_node->des_imgsize.bits.des_width <= 720) { /* 720 set argb15555 or argb4444 */
1192 tde_hal_node_set_argb15555_or_argb4444_720(hw_node);
1193 } else if (hw_node->des_imgsize.bits.des_width <= 3840) { /* 3840 set argb15555 or argb4444 */
1194 tde_hal_node_set_argb15555_or_argb4444_3840(hw_node);
1195 }
1196 }
1197 }
1198 #else
tde_hal_node_set_cfgxx(tde_hw_node * hw_node)1199 static hi_void tde_hal_node_set_cfgxx(tde_hw_node *hw_node)
1200 {
1201 hw_node->tde_od_pic_osd_rc_cfg10.bits.qp_thr0 = 2; /* 2 qp_thr0 data */
1202 hw_node->tde_od_pic_osd_rc_cfg10.bits.qp_thr1 = 1;
1203 /* 2 3 qp_thr2 data */
1204 hw_node->tde_od_pic_osd_rc_cfg10.bits.qp_thr2 = ((hw_node->tde_od_pic_osd_glb_info.bits.source_mode == 2) ? 2 : 3);
1205
1206 hw_node->tde_od_pic_osd_rc_cfg11.bits.grph_bias_bit_thr0 = 20; /* 20 grph_bias_bit_thr0 data */
1207 hw_node->tde_od_pic_osd_rc_cfg11.bits.grph_bias_bit_thr1 = 50; /* 50 grph_bias_bit_thr1 data */
1208
1209 hw_node->tde_od_pic_osd_rc_cfg12.bits.force_rc_en = 0;
1210 hw_node->tde_od_pic_osd_rc_cfg12.bits.forcerc_bits_diff_thr = 80; /* 80 forcerc_bits_diff_thr data */
1211
1212 hw_node->tde_od_pic_osd_rc_cfg13.bits.maxdiff_ctrl_en = 1;
1213
1214 hw_node->tde_od_pic_osd_rc_cfg14.bits.init_buf_bits_cap = 2047; /* 2047 init_buf_bits_cap data */
1215
1216 hw_node->tde_od_pic_osd_rc_cfg15.bits.cmplx_sad_thr = 10; /* 10 cmplx_sad_thr data */
1217 hw_node->tde_od_pic_osd_rc_cfg15.bits.err_thr0 = 2; /* 2 err_thr0 data */
1218 hw_node->tde_od_pic_osd_rc_cfg15.bits.err_thr1 = 5; /* 5 err_thr1 data */
1219
1220 hw_node->tde_od_pic_osd_rc_cfg16.bits.sim_num_thr = 3; /* 3 sim_num_thr data */
1221 hw_node->tde_od_pic_osd_rc_cfg16.bits.sum_y_err_thr = 40; /* 40 sum_y_err_thr data */
1222 hw_node->tde_od_pic_osd_rc_cfg16.bits.sum_c_err_thr = 24; /* 24 sum_c_err_thr data */
1223
1224 hw_node->tde_od_pic_osd_rc_cfg17.bits.cpmlx_sad_thr_y = 12; /* 12 cpmlx_sad_thr_y data */
1225 hw_node->tde_od_pic_osd_rc_cfg17.bits.smpl_sad_thr_c = 3; /* 3 smpl_sad_thr_c data */
1226 hw_node->tde_od_pic_osd_rc_cfg17.bits.smpl_sumsad_thr_y = 50; /* 50 smpl_sumsad_thr_y data */
1227 hw_node->tde_od_pic_osd_rc_cfg17.bits.smpl_sumsad_thr_c = 40; /* 40 smpl_sumsad_thr_c data */
1228
1229 hw_node->tde_od_pic_osd_rc_cfg18.bits.future_sad_y_thr0 = 14; /* 14 future_sad_y_thr0 data */
1230 hw_node->tde_od_pic_osd_rc_cfg18.bits.future_sad_c_thr0 = 14; /* 14 future_sad_c_thr0 data */
1231 hw_node->tde_od_pic_osd_rc_cfg18.bits.future_sad_y_thr1 = 14; /* 14 future_sad_y_thr1 data */
1232 hw_node->tde_od_pic_osd_rc_cfg18.bits.future_sad_c_thr1 = 4; /* 4 future_sad_c_thr1 data */
1233
1234 hw_node->tde_od_pic_osd_rc_cfg19.bits.cmplx_sumsad_thr_y = 160; /* 160 cmplx_sumsad_thr_y data */
1235 hw_node->tde_od_pic_osd_rc_cfg19.bits.cmplx_sumsad_thr_c = 100; /* 100 cmplx_sumsad_thr_c data */
1236
1237 hw_node->tde_od_pic_osd_rc_cfg20.bits.buffer_up_lmt_thr = 4095; /* 4095 buffer_up_lmt_thr data */
1238 hw_node->tde_od_pic_osd_rc_cfg20.bits.buffer_low_lmt_thr = 2048; /* 2048 buffer_low_lmt_thr data */
1239
1240 hw_node->tde_od_pic_osd_rc_cfg21.bits.buffer_adj_qp_thr0 = 2; /* 2 buffer_adj_qp_thr0 data */
1241 hw_node->tde_od_pic_osd_rc_cfg21.bits.buffer_adj_qp_thr1 = 3; /* 3 buffer_adj_qp_thr1 data */
1242 hw_node->tde_od_pic_osd_rc_cfg21.bits.buffer_adj_qp_thr2 = 4; /* 4 buffer_adj_qp_thr2 data */
1243
1244 hw_node->tde_od_pic_osd_rc_cfg22.bits.buffer_surplus_thr0 = 180; /* 180 buffer_surplus_thr0 data */
1245 hw_node->tde_od_pic_osd_rc_cfg22.bits.buffer_surplus_thr1 = 50; /* 50 buffer_surplus_thr1 data */
1246 hw_node->tde_od_pic_osd_rc_cfg22.bits.buffer_surplus_thr2 = 10; /* 10 buffer_surplus_thr2 data */
1247
1248 hw_node->tde_od_pic_osd_rc_cfg23.bits.offset_bits_thr = 128; /* 128 offset_bits_thr data */
1249
1250 hw_node->tde_od_pic_osd_stat_thr.bits.max_gap_bw_row_len_thr = 0x40;
1251 }
1252
tde_hal_node_set_cfg0x(tde_hw_node * hw_node)1253 static hi_void tde_hal_node_set_cfg0x(tde_hw_node *hw_node)
1254 {
1255 hw_node->tde_od_pic_osd_glb_info.bits.cmp_mode = 0;
1256 hw_node->tde_od_pic_osd_glb_info.bits.top_pred_en = 1;
1257 hw_node->tde_od_pic_osd_glb_info.bits.is_lossless = 0;
1258 hw_node->tde_od_pic_osd_glb_info.bits.is_lossless_a = 0;
1259 hw_node->tde_od_pic_osd_glb_info.bits.graphic_en = 1;
1260
1261 hw_node->tde_od_pic_osd_frame_size.bits.frame_width = hw_node->des_imgsize.bits.des_width;
1262 hw_node->tde_od_pic_osd_frame_size.bits.frame_height = hw_node->des_imgsize.bits.des_height;
1263
1264 hw_node->tde_od_pic_osd_rc_cfg1.bits.sad_bits_gain = 8; /* 8 sad_bits_gain data */
1265 hw_node->tde_od_pic_osd_rc_cfg1.bits.rc_smth_ngain = 4; /* 4 rc_smth_ngain data */
1266 hw_node->tde_od_pic_osd_rc_cfg1.bits.max_trow_bits = 10; /* 10 max_trow_bits data */
1267
1268 hw_node->tde_od_pic_osd_rc_cfg2.bits.max_sad_thr = 64; /* 64 max_sad_thr data */
1269 hw_node->tde_od_pic_osd_rc_cfg2.bits.min_sad_thr = 16; /* 16 min_sad_thr data */
1270
1271 hw_node->tde_od_pic_osd_rc_cfg3.bits.smth_thr = 3; /* 3 smth_thr data */
1272 hw_node->tde_od_pic_osd_rc_cfg3.bits.still_thr = 1;
1273 hw_node->tde_od_pic_osd_rc_cfg3.bits.big_grad_thr = 16; /* 16 big_grad_thr data */
1274
1275 hw_node->tde_od_pic_osd_rc_cfg4.bits.smth_pix_num_thr = 32; /* 32 smth_pix_num_thr data */
1276 hw_node->tde_od_pic_osd_rc_cfg4.bits.still_pix_num_thr = 32; /* 32 still_pix_num_thr data */
1277 hw_node->tde_od_pic_osd_rc_cfg4.bits.noise_pix_num_thr = 32; /* 32 noise_pix_num_thr data */
1278
1279 hw_node->tde_od_pic_osd_rc_cfg5.bits.noise_sad = 32; /* 32 noise_sad data */
1280 hw_node->tde_od_pic_osd_rc_cfg5.bits.pix_diff_thr = 50; /* 50 pix_diff_thr data */
1281
1282 hw_node->tde_od_pic_osd_rc_cfg6.bits.adj_sad_bits_thr = 0;
1283
1284 hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_inc1_bits_thr = 62; /* 62 qp_inc1_bits_thr data */
1285 hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_inc2_bits_thr = 180; /* 180 qp_inc2_bits_thr data */
1286 hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_dec1_bits_thr = 64; /* 64 qp_dec1_bits_thr data */
1287 hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_dec2_bits_thr = 150; /* 150 qp_dec2_bits_thr data */
1288
1289 hw_node->tde_od_pic_osd_rc_cfg8.bits.est_err_gain = 7; /* 7 est_err_gain data */
1290 hw_node->tde_od_pic_osd_rc_cfg8.bits.max_est_err_level = 128; /* 128 max_est_err_level data */
1291
1292 hw_node->tde_od_pic_osd_rc_cfg9.bits.vbv_buf_loss1_thr = 62; /* 62 vbv_buf_loss1_thr data */
1293 hw_node->tde_od_pic_osd_rc_cfg9.bits.vbv_buf_loss2_thr = 67; /* 67 vbv_buf_loss2_thr data */
1294 }
1295
tde_hal_node_get_ratio(tde_hw_node * hw_node,hi_u32 * cmp_ratio,hi_u32 * cmp_ratio_frm,hi_s32 * mb_org_bits)1296 static hi_s32 tde_hal_node_get_ratio(tde_hw_node *hw_node, hi_u32 *cmp_ratio, hi_u32 *cmp_ratio_frm,
1297 hi_s32 *mb_org_bits)
1298 {
1299 if (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB8888) {
1300 hw_node->tde_od_pic_osd_glb_info.bits.source_mode = 0;
1301 *cmp_ratio = 10 * 100; /* 10 1000 s32cmp_ratio data */
1302 *cmp_ratio_frm = 20 * 100; /* 20 100 s32cmp_ratio_frm data */
1303 *mb_org_bits = 32 * (8 + 8 + 8 + 8); /* 8 32 mb_org_bits data */
1304 } else if (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB1555) {
1305 hw_node->tde_od_pic_osd_glb_info.bits.source_mode = 1;
1306 *cmp_ratio = 20 * 100; /* 20 100 s32cmp_ratio data */
1307 *cmp_ratio_frm = 2.0 * 100; /* 2.0 100 s32cmp_ratio_frm data */
1308 *mb_org_bits = 32 * (1 + 5 + 5 + 5); /* 32 5 mb_org_bits data */
1309 } else if (hw_node->des_ctrl.bits.des_fmt == TDE_DRV_COLOR_FMT_ARGB4444) {
1310 hw_node->tde_od_pic_osd_glb_info.bits.source_mode = 2; /* 2 source_mode data */
1311 *cmp_ratio = 1.5 * 100; /* 1.5 * 100 s32cmp_ratio data */
1312 *cmp_ratio_frm = 1.92 * 100; /* 1.92 * 100 s32cmp_ratio_frm data */
1313 *mb_org_bits = 32 * (4 + 4 + 4 + 4); /* 4 32 mb_org_bits data */
1314 } else {
1315 tde_error("compress unsupported format except argb\n");
1316 return HI_FAILURE;
1317 }
1318 return HI_SUCCESS;
1319 }
1320
tde_hal_node_frm_width(tde_hw_node * hw_node,hi_s32 * frm_width,hi_s32 * frm_width_r)1321 static hi_void tde_hal_node_frm_width(tde_hw_node *hw_node, hi_s32 *frm_width, hi_s32 *frm_width_r)
1322 {
1323 hi_s32 spilt_num;
1324 spilt_num = (hw_node->tde_od_pic_osd_frame_size.bits.frame_width + 15) / 16; /* 15 16 for more than */
1325 if (((hi_u32)spilt_num & 0x1) == 0) {
1326 *frm_width = (spilt_num / 2) * 16; /* 2 16 four left data */
1327 *frm_width_r = hw_node->tde_od_pic_osd_frame_size.bits.frame_width - *frm_width;
1328 } else {
1329 *frm_width_r = (spilt_num / 2) * 16; /* 2 16 four left data */
1330 *frm_width = hw_node->tde_od_pic_osd_frame_size.bits.frame_width - *frm_width_r;
1331 }
1332 }
1333
tde_hal_node_set_compress(tde_hw_node * hw_node)1334 hi_void tde_hal_node_set_compress(tde_hw_node *hw_node)
1335 {
1336 hi_u32 mb_num_x, cmp_ratio, cmp_ratio_frm;
1337 hi_s32 mb_minu10, mb_bits, mb_bits_cap, ctl_delta, mb_org_bits, line_delta, ret;
1338 hi_s32 frm_width, frm_width_r;
1339
1340 /* set bitmap attribute info, CNcomment: Configure attribute information source bitmap */
1341 if (hw_node == HI_NULL) {
1342 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1343 return;
1344 }
1345
1346 ret = tde_hal_node_get_ratio(hw_node, &cmp_ratio, &cmp_ratio_frm, &mb_org_bits);
1347 if ((ret != HI_SUCCESS) || (cmp_ratio_frm == 0) || (cmp_ratio == 0)) {
1348 return;
1349 }
1350 tde_hal_node_set_cfg0x(hw_node);
1351 tde_hal_node_set_cfgxx(hw_node);
1352 if (hw_node->tde_od_pic_osd_frame_size.bits.frame_height == 0) {
1353 return;
1354 }
1355
1356 tde_hal_node_frm_width(hw_node, &frm_width, &frm_width_r);
1357 mb_num_x = (osal_min(frm_width, frm_width_r) + 31) / 32; /* 31 32 for more than */
1358 if (mb_num_x == 0) {
1359 mb_num_x = 1;
1360 }
1361
1362 mb_minu10 = mb_num_x - 10; /* 10 narrow alg data */
1363
1364 hw_node->tde_od_pic_osd_rc_cfg1.bits.max_qp = (hw_node->tde_od_pic_osd_glb_info.bits.source_mode == 0) ?
1365 6 : ((hw_node->tde_od_pic_osd_glb_info.bits.source_mode == 2) ? 2 : 3); /* 2 3 6 max_qp data */
1366 /* 16 280 alg data */
1367 line_delta = hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_inc1_bits_thr * 16 / mb_num_x + 280 / mb_num_x;
1368 /* 127 1000 alg data */
1369 ctl_delta = (mb_org_bits * 1000 / cmp_ratio) / 127 + osal_max((hi_u32)1,
1370 (hi_u32)(hw_node->tde_od_pic_osd_rc_cfg14.bits.init_buf_bits_cap +
1371 hw_node->tde_od_pic_osd_rc_cfg7.bits.qp_inc1_bits_thr * 16 + 280) / /* 16 280 alg data */
1372 (hw_node->tde_od_pic_osd_frame_size.bits.frame_height * mb_num_x));
1373 /* 0 3 ctl_delta data */
1374 ctl_delta = (hw_node->tde_od_pic_osd_glb_info.bits.source_mode == 0) ? (ctl_delta + 3) : ctl_delta;
1375
1376 mb_bits = (hi_s32)(mb_org_bits * 1000 / cmp_ratio); /* 1000 alg data */
1377 mb_bits = mb_bits - line_delta;
1378 hw_node->tde_od_pic_osd_rc_cfg0.bits.mb_bits =
1379 (hw_node->tde_od_pic_osd_glb_info.bits.is_lossless || hw_node->tde_od_pic_osd_glb_info.bits.cmp_mode) ?
1380 osal_min((hi_u32)1023, (hi_u32)mb_org_bits) : (hi_u32)mb_bits; /* 1023 alg data */
1381
1382 mb_bits_cap = (hi_s32)(mb_org_bits * 1000 / cmp_ratio_frm); /* 1000 alg data */
1383 mb_bits_cap = mb_bits_cap - ctl_delta;
1384 mb_bits_cap = osal_max((hi_u32)170, osal_min((hi_u32)mb_bits, (hi_u32)mb_bits_cap)); /* 170 alg data */
1385 hw_node->tde_od_pic_osd_rc_cfg14.bits.mb_bits_cap =
1386 (hw_node->tde_od_pic_osd_glb_info.bits.is_lossless || hw_node->tde_od_pic_osd_glb_info.bits.cmp_mode) ?
1387 osal_min((hi_u32)1023, (hi_u32)mb_org_bits) : (hi_u32)mb_bits_cap; /* 1023 alg data */
1388
1389 hw_node->tde_od_pic_osd_rc_cfg0.bits.min_mb_bits =
1390 osal_min((hi_u32)(hw_node->tde_od_pic_osd_rc_cfg14.bits.mb_bits_cap - 20), /* 20 alg data */
1391 (hi_u32)(hw_node->tde_od_pic_osd_rc_cfg0.bits.mb_bits * 3 / 4)); /* 4 3 alg data */
1392
1393 hw_node->tde_od_pic_osd_rc_cfg15.bits.lfw_mb_len =
1394 /* 2 alg data */
1395 osal_max((hi_u32)0, osal_min((hi_u32)(mb_num_x / 2), (hi_u32)(mb_minu10 < 0 ? 0 : mb_minu10)));
1396 /* 20 alg data */
1397 hw_node->tde_od_pic_osd_rc_cfg11.bits.grph_ideal_bit_thr = hw_node->tde_od_pic_osd_rc_cfg0.bits.mb_bits - 20;
1398 }
1399 #endif
1400
tde_hal_node_set_compress_tqt(tde_hw_node * hw_node,tde_surface_msg * drv_surface,hi_tde_out_alpha_from alpha_from)1401 hi_void tde_hal_node_set_compress_tqt(tde_hw_node *hw_node, tde_surface_msg *drv_surface,
1402 hi_tde_out_alpha_from alpha_from)
1403 {
1404 if (hw_node == HI_NULL) {
1405 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1406 return;
1407 }
1408 tde_hal_node_set_tqt(hw_node, drv_surface, alpha_from);
1409 #if (HICHIP != HI3519A_V100)
1410 hw_node->tde_od_pic_osd_glb_info.bits.hq_cmp_en = 1;
1411 #endif
1412 hw_node->des_ctrl.bits.cmp_en = 1;
1413 return;
1414 }
1415 #endif
1416
1417 #if (TDE_CAPABILITY & ROTATE)
tde_hal_node_set_rotate(tde_hw_node * hw_node,hi_tde_rotate_angle rotate_angle)1418 hi_void tde_hal_node_set_rotate(tde_hw_node *hw_node, hi_tde_rotate_angle rotate_angle)
1419 {
1420 if (hw_node == HI_NULL) {
1421 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1422 return;
1423 }
1424 hw_node->src2_rtt_ctrl.bits.s2_rtt_en = 1;
1425 /* set bitmap attribute info, CNcomment: Configure attribute information source bitmap */
1426 if (TDE_DRV_COLOR_FMT_YCBCR422 == hw_node->src2_ctrl.bits.src2_fmt) {
1427 hw_node->src2_rtt_ctrl.bits.s2_rtt_fmt = 0;
1428 }
1429 if ((hw_node->src2_ctrl.bits.src2_fmt == TDE_DRV_COLOR_FMT_RGB888) ||
1430 (TDE_DRV_COLOR_FMT_YCBCR888 == hw_node->src2_ctrl.bits.src2_fmt)) {
1431 hw_node->src2_rtt_ctrl.bits.s2_rtt_fmt = 1;
1432 }
1433 if ((hw_node->src2_ctrl.bits.src2_fmt == TDE_DRV_COLOR_FMT_ARGB4444) ||
1434 (hw_node->src2_ctrl.bits.src2_fmt == TDE_DRV_COLOR_FMT_ARGB1555)) {
1435 hw_node->src2_rtt_ctrl.bits.s2_rtt_fmt = 2; /* 2 ARGB4444 ARGB1555 */
1436 }
1437 if (hw_node->src2_ctrl.bits.src2_fmt == TDE_DRV_COLOR_FMT_ARGB8888) {
1438 hw_node->src2_rtt_ctrl.bits.s2_rtt_fmt = 3; /* 3 ARGB8888 */
1439 }
1440 if (rotate_angle == HI_TDE_ROTATE_CLOCKWISE_90) {
1441 hw_node->src2_rtt_ctrl.bits.s2_rtt_dir = 0;
1442 } else {
1443 hw_node->src2_rtt_ctrl.bits.s2_rtt_dir = 1;
1444 }
1445
1446 return;
1447 }
1448 #endif
1449
1450 #ifndef HI_BUILD_IN_BOOT
tde_hal_node_file(tde_hw_node * hw_node,tde_base_opt_mode mode,tde_alu_mode alu,tde_color_fill * color_fill,hi_u32 capability)1451 static hi_s32 tde_hal_node_file(tde_hw_node *hw_node, tde_base_opt_mode mode, tde_alu_mode alu,
1452 tde_color_fill *color_fill, hi_u32 capability)
1453 {
1454 if (mode == TDE_QUIKE_COPY) {
1455 if (!tde_hal_is_operation_support(alu, capability, QUICKCOPY)) {
1456 tde_error("It does not support QuickCopy\n");
1457 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1458 }
1459 hw_node->src1_ctrl.bits.src1_en = 1;
1460 hw_node->src1_ctrl.bits.src1_dma = 1;
1461 }
1462 if (mode == TDE_NORM_FILL_1OPT) {
1463 if (color_fill == HI_NULL) {
1464 tde_error("pstColorFill is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1465 return HI_ERR_TDE_NULL_PTR;
1466 }
1467 tde_fill_data_by_fmt(hw_node, color_fill->fill_data, color_fill->drv_color_fmt, 1);
1468 hw_node->src2_ctrl.bits.src2_en = 1;
1469 hw_node->src2_ctrl.bits.src2_mode = 1;
1470 hw_node->cbmctrl.bits.cbm_en = 1;
1471 hw_node->cbmctrl.bits.cbm_mode = 1;
1472 hw_node->cbmctrl.bits.alu_mode = 1;
1473 }
1474 if (mode == TDE_NORM_FILL_2OPT) {
1475 if (color_fill == HI_NULL) {
1476 tde_error("pstColorFill is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1477 return HI_ERR_TDE_NULL_PTR;
1478 }
1479 tde_fill_data_by_fmt(hw_node, color_fill->fill_data, color_fill->drv_color_fmt, 1);
1480 hw_node->src1_ctrl.bits.src1_en = 1;
1481 hw_node->src1_ctrl.bits.src1_mode = 0;
1482 hw_node->src2_ctrl.bits.src2_en = 1;
1483 hw_node->src2_ctrl.bits.src2_mode = 1;
1484 hw_node->cbmctrl.bits.cbm_en = 1;
1485 hw_node->cbmctrl.bits.cbm_mode = 1;
1486
1487 hw_node->cbmctrl.bits.alu_mode = g_cbmctrl_alu_mode[alu];
1488 }
1489 return HI_SUCCESS;
1490 }
1491
tde_hal_node_opt(tde_hw_node * hw_node,tde_base_opt_mode mode,tde_alu_mode alu,hi_u32 capability)1492 static hi_s32 tde_hal_node_opt(tde_hw_node *hw_node, tde_base_opt_mode mode, tde_alu_mode alu,
1493 hi_u32 capability)
1494 {
1495 if (mode == TDE_SINGLE_SRC_PATTERN_FILL_OPT) {
1496 if (!tde_hal_is_operation_support(alu, capability, PATTERFILL)) {
1497 tde_error("It deos not support PatternFill\n");
1498 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1499 }
1500
1501 hw_node->src2_ctrl.bits.src2_en = 1;
1502 hw_node->src2_ctrl.bits.src2_mode = 2; /* 2 mode */
1503 hw_node->cbmctrl.bits.cbm_en = 1;
1504 hw_node->cbmctrl.bits.cbm_mode = 1;
1505
1506 hw_node->cbmctrl.bits.alu_mode = g_cbmctrl_alu_mode[alu];
1507 }
1508 if (mode == TDE_DOUBLE_SRC_PATTERN_FILL_OPT) {
1509 if (!tde_hal_is_operation_support(alu, capability, PATTERFILL)) {
1510 tde_error("It deos not support PatternFill\n");
1511 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1512 }
1513
1514 hw_node->src1_ctrl.bits.src1_en = 1;
1515 hw_node->src1_ctrl.bits.src1_mode = 0;
1516
1517 hw_node->src2_ctrl.bits.src2_en = 1;
1518 hw_node->src2_ctrl.bits.src2_mode = 2; /* 2 mode */
1519 hw_node->cbmctrl.bits.cbm_en = 1;
1520 hw_node->cbmctrl.bits.cbm_mode = 1;
1521
1522 hw_node->cbmctrl.bits.alu_mode = g_cbmctrl_alu_mode[alu];
1523 }
1524 return HI_SUCCESS;
1525 }
1526 #endif
1527
tde_hal_node_set_base_hw(tde_hw_node * hw_node,tde_base_opt_mode mode,tde_alu_mode alu)1528 static hi_void tde_hal_node_set_base_hw(tde_hw_node *hw_node, tde_base_opt_mode mode, tde_alu_mode alu)
1529 {
1530 if (mode == TDE_QUIKE_FILL) {
1531 hw_node->src1_ctrl.bits.src1_en = 1;
1532 hw_node->src1_ctrl.bits.src1_mode = 1;
1533 hw_node->src1_ctrl.bits.src1_dma = 1;
1534 return;
1535 }
1536 if (mode == TDE_NORM_BLIT_1OPT) {
1537 hw_node->src2_ctrl.bits.src2_en = 1;
1538 hw_node->src2_ctrl.bits.src2_mode = 0;
1539 hw_node->cbmctrl.bits.cbm_en = 1;
1540 hw_node->cbmctrl.bits.cbm_mode = 1;
1541 hw_node->cbmctrl.bits.alu_mode = 1;
1542 return;
1543 }
1544
1545 if (mode == TDE_NORM_BLIT_2OPT) {
1546 hw_node->src1_ctrl.bits.src1_en = 1;
1547 hw_node->src1_ctrl.bits.src1_mode = 0;
1548
1549 hw_node->src2_ctrl.bits.src2_en = 1;
1550 hw_node->src2_ctrl.bits.src2_mode = 0;
1551
1552 hw_node->cbmctrl.bits.cbm_en = 1;
1553 hw_node->cbmctrl.bits.cbm_mode = 1;
1554
1555 hw_node->cbmctrl.bits.alu_mode = g_cbmctrl_alu_mode[alu];
1556 return;
1557 }
1558 if (mode == TDE_MB_2OPT) {
1559 hw_node->src2_ctrl.bits.src2_en = 1;
1560 hw_node->src2_ctrl.bits.src2_mode = 0;
1561
1562 hw_node->cbmctrl.bits.cbm_en = 1;
1563 hw_node->cbmctrl.bits.cbm_mode = 1;
1564 hw_node->cbmctrl.bits.alu_mode = 0x1;
1565 }
1566 return;
1567 }
1568
tde_hal_quike_fill(tde_hw_node * hw_node,tde_base_opt_mode mode,tde_alu_mode alu,tde_color_fill * color_fill,hi_u32 capability)1569 static hi_s32 tde_hal_quike_fill(tde_hw_node *hw_node, tde_base_opt_mode mode, tde_alu_mode alu,
1570 tde_color_fill *color_fill, hi_u32 capability)
1571 {
1572 if (color_fill == HI_NULL) {
1573 tde_error("pstColorFill is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1574 return HI_ERR_TDE_NULL_PTR;
1575 }
1576 if (!tde_hal_is_operation_support(alu, capability, QUICKFILL)) {
1577 tde_error("It deos not support QuickFill\n");
1578 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1579 }
1580 tde_fill_data_by_fmt(hw_node, color_fill->fill_data, color_fill->drv_color_fmt, 0);
1581 tde_hal_node_set_base_hw(hw_node, mode, alu);
1582 return HI_SUCCESS;
1583 }
1584
tde_hal_node_operation_support(tde_alu_mode alu,hi_u32 capability)1585 static hi_s32 tde_hal_node_operation_support(tde_alu_mode alu, hi_u32 capability)
1586 {
1587 #if (TDE_CAPABILITY & ROP)
1588 if (!tde_hal_is_operation_support(alu, capability, MASKROP)) {
1589 tde_error("It deos not support MaskRop\n");
1590 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1591 }
1592 #endif
1593 #if (TDE_CAPABILITY & MASKBLEND)
1594 if (!tde_hal_is_operation_support(alu, capability, MASKBLEND)) {
1595 tde_error("It deos not support MaskBlend\n");
1596 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1597 }
1598 #endif
1599 return HI_SUCCESS;
1600 }
1601
tde_hal_node_set_base_operate(tde_hw_node * hw_node,tde_base_opt_mode mode,tde_alu_mode alu,tde_color_fill * color_fill)1602 hi_s32 tde_hal_node_set_base_operate(tde_hw_node *hw_node, tde_base_opt_mode mode, tde_alu_mode alu,
1603 tde_color_fill *color_fill)
1604 {
1605 hi_u32 capability = 0;
1606 hi_s32 ret;
1607
1608 if (hw_node == HI_NULL) {
1609 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1610 return HI_ERR_TDE_NULL_PTR;
1611 }
1612 tde_hal_get_capability(&capability);
1613
1614 switch (mode) {
1615 case TDE_QUIKE_FILL: /* quick file, CNcomment:Rapid filling */
1616 ret = tde_hal_quike_fill(hw_node, mode, alu, color_fill, capability);
1617 if (ret != HI_SUCCESS) {
1618 return ret;
1619 }
1620 break;
1621 #ifndef HI_BUILD_IN_BOOT
1622 case TDE_QUIKE_COPY:
1623 case TDE_NORM_FILL_1OPT:
1624 case TDE_NORM_FILL_2OPT:
1625 ret = tde_hal_node_file(hw_node, mode, alu, color_fill, capability);
1626 if (ret != HI_SUCCESS) {
1627 return ret;
1628 }
1629 break;
1630 case TDE_SINGLE_SRC_PATTERN_FILL_OPT:
1631 case TDE_DOUBLE_SRC_PATTERN_FILL_OPT:
1632 ret = tde_hal_node_opt(hw_node, mode, alu, capability);
1633 if (ret != HI_SUCCESS) {
1634 return ret;
1635 }
1636 break;
1637 #endif
1638 case TDE_NORM_BLIT_2OPT:
1639 ret = tde_hal_node_operation_support(alu, capability);
1640 if (ret != HI_SUCCESS) {
1641 return ret;
1642 }
1643 /* fall-through */
1644 case TDE_NORM_BLIT_1OPT:
1645 case TDE_MB_2OPT:
1646 tde_hal_node_set_base_hw(hw_node, mode, alu);
1647 break;
1648 default:
1649 break;
1650 }
1651 return HI_SUCCESS;
1652 }
1653
tde_hal_is_operation_support(tde_alu_mode alu_mode,hi_u32 capability,hi_u32 oper_mode)1654 static hi_bool tde_hal_is_operation_support(tde_alu_mode alu_mode, hi_u32 capability, hi_u32 oper_mode)
1655 {
1656 if (!((hi_u32)MASKBLEND & oper_mode) && !((hi_u32)MASKROP & oper_mode)) {
1657 return (hi_bool)((capability & oper_mode) ? HI_TRUE : HI_FALSE);
1658 }
1659
1660 #if (TDE_CAPABILITY & MASKBLEND)
1661 if ((hi_u32)MASKBLEND & oper_mode) {
1662 return (hi_bool)(!((alu_mode == TDE_ALU_MASK_BLEND) && (!(capability & oper_mode))));
1663 }
1664 #endif
1665
1666 #if (TDE_CAPABILITY & ROP)
1667 if ((hi_u32)MASKROP & oper_mode) {
1668 return (hi_bool)(!(((alu_mode == TDE_ALU_MASK_ROP1) || (alu_mode == TDE_ALU_MASK_ROP2)) &&
1669 (!(capability & oper_mode))));
1670 }
1671 #endif
1672
1673 return HI_TRUE;
1674 }
1675
tde_hal_node_set_global_alpha(tde_hw_node * hw_node,hi_u8 alpha,hi_bool enable)1676 hi_void tde_hal_node_set_global_alpha(tde_hw_node *hw_node, hi_u8 alpha, hi_bool enable)
1677 {
1678 #ifndef HI_BUILD_IN_BOOT
1679 hi_unused(enable);
1680 if (hw_node == HI_NULL) {
1681 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1682 return;
1683 }
1684
1685 /* set node, CNcomment: Configure the cache node */
1686 hw_node->src2_cbmpara.bits.s2_galpha = alpha;
1687
1688 #endif
1689 return;
1690 }
1691
tde_hal_node_set_src1_alpha(tde_hw_node * hw_node)1692 hi_void tde_hal_node_set_src1_alpha(tde_hw_node *hw_node)
1693 {
1694 if (hw_node == HI_NULL) {
1695 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1696 return;
1697 }
1698
1699 /* set alpha0 alpha1, CNcomment:alpha0, alpha1 */
1700 hw_node->src1_alpha.bits.src1_alpha0 = 0;
1701 hw_node->src1_alpha.bits.src1_alpha1 = 0xff; /* 0xff alpha1 value */
1702
1703 return;
1704 }
1705
tde_hal_node_set_src2_alpha(tde_hw_node * hw_node)1706 hi_void tde_hal_node_set_src2_alpha(tde_hw_node *hw_node)
1707 {
1708 if (hw_node == HI_NULL) {
1709 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1710 return;
1711 }
1712
1713 /* set alpha0 alpha1, CNcomment:alpha0, alpha1 */
1714 hw_node->src2_alpha.bits.src2_alpha0 = 0;
1715 hw_node->src2_alpha.bits.src2_alpha1 = 0xff; /* 0xff alpha1 value */
1716
1717 return;
1718 }
1719
1720 /*
1721 * Function: tde_hal_node_set_exp_alpha
1722 * Description: extend to alpha0 and alpha1 operation when extend alpha for RGB5551
1723 * Input: hw_node:pointer of node
1724 * alpha0: Alpha0 value
1725 * alpha1: Alpha1 value
1726 */
tde_hal_node_set_exp_alpha(tde_hw_node * hw_node,tde_src_mode src,hi_u8 alpha0,hi_u8 alpha1)1727 hi_void tde_hal_node_set_exp_alpha(tde_hw_node *hw_node, tde_src_mode src, hi_u8 alpha0, hi_u8 alpha1)
1728 {
1729 if (hw_node == HI_NULL) {
1730 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1731 return;
1732 }
1733
1734 /* set alpha0 alpha1, CNcomment:alpha0, alpha1 */
1735 if ((hi_u32)src & TDE_DRV_SRC_S1) {
1736 hw_node->src1_alpha.bits.src1_alpha0 = alpha0;
1737 hw_node->src1_alpha.bits.src1_alpha1 = alpha1;
1738 hw_node->src1_ctrl.bits.src1_rgb_exp = 3; /* 3 set alpha0 alpha1 */
1739 }
1740
1741 if ((hi_u32)src & TDE_DRV_SRC_S2) {
1742 hw_node->src2_alpha.bits.src2_alpha0 = alpha0;
1743 hw_node->src2_alpha.bits.src2_alpha1 = alpha1;
1744 hw_node->src2_ctrl.bits.src2_rgb_exp = 3; /* 3 set alpha0 alpha1 */
1745 }
1746
1747 return;
1748 }
1749
1750 #if (TDE_CAPABILITY & ROP)
tde_hal_node_set_rop(tde_hw_node * hw_node,hi_tde_rop_mode rgb_rop,hi_tde_rop_mode alpha_rop)1751 hi_s32 tde_hal_node_set_rop(tde_hw_node *hw_node, hi_tde_rop_mode rgb_rop, hi_tde_rop_mode alpha_rop)
1752 {
1753 #ifndef HI_BUILD_IN_BOOT
1754 hi_u32 capability;
1755 if (hw_node == HI_NULL) {
1756 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1757 return HI_ERR_TDE_NULL_PTR;
1758 }
1759 tde_hal_get_capability(&capability);
1760 if (!(capability & ROP)) {
1761 tde_error("It deos not support Rop\n");
1762 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1763 }
1764 /* set node, CNcomment: Configure the cache node */
1765 hw_node->cbmctrl.bits.cbm_en = 1;
1766 hw_node->cbmctrl.bits.cbm_mode = 1;
1767
1768 hw_node->cbmalupara.bits.rgb_rop = (hi_u32)rgb_rop;
1769 hw_node->cbmalupara.bits.rop = (hi_u32)alpha_rop;
1770 #endif
1771 return HI_SUCCESS;
1772 }
1773 #endif
1774
1775 #ifndef HI_BUILD_IN_BOOT
tde_hal_node_blend_mode(tde_hw_node * hw_node,hi_tde_blend_opt * blend_opt)1776 static hi_void tde_hal_node_blend_mode(tde_hw_node *hw_node, hi_tde_blend_opt *blend_opt)
1777 {
1778 if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_NONE) {
1779 /* fs: sa fd: 1.0-sa */
1780 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_INVSRC2ALPHA, HI_TDE_BLEND_SRC2ALPHA);
1781 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_CLEAR) {
1782 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ZERO, HI_TDE_BLEND_ZERO);
1783 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_SRC) {
1784 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ZERO, HI_TDE_BLEND_ONE);
1785 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_SRCOVER) {
1786 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_INVSRC2ALPHA, HI_TDE_BLEND_ONE);
1787 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_DSTOVER) {
1788 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ONE, HI_TDE_BLEND_INVSRC1ALPHA);
1789 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_SRCIN) {
1790 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ZERO, HI_TDE_BLEND_SRC1ALPHA);
1791 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_DSTIN) {
1792 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_SRC2ALPHA, HI_TDE_BLEND_ZERO);
1793 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_SRCOUT) {
1794 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ZERO, HI_TDE_BLEND_INVSRC1ALPHA);
1795 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_DSTOUT) {
1796 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_INVSRC2ALPHA, HI_TDE_BLEND_ZERO);
1797 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_SRCATOP) {
1798 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_INVSRC2ALPHA, HI_TDE_BLEND_SRC1ALPHA);
1799 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_DSTATOP) {
1800 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_SRC2ALPHA, HI_TDE_BLEND_INVSRC1ALPHA);
1801 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_ADD) {
1802 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ONE, HI_TDE_BLEND_ONE);
1803 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_XOR) {
1804 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_INVSRC2ALPHA, HI_TDE_BLEND_INVSRC1ALPHA);
1805 } else if (blend_opt->blend_cmd == HI_TDE_BLEND_CMD_DST) {
1806 drv_tde_node_blend_mode(hw_node, HI_TDE_BLEND_ONE, HI_TDE_BLEND_ZERO);
1807 } else {
1808 /* user parameter, CNcomment: The user's own configuration parameters */
1809 drv_tde_node_blend_mode(hw_node, blend_opt->src1_blend_mode, blend_opt->src2_blend_mode);
1810 }
1811 }
1812 #endif
1813
tde_hal_node_set_blend(tde_hw_node * hw_node,hi_tde_blend_opt * blend_opt)1814 hi_s32 tde_hal_node_set_blend(tde_hw_node *hw_node, hi_tde_blend_opt *blend_opt)
1815 {
1816 #ifndef HI_BUILD_IN_BOOT
1817 hi_u32 capability = 0;
1818
1819 if (hw_node == HI_NULL) {
1820 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1821 return HI_ERR_TDE_NULL_PTR;
1822 }
1823 if (blend_opt == HI_NULL) {
1824 tde_error("pstBlendOpt is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1825 return HI_ERR_TDE_NULL_PTR;
1826 }
1827 tde_hal_get_capability(&capability);
1828 if (!(capability & ALPHABLEND)) {
1829 tde_error("It deos not support Blend\n");
1830 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1831 }
1832
1833 hw_node->src1_cbmpara.bits.s1_palphaen = HI_TRUE;
1834 hw_node->src1_cbmpara.bits.s1_galphaen = HI_FALSE;
1835 hw_node->src1_cbmpara.bits.s1_multiglobalen = HI_FALSE;
1836 hw_node->src2_cbmpara.bits.s2_multiglobalen = HI_FALSE;
1837
1838 hw_node->src1_cbmpara.bits.s1_premulten = blend_opt->src1_alpha_premulti;
1839 hw_node->src2_cbmpara.bits.s2_premulten = blend_opt->src2_alpha_premulti;
1840 hw_node->src2_cbmpara.bits.s2_palphaen = blend_opt->pixel_alpha_en;
1841 hw_node->src2_cbmpara.bits.s2_galphaen = blend_opt->global_alpha_en;
1842
1843 /* set mode for src1 and src2 , CNcomment: configuration Src1,Src2 mode */
1844 tde_hal_node_blend_mode(hw_node, blend_opt);
1845 hw_node->cbmctrl.bits.cbm_en = 1;
1846 hw_node->cbmctrl.bits.cbm_mode = 1;
1847 #endif
1848 return HI_SUCCESS;
1849 }
1850
1851 #if (TDE_CAPABILITY & COLORIZE)
tde_hal_node_set_colorize(tde_hw_node * hw_node,hi_u32 colorize)1852 hi_s32 tde_hal_node_set_colorize(tde_hw_node *hw_node, hi_u32 colorize)
1853 {
1854 hi_u32 capability = 0;
1855 if (hw_node == HI_NULL) {
1856 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1857 return HI_ERR_TDE_NULL_PTR;
1858 }
1859 tde_hal_get_capability(&capability);
1860 if (!(capability & COLORIZE)) {
1861 tde_error("It deos not support Colorize\n");
1862 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1863 }
1864 hw_node->cbmcolorize.bits.colorizeen = 1;
1865 hw_node->cbmcolorize.bits.colorizeb = colorize & 0xff;
1866 hw_node->cbmcolorize.bits.colorizeg = (colorize >> 8) & 0xff; /* 8 move to a minimum */
1867 hw_node->cbmcolorize.bits.colorizer = (colorize >> 16) & 0xff; /* 16 move to a minimum */
1868 return HI_SUCCESS;
1869 }
1870 #endif
1871
tde_hal_node_enable_alpha_rop(tde_hw_node * hw_node)1872 hi_void tde_hal_node_enable_alpha_rop(tde_hw_node *hw_node)
1873 {
1874 hw_node->cbmalupara.bits.blendropen = 1;
1875 return;
1876 }
1877
1878 /*
1879 * Function: tde_hal_node_set_clut_opt
1880 * Description: set color extend or color revise parameter
1881 * Input: hw_node: pointer of node
1882 * clut_cmd: Clut operation parameter
1883 */
tde_hal_node_set_clut_opt(tde_hw_node * hw_node,tde_clut_cmd * clut_cmd,hi_bool reload)1884 hi_s32 tde_hal_node_set_clut_opt(tde_hw_node *hw_node, tde_clut_cmd *clut_cmd, hi_bool reload)
1885 {
1886 #ifndef HI_BUILD_IN_BOOT
1887 hi_u32 capability = 0;
1888 hi_unused(reload);
1889 if (hw_node == HI_NULL) {
1890 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1891 return HI_ERR_TDE_NULL_PTR;
1892 }
1893 if (clut_cmd == HI_NULL) {
1894 tde_error("pClutCmd is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1895 return HI_ERR_TDE_NULL_PTR;
1896 }
1897 tde_hal_get_capability(&capability);
1898 if (!(capability & CLUT)) {
1899 tde_error("It deos not support Clut\n");
1900 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1901 }
1902 hw_node->src2_ctrl.bits.src2_clut_mode = (hi_u32)clut_cmd->clut_mode;
1903 /* set node, CNcomment:Configure the cache node */
1904 if (clut_cmd->phy_clut_addr) {
1905 hw_node->tde_clut_addr_low = GetLowAddr(clut_cmd->phy_clut_addr);
1906 hw_node->tde_clut_addr_high = GetHighAddr(clut_cmd->phy_clut_addr);
1907 }
1908
1909 #endif
1910 return HI_SUCCESS;
1911 }
1912
1913 /*
1914 * Function: tde_hal_node_set_colorkey
1915 * Description: set parameter for color key operation according color format
1916 * Input: hw_node:pointer of node
1917 * fmt_cat: color format
1918 * color_key: pointer of color key value
1919 */
tde_hal_node_set_colorkey(tde_hw_node * hw_node,tde_colorfmt_category fmt_cat,tde_color_key_cmd * color_key)1920 hi_s32 tde_hal_node_set_colorkey(tde_hw_node *hw_node, tde_colorfmt_category fmt_cat, tde_color_key_cmd *color_key)
1921 {
1922 #ifndef HI_BUILD_IN_BOOT
1923 hi_u32 capability = 0;
1924
1925 if (hw_node == HI_NULL) {
1926 tde_error("hw_node is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1927 return HI_ERR_TDE_NULL_PTR;
1928 }
1929 if (color_key == HI_NULL) {
1930 tde_error("color_key is null %s(line=%d)\n", __FUNCTION__, __LINE__);
1931 return HI_ERR_TDE_NULL_PTR;
1932 }
1933
1934 tde_hal_get_capability(&capability);
1935 if (!(capability & COLORKEY)) {
1936 tde_error("It deos not support ColorKey\n");
1937 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1938 }
1939 hw_node->cbmkeypara.bits.keysel = (hi_u32)color_key->color_key_mode;
1940 hw_node->cbmkeypara.bits.keyen = 1;
1941 if (fmt_cat == TDE_COLORFMT_CATEGORY_ARGB) {
1942 tde_hal_node_set_argbcolor_key_para(hw_node, color_key);
1943 } else if (fmt_cat == TDE_COLORFMT_CATEGORY_CLUT) {
1944 tde_hal_node_set_clutcolor_key_para(hw_node, color_key);
1945 } else if (fmt_cat == TDE_COLORFMT_CATEGORY_YCBCR) {
1946 tde_hal_node_set_ycbcr_color_key_para(hw_node, color_key);
1947 } else {
1948 tde_error("The clorfmt deos not support ColorKey\n");
1949 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
1950 }
1951
1952 hw_node->cbmctrl.bits.cbm_en = 1;
1953 hw_node->cbmctrl.bits.cbm_mode = 1;
1954
1955 #endif
1956 return HI_SUCCESS;
1957 }
1958
1959 #ifndef HI_BUILD_IN_BOOT
tde_hal_node_set_ycbcr_color_key_para(tde_hw_node * hw_node,tde_color_key_cmd * color_key)1960 static hi_void tde_hal_node_set_ycbcr_color_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key)
1961 {
1962 hi_tde_color_key_comp cr = color_key->color_key_value.ycbcr_color_key.cr;
1963 hi_tde_color_key_comp cb = color_key->color_key_value.ycbcr_color_key.cb;
1964 hi_tde_color_key_comp y = color_key->color_key_value.ycbcr_color_key.y;
1965 hi_tde_color_key_comp alpha = color_key->color_key_value.ycbcr_color_key.alpha;
1966
1967 hw_node->cbmkeymin.all =
1968 tde_hal_get_ycb_cr_key_mask(cr.component_min, cb.component_min, y.component_min, alpha.component_min);
1969 hw_node->cbmkeymax.all =
1970 tde_hal_get_ycb_cr_key_mask(cr.component_max, cb.component_max, y.component_max, alpha.component_max);
1971 hw_node->cbmkeymask.all =
1972 tde_hal_get_ycb_cr_key_mask(cr.component_mask, cb.component_mask, y.component_mask, alpha.component_mask);
1973
1974 hw_node->cbmkeypara.bits.keybmode = tde_hal_get_color_key_mode(&cr);
1975 hw_node->cbmkeypara.bits.keygmode = tde_hal_get_color_key_mode(&cb);
1976 hw_node->cbmkeypara.bits.keyrmode = tde_hal_get_color_key_mode(&y);
1977 hw_node->cbmkeypara.bits.keyamode = tde_hal_get_color_key_mode(&alpha);
1978
1979 return;
1980 }
1981
tde_hal_node_set_clutcolor_key_para(tde_hw_node * hw_node,tde_color_key_cmd * color_key)1982 static hi_void tde_hal_node_set_clutcolor_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key)
1983 {
1984 hi_tde_color_key_comp clut = color_key->color_key_value.clut_color_key.clut;
1985 hi_tde_color_key_comp alpha = color_key->color_key_value.clut_color_key.alpha;
1986
1987 hw_node->cbmkeymin.all = tde_hal_get_clut_key_mask(clut.component_min, alpha.component_min);
1988 hw_node->cbmkeymax.all = tde_hal_get_clut_key_mask(clut.component_max, alpha.component_max);
1989 hw_node->cbmkeymask.all = tde_hal_get_clut_key_mask(clut.component_mask, alpha.component_mask);
1990
1991 hw_node->cbmkeypara.bits.keybmode = tde_hal_get_color_key_mode(&clut);
1992 hw_node->cbmkeypara.bits.keyamode = tde_hal_get_color_key_mode(&alpha);
1993
1994 return;
1995 }
1996
tde_hal_node_set_argbcolor_key_para(tde_hw_node * hw_node,tde_color_key_cmd * color_key)1997 static hi_void tde_hal_node_set_argbcolor_key_para(tde_hw_node *hw_node, tde_color_key_cmd *color_key)
1998 {
1999 hi_tde_color_key_comp blue = color_key->color_key_value.argb_color_key.blue;
2000 hi_tde_color_key_comp green = color_key->color_key_value.argb_color_key.green;
2001 hi_tde_color_key_comp red = color_key->color_key_value.argb_color_key.red;
2002 hi_tde_color_key_comp alpha = color_key->color_key_value.argb_color_key.alpha;
2003
2004 hw_node->cbmkeymin.all =
2005 tde_hal_get_argb_key_mask(blue.component_min, green.component_min, red.component_min, alpha.component_min);
2006 hw_node->cbmkeymax.all =
2007 tde_hal_get_argb_key_mask(blue.component_max, green.component_max, red.component_max, alpha.component_max);
2008 hw_node->cbmkeymask.all =
2009 tde_hal_get_argb_key_mask(blue.component_mask, green.component_mask, red.component_mask, alpha.component_mask);
2010
2011 hw_node->cbmkeypara.bits.keybmode = tde_hal_get_color_key_mode(&blue);
2012 hw_node->cbmkeypara.bits.keygmode = tde_hal_get_color_key_mode(&green);
2013 hw_node->cbmkeypara.bits.keyrmode = tde_hal_get_color_key_mode(&red);
2014 hw_node->cbmkeypara.bits.keyamode = tde_hal_get_color_key_mode(&alpha);
2015 return;
2016 }
2017
tde_hal_get_color_key_mode(hi_tde_color_key_comp * color_key)2018 static hi_u32 tde_hal_get_color_key_mode(hi_tde_color_key_comp *color_key)
2019 {
2020 return (hi_u32)((color_key->is_component_ignore) ? TDE_COLORKEY_IGNORE :
2021 (color_key->is_component_out) ? TDE_COLORKEY_AREA_OUT : TDE_COLORKEY_AREA_IN);
2022 }
2023
tde_hal_get_ycb_cr_key_mask(hi_u8 cr,hi_u8 cb,hi_u8 cy,hi_u8 alpha)2024 static hi_u32 tde_hal_get_ycb_cr_key_mask(hi_u8 cr, hi_u8 cb, hi_u8 cy, hi_u8 alpha)
2025 {
2026 return (hi_u32)(cr | (cb << TDE_EIGHT_BITS_SHIFT) | (cy << TDE_SIXTEEN_BITS_SHIFT) |
2027 (alpha << TDE_TWENTYFOUR_BITS_SHIFT));
2028 }
2029
tde_hal_get_clut_key_mask(hi_u8 clut,hi_u8 alpha)2030 static hi_u32 tde_hal_get_clut_key_mask(hi_u8 clut, hi_u8 alpha)
2031 {
2032 return (hi_u32)(clut | (alpha << TDE_TWENTYFOUR_BITS_SHIFT));
2033 }
2034
tde_hal_get_argb_key_mask(hi_u8 blue,hi_u8 green,hi_u8 red,hi_u8 alpha)2035 static hi_u32 tde_hal_get_argb_key_mask(hi_u8 blue, hi_u8 green, hi_u8 red, hi_u8 alpha)
2036 {
2037 return (hi_u32)(blue | (green << TDE_EIGHT_BITS_SHIFT) | (red << TDE_SIXTEEN_BITS_SHIFT) |
2038 (alpha << TDE_TWENTYFOUR_BITS_SHIFT));
2039 }
2040 #endif
2041
tde_hal_node_set_clipping(tde_hw_node * hw_node,tde_clip_cmd * clip)2042 hi_s32 tde_hal_node_set_clipping(tde_hw_node *hw_node, tde_clip_cmd *clip)
2043 {
2044 #ifndef HI_BUILD_IN_BOOT
2045 hi_u32 capability = 0;
2046
2047 if (hw_node == HI_NULL) {
2048 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2049 return HI_ERR_TDE_NULL_PTR;
2050 }
2051 if (clip == HI_NULL) {
2052 tde_error("pClip is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2053 return HI_ERR_TDE_NULL_PTR;
2054 }
2055
2056 tde_hal_get_capability(&capability);
2057 if (!(capability & CLIP)) {
2058 tde_error("It deos not support Clip\n");
2059 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
2060 }
2061 hw_node->des_alpha.bits.des_crop_mode = 0;
2062 if (!clip->inside_clip) {
2063 /* over clip, CNcomment: Areas outside the clip */
2064 hw_node->des_alpha.bits.des_crop_mode = 1;
2065 }
2066 hw_node->des_alpha.bits.des_crop_en = 1;
2067 hw_node->des_crop_pos_st.bits.des_crop_start_x = clip->clip_start_x;
2068 hw_node->des_crop_pos_st.bits.des_crop_start_y = clip->clip_start_y;
2069 hw_node->des_crop_pos_ed.bits.des_crop_end_x = clip->clip_end_x;
2070 hw_node->des_crop_pos_ed.bits.des_crop_end_y = clip->clip_end_y;
2071 #endif
2072 return HI_SUCCESS;
2073 }
2074
2075 #if ((HICHIP != HI3516C_V500) && (HICHIP != HI3519A_V100))
tde_hal_calc_src1_set_zme(tde_hw_node * node,hi_tde_color_fmt in_fmt,hi_tde_rect * in_rect,hi_tde_rect * out_rect)2076 static hi_s32 tde_hal_calc_src1_set_zme(tde_hw_node *node, hi_tde_color_fmt in_fmt,
2077 hi_tde_rect *in_rect, hi_tde_rect *out_rect)
2078 {
2079 tde_color_fmt in_drv_fmt;
2080 if (in_rect == HI_NULL) {
2081 tde_error("pInRect is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2082 return HI_FAILURE;
2083 }
2084
2085 if (out_rect == HI_NULL) {
2086 tde_error("pOutRect is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2087 return HI_FAILURE;
2088 }
2089 if (in_fmt >= (HI_TDE_COLOR_FMT_MAX + 1)) {
2090 return HI_FAILURE;
2091 }
2092 in_drv_fmt = tde_get_common_drv_color_fmt((hi_u32)in_fmt);
2093
2094 node->src1_vsp.bits.zme_in_fmt = tde_hal_get_zme_in_fmt(in_drv_fmt);
2095
2096 node->src1_vsp.bits.zme_out_fmt = (node->src1_vsp.bits.zme_in_fmt == TDE_ZME_FMT_ARGB) ? TDE_ZME_FMT_ARGB :
2097 TDE_ZME_FMT_YUV444;
2098
2099 node->src1_imgsize.bits.src1_width = in_rect->width - 1;
2100 node->src1_zmeireso.bits.iw = in_rect->width - 1;
2101 node->src1_zmeoreso.bits.ow = out_rect->width - 1;
2102
2103 node->src1_imgsize.bits.src1_height = in_rect->height - 1;
2104 node->src1_zmeireso.bits.ih = in_rect->height - 1;
2105 node->src1_zmeoreso.bits.oh = out_rect->height - 1;
2106
2107 node->src1_hsp.bits.hratio = (out_rect->width <= 1) ? 0 : (osal_div_u64(((hi_u64)(in_rect->width) <<
2108 TDE_HAL_HSTEP_FLOATLEN), (out_rect->width)));
2109
2110 node->src1_vsr.bits.vratio = (out_rect->height <= 1) ? 0 : (osal_div_u64(((hi_u64)(in_rect->height) <<
2111 TDE_FLOAT_BITLEN), (out_rect->height)));
2112
2113 node->src1_hpzme_size.bits.src1_hpzme_width = in_rect->width;
2114 return HI_SUCCESS;
2115 }
2116
tde_hal_calc_src1_filter_opt(tde_hw_node * node,hi_tde_color_fmt in_fmt,hi_tde_rect * in_rect,hi_tde_rect * out_rect,hi_tde_deflicker_mode filter_mode)2117 hi_void tde_hal_calc_src1_filter_opt(tde_hw_node *node, hi_tde_color_fmt in_fmt,
2118 hi_tde_rect *in_rect, hi_tde_rect *out_rect, hi_tde_deflicker_mode filter_mode)
2119 {
2120 tde_filtermode flt_mode = {0};
2121 hi_s32 ret = tde_hal_calc_src1_set_zme(node, in_fmt, in_rect, out_rect);
2122 if (ret != HI_SUCCESS) {
2123 return;
2124 }
2125 if ((out_rect->width * 16) <= in_rect->width) { /* 16 width */
2126 node->src1_hpzme.bits.src1_hpzme_en = 1;
2127
2128 node->src1_hpzme.bits.src1_hpzme_mode = tde_hal_get_hpzme_mode(out_rect->width, in_rect->width);
2129
2130 node->src1_hpzme_size.bits.src1_hpzme_width = in_rect->width / (node->src1_hpzme.bits.src1_hpzme_mode + 1) +
2131 ((in_rect->width % (node->src1_hpzme.bits.src1_hpzme_mode + 1)) ? 1 : 0);
2132 }
2133
2134 node->src1_hsp.bits.hchmsc_en = 1;
2135 node->src1_hsp.bits.hlmsc_en = 1;
2136
2137 tde_hal_get_filter_mode(filter_mode, &flt_mode);
2138
2139 if (node->src1_hsp.bits.hratio != NO_HSCALE_STEP) {
2140 hi_u64 hf_coef_addr;
2141 node->src1_hsp.bits.hfir_order = 0;
2142
2143 node->src1_hsp.bits.hafir_en = flt_mode.alpha_en;
2144 node->src1_hsp.bits.hlfir_en = flt_mode.luma_en;
2145 node->src1_hsp.bits.hchfir_en = flt_mode.chrome_en;
2146
2147 hf_coef_addr = g_para_table.hf_coef_addr + tde_hal_get_resize_para_htable(node->src1_hsp.bits.hratio) *
2148 TDE_PARA_HTABLE_SIZE;
2149
2150 node->tde_src1_zme_chaddr_low = GetLowAddr(hf_coef_addr);
2151 node->tde_src1_zme_chaddr_high = GetHighAddr(hf_coef_addr);
2152
2153 node->tde_src1_zme_lhaddr_low = node->tde_src1_zme_chaddr_low;
2154 node->tde_src1_zme_lhaddr_high = node->tde_src1_zme_chaddr_high;
2155 }
2156
2157 node->src1_vsp.bits.vchmsc_en = 1;
2158 node->src1_vsp.bits.vlmsc_en = 1;
2159
2160 if (node->src1_vsr.bits.vratio != NO_VSCALE_STEP) {
2161 hi_u64 vf_coef_addr;
2162 node->src1_vsp.bits.vafir_en = flt_mode.alpha_en;
2163 node->src1_vsp.bits.vlfir_en = flt_mode.luma_en;
2164 node->src1_vsp.bits.vchfir_en = flt_mode.chrome_en;
2165
2166 vf_coef_addr = g_para_table.vf_coef_addr + tde_hal_get_resize_para_vtable(node->src1_vsr.bits.vratio) *
2167 TDE_PARA_VTABLE_SIZE;
2168
2169 node->tde_src1_zme_cvaddr_low = GetLowAddr(vf_coef_addr);
2170 node->tde_src1_zme_cvaddr_high = GetHighAddr(vf_coef_addr);
2171
2172 node->tde_src1_zme_lvaddr_low = node->tde_src1_zme_cvaddr_low;
2173 node->tde_src1_zme_lvaddr_high = node->tde_src1_zme_cvaddr_high;
2174 }
2175
2176 node->src1_zmeireso.bits.iw = node->src1_hpzme_size.bits.src1_hpzme_width - 1;
2177
2178 node->src1_hpzme_size.bits.src1_hpzme_width = node->src1_hpzme_size.bits.src1_hpzme_width - 1;
2179 return;
2180 }
2181 #endif
2182
tde_hal_calc_src2_filter_opt_chesk(tde_hw_node * node,tde_rect_opt * rect_opt)2183 static hi_s32 tde_hal_calc_src2_filter_opt_chesk(tde_hw_node *node, tde_rect_opt *rect_opt)
2184 {
2185 if (node == HI_NULL) {
2186 tde_error("pNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2187 return HI_ERR_TDE_NULL_PTR;
2188 }
2189 if (rect_opt->in_rect == HI_NULL) {
2190 tde_error("rect_opt->pInRect is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2191 return HI_ERR_TDE_NULL_PTR;
2192 }
2193 if (rect_opt->out_rect == HI_NULL) {
2194 tde_error("rect_opt->pOutRect is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2195 return HI_ERR_TDE_NULL_PTR;
2196 }
2197 if (rect_opt->in_fmt >= (HI_TDE_COLOR_FMT_MAX + 1)) {
2198 return HI_ERR_TDE_INVALID_PARA;
2199 }
2200 return HI_SUCCESS;
2201 }
2202
tde_hal_set_zme_in_limit(tde_hw_node * node,tde_rect_opt * rect_opt)2203 hi_s32 tde_hal_set_zme_in_limit(tde_hw_node *node, tde_rect_opt *rect_opt)
2204 {
2205 hi_s32 ver_scale_coeff = 1;
2206 hi_s32 ret;
2207 if ((rect_opt->out_rect->width * 16) <= rect_opt->in_rect->width) { /* 16 2^4 alg data */
2208 node->src2_hpzme.bits.src2_hpzme_en = 1;
2209 node->src2_hpzme.bits.src2_hpzme_mode = tde_hal_get_hpzme_mode(rect_opt->out_rect->width,
2210 rect_opt->in_rect->width);
2211 if ((node->src2_hpzme.bits.src2_hpzme_mode + 1) == 0) {
2212 return HI_ERR_TDE_INVALID_PARA;
2213 }
2214 node->src2_hpzme_size.bits.src2_hpzme_width =
2215 rect_opt->in_rect->width / (node->src2_hpzme.bits.src2_hpzme_mode + 1) +
2216 ((rect_opt->in_rect->width % (node->src2_hpzme.bits.src2_hpzme_mode + 1)) ? 1 : 0);
2217 node->src2_hsp.bits.hratio = (rect_opt->out_rect->width <= 1) ? 0 :
2218 (osal_div_u64(((hi_u64)(node->src2_hpzme_size.bits.src2_hpzme_width) <<
2219 TDE_HAL_HSTEP_FLOATLEN), (rect_opt->out_rect->width)));
2220 }
2221
2222 if ((rect_opt->out_rect->height * 16) <= rect_opt->in_rect->height) { /* 16 2^4 alg data */
2223 ret = tde_hal_get_ver_scale_coeff(rect_opt->out_rect->height, rect_opt->in_rect->height, &ver_scale_coeff);
2224 if (ret != HI_SUCCESS) {
2225 return ret;
2226 }
2227 if (ver_scale_coeff == 0) {
2228 return HI_ERR_TDE_INVALID_PARA;
2229 }
2230 node->src2_zmeireso.bits.ih = rect_opt->in_rect->height / ver_scale_coeff - 1;
2231 node->src2_imgsize.bits.src2_height = rect_opt->in_rect->height / ver_scale_coeff - 1;
2232 node->src2_ch0_stride.bits.src2_ch0_stride = node->src2_ch0_stride.bits.src2_ch0_stride * ver_scale_coeff;
2233 if (rect_opt->out_rect->height == 0) {
2234 return HI_ERR_TDE_INVALID_PARA;
2235 }
2236 node->src2_vsr.bits.vratio = osal_div_u64(((hi_u64)(node->src2_imgsize.bits.src2_height) << TDE_FLOAT_BITLEN),
2237 (rect_opt->out_rect->height));
2238 } else {
2239 if (rect_opt->out_rect->height == 0) {
2240 return HI_ERR_TDE_INVALID_PARA;
2241 }
2242 node->src2_vsr.bits.vratio = (rect_opt->out_rect->height <= 1) ? 0 :
2243 (osal_div_u64(((hi_u64)(rect_opt->in_rect->height) << TDE_FLOAT_BITLEN), (rect_opt->out_rect->height)));
2244 }
2245 return HI_SUCCESS;
2246 }
2247
tde_hal_set_zme(tde_hw_node * node,tde_rect_opt * rect_opt,hi_tde_deflicker_mode filter_mode,hi_bool defilicker)2248 hi_void tde_hal_set_zme(tde_hw_node *node, tde_rect_opt *rect_opt, hi_tde_deflicker_mode filter_mode,
2249 hi_bool defilicker)
2250 {
2251 tde_filtermode flt_mode = {0};
2252 hi_u64 ch_coef_addr;
2253 hi_u64 cv_coef_addr;
2254
2255 node->src2_hsp.bits.hchmsc_en = 1;
2256 node->src2_hsp.bits.hlmsc_en = 1;
2257
2258 tde_hal_get_filter_mode(filter_mode, &flt_mode);
2259
2260 if (node->src2_hsp.bits.hratio != NO_HSCALE_STEP) {
2261 #if ((HICHIP == HI3516C_V500) || (HICHIP == HI3519A_V100))
2262 if (rect_opt->out_rect->width > MAX_LINE_BUFFER) {
2263 node->src2_hsp.bits.hfir_order = 1;
2264 }
2265 #else
2266 hi_unused(rect_opt);
2267 #endif
2268 if (node->src2_vsp.bits.zme_in_fmt == TDE_ZME_FMT_ARGB) {
2269 node->src2_hsp.bits.hlfir_en = flt_mode.alpha_en;
2270 } else {
2271 node->src2_hsp.bits.hlfir_en = flt_mode.luma_en;
2272 }
2273 node->src2_hsp.bits.hafir_en = flt_mode.alpha_en;
2274 node->src2_hsp.bits.hchfir_en = flt_mode.chrome_en;
2275 ch_coef_addr = g_para_table.hf_coef_addr + tde_hal_get_resize_para_htable(node->src2_hsp.bits.hratio) *
2276 TDE_PARA_HTABLE_SIZE;
2277
2278 node->tde_src2_zme_chaddr_low = GetLowAddr(ch_coef_addr);
2279 node->tde_src2_zme_chaddr_high = GetHighAddr(ch_coef_addr);
2280
2281 node->tde_src2_zme_lhaddr_low = node->tde_src2_zme_chaddr_low;
2282 node->tde_src2_zme_lhaddr_high = node->tde_src2_zme_chaddr_high;
2283 }
2284
2285 node->src2_vsp.bits.vchmsc_en = 1;
2286 node->src2_vsp.bits.vlmsc_en = 1;
2287
2288 if ((node->src2_vsr.bits.vratio != NO_VSCALE_STEP) && (!defilicker)) {
2289 node->src2_vsp.bits.vafir_en = flt_mode.alpha_en;
2290 if (node->src2_vsp.bits.zme_in_fmt == TDE_ZME_FMT_ARGB) {
2291 node->src2_vsp.bits.vlfir_en = flt_mode.alpha_en;
2292 } else {
2293 node->src2_vsp.bits.vlfir_en = flt_mode.luma_en;
2294 }
2295 node->src2_vsp.bits.vchfir_en = flt_mode.chrome_en;
2296
2297 cv_coef_addr = g_para_table.vf_coef_addr + tde_hal_get_resize_para_vtable(node->src2_vsr.bits.vratio) *
2298 TDE_PARA_VTABLE_SIZE;
2299 node->tde_src2_zme_cvaddr_low = GetLowAddr(cv_coef_addr);
2300 node->tde_src2_zme_cvaddr_high = GetHighAddr(cv_coef_addr);
2301
2302 node->tde_src2_zme_lvaddr_low = node->tde_src2_zme_cvaddr_low;
2303 node->tde_src2_zme_lvaddr_high = node->tde_src2_zme_cvaddr_high;
2304 }
2305 }
2306
2307 #ifndef HI_BUILD_IN_BOOT
2308 #if (TDE_CAPABILITY & DEFLICKER)
tde_hal_set_defilicker(tde_hw_node * node)2309 static hi_void tde_hal_set_defilicker(tde_hw_node *node)
2310 {
2311 hi_u64 cv_deflicker_coef_addr;
2312
2313 node->src2_vsp.bits.vchmsc_en = 1;
2314 node->src2_vsp.bits.vlmsc_en = 1;
2315 node->src2_vsp.bits.vafir_en = 1;
2316 node->src2_vsp.bits.vlfir_en = 1;
2317 node->src2_vsp.bits.vchfir_en = 1;
2318
2319 cv_deflicker_coef_addr = g_para_table.deflicker_vf_coef_addr +
2320 tde_hal_get_resize_para_vtable(node->src2_vsr.bits.vratio) * TDE_PARA_VTABLE_SIZE;
2321
2322 node->tde_src2_zme_cvaddr_low = GetLowAddr(cv_deflicker_coef_addr);
2323 node->tde_src2_zme_cvaddr_high = GetHighAddr(cv_deflicker_coef_addr);
2324
2325 node->tde_src2_zme_lvaddr_low = node->tde_src2_zme_cvaddr_low;
2326 node->tde_src2_zme_lvaddr_high = node->tde_src2_zme_cvaddr_high;
2327 }
2328 #endif
2329 #endif
2330
tde_hal_calc_src2_filter_opt(tde_hw_node * node,tde_rect_opt * rect_opt,hi_bool defilicker,hi_tde_deflicker_mode filter_mode)2331 hi_s32 tde_hal_calc_src2_filter_opt(tde_hw_node *node, tde_rect_opt *rect_opt, hi_bool defilicker,
2332 hi_tde_deflicker_mode filter_mode)
2333 {
2334 tde_color_fmt in_drv_fmt;
2335 hi_s32 ret;
2336
2337 ret = tde_hal_calc_src2_filter_opt_chesk(node, rect_opt);
2338 if (ret != HI_SUCCESS) {
2339 return ret;
2340 }
2341 in_drv_fmt = tde_get_common_drv_color_fmt((hi_u32)rect_opt->in_fmt);
2342
2343 node->src2_vsp.bits.zme_in_fmt = tde_hal_get_zme_in_fmt(in_drv_fmt);
2344
2345 node->src2_vsp.bits.zme_out_fmt = (node->src2_vsp.bits.zme_in_fmt == TDE_ZME_FMT_ARGB) ? TDE_ZME_FMT_ARGB :
2346 TDE_ZME_FMT_YUV444;
2347
2348 node->src2_imgsize.bits.src2_width = rect_opt->in_rect->width - 1;
2349 node->src2_zmeireso.bits.iw = rect_opt->in_rect->width - 1;
2350 node->src2_zmeoreso.bits.ow = rect_opt->out_rect->width - 1;
2351 node->src2_zmeoreso.bits.oh = rect_opt->out_rect->height - 1;
2352 node->src2_imgsize.bits.src2_height = rect_opt->in_rect->height - 1;
2353 node->src2_zmeireso.bits.ih = rect_opt->in_rect->height - 1;
2354
2355 node->des_imgsize.bits.des_width = rect_opt->out_rect->width - 1;
2356 node->des_imgsize.bits.des_height = rect_opt->out_rect->height - 1;
2357
2358 node->src2_hsp.bits.hratio = (rect_opt->out_rect->width <= 1) ? 0 :
2359 (osal_div_u64(((hi_u64)(rect_opt->in_rect->width) << TDE_HAL_HSTEP_FLOATLEN), (rect_opt->out_rect->width)));
2360
2361 node->src2_hpzme_size.bits.src2_hpzme_width = rect_opt->in_rect->width;
2362
2363 ret = tde_hal_set_zme_in_limit(node, rect_opt);
2364 if (ret != HI_SUCCESS) {
2365 return ret;
2366 }
2367 tde_hal_set_zme(node, rect_opt, filter_mode, defilicker);
2368
2369 #ifndef HI_BUILD_IN_BOOT
2370 #if (TDE_CAPABILITY & DEFLICKER)
2371 if (defilicker) {
2372 tde_hal_set_defilicker(node);
2373 }
2374 #endif
2375 #endif
2376
2377 node->src2_zmeireso.bits.iw = node->src2_hpzme_size.bits.src2_hpzme_width - 1;
2378
2379 node->src2_hpzme_size.bits.src2_hpzme_width = node->src2_hpzme_size.bits.src2_hpzme_width - 1;
2380
2381 return HI_SUCCESS;
2382 }
2383
tde_hal_get_zme_in_fmt(tde_color_fmt in_drv_fmt)2384 static hi_u32 tde_hal_get_zme_in_fmt(tde_color_fmt in_drv_fmt)
2385 {
2386 hi_u32 zme_in_fmt = 0;
2387
2388 hi_bool fmt_argb = (in_drv_fmt <= TDE_DRV_COLOR_FMT_ACLUT88) || ((in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR444MB)) ||
2389 (in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR400MBP);
2390 hi_bool fmt_yuv422 = (in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR422MBH) || (in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR422);
2391 hi_bool fmt_yuv420 = (in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR420MB) || (in_drv_fmt == TDE_DRV_COLOR_FMT_YCBCR422MBV);
2392
2393 if (fmt_argb) {
2394 zme_in_fmt = TDE_ZME_FMT_ARGB;
2395 }
2396
2397 if (fmt_yuv422) {
2398 zme_in_fmt = TDE_ZME_FMT_YUV422;
2399 }
2400
2401 if (fmt_yuv420) {
2402 zme_in_fmt = TDE_ZME_FMT_YUV420;
2403 }
2404
2405 return zme_in_fmt;
2406 }
2407
tde_hal_get_hpzme_mode(hi_u32 out_rect_width,hi_u32 in_rect_width)2408 static hi_u32 tde_hal_get_hpzme_mode(hi_u32 out_rect_width, hi_u32 in_rect_width)
2409 {
2410 hi_u32 hpzme_mode;
2411
2412 if ((out_rect_width * 32) > in_rect_width) { /* 32 out ram */
2413 hpzme_mode = 1;
2414 } else if ((out_rect_width * 64) > in_rect_width) { /* 64 out ram */
2415 hpzme_mode = 3; /* 3 hpzme mode */
2416 } else if ((out_rect_width * 128) > in_rect_width) { /* 128 out ram */
2417 hpzme_mode = 7; /* 7 hpzme mode */
2418 } else {
2419 hpzme_mode = 15; /* 15 hpzme mode */
2420 }
2421
2422 return hpzme_mode;
2423 }
2424
tde_hal_get_filter_mode(hi_tde_filter_mode filter_mode,tde_filtermode * flt_mode)2425 static hi_void tde_hal_get_filter_mode(hi_tde_filter_mode filter_mode, tde_filtermode *flt_mode)
2426 {
2427 hi_bool filter_mode_color = (filter_mode == HI_TDE_FILTER_MODE_COLOR);
2428 hi_bool filter_mode_alpha = (filter_mode == HI_TDE_FILTER_MODE_ALPHA);
2429 hi_bool filter_mode_both = (filter_mode == HI_TDE_FILTER_MODE_BOTH);
2430 hi_u32 alpha_en;
2431 hi_u32 luma_en;
2432 hi_u32 chrome_en;
2433
2434 if (filter_mode_color) {
2435 chrome_en = 1;
2436 luma_en = 1;
2437 alpha_en = 0;
2438 } else if (filter_mode_alpha) {
2439 chrome_en = 0;
2440 luma_en = 0;
2441 alpha_en = 1;
2442 } else if (filter_mode_both) {
2443 chrome_en = 1;
2444 luma_en = 1;
2445 alpha_en = 1;
2446 } else {
2447 chrome_en = 0;
2448 luma_en = 0;
2449 alpha_en = 0;
2450 }
2451 flt_mode->alpha_en = alpha_en;
2452 flt_mode->luma_en = luma_en;
2453 flt_mode->chrome_en = chrome_en;
2454
2455 return;
2456 }
2457
tde_hal_get_ver_scale_coeff(hi_u32 out_rect_height,hi_u32 in_rect_height,hi_s32 * ver_scale_coeff)2458 static hi_s32 tde_hal_get_ver_scale_coeff(hi_u32 out_rect_height, hi_u32 in_rect_height, hi_s32 *ver_scale_coeff)
2459 {
2460 if ((out_rect_height * 32) >= in_rect_height) { /* 32 out ram */
2461 *ver_scale_coeff = 2; /* 2 ver scale coeff data */
2462 } else if ((out_rect_height * 64) >= in_rect_height) { /* 64 out ram */
2463 *ver_scale_coeff = 4; /* 4 ver scale coeff data */
2464 } else if ((out_rect_height * 128) >= in_rect_height) { /* 128 out ram */
2465 *ver_scale_coeff = 8; /* 8 ver scale coeff data */
2466 } else {
2467 tde_error("Invalid para input!\n");
2468 return HI_ERR_TDE_INVALID_PARA;
2469 }
2470
2471 return HI_SUCCESS;
2472 }
2473
tde_hal_node_set_color_cvt_in_rgb2yuv(tde_hw_node * hw_node)2474 static hi_void tde_hal_node_set_color_cvt_in_rgb2yuv(tde_hw_node *hw_node)
2475 {
2476 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2477 hw_node->src1_csc_idc0.bits.cscidc0 = 0;
2478 hw_node->src1_csc_idc0.bits.cscidc1 = 0;
2479 hw_node->src1_csc_idc1.bits.cscidc2 = 0;
2480 hw_node->src1_csc_odc0.bits.cscodc0 = 128 * 4; /* 4 * 128 cscodc0 */
2481 hw_node->src1_csc_odc0.bits.cscodc1 = 128 * 4; /* 4 * 128 cscodc1 */
2482 hw_node->src1_csc_odc1.bits.cscodc2 = 16 * 4; /* 4 * 16 cscodc2 */
2483 #else
2484 hw_node->src1_csc_idc.bits.cscidc0 = 0;
2485 hw_node->src1_csc_idc.bits.cscidc1 = 0;
2486 hw_node->src1_csc_idc.bits.cscidc2 = 0;
2487 hw_node->src1_csc_odc.bits.cscodc0 = 128; /* 128 cscodc0 */
2488 hw_node->src1_csc_odc.bits.cscodc1 = 128; /* 128 cscodc1 */
2489 hw_node->src1_csc_odc.bits.cscodc2 = 16; /* 16 cscodc2 */
2490 #endif
2491
2492 hw_node->src1_csc_p0.bits.cscp00 = 66 * 4; /* 4 * 66 cscp00 */
2493 hw_node->src1_csc_p0.bits.cscp01 = 129 * 4; /* 4 * 129 cscp01 data */
2494
2495 hw_node->src1_csc_p1.bits.cscp02 = 25 * 4; /* 4 * 25 cscp02 */
2496 hw_node->src1_csc_p1.bits.cscp10 = -38 * 4; /* 4 * -38 cscp10 data */
2497
2498 hw_node->src1_csc_p2.bits.cscp11 = -74 * 4; /* 4 * -74 cscp11 data */
2499 hw_node->src1_csc_p2.bits.cscp12 = 112 * 4; /* 112 * 4 cscp12 data */
2500
2501 hw_node->src1_csc_p3.bits.cscp20 = 112 * 4; /* 4 * 112 cscp20 data */
2502 hw_node->src1_csc_p3.bits.cscp21 = -94 * 4; /* 4 * -94 cscp21 data */
2503
2504 hw_node->src1_csc_p4.bits.cscp22 = -18 * 4; /* 4 * -18 cscp22 data */
2505 }
2506
tde_hal_node_set_color_cvt_in_yuv2rgb(tde_hw_node * hw_node)2507 static hi_void tde_hal_node_set_color_cvt_in_yuv2rgb(tde_hw_node *hw_node)
2508 {
2509 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2510 hw_node->src1_csc_idc0.bits.cscidc0 = -128 * 4; /* 4 * -128 cscidc0 data */
2511 hw_node->src1_csc_idc0.bits.cscidc1 = -128 * 4; /* 4 * -128 cscidc1 data */
2512 hw_node->src1_csc_idc1.bits.cscidc2 = -16 * 4; /* 4 * -16 cscidc2 data */
2513 hw_node->src1_csc_odc0.bits.cscodc0 = 0;
2514 hw_node->src1_csc_odc0.bits.cscodc1 = 0;
2515 hw_node->src1_csc_odc1.bits.cscodc2 = 0;
2516 #else
2517 hw_node->src1_csc_idc.bits.cscidc0 = -128; /* -128 cscidc0 data */
2518 hw_node->src1_csc_idc.bits.cscidc1 = -128; /* -128 cscidc1 data */
2519 hw_node->src1_csc_idc.bits.cscidc2 = -16; /* -16 cscidc2 data */
2520 hw_node->src1_csc_odc.bits.cscodc0 = 0;
2521 hw_node->src1_csc_odc.bits.cscodc1 = 0;
2522 hw_node->src1_csc_odc.bits.cscodc2 = 0;
2523 #endif
2524
2525 hw_node->src1_csc_p0.bits.cscp00 = 297 * 4; /* 4 * 297 cscp00 data */
2526 hw_node->src1_csc_p0.bits.cscp01 = 0;
2527
2528 hw_node->src1_csc_p1.bits.cscp02 = 408 * 4; /* 4 * 408 cscp02 data */
2529 hw_node->src1_csc_p1.bits.cscp10 = 297 * 4; /* 4 * 297 cscp10 data */
2530
2531 hw_node->src1_csc_p2.bits.cscp11 = -100 * 4; /* 4 * -100 cscp11 data */
2532 hw_node->src1_csc_p2.bits.cscp12 = -208 * 4; /* 4 * -208 cscp12 data */
2533
2534 hw_node->src1_csc_p3.bits.cscp20 = 297 * 4; /* 4 * 297 cscp20 data */
2535 hw_node->src1_csc_p3.bits.cscp21 = 516 * 4; /* 4 * 516 cscp21 data */
2536
2537 hw_node->src1_csc_p4.bits.cscp22 = 0;
2538 }
2539
tde_hal_node_set_color_cvt_out_rgb2yuv(tde_hw_node * hw_node)2540 static hi_void tde_hal_node_set_color_cvt_out_rgb2yuv(tde_hw_node *hw_node)
2541 {
2542 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2543 hw_node->des_csc_idc0.bits.cscidc0 = -128 * 4; /* 4 * -128 cscidc0 data */
2544 hw_node->des_csc_idc0.bits.cscidc1 = -128 * 4; /* 4 * -128 cscidc1 data */
2545 hw_node->des_csc_idc1.bits.cscidc2 = -16 * 4; /* 4 * -16 cscidc2 data */
2546 hw_node->des_csc_odc0.bits.cscodc0 = 0;
2547 hw_node->des_csc_odc0.bits.cscodc1 = 0;
2548 hw_node->des_csc_odc1.bits.cscodc2 = 0;
2549 #else
2550 hw_node->des_csc_idc.bits.cscidc0 = -128; /* -128 cscidc0 data */
2551 hw_node->des_csc_idc.bits.cscidc1 = -128; /* -128 cscidc1 data */
2552 hw_node->des_csc_idc.bits.cscidc2 = -16; /* -16 cscidc2 data */
2553 hw_node->des_csc_odc.bits.cscodc0 = 0;
2554 hw_node->des_csc_odc.bits.cscodc1 = 0;
2555 hw_node->des_csc_odc.bits.cscodc2 = 0;
2556 #endif
2557
2558 hw_node->des_csc_p0.bits.cscp00 = 297 * 4; /* 4 * 297 cscp00 data */
2559 hw_node->des_csc_p0.bits.cscp01 = 0;
2560
2561 hw_node->des_csc_p1.bits.cscp02 = 408 * 4; /* 4 * 408 cscp02 data */
2562 hw_node->des_csc_p1.bits.cscp10 = 297 * 4; /* 4 * 297 cscp10 data */
2563
2564 hw_node->des_csc_p2.bits.cscp11 = -100 * 4; /* 4 * -100 cscp11 data */
2565 hw_node->des_csc_p2.bits.cscp12 = -208 * 4; /* 4 * -208 cscp12 data */
2566
2567 hw_node->des_csc_p3.bits.cscp20 = 297 * 4; /* 4 * 297 cscp20 data */
2568 hw_node->des_csc_p3.bits.cscp21 = 516 * 4; /* 4 * 516 cscp21 data */
2569 hw_node->des_csc_p4.bits.cscp22 = 0;
2570 }
2571
tde_hal_node_set_color_cvt_out_yuv2rgb(tde_hw_node * hw_node)2572 static hi_void tde_hal_node_set_color_cvt_out_yuv2rgb(tde_hw_node *hw_node)
2573 {
2574 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2575 hw_node->des_csc_idc0.bits.cscidc0 = 0;
2576 hw_node->des_csc_idc0.bits.cscidc1 = 0;
2577 hw_node->des_csc_idc1.bits.cscidc2 = 0;
2578 hw_node->des_csc_odc0.bits.cscodc0 = 128 * 4; /* 4 * 128 cscodc0 data */
2579 hw_node->des_csc_odc0.bits.cscodc1 = 128 * 4; /* 4 * 128 cscodc1 data */
2580 hw_node->des_csc_odc1.bits.cscodc2 = 16 * 4; /* 4 * 16 cscodc2 data */
2581 #else
2582 hw_node->des_csc_idc.bits.cscidc0 = 0;
2583 hw_node->des_csc_idc.bits.cscidc1 = 0;
2584 hw_node->des_csc_idc.bits.cscidc2 = 0;
2585 hw_node->des_csc_odc.bits.cscodc0 = 128; /* 128 cscodc0 data */
2586 hw_node->des_csc_odc.bits.cscodc1 = 128; /* 128 cscodc1 data */
2587 hw_node->des_csc_odc.bits.cscodc2 = 16; /* 16 cscodc2 data */
2588 #endif
2589
2590 hw_node->des_csc_p0.bits.cscp00 = 66 * 4; /* 4 * 66 cscp00 data */
2591 hw_node->des_csc_p0.bits.cscp01 = 129 * 4; /* 4 * 129 cscp01 data */
2592
2593 hw_node->des_csc_p1.bits.cscp02 = 25 * 4; /* 4 * 25 cscp02 data */
2594 hw_node->des_csc_p1.bits.cscp10 = -38 * 4; /* 4 * -38 cscp10 data */
2595
2596 hw_node->des_csc_p2.bits.cscp11 = -74 * 4; /* 4 * -74 cscp11 data */
2597
2598 hw_node->des_csc_p2.bits.cscp12 = 112 * 4; /* 4 * 112 cscp12 data */
2599
2600 hw_node->des_csc_p3.bits.cscp20 = 112 * 4; /* 4 * 112 cscp20 data */
2601
2602 hw_node->des_csc_p3.bits.cscp21 = -94 * 4; /* 4 * -94 cscp21 data */
2603 hw_node->des_csc_p4.bits.cscp22 = -18 * 4; /* 4 * -18 cscp22 data */
2604 }
2605
2606 /*
2607 * Function: tde_hal_node_set_color_convert
2608 * Description: set parameter for color space change
2609 * Input: hw_node:pointer of node
2610 * conv: parameter of color space change
2611 */
tde_hal_node_set_color_convert(tde_hw_node * hw_node,tde_conv_mode_cmd * conv)2612 hi_s32 tde_hal_node_set_color_convert(tde_hw_node *hw_node, tde_conv_mode_cmd *conv)
2613 {
2614 hi_u32 capability = 0;
2615 if (hw_node == HI_NULL) {
2616 tde_error("pHWNode is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2617 return HI_ERR_TDE_NULL_PTR;
2618 }
2619 if (conv == HI_NULL) {
2620 tde_error("pConv is null %s(line=%d)\n", __FUNCTION__, __LINE__);
2621 return HI_ERR_TDE_NULL_PTR;
2622 }
2623 tde_hal_get_capability(&capability);
2624 if (!(capability & CSCCOVERT)) {
2625 tde_error("It deos not support CSCCovert\n");
2626 return HI_ERR_TDE_UNSUPPORTED_OPERATION;
2627 }
2628
2629 if (conv->in_conv) {
2630 hw_node->src2_csc_mux.bits.src2_csc_mode = 1 - (hi_u32)conv->in_src1_conv;
2631 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2632 hw_node->src1_csc_idc0.bits.csc_en = 1;
2633 hw_node->src1_dither_ctrl.bits.dither_en = 1;
2634 hw_node->src1_dither_ctrl.bits.dither_round = 0;
2635 #else
2636 hw_node->src1_csc_idc.bits.csc_en = 1;
2637 #endif
2638 if (conv->in_rgb2_yc) {
2639 tde_hal_node_set_color_cvt_in_rgb2yuv(hw_node);
2640 } else {
2641 tde_hal_node_set_color_cvt_in_yuv2rgb(hw_node);
2642 }
2643 }
2644
2645 if (conv->out_conv) {
2646 hw_node->src2_csc_mux.bits.src2_csc_mode = 1 - (hi_u32)conv->in_src1_conv;
2647 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
2648 hw_node->des_csc_idc0.bits.csc_en = 1;
2649 hw_node->dst_dither_ctrl.bits.dither_en = 1;
2650 hw_node->dst_dither_ctrl.bits.dither_round = 0;
2651 #else
2652 hw_node->des_csc_idc.bits.csc_en = 1;
2653 #endif
2654 if (conv->in_rgb2_yc) {
2655 tde_hal_node_set_color_cvt_out_rgb2yuv(hw_node);
2656 } else {
2657 tde_hal_node_set_color_cvt_out_yuv2rgb(hw_node);
2658 }
2659 }
2660 return HI_SUCCESS;
2661 }
2662
tde_set_node_csc(tde_hw_node * hw_node,hi_tde_csc_opt csc_opt)2663 hi_s32 tde_set_node_csc(tde_hw_node *hw_node, hi_tde_csc_opt csc_opt)
2664 {
2665 hi_unused(hw_node);
2666 hi_unused(csc_opt);
2667 return HI_SUCCESS;
2668 }
2669
tde_hal_make_hf_coef(hi_void)2670 static hi_u32 *tde_hal_make_hf_coef(hi_void)
2671 {
2672 hi_u32 i;
2673 hi_u32 *hf_coef = HI_NULL;
2674
2675 hf_coef = (hi_u32 *)tde_malloc(TDE_PARA_HTABLE_SIZE * TDE_PARA_HTABLE_NUM);
2676 if (hf_coef == HI_NULL) {
2677 tde_error("Alloc horizontal coef failed!HCoef table size:%d\n", TDE_PARA_HTABLE_SIZE * TDE_PARA_HTABLE_NUM);
2678 return HI_NULL;
2679 }
2680
2681 for (i = 0; i < TDE_PARA_HTABLE_NUM; i++) {
2682 /* 4 size value */
2683 if (memcpy_s(hf_coef + i * (TDE_PARA_HTABLE_SIZE / 4), TDE_PARA_HTABLE_SIZE, g_tde_6x32_coef +
2684 i * (TDE_PARA_HTABLE_ORG_SIZE), (TDE_PARA_HTABLE_ORG_SIZE) * 4) != EOK) { /* 4 size */
2685 tde_error("%s:%d:memcpy_s failure\n", __FUNCTION__, __LINE__);
2686 tde_free(hf_coef);
2687 return HI_NULL;
2688 }
2689 }
2690
2691 #ifndef __RTOS__
2692 g_para_table.hf_coef_addr = wgetphy((hi_void *)hf_coef);
2693 #else
2694 g_para_table.hf_coef_addr = (hi_u64)(hi_uintptr_t)hf_coef;
2695 #endif
2696 return hf_coef;
2697 }
2698
tde_hal_make_vf_coef(hi_void)2699 static hi_u32 *tde_hal_make_vf_coef(hi_void)
2700 {
2701 hi_u32 i;
2702 hi_u32 *vf_coef = HI_NULL;
2703
2704 vf_coef = (hi_u32 *)tde_malloc(TDE_PARA_VTABLE_SIZE * TDE_PARA_VTABLE_NUM);
2705 if (vf_coef == HI_NULL) {
2706 tde_error("Alloc vertical coef failed!VfCoef table size:%d\n", TDE_PARA_VTABLE_SIZE * TDE_PARA_VTABLE_NUM);
2707 return HI_NULL;
2708 }
2709 /*
2710 * copy parameter according other offer way , CNcomment :According to the parameter table algorithm
2711 * group provides the structure of the copies
2712 */
2713 for (i = 0; i < TDE_PARA_VTABLE_NUM; i++) {
2714 if (memcpy_s(vf_coef + i * (TDE_PARA_VTABLE_SIZE / 4), TDE_PARA_VTABLE_SIZE, g_org_vf_coef + /* 4 size value */
2715 i * (TDE_PARA_VTABLE_ORG_SIZE), (TDE_PARA_VTABLE_ORG_SIZE) * 4) != EOK) { /* 4 size value */
2716 tde_error("secure function failure\n");
2717 tde_free(vf_coef);
2718 return HI_NULL;
2719 }
2720 }
2721
2722 #ifndef __RTOS__
2723 g_para_table.vf_coef_addr = wgetphy((hi_void *)vf_coef);
2724 #else
2725 g_para_table.vf_coef_addr = (hi_u64)(hi_uintptr_t)vf_coef;
2726 #endif
2727 return vf_coef;
2728 }
2729
2730 #ifndef HI_BUILD_IN_BOOT
2731 #if (TDE_CAPABILITY & DEFLICKER)
tde_hal_make_deflicker_vf_coef(hi_void)2732 static hi_u32 *tde_hal_make_deflicker_vf_coef(hi_void)
2733 {
2734 hi_u32 i;
2735 hi_u32 *deflicker_vf_coef = HI_NULL;
2736
2737 deflicker_vf_coef = (hi_u32 *)tde_malloc(TDE_PARA_VTABLE_SIZE * TDE_PARA_VTABLE_NUM);
2738 if (deflicker_vf_coef == HI_NULL) {
2739 tde_error("Alloc Deflicker vertical coef failed!g_deflicker_vf_coef table size:%d\n",
2740 TDE_PARA_VTABLE_SIZE * TDE_PARA_VTABLE_NUM);
2741 return HI_NULL;
2742 }
2743
2744 for (i = 0; i < TDE_PARA_VTABLE_NUM; i++) {
2745 /* 4 alg data */
2746 if (memcpy_s(deflicker_vf_coef + i * (TDE_PARA_VTABLE_SIZE / 4), TDE_PARA_VTABLE_SIZE, g_deflicker_vf_coef +
2747 i * (TDE_PARA_VTABLE_ORG_SIZE), (TDE_PARA_VTABLE_ORG_SIZE) * 4) != EOK) { /* 4 alg data */
2748 tde_error("secure function failure\n");
2749 tde_free(deflicker_vf_coef);
2750 return HI_NULL;
2751 }
2752 }
2753
2754 #ifndef __RTOS__
2755 g_para_table.deflicker_vf_coef_addr = wgetphy((hi_void *)deflicker_vf_coef);
2756 #else
2757 g_para_table.deflicker_vf_coef_addr = (hi_u32)deflicker_vf_coef;
2758 #endif
2759 return deflicker_vf_coef;
2760 }
2761 #endif
2762 #endif
2763
tde_hal_init_para_table(hi_void)2764 static hi_s32 tde_hal_init_para_table(hi_void)
2765 {
2766 hi_u32 *hf_coef = HI_NULL;
2767 hi_u32 *vf_coef = HI_NULL;
2768 #ifndef HI_BUILD_IN_BOOT
2769 #if (TDE_CAPABILITY & DEFLICKER)
2770 hi_u32 *deflicker_vf_coef = HI_NULL;
2771 #endif
2772 #endif
2773 (hi_void)memset_s(&g_para_table, sizeof(g_para_table), 0, sizeof(g_para_table));
2774 hf_coef = tde_hal_make_hf_coef();
2775 if (hf_coef == HI_NULL) {
2776 return HI_FAILURE;
2777 }
2778 vf_coef = tde_hal_make_vf_coef();
2779 if (vf_coef == HI_NULL) {
2780 tde_free(hf_coef);
2781 return HI_FAILURE;
2782 }
2783 #ifndef HI_BUILD_IN_BOOT
2784 #if (TDE_CAPABILITY & DEFLICKER)
2785 deflicker_vf_coef = tde_hal_make_deflicker_vf_coef();
2786 if (deflicker_vf_coef == HI_NULL) {
2787 tde_free(hf_coef);
2788 tde_free(vf_coef);
2789 return HI_FAILURE;
2790 }
2791 #endif
2792 #endif
2793 return HI_SUCCESS;
2794 }
2795
2796 /*
2797 * Function: tde_hal_cur_node
2798 * Description: get the node physics address that is suspended
2799 * Return: the address of current running node
2800 */
tde_hal_cur_node()2801 hi_u64 tde_hal_cur_node()
2802 {
2803 hi_u32 low_addr;
2804 hi_u32 hi_addr;
2805 hi_u64 addr;
2806
2807 low_addr = tde_read_reg(g_base_vir_addr, TDE_AQ_ADDR_LOW);
2808 hi_addr = tde_read_reg(g_base_vir_addr, TDE_AQ_ADDR_HI);
2809 addr = ((hi_u64)hi_addr << 32) | low_addr; /* 32 alg data */
2810 return addr;
2811 }
2812
2813 /*
2814 * Function: tde_hal_getbpp_by_fmt
2815 * Description: get bpp according color of driver
2816 * Input: fmt: color type
2817 * Output: pitch width
2818 * Return: -1: wrong format
2819 */
tde_hal_getbpp_by_fmt(tde_color_fmt fmt)2820 static hi_s32 tde_hal_getbpp_by_fmt(tde_color_fmt fmt)
2821 {
2822 if (tde_hal_getbpp_by_fmt16(fmt) == 16) { /* 16 fmt data */
2823 return 16; /* 16 fmt data */
2824 } else if (tde_hal_getbpp_by_fmt24(fmt) == 24) { /* 24 fmt data */
2825 return 24; /* 24 fmt data */
2826 } else if (tde_hal_getbpp_by_fmt32(fmt) == 32) { /* 32 fmt data */
2827 return 32; /* 32 fmt data */
2828 } else if (tde_hal_getbpp_by_fmt1(fmt) == 1) {
2829 return 1;
2830 } else if (tde_hal_getbpp_by_fmt2(fmt) == 2) { /* 2 fmt data */
2831 return 2; /* 2 fmt data */
2832 } else if (tde_hal_getbpp_by_fmt4(fmt) == 4) { /* 4 fmt data */
2833 return 4; /* 4 fmt data */
2834 } else if (tde_hal_getbpp_by_fmt8(fmt) == 8) { /* 8 fmt data */
2835 return 8; /* 8 fmt data */
2836 } else {
2837 return -1;
2838 }
2839 }
2840
tde_hal_getbpp_by_fmt16(tde_color_fmt fmt)2841 static hi_s32 tde_hal_getbpp_by_fmt16(tde_color_fmt fmt)
2842 {
2843 switch (fmt) {
2844 case TDE_DRV_COLOR_FMT_RGB444:
2845 case TDE_DRV_COLOR_FMT_RGB555:
2846 case TDE_DRV_COLOR_FMT_RGB565:
2847 case TDE_DRV_COLOR_FMT_ARGB4444:
2848 case TDE_DRV_COLOR_FMT_ARGB1555:
2849 case TDE_DRV_COLOR_FMT_ACLUT88:
2850 case TDE_DRV_COLOR_FMT_YCBCR422:
2851 case TDE_DRV_COLOR_FMT_HALFWORD:
2852 case TDE_DRV_COLOR_FMT_PKGVYUY:
2853 return 16; /* 16 fmt data */
2854
2855 default:
2856 return -1;
2857 }
2858 }
2859
tde_hal_getbpp_by_fmt24(tde_color_fmt fmt)2860 static hi_s32 tde_hal_getbpp_by_fmt24(tde_color_fmt fmt)
2861 {
2862 switch (fmt) {
2863 case TDE_DRV_COLOR_FMT_RGB888:
2864 case TDE_DRV_COLOR_FMT_ARGB8565:
2865 case TDE_DRV_COLOR_FMT_YCBCR888:
2866 return 24; /* 24 fmt data */
2867 default:
2868 return -1;
2869 }
2870 }
2871
tde_hal_getbpp_by_fmt32(tde_color_fmt fmt)2872 static hi_s32 tde_hal_getbpp_by_fmt32(tde_color_fmt fmt)
2873 {
2874 switch (fmt) {
2875 case TDE_DRV_COLOR_FMT_ARGB8888:
2876 case TDE_DRV_COLOR_FMT_AYCBCR8888:
2877 case TDE_DRV_COLOR_FMT_RABG8888:
2878 return 32; /* 32 fmt data */
2879 default:
2880 return -1;
2881 }
2882 }
2883
tde_hal_getbpp_by_fmt1(tde_color_fmt fmt)2884 static hi_s32 tde_hal_getbpp_by_fmt1(tde_color_fmt fmt)
2885 {
2886 switch (fmt) {
2887 case TDE_DRV_COLOR_FMT_CLUT1:
2888 case TDE_DRV_COLOR_FMT_A1:
2889 case TDE_DRV_COLOR_FMT_CLUT1B:
2890 case TDE_DRV_COLOR_FMT_A1B:
2891 return 1;
2892 default:
2893 return -1;
2894 }
2895 }
2896
tde_hal_getbpp_by_fmt2(tde_color_fmt fmt)2897 static hi_s32 tde_hal_getbpp_by_fmt2(tde_color_fmt fmt)
2898 {
2899 switch (fmt) {
2900 case TDE_DRV_COLOR_FMT_CLUT2:
2901 case TDE_DRV_COLOR_FMT_CLUT2B:
2902 return 2; /* 2 function return bpp */
2903 default:
2904 return -1; /* -1 return failure */
2905 }
2906 }
2907
tde_hal_getbpp_by_fmt4(tde_color_fmt fmt)2908 static hi_s32 tde_hal_getbpp_by_fmt4(tde_color_fmt fmt)
2909 {
2910 switch (fmt) {
2911 case TDE_DRV_COLOR_FMT_CLUT4:
2912 case TDE_DRV_COLOR_FMT_CLUT4B:
2913 return 4; /* 4 alg data */
2914 default:
2915 return -1;
2916 }
2917 }
2918
tde_hal_getbpp_by_fmt8(tde_color_fmt fmt)2919 static hi_s32 tde_hal_getbpp_by_fmt8(tde_color_fmt fmt)
2920 {
2921 switch (fmt) {
2922 case TDE_DRV_COLOR_FMT_CLUT8:
2923 case TDE_DRV_COLOR_FMT_ACLUT44:
2924 case TDE_DRV_COLOR_FMT_A8:
2925 case TDE_DRV_COLOR_FMT_BYTE:
2926 return 8; /* 8 fmt data */
2927 default:
2928 return -1;
2929 }
2930 }
2931
2932 /*
2933 * Function: tde_hal_get_resize_para_htable
2934 * Description: get index table according the step
2935 * Input: step: input step
2936 * Return: index table address
2937 */
tde_hal_get_resize_para_htable(hi_u32 step)2938 static hi_u32 tde_hal_get_resize_para_htable(hi_u32 step)
2939 {
2940 hi_u32 index;
2941
2942 if (step < TDE_RESIZE_8X32_AREA_0) {
2943 index = 0;
2944 } else if (step == TDE_RESIZE_8X32_AREA_0) {
2945 index = 1;
2946 } else if ((step > TDE_RESIZE_8X32_AREA_0) && (step <= TDE_RESIZE_8X32_AREA_1)) {
2947 index = 2; /* 2 ResizeParaHTable */
2948 } else if ((step > TDE_RESIZE_8X32_AREA_1) && (step <= TDE_RESIZE_8X32_AREA_2)) {
2949 index = 3; /* 3 ResizeParaHTable */
2950 } else if ((step > TDE_RESIZE_8X32_AREA_2) && (step <= TDE_RESIZE_8X32_AREA_3)) {
2951 index = 4; /* 4 ResizeParaHTable */
2952 } else if ((step > TDE_RESIZE_8X32_AREA_3) && (step <= TDE_RESIZE_8X32_AREA_4)) {
2953 index = 5; /* 5 ResizeParaHTable */
2954 } else {
2955 index = 6; /* 6 ResizeParaHTable */
2956 }
2957 return index;
2958 }
2959
2960 /*
2961 * Function: tde_hal_get_resize_para_vtable
2962 * Description: get table of parameter for resize
2963 * Input: step:input step
2964 * Return: address of table
2965 */
tde_hal_get_resize_para_vtable(hi_u32 step)2966 static hi_u32 tde_hal_get_resize_para_vtable(hi_u32 step)
2967 {
2968 hi_u32 index;
2969
2970 /* get index table according step, CNcomment: According to the step length to find index table */
2971 if (step < TDE_RESIZE_PARA_AREA_0) {
2972 index = 0;
2973 } else if (step == TDE_RESIZE_PARA_AREA_0) {
2974 index = 1;
2975 } else if ((step > TDE_RESIZE_PARA_AREA_0) && (step <= TDE_RESIZE_PARA_AREA_1)) {
2976 index = 2; /* 2 index resize */
2977 } else if ((step > TDE_RESIZE_PARA_AREA_1) && (step <= TDE_RESIZE_PARA_AREA_2)) {
2978 index = 3; /* 3 index resize */
2979 } else if ((step > TDE_RESIZE_PARA_AREA_2) && (step <= TDE_RESIZE_PARA_AREA_3)) {
2980 index = 4; /* 4 index resize */
2981 } else if ((step > TDE_RESIZE_PARA_AREA_3) && (step <= TDE_RESIZE_PARA_AREA_4)) {
2982 index = 5; /* 5 index resize */
2983 } else {
2984 index = 6; /* 6 index resize */
2985 }
2986 return index;
2987 }
2988
2989 /*
2990 * Function: tde_hal_init_queue
2991 * Description: Initialize Aq list,config the operation which is needed
2992 */
tde_hal_init_queue(hi_void)2993 static hi_void tde_hal_init_queue(hi_void)
2994 {
2995 /*
2996 * write 0 to Aq list start address register
2997 * CNcomment: 0 will be written Aq list first address register
2998 */
2999 tde_write_reg(g_base_vir_addr, TDE_AQ_NADDR_HI, 0);
3000 tde_write_reg(g_base_vir_addr, TDE_AQ_NADDR_LOW, 0);
3001 }
3002
3003 #ifndef HI_BUILD_IN_BOOT
3004 /*
3005 * Function: tde_hal_set_deflicer_level
3006 * Description: SetDeflicerLevel
3007 * Input: deflicker_level:anti-flicker levels including:auto,low,middle,high
3008 */
3009 #if (TDE_CAPABILITY & DEFLICKER)
tde_hal_set_deflicer_level(hi_tde_deflicker_level deflicker_level)3010 hi_s32 tde_hal_set_deflicer_level(hi_tde_deflicker_level deflicker_level)
3011 {
3012 g_deflicker_level = deflicker_level;
3013 return HI_SUCCESS;
3014 }
3015
tde_hal_get_deflicer_level(hi_tde_deflicker_level * deflicker_level)3016 hi_s32 tde_hal_get_deflicer_level(hi_tde_deflicker_level *deflicker_level)
3017 {
3018 *deflicker_level = g_deflicker_level;
3019 return HI_SUCCESS;
3020 }
3021 #endif
3022 #endif
3023
tde_hal_set_alpha_threshold(hi_u8 alpha_threshold_value)3024 hi_s32 tde_hal_set_alpha_threshold(hi_u8 alpha_threshold_value)
3025 {
3026 g_alpha_threshold_value = alpha_threshold_value;
3027
3028 return HI_SUCCESS;
3029 }
3030
3031 #ifndef HI_BUILD_IN_BOOT
tde_hal_get_alpha_threshold(hi_u8 * alpha_threshold_value)3032 hi_s32 tde_hal_get_alpha_threshold(hi_u8 *alpha_threshold_value)
3033 {
3034 *alpha_threshold_value = g_alpha_threshold_value;
3035
3036 return HI_SUCCESS;
3037 }
3038 #endif
3039
tde_hal_set_alpha_threshold_state(hi_bool alpha_threshold_en)3040 hi_s32 tde_hal_set_alpha_threshold_state(hi_bool alpha_threshold_en)
3041 {
3042 g_alpha_threshold = alpha_threshold_en;
3043
3044 return HI_SUCCESS;
3045 }
3046
3047 #ifndef HI_BUILD_IN_BOOT
tde_hal_get_alpha_threshold_state(hi_bool * alpha_threshold_en)3048 hi_s32 tde_hal_get_alpha_threshold_state(hi_bool *alpha_threshold_en)
3049 {
3050 *alpha_threshold_en = g_alpha_threshold;
3051
3052 return HI_SUCCESS;
3053 }
3054
3055 #ifdef CONFIG_HI_PROC_SHOW_SUPPORT
3056 /* see define of TDE_HWNode_S */
3057 hi_char *g_update[] = {
3058 "SRC1_CTRL ", /* 0x100 */
3059 "SRC1_CH0_ADDR_HIGH ", /* 0x104 */
3060 "SRC1_CH0_ADDR_LOW ", /* 0x108 */
3061 "SRC1_CH1_ADDR_HIGH ", /* 0x10c */
3062 "SRC1_CH1_ADDR_LOW ", /* 0x110 */
3063 "SRC1_CH0_STRIDE ", /* 0x114 */
3064 "SRC1_CH1_STRIDE ", /* 0x118 */
3065 "SRC1_IMGSIZE ", /* 0x11c */
3066 "SRC1_FILL ", /* 0x120 */
3067 "SRC1_ALPHA ", /* 0x124 */
3068 "SRC1_PIX_OFFSET ", "SRC2_CTRL ", /* 0x150 */
3069 "SRC2_CH0_ADDR_HIGH ", /* 0x154 */
3070 "SRC2_CH0_ADDR_LOW ", /* 0x158 */
3071 "SRC2_CH1_ADDR_HIGH ", /* 0x15c */
3072 "SRC2_CH1_ADDR_LOW ", /* 0x160 */
3073 "SRC2_CH0_STRIDE ", /* 0x164 */
3074 "SRC2_CH1_STRIDE ", /* 0x168 */
3075 "SRC2_IMGSIZE ", /* 0x16c */
3076 "SRC2_FILL ", /* 0x170 */
3077 "SRC2_ALPHA ", /* 0x174 */
3078 "SRC2_PIX_OFFSET ", "DES_CTRL ", /* 0x2a0 */
3079 "DES_CH0_ADDR_HIGH ", /* 0x2a4 */
3080 "DES_CH0_ADDR_LOW ", /* 0x2a8 */
3081 "DES_CH1_ADDR_HIGH ", /* 0x2ac */
3082 "DES_CH1_ADDR_LOW ", /* 0x2b0 */
3083 "DES_CH0_STRIDE ", /* 0x2b4 */
3084 "DES_CH1_STRIDE ", /* 0x2b8 */
3085 "DES_IMGSIZE ", /* 0x2bc */
3086 "DES_ALPHA ", /* 0x2c0 */
3087 "DES_CROP_POS_ST ", /* 0x2c4 */
3088 "DES_CROP_POS_ED ", /* 0x2c8 */
3089 "DES_PIX_OFFSET ", "SRC1_HSP ", /* 0x300 */
3090 "SRC1_HLOFFSET ", /* 0x304 */
3091 "SRC1_HCOFFSET ", /* 0x308 */
3092 "SRC1_VSP ", /* 0x30c */
3093 "SRC1_VSR ", /* 0x310 */
3094 "SRC1_VOFFSET ", /* 0x314 */
3095 "SRC1_ZMEORESO ", /* 0x318 */
3096 "SRC1_ZMEIRESO ", /* 0x31c */
3097 "SRC1_HPZME ", /* 0x320 */
3098 "SRC1_HPZME_SIZE ", /* 0x324 */
3099 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
3100 "SRC1_CSC_IDC0 ", /* 0x328 */
3101 "SRC1_CSC_IDC1 ", /* 0x32c */
3102 "SRC1_CSC_ODC0 ", /* 0x330 */
3103 "SRC1_CSC_ODC1 ", /* 0x334 */
3104 #else
3105 "SRC1_CSC_IDC ", /* 0x230 */
3106 "SRC1_CSC_ODC ", /* 0x234 */
3107 #endif
3108 "SRC1_CSC_P0 ", /* 0x338 */
3109 "SRC1_CSC_P1 ", /* 0x33c */
3110 "SRC1_CSC_P2 ", /* 0x340 */
3111 "SRC1_CSC_P3 ", /* 0x344 */
3112 "SRC1_CSC_P4 ", /* 0x348 */
3113 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
3114 "SRC1_DITHER_CTRL ", /* 0x34c */
3115 #endif
3116 "SRC2_HSP ", /* 0x350 */
3117 "SRC2_HLOFFSET ", /* 0x354 */
3118 "SRC2_HCOFFSET ", /* 0x358 */
3119 "SRC2_VSP ", /* 0x35c */
3120 "SRC2_VSR ", /* 0x360 */
3121 "SRC2_VOFFSET ", /* 0x364 */
3122 "SRC2_ZMEORESO ", /* 0x368 */
3123 "SRC2_ZMEIRESO ", /* 0x36c */
3124 "SRC2_HPZME ", /* 0x370 */
3125 "SRC2_HPZME_SIZE ", /* 0x374 */
3126 "SRC2_CSC_MUX ", /* 0x378 */
3127 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
3128 "DES_CSC_IDC0 ", /* 0x37c */
3129 "DES_CSC_IDC1 ", /* 0x380 */
3130 "DES_CSC_ODC0 ", /* 0x384 */
3131 "DES_CSC_ODC1 ", /* 0x388 */
3132 #else
3133 "DES_CSC_IDC ", /* 0x2c0 */
3134 "DES_CSC_ODC ", /* 0x2c4 */
3135 #endif
3136 "DES_CSC_P0 ", /* 0x38c */
3137 "DES_CSC_P1 ", /* 0x390 */
3138 "DES_CSC_P2 ", /* 0x394 */
3139 "DES_CSC_P3 ", /* 0x398 */
3140 "DES_CSC_P4 ", /* 0x39c */
3141 #if ((HICHIP == HI3519A_V100) || (HICHIP == HI3516C_V500))
3142 "DST_DITHER_CTRL ", /* 0x3a0 */
3143 #endif
3144 "DES_DSWM ", /* 0x3a4 */
3145 "SRC2_RTT_CTRL ", /* 0x3f0 */
3146 "CBMCTRL ", /* 0x400 */
3147 "CBMBKG ", /* 0x404 */
3148 "CBMCOLORIZE ", /* 0x408 */
3149 "CBMALUPARA ", /* 0x40c */
3150 "CBMKEYPARA ", /* 0x410 */
3151 "CBMKEYMIN ", /* 0x414 */
3152 "CBMKEYMAX ", /* 0x418 */
3153 "CBMKEYMASK ", /* 0x41c */
3154 "SRC1_CBMPARA ", /* 0x420 */
3155 "SRC1_CBMSTPOS ", /* 0x424 */
3156 "SRC2_CBMPARA ", /* 0x428 */
3157 "SRC2_CBMSTPOS ", /* 0x32c */
3158 "SRC1_ZME_LHADDR_HIGH", /* 0x0 */
3159 "SRC1_ZME_LHADDR_LOW", /* 0x4 */
3160 "SRC1_ZME_LVADDR_HIGH", /* 0x8 */
3161 "SRC1_ZME_LVADDR_LOW", /* 0xc */
3162 "SRC1_ZME_CHADDR_HIGH", /* 0x10 */
3163 "SRC1_ZME_CHADDR_LOW", /* 0x14 */
3164 "SRC1_ZME_CVADDR_HIGH", /* 0x18 */
3165 "SRC1_ZME_CVADDR_LOW", /* 0x1c */
3166 "SRC2_ZME_LHADDR_HIGH", /* 0x20 */
3167 "SRC2_ZME_LHADDR_LOW", /* 0x24 */
3168 "SRC2_ZME_LVADDR_HIGH", /* 0x28 */
3169 "SRC2_ZME_LVADDR_LOW", /* 0x2c */
3170 "SRC2_ZME_CHADDR_HIGH", /* 0x30 */
3171 "SRC2_ZME_CHADDR_LOW", /* 0x34 */
3172 "SRC2_ZME_CVADDR_HIGH", /* 0x38 */
3173 "SRC2_ZME_CVADDR_LOW", /* 0x3c */
3174 "CLUT_ADDR_HIGH", /* 0x40 */
3175 "CLUT_ADDR_LOW", /* 0x44 */
3176 };
3177
3178 #if (HICHIP == HI3516C_V500)
tde_hal_node_print_cv500(osal_proc_entry_t * p,hi_u32 * cur_node)3179 static hi_void tde_hal_node_print_cv500(osal_proc_entry_t *p, hi_u32 *cur_node)
3180 {
3181 hi_s32 i;
3182 for (i = 0; i < 11; i++) { /* 11 SRC1_CTRL 0x100 */
3183 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i], *(cur_node + i + 64)); /* 64 cur node data */
3184 }
3185
3186 for (i = 0; i < 11; i++) { /* 11 SRC2_CTRL 0x150 */
3187 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 11], *(cur_node + i + 84)); /* 11 84 cur node data */
3188 }
3189
3190 for (i = 0; i < 12; i++) { /* 12 DES_CTRL 0x2a0 */
3191 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 22], *(cur_node + i + 168)); /* 22 168 cur node data */
3192 }
3193
3194 for (i = 0; i < 42; i++) { /* 42 SRC1_HSP 0x300 */
3195 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 34], *(cur_node + i + 192)); /* 34 192 cur node data */
3196 }
3197 for (i = 0; i < 1; i++) { /* 1 SRC2_RTT_CTRL 0x3f0 */
3198 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 76], *(cur_node + i + 252)); /* 76 252 cur node data */
3199 }
3200 for (i = 0; i < 12; i++) { /* 12 CBMCTRL 0x400 */
3201 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 77], *(cur_node + i + 256)); /* 77 256 cur node data */
3202 }
3203 for (i = 0; i < 18; i++) { /* 18 TDE_SRC1_ZME_LHADDR 0x0 */
3204 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 89], *(cur_node + i)); /* 89 cur node data */
3205 }
3206 }
3207 #elif (HICHIP == HI3519A_V100)
tde_hal_node_print_19a(osal_proc_entry_t * p,hi_u32 * cur_node)3208 static hi_void tde_hal_node_print_19a(osal_proc_entry_t *p, hi_u32 *cur_node)
3209 {
3210 hi_s32 i;
3211 for (i = 0; i < 22; i++) { /* 22 SRC1_CTRL 0x0 */
3212 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i], *(cur_node + i));
3213 }
3214
3215 for (i = 0; i < 12; i++) { /* 12 DES_CTRL 0x0f8 */
3216 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 22], *(cur_node + i + 62)); /* 22 62 cur node data */
3217 }
3218
3219 for (i = 0; i < 8; i++) { /* 8 SRC1_HSP 0x200 */
3220 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 34], *(cur_node + i + 128)); /* 34 128 cur node data */
3221 }
3222
3223 for (i = 0; i < 12; i++) { /* 12 SRC1_HPZME 0x228 */
3224 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 42], *(cur_node + i + 138)); /* 42 138 cur node data */
3225 }
3226
3227 for (i = 0; i < 8; i++) { /* 8 SRC2_HSP 0x280 */
3228 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 54], *(cur_node + i + 160)); /* 54 160 cur node data */
3229 }
3230
3231 for (i = 0; i < 14; i++) { /* 14 SRC2_HPZME 0x2a8 */
3232 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 62], *(cur_node + i + 170)); /* 62 170 cur node data */
3233 }
3234
3235 for (i = 0; i < 1; i++) { /* SRC2_RTT_CTRL 0x3f0 */
3236 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 76], *(cur_node + i + 252)); /* 76 252 cur node data */
3237 }
3238
3239 for (i = 0; i < 12; i++) { /* 12 CBMCTRL 0x300 */
3240 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 77], *(cur_node + i + 192)); /* 77 192 cur node data */
3241 }
3242
3243 for (i = 0; i < 18; i++) { /* 18 TDE_SRC1_ZME_LHADDR 0x480 */
3244 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 89], *(cur_node + i + 288)); /* 89 288 cur node data */
3245 }
3246 }
3247 #else
tde_hal_node_print_all(osal_proc_entry_t * p,hi_u32 * cur_node)3248 static hi_void tde_hal_node_print_all(osal_proc_entry_t *p, hi_u32 *cur_node)
3249 {
3250 hi_s32 i;
3251 for (i = 0; i < 22; i++) { /* 22 SRC1_CTRL 0x0 */
3252 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i], *(cur_node + i));
3253 }
3254
3255 for (i = 0; i < 12; i++) { /* 12 DES_CTRL 0x0f8 */
3256 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 22], *(cur_node + i + 62)); /* 62 22 cur node data */
3257 }
3258
3259 for (i = 0; i < 8; i++) { /* 8 SRC1_HSP 0x200 */
3260 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 34], *(cur_node + i + 128)); /* 34 128 cur node data */
3261 }
3262
3263 for (i = 0; i < 9; i++) { /* 9 SRC1_HPZME 0x228 */
3264 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 42], *(cur_node + i + 138)); /* 42 138 cur node data */
3265 }
3266
3267 for (i = 0; i < 8; i++) { /* 8 SRC2_HSP 0x280 */
3268 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 51], *(cur_node + i + 160)); /* 51 160 cur node data */
3269 }
3270
3271 for (i = 0; i < 3; i++) { /* 3 SRC2_HPZME 0x2a8 */
3272 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 59], *(cur_node + i + 170)); /* 59 170 cur node data */
3273 }
3274
3275 for (i = 0; i < 8; i++) { /* 8 DES_CSC_IDC 0x2c0 */
3276 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 62], *(cur_node + i + 176)); /* 62 176 cur node data */
3277 }
3278
3279 for (i = 0; i < 1; i++) { /* SRC2_RTT_CTRL 0x3f0 */
3280 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 70], *(cur_node + i + 252)); /* 70 252 cur node data */
3281 }
3282
3283 for (i = 0; i < 12; i++) { /* 12 CBMCTRL 0x300 */
3284 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 71], *(cur_node + i + 192)); /* 71 192 cur node data */
3285 }
3286
3287 for (i = 0; i < 18; i++) { /* 18 TDE_SRC1_ZME_LHADDR 0x480 */
3288 osal_seq_printf(p, "(%s):\t0x%08x\n", g_update[i + 83], *(cur_node + i + 288)); /* 83 288 cur node data */
3289 }
3290 }
3291 #endif
3292
tde_hal_node_print_info(osal_proc_entry_t * p,hi_u32 * cur_node)3293 osal_proc_entry_t *tde_hal_node_print_info(osal_proc_entry_t *p, hi_u32 *cur_node)
3294 {
3295 if (p == HI_NULL) {
3296 return 0;
3297 }
3298 /* print node information */
3299 osal_seq_printf(p, "\n--------- Hisilicon TDE Node params Info ---------\n");
3300 #if (HICHIP == HI3516C_V500)
3301 tde_hal_node_print_cv500(p, cur_node);
3302 #elif (HICHIP == HI3519A_V100)
3303 tde_hal_node_print_19a(p, cur_node);
3304 #else
3305 tde_hal_node_print_all(p, cur_node);
3306 #endif
3307 return p;
3308 }
3309 #endif
3310 #endif
3311