From f5e30fb6c73eeee97189d5ff72c9f045aa1b623d Mon Sep 17 00:00:00 2001 From: Gokul krishna Krishnakumar Date: Mon, 18 Jul 2022 16:22:14 -0700 Subject: [PATCH 1/3] 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; From a5235ba22ecc9e06f8a6d6a7514a756c31971052 Mon Sep 17 00:00:00 2001 From: Gokul krishna Krishnakumar Date: Mon, 22 Aug 2022 13:12:00 -0700 Subject: [PATCH 2/3] remoteproc: qcom_q6v5_pas: Add flag for dsm region setup Some targets don't have dsm region to be setup by remoteproc, so add a flag to check if we need to setup the dsm region or not and enable for pineapple. Change-Id: I1cdfa7ef05c3a59878ae4b07d5e0c776962a075b Signed-off-by: Melody Olvera Signed-off-by: Gokul krishna Krishnakumar --- drivers/remoteproc/qcom_q6v5_pas.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index 2df035e85c83..1304d7830094 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -65,6 +65,7 @@ struct adsp_data { bool auto_boot; bool dma_phys_below_32b; bool decrypt_shutdown; + bool needs_dsm_mem_setup; char **active_pd_names; char **proxy_pd_names; @@ -1012,7 +1013,8 @@ 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")) { + if (desc->needs_dsm_mem_setup && !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"); @@ -1514,6 +1516,7 @@ static const struct adsp_data pineapple_mpss_resource = { .uses_elf64 = true, .has_aggre2_clk = false, .auto_boot = false, + .needs_dsm_mem_setup = true, .ssr_name = "mpss", .sysmon_name = "modem", .qmp_name = "modem", From 7b161ee9c9a1bd89ddd4d7f085ce1d9721cca8fc Mon Sep 17 00:00:00 2001 From: Gokul krishna Krishnakumar Date: Wed, 9 Nov 2022 11:04:05 -0800 Subject: [PATCH 3/3] remoteproc: qcom_q6v5_pas: Map modem DSM memory ownership to MPSS Replace the hyp_assign_phys with upstream friendly qcom_scm_assign_mem. dsm memory region is needed by MPSS PDs, this call reassigns the ownership to MPSS. Change-Id: I1ae7e61d1bc74d45bb1bc58b762c5d3d59e12501 Signed-off-by: Gokul krishna Krishnakumar --- drivers/remoteproc/qcom_q6v5_pas.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index 1304d7830094..5d9a9fa025d6 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -957,14 +957,16 @@ static int adsp_setup_32b_dma_allocs(struct qcom_adsp *adsp) static int setup_mpss_dsm_mem(struct platform_device *pdev) { + struct qcom_scm_vmperm newvm[1]; 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; + int curr_perm; u64 mem_size; int ret; + newvm[0].vmid = QCOM_SCM_VMID_MSS_MSA; + newvm[0].perm = QCOM_SCM_PERM_RW; + curr_perm = BIT(QCOM_SCM_VMID_HLOS); node = of_parse_phandle(pdev->dev.of_node, "mpss_dsm_mem_reg", 0); if (!node) { @@ -980,7 +982,7 @@ static int setup_mpss_dsm_mem(struct platform_device *pdev) mem_phys = res.start; mem_size = resource_size(&res); - ret = hyp_assign_phys(mem_phys, mem_size, hlosvm, 1, mssvm, vmperm, 1); + ret = qcom_scm_assign_mem(mem_phys, mem_size, &curr_perm, newvm, 1); if (ret) { dev_err(&pdev->dev, "hyp assign for mpss dsm mem failed\n"); return ret;