• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef HI_BUILD_IN_BOOT
20 #include <linux/version.h>
21 #ifndef __RTOS__
22 #include "tde_init.h"
23 #ifdef CONFIG_64BIT
24 #include <asm/compat.h>
25 #endif
26 #endif
27 #include "tde_ioctl.h" /* because of redefined warning, tde_ioctl.h not go first. */
28 #include "drv_tde_type.h"
29 #include "tde_osictl.h"
30 #include "tde_osilist.h"
31 #include "tde_hal.h"
32 #include "tde_handle.h"
33 #include "tde_adp.h"
34 #include "hi_common.h"
35 #include "hi_tde_ext.h"
36 #include "drv_tde_ioctl.h"
37 #include "tde_osictl_k.h"
38 #include "tde_hal_k.h"
39 #ifdef CONFIG_HI_PROC_SHOW_SUPPORT
40 #include "tde_proc.h"
41 #endif
42 #define TDE_NAME "HI_TDE"
43 
44 static osal_spinlock_t g_task_let_lock;
45 
46 static osal_spinlock_t g_tde_ref_lock;
47 
48 typedef hi_s32 (*tde_ctrl_ptr_func)(unsigned long argp, hi_void *private_data);
49 typedef struct {
50     hi_u32 tde_cmd;
51     tde_ctrl_ptr_func tde_ctl_ptr_func;
52 } tde_ctl_func_dispatch_item;
53 
54 hi_s32 tde_osr_begin_job(unsigned long argp, hi_void *private_data);
55 static hi_s32 tde_osr_blit_blit(unsigned long argp, hi_void *private_data);
56 static hi_s32 tde_osr_solid_draw(unsigned long argp, hi_void *private_data);
57 static hi_s32 tde_osr_quick_copy(unsigned long argp, hi_void *private_data);
58 static hi_s32 tde_osr_quick_resize(unsigned long argp, hi_void *private_data);
59 static hi_s32 tde_osr_quick_fill(unsigned long argp, hi_void *private_data);
60 static hi_s32 tde_osr_quick_deflicker(unsigned long argp, hi_void *private_data);
61 static hi_s32 tde_osr_mb_blit_blit(unsigned long argp, hi_void *private_data);
62 static hi_s32 tde_osr_end_job(unsigned long argp, hi_void *private_data);
63 static hi_s32 tde_osr_wait_for_done(unsigned long argp, hi_void *private_data);
64 static hi_s32 tde_osr_cancel_job(unsigned long argp, hi_void *private_data);
65 static hi_s32 tde_osr_bit_map_mask_rop(unsigned long argp, hi_void *private_data);
66 static hi_s32 tde_osr_bit_map_mask_blend(unsigned long argp, hi_void *private_data);
67 static hi_s32 tde_osr_wait_all_done(unsigned long argp, hi_void *private_data);
68 static hi_s32 tde_osr_reset(unsigned long argp, hi_void *private_data);
69 
70 static hi_s32 tde_osr_set_deflicker_level(unsigned long argp, hi_void *private_data);
71 static hi_s32 tde_osr_get_deflicker_level(unsigned long argp, hi_void *private_data);
72 static hi_s32 tde_osr_set_alpha_threshold_value(unsigned long argp, hi_void *private_data);
73 static hi_s32 tde_osr_get_alpha_threshold_value(unsigned long argp, hi_void *private_data);
74 static hi_s32 tde_osr_set_alpha_threshold_state(unsigned long argp, hi_void *private_data);
75 static hi_s32 tde_osr_get_alpha_threshold_state(unsigned long argp, hi_void *private_data);
76 static hi_s32 tde_osr_pattern_fill(unsigned long argp, hi_void *private_data);
77 static hi_s32 tde_osr_enable_region_deflicker(unsigned long argp, hi_void *private_data);
78 static hi_s32 tde_osr_rotate(unsigned long argp, hi_void *private_data);
79 
80 tde_ctl_func_dispatch_item g_tde_ctl_func_dispatch_item[] = {
81     {0, HI_NULL},
82     {TDE_BEGIN_JOB, tde_osr_begin_job},
83     {TDE_BIT_BLIT, tde_osr_blit_blit},
84     {TDE_SOLID_DRAW, tde_osr_solid_draw},
85     {TDE_QUICK_COPY, tde_osr_quick_copy},
86     {TDE_QUICK_RESIZE, tde_osr_quick_resize},
87     {TDE_QUICK_FILL, tde_osr_quick_fill},
88     {TDE_QUICK_DEFLICKER, tde_osr_quick_deflicker},
89     {TDE_MB_BITBLT, tde_osr_mb_blit_blit},
90     {TDE_END_JOB, tde_osr_end_job},
91     {TDE_WAITFORDONE, tde_osr_wait_for_done},
92     {TDE_CANCEL_JOB, tde_osr_cancel_job},
93     {TDE_BITMAP_MASKROP, tde_osr_bit_map_mask_rop},
94     {TDE_BITMAP_MASKBLEND, tde_osr_bit_map_mask_blend},
95     {TDE_WAITALLDONE, tde_osr_wait_all_done},
96     {TDE_RESET, tde_osr_reset},
97     {0, HI_NULL},
98     {TDE_SET_DEFLICKERLEVEL, tde_osr_set_deflicker_level},
99     {TDE_GET_DEFLICKERLEVEL, tde_osr_get_deflicker_level},
100     {TDE_SET_ALPHATHRESHOLD_VALUE, tde_osr_set_alpha_threshold_value},
101     {TDE_GET_ALPHATHRESHOLD_VALUE, tde_osr_get_alpha_threshold_value},
102     {TDE_SET_ALPHATHRESHOLD_STATE, tde_osr_set_alpha_threshold_state},
103     {TDE_GET_ALPHATHRESHOLD_STATE, tde_osr_get_alpha_threshold_state},
104     {TDE_PATTERN_FILL, tde_osr_pattern_fill},
105     {TDE_ENABLE_REGIONDEFLICKER, tde_osr_enable_region_deflicker},
106     {TDE_ROTATE, tde_osr_rotate},
107     {0, HI_NULL},
108     {0, HI_NULL}
109 };
110 
111 #define TDE_IOCTL_FUNC_NUM (sizeof(g_tde_ctl_func_dispatch_item) / sizeof(g_tde_ctl_func_dispatch_item[0]))
112 
113 static int tde_osr_isr(int irq, hi_void *dev_id);
114 static void tde_tasklet_func(unsigned long int_status);
115 
116 /* TDE equipment quoted count */
117 static osal_atomic_t g_tde_count = OSAL_ATOMIC_INIT(0);
118 #ifdef TDE_TIME_COUNT
119 tde_timeval g_time_start;
120 tde_timeval g_time_end;
121 hi_u64 g_time_diff;
122 #endif
123 
124 struct osal_fileops g_tde_fops = {
125     .open = tde_open,
126     .release = tde_release,
127 #ifdef CONFIG_COMPAT
128     .compat_ioctl = tde_ioctl, /* tde_compactioctl */
129 #endif
130     .unlocked_ioctl = tde_ioctl,
131 };
132 
133 unsigned int g_tde_irq = TDE_INTNUM;
134 static osal_dev_t *g_tde_device;
135 #ifndef __RTOS__
136 #if LINUX_VERSION_CODE > KERNEL_VERSION(5,9,0)
137 DECLARE_TASKLET_OLD(tde_tasklet, tde_tasklet_func);
138 #else
139 DECLARE_TASKLET(tde_tasklet, tde_tasklet_func, 0);
140 #endif
141 #endif
142 
143 #ifdef CONFIG_TDE_TDE_EXPORT_FUNC
144 static hi_tde_export_func g_tde_export_funce = {
145     .drv_tde_module_open = tde_osi_open,
146     .drv_tde_module_close = tde_osi_close,
147     .drv_tde_module_begin_job = tde_osi_begin_job_ex,
148     .drv_tde_module_end_job = tde_osi_end_job,
149     .drv_tde_module_cancel_job = tde_osi_cancel_job,
150     .drv_tde_module_wait_for_done = tde_osi_wait_for_done,
151     .drv_tde_module_wait_all_done = tde_osi_wait_all_done,
152     .drv_tde_module_quick_copy = tde_osi_quick_copy,
153     .drv_tde_module_quick_fill = tde_osi_quick_fill,
154     .drv_tde_module_quick_resize = tde_osi_quick_resize,
155 #if (TDE_CAPABILITY & DEFLICKER)
156     .drv_tde_module_quick_flicker = tde_osi_quick_flicker,
157 #endif
158     .drv_tde_module_blit = tde_osi_blit,
159     .drv_tde_module_mb_blit = tde_osi_mb_blit,
160     .drv_tde_module_solid_draw = tde_osi_solid_draw,
161 #if (TDE_CAPABILITY & DEFLICKER)
162     .drv_tde_module_set_deflicker_level = tde_osi_set_deflicker_level,
163 #endif
164     .drv_tde_module_enable_region_deflicker = tde_osi_enable_region_deflicker,
165     .drv_tde_module_rotate = tde_osi_quick_rotate,
166     .drv_tde_module_set_alpha_threshold_value = tde_osi_set_alpha_threshold_value,
167     .drv_tde_module_set_alpha_threshold_state = tde_osi_set_alpha_threshold_state,
168     .drv_tde_module_get_alpha_threshold_state = tde_osi_get_alpha_threshold_state,
169     .drv_tde_module_cal_scale_rect = tde_cal_scale_rect,
170 #ifdef CONFIG_TDE_PM_ENABLE
171     .drv_tde_module_suspend = tde_pm_suspend,
172     .drv_tde_module_resume = tde_pm_resume,
173 #endif
174 
175 #ifdef CONFIG_TDE_BLIT_EX
176     .drv_tde_module_single_blit_ex = tde_osi_single_blit_ex,
177 #endif
178 
179 #ifdef TDE_HWC_COOPERATE
180     .drv_tde_module_lock_working_flag = tde_osi_list_lock_working_flag,
181     .drv_tde_module_unlock_working_flag = tde_osi_list_unlock_working_flag,
182     .drv_tde_module_get_working_flag = tde_osi_list_get_working_flag
183 #endif
184 };
185 #endif
186 
set_tde_irq(unsigned int temp_tde_irq)187 hi_void set_tde_irq(unsigned int temp_tde_irq)
188 {
189     g_tde_irq = temp_tde_irq;
190 }
191 
gfx_init(hi_void * args)192 static hi_s32 gfx_init(hi_void *args)
193 {
194     hi_unused(args);
195     return HI_SUCCESS;
196 }
197 
gfx_exit(hi_void)198 static hi_void gfx_exit(hi_void)
199 {
200     return;
201 }
202 
gfx_notify(mod_notice_id notice)203 static hi_void gfx_notify(mod_notice_id notice)
204 {
205     hi_unused(notice);
206     return;
207 }
208 
gfx_query_state(mod_state * state)209 static hi_void gfx_query_state(mod_state *state)
210 {
211     if (state == HI_NULL) {
212         return;
213     }
214     *state = MOD_STATE_FREE;
215     return;
216 }
217 
gfx_get_ver_magic(hi_void)218 static hi_u32 gfx_get_ver_magic(hi_void)
219 {
220     return VERSION_MAGIC;
221 }
222 
tde_freeze(osal_dev_t * pdev)223 static hi_s32 tde_freeze(osal_dev_t *pdev)
224 {
225     hi_unused(pdev);
226     return HI_SUCCESS;
227 }
228 
tde_restore(osal_dev_t * pdev)229 static hi_s32 tde_restore(osal_dev_t *pdev)
230 {
231     hi_unused(pdev);
232     return HI_SUCCESS;
233 }
234 
235 struct osal_pmops g_tde_drv_ops = {
236     .pm_freeze = tde_freeze,
237     .pm_restore = tde_restore,
238 };
239 
240 static umap_module g_module = {
241     .mod_id = HI_ID_TDE,
242     .mod_name = "tde",
243     .pfn_init = gfx_init,
244     .pfn_exit = gfx_exit,
245     .pfn_query_state = gfx_query_state,
246     .pfn_notify = gfx_notify,
247     .pfn_ver_checker = gfx_get_ver_magic,
248     .export_funcs = &g_tde_export_funce,
249     .data = HI_NULL,
250 };
251 
tde_init_create(hi_void)252 static hi_s32 tde_init_create(hi_void)
253 {
254 #ifdef CONFIG_HI_PROC_SHOW_SUPPORT
255     osal_proc_entry_t *proc = HI_NULL;
256 
257     proc = osal_create_proc_entry("tde", HI_NULL);
258     if (proc == HI_NULL) {
259         osal_printk("TDE module create proc failure!\n");
260         osal_deregisterdevice(g_tde_device);
261         tde_osi_list_term();
262         osal_free_irq(g_tde_irq, tde_osr_isr);
263         tde_hal_release();
264         osal_destroydev(g_tde_device);
265         return HI_FAILURE;
266     }
267     proc->read = tde_read_proc;
268 #endif
269     if (cmpi_register_module(&g_module)) {
270         osal_printk("%s %d cmpi_register_module failed\n", __func__, __LINE__);
271         osal_remove_proc_entry("tde", HI_NULL);
272         osal_deregisterdevice(g_tde_device);
273         tde_osi_list_term();
274         osal_free_irq(g_tde_irq, tde_osr_isr);
275         tde_hal_release();
276         osal_destroydev(g_tde_device);
277         return HI_FAILURE;
278     }
279     return HI_SUCCESS;
280 }
281 
tde_init_module_k(hi_void)282 hi_s32 tde_init_module_k(hi_void)
283 {
284     hi_s32 ret;
285 
286     if (tde_hal_init(TDE_REG_BASEADDR) < 0) {
287         tde_error("tde_hal_init failure!\n");
288         return HI_FAILURE;
289     }
290 
291     if (osal_request_irq(g_tde_irq, tde_osr_isr, HI_NULL, TDE_IRQ_NAME, tde_osr_isr) != 0) {
292         tde_error("request_irq for TDE failure!\n");
293         tde_hal_release();
294         return HI_FAILURE;
295     }
296 
297     if (tde_osi_list_init() != 0) {
298         tde_error("TdeOsiListInit failure!\n");
299         osal_free_irq(g_tde_irq, tde_osr_isr);
300         tde_hal_release();
301         return HI_FAILURE;
302     }
303 
304     /* register tde device */
305     g_tde_device = osal_createdev("hi_tde");
306     if (g_tde_device == HI_NULL) {
307         osal_printk("\n  osal_createdev failure\n");
308         tde_osi_list_term();
309         osal_free_irq(g_tde_irq, tde_osr_isr);
310         tde_hal_release();
311         return HI_FAILURE;
312     }
313     g_tde_device->minor = 255; /* 255 max bits */
314     g_tde_device->fops = &g_tde_fops;
315     g_tde_device->osal_pmops = &g_tde_drv_ops;
316 
317     ret = osal_registerdevice(g_tde_device);
318     if (ret) {
319         osal_printk("\n  osal_registerdevice failure\n");
320         tde_osi_list_term();
321         osal_free_irq(g_tde_irq, tde_osr_isr);
322         tde_hal_release();
323         osal_destroydev(g_tde_device);
324         return HI_FAILURE;
325     }
326     if (tde_init_create() != HI_SUCCESS) {
327         return HI_FAILURE;
328     }
329     osal_spin_lock_init(&g_task_let_lock);
330     osal_spin_lock_init(&g_tde_ref_lock);
331     osal_atomic_init(&g_tde_count);
332     return HI_SUCCESS;
333 }
334 
tde_cleanup_module_k(hi_void)335 hi_void tde_cleanup_module_k(hi_void)
336 {
337 #ifdef CONFIG_HI_PROC_SHOW_SUPPORT
338     osal_remove_proc_entry("tde", HI_NULL);
339 #endif
340     tde_osi_list_term();
341     osal_free_irq(g_tde_irq, tde_osr_isr);
342 
343     cmpi_unregister_module(conver_id(HIGFX_TDE_ID));
344 
345     osal_spin_lock_destroy(&g_task_let_lock);
346     osal_spin_lock_destroy(&g_tde_ref_lock);
347     osal_atomic_destroy(&g_tde_count);
348     /* cleanup_module is never called if registering failed */
349     osal_deregisterdevice(g_tde_device);
350     osal_destroydev(g_tde_device);
351     tde_hal_release();
352     return;
353 }
354 
tde_open(hi_void * private_data)355 int tde_open(hi_void *private_data)
356 {
357     hi_unused(private_data);
358     if (osal_atomic_inc_return(&g_tde_count) == 1) {
359         (hi_void) tde_hal_open();
360     }
361 
362     return HI_SUCCESS;
363 }
364 
tde_release(hi_void * private_data)365 int tde_release(hi_void *private_data)
366 {
367     if (private_data != HI_NULL) {
368         tde_free_pending_job(private_data);
369     }
370 
371     if (osal_atomic_read(&g_tde_count) < 0) {
372         osal_atomic_set(&g_tde_count, 0);
373     }
374 
375     return HI_SUCCESS;
376 }
377 
convert_surface(hi_tde_surface * src_surface,drv_tde_ioctl_surface * dst_surface)378 hi_void convert_surface(hi_tde_surface *src_surface, drv_tde_ioctl_surface *dst_surface)
379 {
380     hi_u64 clutphy_addr;
381 
382     clutphy_addr = dst_surface->clut_phy_addr;
383 
384     src_surface->support_alpha_ext_1555 = dst_surface->support_alpha_ext_1555;
385     src_surface->alpha_max_is_255 = dst_surface->alpha_max_is_255;
386     src_surface->is_ycbcr_clut = dst_surface->is_ycbcr_clut;
387     src_surface->color_fmt = dst_surface->color_fmt;
388     src_surface->clut_phy_addr = clutphy_addr;
389     src_surface->cbcr_phy_addr = dst_surface->cbcr_phy_addr;
390     src_surface->cbcr_stride = dst_surface->cbcr_stride;
391     src_surface->height = dst_surface->height;
392     src_surface->phy_addr = dst_surface->phy_addr;
393     src_surface->stride = dst_surface->stride;
394     src_surface->width = dst_surface->width;
395     src_surface->alpha0 = dst_surface->alpha0;
396     src_surface->alpha1 = dst_surface->alpha1;
397 }
398 
399 typedef union {
400     drv_tde_bitblit_cmd blit_cmd;
401     drv_tde_solid_draw_cmd draw_cmd;
402     drv_tde_quick_deflicker_cmd deflicker_cmd;
403     drv_tde_quick_copy_cmd copy_cmd;
404     drv_tde_quick_resize_cmd resize_cmd;
405     drv_tde_quick_fill_cmd fill_cmd;
406     drv_tde_end_job_cmd end_cmd;
407     drv_tde_mb_blit_cmd mb_blit_cmd;
408     drv_tde_bitmap_maskrop_cmd mask_rop_cmd;
409     drv_tde_bitmap_maskblend_cmd mask_blend_cmd;
410     drv_tde_pattern_fill_cmd pattern_cmd;
411     tde_rotate_cmd rotate_cmd;
412 } tde_ioctl_cmd;
413 
tde_ioctl(unsigned int cmd,unsigned long arg,hi_void * private_data)414 long tde_ioctl(unsigned int cmd, unsigned long arg, hi_void *private_data)
415 {
416     hi_u8 tmp_cmd = _IOC_NR(cmd);
417     if ((tmp_cmd < 1) || (tmp_cmd >= TDE_IOCTL_FUNC_NUM)) {
418         return HI_FAILURE;
419     }
420     if (cmd != g_tde_ctl_func_dispatch_item[tmp_cmd].tde_cmd) {
421         return -EFAULT;
422     }
423 
424     if (g_tde_ctl_func_dispatch_item[tmp_cmd].tde_ctl_ptr_func == HI_NULL) {
425         return -EFAULT;
426     }
427 
428     return g_tde_ctl_func_dispatch_item[tmp_cmd].tde_ctl_ptr_func(arg, private_data);
429 }
430 
tde_osr_begin_job(unsigned long argp,hi_void * private_data)431 hi_s32 tde_osr_begin_job(unsigned long argp, hi_void *private_data)
432 {
433     hi_s32 ret;
434     hi_s32 *handle = HI_NULL;
435 
436     if (argp == 0) {
437         return -EFAULT;
438     }
439     handle = (hi_s32 *)(uintptr_t)argp;
440     ret = tde_osi_begin_job(handle, private_data);
441     if (ret != HI_SUCCESS) {
442         return ret;
443     }
444 
445     return HI_SUCCESS;
446 }
447 
tde_osr_blit_blit(unsigned long argp,hi_void * private_data)448 static hi_s32 tde_osr_blit_blit(unsigned long argp, hi_void *private_data)
449 {
450     hi_tde_surface back_ground_surface = {0};
451     hi_tde_surface fore_ground_surface = {0};
452     hi_tde_surface dst_surface = {0};
453     hi_tde_double_src double_src;
454     hi_tde_opt *opt = HI_NULL;
455     drv_tde_bitblit_cmd *bit_blt = HI_NULL;
456     hi_unused(private_data);
457     if (argp == 0) {
458         return -EFAULT;
459     }
460     bit_blt = (drv_tde_bitblit_cmd *)(uintptr_t)argp;
461 
462     convert_surface(&back_ground_surface, &(bit_blt->back_ground_surface));
463     convert_surface(&fore_ground_surface, &(bit_blt->fore_ground_surface));
464     convert_surface(&dst_surface, &(bit_blt->dst_surface));
465 
466     double_src.bg_surface = ((bit_blt->null_indicator >> 1) & 1) ? HI_NULL : &(back_ground_surface);
467     /* 2 Take the high */
468     double_src.bg_rect = ((bit_blt->null_indicator >> 2) & 1) ? HI_NULL : &(bit_blt->back_ground_rect);
469     /* 3 Take the high */
470     double_src.fg_surface = ((bit_blt->null_indicator >> 3) & 1) ? HI_NULL : &(fore_ground_surface);
471     double_src.fg_rect = ((bit_blt->null_indicator >> 4) & 1) ? HI_NULL : /* 4 Take the high */
472                          &(bit_blt->fore_ground_rect);
473     opt = ((bit_blt->null_indicator >> 7) & 1) ? HI_NULL : &(bit_blt->option); /* 7 Take the high */
474 
475     double_src.dst_surface = &(dst_surface);
476     double_src.dst_rect = &(bit_blt->dst_rect);
477     return tde_osi_blit(bit_blt->handle, &double_src, opt);
478 }
479 
tde_osr_solid_draw(unsigned long argp,hi_void * private_data)480 static hi_s32 tde_osr_solid_draw(unsigned long argp, hi_void *private_data)
481 {
482     hi_tde_surface fore_ground_surface = {0};
483     hi_tde_surface dst_surface = {0};
484     hi_tde_fill_color *fill_color = HI_NULL;
485     hi_tde_opt *opt = HI_NULL;
486     drv_tde_solid_draw_cmd *solid_draw = HI_NULL;
487     hi_tde_single_src single_src;
488     hi_unused(private_data);
489     if (argp == 0) {
490         return -EFAULT;
491     }
492     solid_draw = (drv_tde_solid_draw_cmd *)(uintptr_t)argp;
493 
494     convert_surface(&fore_ground_surface, &(solid_draw->fore_ground_surface));
495     convert_surface(&dst_surface, &(solid_draw->dst_surface));
496 
497     single_src.src_surface = ((solid_draw->null_indicator >> 1) & 1) ? HI_NULL : &fore_ground_surface;
498     single_src.src_rect = ((solid_draw->null_indicator >> 2) & 1) ? HI_NULL : /* 2 Take the high */
499                           &(solid_draw->fore_ground_rect);
500     /* 5 Take the high */
501     fill_color = ((solid_draw->null_indicator >> 5) & 1) ? HI_NULL : &(solid_draw->fill_color);
502     opt = ((solid_draw->null_indicator >> 6) & 1) ? HI_NULL : &(solid_draw->option); /* 6 Take the high */
503 
504     single_src.dst_rect = &(solid_draw->dst_rect);
505     single_src.dst_surface = &(dst_surface);
506     return tde_osi_solid_draw(solid_draw->handle, &single_src, fill_color, opt);
507 }
508 
tde_osr_quick_copy(unsigned long argp,hi_void * private_data)509 static hi_s32 tde_osr_quick_copy(unsigned long argp, hi_void *private_data)
510 {
511     hi_tde_surface dst_surface = {0};
512     hi_tde_surface src_surface = {0};
513     drv_tde_quick_copy_cmd *quick_copy = HI_NULL;
514     hi_tde_single_src single_src;
515     hi_unused(private_data);
516     if (argp == 0) {
517         return -EFAULT;
518     }
519     quick_copy = (drv_tde_quick_copy_cmd *)(uintptr_t)argp;
520 
521     convert_surface(&src_surface, &(quick_copy->src_surface));
522     convert_surface(&dst_surface, &(quick_copy->dst_surface));
523 
524     single_src.src_surface = &(src_surface);
525     single_src.src_rect = &(quick_copy->src_rect);
526     single_src.dst_surface = &(dst_surface);
527     single_src.dst_rect = &(quick_copy->dst_rect);
528     return tde_osi_quick_copy(quick_copy->handle, &single_src);
529 }
530 
tde_osr_quick_resize(unsigned long argp,hi_void * private_data)531 static hi_s32 tde_osr_quick_resize(unsigned long argp, hi_void *private_data)
532 {
533     hi_tde_surface dst_surface = {0};
534     hi_tde_surface src_surface = {0};
535     drv_tde_quick_resize_cmd *quick_resize = HI_NULL;
536     hi_unused(private_data);
537     if (argp == 0) {
538         return -EFAULT;
539     }
540     quick_resize = (drv_tde_quick_resize_cmd *)(uintptr_t)argp;
541     convert_surface(&src_surface, &(quick_resize->src_surface));
542     convert_surface(&dst_surface, &(quick_resize->dst_surface));
543 
544     return tde_osi_quick_resize(quick_resize->handle, &(src_surface), &(quick_resize->src_rect), &(dst_surface),
545                                 &(quick_resize->dst_rect));
546 }
547 
tde_osr_quick_fill(unsigned long argp,hi_void * private_data)548 static hi_s32 tde_osr_quick_fill(unsigned long argp, hi_void *private_data)
549 {
550     hi_tde_surface dst_surface = {0};
551     drv_tde_quick_fill_cmd *quick_fill = HI_NULL;
552     hi_unused(private_data);
553     if (argp == 0) {
554         return -EFAULT;
555     }
556     quick_fill = (drv_tde_quick_fill_cmd *)(uintptr_t)argp;
557 
558     convert_surface(&dst_surface, &(quick_fill->dst_surface));
559 
560     return tde_osi_quick_fill(quick_fill->handle, &(dst_surface),
561                               &(quick_fill->dst_rect), quick_fill->fill_data);
562 }
563 
tde_osr_quick_deflicker(unsigned long argp,hi_void * private_data)564 static hi_s32 tde_osr_quick_deflicker(unsigned long argp, hi_void *private_data)
565 {
566 #if (TDE_CAPABILITY & DEFLICKER)
567     hi_tde_surface dst_surface = {0};
568     hi_tde_surface src_surface = {0};
569     drv_tde_quick_deflicker_cmd *deflicker = HI_NULL;
570     hi_unused(private_data);
571     if (argp == 0) {
572         return -EFAULT;
573     }
574     deflicker = (drv_tde_quick_deflicker_cmd *)(uintptr_t)argp;
575 
576     convert_surface(&src_surface, &(deflicker->src_surface));
577     convert_surface(&dst_surface, &(deflicker->dst_surface));
578 
579     return tde_osi_quick_flicker(deflicker->handle, &(src_surface), &(deflicker->src_rect), &(dst_surface),
580                                  &(deflicker->dst_rect));
581 #else
582     hi_unused(argp);
583     hi_unused(private_data);
584     return HI_ERR_TDE_UNSUPPORTED_OPERATION;
585 #endif
586 }
587 
tde_osr_mb_blit_blit(unsigned long argp,hi_void * private_data)588 static hi_s32 tde_osr_mb_blit_blit(unsigned long argp, hi_void *private_data)
589 {
590     hi_tde_mb_src mb_src;
591     hi_tde_surface dst_surface = {0};
592     drv_tde_mb_blit_cmd *mb_bitblt = HI_NULL;
593     hi_unused(private_data);
594     if (argp == 0) {
595         return -EFAULT;
596     }
597     mb_bitblt = (drv_tde_mb_blit_cmd *)(uintptr_t)argp;
598     convert_surface(&dst_surface, &(mb_bitblt->dst_surface));
599     mb_src.dst_rect = &(mb_bitblt->dst_rect);
600     mb_src.dst_surface = &(dst_surface);
601     mb_src.mb_surface = &(mb_bitblt->mb_src_surface);
602     mb_src.src_rect = &(mb_bitblt->mb_src_rect);
603     return tde_osi_mb_blit(mb_bitblt->handle, &mb_src, &(mb_bitblt->mb_option));
604 }
605 
tde_osr_end_job(unsigned long argp,hi_void * private_data)606 static hi_s32 tde_osr_end_job(unsigned long argp, hi_void *private_data)
607 {
608     drv_tde_end_job_cmd *end_job = HI_NULL;
609     hi_unused(private_data);
610     if (argp == 0) {
611         return -EFAULT;
612     }
613     end_job = (drv_tde_end_job_cmd *)(uintptr_t)argp;
614 
615     return tde_osi_end_job(end_job, HI_NULL, HI_NULL);
616 }
617 
tde_osr_wait_for_done(unsigned long argp,hi_void * private_data)618 static hi_s32 tde_osr_wait_for_done(unsigned long argp, hi_void *private_data)
619 {
620     hi_s32 *handle = HI_NULL;
621     hi_unused(private_data);
622     if (argp == 0) {
623         return -EFAULT;
624     }
625     handle = (hi_s32 *)(uintptr_t)argp;
626 
627     return tde_osi_wait_for_done(*handle, TDE_MAX_WAIT_TIMEOUT);
628 }
629 
tde_osr_cancel_job(unsigned long argp,hi_void * private_data)630 static hi_s32 tde_osr_cancel_job(unsigned long argp, hi_void *private_data)
631 {
632     hi_s32 *handle = HI_NULL;
633     hi_unused(private_data);
634     if (argp == 0) {
635         return -EFAULT;
636     }
637     handle = (hi_s32 *)(uintptr_t)argp;
638 
639     return tde_osi_cancel_job(*handle);
640 }
641 
tde_osr_bit_map_mask_rop(unsigned long argp,hi_void * private_data)642 static hi_s32 tde_osr_bit_map_mask_rop(unsigned long argp, hi_void *private_data)
643 {
644 #if (TDE_CAPABILITY & MASKROP)
645     hi_tde_surface bg_surface = {0};
646     hi_tde_surface fg_surface = {0};
647     hi_tde_surface dst_surface = {0};
648     hi_tde_surface mask_surface = {0};
649     drv_tde_bitmap_maskrop_cmd *bmp_mask_rop = HI_NULL;
650     hi_tde_triple_src triple_src = {0};
651     hi_unused(private_data);
652     if (argp == 0) {
653         return -EFAULT;
654     }
655     bmp_mask_rop = (drv_tde_bitmap_maskrop_cmd *)(uintptr_t)argp;
656 
657     convert_surface(&bg_surface, &(bmp_mask_rop->back_ground_surface));
658     convert_surface(&fg_surface, &(bmp_mask_rop->fore_ground_surface));
659     convert_surface(&mask_surface, &(bmp_mask_rop->mask_surface));
660     convert_surface(&dst_surface, &(bmp_mask_rop->dst_surface));
661 
662     triple_src.bg_surface = &bg_surface;
663     triple_src.bg_rect = &(bmp_mask_rop->back_ground_rect);
664     triple_src.fg_surface = &fg_surface;
665     triple_src.fg_rect = &(bmp_mask_rop->fore_ground_rect);
666     triple_src.mask_surface = &mask_surface;
667     triple_src.mask_rect = &(bmp_mask_rop->mask_rect);
668     triple_src.dst_surface = &dst_surface;
669     triple_src.dst_rect = &(bmp_mask_rop->dst_rect);
670 
671     return tde_osi_bitmap_mask_rop(bmp_mask_rop->handle, &triple_src, bmp_mask_rop->rop_color,
672                                    bmp_mask_rop->rop_alpha);
673 #else
674     hi_unused(argp);
675     hi_unused(private_data);
676     return HI_ERR_TDE_UNSUPPORTED_OPERATION;
677 #endif
678 }
679 
tde_osr_bit_map_mask_blend(unsigned long argp,hi_void * private_data)680 static hi_s32 tde_osr_bit_map_mask_blend(unsigned long argp, hi_void *private_data)
681 {
682 #if (TDE_CAPABILITY & MASKROP)
683     hi_tde_surface bg_surface = {0};
684     hi_tde_surface fg_surface = {0};
685     hi_tde_surface dst_surface = {0};
686     hi_tde_surface mask_surface = {0};
687     drv_tde_bitmap_maskblend_cmd *bmp_mask_blend = HI_NULL;
688     hi_tde_triple_src triple_src = {0};
689     hi_unused(private_data);
690     if (argp == 0) {
691         return -EFAULT;
692     }
693     bmp_mask_blend = (drv_tde_bitmap_maskblend_cmd *)(uintptr_t)argp;
694 
695     convert_surface(&bg_surface, &(bmp_mask_blend->back_ground_surface));
696     convert_surface(&fg_surface, &(bmp_mask_blend->fore_ground_surface));
697     convert_surface(&mask_surface, &(bmp_mask_blend->mask_surface));
698     convert_surface(&dst_surface, &(bmp_mask_blend->dst_surface));
699 
700     triple_src.bg_surface = &bg_surface;
701     triple_src.bg_rect = &(bmp_mask_blend->back_ground_rect);
702     triple_src.fg_surface = &fg_surface;
703     triple_src.fg_rect = &(bmp_mask_blend->fore_ground_rect);
704     triple_src.mask_surface = &mask_surface;
705     triple_src.mask_rect = &(bmp_mask_blend->mask_rect);
706     triple_src.dst_surface = &dst_surface;
707     triple_src.dst_rect = &(bmp_mask_blend->dst_rect);
708 
709     return tde_osi_bitmap_mask_blend(bmp_mask_blend->handle, &triple_src, bmp_mask_blend->alpha,
710                                      bmp_mask_blend->blend_mode);
711 #else
712     hi_unused(argp);
713     hi_unused(private_data);
714     return HI_ERR_TDE_UNSUPPORTED_OPERATION;
715 #endif
716 }
717 
tde_osr_wait_all_done(unsigned long argp,hi_void * private_data)718 static hi_s32 tde_osr_wait_all_done(unsigned long argp, hi_void *private_data)
719 {
720     hi_unused(argp);
721     hi_unused(private_data);
722     return tde_osi_wait_all_done(HI_FALSE);
723 }
724 
tde_osr_reset(unsigned long argp,hi_void * private_data)725 static hi_s32 tde_osr_reset(unsigned long argp, hi_void *private_data)
726 {
727     hi_unused(argp);
728     hi_unused(private_data);
729     return HI_SUCCESS;
730 }
731 
tde_osr_set_deflicker_level(unsigned long argp,hi_void * private_data)732 static hi_s32 tde_osr_set_deflicker_level(unsigned long argp, hi_void *private_data)
733 {
734 #if (TDE_CAPABILITY & DEFLICKER)
735     hi_tde_deflicker_level deflicker_level;
736     hi_unused(private_data);
737     if (argp == 0) {
738         return -EFAULT;
739     }
740     deflicker_level = *(hi_tde_deflicker_level *)(uintptr_t)argp;
741 
742     return tde_osi_set_deflicker_level(deflicker_level);
743 #else
744     hi_unused(argp);
745     hi_unused(private_data);
746     return HI_ERR_TDE_UNSUPPORTED_OPERATION;
747 #endif
748 }
749 
tde_osr_get_deflicker_level(unsigned long argp,hi_void * private_data)750 static hi_s32 tde_osr_get_deflicker_level(unsigned long argp, hi_void *private_data)
751 {
752     hi_tde_deflicker_level *deflicker_level = HI_NULL;
753     hi_unused(private_data);
754     if (argp == 0) {
755         return -EFAULT;
756     }
757     deflicker_level = (hi_tde_deflicker_level *)(uintptr_t)argp;
758 #if (TDE_CAPABILITY & DEFLICKER)
759     if (tde_osi_get_deflicker_level(deflicker_level) != HI_SUCCESS) {
760         return HI_ERR_TDE_NULL_PTR;
761     }
762 #else
763     *deflicker_level = HI_TDE_DEFLICKER_LEVEL_AUTO;
764 #endif
765     return HI_SUCCESS;
766 }
767 
tde_osr_set_alpha_threshold_value(unsigned long argp,hi_void * private_data)768 static hi_s32 tde_osr_set_alpha_threshold_value(unsigned long argp, hi_void *private_data)
769 {
770     hi_u8 alpha_threshold_value;
771     hi_unused(private_data);
772     if (argp == 0) {
773         return -EFAULT;
774     }
775     alpha_threshold_value = *(hi_u8 *)(uintptr_t)argp;
776 
777     return tde_osi_set_alpha_threshold_value(alpha_threshold_value);
778 }
779 
tde_osr_get_alpha_threshold_value(unsigned long argp,hi_void * private_data)780 static hi_s32 tde_osr_get_alpha_threshold_value(unsigned long argp, hi_void *private_data)
781 {
782     hi_u8 *alpha_threshold_value = HI_NULL;
783     hi_unused(private_data);
784     if (argp == 0) {
785         return -EFAULT;
786     }
787     alpha_threshold_value = (hi_u8 *)(uintptr_t)argp;
788 
789     if (tde_osi_get_alpha_threshold_value(alpha_threshold_value)) {
790         return HI_ERR_TDE_NULL_PTR;
791     }
792 
793     return HI_SUCCESS;
794 }
795 
tde_osr_set_alpha_threshold_state(unsigned long argp,hi_void * private_data)796 static hi_s32 tde_osr_set_alpha_threshold_state(unsigned long argp, hi_void *private_data)
797 {
798     hi_bool alpha_threshold_en = HI_FALSE;
799     hi_unused(private_data);
800     if (argp == 0) {
801         return -EFAULT;
802     }
803     alpha_threshold_en = *(hi_bool *)(uintptr_t)argp;
804 
805     return tde_osi_set_alpha_threshold_state(alpha_threshold_en);
806 }
807 
tde_osr_get_alpha_threshold_state(unsigned long argp,hi_void * private_data)808 static hi_s32 tde_osr_get_alpha_threshold_state(unsigned long argp, hi_void *private_data)
809 {
810     hi_bool alpha_threshold_en = HI_FALSE;
811     hi_unused(private_data);
812     if (argp == 0) {
813         return -EFAULT;
814     }
815     tde_osi_get_alpha_threshold_state(&alpha_threshold_en);
816 
817     *(hi_bool *)(uintptr_t)argp = alpha_threshold_en;
818 
819     return HI_SUCCESS;
820 }
821 
tde_osr_pattern_fill(unsigned long argp,hi_void * private_data)822 static hi_s32 tde_osr_pattern_fill(unsigned long argp, hi_void *private_data)
823 {
824     hi_tde_surface back_ground_surface = {0};
825     hi_tde_surface fore_ground_surface = {0};
826     hi_tde_surface dst_surface = {0};
827 
828     hi_tde_double_src double_src = {0};
829     hi_tde_pattern_fill_opt *opt = HI_NULL;
830     drv_tde_pattern_fill_cmd *pattern_fill_cmd = HI_NULL;
831     hi_unused(private_data);
832     if (argp == 0) {
833         return -EFAULT;
834     }
835     pattern_fill_cmd = (drv_tde_pattern_fill_cmd *)(uintptr_t)argp;
836 
837     convert_surface(&back_ground_surface, &(pattern_fill_cmd->back_ground_surface));
838     convert_surface(&fore_ground_surface, &(pattern_fill_cmd->fore_ground_surface));
839     convert_surface(&dst_surface, &(pattern_fill_cmd->dst_surface));
840 
841     double_src.bg_surface = ((pattern_fill_cmd->null_indicator >> 1) & 1) ? HI_NULL : &(back_ground_surface);
842     double_src.bg_rect = ((pattern_fill_cmd->null_indicator >> 2) & 1) ? HI_NULL : /* 2 Take the high */
843         &(pattern_fill_cmd->back_ground_rect);
844     double_src.fg_surface = ((pattern_fill_cmd->null_indicator >> 3) & 1) ? HI_NULL : /* 3 Take the high */
845         &(fore_ground_surface);
846     double_src.fg_rect = ((pattern_fill_cmd->null_indicator >> 4) & 1) ? HI_NULL : /* 4 Take the high */
847         &(pattern_fill_cmd->fore_ground_rect);
848     double_src.dst_surface = ((pattern_fill_cmd->null_indicator >> 5) & 1) ? /* 5 Take the high */
849         HI_NULL : &(dst_surface);
850     double_src.dst_rect = ((pattern_fill_cmd->null_indicator >> 6) & 1) ? HI_NULL : /* 6 Take the high */
851         &(pattern_fill_cmd->dst_rect);
852     opt = ((pattern_fill_cmd->null_indicator >> 7) & 1) ? HI_NULL : /* 7 Take the high */
853         &(pattern_fill_cmd->option);
854 
855     return tde_osi_pattern_fill(pattern_fill_cmd->handle, &double_src, opt);
856 }
857 
tde_osr_enable_region_deflicker(unsigned long argp,hi_void * private_data)858 static hi_s32 tde_osr_enable_region_deflicker(unsigned long argp, hi_void *private_data)
859 {
860     hi_bool is_region_deflicker = HI_FALSE;
861     hi_unused(private_data);
862     if (argp == 0) {
863         return -EFAULT;
864     }
865     is_region_deflicker = *(hi_bool *)(uintptr_t)argp;
866 
867     return tde_osi_enable_region_deflicker(is_region_deflicker);
868 }
869 
tde_osr_rotate(unsigned long argp,hi_void * private_data)870 static hi_s32 tde_osr_rotate(unsigned long argp, hi_void *private_data)
871 {
872     hi_tde_surface dst_surface = {0};
873     hi_tde_surface src_surface = {0};
874     tde_rotate_cmd *rotate_cmd = HI_NULL;
875     hi_tde_single_src single_src = {0};
876     hi_unused(private_data);
877     if (argp == 0) {
878         return -EFAULT;
879     }
880     rotate_cmd = (tde_rotate_cmd *)(uintptr_t)argp;
881 
882     convert_surface(&src_surface, &(rotate_cmd->src_surface));
883     convert_surface(&dst_surface, &(rotate_cmd->dst_surface));
884 
885     single_src.src_surface = &src_surface;
886     single_src.src_rect = &(rotate_cmd->src_rect);
887     single_src.dst_surface = &dst_surface;
888     single_src.dst_rect = &(rotate_cmd->dst_rect);
889     return tde_osi_quick_rotate(rotate_cmd->handle, &single_src, rotate_cmd->rotate_angle);
890 }
891 
892 #ifdef TDE_COREDUMP_DEBUG
893 #define tde_read_reg(base, offset) (*(volatile unsigned int *)((void *)(base) + (offset)))
894 #endif
895 
tde_osr_isr(int irq,hi_void * dev_id)896 static int tde_osr_isr(int irq, hi_void *dev_id)
897 {
898     hi_u32 int_status;
899     hi_unused(irq);
900     hi_unused(dev_id);
901 #ifdef TDE_TIME_COUNT
902     (hi_void) osal_gettimeofday(&g_time_start);
903 #endif
904     int_status = tde_hal_ctl_int_status();
905     if (int_status & TDE_DRV_INT_ERROR) {
906 #ifdef TDE_COREDUMP_DEBUG
907         hi_u32 read_stats;
908         hi_u32 i;
909         for (i = 0; i < 74; i++) { /* 74 Error output */
910             read_stats = tde_read_reg(tde_hal_get_base_vir_addr(), (0x800 + i * 4)); /* 4 alg data */
911             tde_error("\n--------- ADDR:0x%x Value:0x%x---------\n", (0x800 + (i * 4)), read_stats); /* 4 alg data */
912         }
913 #endif
914         tde_error("tde interrupts coredump!\n");
915         tde_hal_resume_init();
916 
917         return OSAL_IRQ_HANDLED;
918     }
919 
920     if (int_status & TDE_DRV_INT_TIMEOUT) {
921         tde_error("tde hardware timeout!\n");
922 
923         tde_hal_resume_init();
924         return OSAL_IRQ_HANDLED;
925     }
926 
927     tde_info("tde register int status: 0x%x!\n", (hi_u32)int_status);
928 
929     tde_tasklet_func(int_status);
930 
931     return OSAL_IRQ_HANDLED;
932 }
933 
tde_tasklet_func(unsigned long int_status)934 static void tde_tasklet_func(unsigned long int_status)
935 {
936     unsigned long lockflags;
937     tde_spin_lock(&g_task_let_lock, lockflags);
938 
939 #ifndef __RTOS__
940     tde_tasklet.data &= (~int_status);
941 #endif
942 
943     tde_spin_unlock(&g_task_let_lock, lockflags);
944 #ifdef TDE_TIME_COUNT
945     (hi_void) osal_gettimeofday(&g_time_end);
946 
947     g_time_diff = (g_time_end.tv_sec - g_time_start.tv_sec) * 1000000 + /* 1000000 expand */
948         (g_time_end.tv_usec - g_time_start.tv_usec);
949     tde_info("tde int status: 0x%x, g_u64TimeDiff:%d!\n", (hi_u32)int_status, (hi_u32)g_time_diff);
950 #endif
951 
952 #ifdef TDE_HWC_COOPERATE
953     if (int_status & TDE_DRV_INT_NODE) {
954         tde_osi_list_node_comp();
955     }
956     tde_osi_list_comp();
957 #else
958     if (int_status & TDE_DRV_INT_NODE_COMP_AQ) {
959         tde_osi_list_node_comp();
960     }
961 #endif
962 }
963 
964 #ifdef CONFIG_TDE_PM_ENABLE
965 /* tde wait for start  */
tde_pm_suspend(pm_basedev * pdev,pm_message_t state)966 int tde_pm_suspend(pm_basedev *pdev, pm_message_t state)
967 {
968     tde_osi_wait_all_done(HI_FALSE);
969 
970     tde_hal_suspend();
971 
972     HI_PRINT("TDE suspend OK\n");
973 
974     return HI_SUCCESS;
975 }
976 
977 /* wait for resume */
tde_pm_resume(pm_basedev * pdev)978 int tde_pm_resume(pm_basedev *pdev)
979 {
980     if (osal_atomic_read(&g_tde_count) > 0) {
981         tde_hal_resume_init();
982     }
983     HI_PRINT("TDE resume OK\n");
984 
985     return HI_SUCCESS;
986 }
987 #endif
tde_osi_open(hi_void)988 hi_s32 tde_osi_open(hi_void)
989 {
990     return tde_open(HI_NULL);
991 }
992 
tde_osi_close(hi_void)993 hi_s32 tde_osi_close(hi_void)
994 {
995     return tde_release(HI_NULL);
996 }
997 
998 #endif
999