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

Commit 2828b2b3 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "slim-msm-ngd: Add support for slimbus to use LPASS memory"

parents 3003efca 40ba0aea
Loading
Loading
Loading
Loading
+45 −16
Original line number Diff line number Diff line
@@ -170,6 +170,10 @@ static int ngd_slim_qmi_new_server(struct qmi_handle *hdl,
	qmi->svc_info.sq_family = AF_QIPCRTR;
	qmi->svc_info.sq_node = service->node;
	qmi->svc_info.sq_port = service->port;
	if (dev->lpass_mem_usage) {
		dev->lpass_mem->start = dev->lpass_phy_base;
		dev->lpass.base = dev->lpass_virt_base;
	}
	atomic_set(&dev->ssr_in_progress, 0);
	schedule_work(&dev->dsp.dom_up);

@@ -692,8 +696,12 @@ static int ngd_xfer_msg(struct slim_controller *ctrl, struct slim_msg_txn *txn)
		*(puc++) = (txn->ec & 0xFF);
		*(puc++) = (txn->ec >> 8)&0xFF;
	}
	if (txn->wbuf)
	if (txn->wbuf) {
		if (dev->lpass_mem_usage)
			memcpy_toio(puc, txn->wbuf, txn->len);
		else
			memcpy(puc, txn->wbuf, txn->len);
	}
	if (txn->mt == SLIM_MSG_MT_DEST_REFERRED_USER &&
		(txn->mc == SLIM_USR_MC_CONNECT_SRC ||
		 txn->mc == SLIM_USR_MC_CONNECT_SINK ||
@@ -1750,6 +1758,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
	int ret;
	struct resource		*bam_mem;
	struct resource		*slim_mem;
	struct resource		*lpass_mem;
	struct resource		*irq, *bam_irq;
	bool			rxreg_access = false;
	bool			slim_mdm = false;
@@ -1790,6 +1799,16 @@ static int ngd_slim_probe(struct platform_device *pdev)
		dev_err(&pdev->dev, "no memory for MSM slimbus controller\n");
		return PTR_ERR(dev);
	}

	dev->lpass_mem_usage = false;
	lpass_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
						"slimbus_lpass_mem");
	if (lpass_mem) {
		dev_dbg(&pdev->dev, "Slimbus lpass memory is used\n");
		dev->lpass_mem_usage = true;
		dev->lpass_phy_base = (unsigned long long)lpass_mem->start;
	}

	dev->wr_comp = kzalloc(sizeof(struct completion *) * MSM_TX_BUFS,
				GFP_KERNEL);
	if (!dev->wr_comp) {
@@ -1849,26 +1868,40 @@ static int ngd_slim_probe(struct platform_device *pdev)
	} else
		dev->sysfs_created = true;

	dev->base = ioremap(slim_mem->start, resource_size(slim_mem));
	dev->base = devm_ioremap(&pdev->dev, slim_mem->start,
					resource_size(slim_mem));
	if (!dev->base) {
		dev_err(&pdev->dev, "IOremap failed\n");
		ret = -ENOMEM;
		goto err_ioremap_failed;
	}
	dev->bam.base = ioremap(bam_mem->start, resource_size(bam_mem));
	dev->bam.base = devm_ioremap(&pdev->dev, bam_mem->start,
					resource_size(bam_mem));
	if (!dev->bam.base) {
		dev_err(&pdev->dev, "BAM IOremap failed\n");
		ret = -ENOMEM;
		goto err_ioremap_bam_failed;
		goto err_ioremap_failed;
	}

	if (lpass_mem) {
		dev->lpass.base = devm_ioremap(&pdev->dev, lpass_mem->start,
					resource_size(lpass_mem));
		if (!dev->lpass.base) {
			dev_err(&pdev->dev, "LPASS IOremap failed\n");
			ret = -ENOMEM;
			goto err_ioremap_failed;
		}
		dev->lpass_virt_base = dev->lpass.base;
	}

	if (pdev->dev.of_node) {

		ret = of_property_read_u32(pdev->dev.of_node, "cell-index",
					&dev->ctrl.nr);
		if (ret) {
			dev_err(&pdev->dev, "Cell index not specified:%d\n",
								ret);
			goto err_ctrl_failed;
			dev_err(&pdev->dev,
					"Cell index not specified:%d\n", ret);
			goto err_ioremap_failed;
		}
		rxreg_access = of_property_read_bool(pdev->dev.of_node,
					"qcom,rxreg-access");
@@ -1889,7 +1922,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
		if (ret) {
			dev_err(dev->dev, "%s: Failed to of_platform_populate %d\n",
				__func__, ret);
			goto err_ctrl_failed;
			goto err_ioremap_failed;
		}
	} else {
		dev->ctrl.nr = pdev->id;
@@ -1918,6 +1951,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
	dev->ctrl.port_xfer = msm_slim_port_xfer;
	dev->ctrl.port_xfer_status = msm_slim_port_xfer_status;
	dev->bam_mem = bam_mem;
	dev->lpass_mem = lpass_mem;
	dev->rx_slim = ngd_slim_rx;

	init_completion(&dev->reconf);
@@ -1946,7 +1980,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
	ret = slim_add_numbered_controller(&dev->ctrl);
	if (ret) {
		dev_err(dev->dev, "error adding controller\n");
		goto err_ctrl_failed;
		goto err_ioremap_failed;
	}

	dev->ctrl.dev.parent = &pdev->dev;
@@ -1968,7 +2002,7 @@ static int ngd_slim_probe(struct platform_device *pdev)

	if (ret) {
		dev_err(&pdev->dev, "request IRQ failed\n");
		goto err_request_irq_failed;
		goto err_ioremap_failed;
	}

	init_completion(&dev->qmi.qmi_comp);
@@ -2015,11 +2049,6 @@ static int ngd_slim_probe(struct platform_device *pdev)
	kthread_stop(dev->rx_msgq_thread);
err_rx_thread_create_failed:
	free_irq(dev->irq, dev);
err_request_irq_failed:
err_ctrl_failed:
	iounmap(dev->bam.base);
err_ioremap_bam_failed:
	iounmap(dev->base);
err_ioremap_failed:
	if (dev->sysfs_created)
		sysfs_remove_file(&dev->dev->kobj,
+19 −8
Original line number Diff line number Diff line
@@ -170,26 +170,37 @@ int msm_slim_sps_mem_alloc(

	mem->size = len;
	mem->min_size = 0;
	mem->base = dma_alloc_coherent(dma_dev, mem->size, &phys, GFP_KERNEL);
	mem->base = dev->lpass_mem_usage ? dev->lpass.base :
		dma_alloc_coherent(dma_dev, mem->size, &phys, GFP_KERNEL);

	if (!mem->base) {
		dev_err(dma_dev, "dma_alloc_coherent (%d) failed\n", len);
		return -ENOMEM;
	}

	mem->phys_base = phys;
	mem->phys_base = dev->lpass_mem_usage ?
			(unsigned long long)dev->lpass_mem->start : phys;
	if (dev->lpass_mem_usage) {
		memset_io(mem->base, 0x00, mem->size);
		dev->lpass.base = dev->lpass.base + mem->size;
		dev->lpass_mem->start = dev->lpass_mem->start + mem->size;
	} else {
		memset(mem->base, 0x00, mem->size);
	}
	return 0;
}

void
msm_slim_sps_mem_free(struct msm_slim_ctrl *dev, struct sps_mem_buffer *mem)
{
	if (!dev->lpass_mem_usage) {
		if (mem->base && mem->phys_base)
			dma_free_coherent(dev->dev, mem->size, mem->base,
							mem->phys_base);
		else
		dev_err(dev->dev, "cant dma free. they are NULL\n");
			dev_err(dev->dev, "Cannot free DMA as it is NULL\n");
	}

	mem->size = 0;
	mem->base = NULL;
	mem->phys_base = 0;
+6 −0
Original line number Diff line number Diff line
@@ -257,6 +257,7 @@ struct msm_slim_bulk_wr {

struct msm_slim_iommu {
	struct device			*cb_dev;
	struct dma_iommu_mapping	*iommu_map;
	bool				s1_bypass;
};

@@ -266,6 +267,11 @@ struct msm_slim_ctrl {
	struct device		*dev;
	struct msm_slim_iommu	iommu_desc;
	void __iomem		*base;
	struct msm_slim_sps_bam	lpass;
	struct resource		*lpass_mem;
	u32			lpass_phy_base;
	void __iomem		*lpass_virt_base;
	bool			lpass_mem_usage;
	struct resource		*slew_mem;
	struct resource		*bam_mem;
	u32			curr_bw;