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:
Cheng Wang
2023-07-04 15:05:57 +08:00
committed by gerrit autosubmit
parent 3e73a1874e
commit 4e014889e7
3 changed files with 32 additions and 17 deletions
+15
View File
@@ -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);
+1 -1
View File
@@ -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;
+16 -16
View File
@@ -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);