From 0393a19b6db07e9abcbc90186a94098c159cd6a5 Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Thu, 11 Mar 2021 15:43:01 +0530 Subject: [PATCH] msm: ipa3: Add smp2p changes for modem load FW Add changes wrt SMP2P for modem loading the IPA FW. Change-Id: I41d42b044d7f9020c4ff9932406bf8fb6f55db6b Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 48 +++++++++++++++++++++++++ drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 3 ++ 2 files changed, 51 insertions(+) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index b7c78df17e3d..93d2c9d75940 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -7577,6 +7577,8 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, } } + ipa3_ctx->modem_load_ipa_fw = resource_p->modem_load_ipa_fw; + cdev = &ipa3_ctx->cdev.cdev; cdev_init(cdev, &ipa3_drv_fops); cdev->owner = THIS_MODULE; @@ -7949,6 +7951,7 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->ipa_endp_delay_wa_v2 = false; ipa_drv_res->is_eth_bridging_supported = false; ipa_drv_res->is_bw_monitor_supported = false; + ipa_drv_res->modem_load_ipa_fw = false; /* Get IPA HW Version */ result = of_property_read_u32(pdev->dev.of_node, "qcom,ipa-hw-ver", @@ -8236,6 +8239,13 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, IPADBG(": gsi wdi db polling = %s\n", ipa_drv_res->gsi_wdi_db_polling ? "True" : "False"); + ipa_drv_res->modem_load_ipa_fw = + of_property_read_bool(pdev->dev.of_node, + "qcom,modem-load-ipa-fw"); + IPADBG(": Load IPA_FW by modem = %s\n", + ipa_drv_res->modem_load_ipa_fw + ? "True" : "False"); + result = of_property_read_string(pdev->dev.of_node, "qcom,use-gsi-ipa-fw", &ipa_drv_res->gsi_fw_file_name); if (!result) @@ -8964,6 +8974,27 @@ static int ipa3_attach_to_smmu(void) return 0; } +static irqreturn_t ipa_smp2p_modem_fw_load_ready_isr(int irq, void *ctxt) +{ + int result; + + if (!ipa3_ctx->smp2p_info.disabled) { + result = ipa3_attach_to_smmu(); + if (result) { + IPAERR("IPA attach to smmu failed %d\n", result); + goto bail; + } + result = ipa3_post_init(&ipa3_res, ipa3_ctx->cdev.dev); + if (result) { + IPAERR("IPA post init failed %d\n", result); + goto bail; + } + ipa3_ctx->smp2p_info.disabled = true; + } + +bail: + return IRQ_HANDLED; +} static irqreturn_t ipa3_smp2p_modem_clk_query_isr(int irq, void *ctxt) { ipa3_freeze_clock_vote_and_notify_modem(); @@ -9016,6 +9047,23 @@ static int ipa3_smp2p_probe(struct device *dev) IPAERR("fail to register smp2p irq=%d\n", irq); return -ENODEV; } + + if (ipa3_ctx->modem_load_ipa_fw) { + res = irq = of_irq_get_byname(node, "ipa-fw-load-ready"); + if (res < 0) { + IPADBG("of_irq_get_byname returned %d\n", irq); + return res; + } + + res = devm_request_threaded_irq(dev, irq, NULL, + (irq_handler_t)ipa_smp2p_modem_fw_load_ready_isr, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "ipa_fw_load_ready", dev); + if (res) { + IPAERR("fail to register smp2p irq=%d\n", irq); + return -ENODEV; + } + } } return 0; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index c8653426a0a3..3bf3fa267327 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1704,6 +1704,7 @@ struct ipa3_smp2p_info { u32 in_base_id; bool ipa_clk_on; bool res_sent; + bool disabled; unsigned int smem_bit; struct qcom_smem_state *smem_state; }; @@ -2151,6 +2152,7 @@ struct ipa3_context { bool ipa_endp_delay_wa_v2; bool is_eth_bridging_supported; bool is_bw_monitor_supported; + bool modem_load_ipa_fw; }; struct ipa3_plat_drv_res { @@ -2222,6 +2224,7 @@ struct ipa3_plat_drv_res { bool ipa_endp_delay_wa_v2; bool is_eth_bridging_supported; bool is_bw_monitor_supported; + bool modem_load_ipa_fw; }; /**