remoteproc: qcom: q6v5-mss: Add modem support on MSM8953
authorSireesh Kodali <sireeshkodali1@gmail.com>
Thu, 8 Sep 2022 18:24:33 +0000 (20:24 +0200)
committerBjorn Andersson <andersson@kernel.org>
Tue, 27 Dec 2022 16:03:12 +0000 (10:03 -0600)
The modem on the MSM8953 platform is similar to the modem on the MSM8996
platform in terms of set up. It differs primarily in that TZ needs to be
informed of the modem start address and pas_id.

Signed-off-by: Sireesh Kodali <sireeshkodali1@gmail.com>
Signed-off-by: Stephan Gerhold <stephan.gerhold@kernkonzept.com>
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20220908182433.466908-8-stephan.gerhold@kernkonzept.com
drivers/remoteproc/qcom_q6v5_mss.c

index 2555f06dfc7411a26b1a30a34edab5c536cfaac5..2f4027664a0e9ce4944e0f7df9f80435173ca20c 100644 (file)
@@ -40,6 +40,8 @@
 
 #define MBA_LOG_SIZE                   SZ_4K
 
+#define MPSS_PAS_ID                    5
+
 /* RMB Status Register Values */
 #define RMB_PBL_SUCCESS                        0x1
 
@@ -239,6 +241,7 @@ struct q6v5 {
 enum {
        MSS_MSM8909,
        MSS_MSM8916,
+       MSS_MSM8953,
        MSS_MSM8974,
        MSS_MSM8996,
        MSS_MSM8998,
@@ -692,10 +695,12 @@ static int q6v5proc_reset(struct q6v5 *qproc)
                }
                goto pbl_wait;
        } else if (qproc->version == MSS_MSM8909 ||
+                  qproc->version == MSS_MSM8953 ||
                   qproc->version == MSS_MSM8996 ||
                   qproc->version == MSS_MSM8998) {
 
-               if (qproc->version != MSS_MSM8909)
+               if (qproc->version != MSS_MSM8909 &&
+                   qproc->version != MSS_MSM8953)
                        /* Override the ACC value if required */
                        writel(QDSP6SS_ACC_OVERRIDE_VAL,
                               qproc->reg_base + QDSP6SS_STRAP_ACC);
@@ -743,7 +748,8 @@ static int q6v5proc_reset(struct q6v5 *qproc)
                        writel(val, qproc->reg_base + QDSP6SS_PWR_CTL_REG);
 
                        /* Turn on L1, L2, ETB and JU memories 1 at a time */
-                       if (qproc->version == MSS_MSM8996) {
+                       if (qproc->version == MSS_MSM8953 ||
+                           qproc->version == MSS_MSM8996) {
                                mem_pwr_ctl = QDSP6SS_MEM_PWR_CTL;
                                i = 19;
                        } else {
@@ -1365,6 +1371,15 @@ static int q6v5_mpss_load(struct q6v5 *qproc)
                        max_addr = ALIGN(phdr->p_paddr + phdr->p_memsz, SZ_4K);
        }
 
+       if (qproc->version == MSS_MSM8953) {
+               ret = qcom_scm_pas_mem_setup(MPSS_PAS_ID, qproc->mpss_phys, qproc->mpss_size);
+               if (ret) {
+                       dev_err(qproc->dev,
+                               "setting up mpss memory failed: %d\n", ret);
+                       goto release_firmware;
+               }
+       }
+
        /*
         * In case of a modem subsystem restart on secure devices, the modem
         * memory can be reclaimed only after MBA is loaded.
@@ -2341,6 +2356,41 @@ static const struct rproc_hexagon_res msm8916_mss = {
        .version = MSS_MSM8916,
 };
 
+static const struct rproc_hexagon_res msm8953_mss = {
+       .hexagon_mba_image = "mba.mbn",
+       .proxy_supply = (struct qcom_mss_reg_res[]) {
+               {
+                       .supply = "pll",
+                       .uA = 100000,
+               },
+               {}
+       },
+       .proxy_clk_names = (char*[]){
+               "xo",
+               NULL
+       },
+       .active_clk_names = (char*[]){
+               "iface",
+               "bus",
+               "mem",
+               NULL
+       },
+       .proxy_pd_names = (char*[]) {
+               "cx",
+               "mx",
+               "mss",
+               NULL
+       },
+       .need_mem_protection = false,
+       .has_alt_reset = false,
+       .has_mba_logs = false,
+       .has_spare_reg = false,
+       .has_qaccept_regs = false,
+       .has_ext_cntl_regs = false,
+       .has_vq6 = false,
+       .version = MSS_MSM8953,
+};
+
 static const struct rproc_hexagon_res msm8974_mss = {
        .hexagon_mba_image = "mba.b00",
        .proxy_supply = (struct qcom_mss_reg_res[]) {
@@ -2398,6 +2448,7 @@ static const struct of_device_id q6v5_of_match[] = {
        { .compatible = "qcom,q6v5-pil", .data = &msm8916_mss},
        { .compatible = "qcom,msm8909-mss-pil", .data = &msm8909_mss},
        { .compatible = "qcom,msm8916-mss-pil", .data = &msm8916_mss},
+       { .compatible = "qcom,msm8953-mss-pil", .data = &msm8953_mss},
        { .compatible = "qcom,msm8974-mss-pil", .data = &msm8974_mss},
        { .compatible = "qcom,msm8996-mss-pil", .data = &msm8996_mss},
        { .compatible = "qcom,msm8998-mss-pil", .data = &msm8998_mss},