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

Commit 571090a2 authored by Banajit Goswami's avatar Banajit Goswami Committed by Gerrit - the friendly Code Review server
Browse files

soc: q6dspv2: add api to vote for upgrading thread priority



For some time critical tasks, the thread priority
might need to be upgraded to Real-Time Thread
priority level. Expose an interface from APR layer
so that clients can vote for a priority upgrade
whenever needed.

Change-Id: Ieb4afa914905750eccdf7672020a8751fdcf6462
Signed-off-by: default avatarBanajit Goswami <bgoswami@codeaurora.org>
Signed-off-by: default avatarSoumya Managoli <smanag@codeaurora.org>
parent fdf0731f
Loading
Loading
Loading
Loading
+102 −1
Original line number Diff line number Diff line
/* Copyright (c) 2010-2014, 2016, 2018 The Linux Foundation.
/* Copyright (c) 2010-2014, 2016, 2018-2019 The Linux Foundation.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
@@ -758,6 +758,107 @@ static void apr_reset_deregister(struct work_struct *work)
	kfree(apr_reset);
}

/**
 * apr_start_rx_rt - Clients call to vote for thread
 * priority upgrade whenever needed.
 *
 * @handle: APR service handle
 *
 * Returns 0 on success or error otherwise.
 */
int apr_start_rx_rt(void *handle)
{
	int rc = 0;
	struct apr_svc *svc = handle;
	uint16_t dest_id = 0;
	uint16_t client_id = 0;

	if (!svc) {
		pr_err("%s: Invalid APR handle\n", __func__);
		return -EINVAL;
	}

	mutex_lock(&svc->m_lock);
	dest_id = svc->dest_id;
	client_id = svc->client_id;

	if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) {
		pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n",
			__func__,
			client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID",
			client_id, dest_id);
		rc = -EINVAL;
		goto exit;
	}

	if (!client[dest_id][client_id].handle) {
		pr_err("%s: Client handle is NULL\n", __func__);
		rc = -EINVAL;
		goto exit;
	}

	rc = apr_tal_start_rx_rt(client[dest_id][client_id].handle);
	if (rc)
		pr_err("%s: failed to set RT thread priority for APR RX. rc = %d\n",
			__func__, rc);

exit:
	mutex_unlock(&svc->m_lock);
	return rc;
}
EXPORT_SYMBOL(apr_start_rx_rt);

/**
 * apr_end_rx_rt - Clients call to unvote for thread
 * priority upgrade (perviously voted with
 * apr_start_rx_rt()).
 *
 * @handle: APR service handle
 *
 * Returns 0 on success or error otherwise.
 */
int apr_end_rx_rt(void *handle)
{
	int rc = 0;
	struct apr_svc *svc = handle;
	uint16_t dest_id = 0;
	uint16_t client_id = 0;

	if (!svc) {
		pr_err("%s: Invalid APR handle\n", __func__);
		return -EINVAL;
	}

	mutex_lock(&svc->m_lock);
	dest_id = svc->dest_id;
	client_id = svc->client_id;

	if ((client_id >= APR_CLIENT_MAX) || (dest_id >= APR_DEST_MAX)) {
		pr_err("%s: %s invalid. client_id = %u, dest_id = %u\n",
			__func__,
			client_id >= APR_CLIENT_MAX ? "Client ID" : "Dest ID",
			client_id, dest_id);
		rc = -EINVAL;
		goto exit;
	}

	if (!client[dest_id][client_id].handle) {
		pr_err("%s: Client handle is NULL\n", __func__);
		rc = -EINVAL;
		goto exit;
	}

	rc = apr_tal_end_rx_rt(client[dest_id][client_id].handle);
	if (rc)
		pr_err("%s: failed to reset RT thread priority for APR RX. rc = %d\n",
			__func__, rc);

exit:
	mutex_unlock(&svc->m_lock);
	return rc;
}
EXPORT_SYMBOL(apr_end_rx_rt);

int apr_deregister(void *handle)
{
	struct apr_svc *svc = handle;
+33 −1
Original line number Diff line number Diff line
/* Copyright (c) 2016-2017 The Linux Foundation.
/* Copyright (c) 2016-2017, 2019 The Linux Foundation.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
@@ -358,6 +358,38 @@ unlock:
	return rc ? NULL : apr_ch;
}

int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch)
{
	int rc = 0;

	if (!apr_ch || !apr_ch->handle) {
		rc = -EINVAL;
		goto exit;
	}

	mutex_lock(&apr_ch->m_lock);
	rc = glink_start_rx_rt(apr_ch->handle);
	mutex_unlock(&apr_ch->m_lock);
exit:
	return rc;
}

int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch)
{
	int rc = 0;

	if (!apr_ch || !apr_ch->handle) {
		rc = -EINVAL;
		goto exit;
	}

	mutex_lock(&apr_ch->m_lock);
	rc = glink_end_rx_rt(apr_ch->handle);
	mutex_unlock(&apr_ch->m_lock);
exit:
	return rc;
}

int apr_tal_close(struct apr_svc_ch_dev *apr_ch)
{
	int rc;
+3 −1
Original line number Diff line number Diff line
/* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2010-2017, 2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -196,4 +196,6 @@ int apr_set_q6_state(enum apr_subsys_state state);
void apr_set_subsys_state(void);
const char *apr_get_lpass_subsys_name(void);
uint16_t apr_get_reset_domain(uint16_t proc);
int apr_start_rx_rt(void *handle);
int apr_end_rx_rt(void *handle);
#endif
+9 −1
Original line number Diff line number Diff line
/* Copyright (c) 2010-2011, 2016-2017 The Linux Foundation. All rights reserved.
/* Copyright (c) 2010-2011, 2016-2017, 2019 The Linux Foundation.
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -78,6 +79,9 @@ int apr_tal_rx_intents_config(struct apr_svc_ch_dev *apr_ch,

#if defined(CONFIG_MSM_QDSP6_APRV2_GLINK) || \
	 defined(CONFIG_MSM_QDSP6_APRV3_GLINK)
int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch);
int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch);

struct apr_svc_ch_dev {
	void               *handle;
	spinlock_t         w_lock;
@@ -90,6 +94,10 @@ struct apr_svc_ch_dev {
	bool               if_remote_intent_ready;
};
#else
static inline int apr_tal_start_rx_rt(struct apr_svc_ch_dev *apr_ch)
{ return 0; }
static inline int apr_tal_end_rx_rt(struct apr_svc_ch_dev *apr_ch) { return 0; }

struct apr_svc_ch_dev {
	struct smd_channel *ch;
	spinlock_t         lock;