Loading msm/vidc/msm_vidc.c +3 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,8 @@ int msm_vidc_qbuf(void *instance, struct v4l2_buffer *b) return -EINVAL; } inst->last_qbuf_time_ns = ktime_get_ns(); for (i = 0; i < b->length; i++) { b->m.planes[i].m.fd = b->m.planes[i].reserved[MSM_VIDC_BUFFER_FD]; Loading Loading @@ -1483,6 +1485,7 @@ void *msm_vidc_open(int core_id, int session_type) inst->max_filled_len = 0; inst->entropy_mode = HFI_H264_ENTROPY_CABAC; inst->full_range = COLOR_RANGE_UNSPECIFIED; inst->active = true; for (i = SESSION_MSG_INDEX(SESSION_MSG_START); i <= SESSION_MSG_INDEX(SESSION_MSG_END); i++) { Loading msm/vidc/msm_vidc_clocks.c +38 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #define MSM_VIDC_MIN_UBWC_COMPRESSION_RATIO (1 << 16) #define MSM_VIDC_MAX_UBWC_COMPRESSION_RATIO (5 << 16) #define MSM_VIDC_SESSION_INACTIVE_THRESHOLD_MS 1000 static int msm_vidc_decide_work_mode_ar50(struct msm_vidc_inst *inst); static unsigned long msm_vidc_calc_freq_ar50(struct msm_vidc_inst *inst, u32 filled_len); Loading Loading @@ -172,6 +174,19 @@ int msm_vidc_get_fps(struct msm_vidc_inst *inst) return fps; } static inline bool is_active_session(u64 prev, u64 curr) { u64 ts_delta; if (!prev || !curr) return true; ts_delta = (prev < curr) ? curr - prev : prev - curr; return ((ts_delta / NSEC_PER_MSEC) <= MSM_VIDC_SESSION_INACTIVE_THRESHOLD_MS); } void update_recon_stats(struct msm_vidc_inst *inst, struct recon_stats_type *recon_stats) { Loading Loading @@ -265,12 +280,14 @@ int msm_comm_set_buses(struct msm_vidc_core *core, u32 sid) struct msm_vidc_inst *inst = NULL; struct hfi_device *hdev; unsigned long total_bw_ddr = 0, total_bw_llcc = 0; u64 curr_time_ns; if (!core || !core->device) { s_vpr_e(sid, "%s: Invalid args: %pK\n", __func__, core); return -EINVAL; } hdev = core->device; curr_time_ns = ktime_get_ns(); mutex_lock(&core->lock); list_for_each_entry(inst, &core->instances, list) { Loading @@ -295,6 +312,12 @@ int msm_comm_set_buses(struct msm_vidc_core *core, u32 sid) continue; } /* skip inactive session bus bandwidth */ if (!is_active_session(inst->last_qbuf_time_ns, curr_time_ns)) { inst->active = false; continue; } if (inst->bus_data.power_mode == VIDC_POWER_TURBO) { total_bw_ddr = total_bw_llcc = INT_MAX; break; Loading Loading @@ -865,8 +888,10 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core, u32 sid) int rc = 0, i = 0; struct allowed_clock_rates_table *allowed_clks_tbl = NULL; bool increment, decrement; u64 curr_time_ns; hdev = core->device; curr_time_ns = ktime_get_ns(); allowed_clks_tbl = core->resources.allowed_clks_tbl; if (!allowed_clks_tbl) { s_vpr_e(sid, "%s: Invalid parameters\n", __func__); Loading Loading @@ -895,6 +920,12 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core, u32 sid) continue; } /* skip inactive session clock rate */ if (!is_active_session(inst->last_qbuf_time_ns, curr_time_ns)) { inst->active = false; continue; } if (inst->clk_data.core_id == VIDC_CORE_ID_1) freq_core_1 += inst->clk_data.min_freq; else if (inst->clk_data.core_id == VIDC_CORE_ID_2) Loading Loading @@ -1018,6 +1049,12 @@ int msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst, bool do_bw_calc) core = inst->core; hdev = core->device; if (!inst->active) { /* do not skip bw voting for inactive -> active session */ do_bw_calc = true; inst->active = true; } if (msm_comm_scale_clocks(inst)) { s_vpr_e(inst->sid, "Failed to scale clocks. May impact performance\n"); Loading @@ -1029,6 +1066,7 @@ int msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst, bool do_bw_calc) "Failed to scale DDR bus. May impact perf\n"); } } return 0; } Loading msm/vidc/msm_vidc_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -560,6 +560,8 @@ struct msm_vidc_inst { bool is_perf_eligible_session; u32 max_filled_len; int full_range; u64 last_qbuf_time_ns; bool active; }; extern struct msm_vidc_drv *vidc_driver; Loading Loading
msm/vidc/msm_vidc.c +3 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,8 @@ int msm_vidc_qbuf(void *instance, struct v4l2_buffer *b) return -EINVAL; } inst->last_qbuf_time_ns = ktime_get_ns(); for (i = 0; i < b->length; i++) { b->m.planes[i].m.fd = b->m.planes[i].reserved[MSM_VIDC_BUFFER_FD]; Loading Loading @@ -1483,6 +1485,7 @@ void *msm_vidc_open(int core_id, int session_type) inst->max_filled_len = 0; inst->entropy_mode = HFI_H264_ENTROPY_CABAC; inst->full_range = COLOR_RANGE_UNSPECIFIED; inst->active = true; for (i = SESSION_MSG_INDEX(SESSION_MSG_START); i <= SESSION_MSG_INDEX(SESSION_MSG_END); i++) { Loading
msm/vidc/msm_vidc_clocks.c +38 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #define MSM_VIDC_MIN_UBWC_COMPRESSION_RATIO (1 << 16) #define MSM_VIDC_MAX_UBWC_COMPRESSION_RATIO (5 << 16) #define MSM_VIDC_SESSION_INACTIVE_THRESHOLD_MS 1000 static int msm_vidc_decide_work_mode_ar50(struct msm_vidc_inst *inst); static unsigned long msm_vidc_calc_freq_ar50(struct msm_vidc_inst *inst, u32 filled_len); Loading Loading @@ -172,6 +174,19 @@ int msm_vidc_get_fps(struct msm_vidc_inst *inst) return fps; } static inline bool is_active_session(u64 prev, u64 curr) { u64 ts_delta; if (!prev || !curr) return true; ts_delta = (prev < curr) ? curr - prev : prev - curr; return ((ts_delta / NSEC_PER_MSEC) <= MSM_VIDC_SESSION_INACTIVE_THRESHOLD_MS); } void update_recon_stats(struct msm_vidc_inst *inst, struct recon_stats_type *recon_stats) { Loading Loading @@ -265,12 +280,14 @@ int msm_comm_set_buses(struct msm_vidc_core *core, u32 sid) struct msm_vidc_inst *inst = NULL; struct hfi_device *hdev; unsigned long total_bw_ddr = 0, total_bw_llcc = 0; u64 curr_time_ns; if (!core || !core->device) { s_vpr_e(sid, "%s: Invalid args: %pK\n", __func__, core); return -EINVAL; } hdev = core->device; curr_time_ns = ktime_get_ns(); mutex_lock(&core->lock); list_for_each_entry(inst, &core->instances, list) { Loading @@ -295,6 +312,12 @@ int msm_comm_set_buses(struct msm_vidc_core *core, u32 sid) continue; } /* skip inactive session bus bandwidth */ if (!is_active_session(inst->last_qbuf_time_ns, curr_time_ns)) { inst->active = false; continue; } if (inst->bus_data.power_mode == VIDC_POWER_TURBO) { total_bw_ddr = total_bw_llcc = INT_MAX; break; Loading Loading @@ -865,8 +888,10 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core, u32 sid) int rc = 0, i = 0; struct allowed_clock_rates_table *allowed_clks_tbl = NULL; bool increment, decrement; u64 curr_time_ns; hdev = core->device; curr_time_ns = ktime_get_ns(); allowed_clks_tbl = core->resources.allowed_clks_tbl; if (!allowed_clks_tbl) { s_vpr_e(sid, "%s: Invalid parameters\n", __func__); Loading Loading @@ -895,6 +920,12 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core, u32 sid) continue; } /* skip inactive session clock rate */ if (!is_active_session(inst->last_qbuf_time_ns, curr_time_ns)) { inst->active = false; continue; } if (inst->clk_data.core_id == VIDC_CORE_ID_1) freq_core_1 += inst->clk_data.min_freq; else if (inst->clk_data.core_id == VIDC_CORE_ID_2) Loading Loading @@ -1018,6 +1049,12 @@ int msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst, bool do_bw_calc) core = inst->core; hdev = core->device; if (!inst->active) { /* do not skip bw voting for inactive -> active session */ do_bw_calc = true; inst->active = true; } if (msm_comm_scale_clocks(inst)) { s_vpr_e(inst->sid, "Failed to scale clocks. May impact performance\n"); Loading @@ -1029,6 +1066,7 @@ int msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst, bool do_bw_calc) "Failed to scale DDR bus. May impact perf\n"); } } return 0; } Loading
msm/vidc/msm_vidc_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -560,6 +560,8 @@ struct msm_vidc_inst { bool is_perf_eligible_session; u32 max_filled_len; int full_range; u64 last_qbuf_time_ns; bool active; }; extern struct msm_vidc_drv *vidc_driver; Loading