Merge tag 'soc-drivers-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / remoteproc / qcom_q6v5_pas.c
index d5a0496..0871108 100644 (file)
 struct adsp_data {
        int crash_reason_smem;
        const char *firmware_name;
+       const char *dtb_firmware_name;
        int pas_id;
+       int dtb_pas_id;
        unsigned int minidump_id;
-       bool has_aggre2_clk;
        bool auto_boot;
        bool decrypt_shutdown;
 
@@ -47,6 +48,8 @@ struct adsp_data {
        const char *ssr_name;
        const char *sysmon_name;
        int ssctl_id;
+
+       int region_assign_idx;
 };
 
 struct qcom_adsp {
@@ -65,20 +68,33 @@ struct qcom_adsp {
 
        int proxy_pd_count;
 
+       const char *dtb_firmware_name;
        int pas_id;
+       int dtb_pas_id;
        unsigned int minidump_id;
        int crash_reason_smem;
-       bool has_aggre2_clk;
        bool decrypt_shutdown;
        const char *info_name;
 
+       const struct firmware *firmware;
+       const struct firmware *dtb_firmware;
+
        struct completion start_done;
        struct completion stop_done;
 
        phys_addr_t mem_phys;
+       phys_addr_t dtb_mem_phys;
        phys_addr_t mem_reloc;
+       phys_addr_t dtb_mem_reloc;
+       phys_addr_t region_assign_phys;
        void *mem_region;
+       void *dtb_mem_region;
        size_t mem_size;
+       size_t dtb_mem_size;
+       size_t region_assign_size;
+
+       int region_assign_idx;
+       int region_assign_perms;
 
        struct qcom_rproc_glink glink_subdev;
        struct qcom_rproc_subdev smd_subdev;
@@ -86,8 +102,27 @@ struct qcom_adsp {
        struct qcom_sysmon *sysmon;
 
        struct qcom_scm_pas_metadata pas_metadata;
+       struct qcom_scm_pas_metadata dtb_pas_metadata;
 };
 
+void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment,
+                      void *dest, size_t offset, size_t size)
+{
+       struct qcom_adsp *adsp = rproc->priv;
+       int total_offset;
+
+       total_offset = segment->da + segment->offset + offset - adsp->mem_phys;
+       if (total_offset < 0 || total_offset + size > adsp->mem_size) {
+               dev_err(adsp->dev,
+                       "invalid copy request for segment %pad with offset %zu and size %zu)\n",
+                       &segment->da, offset, size);
+               memset(dest, 0xff, size);
+               return;
+       }
+
+       memcpy_fromio(dest, adsp->mem_region + total_offset, size);
+}
+
 static void adsp_minidump(struct rproc *rproc)
 {
        struct qcom_adsp *adsp = rproc->priv;
@@ -95,7 +130,7 @@ static void adsp_minidump(struct rproc *rproc)
        if (rproc->dump_conf == RPROC_COREDUMP_DISABLED)
                return;
 
-       qcom_minidump(rproc, adsp->minidump_id);
+       qcom_minidump(rproc, adsp->minidump_id, adsp_segment_dump);
 }
 
 static int adsp_pds_enable(struct qcom_adsp *adsp, struct device **pds,
@@ -160,6 +195,8 @@ static int adsp_unprepare(struct rproc *rproc)
         * here.
         */
        qcom_scm_pas_metadata_release(&adsp->pas_metadata);
+       if (adsp->dtb_pas_id)
+               qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
 
        return 0;
 }
@@ -169,20 +206,40 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
        struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
        int ret;
 
-       ret = qcom_mdt_pas_init(adsp->dev, fw, rproc->firmware, adsp->pas_id,
-                               adsp->mem_phys, &adsp->pas_metadata);
-       if (ret)
-               return ret;
+       /* Store firmware handle to be used in adsp_start() */
+       adsp->firmware = fw;
 
-       ret = qcom_mdt_load_no_init(adsp->dev, fw, rproc->firmware, adsp->pas_id,
-                                   adsp->mem_region, adsp->mem_phys, adsp->mem_size,
-                                   &adsp->mem_reloc);
-       if (ret)
-               return ret;
+       if (adsp->dtb_pas_id) {
+               ret = request_firmware(&adsp->dtb_firmware, adsp->dtb_firmware_name, adsp->dev);
+               if (ret) {
+                       dev_err(adsp->dev, "request_firmware failed for %s: %d\n",
+                               adsp->dtb_firmware_name, ret);
+                       return ret;
+               }
 
-       qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size);
+               ret = qcom_mdt_pas_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,
+                                       adsp->dtb_pas_id, adsp->dtb_mem_phys,
+                                       &adsp->dtb_pas_metadata);
+               if (ret)
+                       goto release_dtb_firmware;
+
+               ret = qcom_mdt_load_no_init(adsp->dev, adsp->dtb_firmware, adsp->dtb_firmware_name,
+                                           adsp->dtb_pas_id, adsp->dtb_mem_region,
+                                           adsp->dtb_mem_phys, adsp->dtb_mem_size,
+                                           &adsp->dtb_mem_reloc);
+               if (ret)
+                       goto release_dtb_metadata;
+       }
 
        return 0;
+
+release_dtb_metadata:
+       qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
+
+release_dtb_firmware:
+       release_firmware(adsp->dtb_firmware);
+
+       return ret;
 }
 
 static int adsp_start(struct rproc *rproc)
@@ -218,24 +275,55 @@ static int adsp_start(struct rproc *rproc)
                        goto disable_cx_supply;
        }
 
+       if (adsp->dtb_pas_id) {
+               ret = qcom_scm_pas_auth_and_reset(adsp->dtb_pas_id);
+               if (ret) {
+                       dev_err(adsp->dev,
+                               "failed to authenticate dtb image and release reset\n");
+                       goto disable_px_supply;
+               }
+       }
+
+       ret = qcom_mdt_pas_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,
+                               adsp->mem_phys, &adsp->pas_metadata);
+       if (ret)
+               goto disable_px_supply;
+
+       ret = qcom_mdt_load_no_init(adsp->dev, adsp->firmware, rproc->firmware, adsp->pas_id,
+                                   adsp->mem_region, adsp->mem_phys, adsp->mem_size,
+                                   &adsp->mem_reloc);
+       if (ret)
+               goto release_pas_metadata;
+
+       qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size);
+
        ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);
        if (ret) {
                dev_err(adsp->dev,
                        "failed to authenticate image and release reset\n");
-               goto disable_px_supply;
+               goto release_pas_metadata;
        }
 
        ret = qcom_q6v5_wait_for_start(&adsp->q6v5, msecs_to_jiffies(5000));
        if (ret == -ETIMEDOUT) {
                dev_err(adsp->dev, "start timed out\n");
                qcom_scm_pas_shutdown(adsp->pas_id);
-               goto disable_px_supply;
+               goto release_pas_metadata;
        }
 
        qcom_scm_pas_metadata_release(&adsp->pas_metadata);
+       if (adsp->dtb_pas_id)
+               qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
+
+       /* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
+       adsp->firmware = NULL;
 
        return 0;
 
+release_pas_metadata:
+       qcom_scm_pas_metadata_release(&adsp->pas_metadata);
+       if (adsp->dtb_pas_id)
+               qcom_scm_pas_metadata_release(&adsp->dtb_pas_metadata);
 disable_px_supply:
        if (adsp->px_supply)
                regulator_disable(adsp->px_supply);
@@ -251,6 +339,9 @@ disable_proxy_pds:
 disable_irqs:
        qcom_q6v5_unprepare(&adsp->q6v5);
 
+       /* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
+       adsp->firmware = NULL;
+
        return ret;
 }
 
@@ -284,6 +375,12 @@ static int adsp_stop(struct rproc *rproc)
        if (ret)
                dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
 
+       if (adsp->dtb_pas_id) {
+               ret = qcom_scm_pas_shutdown(adsp->dtb_pas_id);
+               if (ret)
+                       dev_err(adsp->dev, "failed to shutdown dtb: %d\n", ret);
+       }
+
        handover = qcom_q6v5_unprepare(&adsp->q6v5);
        if (handover)
                qcom_pas_handover(&adsp->q6v5);
@@ -345,15 +442,13 @@ static int adsp_init_clock(struct qcom_adsp *adsp)
                return ret;
        }
 
-       if (adsp->has_aggre2_clk) {
-               adsp->aggre2_clk = devm_clk_get(adsp->dev, "aggre2");
-               if (IS_ERR(adsp->aggre2_clk)) {
-                       ret = PTR_ERR(adsp->aggre2_clk);
-                       if (ret != -EPROBE_DEFER)
-                               dev_err(adsp->dev,
-                                       "failed to get aggre2 clock");
-                       return ret;
-               }
+       adsp->aggre2_clk = devm_clk_get_optional(adsp->dev, "aggre2");
+       if (IS_ERR(adsp->aggre2_clk)) {
+               ret = PTR_ERR(adsp->aggre2_clk);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(adsp->dev,
+                               "failed to get aggre2 clock");
+               return ret;
        }
 
        return 0;
@@ -462,15 +557,95 @@ static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
                return -EBUSY;
        }
 
+       if (!adsp->dtb_pas_id)
+               return 0;
+
+       node = of_parse_phandle(adsp->dev->of_node, "memory-region", 1);
+       if (!node) {
+               dev_err(adsp->dev, "no dtb memory-region specified\n");
+               return -EINVAL;
+       }
+
+       ret = of_address_to_resource(node, 0, &r);
+       if (ret)
+               return ret;
+
+       adsp->dtb_mem_phys = adsp->dtb_mem_reloc = r.start;
+       adsp->dtb_mem_size = resource_size(&r);
+       adsp->dtb_mem_region = devm_ioremap_wc(adsp->dev, adsp->dtb_mem_phys, adsp->dtb_mem_size);
+       if (!adsp->dtb_mem_region) {
+               dev_err(adsp->dev, "unable to map dtb memory region: %pa+%zx\n",
+                       &r.start, adsp->dtb_mem_size);
+               return -EBUSY;
+       }
+
        return 0;
 }
 
+static int adsp_assign_memory_region(struct qcom_adsp *adsp)
+{
+       struct qcom_scm_vmperm perm;
+       struct device_node *node;
+       struct resource r;
+       int ret;
+
+       if (!adsp->region_assign_idx)
+               return 0;
+
+       node = of_parse_phandle(adsp->dev->of_node, "memory-region", adsp->region_assign_idx);
+       if (!node) {
+               dev_err(adsp->dev, "missing shareable memory-region\n");
+               return -EINVAL;
+       }
+
+       ret = of_address_to_resource(node, 0, &r);
+       if (ret)
+               return ret;
+
+       perm.vmid = QCOM_SCM_VMID_MSS_MSA;
+       perm.perm = QCOM_SCM_PERM_RW;
+
+       adsp->region_assign_phys = r.start;
+       adsp->region_assign_size = resource_size(&r);
+       adsp->region_assign_perms = BIT(QCOM_SCM_VMID_HLOS);
+
+       ret = qcom_scm_assign_mem(adsp->region_assign_phys,
+                                 adsp->region_assign_size,
+                                 &adsp->region_assign_perms,
+                                 &perm, 1);
+       if (ret < 0) {
+               dev_err(adsp->dev, "assign memory failed\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static void adsp_unassign_memory_region(struct qcom_adsp *adsp)
+{
+       struct qcom_scm_vmperm perm;
+       int ret;
+
+       if (!adsp->region_assign_idx)
+               return;
+
+       perm.vmid = QCOM_SCM_VMID_HLOS;
+       perm.perm = QCOM_SCM_PERM_RW;
+
+       ret = qcom_scm_assign_mem(adsp->region_assign_phys,
+                                 adsp->region_assign_size,
+                                 &adsp->region_assign_perms,
+                                 &perm, 1);
+       if (ret < 0)
+               dev_err(adsp->dev, "unassign memory failed\n");
+}
+
 static int adsp_probe(struct platform_device *pdev)
 {
        const struct adsp_data *desc;
        struct qcom_adsp *adsp;
        struct rproc *rproc;
-       const char *fw_name;
+       const char *fw_name, *dtb_fw_name = NULL;
        const struct rproc_ops *ops = &adsp_ops;
        int ret;
 
@@ -487,6 +662,14 @@ static int adsp_probe(struct platform_device *pdev)
        if (ret < 0 && ret != -EINVAL)
                return ret;
 
+       if (desc->dtb_firmware_name) {
+               dtb_fw_name = desc->dtb_firmware_name;
+               ret = of_property_read_string_index(pdev->dev.of_node, "firmware-name", 1,
+                                                   &dtb_fw_name);
+               if (ret < 0 && ret != -EINVAL)
+                       return ret;
+       }
+
        if (desc->minidump_id)
                ops = &adsp_minidump_ops;
 
@@ -505,9 +688,13 @@ static int adsp_probe(struct platform_device *pdev)
        adsp->rproc = rproc;
        adsp->minidump_id = desc->minidump_id;
        adsp->pas_id = desc->pas_id;
-       adsp->has_aggre2_clk = desc->has_aggre2_clk;
        adsp->info_name = desc->sysmon_name;
        adsp->decrypt_shutdown = desc->decrypt_shutdown;
+       adsp->region_assign_idx = desc->region_assign_idx;
+       if (dtb_fw_name) {
+               adsp->dtb_firmware_name = dtb_fw_name;
+               adsp->dtb_pas_id = desc->dtb_pas_id;
+       }
        platform_set_drvdata(pdev, adsp);
 
        ret = device_init_wakeup(adsp->dev, true);
@@ -518,6 +705,10 @@ static int adsp_probe(struct platform_device *pdev)
        if (ret)
                goto free_rproc;
 
+       ret = adsp_assign_memory_region(adsp);
+       if (ret)
+               goto free_rproc;
+
        ret = adsp_init_clock(adsp);
        if (ret)
                goto free_rproc;
@@ -539,7 +730,6 @@ static int adsp_probe(struct platform_device *pdev)
 
        qcom_add_glink_subdev(rproc, &adsp->glink_subdev, desc->ssr_name);
        qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
-       qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
        adsp->sysmon = qcom_add_sysmon_subdev(rproc,
                                              desc->sysmon_name,
                                              desc->ssctl_id);
@@ -548,6 +738,7 @@ static int adsp_probe(struct platform_device *pdev)
                goto detach_proxy_pds;
        }
 
+       qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
        ret = rproc_add(rproc);
        if (ret)
                goto detach_proxy_pds;
@@ -570,6 +761,7 @@ static int adsp_remove(struct platform_device *pdev)
        rproc_del(adsp->rproc);
 
        qcom_q6v5_deinit(&adsp->q6v5);
+       adsp_unassign_memory_region(adsp);
        qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
        qcom_remove_sysmon_subdev(adsp->sysmon);
        qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
@@ -585,7 +777,6 @@ static const struct adsp_data adsp_resource_init = {
                .crash_reason_smem = 423,
                .firmware_name = "adsp.mdt",
                .pas_id = 1,
-               .has_aggre2_clk = false,
                .auto_boot = true,
                .ssr_name = "lpass",
                .sysmon_name = "adsp",
@@ -596,7 +787,6 @@ static const struct adsp_data sdm845_adsp_resource_init = {
                .crash_reason_smem = 423,
                .firmware_name = "adsp.mdt",
                .pas_id = 1,
-               .has_aggre2_clk = false,
                .auto_boot = true,
                .load_state = "adsp",
                .ssr_name = "lpass",
@@ -608,7 +798,6 @@ static const struct adsp_data sm6350_adsp_resource = {
        .crash_reason_smem = 423,
        .firmware_name = "adsp.mdt",
        .pas_id = 1,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "lcx",
@@ -625,7 +814,6 @@ static const struct adsp_data sm8150_adsp_resource = {
                .crash_reason_smem = 423,
                .firmware_name = "adsp.mdt",
                .pas_id = 1,
-               .has_aggre2_clk = false,
                .auto_boot = true,
                .proxy_pd_names = (char*[]){
                        "cx",
@@ -641,7 +829,6 @@ static const struct adsp_data sm8250_adsp_resource = {
        .crash_reason_smem = 423,
        .firmware_name = "adsp.mdt",
        .pas_id = 1,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "lcx",
@@ -658,7 +845,6 @@ static const struct adsp_data sm8350_adsp_resource = {
        .crash_reason_smem = 423,
        .firmware_name = "adsp.mdt",
        .pas_id = 1,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "lcx",
@@ -675,7 +861,6 @@ static const struct adsp_data msm8996_adsp_resource = {
                .crash_reason_smem = 423,
                .firmware_name = "adsp.mdt",
                .pas_id = 1,
-               .has_aggre2_clk = false,
                .auto_boot = true,
                .proxy_pd_names = (char*[]){
                        "cx",
@@ -690,7 +875,6 @@ static const struct adsp_data cdsp_resource_init = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .ssr_name = "cdsp",
        .sysmon_name = "cdsp",
@@ -701,7 +885,6 @@ static const struct adsp_data sdm845_cdsp_resource_init = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .load_state = "cdsp",
        .ssr_name = "cdsp",
@@ -713,7 +896,6 @@ static const struct adsp_data sm6350_cdsp_resource = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -730,7 +912,6 @@ static const struct adsp_data sm8150_cdsp_resource = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -746,7 +927,6 @@ static const struct adsp_data sm8250_cdsp_resource = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -762,7 +942,6 @@ static const struct adsp_data sc8280xp_nsp0_resource = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "nsp",
@@ -777,7 +956,6 @@ static const struct adsp_data sc8280xp_nsp1_resource = {
        .crash_reason_smem = 633,
        .firmware_name = "cdsp.mdt",
        .pas_id = 30,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "nsp",
@@ -792,7 +970,6 @@ static const struct adsp_data sm8350_cdsp_resource = {
        .crash_reason_smem = 601,
        .firmware_name = "cdsp.mdt",
        .pas_id = 18,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -810,7 +987,6 @@ static const struct adsp_data mpss_resource_init = {
        .firmware_name = "modem.mdt",
        .pas_id = 4,
        .minidump_id = 3,
-       .has_aggre2_clk = false,
        .auto_boot = false,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -827,7 +1003,6 @@ static const struct adsp_data sc8180x_mpss_resource = {
        .crash_reason_smem = 421,
        .firmware_name = "modem.mdt",
        .pas_id = 4,
-       .has_aggre2_clk = false,
        .auto_boot = false,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -843,7 +1018,6 @@ static const struct adsp_data slpi_resource_init = {
                .crash_reason_smem = 424,
                .firmware_name = "slpi.mdt",
                .pas_id = 12,
-               .has_aggre2_clk = true,
                .auto_boot = true,
                .proxy_pd_names = (char*[]){
                        "ssc_cx",
@@ -858,7 +1032,6 @@ static const struct adsp_data sm8150_slpi_resource = {
                .crash_reason_smem = 424,
                .firmware_name = "slpi.mdt",
                .pas_id = 12,
-               .has_aggre2_clk = false,
                .auto_boot = true,
                .proxy_pd_names = (char*[]){
                        "lcx",
@@ -875,7 +1048,6 @@ static const struct adsp_data sm8250_slpi_resource = {
        .crash_reason_smem = 424,
        .firmware_name = "slpi.mdt",
        .pas_id = 12,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "lcx",
@@ -892,7 +1064,6 @@ static const struct adsp_data sm8350_slpi_resource = {
        .crash_reason_smem = 424,
        .firmware_name = "slpi.mdt",
        .pas_id = 12,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "lcx",
@@ -919,7 +1090,6 @@ static const struct adsp_data sdx55_mpss_resource = {
        .crash_reason_smem = 421,
        .firmware_name = "modem.mdt",
        .pas_id = 4,
-       .has_aggre2_clk = false,
        .auto_boot = true,
        .proxy_pd_names = (char*[]){
                "cx",
@@ -936,7 +1106,6 @@ static const struct adsp_data sm8450_mpss_resource = {
        .firmware_name = "modem.mdt",
        .pas_id = 4,
        .minidump_id = 3,
-       .has_aggre2_clk = false,
        .auto_boot = false,
        .decrypt_shutdown = true,
        .proxy_pd_names = (char*[]){
@@ -950,8 +1119,69 @@ static const struct adsp_data sm8450_mpss_resource = {
        .ssctl_id = 0x12,
 };
 
+static const struct adsp_data sm8550_adsp_resource = {
+       .crash_reason_smem = 423,
+       .firmware_name = "adsp.mdt",
+       .dtb_firmware_name = "adsp_dtb.mdt",
+       .pas_id = 1,
+       .dtb_pas_id = 0x24,
+       .minidump_id = 5,
+       .auto_boot = true,
+       .proxy_pd_names = (char*[]){
+               "lcx",
+               "lmx",
+               NULL
+       },
+       .load_state = "adsp",
+       .ssr_name = "lpass",
+       .sysmon_name = "adsp",
+       .ssctl_id = 0x14,
+};
+
+static const struct adsp_data sm8550_cdsp_resource = {
+       .crash_reason_smem = 601,
+       .firmware_name = "cdsp.mdt",
+       .dtb_firmware_name = "cdsp_dtb.mdt",
+       .pas_id = 18,
+       .dtb_pas_id = 0x25,
+       .minidump_id = 7,
+       .auto_boot = true,
+       .proxy_pd_names = (char*[]){
+               "cx",
+               "mxc",
+               "nsp",
+               NULL
+       },
+       .load_state = "cdsp",
+       .ssr_name = "cdsp",
+       .sysmon_name = "cdsp",
+       .ssctl_id = 0x17,
+};
+
+static const struct adsp_data sm8550_mpss_resource = {
+       .crash_reason_smem = 421,
+       .firmware_name = "modem.mdt",
+       .dtb_firmware_name = "modem_dtb.mdt",
+       .pas_id = 4,
+       .dtb_pas_id = 0x26,
+       .minidump_id = 3,
+       .auto_boot = false,
+       .decrypt_shutdown = true,
+       .proxy_pd_names = (char*[]){
+               "cx",
+               "mss",
+               NULL
+       },
+       .load_state = "modem",
+       .ssr_name = "mpss",
+       .sysmon_name = "modem",
+       .ssctl_id = 0x12,
+       .region_assign_idx = 2,
+};
+
 static const struct of_device_id adsp_of_match[] = {
        { .compatible = "qcom,msm8226-adsp-pil", .data = &adsp_resource_init},
+       { .compatible = "qcom,msm8953-adsp-pil", .data = &msm8996_adsp_resource},
        { .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},
        { .compatible = "qcom,msm8996-adsp-pil", .data = &msm8996_adsp_resource},
        { .compatible = "qcom,msm8996-slpi-pil", .data = &slpi_resource_init},
@@ -972,6 +1202,9 @@ static const struct of_device_id adsp_of_match[] = {
        { .compatible = "qcom,sdm845-adsp-pas", .data = &sdm845_adsp_resource_init},
        { .compatible = "qcom,sdm845-cdsp-pas", .data = &sdm845_cdsp_resource_init},
        { .compatible = "qcom,sdx55-mpss-pas", .data = &sdx55_mpss_resource},
+       { .compatible = "qcom,sm6115-adsp-pas", .data = &adsp_resource_init},
+       { .compatible = "qcom,sm6115-cdsp-pas", .data = &cdsp_resource_init},
+       { .compatible = "qcom,sm6115-mpss-pas", .data = &sc8180x_mpss_resource},
        { .compatible = "qcom,sm6350-adsp-pas", .data = &sm6350_adsp_resource},
        { .compatible = "qcom,sm6350-cdsp-pas", .data = &sm6350_cdsp_resource},
        { .compatible = "qcom,sm6350-mpss-pas", .data = &mpss_resource_init},
@@ -990,6 +1223,9 @@ static const struct of_device_id adsp_of_match[] = {
        { .compatible = "qcom,sm8450-cdsp-pas", .data = &sm8350_cdsp_resource},
        { .compatible = "qcom,sm8450-slpi-pas", .data = &sm8350_slpi_resource},
        { .compatible = "qcom,sm8450-mpss-pas", .data = &sm8450_mpss_resource},
+       { .compatible = "qcom,sm8550-adsp-pas", .data = &sm8550_adsp_resource},
+       { .compatible = "qcom,sm8550-cdsp-pas", .data = &sm8550_cdsp_resource},
+       { .compatible = "qcom,sm8550-mpss-pas", .data = &sm8550_mpss_resource},
        { },
 };
 MODULE_DEVICE_TABLE(of, adsp_of_match);