xref: /dpdk/drivers/bus/dpaa/base/qbman/qman_driver.c (revision 05500852af7ecdfae549d78bf6e3ec532ec694f6)
1d81734caSHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2f6fadc3eSShreyansh Jain  *
3f6fadc3eSShreyansh Jain  * Copyright 2008-2016 Freescale Semiconductor Inc.
4*05500852SVanshika Shukla  * Copyright 2017-2022 NXP
5f6fadc3eSShreyansh Jain  *
6f6fadc3eSShreyansh Jain  */
7f6fadc3eSShreyansh Jain 
8f6fadc3eSShreyansh Jain #include <fsl_usd.h>
9f6fadc3eSShreyansh Jain #include <process.h>
10f6fadc3eSShreyansh Jain #include "qman_priv.h"
11f6fadc3eSShreyansh Jain #include <sys/ioctl.h>
12e9fd4b87SNatanael Copa #include <err.h>
13e9fd4b87SNatanael Copa 
14f6fadc3eSShreyansh Jain #include <rte_branch_prediction.h>
15f6fadc3eSShreyansh Jain 
16f6fadc3eSShreyansh Jain /* Global variable containing revision id (even on non-control plane systems
17f6fadc3eSShreyansh Jain  * where CCSR isn't available).
18f6fadc3eSShreyansh Jain  */
19f6fadc3eSShreyansh Jain u16 qman_ip_rev;
20f6fadc3eSShreyansh Jain u16 qm_channel_pool1 = QMAN_CHANNEL_POOL1;
21f6fadc3eSShreyansh Jain u16 qm_channel_caam = QMAN_CHANNEL_CAAM;
22f6fadc3eSShreyansh Jain u16 qm_channel_pme = QMAN_CHANNEL_PME;
23f6fadc3eSShreyansh Jain 
24f6fadc3eSShreyansh Jain /* Ccsr map address to access ccsrbased register */
257d9c4dfaSHemant Agrawal static void *qman_ccsr_map;
26f6fadc3eSShreyansh Jain /* The qman clock frequency */
277d9c4dfaSHemant Agrawal static u32 qman_clk;
28f6fadc3eSShreyansh Jain 
299d32ef0fSHemant Agrawal static __thread int qmfd = -1;
309d32ef0fSHemant Agrawal static __thread struct qm_portal_config qpcfg;
31f6fadc3eSShreyansh Jain static __thread struct dpaa_ioctl_portal_map map = {
32f6fadc3eSShreyansh Jain 	.type = dpaa_portal_qman
33f6fadc3eSShreyansh Jain };
34f6fadc3eSShreyansh Jain 
dpaa_get_qm_channel_caam(void)35a8ee206aSHemant Agrawal u16 dpaa_get_qm_channel_caam(void)
36a8ee206aSHemant Agrawal {
37a8ee206aSHemant Agrawal 	return qm_channel_caam;
38a8ee206aSHemant Agrawal }
39a8ee206aSHemant Agrawal 
dpaa_get_qm_channel_pool(void)40a8ee206aSHemant Agrawal u16 dpaa_get_qm_channel_pool(void)
41a8ee206aSHemant Agrawal {
42a8ee206aSHemant Agrawal 	return qm_channel_pool1;
43a8ee206aSHemant Agrawal }
44a8ee206aSHemant Agrawal 
fsl_qman_portal_init(uint32_t index,int is_shared)45f6fadc3eSShreyansh Jain static int fsl_qman_portal_init(uint32_t index, int is_shared)
46f6fadc3eSShreyansh Jain {
47c47ff048SShreyansh Jain 	struct qman_portal *portal;
48f6fadc3eSShreyansh Jain 	struct dpaa_ioctl_irq_map irq_map;
4984e3d085SNipun Gupta 	int ret;
50f6fadc3eSShreyansh Jain 
51f6fadc3eSShreyansh Jain 	/* Allocate and map a qman portal */
52f6fadc3eSShreyansh Jain 	map.index = index;
53f6fadc3eSShreyansh Jain 	ret = process_portal_map(&map);
54f6fadc3eSShreyansh Jain 	if (ret) {
55e9fd4b87SNatanael Copa 		errno = ret;
56e9fd4b87SNatanael Copa 		err(0, "process_portal_map()");
57f6fadc3eSShreyansh Jain 		return ret;
58f6fadc3eSShreyansh Jain 	}
599d32ef0fSHemant Agrawal 	qpcfg.channel = map.channel;
609d32ef0fSHemant Agrawal 	qpcfg.pools = map.pools;
619d32ef0fSHemant Agrawal 	qpcfg.index = map.index;
62f6fadc3eSShreyansh Jain 
63f6fadc3eSShreyansh Jain 	/* Make the portal's cache-[enabled|inhibited] regions */
649d32ef0fSHemant Agrawal 	qpcfg.addr_virt[DPAA_PORTAL_CE] = map.addr.cena;
659d32ef0fSHemant Agrawal 	qpcfg.addr_virt[DPAA_PORTAL_CI] = map.addr.cinh;
66f6fadc3eSShreyansh Jain 
67*05500852SVanshika Shukla 	qmfd = open(QMAN_PORTAL_IRQ_PATH, O_RDONLY | O_NONBLOCK);
689d32ef0fSHemant Agrawal 	if (qmfd == -1) {
69f6fadc3eSShreyansh Jain 		pr_err("QMan irq init failed\n");
70f6fadc3eSShreyansh Jain 		process_portal_unmap(&map.addr);
71f6fadc3eSShreyansh Jain 		return -EBUSY;
72f6fadc3eSShreyansh Jain 	}
73f6fadc3eSShreyansh Jain 
749d32ef0fSHemant Agrawal 	qpcfg.is_shared = is_shared;
759d32ef0fSHemant Agrawal 	qpcfg.node = NULL;
769d32ef0fSHemant Agrawal 	qpcfg.irq = qmfd;
77f6fadc3eSShreyansh Jain 
78b9c94167SNipun Gupta 	portal = qman_create_affine_portal(&qpcfg, NULL);
79c47ff048SShreyansh Jain 	if (!portal) {
80c47ff048SShreyansh Jain 		pr_err("Qman portal initialisation failed (%d)\n",
819d32ef0fSHemant Agrawal 		       qpcfg.cpu);
82c47ff048SShreyansh Jain 		process_portal_unmap(&map.addr);
83c47ff048SShreyansh Jain 		return -EBUSY;
84c47ff048SShreyansh Jain 	}
85c47ff048SShreyansh Jain 
86f6fadc3eSShreyansh Jain 	irq_map.type = dpaa_portal_qman;
87f6fadc3eSShreyansh Jain 	irq_map.portal_cinh = map.addr.cinh;
889d32ef0fSHemant Agrawal 	process_portal_irq_map(qmfd, &irq_map);
89f6fadc3eSShreyansh Jain 	return 0;
90f6fadc3eSShreyansh Jain }
91f6fadc3eSShreyansh Jain 
fsl_qman_portal_finish(void)92f6fadc3eSShreyansh Jain static int fsl_qman_portal_finish(void)
93f6fadc3eSShreyansh Jain {
94c47ff048SShreyansh Jain 	__maybe_unused const struct qm_portal_config *cfg;
95f6fadc3eSShreyansh Jain 	int ret;
96f6fadc3eSShreyansh Jain 
979d32ef0fSHemant Agrawal 	process_portal_irq_unmap(qmfd);
98f6fadc3eSShreyansh Jain 
999d32ef0fSHemant Agrawal 	cfg = qman_destroy_affine_portal(NULL);
1009d32ef0fSHemant Agrawal 	DPAA_BUG_ON(cfg != &qpcfg);
101f6fadc3eSShreyansh Jain 	ret = process_portal_unmap(&map.addr);
102e9fd4b87SNatanael Copa 	if (ret) {
103e9fd4b87SNatanael Copa 		errno = ret;
104e9fd4b87SNatanael Copa 		err(0, "process_portal_unmap()");
105e9fd4b87SNatanael Copa 	}
106f6fadc3eSShreyansh Jain 	return ret;
107f6fadc3eSShreyansh Jain }
108f6fadc3eSShreyansh Jain 
qman_thread_fd(void)1098e253882SHemant Agrawal int qman_thread_fd(void)
1108e253882SHemant Agrawal {
1118e253882SHemant Agrawal 	return qmfd;
1128e253882SHemant Agrawal }
1138e253882SHemant Agrawal 
qman_thread_init(void)114f6fadc3eSShreyansh Jain int qman_thread_init(void)
115f6fadc3eSShreyansh Jain {
116f6fadc3eSShreyansh Jain 	/* Convert from contiguous/virtual cpu numbering to real cpu when
117f6fadc3eSShreyansh Jain 	 * calling into the code that is dependent on the device naming.
118f6fadc3eSShreyansh Jain 	 */
119f6fadc3eSShreyansh Jain 	return fsl_qman_portal_init(QBMAN_ANY_PORTAL_IDX, 0);
120f6fadc3eSShreyansh Jain }
121f6fadc3eSShreyansh Jain 
qman_thread_finish(void)122f6fadc3eSShreyansh Jain int qman_thread_finish(void)
123f6fadc3eSShreyansh Jain {
124f6fadc3eSShreyansh Jain 	return fsl_qman_portal_finish();
125f6fadc3eSShreyansh Jain }
126f6fadc3eSShreyansh Jain 
qman_thread_irq(void)127f6fadc3eSShreyansh Jain void qman_thread_irq(void)
128f6fadc3eSShreyansh Jain {
1299d32ef0fSHemant Agrawal 	qbman_invoke_irq(qpcfg.irq);
130f6fadc3eSShreyansh Jain 
131f6fadc3eSShreyansh Jain 	/* Now we need to uninhibit interrupts. This is the only code outside
132f6fadc3eSShreyansh Jain 	 * the regular portal driver that manipulates any portal register, so
133f6fadc3eSShreyansh Jain 	 * rather than breaking that encapsulation I am simply hard-coding the
134f6fadc3eSShreyansh Jain 	 * offset to the inhibit register here.
135f6fadc3eSShreyansh Jain 	 */
1368e253882SHemant Agrawal 	out_be32(qpcfg.addr_virt[DPAA_PORTAL_CI] + 0x36C0, 0);
1379d32ef0fSHemant Agrawal }
1389d32ef0fSHemant Agrawal 
qman_fq_portal_thread_irq(struct qman_portal * qp)139b1b5d6c9SNipun Gupta void qman_fq_portal_thread_irq(struct qman_portal *qp)
140b1b5d6c9SNipun Gupta {
141b1b5d6c9SNipun Gupta 	qman_portal_uninhibit_isr(qp);
142b1b5d6c9SNipun Gupta }
143b1b5d6c9SNipun Gupta 
fsl_qman_fq_portal_create(int * fd)144a6a75240SNipun Gupta struct qman_portal *fsl_qman_fq_portal_create(int *fd)
1459d32ef0fSHemant Agrawal {
146b9c94167SNipun Gupta 	struct qman_portal *portal = NULL;
1479d32ef0fSHemant Agrawal 	struct qm_portal_config *q_pcfg;
1489d32ef0fSHemant Agrawal 	struct dpaa_ioctl_irq_map irq_map;
1499d32ef0fSHemant Agrawal 	struct dpaa_ioctl_portal_map q_map = {0};
150c61dc971SYunjian Wang 	int q_fd, ret;
1519d32ef0fSHemant Agrawal 
1529d32ef0fSHemant Agrawal 	q_pcfg = kzalloc((sizeof(struct qm_portal_config)), 0);
1539d32ef0fSHemant Agrawal 	if (!q_pcfg) {
154e9fd4b87SNatanael Copa 		/* kzalloc sets errno */
155e9fd4b87SNatanael Copa 		err(0, "q_pcfg kzalloc failed");
1569d32ef0fSHemant Agrawal 		return NULL;
1579d32ef0fSHemant Agrawal 	}
1589d32ef0fSHemant Agrawal 
1599d32ef0fSHemant Agrawal 	/* Allocate and map a qman portal */
1609d32ef0fSHemant Agrawal 	q_map.type = dpaa_portal_qman;
1619d32ef0fSHemant Agrawal 	q_map.index = QBMAN_ANY_PORTAL_IDX;
1629d32ef0fSHemant Agrawal 	ret = process_portal_map(&q_map);
1639d32ef0fSHemant Agrawal 	if (ret) {
164e9fd4b87SNatanael Copa 		errno = ret;
165e9fd4b87SNatanael Copa 		err(0, "process_portal_map()");
16689488854SSunil Kumar Kori 		kfree(q_pcfg);
1679d32ef0fSHemant Agrawal 		return NULL;
1689d32ef0fSHemant Agrawal 	}
1699d32ef0fSHemant Agrawal 	q_pcfg->channel = q_map.channel;
1709d32ef0fSHemant Agrawal 	q_pcfg->pools = q_map.pools;
1719d32ef0fSHemant Agrawal 	q_pcfg->index = q_map.index;
1729d32ef0fSHemant Agrawal 
1739d32ef0fSHemant Agrawal 	/* Make the portal's cache-[enabled|inhibited] regions */
1749d32ef0fSHemant Agrawal 	q_pcfg->addr_virt[DPAA_PORTAL_CE] = q_map.addr.cena;
1759d32ef0fSHemant Agrawal 	q_pcfg->addr_virt[DPAA_PORTAL_CI] = q_map.addr.cinh;
1769d32ef0fSHemant Agrawal 
177*05500852SVanshika Shukla 	q_fd = open(QMAN_PORTAL_IRQ_PATH, O_RDONLY | O_NONBLOCK);
1789d32ef0fSHemant Agrawal 	if (q_fd == -1) {
1799d32ef0fSHemant Agrawal 		pr_err("QMan irq init failed\n");
180b9c94167SNipun Gupta 		goto err;
1819d32ef0fSHemant Agrawal 	}
1829d32ef0fSHemant Agrawal 
1839d32ef0fSHemant Agrawal 	q_pcfg->irq = q_fd;
1849d32ef0fSHemant Agrawal 
185b9c94167SNipun Gupta 	portal = qman_alloc_global_portal(q_pcfg);
186b9c94167SNipun Gupta 	if (!portal) {
1879d32ef0fSHemant Agrawal 		pr_err("Qman portal initialisation failed (%d)\n",
1889d32ef0fSHemant Agrawal 		       q_pcfg->cpu);
189c61dc971SYunjian Wang 		goto err_alloc;
1909d32ef0fSHemant Agrawal 	}
1919d32ef0fSHemant Agrawal 
1929d32ef0fSHemant Agrawal 	irq_map.type = dpaa_portal_qman;
1939d32ef0fSHemant Agrawal 	irq_map.portal_cinh = q_map.addr.cinh;
1949d32ef0fSHemant Agrawal 	process_portal_irq_map(q_fd, &irq_map);
1959d32ef0fSHemant Agrawal 
196a6a75240SNipun Gupta 	*fd = q_fd;
197b9c94167SNipun Gupta 	return portal;
198c61dc971SYunjian Wang err_alloc:
1999d32ef0fSHemant Agrawal 	close(q_fd);
200c61dc971SYunjian Wang err:
2019d32ef0fSHemant Agrawal 	process_portal_unmap(&q_map.addr);
20289488854SSunil Kumar Kori 	kfree(q_pcfg);
2039d32ef0fSHemant Agrawal 	return NULL;
2049d32ef0fSHemant Agrawal }
2059d32ef0fSHemant Agrawal 
fsl_qman_fq_portal_init(struct qman_portal * qp)206b9c94167SNipun Gupta int fsl_qman_fq_portal_init(struct qman_portal *qp)
207b9c94167SNipun Gupta {
208b9c94167SNipun Gupta 	struct qman_portal *res;
209b9c94167SNipun Gupta 
210b9c94167SNipun Gupta 	res = qman_init_portal(qp, NULL, NULL);
211b9c94167SNipun Gupta 	if (!res) {
212b9c94167SNipun Gupta 		pr_err("Qman portal initialisation failed\n");
213b9c94167SNipun Gupta 		return -1;
214b9c94167SNipun Gupta 	}
215b9c94167SNipun Gupta 
216b9c94167SNipun Gupta 	return 0;
217b9c94167SNipun Gupta }
218b9c94167SNipun Gupta 
fsl_qman_fq_portal_destroy(struct qman_portal * qp)219b9c94167SNipun Gupta int fsl_qman_fq_portal_destroy(struct qman_portal *qp)
2209d32ef0fSHemant Agrawal {
2219d32ef0fSHemant Agrawal 	const struct qm_portal_config *cfg;
2229d32ef0fSHemant Agrawal 	struct dpaa_portal_map addr;
2239d32ef0fSHemant Agrawal 	int ret;
2249d32ef0fSHemant Agrawal 
2259d32ef0fSHemant Agrawal 	cfg = qman_destroy_affine_portal(qp);
226b9c94167SNipun Gupta 
227b9c94167SNipun Gupta 	ret = qman_free_global_portal(qp);
228b9c94167SNipun Gupta 	if (ret)
229b9c94167SNipun Gupta 		pr_err("qman_free_global_portal() (%d)\n", ret);
230b9c94167SNipun Gupta 
2319d32ef0fSHemant Agrawal 	kfree(qp);
2329d32ef0fSHemant Agrawal 
2339d32ef0fSHemant Agrawal 	process_portal_irq_unmap(cfg->irq);
2349d32ef0fSHemant Agrawal 
2359d32ef0fSHemant Agrawal 	addr.cena = cfg->addr_virt[DPAA_PORTAL_CE];
2369d32ef0fSHemant Agrawal 	addr.cinh = cfg->addr_virt[DPAA_PORTAL_CI];
2379d32ef0fSHemant Agrawal 
2389d32ef0fSHemant Agrawal 	ret = process_portal_unmap(&addr);
2399d32ef0fSHemant Agrawal 	if (ret)
2409d32ef0fSHemant Agrawal 		pr_err("process_portal_unmap() (%d)\n", ret);
2419d32ef0fSHemant Agrawal 
2429d32ef0fSHemant Agrawal 	kfree((void *)cfg);
2439d32ef0fSHemant Agrawal 
2449d32ef0fSHemant Agrawal 	return ret;
245f6fadc3eSShreyansh Jain }
246f6fadc3eSShreyansh Jain 
qman_global_init(void)247f6fadc3eSShreyansh Jain int qman_global_init(void)
248f6fadc3eSShreyansh Jain {
249f6fadc3eSShreyansh Jain 	const struct device_node *dt_node;
250f6fadc3eSShreyansh Jain 	size_t lenp;
251f6fadc3eSShreyansh Jain 	const u32 *chanid;
252f6fadc3eSShreyansh Jain 	static int ccsr_map_fd;
253f6fadc3eSShreyansh Jain 	const uint32_t *qman_addr;
254f6fadc3eSShreyansh Jain 	uint64_t phys_addr;
255f6fadc3eSShreyansh Jain 	uint64_t regs_size;
256f6fadc3eSShreyansh Jain 	const u32 *clk;
257f6fadc3eSShreyansh Jain 
258f6fadc3eSShreyansh Jain 	static int done;
259f6fadc3eSShreyansh Jain 
260f6fadc3eSShreyansh Jain 	if (done)
261f6fadc3eSShreyansh Jain 		return -EBUSY;
262f6fadc3eSShreyansh Jain 
263f6fadc3eSShreyansh Jain 	/* Use the device-tree to determine IP revision until something better
264f6fadc3eSShreyansh Jain 	 * is devised.
265f6fadc3eSShreyansh Jain 	 */
266f6fadc3eSShreyansh Jain 	dt_node = of_find_compatible_node(NULL, NULL, "fsl,qman-portal");
267f6fadc3eSShreyansh Jain 	if (!dt_node) {
268f6fadc3eSShreyansh Jain 		pr_err("No qman portals available for any CPU\n");
269f6fadc3eSShreyansh Jain 		return -ENODEV;
270f6fadc3eSShreyansh Jain 	}
271f6fadc3eSShreyansh Jain 	if (of_device_is_compatible(dt_node, "fsl,qman-portal-1.0") ||
272f6fadc3eSShreyansh Jain 	    of_device_is_compatible(dt_node, "fsl,qman-portal-1.0.0"))
273f6fadc3eSShreyansh Jain 		pr_err("QMan rev1.0 on P4080 rev1 is not supported!\n");
274f6fadc3eSShreyansh Jain 	else if (of_device_is_compatible(dt_node, "fsl,qman-portal-1.1") ||
275f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-1.1.0"))
276f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV11;
277f6fadc3eSShreyansh Jain 	else if	(of_device_is_compatible(dt_node, "fsl,qman-portal-1.2") ||
278f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-1.2.0"))
279f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV12;
280f6fadc3eSShreyansh Jain 	else if (of_device_is_compatible(dt_node, "fsl,qman-portal-2.0") ||
281f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-2.0.0"))
282f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV20;
283f6fadc3eSShreyansh Jain 	else if (of_device_is_compatible(dt_node, "fsl,qman-portal-3.0.0") ||
284f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-3.0.1"))
285f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV30;
286f6fadc3eSShreyansh Jain 	else if (of_device_is_compatible(dt_node, "fsl,qman-portal-3.1.0") ||
287f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-3.1.1") ||
288f6fadc3eSShreyansh Jain 		of_device_is_compatible(dt_node, "fsl,qman-portal-3.1.2") ||
289f6fadc3eSShreyansh Jain 		of_device_is_compatible(dt_node, "fsl,qman-portal-3.1.3"))
290f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV31;
291f6fadc3eSShreyansh Jain 	else if (of_device_is_compatible(dt_node, "fsl,qman-portal-3.2.0") ||
292f6fadc3eSShreyansh Jain 		 of_device_is_compatible(dt_node, "fsl,qman-portal-3.2.1"))
293f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV32;
294f6fadc3eSShreyansh Jain 	else
295f6fadc3eSShreyansh Jain 		qman_ip_rev = QMAN_REV11;
296f6fadc3eSShreyansh Jain 
297f6fadc3eSShreyansh Jain 	if (!qman_ip_rev) {
298f6fadc3eSShreyansh Jain 		pr_err("Unknown qman portal version\n");
299f6fadc3eSShreyansh Jain 		return -ENODEV;
300f6fadc3eSShreyansh Jain 	}
301f6fadc3eSShreyansh Jain 	if ((qman_ip_rev & 0xFF00) >= QMAN_REV30) {
302f6fadc3eSShreyansh Jain 		qm_channel_pool1 = QMAN_CHANNEL_POOL1_REV3;
303f6fadc3eSShreyansh Jain 		qm_channel_caam = QMAN_CHANNEL_CAAM_REV3;
304f6fadc3eSShreyansh Jain 		qm_channel_pme = QMAN_CHANNEL_PME_REV3;
305f6fadc3eSShreyansh Jain 	}
306f6fadc3eSShreyansh Jain 
307f6fadc3eSShreyansh Jain 	dt_node = of_find_compatible_node(NULL, NULL, "fsl,pool-channel-range");
308f6fadc3eSShreyansh Jain 	if (!dt_node) {
309f6fadc3eSShreyansh Jain 		pr_err("No qman pool channel range available\n");
310f6fadc3eSShreyansh Jain 		return -ENODEV;
311f6fadc3eSShreyansh Jain 	}
312f6fadc3eSShreyansh Jain 	chanid = of_get_property(dt_node, "fsl,pool-channel-range", &lenp);
313f6fadc3eSShreyansh Jain 	if (!chanid) {
314f6fadc3eSShreyansh Jain 		pr_err("Can not get pool-channel-range property\n");
315f6fadc3eSShreyansh Jain 		return -EINVAL;
316f6fadc3eSShreyansh Jain 	}
317f6fadc3eSShreyansh Jain 
318f6fadc3eSShreyansh Jain 	/* get ccsr base */
319f6fadc3eSShreyansh Jain 	dt_node = of_find_compatible_node(NULL, NULL, "fsl,qman");
320f6fadc3eSShreyansh Jain 	if (!dt_node) {
321f6fadc3eSShreyansh Jain 		pr_err("No qman device node available\n");
322f6fadc3eSShreyansh Jain 		return -ENODEV;
323f6fadc3eSShreyansh Jain 	}
324f6fadc3eSShreyansh Jain 	qman_addr = of_get_address(dt_node, 0, &regs_size, NULL);
325f6fadc3eSShreyansh Jain 	if (!qman_addr) {
326f6fadc3eSShreyansh Jain 		pr_err("of_get_address cannot return qman address\n");
327f6fadc3eSShreyansh Jain 		return -EINVAL;
328f6fadc3eSShreyansh Jain 	}
329f6fadc3eSShreyansh Jain 	phys_addr = of_translate_address(dt_node, qman_addr);
330f6fadc3eSShreyansh Jain 	if (!phys_addr) {
331f6fadc3eSShreyansh Jain 		pr_err("of_translate_address failed\n");
332f6fadc3eSShreyansh Jain 		return -EINVAL;
333f6fadc3eSShreyansh Jain 	}
334f6fadc3eSShreyansh Jain 
335f6fadc3eSShreyansh Jain 	ccsr_map_fd = open("/dev/mem", O_RDWR);
336f6fadc3eSShreyansh Jain 	if (unlikely(ccsr_map_fd < 0)) {
337f6fadc3eSShreyansh Jain 		pr_err("Can not open /dev/mem for qman ccsr map\n");
338f6fadc3eSShreyansh Jain 		return ccsr_map_fd;
339f6fadc3eSShreyansh Jain 	}
340f6fadc3eSShreyansh Jain 
341f6fadc3eSShreyansh Jain 	qman_ccsr_map = mmap(NULL, regs_size, PROT_READ | PROT_WRITE,
342f6fadc3eSShreyansh Jain 			     MAP_SHARED, ccsr_map_fd, phys_addr);
343f6fadc3eSShreyansh Jain 	if (qman_ccsr_map == MAP_FAILED) {
344f6fadc3eSShreyansh Jain 		pr_err("Can not map qman ccsr base\n");
345f6fadc3eSShreyansh Jain 		return -EINVAL;
346f6fadc3eSShreyansh Jain 	}
347f6fadc3eSShreyansh Jain 
348f6fadc3eSShreyansh Jain 	clk = of_get_property(dt_node, "clock-frequency", NULL);
349f6fadc3eSShreyansh Jain 	if (!clk)
350f6fadc3eSShreyansh Jain 		pr_warn("Can't find Qman clock frequency\n");
351f6fadc3eSShreyansh Jain 	else
352f6fadc3eSShreyansh Jain 		qman_clk = be32_to_cpu(*clk);
353f6fadc3eSShreyansh Jain 
354847ee3bdSShreyansh Jain #ifdef CONFIG_FSL_QMAN_FQ_LOOKUP
355aecb4351SHemant Agrawal 	return qman_setup_fq_lookup_table(CONFIG_FSL_QMAN_FQ_LOOKUP_MAX);
356847ee3bdSShreyansh Jain #endif
357847ee3bdSShreyansh Jain 	return 0;
358f6fadc3eSShreyansh Jain }
359