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