Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb25040d authored by Taniya Das's avatar Taniya Das Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: pil-mss: free the allocated area during ramdump



During ramdump collection, the modem subsystem needs the MBA to be
loaded again. The allocation of memory done during that time is not
currently being freed and as a result, the common CMA area is getting
filled up.
Explicitly free the allocation area before bringing down the subsystem.

CRs-Fixed: 686515
Change-Id: I28b0ed381c2ad5ee1fcfacea4913184167af9815
Signed-off-by: default avatarTaniya Das <tdas@codeaurora.org>
parent b1a0ae40
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -357,7 +357,6 @@ err_power:
	return ret;
}

#define MBA_SIZE SZ_1M
int pil_mss_reset_load_mba(struct pil_desc *pil)
{
	struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc);
@@ -380,10 +379,11 @@ int pil_mss_reset_load_mba(struct pil_desc *pil)
		return ret;
	}

	drv->mba_size = SZ_1M;
	md->mba_mem_dev.coherent_dma_mask =
		DMA_BIT_MASK(sizeof(dma_addr_t) * 8);
	mba_virt = dma_alloc_coherent(&md->mba_mem_dev, MBA_SIZE, &mba_phys,
					GFP_KERNEL);
	mba_virt = dma_alloc_coherent(&md->mba_mem_dev, drv->mba_size,
					&mba_phys, GFP_KERNEL);
	if (!mba_virt) {
		dev_err(pil->dev, "MBA metadata buffer allocation failed\n");
		ret = -ENOMEM;
@@ -410,7 +410,7 @@ int pil_mss_reset_load_mba(struct pil_desc *pil)
	return 0;

err_mss_reset:
	dma_free_coherent(&md->mba_mem_dev, MBA_SIZE, drv->mba_virt,
	dma_free_coherent(&md->mba_mem_dev, drv->mba_size, drv->mba_virt,
				drv->mba_phys);
err_dma_alloc:
	release_firmware(fw);
@@ -523,7 +523,7 @@ static int pil_msa_mba_auth(struct pil_desc *pil)

	if (drv->q6 && drv->q6->mba_virt)
		/* Reclaim MBA memory. */
		dma_free_coherent(&drv->mba_mem_dev, MBA_SIZE,
		dma_free_coherent(&drv->mba_mem_dev, drv->q6->mba_size,
					drv->q6->mba_virt, drv->q6->mba_phys);
	if (ret)
		modem_log_rmb_regs(drv->rmb_base);
+3 −0
Original line number Diff line number Diff line
@@ -165,6 +165,9 @@ static int modem_ramdump(int enable, const struct subsys_desc *subsys)
	if (ret < 0)
		pr_err("Unable to dump modem fw memory (rc = %d).\n", ret);

	dma_free_coherent(&drv->mba_mem_dev, drv->q6->mba_size,
				drv->q6->mba_virt, drv->q6->mba_phys);

	pil_mss_shutdown(&drv->q6->desc);
	pil_mss_remove_proxy_votes(&drv->q6->desc);
	return ret;
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ struct q6v5_data {
	bool self_auth;
	phys_addr_t mba_phys;
	void *mba_virt;
	size_t mba_size;
	bool qdsp6v55;
	bool qdsp6v5_2_0;
	bool qdsp6v56;