mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
frc: add frc security workaround [1/1]
PD#SWPL-128738 Problem: the vsync interrupt exit leads to restart Solution: add process function starts FRC buf security Verify: T3X Change-Id: I465f375dfe7c84840e83b5a9e13c60a88d7b7c46 Signed-off-by: Cheng Wang <cheng.wang@amlogic.com>
This commit is contained in:
committed by
gerrit autosubmit
parent
3e73a1874e
commit
4e014889e7
@@ -931,6 +931,19 @@ static void frc_clock_workaround(struct work_struct *work)
|
||||
pr_frc(1, "%s, clk_new state:%d\n", __func__, devp->clk_state);
|
||||
}
|
||||
|
||||
static void frc_secure_workaround(struct work_struct *work)
|
||||
{
|
||||
struct frc_dev_s *devp = container_of(work,
|
||||
struct frc_dev_s, frc_secure_work);
|
||||
|
||||
if (unlikely(!devp)) {
|
||||
PR_ERR("%s err, devp is NULL\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
frc_mm_secure_set(devp);
|
||||
}
|
||||
|
||||
static void frc_drv_initial(struct frc_dev_s *devp)
|
||||
{
|
||||
struct vinfo_s *vinfo = get_current_vinfo();
|
||||
@@ -1197,6 +1210,7 @@ static int frc_probe(struct platform_device *pdev)
|
||||
// #endif
|
||||
INIT_WORK(&frc_devp->frc_clk_work, frc_clock_workaround);
|
||||
INIT_WORK(&frc_devp->frc_print_work, frc_debug_table_print);
|
||||
INIT_WORK(&frc_devp->frc_secure_work, frc_secure_workaround);
|
||||
frc_devp->clk_chg = 1;
|
||||
frc_set_enter_forcefilm(frc_devp, 0);
|
||||
|
||||
@@ -1245,6 +1259,7 @@ static int __exit frc_remove(struct platform_device *pdev)
|
||||
// frc_devp = platform_get_drvdata(pdev);
|
||||
cancel_work_sync(&frc_devp->frc_clk_work);
|
||||
cancel_work_sync(&frc_devp->frc_print_work);
|
||||
cancel_work_sync(&frc_devp->frc_secure_work);
|
||||
tasklet_kill(&frc_devp->input_tasklet);
|
||||
tasklet_kill(&frc_devp->output_tasklet);
|
||||
tasklet_disable(&frc_devp->input_tasklet);
|
||||
|
||||
@@ -643,7 +643,7 @@ struct frc_dev_s {
|
||||
//struct work_struct frc_work;
|
||||
struct work_struct frc_clk_work;
|
||||
struct work_struct frc_print_work;
|
||||
|
||||
struct work_struct frc_secure_work;
|
||||
|
||||
struct st_frc_sts frc_sts;
|
||||
struct st_frc_in_sts in_sts;
|
||||
|
||||
@@ -443,7 +443,7 @@ int frc_update_in_sts(struct frc_dev_s *devp, struct st_frc_in_sts *frc_in_sts,
|
||||
/*secure mode*/
|
||||
if (devp->in_sts.secure_mode &&
|
||||
!secure_tee_handle && devp->buf.cma_mem_alloced)
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
|
||||
if (frc_in_sts->frc_hd_start_lines != cur_video_sts->VPP_hd_start_lines_ ||
|
||||
frc_in_sts->frc_hd_end_lines != cur_video_sts->VPP_hd_end_lines_) {
|
||||
@@ -952,14 +952,14 @@ void frc_state_handle_old(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_BYPASS) {
|
||||
set_frc_bypass(ON);
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
devp->frc_sts.frame_cnt = 0;
|
||||
pr_frc(log, "sm state change %s -> %s\n",
|
||||
frc_state_ary[cur_state], frc_state_ary[new_state]);
|
||||
frc_state_change_finish(devp);
|
||||
} else if (new_state == FRC_STATE_ENABLE) {
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_hw_initial(devp);
|
||||
//first : set bypass off
|
||||
set_frc_bypass(OFF);
|
||||
@@ -983,7 +983,7 @@ void frc_state_handle_old(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_DISABLE) {
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
set_frc_enable(OFF);
|
||||
devp->frc_sts.frame_cnt++;
|
||||
} else {
|
||||
@@ -996,7 +996,7 @@ void frc_state_handle_old(struct frc_dev_s *devp)
|
||||
} else if (new_state == FRC_STATE_BYPASS) {
|
||||
//first frame set enable off
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
set_frc_enable(OFF);
|
||||
//set_frc_bypass(OFF);
|
||||
devp->frc_sts.frame_cnt++;
|
||||
@@ -1025,7 +1025,7 @@ void frc_state_handle_old(struct frc_dev_s *devp)
|
||||
frc_state_change_finish(devp);
|
||||
} else if (new_state == FRC_STATE_ENABLE) {
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
//first frame set bypass off
|
||||
set_frc_bypass(OFF);
|
||||
//set_frc_enable(OFF);
|
||||
@@ -1082,7 +1082,7 @@ void frc_state_handle(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_BYPASS) {
|
||||
set_frc_bypass(ON);
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
devp->frc_sts.frame_cnt = 0;
|
||||
pr_frc(log, "stat_chg %s -> %s done\n",
|
||||
frc_state_ary[cur_state],
|
||||
@@ -1096,7 +1096,7 @@ void frc_state_handle(struct frc_dev_s *devp)
|
||||
schedule_work(&devp->frc_clk_work);
|
||||
} else if (devp->clk_state == FRC_CLOCK_NOR &&
|
||||
devp->buf.cma_mem_alloced) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
// clk_set_rate(devp->clk_frc, 667000000);
|
||||
get_vout_info(devp);
|
||||
frc_hw_initial(devp);
|
||||
@@ -1148,7 +1148,7 @@ void frc_state_handle(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_DISABLE) {
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_frame_forcebuf_enable(0);
|
||||
set_frc_enable(OFF);
|
||||
devp->frc_sts.frame_cnt++;
|
||||
@@ -1162,7 +1162,7 @@ void frc_state_handle(struct frc_dev_s *devp)
|
||||
} else if (new_state == FRC_STATE_BYPASS) {
|
||||
//first frame set enable off
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_frame_forcebuf_enable(0);
|
||||
set_frc_enable(OFF);
|
||||
//set_frc_bypass(OFF);
|
||||
@@ -1212,7 +1212,7 @@ void frc_state_handle(struct frc_dev_s *devp)
|
||||
} else if (devp->clk_state == FRC_CLOCK_NOR &&
|
||||
devp->buf.cma_mem_alloced) {
|
||||
//first frame set bypass off
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
get_vout_info(devp);
|
||||
frc_hw_initial(devp);
|
||||
set_frc_bypass(OFF);
|
||||
@@ -1303,7 +1303,7 @@ void frc_state_handle_new(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_BYPASS) {
|
||||
set_frc_bypass(ON);
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
devp->frc_sts.frame_cnt = 0;
|
||||
pr_frc(log, "stat_chg %s -> %s done\n",
|
||||
frc_state_ary[cur_state],
|
||||
@@ -1318,7 +1318,7 @@ void frc_state_handle_new(struct frc_dev_s *devp)
|
||||
schedule_work(&devp->frc_clk_work);
|
||||
} else if (devp->clk_state == FRC_CLOCK_NOR &&
|
||||
devp->buf.cma_mem_alloced) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
// clk_set_rate(devp->clk_frc, 667000000);
|
||||
get_vout_info(devp);
|
||||
frc_hw_initial(devp);
|
||||
@@ -1402,7 +1402,7 @@ void frc_state_handle_new(struct frc_dev_s *devp)
|
||||
if (state_changed) {
|
||||
if (new_state == FRC_STATE_DISABLE) {
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_frame_forcebuf_enable(0);
|
||||
set_frc_enable(OFF);
|
||||
devp->frc_sts.frame_cnt++;
|
||||
@@ -1416,7 +1416,7 @@ void frc_state_handle_new(struct frc_dev_s *devp)
|
||||
} else if (new_state == FRC_STATE_BYPASS) {
|
||||
//first frame set enable off
|
||||
if (devp->frc_sts.frame_cnt == 0) {
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_frame_forcebuf_enable(0);
|
||||
set_frc_enable(OFF);
|
||||
//set_frc_bypass(OFF);
|
||||
@@ -1466,7 +1466,7 @@ void frc_state_handle_new(struct frc_dev_s *devp)
|
||||
} else if (devp->clk_state == FRC_CLOCK_NOR &&
|
||||
devp->buf.cma_mem_alloced) {
|
||||
//first frame set bypass off
|
||||
frc_mm_secure_set(devp);
|
||||
schedule_work(&devp->frc_secure_work);
|
||||
frc_memc_clr_vbuffer(devp, 1);
|
||||
get_vout_info(devp);
|
||||
frc_hw_initial(devp);
|
||||
|
||||
Reference in New Issue
Block a user