summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>2016-12-15 13:33:39 -0800
committerSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>2016-12-16 10:53:56 -0800
commitef124ecde2998f08ee84f5badd3d95a0a7308977 (patch)
tree000a4d7cdcc4307eda2a5c58a3af1970ce2171aa
parent3162449f7d245d45f007d4ea3224576ddf1bcc63 (diff)
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: Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>
-rw-r--r--drivers/net/wireless/cnss/cnss_pci.c4
-rw-r--r--drivers/net/wireless/cnss/cnss_sdio.c3
-rw-r--r--drivers/soc/qcom/pil-q6v5-mss.c4
-rw-r--r--drivers/soc/qcom/subsys-pil-tz.c6
-rw-r--r--drivers/soc/qcom/subsystem_restart.c9
-rw-r--r--include/soc/qcom/subsystem_restart.h20
6 files changed, 28 insertions, 18 deletions
diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c
index 1e56d445c6e1..f53ed2693879 100644
--- a/drivers/net/wireless/cnss/cnss_pci.c
+++ b/drivers/net/wireless/cnss/cnss_pci.c
@@ -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);
}
}
diff --git a/drivers/net/wireless/cnss/cnss_sdio.c b/drivers/net/wireless/cnss/cnss_sdio.c
index 01b969ec627f..ce7dbc64c4c3 100644
--- a/drivers/net/wireless/cnss/cnss_sdio.c
+++ b/drivers/net/wireless/cnss/cnss_sdio.c
@@ -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);
}
}
diff --git a/drivers/soc/qcom/pil-q6v5-mss.c b/drivers/soc/qcom/pil-q6v5-mss.c
index dc803bdfd554..8ed98e2cbd5e 100644
--- a/drivers/soc/qcom/pil-q6v5-mss.c
+++ b/drivers/soc/qcom/pil-q6v5-mss.c
@@ -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;
}
diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c
index e70a56e7ce2e..b8d096a9c057 100644
--- a/drivers/soc/qcom/subsys-pil-tz.c
+++ b/drivers/soc/qcom/subsys-pil-tz.c
@@ -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);
}
diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c
index 015e60ac622c..230a5329c8d4 100644
--- a/drivers/soc/qcom/subsystem_restart.c
+++ b/drivers/soc/qcom/subsystem_restart.c
@@ -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;
}
diff --git a/include/soc/qcom/subsystem_restart.h b/include/soc/qcom/subsystem_restart.h
index 780666c332e2..763eaa9ad918 100644
--- a/include/soc/qcom/subsystem_restart.h
+++ b/include/soc/qcom/subsystem_restart.h
@@ -25,6 +25,12 @@ enum {
RESET_LEVEL_MAX
};
+enum crash_status {
+ CRASH_STATUS_NO_CRASH = 0,
+ CRASH_STATUS_ERR_FATAL,
+ CRASH_STATUS_WDOG_BITE,
+};
+
struct device;
struct module;
@@ -89,7 +95,7 @@ struct subsys_desc {
/**
* struct notif_data - additional notif information
- * @crashed: indicates if subsystem has crashed
+ * @crashed: indicates if subsystem has crashed due to wdog bite or err fatal
* @enable_ramdump: ramdumps disabled if set to 0
* @enable_mini_ramdumps: enable flag for minimized critical-memory-only
* ramdumps
@@ -97,7 +103,7 @@ struct subsys_desc {
* @pdev: subsystem platform device pointer
*/
struct notif_data {
- bool crashed;
+ enum crash_status crashed;
int enable_ramdump;
int enable_mini_ramdumps;
bool no_auth;
@@ -120,8 +126,9 @@ extern struct subsys_device *subsys_register(struct subsys_desc *desc);
extern void subsys_unregister(struct subsys_device *dev);
extern void subsys_default_online(struct subsys_device *dev);
-extern void subsys_set_crash_status(struct subsys_device *dev, bool crashed);
-extern bool subsys_get_crash_status(struct subsys_device *dev);
+extern void subsys_set_crash_status(struct subsys_device *dev,
+ enum crash_status crashed);
+extern enum crash_status subsys_get_crash_status(struct subsys_device *dev);
void notify_proxy_vote(struct device *device);
void notify_proxy_unvote(struct device *device);
void complete_err_ready(struct subsys_device *subsys);
@@ -174,9 +181,10 @@ struct subsys_device *subsys_register(struct subsys_desc *desc)
static inline void subsys_unregister(struct subsys_device *dev) { }
static inline void subsys_default_online(struct subsys_device *dev) { }
+static inline void subsys_set_crash_status(struct subsys_device *dev,
+ enum crash_status crashed) { }
static inline
-void subsys_set_crash_status(struct subsys_device *dev, bool crashed) { }
-static inline bool subsys_get_crash_status(struct subsys_device *dev)
+enum crash_status subsys_get_crash_status(struct subsys_device *dev)
{
return false;
}