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:
Prudhvi Yarlagadda
2019-11-01 19:03:10 +05:30
parent 786601f412
commit 40ba0aea47
3 changed files with 70 additions and 24 deletions

View File

@@ -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_family = AF_QIPCRTR;
qmi->svc_info.sq_node = service->node; qmi->svc_info.sq_node = service->node;
qmi->svc_info.sq_port = service->port; 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); atomic_set(&dev->ssr_in_progress, 0);
schedule_work(&dev->dsp.dom_up); 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 & 0xFF);
*(puc++) = (txn->ec >> 8)&0xFF; *(puc++) = (txn->ec >> 8)&0xFF;
} }
if (txn->wbuf) if (txn->wbuf) {
memcpy(puc, txn->wbuf, txn->len); 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 && if (txn->mt == SLIM_MSG_MT_DEST_REFERRED_USER &&
(txn->mc == SLIM_USR_MC_CONNECT_SRC || (txn->mc == SLIM_USR_MC_CONNECT_SRC ||
txn->mc == SLIM_USR_MC_CONNECT_SINK || txn->mc == SLIM_USR_MC_CONNECT_SINK ||
@@ -1750,6 +1758,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
int ret; int ret;
struct resource *bam_mem; struct resource *bam_mem;
struct resource *slim_mem; struct resource *slim_mem;
struct resource *lpass_mem;
struct resource *irq, *bam_irq; struct resource *irq, *bam_irq;
bool rxreg_access = false; bool rxreg_access = false;
bool slim_mdm = 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"); dev_err(&pdev->dev, "no memory for MSM slimbus controller\n");
return PTR_ERR(dev); 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, dev->wr_comp = kzalloc(sizeof(struct completion *) * MSM_TX_BUFS,
GFP_KERNEL); GFP_KERNEL);
if (!dev->wr_comp) { if (!dev->wr_comp) {
@@ -1849,26 +1868,40 @@ static int ngd_slim_probe(struct platform_device *pdev)
} else } else
dev->sysfs_created = true; 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) { if (!dev->base) {
dev_err(&pdev->dev, "IOremap failed\n"); dev_err(&pdev->dev, "IOremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_ioremap_failed; 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) { if (!dev->bam.base) {
dev_err(&pdev->dev, "BAM IOremap failed\n"); dev_err(&pdev->dev, "BAM IOremap failed\n");
ret = -ENOMEM; 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) { if (pdev->dev.of_node) {
ret = of_property_read_u32(pdev->dev.of_node, "cell-index", ret = of_property_read_u32(pdev->dev.of_node, "cell-index",
&dev->ctrl.nr); &dev->ctrl.nr);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Cell index not specified:%d\n", dev_err(&pdev->dev,
ret); "Cell index not specified:%d\n", ret);
goto err_ctrl_failed; goto err_ioremap_failed;
} }
rxreg_access = of_property_read_bool(pdev->dev.of_node, rxreg_access = of_property_read_bool(pdev->dev.of_node,
"qcom,rxreg-access"); "qcom,rxreg-access");
@@ -1889,7 +1922,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_err(dev->dev, "%s: Failed to of_platform_populate %d\n", dev_err(dev->dev, "%s: Failed to of_platform_populate %d\n",
__func__, ret); __func__, ret);
goto err_ctrl_failed; goto err_ioremap_failed;
} }
} else { } else {
dev->ctrl.nr = pdev->id; 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 = msm_slim_port_xfer;
dev->ctrl.port_xfer_status = msm_slim_port_xfer_status; dev->ctrl.port_xfer_status = msm_slim_port_xfer_status;
dev->bam_mem = bam_mem; dev->bam_mem = bam_mem;
dev->lpass_mem = lpass_mem;
dev->rx_slim = ngd_slim_rx; dev->rx_slim = ngd_slim_rx;
init_completion(&dev->reconf); init_completion(&dev->reconf);
@@ -1946,7 +1980,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
ret = slim_add_numbered_controller(&dev->ctrl); ret = slim_add_numbered_controller(&dev->ctrl);
if (ret) { if (ret) {
dev_err(dev->dev, "error adding controller\n"); dev_err(dev->dev, "error adding controller\n");
goto err_ctrl_failed; goto err_ioremap_failed;
} }
dev->ctrl.dev.parent = &pdev->dev; dev->ctrl.dev.parent = &pdev->dev;
@@ -1968,7 +2002,7 @@ static int ngd_slim_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_err(&pdev->dev, "request IRQ failed\n"); dev_err(&pdev->dev, "request IRQ failed\n");
goto err_request_irq_failed; goto err_ioremap_failed;
} }
init_completion(&dev->qmi.qmi_comp); 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); kthread_stop(dev->rx_msgq_thread);
err_rx_thread_create_failed: err_rx_thread_create_failed:
free_irq(dev->irq, dev); 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: err_ioremap_failed:
if (dev->sysfs_created) if (dev->sysfs_created)
sysfs_remove_file(&dev->dev->kobj, sysfs_remove_file(&dev->dev->kobj,

View File

@@ -170,26 +170,37 @@ int msm_slim_sps_mem_alloc(
mem->size = len; mem->size = len;
mem->min_size = 0; 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) { 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; return -ENOMEM;
} }
mem->phys_base = phys; mem->phys_base = dev->lpass_mem_usage ?
memset(mem->base, 0x00, mem->size); (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; return 0;
} }
void void
msm_slim_sps_mem_free(struct msm_slim_ctrl *dev, struct sps_mem_buffer *mem) msm_slim_sps_mem_free(struct msm_slim_ctrl *dev, struct sps_mem_buffer *mem)
{ {
if (mem->base && mem->phys_base) if (!dev->lpass_mem_usage) {
dma_free_coherent(dev->dev, mem->size, mem->base, if (mem->base && mem->phys_base)
dma_free_coherent(dev->dev, mem->size, mem->base,
mem->phys_base); mem->phys_base);
else 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->size = 0;
mem->base = NULL; mem->base = NULL;
mem->phys_base = 0; mem->phys_base = 0;

View File

@@ -257,6 +257,7 @@ struct msm_slim_bulk_wr {
struct msm_slim_iommu { struct msm_slim_iommu {
struct device *cb_dev; struct device *cb_dev;
struct dma_iommu_mapping *iommu_map;
bool s1_bypass; bool s1_bypass;
}; };
@@ -266,6 +267,11 @@ struct msm_slim_ctrl {
struct device *dev; struct device *dev;
struct msm_slim_iommu iommu_desc; struct msm_slim_iommu iommu_desc;
void __iomem *base; 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 *slew_mem;
struct resource *bam_mem; struct resource *bam_mem;
u32 curr_bw; u32 curr_bw;