slim-msm-ngd: Add support for slimbus to use LPASS memory
Add support for slimbus to use LPASS memory instead of DDR memory for bam transfers. Change-Id: I74d4e16d0c982ceacb5190872b7f945beeae29cf Signed-off-by: Prudhvi Yarlagadda <pyarlaga@codeaurora.org>
This commit is contained in:
parent
786601f412
commit
40ba0aea47
3 changed files with 70 additions and 24 deletions
|
@ -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)
|
||||
memcpy(puc, txn->wbuf, txn->len);
|
||||
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 @@ err_notify_thread_create_failed:
|
|||
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,
|
||||
|
|
|
@ -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);
|
||||
dev_err(dma_dev, "dma_alloc_coherent (%d) failed\n", len);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mem->phys_base = phys;
|
||||
memset(mem->base, 0x00, mem->size);
|
||||
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 (mem->base && mem->phys_base)
|
||||
dma_free_coherent(dev->dev, mem->size, mem->base,
|
||||
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");
|
||||
else
|
||||
dev_err(dev->dev, "Cannot free DMA as it is NULL\n");
|
||||
}
|
||||
|
||||
mem->size = 0;
|
||||
mem->base = NULL;
|
||||
mem->phys_base = 0;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue