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:
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user