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

Commit d2bf6fd5 authored by Anmolpreet Kaur's avatar Anmolpreet Kaur Committed by Gerrit - the friendly Code Review server
Browse files

smcinvoke: Add retry mechanism for scm calls



This chage adds retry mechanism to smcinvoke driver
in case when secure side is busy. Driver will wait for
30 milliseconds before retrying the scm call. This
change also makes smcinvoke driver at par with qseecom
in terms of trying for around 2 seconds before sending
EBUSY error back to client.

Change-Id: Ie9523bc81f3aa03497836f06180c9d3f8a8efc99
Signed-off-by: default avatarAnmolpreet Kaur <anmolpre@codeaurora.org>
parent d2da670e
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -2321,7 +2321,7 @@ int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf,
	desc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, QCOM_SCM_RW,
					QCOM_SCM_VAL);

	ret = qcom_scm_call(dev, &desc);
	ret = qcom_scm_call_noretry(dev, &desc);

	if (result)
		*result = desc.res[1];
@@ -2353,7 +2353,7 @@ int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf,
	desc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, QCOM_SCM_RW,
					QCOM_SCM_VAL);

	ret = qcom_scm_call(dev, &desc);
	ret = qcom_scm_call_noretry(dev, &desc);

	if (result)
		*result = desc.res[1];
@@ -2382,7 +2382,7 @@ int __qcom_scm_invoke_callback_response(struct device *dev, phys_addr_t out_buf,
	desc.args[1] = out_buf_size;
	desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL);

	ret = qcom_scm_call(dev, &desc);
	ret = qcom_scm_call_noretry(dev, &desc);

	if (result)
		*result = desc.res[1];
+17 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/dma-buf.h>
#include <linux/delay.h>
#include <linux/kref.h>
#include <linux/signal.h>
#include <linux/msm_ion.h>
@@ -49,6 +50,9 @@
#define SMCINVOKE_MEM_MAP_OBJ           0
#define SMCINVOKE_MEM_RGN_OBJ           1
#define SMCINVOKE_MEM_PERM_RW           6
#define SMCINVOKE_SCM_EBUSY_WAIT_MS 30
#define SMCINVOKE_SCM_EBUSY_MAX_RETRY 67


/* TZ defined values - Start */
#define SMCINVOKE_INVOKE_PARAM_ID       0x224
@@ -1288,7 +1292,7 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr,
				bool *tz_acked,
				struct qtee_shm *in_shm, struct  qtee_shm *out_shm)
{
	int ret = 0, cmd;
	int ret = 0, cmd, retry_count = 0;
	u64 response_type;
	unsigned int data;
	struct file *arr_filp[OBJECT_COUNTS_MAX_OO] = {NULL};
@@ -1311,10 +1315,19 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr,
	while (1) {
		mutex_lock(&g_smcinvoke_lock);

		do {
			ret = invoke_cmd_handler(cmd, in_paddr, in_buf_len, out_buf,
				out_paddr, out_buf_len, &req->result, &response_type,
				&data, in_shm, out_shm);

			if (ret == -EBUSY) {
				pr_err("Secure side is busy,will retry after 30 ms\n");
				msleep(SMCINVOKE_SCM_EBUSY_WAIT_MS);
			}

		} while ((ret == -EBUSY) &&
			(retry_count++ < SMCINVOKE_SCM_EBUSY_MAX_RETRY));

		if (!ret && !is_inbound_req(response_type)) {
			/* dont marshal if Obj returns an error */
			if (!req->result) {