aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch b/target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch
new file mode 100644
index 0000000000..cd81c007c1
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0107-fsl_qbman-Adjust-platform-device-creation-for-QMan-p.patch
@@ -0,0 +1,103 @@
+From fddd729bd2150e83365528cefb9f1fef581e04c5 Mon Sep 17 00:00:00 2001
+From: Vakul Garg <vakul.garg@nxp.com>
+Date: Sun, 6 Jan 2019 19:05:37 +0530
+Subject: [PATCH] fsl_qbman: Adjust platform device creation for QMan portals
+
+Fix the platform device creation in QMan portals such that
+dma mappings are done properly.
+
+Signed-off-by: Vakul Garg <vakul.garg@nxp.com>
+Signed-off-by: Roy Pledge <roy.pledge@nxp.com>
+---
+ drivers/staging/fsl_qbman/qman_high.c | 47 +++++++++++++++++++----------------
+ 1 file changed, 25 insertions(+), 22 deletions(-)
+
+--- a/drivers/staging/fsl_qbman/qman_high.c
++++ b/drivers/staging/fsl_qbman/qman_high.c
+@@ -575,6 +575,7 @@ struct qman_portal *qman_create_portal(
+ char buf[16];
+ int ret;
+ u32 isdr;
++ struct platform_device_info pdev_info;
+
+ if (!portal) {
+ portal = kmalloc(sizeof(*portal), GFP_KERNEL);
+@@ -671,27 +672,22 @@ struct qman_portal *qman_create_portal(
+ portal->dqrr_disable_ref = 0;
+ portal->cb_dc_ern = NULL;
+ sprintf(buf, "qportal-%d", config->public_cfg.channel);
+- portal->pdev = platform_device_alloc(buf, -1);
++
++ memset(&pdev_info, 0, sizeof(pdev_info));
++ pdev_info.name = buf;
++ pdev_info.id = PLATFORM_DEVID_NONE;
++ pdev_info.dma_mask = DMA_BIT_MASK(40);
++
++ portal->pdev = platform_device_register_full(&pdev_info);
+ if (!portal->pdev) {
+ pr_err("qman_portal - platform_device_alloc() failed\n");
+- goto fail_devalloc;
+- }
+-#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
+- portal->pdev->dev.coherent_dma_mask = DMA_BIT_MASK(40);
+- portal->pdev->dev.dma_mask = &portal->pdev->dev.coherent_dma_mask;
+-#else
+- if (dma_set_mask(&portal->pdev->dev, DMA_BIT_MASK(40))) {
+- pr_err("qman_portal - dma_set_mask() failed\n");
+- goto fail_devadd;
++ goto fail_devregister;
+ }
+-#endif
++
++ arch_setup_dma_ops(&portal->pdev->dev, 0, 0, NULL, true);
++
+ portal->pdev->dev.pm_domain = &qman_portal_device_pm_domain;
+ portal->pdev->dev.platform_data = portal;
+- ret = platform_device_add(portal->pdev);
+- if (ret) {
+- pr_err("qman_portal - platform_device_add() failed\n");
+- goto fail_devadd;
+- }
+ dpa_rbtree_init(&portal->retire_table);
+ isdr = 0xffffffff;
+ qm_isr_disable_write(__p, isdr);
+@@ -751,10 +747,8 @@ fail_eqcr_empty:
+ fail_affinity:
+ free_irq(config->public_cfg.irq, portal);
+ fail_irq:
+- platform_device_del(portal->pdev);
+-fail_devadd:
+- platform_device_put(portal->pdev);
+-fail_devalloc:
++ platform_device_unregister(portal->pdev);
++fail_devregister:
+ if (num_ceetms)
+ for (ret = 0; ret < num_ceetms; ret++)
+ kfree(portal->ccgrs[ret]);
+@@ -852,8 +846,7 @@ void qman_destroy_portal(struct qman_por
+ qm_dqrr_finish(&qm->p);
+ qm_eqcr_finish(&qm->p);
+
+- platform_device_del(qm->pdev);
+- platform_device_put(qm->pdev);
++ platform_device_unregister(qm->pdev);
+
+ qm->config = NULL;
+ if (qm->alloced)
+@@ -1809,6 +1802,16 @@ int qman_init_fq(struct qman_fq *fq, u32
+ } else {
+ phys_fq = dma_map_single(&p->pdev->dev, fq, sizeof(*fq),
+ DMA_TO_DEVICE);
++ if (dma_mapping_error(&p->pdev->dev, phys_fq)) {
++ dev_err(&p->pdev->dev,
++ "dma_map_single failed for fqid: %u\n",
++ fq->fqid);
++ FQUNLOCK(fq);
++ PORTAL_IRQ_UNLOCK(p, irqflags);
++ put_affine_portal();
++ return -EIO;
++ }
++
+ qm_fqd_stashing_set64(&mcc->initfq.fqd, phys_fq);
+ }
+ }