Loading drivers/media/platform/msm/vidc/msm_vdec.c +9 −1 Original line number Diff line number Diff line Loading @@ -1652,7 +1652,15 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, break; } *num_buffers = max(*num_buffers, bufreq->buffer_count_min); /* Pretend as if FW itself is asking for * additional buffers. * *num_buffers += MSM_VIDC_ADDITIONAL_BUFS_FOR_DCVS * is wrong since it will end up increasing the count * on every call to reqbufs if *num_bufs is larger * than min requirement. */ *num_buffers = max(*num_buffers, bufreq->buffer_count_min + msm_dcvs_get_extra_buff_count(inst)); min_buff_count = (!!(inst->flags & VIDC_THUMBNAIL)) ? MIN_NUM_THUMBNAIL_MODE_CAPTURE_BUFFERS : Loading drivers/media/platform/msm/vidc/msm_vidc_common.c +0 −3 Original line number Diff line number Diff line Loading @@ -28,9 +28,6 @@ __rc; \ }) #define IS_VALID_DCVS_SESSION(__cur_mbpf, __min_mbpf) \ ((__cur_mbpf) >= (__min_mbpf)) #define SUM_ARRAY(__arr, __start, __end) ({\ int __index;\ typeof((__arr)[0]) __sum = 0;\ Loading drivers/media/platform/msm/vidc/msm_vidc_dcvs.c +46 −35 Original line number Diff line number Diff line Loading @@ -19,7 +19,8 @@ #define IS_VALID_DCVS_SESSION(__cur_mbpf, __min_mbpf) \ ((__cur_mbpf) >= (__min_mbpf)) static int msm_dcvs_check_supported(struct msm_vidc_inst *inst); static bool msm_dcvs_check_supported(struct msm_vidc_inst *inst); static bool msm_dcvs_enc_check(struct msm_vidc_inst *inst); static int msm_dcvs_enc_scale_clocks(struct msm_vidc_inst *inst); static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd); Loading Loading @@ -57,18 +58,9 @@ static void msm_dcvs_enc_check_and_scale_clocks(struct msm_vidc_inst *inst) int rc = 0; if (inst->session_type == MSM_VIDC_ENCODER && msm_vidc_enc_dcvs_mode) { rc = msm_dcvs_check_supported(inst); if (!rc) { inst->dcvs_mode = true; dprintk(VIDC_DBG, "%s: session DCVS supported, enc_dcvs_mode = %d\n", __func__, inst->dcvs_mode); } else { inst->dcvs_mode = false; dprintk(VIDC_DBG, "%s: session DCVS not supported, enc_dcvs_mode = %d\n", __func__, inst->dcvs_mode); } inst->dcvs_mode = msm_dcvs_check_supported(inst); dprintk(VIDC_DBG, "%s: session DCVS %s supported\n", __func__, inst->dcvs_mode ? "" : "not"); if (inst->dcvs_mode) { rc = msm_dcvs_enc_scale_clocks(inst); Loading @@ -87,8 +79,7 @@ static void msm_dcvs_dec_check_and_scale_clocks(struct msm_vidc_inst *inst) if (inst->session_type != MSM_VIDC_DECODER) return; rc = msm_dcvs_check_supported(inst); if (!rc) { if (msm_dcvs_check_supported(inst)) { inst->dcvs_mode = true; dprintk(VIDC_DBG, "%s: session DCVS supported, decode_dcvs_mode = %d\n", Loading Loading @@ -126,7 +117,7 @@ void msm_dcvs_check_and_scale_clocks(struct msm_vidc_inst *inst, bool is_etb) static inline int get_pending_bufs_fw(struct msm_vidc_inst *inst) { int fw_out_qsize = 0; int fw_out_qsize = 0, buffers_in_driver = 0; if (!inst) { dprintk(VIDC_ERR, "%s Invalid args\n", __func__); Loading @@ -134,10 +125,21 @@ static inline int get_pending_bufs_fw(struct msm_vidc_inst *inst) } if (inst->state >= MSM_VIDC_OPEN_DONE && inst->state < MSM_VIDC_STOP_DONE) inst->state < MSM_VIDC_STOP_DONE) { struct buffer_info *temp = NULL; fw_out_qsize = inst->count.ftb - inst->count.fbd; return fw_out_qsize; list_for_each_entry(temp, &inst->registeredbufs.list, list) { if (temp->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && !temp->inactive && atomic_read(&temp->ref_count) == 2) { buffers_in_driver++; } } } return fw_out_qsize + buffers_in_driver; } static inline void msm_dcvs_print_dcvs_stats(struct dcvs_stats *dcvs) Loading Loading @@ -258,8 +260,9 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) mutex_unlock(&inst->lock); return; } total_output_buf = output_buf_req->buffer_count_actual; fw_pending_bufs = get_pending_bufs_fw(inst) + 1; fw_pending_bufs = get_pending_bufs_fw(inst); mutex_unlock(&inst->lock); buffers_outside_fw = total_output_buf - fw_pending_bufs; Loading @@ -278,25 +281,30 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) if (dcvs->num_ftb[i] > new_ftb) new_ftb = dcvs->num_ftb[i]; } dcvs->threshold_disp_buf_high = new_ftb; if (dcvs->threshold_disp_buf_high <= dcvs->threshold_disp_buf_low) { dcvs->threshold_disp_buf_low + DCVS_DEC_EXTRA_OUTPUT_BUFFERS) { dcvs->threshold_disp_buf_high = dcvs->threshold_disp_buf_low + DCVS_BUFFER_SAFEGUARD; DCVS_DEC_EXTRA_OUTPUT_BUFFERS + (DCVS_DEC_EXTRA_OUTPUT_BUFFERS == 0); } dcvs->threshold_disp_buf_high = clamp(dcvs->threshold_disp_buf_high, dcvs->min_threshold, dcvs->max_threshold); } if (dcvs->ftb_counter == DCVS_FTB_WINDOW && dcvs->load == dcvs->load_low) { prev_buf_count = dcvs->num_ftb[((dcvs->ftb_index - 2 + DCVS_FTB_WINDOW) % DCVS_FTB_WINDOW)]; if (prev_buf_count == DCVS_MIN_DISPLAY_BUFF && buffers_outside_fw == DCVS_MIN_DISPLAY_BUFF) { buffers_outside_fw <= DCVS_MIN_DISPLAY_BUFF) { dcvs->transition_turbo = true; } else if (buffers_outside_fw > DCVS_MIN_DISPLAY_BUFF && (buffers_outside_fw - Loading @@ -305,6 +313,7 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) dcvs->transition_turbo = true; } } dprintk(VIDC_PROF, "DCVS: total_output_buf %d buffers_outside_fw %d load %d transition_turbo %d\n", total_output_buf, buffers_outside_fw, dcvs->load_low, Loading Loading @@ -406,8 +415,7 @@ static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd) core = inst->core; dcvs = &inst->dcvs; mutex_lock(&inst->lock); fw_pending_bufs = get_pending_bufs_fw(inst) + (fbd ? 0 : 1); fw_pending_bufs = get_pending_bufs_fw(inst); output_buf_req = get_buff_req_buffer(inst, msm_comm_get_hal_output_buffer(inst)); Loading Loading @@ -461,7 +469,7 @@ static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd) return rc; } bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) static bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) { int num_mbs_per_frame = 0; bool dcvs_check_passed = false, is_codec_supported = false; Loading @@ -487,11 +495,9 @@ bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) return dcvs_check_passed; } static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) static bool msm_dcvs_check_supported(struct msm_vidc_inst *inst) { int rc = 0; int num_mbs_per_frame = 0; int instance_count = 0; int num_mbs_per_frame = 0, instance_count = 0; struct msm_vidc_inst *temp = NULL; struct msm_vidc_core *core; struct hal_buffer_requirements *output_buf_req; Loading Loading @@ -525,22 +531,21 @@ static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) if (!is_codec_supported || !IS_VALID_DCVS_SESSION(num_mbs_per_frame, DCVS_MIN_SUPPORTED_MBPERFRAME)) return -ENOTSUPP; return false; if (!output_buf_req) { dprintk(VIDC_ERR, "%s: No buffer requirement for buffer type %x\n", __func__, HAL_BUFFER_OUTPUT); return -EINVAL; return false; } } else if (instance_count == 1 && inst->session_type == MSM_VIDC_ENCODER && !msm_comm_turbo_session(inst)) { if (!msm_dcvs_enc_check(inst) || !inst->dcvs.is_additional_buff_added) return -ENOTSUPP; return false; } else { rc = -ENOTSUPP; /* * For multiple instance use case with 4K, clocks will be scaled * as per load in streamon, but the clocks may be scaled Loading Loading @@ -569,8 +574,11 @@ static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) temp->dcvs_mode = false; mutex_unlock(&core->lock); } return false; } return rc; return true; } int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) Loading @@ -579,7 +587,7 @@ int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) if (!inst) { dprintk(VIDC_ERR, "%s Invalid args\n", __func__); return -EINVAL; return 0; } if (inst->session_type == MSM_VIDC_ENCODER) { Loading @@ -587,6 +595,9 @@ int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) if (!inst->dcvs.is_additional_buff_added) extra_buffer = DCVS_ENC_EXTRA_OUTPUT_BUFFERS; } } else if (inst->session_type == MSM_VIDC_DECODER) { if (msm_dcvs_check_supported(inst)) extra_buffer = DCVS_DEC_EXTRA_OUTPUT_BUFFERS; } return extra_buffer; } Loading drivers/media/platform/msm/vidc/msm_vidc_dcvs.h +2 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ #define DCVS_ENC_HIGH_THR 9 /* extra o/p buffers in case of encoder dcvs */ #define DCVS_ENC_EXTRA_OUTPUT_BUFFERS 2 /* extra o/p buffers in case of decoder dcvs */ #define DCVS_DEC_EXTRA_OUTPUT_BUFFERS 4 /* Default threshold to reduce the core frequency */ #define DCVS_NOMINAL_THRESHOLD 8 /* Default threshold to increase the core frequency */ Loading @@ -43,7 +45,6 @@ void msm_dcvs_init(struct msm_vidc_inst *inst); void msm_dcvs_init_load(struct msm_vidc_inst *inst); bool msm_dcvs_enc_check(struct msm_vidc_inst *inst); void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst); void msm_dcvs_check_and_scale_clocks(struct msm_vidc_inst *inst, bool is_etb); int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst); Loading drivers/media/platform/msm/vidc/msm_vidc_debug.c +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ int msm_vidc_fw_low_power_mode = 1; int msm_vidc_hw_rsp_timeout = 1000; int msm_vidc_fw_coverage = 0; int msm_vidc_vpe_csc_601_to_709 = 0; int msm_vidc_dec_dcvs_mode = 0; int msm_vidc_dec_dcvs_mode = 1; int msm_vidc_enc_dcvs_mode = 1; int msm_vidc_sys_idle_indicator = 0; int msm_vidc_firmware_unload_delay = 15000; Loading Loading
drivers/media/platform/msm/vidc/msm_vdec.c +9 −1 Original line number Diff line number Diff line Loading @@ -1652,7 +1652,15 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, break; } *num_buffers = max(*num_buffers, bufreq->buffer_count_min); /* Pretend as if FW itself is asking for * additional buffers. * *num_buffers += MSM_VIDC_ADDITIONAL_BUFS_FOR_DCVS * is wrong since it will end up increasing the count * on every call to reqbufs if *num_bufs is larger * than min requirement. */ *num_buffers = max(*num_buffers, bufreq->buffer_count_min + msm_dcvs_get_extra_buff_count(inst)); min_buff_count = (!!(inst->flags & VIDC_THUMBNAIL)) ? MIN_NUM_THUMBNAIL_MODE_CAPTURE_BUFFERS : Loading
drivers/media/platform/msm/vidc/msm_vidc_common.c +0 −3 Original line number Diff line number Diff line Loading @@ -28,9 +28,6 @@ __rc; \ }) #define IS_VALID_DCVS_SESSION(__cur_mbpf, __min_mbpf) \ ((__cur_mbpf) >= (__min_mbpf)) #define SUM_ARRAY(__arr, __start, __end) ({\ int __index;\ typeof((__arr)[0]) __sum = 0;\ Loading
drivers/media/platform/msm/vidc/msm_vidc_dcvs.c +46 −35 Original line number Diff line number Diff line Loading @@ -19,7 +19,8 @@ #define IS_VALID_DCVS_SESSION(__cur_mbpf, __min_mbpf) \ ((__cur_mbpf) >= (__min_mbpf)) static int msm_dcvs_check_supported(struct msm_vidc_inst *inst); static bool msm_dcvs_check_supported(struct msm_vidc_inst *inst); static bool msm_dcvs_enc_check(struct msm_vidc_inst *inst); static int msm_dcvs_enc_scale_clocks(struct msm_vidc_inst *inst); static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd); Loading Loading @@ -57,18 +58,9 @@ static void msm_dcvs_enc_check_and_scale_clocks(struct msm_vidc_inst *inst) int rc = 0; if (inst->session_type == MSM_VIDC_ENCODER && msm_vidc_enc_dcvs_mode) { rc = msm_dcvs_check_supported(inst); if (!rc) { inst->dcvs_mode = true; dprintk(VIDC_DBG, "%s: session DCVS supported, enc_dcvs_mode = %d\n", __func__, inst->dcvs_mode); } else { inst->dcvs_mode = false; dprintk(VIDC_DBG, "%s: session DCVS not supported, enc_dcvs_mode = %d\n", __func__, inst->dcvs_mode); } inst->dcvs_mode = msm_dcvs_check_supported(inst); dprintk(VIDC_DBG, "%s: session DCVS %s supported\n", __func__, inst->dcvs_mode ? "" : "not"); if (inst->dcvs_mode) { rc = msm_dcvs_enc_scale_clocks(inst); Loading @@ -87,8 +79,7 @@ static void msm_dcvs_dec_check_and_scale_clocks(struct msm_vidc_inst *inst) if (inst->session_type != MSM_VIDC_DECODER) return; rc = msm_dcvs_check_supported(inst); if (!rc) { if (msm_dcvs_check_supported(inst)) { inst->dcvs_mode = true; dprintk(VIDC_DBG, "%s: session DCVS supported, decode_dcvs_mode = %d\n", Loading Loading @@ -126,7 +117,7 @@ void msm_dcvs_check_and_scale_clocks(struct msm_vidc_inst *inst, bool is_etb) static inline int get_pending_bufs_fw(struct msm_vidc_inst *inst) { int fw_out_qsize = 0; int fw_out_qsize = 0, buffers_in_driver = 0; if (!inst) { dprintk(VIDC_ERR, "%s Invalid args\n", __func__); Loading @@ -134,10 +125,21 @@ static inline int get_pending_bufs_fw(struct msm_vidc_inst *inst) } if (inst->state >= MSM_VIDC_OPEN_DONE && inst->state < MSM_VIDC_STOP_DONE) inst->state < MSM_VIDC_STOP_DONE) { struct buffer_info *temp = NULL; fw_out_qsize = inst->count.ftb - inst->count.fbd; return fw_out_qsize; list_for_each_entry(temp, &inst->registeredbufs.list, list) { if (temp->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && !temp->inactive && atomic_read(&temp->ref_count) == 2) { buffers_in_driver++; } } } return fw_out_qsize + buffers_in_driver; } static inline void msm_dcvs_print_dcvs_stats(struct dcvs_stats *dcvs) Loading Loading @@ -258,8 +260,9 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) mutex_unlock(&inst->lock); return; } total_output_buf = output_buf_req->buffer_count_actual; fw_pending_bufs = get_pending_bufs_fw(inst) + 1; fw_pending_bufs = get_pending_bufs_fw(inst); mutex_unlock(&inst->lock); buffers_outside_fw = total_output_buf - fw_pending_bufs; Loading @@ -278,25 +281,30 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) if (dcvs->num_ftb[i] > new_ftb) new_ftb = dcvs->num_ftb[i]; } dcvs->threshold_disp_buf_high = new_ftb; if (dcvs->threshold_disp_buf_high <= dcvs->threshold_disp_buf_low) { dcvs->threshold_disp_buf_low + DCVS_DEC_EXTRA_OUTPUT_BUFFERS) { dcvs->threshold_disp_buf_high = dcvs->threshold_disp_buf_low + DCVS_BUFFER_SAFEGUARD; DCVS_DEC_EXTRA_OUTPUT_BUFFERS + (DCVS_DEC_EXTRA_OUTPUT_BUFFERS == 0); } dcvs->threshold_disp_buf_high = clamp(dcvs->threshold_disp_buf_high, dcvs->min_threshold, dcvs->max_threshold); } if (dcvs->ftb_counter == DCVS_FTB_WINDOW && dcvs->load == dcvs->load_low) { prev_buf_count = dcvs->num_ftb[((dcvs->ftb_index - 2 + DCVS_FTB_WINDOW) % DCVS_FTB_WINDOW)]; if (prev_buf_count == DCVS_MIN_DISPLAY_BUFF && buffers_outside_fw == DCVS_MIN_DISPLAY_BUFF) { buffers_outside_fw <= DCVS_MIN_DISPLAY_BUFF) { dcvs->transition_turbo = true; } else if (buffers_outside_fw > DCVS_MIN_DISPLAY_BUFF && (buffers_outside_fw - Loading @@ -305,6 +313,7 @@ void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst) dcvs->transition_turbo = true; } } dprintk(VIDC_PROF, "DCVS: total_output_buf %d buffers_outside_fw %d load %d transition_turbo %d\n", total_output_buf, buffers_outside_fw, dcvs->load_low, Loading Loading @@ -406,8 +415,7 @@ static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd) core = inst->core; dcvs = &inst->dcvs; mutex_lock(&inst->lock); fw_pending_bufs = get_pending_bufs_fw(inst) + (fbd ? 0 : 1); fw_pending_bufs = get_pending_bufs_fw(inst); output_buf_req = get_buff_req_buffer(inst, msm_comm_get_hal_output_buffer(inst)); Loading Loading @@ -461,7 +469,7 @@ static int msm_dcvs_dec_scale_clocks(struct msm_vidc_inst *inst, bool fbd) return rc; } bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) static bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) { int num_mbs_per_frame = 0; bool dcvs_check_passed = false, is_codec_supported = false; Loading @@ -487,11 +495,9 @@ bool msm_dcvs_enc_check(struct msm_vidc_inst *inst) return dcvs_check_passed; } static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) static bool msm_dcvs_check_supported(struct msm_vidc_inst *inst) { int rc = 0; int num_mbs_per_frame = 0; int instance_count = 0; int num_mbs_per_frame = 0, instance_count = 0; struct msm_vidc_inst *temp = NULL; struct msm_vidc_core *core; struct hal_buffer_requirements *output_buf_req; Loading Loading @@ -525,22 +531,21 @@ static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) if (!is_codec_supported || !IS_VALID_DCVS_SESSION(num_mbs_per_frame, DCVS_MIN_SUPPORTED_MBPERFRAME)) return -ENOTSUPP; return false; if (!output_buf_req) { dprintk(VIDC_ERR, "%s: No buffer requirement for buffer type %x\n", __func__, HAL_BUFFER_OUTPUT); return -EINVAL; return false; } } else if (instance_count == 1 && inst->session_type == MSM_VIDC_ENCODER && !msm_comm_turbo_session(inst)) { if (!msm_dcvs_enc_check(inst) || !inst->dcvs.is_additional_buff_added) return -ENOTSUPP; return false; } else { rc = -ENOTSUPP; /* * For multiple instance use case with 4K, clocks will be scaled * as per load in streamon, but the clocks may be scaled Loading Loading @@ -569,8 +574,11 @@ static int msm_dcvs_check_supported(struct msm_vidc_inst *inst) temp->dcvs_mode = false; mutex_unlock(&core->lock); } return false; } return rc; return true; } int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) Loading @@ -579,7 +587,7 @@ int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) if (!inst) { dprintk(VIDC_ERR, "%s Invalid args\n", __func__); return -EINVAL; return 0; } if (inst->session_type == MSM_VIDC_ENCODER) { Loading @@ -587,6 +595,9 @@ int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst) if (!inst->dcvs.is_additional_buff_added) extra_buffer = DCVS_ENC_EXTRA_OUTPUT_BUFFERS; } } else if (inst->session_type == MSM_VIDC_DECODER) { if (msm_dcvs_check_supported(inst)) extra_buffer = DCVS_DEC_EXTRA_OUTPUT_BUFFERS; } return extra_buffer; } Loading
drivers/media/platform/msm/vidc/msm_vidc_dcvs.h +2 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ #define DCVS_ENC_HIGH_THR 9 /* extra o/p buffers in case of encoder dcvs */ #define DCVS_ENC_EXTRA_OUTPUT_BUFFERS 2 /* extra o/p buffers in case of decoder dcvs */ #define DCVS_DEC_EXTRA_OUTPUT_BUFFERS 4 /* Default threshold to reduce the core frequency */ #define DCVS_NOMINAL_THRESHOLD 8 /* Default threshold to increase the core frequency */ Loading @@ -43,7 +45,6 @@ void msm_dcvs_init(struct msm_vidc_inst *inst); void msm_dcvs_init_load(struct msm_vidc_inst *inst); bool msm_dcvs_enc_check(struct msm_vidc_inst *inst); void msm_dcvs_monitor_buffer(struct msm_vidc_inst *inst); void msm_dcvs_check_and_scale_clocks(struct msm_vidc_inst *inst, bool is_etb); int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst); Loading
drivers/media/platform/msm/vidc/msm_vidc_debug.c +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ int msm_vidc_fw_low_power_mode = 1; int msm_vidc_hw_rsp_timeout = 1000; int msm_vidc_fw_coverage = 0; int msm_vidc_vpe_csc_601_to_709 = 0; int msm_vidc_dec_dcvs_mode = 0; int msm_vidc_dec_dcvs_mode = 1; int msm_vidc_enc_dcvs_mode = 1; int msm_vidc_sys_idle_indicator = 0; int msm_vidc_firmware_unload_delay = 15000; Loading