diff options
author | Shashank Mittal <mittals@codeaurora.org> | 2016-02-25 11:24:09 -0800 |
---|---|---|
committer | Jeevan Shriram <jshriram@codeaurora.org> | 2016-05-16 20:10:44 -0700 |
commit | 90fb2251c8c0aea0e2546d953e07d288451a9265 (patch) | |
tree | ad425229fcd0c75e808bd602209b0493dd4d40a3 | |
parent | 273d5bfab1f6e8536437f79795b30d2dcba1b261 (diff) |
memory-dump: add support to allocate memory for scan dumps
Add support to allocate memory for CPU scan dumps. This momeory can be
used to save CPU scan dumps at the time of a crash.
Change-Id: I9d644f18882729d187075e885bc2e8c02c5caf36
Signed-off-by: Shashank Mittal <mittals@codeaurora.org>
-rw-r--r-- | drivers/soc/qcom/common_log.c | 40 | ||||
-rw-r--r-- | include/soc/qcom/memory_dump.h | 3 |
2 files changed, 38 insertions, 5 deletions
diff --git a/drivers/soc/qcom/common_log.c b/drivers/soc/qcom/common_log.c index 556b832c529d..d2d877ef427b 100644 --- a/drivers/soc/qcom/common_log.c +++ b/drivers/soc/qcom/common_log.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -23,6 +23,7 @@ #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) { @@ -130,10 +131,8 @@ void register_rpm_dump(void) if (MSM_DUMP_MAJOR(msm_dump_table_version()) > 1) { dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL); - if (!dump_data) { - pr_err("rpm dump data structure allocation failed\n"); + if (!dump_data) return; - } dump_addr = kzalloc(RPM_DUMP_DATA_LEN, GFP_KERNEL); if (!dump_addr) goto err0; @@ -155,6 +154,38 @@ 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; @@ -226,6 +257,7 @@ 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/include/soc/qcom/memory_dump.h b/include/soc/qcom/memory_dump.h index 63e1bc770f53..f1170dbb3569 100644 --- a/include/soc/qcom/memory_dump.h +++ b/include/soc/qcom/memory_dump.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012, 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012, 2014-2016, 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 @@ -81,6 +81,7 @@ enum msm_dump_data_ids { MSM_DUMP_DATA_MISC = 0xE8, MSM_DUMP_DATA_VSENSE = 0xE9, MSM_DUMP_DATA_RPM = 0xEA, + MSM_DUMP_DATA_SCANDUMP = 0xEB, MSM_DUMP_DATA_TMC_ETF = 0xF0, MSM_DUMP_DATA_TMC_REG = 0x100, MSM_DUMP_DATA_LOG_BUF = 0x110, |