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

Commit 2e24354e authored by Vinay Kalia's avatar Vinay Kalia Committed by Deva Ramasubramanian
Browse files

msm: vidc: Tune video DCVS for msm8996



Make changes to buffer count logic as part of tuning video DCVS for
msm8996.  As part of these changes, also consider buffers still
referenced to by firmware as being owned by firmware.

Change-Id: If4e81faf4fa2f34405fa9fd4f0c1e863f4d158b4
Signed-off-by: default avatarVinay Kalia <vkalia@codeaurora.org>
parent 69148e27
Loading
Loading
Loading
Loading
+42 −34
Original line number Diff line number Diff line
@@ -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);

@@ -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);
@@ -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",
@@ -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__);
@@ -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)
@@ -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;
@@ -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 -
@@ -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,
@@ -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));
@@ -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;
@@ -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;
@@ -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
@@ -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)
+0 −1
Original line number Diff line number Diff line
@@ -45,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);
+1 −1
Original line number Diff line number Diff line
@@ -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;