return adsp->mem_region + offset;
 }
 
+static int adsp_parse_firmware(struct rproc *rproc, const struct firmware *fw)
+{
+       struct qcom_adsp *adsp = rproc->priv;
+       int ret;
+
+       ret = qcom_register_dump_segments(rproc, fw);
+       if (ret) {
+               dev_err(&rproc->dev, "Error in registering dump segments\n");
+               return ret;
+       }
+
+       if (adsp->has_iommu) {
+               ret = rproc_elf_load_rsc_table(rproc, fw);
+               if (ret) {
+                       dev_err(&rproc->dev, "Error in loading resource table\n");
+                       return ret;
+               }
+       }
+       return 0;
+}
+
 static unsigned long adsp_panic(struct rproc *rproc)
 {
        struct qcom_adsp *adsp = rproc->priv;
        .start = adsp_start,
        .stop = adsp_stop,
        .da_to_va = adsp_da_to_va,
-       .parse_fw = qcom_register_dump_segments,
+       .parse_fw = adsp_parse_firmware,
        .load = adsp_load,
        .panic = adsp_panic,
 };