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

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

Merge "msm: VPU: Fix handling of config changes after first commit"

parents 5e4d1b84 c847d396
Loading
Loading
Loading
Loading
+70 −75
Original line number Diff line number Diff line
@@ -893,126 +893,121 @@ int __calculate_session_load(struct vpu_dev_session *session)
	return load_bits_per_sec;
}

int commit_initial_config(struct vpu_dev_session *session)
static int __configure_input_port(struct vpu_dev_session *session)
{
	struct vpu_prop_session_input in_param;
	struct vpu_prop_session_output out_param;
	struct vpu_ctrl_auto_manual *nr;
	int ret = 0;

	if (session->commit_state == COMMITED)
		return 0;

	nr = get_control(session->controller, VPU_CTRL_NOISE_REDUCTION);
	ret = configure_nr_buffers(session, nr);
	if (ret) {
		pr_err("Failed to configure nr\n");
		goto exit_commit;
		return ret;
	}

	translate_input_format_to_hfi(&session->port_info[INPUT_PORT],
			&in_param);
	ret = vpu_hw_session_s_input_params(session->id, &in_param);
	if (ret) {
		pr_err("Failed to set port 0 config\n");
		goto exit_commit;
		pr_err("Failed to set input port config\n");
		return ret;
	}

	return 0;
}

static int __configure_output_port(struct vpu_dev_session *session)
{
	struct vpu_prop_session_output out_param;
	int ret = 0;

	translate_output_format_to_hfi(&session->port_info[OUTPUT_PORT],
			&out_param);
	ret = vpu_hw_session_s_output_params(session->id, &out_param);
	if (ret) {
		pr_err("Failed to set port 1 config\n");
		goto exit_commit;
		pr_err("Failed to set output port config\n");
		return ret;
	}

	/* calculate and store the newly computed session load */
	return 0;
}

static int __do_commit(struct vpu_dev_session *session,
		enum commit_type commit_type, int new_load)
{
	int ret;

	if (new_load)
		session->load = __calculate_session_load(session);

	ret = vpu_hw_session_commit(session->id, CH_COMMIT_AT_ONCE,
	ret = vpu_hw_session_commit(session->id, commit_type,
			__get_vpu_load(session->core));
	if (ret) {
		pr_err("Commit Failed (err %d)\n", ret);
		notify_vpu_event_session(session, VPU_EVENT_INVALID_CONFIG,
				NULL, 0);
		goto exit_commit;
	if (ret)
		pr_err("Commit Failed\n");
	else
		pr_debug("Commit successful\n");

	return ret;
}

	session->commit_state = COMMITED;
	pr_debug("Initial configuration committed successfully\n");
int commit_initial_config(struct vpu_dev_session *session)
{
	int ret = 0;

exit_commit:
	if (session->commit_state == COMMITED)
		return 0;

	ret = __configure_input_port(session);
	if (ret)
		return ret;

	ret = __configure_output_port(session);
	if (ret)
		return ret;

	ret = __do_commit(session, CH_COMMIT_AT_ONCE, 1);
	if (ret)
		return ret;

	session->commit_state = COMMITED;
	return 0;
}

int commit_port_config(struct vpu_dev_session *session,	int port, int new_load)
{
	struct vpu_prop_session_input in_param;
	struct vpu_prop_session_output out_param;
	int ret = 0;

	if (session->commit_state != COMMITED)
		return 0; /* wait for initial configuration */
	/* defer to initial session commit if not streaming */
	if (session->streaming_state != ALL_STREAMING) {
		session->commit_state = 0;
		return 0;
	}

	if (port == INPUT_PORT) {
		struct vpu_ctrl_auto_manual *nr = get_control(
			session->controller, VPU_CTRL_NOISE_REDUCTION);
		ret = configure_nr_buffers(session, nr);
		if (ret) {
			pr_err("Failed to configure nr\n");
		ret = __configure_input_port(session);
		if (ret)
			return ret;
		}

		translate_input_format_to_hfi(&session->port_info[INPUT_PORT],
				&in_param);
		ret = vpu_hw_session_s_input_params(session->id, &in_param);
	} else if (port == OUTPUT_PORT) {
		translate_output_format_to_hfi(&session->port_info[OUTPUT_PORT],
				&out_param);
		ret = vpu_hw_session_s_output_params(session->id, &out_param);
	} else
		return -EINVAL;

	if (ret) {
		pr_err("Failed to set port config\n");
		goto exit_commit;
	}

	if (new_load)
		session->load = __calculate_session_load(session);
		ret = __configure_output_port(session);
		if (ret)
			return ret;

	ret = vpu_hw_session_commit(session->id, CH_COMMIT_IN_ORDER,
			__get_vpu_load(session->core));
	if (ret) {
		pr_err("Commit Failed\n");
		if (ret == -EIO)
			ret = -EAGAIN; /* special runtime commit fail retval */
		goto exit_commit;
	} else {
		return -EINVAL;
	}

exit_commit:
	return ret;
	return __do_commit(session, CH_COMMIT_IN_ORDER, new_load);
}

int commit_control(struct vpu_dev_session *session, int new_load)
{
	int ret = 0;

	if (session->commit_state != COMMITED)
		return 0; /* wait for initial configuration */

	if (new_load)
		session->load = __calculate_session_load(session);

	ret = vpu_hw_session_commit(session->id, CH_COMMIT_AT_ONCE,
			__get_vpu_load(session->core));
	if (ret) {
		pr_err("Commit Failed\n");
		if (ret == -EIO)
			ret = -EAGAIN; /* special runtime commit fail retval */
		goto exit_commit;
	/* defer to initial session commit if not streaming */
	if (session->streaming_state != ALL_STREAMING) {
		session->commit_state = 0;
		return 0;
	}

exit_commit:
	return ret;
	return __do_commit(session, CH_COMMIT_AT_ONCE, new_load);
}
+4 −4
Original line number Diff line number Diff line
@@ -548,10 +548,6 @@ int vpu_set_fmt(struct vpu_client *client, struct v4l2_format *f)
				translate_v4l2_scan_mode(pix_mp->field);

	ret = commit_port_config(session, port, 1);
	if (ret) {
		pr_err("commit_port_config failed (err %d)\n", ret);
		return -EINVAL;
	}

	mutex_unlock(&session->lock);
	return ret;
@@ -675,6 +671,8 @@ int vpu_set_input(struct vpu_client *client, unsigned int i)
		ret = call_port_op(session, INPUT_PORT, attach);
	}

	ret = commit_port_config(session, INPUT_PORT, 1);

exit_s_input:
	mutex_unlock(&session->lock);
	return ret;
@@ -716,6 +714,8 @@ int vpu_set_output(struct vpu_client *client, unsigned int i)
		ret = call_port_op(session, OUTPUT_PORT, attach);
	}

	ret = commit_port_config(session, OUTPUT_PORT, 1);

exit_s_output:
	mutex_unlock(&session->lock);
	return ret;