From f5e30fb6c73eeee97189d5ff72c9f045aa1b623d Mon Sep 17 00:00:00 2001 From: Gokul krishna Krishnakumar Date: Mon, 18 Jul 2022 16:22:14 -0700 Subject: [PATCH] remoteproc: qcom_q6v5_pas: Add support to setup mpss dsm mem region MPSS DSM mem region is needed by Modem PDs. This change sets it up before bringing MPSS out of reset. Change-Id: Ic882b678f373deb5c61e250f8620b5dd4c092ee2 Signed-off-by: Satya Durga Srinivasu Prabhala Signed-off-by: Gokul krishna Krishnakumar --- drivers/remoteproc/qcom_q6v5_pas.c | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index d9735b269c65..2df035e85c83 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -29,6 +29,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -49,6 +50,7 @@ static struct icc_path *scm_perf_client; static int scm_pas_bw_count; static DEFINE_MUTEX(scm_pas_bw_mutex); bool timeout_disabled; +static bool mpss_dsm_mem_setup; struct adsp_data { int crash_reason_smem; @@ -952,6 +954,41 @@ static int adsp_setup_32b_dma_allocs(struct qcom_adsp *adsp) return ret; } +static int setup_mpss_dsm_mem(struct platform_device *pdev) +{ + struct device_node *node; + struct resource res; + int hlosvm[1] = {VMID_HLOS}; + int mssvm[1] = {VMID_MSS_MSA}; + int vmperm[1] = {PERM_READ | PERM_WRITE}; + phys_addr_t mem_phys; + u64 mem_size; + int ret; + + node = of_parse_phandle(pdev->dev.of_node, "mpss_dsm_mem_reg", 0); + if (!node) { + dev_err(&pdev->dev, "mpss dsm mem region is missing\n"); + return -EINVAL; + } + + ret = of_address_to_resource(node, 0, &res); + if (ret) { + dev_err(&pdev->dev, "address to resource failed for mpss dsm mem\n"); + return ret; + } + + mem_phys = res.start; + mem_size = resource_size(&res); + ret = hyp_assign_phys(mem_phys, mem_size, hlosvm, 1, mssvm, vmperm, 1); + if (ret) { + dev_err(&pdev->dev, "hyp assign for mpss dsm mem failed\n"); + return ret; + } + + mpss_dsm_mem_setup = true; + return 0; +} + static int adsp_probe(struct platform_device *pdev) { const struct adsp_data *desc; @@ -975,6 +1012,14 @@ static int adsp_probe(struct platform_device *pdev) if (ret < 0 && ret != -EINVAL) return ret; + if (!mpss_dsm_mem_setup && !strcmp(fw_name, "modem.mdt")) { + ret = setup_mpss_dsm_mem(pdev); + if (ret) { + dev_err(&pdev->dev, "failed to setup mpss dsm mem\n"); + return -EINVAL; + } + } + if (desc->minidump_id) ops = &adsp_minidump_ops;