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

Commit c7a3b625 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Tune video DCVS for msm8996"

parents 100b7078 2e24354e
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -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 :
+0 −3
Original line number Diff line number Diff line
@@ -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;\
+46 −35
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)
@@ -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) {
@@ -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;
}
+2 −1
Original line number Diff line number Diff line
@@ -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 */
@@ -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);
+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;