Loading drivers/soc/qcom/pil-msa.c +80 −8 Original line number Diff line number Diff line Loading @@ -316,10 +316,18 @@ int __pil_mss_deinit_image(struct pil_desc *pil, bool err_path) /* In case of any failure where reclaim MBA memory * could not happen, free the memory here */ if (drv->q6->mba_virt) if (drv->q6->mba_virt) { dma_free_attrs(&drv->mba_mem_dev, drv->q6->mba_size, drv->q6->mba_virt, drv->q6->mba_phys, &drv->attrs_dma); drv->q6->mba_virt = NULL; } if (drv->q6->dp_virt) { dma_free_attrs(&drv->mba_mem_dev, drv->q6->dp_size, drv->q6->dp_virt, drv->q6->dp_phys, &drv->attrs_dma); drv->q6->dp_virt = NULL; } return ret; } Loading Loading @@ -409,6 +417,19 @@ static int pil_mss_reset(struct pil_desc *pil) drv->reg_base + QDSP6SS_RST_EVB); } /* Program DP Address */ if (drv->dp_virt) { writel_relaxed(drv->dp_phys, drv->rmb_base + RMB_PMI_CODE_START); writel_relaxed(drv->dp_size, drv->rmb_base + RMB_PMI_CODE_LENGTH); } else { writel_relaxed(0, drv->rmb_base + RMB_PMI_CODE_START); writel_relaxed(0, drv->rmb_base + RMB_PMI_CODE_LENGTH); } /* Make sure RMB regs are written before bringing modem out of reset */ mb(); ret = pil_q6v5_reset(pil); if (ret) goto err_q6v5_reset; Loading Loading @@ -442,9 +463,10 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); const struct firmware *fw; const struct firmware *fw, *dp_fw; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *dp_name = "msadp"; char *fw_name_p; void *mba_virt; dma_addr_t mba_phys, mba_phys_end; Loading Loading @@ -484,26 +506,67 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) if (!data) { dev_err(pil->dev, "MBA data is NULL\n"); ret = -ENOMEM; goto err_mss_reset; goto err_mba_data; } count = fw->size; memcpy(mba_virt, data, count); wmb(); /* Load modem debug policy */ ret = request_firmware(&dp_fw, dp_name, pil->dev); if (ret) { drv->dp_virt = NULL; dev_warn(pil->dev, "MBA: Debug policy not present - %s\n", dp_name); } else { if (!dp_fw || !dp_fw->data) { dev_err(pil->dev, "Invalid DP firmware\n"); ret = -ENOMEM; goto err_invalid_fw; } mba_virt = dma_alloc_attrs(&md->mba_mem_dev, dp_fw->size, &mba_phys, GFP_KERNEL, &md->attrs_dma); if (!mba_virt) { dev_err(pil->dev, "MBA: DP metadata buffer allocation failed\n"); ret = -ENOMEM; goto err_invalid_fw; } drv->dp_size = dp_fw->size; drv->dp_phys = mba_phys; drv->dp_virt = mba_virt; mba_phys_end = mba_phys + drv->dp_size; dev_info(pil->dev, "MBA: DP loading from %pa to %pa\n", &mba_phys, &mba_phys_end); memcpy(mba_virt, dp_fw->data, dp_fw->size); /* Ensure memcpy is done before powering up modem */ wmb(); } ret = pil_mss_reset(pil); if (ret) { dev_err(pil->dev, "MBA boot failed.\n"); goto err_mss_reset; } if (drv->dp_virt) release_firmware(dp_fw); release_firmware(fw); return 0; err_mss_reset: if (drv->dp_virt) dma_free_attrs(&md->mba_mem_dev, dp_fw->size, drv->dp_virt, drv->dp_phys, &md->attrs_dma); err_invalid_fw: if (dp_fw) release_firmware(dp_fw); err_mba_data: dma_free_attrs(&md->mba_mem_dev, drv->mba_size, drv->mba_virt, drv->mba_phys, &md->attrs_dma); drv->mba_virt = NULL; drv->dp_virt = NULL; err_dma_alloc: release_firmware(fw); return ret; Loading Loading @@ -624,7 +687,8 @@ static int pil_msa_mba_auth(struct pil_desc *pil) ret = -EINVAL; } if (drv->q6 && drv->q6->mba_virt) { if (drv->q6) { if (drv->q6->mba_virt) { /* Reclaim MBA memory. */ dma_free_attrs(&drv->mba_mem_dev, drv->q6->mba_size, drv->q6->mba_virt, drv->q6->mba_phys, Loading @@ -632,6 +696,14 @@ static int pil_msa_mba_auth(struct pil_desc *pil) drv->q6->mba_virt = NULL; } if (drv->q6->dp_virt) { /* Reclaim Modem DP memory. */ dma_free_attrs(&drv->mba_mem_dev, drv->q6->dp_size, drv->q6->dp_virt, drv->q6->dp_phys, &drv->attrs_dma); drv->q6->dp_virt = NULL; } } if (ret) modem_log_rmb_regs(drv->rmb_base); if (q6_drv->ahb_clk_vote) Loading drivers/soc/qcom/pil-q6v5.h +3 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,9 @@ struct q6v5_data { phys_addr_t mba_phys; void *mba_virt; size_t mba_size; phys_addr_t dp_phys; void *dp_virt; size_t dp_size; bool qdsp6v55; bool qdsp6v5_2_0; bool qdsp6v56; Loading Loading
drivers/soc/qcom/pil-msa.c +80 −8 Original line number Diff line number Diff line Loading @@ -316,10 +316,18 @@ int __pil_mss_deinit_image(struct pil_desc *pil, bool err_path) /* In case of any failure where reclaim MBA memory * could not happen, free the memory here */ if (drv->q6->mba_virt) if (drv->q6->mba_virt) { dma_free_attrs(&drv->mba_mem_dev, drv->q6->mba_size, drv->q6->mba_virt, drv->q6->mba_phys, &drv->attrs_dma); drv->q6->mba_virt = NULL; } if (drv->q6->dp_virt) { dma_free_attrs(&drv->mba_mem_dev, drv->q6->dp_size, drv->q6->dp_virt, drv->q6->dp_phys, &drv->attrs_dma); drv->q6->dp_virt = NULL; } return ret; } Loading Loading @@ -409,6 +417,19 @@ static int pil_mss_reset(struct pil_desc *pil) drv->reg_base + QDSP6SS_RST_EVB); } /* Program DP Address */ if (drv->dp_virt) { writel_relaxed(drv->dp_phys, drv->rmb_base + RMB_PMI_CODE_START); writel_relaxed(drv->dp_size, drv->rmb_base + RMB_PMI_CODE_LENGTH); } else { writel_relaxed(0, drv->rmb_base + RMB_PMI_CODE_START); writel_relaxed(0, drv->rmb_base + RMB_PMI_CODE_LENGTH); } /* Make sure RMB regs are written before bringing modem out of reset */ mb(); ret = pil_q6v5_reset(pil); if (ret) goto err_q6v5_reset; Loading Loading @@ -442,9 +463,10 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); const struct firmware *fw; const struct firmware *fw, *dp_fw; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *dp_name = "msadp"; char *fw_name_p; void *mba_virt; dma_addr_t mba_phys, mba_phys_end; Loading Loading @@ -484,26 +506,67 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) if (!data) { dev_err(pil->dev, "MBA data is NULL\n"); ret = -ENOMEM; goto err_mss_reset; goto err_mba_data; } count = fw->size; memcpy(mba_virt, data, count); wmb(); /* Load modem debug policy */ ret = request_firmware(&dp_fw, dp_name, pil->dev); if (ret) { drv->dp_virt = NULL; dev_warn(pil->dev, "MBA: Debug policy not present - %s\n", dp_name); } else { if (!dp_fw || !dp_fw->data) { dev_err(pil->dev, "Invalid DP firmware\n"); ret = -ENOMEM; goto err_invalid_fw; } mba_virt = dma_alloc_attrs(&md->mba_mem_dev, dp_fw->size, &mba_phys, GFP_KERNEL, &md->attrs_dma); if (!mba_virt) { dev_err(pil->dev, "MBA: DP metadata buffer allocation failed\n"); ret = -ENOMEM; goto err_invalid_fw; } drv->dp_size = dp_fw->size; drv->dp_phys = mba_phys; drv->dp_virt = mba_virt; mba_phys_end = mba_phys + drv->dp_size; dev_info(pil->dev, "MBA: DP loading from %pa to %pa\n", &mba_phys, &mba_phys_end); memcpy(mba_virt, dp_fw->data, dp_fw->size); /* Ensure memcpy is done before powering up modem */ wmb(); } ret = pil_mss_reset(pil); if (ret) { dev_err(pil->dev, "MBA boot failed.\n"); goto err_mss_reset; } if (drv->dp_virt) release_firmware(dp_fw); release_firmware(fw); return 0; err_mss_reset: if (drv->dp_virt) dma_free_attrs(&md->mba_mem_dev, dp_fw->size, drv->dp_virt, drv->dp_phys, &md->attrs_dma); err_invalid_fw: if (dp_fw) release_firmware(dp_fw); err_mba_data: dma_free_attrs(&md->mba_mem_dev, drv->mba_size, drv->mba_virt, drv->mba_phys, &md->attrs_dma); drv->mba_virt = NULL; drv->dp_virt = NULL; err_dma_alloc: release_firmware(fw); return ret; Loading Loading @@ -624,7 +687,8 @@ static int pil_msa_mba_auth(struct pil_desc *pil) ret = -EINVAL; } if (drv->q6 && drv->q6->mba_virt) { if (drv->q6) { if (drv->q6->mba_virt) { /* Reclaim MBA memory. */ dma_free_attrs(&drv->mba_mem_dev, drv->q6->mba_size, drv->q6->mba_virt, drv->q6->mba_phys, Loading @@ -632,6 +696,14 @@ static int pil_msa_mba_auth(struct pil_desc *pil) drv->q6->mba_virt = NULL; } if (drv->q6->dp_virt) { /* Reclaim Modem DP memory. */ dma_free_attrs(&drv->mba_mem_dev, drv->q6->dp_size, drv->q6->dp_virt, drv->q6->dp_phys, &drv->attrs_dma); drv->q6->dp_virt = NULL; } } if (ret) modem_log_rmb_regs(drv->rmb_base); if (q6_drv->ahb_clk_vote) Loading
drivers/soc/qcom/pil-q6v5.h +3 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,9 @@ struct q6v5_data { phys_addr_t mba_phys; void *mba_virt; size_t mba_size; phys_addr_t dp_phys; void *dp_virt; size_t dp_size; bool qdsp6v55; bool qdsp6v5_2_0; bool qdsp6v56; Loading