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 <pkurapat@codeaurora.org>
This commit is contained in:
Praveen Kurapati 2021-03-11 15:43:01 +05:30
commit 0393a19b6d
2 changed files with 51 additions and 0 deletions

View file

@ -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;
}

View file

@ -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;
};
/**