Loading drivers/soc/qcom/peripheral-loader.c +29 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ #endif #define PIL_NUM_DESC 10 #define MAX_LEN 96 static void __iomem *pil_info_base; /** Loading Loading @@ -764,6 +765,23 @@ static int pil_parse_devicetree(struct pil_desc *desc) return 0; } static int pil_notify_aop(struct pil_desc *desc, char *status) { struct qmp_pkt pkt; char mbox_msg[MAX_LEN]; if (!desc->signal_aop) return 0; snprintf(mbox_msg, MAX_LEN, "{class: image, res: load_state, name: %s, val: %s}", desc->name, status); pkt.size = MAX_LEN; pkt.data = mbox_msg; return mbox_send_message(desc->mbox, &pkt); } /* Synchronize request_firmware() with suspend */ static DECLARE_RWSEM(pil_pm_rwsem); Loading @@ -785,6 +803,12 @@ int pil_boot(struct pil_desc *desc) bool mem_protect = false; bool hyp_assign = false; ret = pil_notify_aop(desc, "on"); if (ret < 0) { pil_err(desc, "Failed to send ON message to AOP rc:%d\n", ret); return ret; } if (desc->shutdown_fail) pil_err(desc, "Subsystem shutdown failed previously!\n"); Loading Loading @@ -943,6 +967,7 @@ int pil_boot(struct pil_desc *desc) priv->region = NULL; } pil_release_mmap(desc); pil_notify_aop(desc, "off"); } return ret; } Loading @@ -954,6 +979,7 @@ EXPORT_SYMBOL(pil_boot); */ void pil_shutdown(struct pil_desc *desc) { int ret; struct pil_priv *priv = desc->priv; if (desc->ops->shutdown) { Loading @@ -971,6 +997,9 @@ void pil_shutdown(struct pil_desc *desc) pil_proxy_unvote(desc, 1); else flush_delayed_work(&priv->proxy); ret = pil_notify_aop(desc, "off"); if (ret < 0) pr_warn("pil: failed to send OFF message to AOP rc:%d\n", ret); desc->modem_ssr = true; } EXPORT_SYMBOL(pil_shutdown); Loading drivers/soc/qcom/peripheral-loader.h +6 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,9 @@ #ifndef __MSM_PERIPHERAL_LOADER_H #define __MSM_PERIPHERAL_LOADER_H #include <linux/mailbox_client.h> #include <linux/mailbox/qmp.h> struct device; struct module; struct pil_priv; Loading Loading @@ -57,6 +60,9 @@ struct pil_desc { bool modem_ssr; bool clear_fw_region; u32 subsys_vmid; bool signal_aop; struct mbox_client cl; struct mbox_chan *mbox; }; /** Loading drivers/soc/qcom/subsys-pil-tz.c +16 −0 Original line number Diff line number Diff line Loading @@ -1173,6 +1173,22 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->subsys_desc.ramdump_disable_handler = subsys_ramdump_disable_intr_handler; } d->desc.signal_aop = of_property_read_bool(pdev->dev.of_node, "qcom,signal-aop"); if (d->desc.signal_aop) { d->desc.cl.dev = &pdev->dev; d->desc.cl.tx_block = true; d->desc.cl.tx_tout = 1000; d->desc.cl.knows_txdone = false; d->desc.mbox = mbox_request_channel(&d->desc.cl, 0); if (IS_ERR(d->desc.mbox)) { rc = PTR_ERR(d->desc.mbox); dev_err(&pdev->dev, "Failed to get mailbox channel %pK %d\n", d->desc.mbox, rc); goto err_ramdump; } } d->ramdump_dev = create_ramdump_device(d->subsys_desc.name, &pdev->dev); if (!d->ramdump_dev) { Loading Loading
drivers/soc/qcom/peripheral-loader.c +29 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ #endif #define PIL_NUM_DESC 10 #define MAX_LEN 96 static void __iomem *pil_info_base; /** Loading Loading @@ -764,6 +765,23 @@ static int pil_parse_devicetree(struct pil_desc *desc) return 0; } static int pil_notify_aop(struct pil_desc *desc, char *status) { struct qmp_pkt pkt; char mbox_msg[MAX_LEN]; if (!desc->signal_aop) return 0; snprintf(mbox_msg, MAX_LEN, "{class: image, res: load_state, name: %s, val: %s}", desc->name, status); pkt.size = MAX_LEN; pkt.data = mbox_msg; return mbox_send_message(desc->mbox, &pkt); } /* Synchronize request_firmware() with suspend */ static DECLARE_RWSEM(pil_pm_rwsem); Loading @@ -785,6 +803,12 @@ int pil_boot(struct pil_desc *desc) bool mem_protect = false; bool hyp_assign = false; ret = pil_notify_aop(desc, "on"); if (ret < 0) { pil_err(desc, "Failed to send ON message to AOP rc:%d\n", ret); return ret; } if (desc->shutdown_fail) pil_err(desc, "Subsystem shutdown failed previously!\n"); Loading Loading @@ -943,6 +967,7 @@ int pil_boot(struct pil_desc *desc) priv->region = NULL; } pil_release_mmap(desc); pil_notify_aop(desc, "off"); } return ret; } Loading @@ -954,6 +979,7 @@ EXPORT_SYMBOL(pil_boot); */ void pil_shutdown(struct pil_desc *desc) { int ret; struct pil_priv *priv = desc->priv; if (desc->ops->shutdown) { Loading @@ -971,6 +997,9 @@ void pil_shutdown(struct pil_desc *desc) pil_proxy_unvote(desc, 1); else flush_delayed_work(&priv->proxy); ret = pil_notify_aop(desc, "off"); if (ret < 0) pr_warn("pil: failed to send OFF message to AOP rc:%d\n", ret); desc->modem_ssr = true; } EXPORT_SYMBOL(pil_shutdown); Loading
drivers/soc/qcom/peripheral-loader.h +6 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,9 @@ #ifndef __MSM_PERIPHERAL_LOADER_H #define __MSM_PERIPHERAL_LOADER_H #include <linux/mailbox_client.h> #include <linux/mailbox/qmp.h> struct device; struct module; struct pil_priv; Loading Loading @@ -57,6 +60,9 @@ struct pil_desc { bool modem_ssr; bool clear_fw_region; u32 subsys_vmid; bool signal_aop; struct mbox_client cl; struct mbox_chan *mbox; }; /** Loading
drivers/soc/qcom/subsys-pil-tz.c +16 −0 Original line number Diff line number Diff line Loading @@ -1173,6 +1173,22 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->subsys_desc.ramdump_disable_handler = subsys_ramdump_disable_intr_handler; } d->desc.signal_aop = of_property_read_bool(pdev->dev.of_node, "qcom,signal-aop"); if (d->desc.signal_aop) { d->desc.cl.dev = &pdev->dev; d->desc.cl.tx_block = true; d->desc.cl.tx_tout = 1000; d->desc.cl.knows_txdone = false; d->desc.mbox = mbox_request_channel(&d->desc.cl, 0); if (IS_ERR(d->desc.mbox)) { rc = PTR_ERR(d->desc.mbox); dev_err(&pdev->dev, "Failed to get mailbox channel %pK %d\n", d->desc.mbox, rc); goto err_ramdump; } } d->ramdump_dev = create_ramdump_device(d->subsys_desc.name, &pdev->dev); if (!d->ramdump_dev) { Loading