diff --git a/msm/eva/msm_cvp.c b/msm/eva/msm_cvp.c index 7dc170be3f..df5ada125d 100644 --- a/msm/eva/msm_cvp.c +++ b/msm/eva/msm_cvp.c @@ -427,7 +427,7 @@ static int cvp_check_clock(struct msm_cvp_inst *inst, u32 avg_cycles = core->dyn_clk.cycle[i].total>>3; if ((avg_cycles > core->dyn_clk.hi_ctrl_lim[i]) - || (avg_cycles <= + || (avg_cycles <= core->dyn_clk.lo_ctrl_lim[i])) { rc = cvp_readjust_clock(core, avg_cycles, @@ -479,13 +479,24 @@ static int cvp_fence_proc(struct msm_cvp_inst *inst, timeout = msecs_to_jiffies(CVP_MAX_WAIT_TIME); rc = cvp_wait_process_message(inst, sq, &ktid, timeout, (struct eva_kmd_hfi_packet *)&hdr); - if (get_msg_size((struct cvp_hfi_msg_session_hdr *) &hdr) - == sizeof(struct cvp_hfi_msg_session_hdr_ext)) { + + /* Only FD support dcvs at certain FW */ + if (hdr.size == sizeof(struct cvp_hfi_msg_session_hdr_ext) + + sizeof(struct cvp_hfi_buf_type) ) { struct cvp_hfi_msg_session_hdr_ext *fhdr = (struct cvp_hfi_msg_session_hdr_ext *)&hdr; - dprintk(CVP_HFI, "busy cycle 0x%x, total 0x%x\n", + struct msm_cvp_core *core = inst->core; + dprintk(CVP_PWR, "busy cycle %d, total %d\n", fhdr->busy_cycles, fhdr->total_cycles); - clock_check = true; + + if (core && + (core->dyn_clk.sum_fps[HFI_HW_FDU] || + core->dyn_clk.sum_fps[HFI_HW_MPU] || + core->dyn_clk.sum_fps[HFI_HW_OD] || + core->dyn_clk.sum_fps[HFI_HW_ICA])) + { + clock_check = true; + } } hfi_err = hdr.error_type; if (rc) { @@ -755,6 +766,10 @@ static void aggregate_power_update(struct msm_cvp_core *core, unsigned long op_fdu_max[2] = {0}, op_od_max[2] = {0}; unsigned long op_mpu_max[2] = {0}, op_ica_max[2] = {0}; unsigned long op_fw_max[2] = {0}, bw_sum[2] = {0}, op_bw_max[2] = {0}; + core->dyn_clk.sum_fps[HFI_HW_FDU] = 0; + core->dyn_clk.sum_fps[HFI_HW_MPU] = 0; + core->dyn_clk.sum_fps[HFI_HW_OD] = 0; + core->dyn_clk.sum_fps[HFI_HW_ICA] = 0; list_for_each_entry(inst, &core->instances, list) { if (inst->state == MSM_CVP_CORE_INVALID ||