summaryrefslogtreecommitdiff
path: root/drivers/soc
diff options
context:
space:
mode:
authorPuja Gupta <pujag@codeaurora.org>2016-07-25 15:44:42 -0700
committerPuja Gupta <pujag@codeaurora.org>2016-08-04 17:10:11 -0700
commitd5e763cc2e66f0bb6a2a51a929da5aec91173538 (patch)
tree4abc28dfc18e010cdd01c3bc489101fb065f2045 /drivers/soc
parent059df41e860f67a9ba59ff4af2c95d754d6e4a28 (diff)
soc: qcom: pil: Add flag to know if modem SSR happened.
Introduce a flag to know if modem is restarting from cold boot or from SSR. Use this flag to decide if modem memory needs to be assigned back to linux. After cold boot linux already owns modem memory and trying to assign it back from modem is incorrect. CRs-Fixed: 1050153 Change-Id: I1c1ef35ea7ef6c2552a22b85c5af260ade413777 Signed-off-by: Puja Gupta <pujag@codeaurora.org>
Diffstat (limited to 'drivers/soc')
-rw-r--r--drivers/soc/qcom/peripheral-loader.c20
-rw-r--r--drivers/soc/qcom/peripheral-loader.h2
-rw-r--r--drivers/soc/qcom/pil-q6v5-mss.c1
3 files changed, 16 insertions, 7 deletions
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index e163dd79b8b9..a0f66c78b3ac 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -812,15 +812,19 @@ int pil_boot(struct pil_desc *desc)
}
if (desc->subsys_vmid > 0) {
- /* Make sure the memory is actually assigned to Linux. In the
- * case where the shutdown sequence is not able to immediately
- * assign the memory back to Linux, we need to do this here. */
- ret = pil_assign_mem_to_linux(desc, priv->region_start,
+ /**
+ * In case of modem ssr, we need to assign memory back to linux.
+ * This is not true after cold boot since linux already owns it.
+ * Also for secure boot devices, modem memory has to be released
+ * after MBA is booted
+ */
+ if (desc->modem_ssr) {
+ ret = pil_assign_mem_to_linux(desc, priv->region_start,
(priv->region_end - priv->region_start));
- if (ret)
- pil_err(desc, "Failed to assign to linux, ret - %d\n",
+ if (ret)
+ pil_err(desc, "Failed to assign to linux, ret- %d\n",
ret);
-
+ }
ret = pil_assign_mem_to_subsys_and_linux(desc,
priv->region_start,
(priv->region_end - priv->region_start));
@@ -856,6 +860,7 @@ int pil_boot(struct pil_desc *desc)
goto err_auth_and_reset;
}
pil_info(desc, "Brought out of reset\n");
+ desc->modem_ssr = false;
err_auth_and_reset:
if (ret && desc->subsys_vmid > 0) {
pil_assign_mem_to_linux(desc, priv->region_start,
@@ -916,6 +921,7 @@ void pil_shutdown(struct pil_desc *desc)
pil_proxy_unvote(desc, 1);
else
flush_delayed_work(&priv->proxy);
+ desc->modem_ssr = true;
}
EXPORT_SYMBOL(pil_shutdown);
diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h
index c3689faf0034..802abe26a960 100644
--- a/drivers/soc/qcom/peripheral-loader.h
+++ b/drivers/soc/qcom/peripheral-loader.h
@@ -36,6 +36,7 @@ struct pil_priv;
* @unmap_fw_mem: Custom function used to undo mapping by map_fw_mem.
* This defaults to iounmap if not specified.
* @shutdown_fail: Set if PIL op for shutting down subsystem fails.
+ * @modem_ssr: true if modem is restarting, false if booting for first time.
* @subsys_vmid: memprot id for the subsystem.
*/
struct pil_desc {
@@ -54,6 +55,7 @@ struct pil_desc {
void (*unmap_fw_mem)(void *virt, size_t size, void *data);
void *map_data;
bool shutdown_fail;
+ bool modem_ssr;
u32 subsys_vmid;
};
diff --git a/drivers/soc/qcom/pil-q6v5-mss.c b/drivers/soc/qcom/pil-q6v5-mss.c
index 5c0c1ffa8951..07641cf91aa3 100644
--- a/drivers/soc/qcom/pil-q6v5-mss.c
+++ b/drivers/soc/qcom/pil-q6v5-mss.c
@@ -214,6 +214,7 @@ static int pil_subsys_init(struct modem_data *drv,
drv->subsys_desc.stop_ack_handler = modem_stop_ack_intr_handler;
drv->subsys_desc.wdog_bite_handler = modem_wdog_bite_intr_handler;
+ drv->q6->desc.modem_ssr = false;
drv->subsys = subsys_register(&drv->subsys_desc);
if (IS_ERR(drv->subsys)) {
ret = PTR_ERR(drv->subsys);