diff --git a/arch/arm/mach-msm/modem-8960.c b/arch/arm/mach-msm/modem-8960.c index f0aa13c4146..7345a895119 100644 --- a/arch/arm/mach-msm/modem-8960.c +++ b/arch/arm/mach-msm/modem-8960.c @@ -149,9 +149,58 @@ void modem_crash_shutdown(const struct subsys_data *subsys) smsm_reset_modem(SMSM_RESET); } -int modem_ramdump(int enable, const struct subsys_data *subsys) +/* FIXME: Get address, size from PIL */ +static struct ramdump_segment modemsw_segments[] = { + {0x89000000, 0x8D400000 - 0x89000000}, +}; + +static struct ramdump_segment modemfw_segments[] = { + {0x8D400000, 0x8DA00000 - 0x8D400000}, +}; + +static struct ramdump_segment smem_segments[] = { + {0x80000000, 0x00200000}, +}; + +static void *modemfw_ramdump_dev; +static void *modemsw_ramdump_dev; +static void *smem_ramdump_dev; + +static int modem_ramdump(int enable, + const struct subsys_data *crashed_subsys) { - return 0; + int ret = 0; + + if (enable) { + ret = do_ramdump(modemsw_ramdump_dev, modemsw_segments, + ARRAY_SIZE(modemsw_segments)); + + if (ret < 0) { + pr_err("Unable to dump modem sw memory (rc = %d).\n", + ret); + goto out; + } + + ret = do_ramdump(modemfw_ramdump_dev, modemfw_segments, + ARRAY_SIZE(modemfw_segments)); + + if (ret < 0) { + pr_err("Unable to dump modem fw memory (rc = %d).\n", + ret); + goto out; + } + + ret = do_ramdump(smem_ramdump_dev, smem_segments, + ARRAY_SIZE(smem_segments)); + + if (ret < 0) { + pr_err("Unable to dump smem memory (rc = %d).\n", ret); + goto out; + } + } + +out: + return ret; } static irqreturn_t modem_wdog_bite_irq(int irq, void *dev_id) @@ -263,6 +312,33 @@ static int __init modem_8960_init(void) goto out; } + modemfw_ramdump_dev = create_ramdump_device("modem_fw"); + + if (!modemfw_ramdump_dev) { + pr_err("%s: Unable to create modem fw ramdump device. (%d)\n", + __func__, -ENOMEM); + ret = -ENOMEM; + goto out; + } + + modemsw_ramdump_dev = create_ramdump_device("modem_sw"); + + if (!modemsw_ramdump_dev) { + pr_err("%s: Unable to create modem sw ramdump device. (%d)\n", + __func__, -ENOMEM); + ret = -ENOMEM; + goto out; + } + + smem_ramdump_dev = create_ramdump_device("smem"); + + if (!smem_ramdump_dev) { + pr_err("%s: Unable to create smem ramdump device. (%d)\n", + __func__, -ENOMEM); + ret = -ENOMEM; + goto out; + } + ret = modem_debugfs_init(); pr_info("%s: modem fatal driver init'ed.\n", __func__);