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, ®s_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