Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 703c7072 authored by Vikash Garodia's avatar Vikash Garodia
Browse files

msm: vidc: Do not consider clock for inactive sessions



Video sessions may go into pause state or remain inactive
as per the client requirement. Clock calculation should
ignore the clock required for such session and do not
include it in the total required clock vote.

Change-Id: I41dce9f47208ef33244b754a076550a0b4b830f9
Signed-off-by: default avatarVikash Garodia <vgarodia@codeaurora.org>
parent 19060faf
Loading
Loading
Loading
Loading
+34 −14
Original line number Diff line number Diff line
@@ -850,7 +850,9 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core)
	struct hfi_device *hdev;
	unsigned long freq_core_1 = 0, freq_core_2 = 0, rate = 0;
	unsigned long freq_core_max = 0;
	struct msm_vidc_inst *temp = NULL;
	struct msm_vidc_inst *inst = NULL;
	struct msm_vidc_buffer *temp, *next;
	u32 device_addr, filled_len;
	int rc = 0, i = 0;
	struct allowed_clock_rates_table *allowed_clks_tbl = NULL;
	bool increment, decrement;
@@ -866,15 +868,34 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core)
	mutex_lock(&core->lock);
	increment = false;
	decrement = true;
	list_for_each_entry(temp, &core->instances, list) {
	list_for_each_entry(inst, &core->instances, list) {
		device_addr = 0;
		filled_len = 0;
		mutex_lock(&inst->registeredbufs.lock);
		list_for_each_entry_safe(temp, next,
				&inst->registeredbufs.list, list) {
			if (temp->vvb.vb2_buf.type ==
				V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
				filled_len = max(filled_len,
					temp->vvb.vb2_buf.planes[0].bytesused);
				device_addr = temp->smem[0].device_addr;
			}
		}
		mutex_unlock(&inst->registeredbufs.lock);

		if (!filled_len || !device_addr) {
			dprintk(VIDC_DBG, "%s no input for session %x\n",
				__func__, hash32_ptr(inst->session));
			continue;
		}

		if (temp->clk_data.core_id == VIDC_CORE_ID_1)
			freq_core_1 += temp->clk_data.min_freq;
		else if (temp->clk_data.core_id == VIDC_CORE_ID_2)
			freq_core_2 += temp->clk_data.min_freq;
		else if (temp->clk_data.core_id == VIDC_CORE_ID_3) {
			freq_core_1 += temp->clk_data.min_freq;
			freq_core_2 += temp->clk_data.min_freq;
		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)
			freq_core_2 += inst->clk_data.min_freq;
		else if (inst->clk_data.core_id == VIDC_CORE_ID_3) {
			freq_core_1 += inst->clk_data.min_freq;
			freq_core_2 += inst->clk_data.min_freq;
		}

		freq_core_max = max_t(unsigned long, freq_core_1, freq_core_2);
@@ -889,10 +910,10 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core)
		}

		/* increment even if one session requested for it */
		if (temp->clk_data.dcvs_flags & MSM_VIDC_DCVS_INCR)
		if (inst->clk_data.dcvs_flags & MSM_VIDC_DCVS_INCR)
			increment = true;
		/* decrement only if all sessions requested for it */
		if (!(temp->clk_data.dcvs_flags & MSM_VIDC_DCVS_DECR))
		if (!(inst->clk_data.dcvs_flags & MSM_VIDC_DCVS_DECR))
			decrement = false;
	}

@@ -960,7 +981,7 @@ int msm_comm_scale_clocks(struct msm_vidc_inst *inst)
	if (!filled_len || !device_addr) {
		dprintk(VIDC_DBG, "%s no input for session %x\n",
			__func__, hash32_ptr(inst->session));
		goto no_clock_change;
		return 0;
	}

	freq = call_core_op(inst->core, calc_freq, inst, filled_len);
@@ -978,7 +999,6 @@ int msm_comm_scale_clocks(struct msm_vidc_inst *inst)

	msm_vidc_set_clocks(inst->core);

no_clock_change:
	return 0;
}