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

Commit 34d0e760 authored by Abhinav Parihar's avatar Abhinav Parihar
Browse files

msm: ADSPRPC: Add subsystem states for restart, up and down



Current subsystem state flag cannot define all state of the subsystem.
Different handling might be needed for different subsystem states.
Add multiple subsystem state support.

Change-Id: Id091dfded583c8cd7e95c0d306de6dd34b03485d
Signed-off-by: default avatarAbhinav Parihar <quic_parihar@quicinc.com>
parent 944584e1
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -144,6 +144,13 @@
#define INIT_MEMLEN_MAX  (8*1024*1024)
#define MAX_CACHE_BUF_SIZE (8*1024*1024)

/* FastRPC remote subsystem state*/
enum fastrpc_remote_subsys_state {
	SUBSYSTEM_RESTARTING = 0,
	SUBSYSTEM_DOWN,
	SUBSYSTEM_UP,
};

#define PERF_END (void)0

#define PERF(enb, cnt, ff) \
@@ -349,7 +356,7 @@ struct fastrpc_channel_ctx {
	uint64_t ssrcount;
	void *handle;
	uint64_t prevssrcount;
	int issubsystemup;
	int subsystemstate;
	int vmid;
	struct secure_vm rhvm;
	int ramdumpenabled;
@@ -2936,7 +2943,7 @@ static int fastrpc_get_info_from_dsp(struct fastrpc_file *fl,
	case ADSP_DOMAIN_ID:
	case SDSP_DOMAIN_ID:
	case CDSP_DOMAIN_ID:
		if (me->channel[domain].issubsystemup)
		if (me->channel[domain].subsystemstate == SUBSYSTEM_UP)
			dsp_support = 1;
		break;
	case MDSP_DOMAIN_ID:
@@ -3060,7 +3067,8 @@ static int fastrpc_release_current_dsp_process(struct fastrpc_file *fl)
	VERIFY(err, fl->apps->channel[cid].rpdev != NULL);
	if (err)
		goto bail;
	VERIFY(err, fl->apps->channel[cid].issubsystemup == 1);
	VERIFY(err, fl->apps->channel[cid].subsystemstate !=
			SUBSYSTEM_RESTARTING);
	if (err) {
		wait_for_completion(&fl->shutdown);
		goto bail;
@@ -3926,8 +3934,8 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
		len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
			"\n%s %s %s\n", title, " CHANNEL INFO ", title);
		len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
			"%-7s|%-10s|%-14s|%-9s|%-13s\n",
			"subsys", "sesscount", "issubsystemup",
			"%-7s|%-10s|%-15s|%-9s|%-13s\n",
			"subsys", "sesscount", "subsystemstate",
			"ssrcount", "session_used");
		len += scnprintf(fileinfo + len, DEBUGFS_SIZE - len,
			"-%s%s%s%s-\n", single_line, single_line,
@@ -3941,8 +3949,8 @@ static ssize_t fastrpc_debugfs_read(struct file *filp, char __user *buffer,
				DEBUGFS_SIZE - len, "|%-10u",
				chan->sesscount);
			len += scnprintf(fileinfo + len,
				DEBUGFS_SIZE - len, "|%-14d",
				chan->issubsystemup);
				DEBUGFS_SIZE - len, "|%-15d",
				chan->subsystemstate);
			len += scnprintf(fileinfo + len,
				DEBUGFS_SIZE - len, "|%-9u",
				chan->ssrcount);
@@ -4163,7 +4171,7 @@ static int fastrpc_channel_open(struct fastrpc_file *fl)
	mutex_lock(&me->channel[cid].smd_mutex);
	if (me->channel[cid].ssrcount !=
				 me->channel[cid].prevssrcount) {
		if (!me->channel[cid].issubsystemup) {
		if (me->channel[cid].subsystemstate != SUBSYSTEM_UP) {
			err = -ENOTCONN;
			mutex_unlock(&me->channel[cid].smd_mutex);
			goto bail;
@@ -4778,7 +4786,7 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb,
			__func__, gcinfo[cid].subsys);
		mutex_lock(&me->channel[cid].smd_mutex);
		ctx->ssrcount++;
		ctx->issubsystemup = 0;
		ctx->subsystemstate = SUBSYSTEM_RESTARTING;
		mutex_unlock(&me->channel[cid].smd_mutex);
	} else if (code == SUBSYS_AFTER_SHUTDOWN) {
		pr_info("adsprpc: %s: %s subsystem is down\n",
@@ -4790,6 +4798,7 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb,
			complete(&fl->shutdown);
		}
		spin_unlock(&me->hlock);
		ctx->subsystemstate = SUBSYSTEM_DOWN;
	} else if (code == SUBSYS_RAMDUMP_NOTIFICATION) {
		if (cid == RH_CID) {
			if (me->ramdump_handle)
@@ -4808,7 +4817,7 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb,
	} else if (code == SUBSYS_AFTER_POWERUP) {
		pr_info("adsprpc: %s: %s subsystem is up\n",
			__func__, gcinfo[cid].subsys);
		ctx->issubsystemup = 1;
		ctx->subsystemstate = SUBSYSTEM_UP;
	}
	return NOTIFY_DONE;
}
@@ -5481,7 +5490,7 @@ static int __init fastrpc_device_init(void)
			me->channel[i].dev = dev;
		me->channel[i].ssrcount = 0;
		me->channel[i].prevssrcount = 0;
		me->channel[i].issubsystemup = 1;
		me->channel[i].subsystemstate = SUBSYSTEM_UP;
		me->channel[i].ramdumpenabled = 0;
		me->channel[i].rh_dump_dev = NULL;
		me->channel[i].nb.notifier_call = fastrpc_restart_notifier_cb;