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

Commit ef124ecd authored by Satya Durga Srinivasu Prabhala's avatar Satya Durga Srinivasu Prabhala
Browse files

soc: qcom: ssr: add crash status to know why subsys crashed



In some specific cases, clients may want to know why subsystem
crashed, for example, in case of watch dog bite, subsystem may not
be able to execute error handling. Which would need different code
paths to be exercised on the apps processor.

Change-Id: I073733b8a56b57f14906b25cba08012c2f0b414a
Signed-off-by: default avatarSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>
parent 3162449f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2472,7 +2472,7 @@ void *cnss_pci_get_virt_ramdump_mem(unsigned long *size)
void cnss_pci_device_crashed(void)
{
	if (penv && penv->subsys) {
		subsys_set_crash_status(penv->subsys, true);
		subsys_set_crash_status(penv->subsys, CRASH_STATUS_ERR_FATAL);
		subsystem_restart_dev(penv->subsys);
	}
}
@@ -2491,7 +2491,7 @@ EXPORT_SYMBOL(cnss_get_virt_ramdump_mem);
void cnss_device_crashed(void)
{
	if (penv && penv->subsys) {
		subsys_set_crash_status(penv->subsys, true);
		subsys_set_crash_status(penv->subsys, CRASH_STATUS_ERR_FATAL);
		subsystem_restart_dev(penv->subsys);
	}
}
+2 −1
Original line number Diff line number Diff line
@@ -605,7 +605,8 @@ void cnss_sdio_device_crashed(void)
		return;
	ssr_info = &cnss_pdata->ssr_info;
	if (ssr_info->subsys) {
		subsys_set_crash_status(ssr_info->subsys, true);
		subsys_set_crash_status(ssr_info->subsys,
					CRASH_STATUS_ERR_FATAL);
		subsystem_restart_dev(ssr_info->subsys);
	}
}
+2 −2
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ static irqreturn_t modem_err_fatal_intr_handler(int irq, void *dev_id)
		return IRQ_HANDLED;

	pr_err("Fatal error on the modem.\n");
	subsys_set_crash_status(drv->subsys, true);
	subsys_set_crash_status(drv->subsys, CRASH_STATUS_ERR_FATAL);
	restart_modem(drv);
	return IRQ_HANDLED;
}
@@ -193,7 +193,7 @@ static irqreturn_t modem_wdog_bite_intr_handler(int irq, void *dev_id)
			!gpio_get_value(drv->subsys_desc.err_fatal_gpio))
		panic("%s: System ramdump requested. Triggering device restart!\n",
							__func__);
	subsys_set_crash_status(drv->subsys, true);
	subsys_set_crash_status(drv->subsys, CRASH_STATUS_WDOG_BITE);
	restart_modem(drv);
	return IRQ_HANDLED;
}
+3 −3
Original line number Diff line number Diff line
@@ -876,7 +876,7 @@ static irqreturn_t subsys_err_fatal_intr_handler (int irq, void *dev_id)
							d->subsys_desc.name);
		return IRQ_HANDLED;
	}
	subsys_set_crash_status(d->subsys, true);
	subsys_set_crash_status(d->subsys, CRASH_STATUS_ERR_FATAL);
	log_failure_reason(d);
	subsystem_restart_dev(d->subsys);

@@ -895,7 +895,7 @@ static irqreturn_t subsys_wdog_bite_irq_handler(int irq, void *dev_id)
			!gpio_get_value(d->subsys_desc.err_fatal_gpio))
		panic("%s: System ramdump requested. Triggering device restart!\n",
							__func__);
	subsys_set_crash_status(d->subsys, true);
	subsys_set_crash_status(d->subsys, CRASH_STATUS_WDOG_BITE);
	log_failure_reason(d);
	subsystem_restart_dev(d->subsys);

@@ -952,7 +952,7 @@ static void clear_wdog(struct pil_tz_data *d)
	if (!subsys_get_crash_status(d->subsys)) {
		pr_err("wdog bite received from %s!\n", d->subsys_desc.name);
		__raw_writel(BIT(d->bits_arr[ERR_READY]), d->irq_clear);
		subsys_set_crash_status(d->subsys, true);
		subsys_set_crash_status(d->subsys, CRASH_STATUS_WDOG_BITE);
		log_failure_reason(d);
		subsystem_restart_dev(d->subsys);
	}
+5 −4
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ struct subsys_device {
	struct cdev char_dev;
	dev_t dev_no;
	struct completion err_ready;
	bool crashed;
	enum crash_status crashed;
	int notif_state;
	struct list_head list;
};
@@ -646,7 +646,7 @@ static void subsystem_powerup(struct subsys_device *dev, void *data)
			current, name);
	}
	subsys_set_state(dev, SUBSYS_ONLINE);
	subsys_set_crash_status(dev, false);
	subsys_set_crash_status(dev, CRASH_STATUS_NO_CRASH);
}

static int __find_subsys(struct device *dev, void *data)
@@ -1126,12 +1126,13 @@ int subsystem_crashed(const char *name)
}
EXPORT_SYMBOL(subsystem_crashed);

void subsys_set_crash_status(struct subsys_device *dev, bool crashed)
void subsys_set_crash_status(struct subsys_device *dev,
				enum crash_status crashed)
{
	dev->crashed = crashed;
}

bool subsys_get_crash_status(struct subsys_device *dev)
enum crash_status subsys_get_crash_status(struct subsys_device *dev)
{
	return dev->crashed;
}
Loading