diff --git a/drivers/soc/qcom/common_log.c b/drivers/soc/qcom/common_log.c index dad747f5a84d..208798697f80 100644 --- a/drivers/soc/qcom/common_log.c +++ b/drivers/soc/qcom/common_log.c @@ -21,6 +21,7 @@ #define MISC_DUMP_DATA_LEN 4096 #define PMIC_DUMP_DATA_LEN 4096 #define VSENSE_DUMP_DATA_LEN 4096 +#define RPM_DUMP_DATA_LEN (160 * 1024) void register_misc_dump(void) { @@ -119,6 +120,40 @@ err0: } } +void register_rpm_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) { + pr_err("rpm dump data structure allocation failed\n"); + return; + } + dump_addr = kzalloc(RPM_DUMP_DATA_LEN, GFP_KERNEL); + if (!dump_addr) + goto err0; + + dump_data->addr = virt_to_phys(dump_addr); + dump_data->len = RPM_DUMP_DATA_LEN; + dump_entry.id = MSM_DUMP_DATA_RPM; + dump_entry.addr = virt_to_phys(dump_data); + ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry); + if (ret) { + pr_err("Registering rpm dump 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; @@ -184,6 +219,7 @@ static int __init msm_common_log_init(void) register_misc_dump(); register_pmic_dump(); register_vsense_dump(); + register_rpm_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 1fee269d353e..7ad896ff7d4f 100644 --- a/include/soc/qcom/memory_dump.h +++ b/include/soc/qcom/memory_dump.h @@ -78,6 +78,7 @@ enum msm_dump_data_ids { MSM_DUMP_DATA_DBGUI_REG = 0xE5, MSM_DUMP_DATA_MISC = 0xE8, MSM_DUMP_DATA_VSENSE = 0xE9, + MSM_DUMP_DATA_RPM = 0xEA, MSM_DUMP_DATA_TMC_ETF = 0xF0, MSM_DUMP_DATA_TMC_REG = 0x100, MSM_DUMP_DATA_LOG_BUF = 0x110,