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

Commit 38efeccf authored by Maheshwar Ajja's avatar Maheshwar Ajja
Browse files

msm: vidc: fix DCVS logic issues



Initialize max_threshold to help DCVS to trigger
higher clock rate selection. Also fix an issue to
select lower clock rate when DCVS logic triggers it.
Update dcvs load appropriately to help other functions
which uses dcvs load.

Change-Id: If3a1c6813ea3e7eff4c8f19fc699511dc09eb491
Signed-off-by: default avatarMaheshwar Ajja <majja@codeaurora.org>
parent 2e7ac4ed
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -408,6 +408,8 @@ static int msm_dcvs_scale_clocks(struct msm_vidc_inst *inst,
	if (!inst->clk_data.dcvs_mode || inst->batch.enable) {
		dprintk(VIDC_DBG, "Skip DCVS (dcvs %d, batching %d)\n",
			inst->clk_data.dcvs_mode, inst->batch.enable);
		/* update load (freq) with normal value */
		inst->clk_data.load = inst->clk_data.load_norm;
		return 0;
	}

@@ -449,12 +451,16 @@ static int msm_dcvs_scale_clocks(struct msm_vidc_inst *inst,
	 *    pipeline, request Right Clocks.
	 */

	if (buffers_outside_fw <= dcvs->max_threshold)
	if (buffers_outside_fw <= dcvs->max_threshold) {
		dcvs->load = dcvs->load_high;
		dcvs->dcvs_flags |= MSM_VIDC_DCVS_INCR;
	else if (fw_pending_bufs < min_output_buf)
	} else if (fw_pending_bufs < min_output_buf) {
		dcvs->load = dcvs->load_low;
		dcvs->dcvs_flags |= MSM_VIDC_DCVS_DECR;
	else
	} else {
		dcvs->load = dcvs->load_norm;
		dcvs->dcvs_flags = 0;
	}

	dprintk(VIDC_PROF,
		"DCVS: total bufs %d outside fw %d max threshold %d with fw %d min bufs %d flags %#x\n",
@@ -811,7 +817,7 @@ int msm_vidc_set_clocks(struct msm_vidc_core *core)
			rate = allowed_clks_tbl[i-1].clock_rate;
	} else if (decrement) {
		if (i < (core->resources.allowed_clks_tbl_size - 1))
			allowed_clks_tbl[i+1].clock_rate;
			rate = allowed_clks_tbl[i+1].clock_rate;
	}

	core->min_freq = freq_core_max;
@@ -1024,7 +1030,7 @@ void msm_clock_data_reset(struct msm_vidc_inst *inst)
	u64 total_freq = 0, rate = 0, load;
	int cycles;
	struct clock_data *dcvs;
	struct hal_buffer_requirements *output_buf_req;
	struct hal_buffer_requirements *buf_req;

	dprintk(VIDC_DBG, "Init DCVS Load\n");

@@ -1047,22 +1053,33 @@ void msm_clock_data_reset(struct msm_vidc_inst *inst)
		dcvs->buffer_type = HAL_BUFFER_INPUT;
		dcvs->min_threshold =
			msm_vidc_get_extra_buff_count(inst, HAL_BUFFER_INPUT);
		buf_req = get_buff_req_buffer(inst, HAL_BUFFER_INPUT);
		if (buf_req)
			dcvs->max_threshold =
				buf_req->buffer_count_actual -
				buf_req->buffer_count_min_host + 2;
		else
			dprintk(VIDC_ERR,
				"%s: No bufer req for buffer type %x\n",
				__func__, HAL_BUFFER_INPUT);

	} else if (inst->session_type == MSM_VIDC_DECODER) {
		dcvs->buffer_type = msm_comm_get_hal_output_buffer(inst);
		output_buf_req = get_buff_req_buffer(inst,
				dcvs->buffer_type);
		if (!output_buf_req) {
		buf_req = get_buff_req_buffer(inst, dcvs->buffer_type);
		if (buf_req)
			dcvs->max_threshold =
				buf_req->buffer_count_actual -
				buf_req->buffer_count_min_host + 2;
		else
			dprintk(VIDC_ERR,
				"%s: No bufer req for buffer type %x\n",
				__func__, dcvs->buffer_type);
			return;
		}
		dcvs->max_threshold = output_buf_req->buffer_count_actual -
			output_buf_req->buffer_count_min_host + 2;

		dcvs->min_threshold =
			msm_vidc_get_extra_buff_count(inst, dcvs->buffer_type);
	} else {
		dprintk(VIDC_ERR, "%s: invalid session type %#x\n",
			__func__, inst->session_type);
		return;
	}

+1 −4
Original line number Diff line number Diff line
@@ -753,11 +753,8 @@ enum multi_stream msm_comm_get_stream_output_mode(struct msm_vidc_inst *inst)
		return HAL_VIDEO_DECODER_PRIMARY;
	}

	if (!is_decode_session(inst)) {
		dprintk(VIDC_DBG, "%s: not a decode session %x\n",
			__func__, hash32_ptr(inst->session));
	if (!is_decode_session(inst))
		return HAL_VIDEO_DECODER_PRIMARY;
	}

	if (inst->stream_output_mode == HAL_VIDEO_DECODER_SECONDARY)
		return HAL_VIDEO_DECODER_SECONDARY;