summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShashank Mittal <mittals@codeaurora.org>2016-09-12 11:42:39 -0700
committerShashank Mittal <mittals@codeaurora.org>2016-09-14 11:07:00 -0700
commit0c6d3141a36f4099209ddf1d42f5d5d22a396fe3 (patch)
tree0064f1306155ad3de958974002366c902d988b41
parent9b82a4c5896632b62140d1ddda55638fea254007 (diff)
soc: qcom: move scan dump memory allocation
Allocate memory for scan dump collection along with CPU context allocation. This will help in debugging crashes very early during boot up. Change-Id: Icbb2a60683ecca303cbd48576d80d0a765610c8f Signed-off-by: Shashank Mittal <mittals@codeaurora.org>
-rw-r--r--Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt1
-rw-r--r--drivers/soc/qcom/common_log.c34
-rw-r--r--drivers/soc/qcom/watchdog_v2.c41
3 files changed, 42 insertions, 34 deletions
diff --git a/Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt b/Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt
index 56559a69eb46..296e5dd0e383 100644
--- a/Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt
+++ b/Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt
@@ -34,6 +34,7 @@ Optional properties:
- qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present
- qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze
automatically across suspend / resume path.
+- qcom,scandump-size : size of scan dump memory region
Example:
diff --git a/drivers/soc/qcom/common_log.c b/drivers/soc/qcom/common_log.c
index d2d877ef427b..f4c69d624342 100644
--- a/drivers/soc/qcom/common_log.c
+++ b/drivers/soc/qcom/common_log.c
@@ -23,7 +23,6 @@
#define PMIC_DUMP_DATA_LEN 4096
#define VSENSE_DUMP_DATA_LEN 4096
#define RPM_DUMP_DATA_LEN (160 * 1024)
-#define SCAN_DUMP_DATA_LEN (256 * 1024)
void register_misc_dump(void)
{
@@ -154,38 +153,6 @@ err0:
}
}
-void register_scan_dump(void)
-{
- static void *dump_addr;
- int ret;
- struct msm_dump_entry dump_entry;
- struct msm_dump_data *dump_data;
-
- if (MSM_DUMP_MAJOR(msm_dump_table_version()) > 1) {
- dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL);
- if (!dump_data)
- return;
- dump_addr = kzalloc(SCAN_DUMP_DATA_LEN, GFP_KERNEL);
- if (!dump_addr)
- goto err0;
-
- dump_data->addr = virt_to_phys(dump_addr);
- dump_data->len = SCAN_DUMP_DATA_LEN;
- dump_entry.id = MSM_DUMP_DATA_SCANDUMP;
- dump_entry.addr = virt_to_phys(dump_data);
- ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
- if (ret) {
- pr_err("Registering scandump region failed\n");
- goto err1;
- }
- return;
-err1:
- kfree(dump_addr);
-err0:
- kfree(dump_data);
- }
-}
-
static void __init common_log_register_log_buf(void)
{
char **log_bufp;
@@ -257,7 +224,6 @@ static int __init msm_common_log_init(void)
register_pmic_dump();
register_vsense_dump();
register_rpm_dump();
- register_scan_dump();
return 0;
}
late_initcall(msm_common_log_init);
diff --git a/drivers/soc/qcom/watchdog_v2.c b/drivers/soc/qcom/watchdog_v2.c
index 65eda2de9586..aa20705b9adc 100644
--- a/drivers/soc/qcom/watchdog_v2.c
+++ b/drivers/soc/qcom/watchdog_v2.c
@@ -90,6 +90,7 @@ struct msm_watchdog_data {
bool timer_expired;
bool user_pet_complete;
+ unsigned int scandump_size;
};
/*
@@ -501,6 +502,39 @@ static irqreturn_t wdog_ppi_bark(int irq, void *dev_id)
return wdog_bark_handler(irq, wdog_dd);
}
+void register_scan_dump(struct msm_watchdog_data *wdog_dd)
+{
+ static void *dump_addr;
+ int ret;
+ struct msm_dump_entry dump_entry;
+ struct msm_dump_data *dump_data;
+
+ if (!wdog_dd->scandump_size)
+ return;
+
+ dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL);
+ if (!dump_data)
+ return;
+ dump_addr = kzalloc(wdog_dd->scandump_size, GFP_KERNEL);
+ if (!dump_addr)
+ goto err0;
+
+ dump_data->addr = virt_to_phys(dump_addr);
+ dump_data->len = wdog_dd->scandump_size;
+ dump_entry.id = MSM_DUMP_DATA_SCANDUMP;
+ dump_entry.addr = virt_to_phys(dump_data);
+ ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
+ if (ret) {
+ pr_err("Registering scandump region failed\n");
+ goto err1;
+ }
+ return;
+err1:
+ kfree(dump_addr);
+err0:
+ kfree(dump_data);
+}
+
static void configure_bark_dump(struct msm_watchdog_data *wdog_dd)
{
int ret;
@@ -582,6 +616,8 @@ static void configure_bark_dump(struct msm_watchdog_data *wdog_dd)
if (ret)
pr_err("cpu %d reg dump setup failed\n", cpu);
}
+
+ register_scan_dump(wdog_dd);
}
return;
@@ -770,6 +806,11 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev,
pdata->wakeup_irq_enable = of_property_read_bool(node,
"qcom,wakeup-enable");
+ if (of_property_read_u32(node, "qcom,scandump-size",
+ &pdata->scandump_size))
+ dev_info(&pdev->dev,
+ "No need to allocate memory for scandumps\n");
+
pdata->irq_ppi = irq_is_percpu(pdata->bark_irq);
dump_pdata(pdata);
return 0;