1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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);
}
}
|