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

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

Merge "qseecom: add bus scaling support for GP operations"

parents 92acb69f 5e8338fd
Loading
Loading
Loading
Loading
+76 −81
Original line number Diff line number Diff line
@@ -6782,6 +6782,60 @@ static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data)
	}
}


static int __qseecom_bus_scaling_enable(struct qseecom_dev_handle *data,
					bool *perf_enabled)
{
	int ret = 0;

	if (qseecom.support_bus_scaling) {
		if (!data->mode) {
			mutex_lock(&qsee_bw_mutex);
			__qseecom_register_bus_bandwidth_needs(
							data, HIGH);
			mutex_unlock(&qsee_bw_mutex);
		}
		ret = qseecom_scale_bus_bandwidth_timer(INACTIVE);
		if (ret) {
			pr_err("Failed to set bw\n");
			ret = -EINVAL;
			goto exit;
		}
	}
	/*
	* On targets where crypto clock is handled by HLOS,
	* if clk_access_cnt is zero and perf_enabled is false,
	* then the crypto clock was not enabled before sending cmd
	* to tz, qseecom will enable the clock to avoid service failure.
	*/
	if (!qseecom.no_clock_support &&
		!qseecom.qsee.clk_access_cnt && !data->perf_enabled) {
		pr_debug("ce clock is not enabled\n");
		ret = qseecom_perf_enable(data);
		if (ret) {
			pr_err("Failed to vote for clock with err %d\n",
					ret);
			ret = -EINVAL;
			goto exit;
		}
		*perf_enabled = true;
	}
exit:
	return ret;
}

static void __qseecom_bus_scaling_disable(struct qseecom_dev_handle *data,
					bool perf_enabled)
{
	if (qseecom.support_bus_scaling)
		__qseecom_add_bw_scale_down_timer(
			QSEECOM_SEND_CMD_CRYPTO_TIMEOUT);
	if (perf_enabled) {
		qsee_disable_clock_vote(data, CLK_DFAB);
		qsee_disable_clock_vote(data, CLK_SFPB);
	}
}

long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{
	int ret = 0;
@@ -6848,50 +6902,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg)
		}
		/* Only one client allowed here at a time */
		mutex_lock(&app_access_lock);
		if (qseecom.support_bus_scaling) {
			/* register bus bw in case the client doesn't do it */
			if (!data->mode) {
				mutex_lock(&qsee_bw_mutex);
				__qseecom_register_bus_bandwidth_needs(
								data, HIGH);
				mutex_unlock(&qsee_bw_mutex);
			}
			ret = qseecom_scale_bus_bandwidth_timer(INACTIVE);
		ret = __qseecom_bus_scaling_enable(data, &perf_enabled);
		if (ret) {
				pr_err("Failed to set bw.\n");
				ret = -EINVAL;
			mutex_unlock(&app_access_lock);
			break;
		}
		}
		/*
		* On targets where crypto clock is handled by HLOS,
		* if clk_access_cnt is zero and perf_enabled is false,
		* then the crypto clock was not enabled before sending cmd
		* to tz, qseecom will enable the clock to avoid service failure.
		*/
		if (!qseecom.no_clock_support &&
			!qseecom.qsee.clk_access_cnt && !data->perf_enabled) {
			pr_debug("ce clock is not enabled!\n");
			ret = qseecom_perf_enable(data);
			if (ret) {
				pr_err("Failed to vote for clock with err %d\n",
						ret);
				mutex_unlock(&app_access_lock);
				ret = -EINVAL;
				break;
			}
			perf_enabled = true;
		}
		atomic_inc(&data->ioctl_count);
		ret = qseecom_send_cmd(data, argp);
		if (qseecom.support_bus_scaling)
			__qseecom_add_bw_scale_down_timer(
				QSEECOM_SEND_CMD_CRYPTO_TIMEOUT);
		if (perf_enabled) {
			qsee_disable_clock_vote(data, CLK_DFAB);
			qsee_disable_clock_vote(data, CLK_SFPB);
		}
		__qseecom_bus_scaling_disable(data, perf_enabled);
		atomic_dec(&data->ioctl_count);
		wake_up_all(&data->abort_wq);
		mutex_unlock(&app_access_lock);
@@ -6910,52 +6928,17 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg)
		}
		/* Only one client allowed here at a time */
		mutex_lock(&app_access_lock);
		if (qseecom.support_bus_scaling) {
			if (!data->mode) {
				mutex_lock(&qsee_bw_mutex);
				__qseecom_register_bus_bandwidth_needs(
								data, HIGH);
				mutex_unlock(&qsee_bw_mutex);
			}
			ret = qseecom_scale_bus_bandwidth_timer(INACTIVE);
			if (ret) {
				pr_err("Failed to set bw.\n");
				mutex_unlock(&app_access_lock);
				ret = -EINVAL;
				break;
			}
		}
		/*
		* On targets where crypto clock is handled by HLOS,
		* if clk_access_cnt is zero and perf_enabled is false,
		* then the crypto clock was not enabled before sending cmd
		* to tz, qseecom will enable the clock to avoid service failure.
		*/
		if (!qseecom.no_clock_support &&
			!qseecom.qsee.clk_access_cnt && !data->perf_enabled) {
			pr_debug("ce clock is not enabled!\n");
			ret = qseecom_perf_enable(data);
		ret = __qseecom_bus_scaling_enable(data, &perf_enabled);
		if (ret) {
				pr_err("Failed to vote for clock with err %d\n",
						ret);
			mutex_unlock(&app_access_lock);
				ret = -EINVAL;
			break;
		}
			perf_enabled = true;
		}
		atomic_inc(&data->ioctl_count);
		if (cmd == QSEECOM_IOCTL_SEND_MODFD_CMD_REQ)
			ret = qseecom_send_modfd_cmd(data, argp);
		else
			ret = qseecom_send_modfd_cmd_64(data, argp);
		if (qseecom.support_bus_scaling)
			__qseecom_add_bw_scale_down_timer(
				QSEECOM_SEND_CMD_CRYPTO_TIMEOUT);
		if (perf_enabled) {
			qsee_disable_clock_vote(data, CLK_DFAB);
			qsee_disable_clock_vote(data, CLK_SFPB);
		}
		__qseecom_bus_scaling_disable(data, perf_enabled);
		atomic_dec(&data->ioctl_count);
		wake_up_all(&data->abort_wq);
		mutex_unlock(&app_access_lock);
@@ -7357,8 +7340,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg)
		}
		/* Only one client allowed here at a time */
		mutex_lock(&app_access_lock);
		ret = __qseecom_bus_scaling_enable(data, &perf_enabled);
		if (ret) {
			mutex_unlock(&app_access_lock);
			break;
		}
		atomic_inc(&data->ioctl_count);
		ret = qseecom_qteec_open_session(data, argp);
		__qseecom_bus_scaling_disable(data, perf_enabled);
		atomic_dec(&data->ioctl_count);
		wake_up_all(&data->abort_wq);
		mutex_unlock(&app_access_lock);
@@ -7406,8 +7395,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg)
		}
		/* Only one client allowed here at a time */
		mutex_lock(&app_access_lock);
		ret = __qseecom_bus_scaling_enable(data, &perf_enabled);
		if (ret) {
			mutex_unlock(&app_access_lock);
			break;
		}
		atomic_inc(&data->ioctl_count);
		ret = qseecom_qteec_invoke_modfd_cmd(data, argp);
		__qseecom_bus_scaling_disable(data, perf_enabled);
		atomic_dec(&data->ioctl_count);
		wake_up_all(&data->abort_wq);
		mutex_unlock(&app_access_lock);