1296177Sjhibbits/*-
2296177Sjhibbits * Copyright (c) 2011-2012 Semihalf.
3296177Sjhibbits * All rights reserved.
4296177Sjhibbits *
5296177Sjhibbits * Redistribution and use in source and binary forms, with or without
6296177Sjhibbits * modification, are permitted provided that the following conditions
7296177Sjhibbits * are met:
8296177Sjhibbits * 1. Redistributions of source code must retain the above copyright
9296177Sjhibbits *    notice, this list of conditions and the following disclaimer.
10296177Sjhibbits * 2. Redistributions in binary form must reproduce the above copyright
11296177Sjhibbits *    notice, this list of conditions and the following disclaimer in the
12296177Sjhibbits *    documentation and/or other materials provided with the distribution.
13296177Sjhibbits *
14296177Sjhibbits * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15296177Sjhibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16296177Sjhibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17296177Sjhibbits * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18296177Sjhibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19296177Sjhibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20296177Sjhibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21296177Sjhibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22296177Sjhibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23296177Sjhibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24296177Sjhibbits * SUCH DAMAGE.
25296177Sjhibbits */
26296177Sjhibbits
27296177Sjhibbits#include <sys/cdefs.h>
28296177Sjhibbits__FBSDID("$FreeBSD: releng/11.0/sys/dev/dpaa/qman.c 296177 2016-02-29 03:38:00Z jhibbits $");
29296177Sjhibbits
30296177Sjhibbits#include <sys/param.h>
31296177Sjhibbits#include <sys/systm.h>
32296177Sjhibbits#include <sys/kernel.h>
33296177Sjhibbits#include <sys/bus.h>
34296177Sjhibbits#include <sys/lock.h>
35296177Sjhibbits#include <sys/module.h>
36296177Sjhibbits#include <sys/mutex.h>
37296177Sjhibbits#include <sys/proc.h>
38296177Sjhibbits#include <sys/pcpu.h>
39296177Sjhibbits#include <sys/rman.h>
40296177Sjhibbits#include <sys/sched.h>
41296177Sjhibbits#include <sys/smp.h>
42296177Sjhibbits
43296177Sjhibbits#include <machine/bus.h>
44296177Sjhibbits#include <machine/resource.h>
45296177Sjhibbits#include <machine/tlb.h>
46296177Sjhibbits
47296177Sjhibbits#include "qman.h"
48296177Sjhibbits#include "portals.h"
49296177Sjhibbits
50296177Sjhibbitsextern struct dpaa_portals_softc *qp_sc;
51296177Sjhibbitsstatic struct qman_softc *qman_sc;
52296177Sjhibbits
53296177Sjhibbitsextern t_Handle qman_portal_setup(struct qman_softc *qsc);
54296177Sjhibbits
55296177Sjhibbitsstatic void
56296177Sjhibbitsqman_exception(t_Handle app, e_QmExceptions exception)
57296177Sjhibbits{
58296177Sjhibbits	struct qman_softc *sc;
59296177Sjhibbits	const char *message;
60296177Sjhibbits
61296177Sjhibbits	sc = app;
62296177Sjhibbits
63296177Sjhibbits	switch (exception) {
64296177Sjhibbits	case e_QM_EX_CORENET_INITIATOR_DATA:
65296177Sjhibbits		message = "Initiator Data Error";
66296177Sjhibbits		break;
67296177Sjhibbits	case e_QM_EX_CORENET_TARGET_DATA:
68296177Sjhibbits		message = "CoreNet Target Data Error";
69296177Sjhibbits		break;
70296177Sjhibbits	case e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION:
71296177Sjhibbits		message = "Invalid Target Transaction";
72296177Sjhibbits		break;
73296177Sjhibbits	case e_QM_EX_PFDR_THRESHOLD:
74296177Sjhibbits		message = "PFDR Low Watermark Interrupt";
75296177Sjhibbits		break;
76296177Sjhibbits	case e_QM_EX_PFDR_ENQUEUE_BLOCKED:
77296177Sjhibbits		message = "PFDR Enqueues Blocked Interrupt";
78296177Sjhibbits		break;
79296177Sjhibbits	case e_QM_EX_SINGLE_ECC:
80296177Sjhibbits		message = "Single Bit ECC Error Interrupt";
81296177Sjhibbits		break;
82296177Sjhibbits	case e_QM_EX_MULTI_ECC:
83296177Sjhibbits		message = "Multi Bit ECC Error Interrupt";
84296177Sjhibbits		break;
85296177Sjhibbits	case e_QM_EX_INVALID_COMMAND:
86296177Sjhibbits		message = "Invalid Command Verb Interrupt";
87296177Sjhibbits		break;
88296177Sjhibbits	case e_QM_EX_DEQUEUE_DCP:
89296177Sjhibbits		message = "Invalid Dequeue Direct Connect Portal Interrupt";
90296177Sjhibbits		break;
91296177Sjhibbits	case e_QM_EX_DEQUEUE_FQ:
92296177Sjhibbits		message = "Invalid Dequeue FQ Interrupt";
93296177Sjhibbits		break;
94296177Sjhibbits	case e_QM_EX_DEQUEUE_SOURCE:
95296177Sjhibbits		message = "Invalid Dequeue Source Interrupt";
96296177Sjhibbits		break;
97296177Sjhibbits	case e_QM_EX_DEQUEUE_QUEUE:
98296177Sjhibbits		message = "Invalid Dequeue Queue Interrupt";
99296177Sjhibbits		break;
100296177Sjhibbits	case e_QM_EX_ENQUEUE_OVERFLOW:
101296177Sjhibbits		message = "Invalid Enqueue Overflow Interrupt";
102296177Sjhibbits		break;
103296177Sjhibbits	case e_QM_EX_ENQUEUE_STATE:
104296177Sjhibbits		message = "Invalid Enqueue State Interrupt";
105296177Sjhibbits		break;
106296177Sjhibbits	case e_QM_EX_ENQUEUE_CHANNEL:
107296177Sjhibbits		message = "Invalid Enqueue Channel Interrupt";
108296177Sjhibbits		break;
109296177Sjhibbits	case e_QM_EX_ENQUEUE_QUEUE:
110296177Sjhibbits		message = "Invalid Enqueue Queue Interrupt";
111296177Sjhibbits		break;
112296177Sjhibbits	case e_QM_EX_CG_STATE_CHANGE:
113296177Sjhibbits		message = "CG change state notification";
114296177Sjhibbits		break;
115296177Sjhibbits	default:
116296177Sjhibbits		message = "Unknown error";
117296177Sjhibbits	}
118296177Sjhibbits
119296177Sjhibbits	device_printf(sc->sc_dev, "QMan Exception: %s.\n", message);
120296177Sjhibbits}
121296177Sjhibbits
122296177Sjhibbits/**
123296177Sjhibbits * General received frame callback.
124296177Sjhibbits * This is called, when user did not register his own callback for a given
125296177Sjhibbits * frame queue range (fqr).
126296177Sjhibbits */
127296177Sjhibbitse_RxStoreResponse
128296177Sjhibbitsqman_received_frame_callback(t_Handle app, t_Handle qm_fqr, t_Handle qm_portal,
129296177Sjhibbits    uint32_t fqid_offset, t_DpaaFD *frame)
130296177Sjhibbits{
131296177Sjhibbits	struct qman_softc *sc;
132296177Sjhibbits
133296177Sjhibbits	sc = app;
134296177Sjhibbits
135296177Sjhibbits	device_printf(sc->sc_dev, "dummy callback for received frame.\n");
136296177Sjhibbits	return (e_RX_STORE_RESPONSE_CONTINUE);
137296177Sjhibbits}
138296177Sjhibbits
139296177Sjhibbits/**
140296177Sjhibbits * General rejected frame callback.
141296177Sjhibbits * This is called, when user did not register his own callback for a given
142296177Sjhibbits * frame queue range (fqr).
143296177Sjhibbits */
144296177Sjhibbitse_RxStoreResponse
145296177Sjhibbitsqman_rejected_frame_callback(t_Handle app, t_Handle qm_fqr, t_Handle qm_portal,
146296177Sjhibbits    uint32_t fqid_offset, t_DpaaFD *frame,
147296177Sjhibbits    t_QmRejectedFrameInfo *qm_rejected_frame_info)
148296177Sjhibbits{
149296177Sjhibbits	struct qman_softc *sc;
150296177Sjhibbits
151296177Sjhibbits	sc = app;
152296177Sjhibbits
153296177Sjhibbits	device_printf(sc->sc_dev, "dummy callback for rejected frame.\n");
154296177Sjhibbits	return (e_RX_STORE_RESPONSE_CONTINUE);
155296177Sjhibbits}
156296177Sjhibbits
157296177Sjhibbitsint
158296177Sjhibbitsqman_attach(device_t dev)
159296177Sjhibbits{
160296177Sjhibbits	struct qman_softc *sc;
161296177Sjhibbits	t_QmParam qp;
162296177Sjhibbits	t_Error error;
163296177Sjhibbits	t_QmRevisionInfo rev;
164296177Sjhibbits
165296177Sjhibbits	sc = device_get_softc(dev);
166296177Sjhibbits	sc->sc_dev = dev;
167296177Sjhibbits	qman_sc = sc;
168296177Sjhibbits
169296177Sjhibbits	if (XX_MallocSmartInit() != E_OK) {
170296177Sjhibbits		device_printf(dev, "could not initialize smart allocator.\n");
171296177Sjhibbits		return (ENXIO);
172296177Sjhibbits	}
173296177Sjhibbits
174296177Sjhibbits	sched_pin();
175296177Sjhibbits
176296177Sjhibbits	/* Allocate resources */
177296177Sjhibbits	sc->sc_rrid = 0;
178296177Sjhibbits	sc->sc_rres = bus_alloc_resource(dev, SYS_RES_MEMORY,
179296177Sjhibbits	    &sc->sc_rrid, 0, ~0, QMAN_CCSR_SIZE, RF_ACTIVE);
180296177Sjhibbits	if (sc->sc_rres == NULL) {
181296177Sjhibbits		device_printf(dev, "could not allocate memory.\n");
182296177Sjhibbits		goto err;
183296177Sjhibbits	}
184296177Sjhibbits
185296177Sjhibbits	sc->sc_irid = 0;
186296177Sjhibbits	sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ,
187296177Sjhibbits	    &sc->sc_irid, RF_ACTIVE | RF_SHAREABLE);
188296177Sjhibbits	if (sc->sc_ires == NULL) {
189296177Sjhibbits		device_printf(dev, "could not allocate error interrupt.\n");
190296177Sjhibbits		goto err;
191296177Sjhibbits	}
192296177Sjhibbits
193296177Sjhibbits	if (qp_sc == NULL)
194296177Sjhibbits		goto err;
195296177Sjhibbits
196296177Sjhibbits	dpaa_portal_map_registers(qp_sc);
197296177Sjhibbits
198296177Sjhibbits	/* Initialize QMan */
199296177Sjhibbits	qp.guestId = NCSW_MASTER_ID;
200296177Sjhibbits	qp.baseAddress = rman_get_bushandle(sc->sc_rres);
201296177Sjhibbits	qp.swPortalsBaseAddress = rman_get_bushandle(qp_sc->sc_rres[0]);
202296177Sjhibbits	qp.liodn = 0;
203296177Sjhibbits	qp.totalNumOfFqids = QMAN_MAX_FQIDS;
204296177Sjhibbits	qp.fqdMemPartitionId = NCSW_MASTER_ID;
205296177Sjhibbits	qp.pfdrMemPartitionId = NCSW_MASTER_ID;
206296177Sjhibbits	qp.f_Exception = qman_exception;
207296177Sjhibbits	qp.h_App = sc;
208296177Sjhibbits	qp.errIrq = (int)sc->sc_ires;
209296177Sjhibbits	qp.partFqidBase = QMAN_FQID_BASE;
210296177Sjhibbits	qp.partNumOfFqids = QMAN_MAX_FQIDS;
211296177Sjhibbits	qp.partCgsBase = 0;
212296177Sjhibbits	qp.partNumOfCgs = 0;
213296177Sjhibbits
214296177Sjhibbits	sc->sc_qh = QM_Config(&qp);
215296177Sjhibbits	if (sc->sc_qh == NULL) {
216296177Sjhibbits		device_printf(dev, "could not be configured\n");
217296177Sjhibbits		goto err;
218296177Sjhibbits	}
219296177Sjhibbits
220296177Sjhibbits	error = QM_Init(sc->sc_qh);
221296177Sjhibbits	if (error != E_OK) {
222296177Sjhibbits		device_printf(dev, "could not be initialized\n");
223296177Sjhibbits		goto err;
224296177Sjhibbits	}
225296177Sjhibbits
226296177Sjhibbits	error = QM_GetRevision(sc->sc_qh, &rev);
227296177Sjhibbits	if (error != E_OK) {
228296177Sjhibbits		device_printf(dev, "could not get QMan revision\n");
229296177Sjhibbits		goto err;
230296177Sjhibbits	}
231296177Sjhibbits
232296177Sjhibbits	device_printf(dev, "Hardware version: %d.%d.\n",
233296177Sjhibbits	    rev.majorRev, rev.minorRev);
234296177Sjhibbits
235296177Sjhibbits	sched_unpin();
236296177Sjhibbits
237296177Sjhibbits	qman_portal_setup(sc);
238296177Sjhibbits
239296177Sjhibbits	return (0);
240296177Sjhibbits
241296177Sjhibbitserr:
242296177Sjhibbits	sched_unpin();
243296177Sjhibbits	qman_detach(dev);
244296177Sjhibbits	return (ENXIO);
245296177Sjhibbits}
246296177Sjhibbits
247296177Sjhibbitsint
248296177Sjhibbitsqman_detach(device_t dev)
249296177Sjhibbits{
250296177Sjhibbits	struct qman_softc *sc;
251296177Sjhibbits
252296177Sjhibbits	sc = device_get_softc(dev);
253296177Sjhibbits
254296177Sjhibbits	if (sc->sc_qh)
255296177Sjhibbits		QM_Free(sc->sc_qh);
256296177Sjhibbits
257296177Sjhibbits	if (sc->sc_ires != NULL)
258296177Sjhibbits		XX_DeallocIntr((int)sc->sc_ires);
259296177Sjhibbits
260296177Sjhibbits	if (sc->sc_ires != NULL)
261296177Sjhibbits		bus_release_resource(dev, SYS_RES_IRQ,
262296177Sjhibbits		    sc->sc_irid, sc->sc_ires);
263296177Sjhibbits
264296177Sjhibbits	if (sc->sc_rres != NULL)
265296177Sjhibbits		bus_release_resource(dev, SYS_RES_MEMORY,
266296177Sjhibbits		    sc->sc_rrid, sc->sc_rres);
267296177Sjhibbits
268296177Sjhibbits	return (0);
269296177Sjhibbits}
270296177Sjhibbits
271296177Sjhibbitsint
272296177Sjhibbitsqman_suspend(device_t dev)
273296177Sjhibbits{
274296177Sjhibbits
275296177Sjhibbits	return (0);
276296177Sjhibbits}
277296177Sjhibbits
278296177Sjhibbitsint
279296177Sjhibbitsqman_resume(device_t dev)
280296177Sjhibbits{
281296177Sjhibbits
282296177Sjhibbits	return (0);
283296177Sjhibbits}
284296177Sjhibbits
285296177Sjhibbitsint
286296177Sjhibbitsqman_shutdown(device_t dev)
287296177Sjhibbits{
288296177Sjhibbits
289296177Sjhibbits	return (0);
290296177Sjhibbits}
291296177Sjhibbits
292296177Sjhibbits
293296177Sjhibbits/**
294296177Sjhibbits * @group QMan API functions implementation.
295296177Sjhibbits * @{
296296177Sjhibbits */
297296177Sjhibbits
298296177Sjhibbitst_Handle
299296177Sjhibbitsqman_fqr_create(uint32_t fqids_num, e_QmFQChannel channel, uint8_t wq,
300296177Sjhibbits    bool force_fqid, uint32_t fqid_or_align, bool init_parked,
301296177Sjhibbits    bool hold_active, bool prefer_in_cache, bool congst_avoid_ena,
302296177Sjhibbits    t_Handle congst_group, int8_t overhead_accounting_len,
303296177Sjhibbits    uint32_t tail_drop_threshold)
304296177Sjhibbits{
305296177Sjhibbits	struct qman_softc *sc;
306296177Sjhibbits	t_QmFqrParams fqr;
307296177Sjhibbits	unsigned int cpu;
308296177Sjhibbits	t_Handle fqrh, portal;
309296177Sjhibbits
310296177Sjhibbits	sc = qman_sc;
311296177Sjhibbits
312296177Sjhibbits	sched_pin();
313296177Sjhibbits	cpu = PCPU_GET(cpuid);
314296177Sjhibbits
315296177Sjhibbits	/* Ensure we have got QMan port initialized */
316296177Sjhibbits	portal = qman_portal_setup(sc);
317296177Sjhibbits	if (portal == NULL) {
318296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
319296177Sjhibbits		goto err;
320296177Sjhibbits	}
321296177Sjhibbits
322296177Sjhibbits	fqr.h_Qm = sc->sc_qh;
323296177Sjhibbits	fqr.h_QmPortal = portal;
324296177Sjhibbits	fqr.initParked = init_parked;
325296177Sjhibbits	fqr.holdActive = hold_active;
326296177Sjhibbits	fqr.preferInCache = prefer_in_cache;
327296177Sjhibbits
328296177Sjhibbits	/* We do not support stashing */
329296177Sjhibbits	fqr.useContextAForStash = FALSE;
330296177Sjhibbits	fqr.p_ContextA = 0;
331296177Sjhibbits	fqr.p_ContextB = 0;
332296177Sjhibbits
333296177Sjhibbits	fqr.channel = channel;
334296177Sjhibbits	fqr.wq = wq;
335296177Sjhibbits	fqr.shadowMode = FALSE;
336296177Sjhibbits	fqr.numOfFqids = fqids_num;
337296177Sjhibbits
338296177Sjhibbits	/* FQID */
339296177Sjhibbits	fqr.useForce = force_fqid;
340296177Sjhibbits	if (force_fqid) {
341296177Sjhibbits		fqr.qs.frcQ.fqid = fqid_or_align;
342296177Sjhibbits	} else {
343296177Sjhibbits		fqr.qs.nonFrcQs.align = fqid_or_align;
344296177Sjhibbits	}
345296177Sjhibbits
346296177Sjhibbits	/* Congestion Avoidance */
347296177Sjhibbits	fqr.congestionAvoidanceEnable = congst_avoid_ena;
348296177Sjhibbits	if (congst_avoid_ena) {
349296177Sjhibbits		fqr.congestionAvoidanceParams.h_QmCg = congst_group;
350296177Sjhibbits		fqr.congestionAvoidanceParams.overheadAccountingLength =
351296177Sjhibbits		    overhead_accounting_len;
352296177Sjhibbits		fqr.congestionAvoidanceParams.fqTailDropThreshold =
353296177Sjhibbits		    tail_drop_threshold;
354296177Sjhibbits	} else {
355296177Sjhibbits		fqr.congestionAvoidanceParams.h_QmCg = 0;
356296177Sjhibbits		fqr.congestionAvoidanceParams.overheadAccountingLength = 0;
357296177Sjhibbits		fqr.congestionAvoidanceParams.fqTailDropThreshold = 0;
358296177Sjhibbits	}
359296177Sjhibbits
360296177Sjhibbits	fqrh = QM_FQR_Create(&fqr);
361296177Sjhibbits	if (fqrh == NULL) {
362296177Sjhibbits		device_printf(sc->sc_dev, "could not create Frame Queue Range"
363296177Sjhibbits		    "\n");
364296177Sjhibbits		goto err;
365296177Sjhibbits	}
366296177Sjhibbits
367296177Sjhibbits	sc->sc_fqr_cpu[QM_FQR_GetFqid(fqrh)] = PCPU_GET(cpuid);
368296177Sjhibbits
369296177Sjhibbits	sched_unpin();
370296177Sjhibbits
371296177Sjhibbits	return (fqrh);
372296177Sjhibbits
373296177Sjhibbitserr:
374296177Sjhibbits	sched_unpin();
375296177Sjhibbits
376296177Sjhibbits	return (NULL);
377296177Sjhibbits}
378296177Sjhibbits
379296177Sjhibbitst_Error
380296177Sjhibbitsqman_fqr_free(t_Handle fqr)
381296177Sjhibbits{
382296177Sjhibbits	struct qman_softc *sc;
383296177Sjhibbits	t_Error error;
384296177Sjhibbits
385296177Sjhibbits	sc = qman_sc;
386296177Sjhibbits	thread_lock(curthread);
387296177Sjhibbits	sched_bind(curthread, sc->sc_fqr_cpu[QM_FQR_GetFqid(fqr)]);
388296177Sjhibbits	thread_unlock(curthread);
389296177Sjhibbits
390296177Sjhibbits	error = QM_FQR_Free(fqr);
391296177Sjhibbits
392296177Sjhibbits	thread_lock(curthread);
393296177Sjhibbits	sched_unbind(curthread);
394296177Sjhibbits	thread_unlock(curthread);
395296177Sjhibbits
396296177Sjhibbits	return (error);
397296177Sjhibbits}
398296177Sjhibbits
399296177Sjhibbitst_Error
400296177Sjhibbitsqman_fqr_register_cb(t_Handle fqr, t_QmReceivedFrameCallback *callback,
401296177Sjhibbits    t_Handle app)
402296177Sjhibbits{
403296177Sjhibbits	struct qman_softc *sc;
404296177Sjhibbits	t_Error error;
405296177Sjhibbits	t_Handle portal;
406296177Sjhibbits
407296177Sjhibbits	sc = qman_sc;
408296177Sjhibbits	sched_pin();
409296177Sjhibbits
410296177Sjhibbits	/* Ensure we have got QMan port initialized */
411296177Sjhibbits	portal = qman_portal_setup(sc);
412296177Sjhibbits	if (portal == NULL) {
413296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
414296177Sjhibbits		sched_unpin();
415296177Sjhibbits		return (E_NOT_SUPPORTED);
416296177Sjhibbits	}
417296177Sjhibbits
418296177Sjhibbits	error = QM_FQR_RegisterCB(fqr, callback, app);
419296177Sjhibbits
420296177Sjhibbits	sched_unpin();
421296177Sjhibbits
422296177Sjhibbits	return (error);
423296177Sjhibbits}
424296177Sjhibbits
425296177Sjhibbitst_Error
426296177Sjhibbitsqman_fqr_enqueue(t_Handle fqr, uint32_t fqid_off, t_DpaaFD *frame)
427296177Sjhibbits{
428296177Sjhibbits	struct qman_softc *sc;
429296177Sjhibbits	t_Error error;
430296177Sjhibbits	t_Handle portal;
431296177Sjhibbits
432296177Sjhibbits	sc = qman_sc;
433296177Sjhibbits	sched_pin();
434296177Sjhibbits
435296177Sjhibbits	/* Ensure we have got QMan port initialized */
436296177Sjhibbits	portal = qman_portal_setup(sc);
437296177Sjhibbits	if (portal == NULL) {
438296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
439296177Sjhibbits		sched_unpin();
440296177Sjhibbits		return (E_NOT_SUPPORTED);
441296177Sjhibbits	}
442296177Sjhibbits
443296177Sjhibbits	error = QM_FQR_Enqueue(fqr, portal, fqid_off, frame);
444296177Sjhibbits
445296177Sjhibbits	sched_unpin();
446296177Sjhibbits
447296177Sjhibbits	return (error);
448296177Sjhibbits}
449296177Sjhibbits
450296177Sjhibbitsuint32_t
451296177Sjhibbitsqman_fqr_get_counter(t_Handle fqr, uint32_t fqid_off,
452296177Sjhibbits    e_QmFqrCounters counter)
453296177Sjhibbits{
454296177Sjhibbits	struct qman_softc *sc;
455296177Sjhibbits	uint32_t val;
456296177Sjhibbits	t_Handle portal;
457296177Sjhibbits
458296177Sjhibbits	sc = qman_sc;
459296177Sjhibbits	sched_pin();
460296177Sjhibbits
461296177Sjhibbits	/* Ensure we have got QMan port initialized */
462296177Sjhibbits	portal = qman_portal_setup(sc);
463296177Sjhibbits	if (portal == NULL) {
464296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
465296177Sjhibbits		sched_unpin();
466296177Sjhibbits		return (0);
467296177Sjhibbits	}
468296177Sjhibbits
469296177Sjhibbits	val = QM_FQR_GetCounter(fqr, portal, fqid_off, counter);
470296177Sjhibbits
471296177Sjhibbits	sched_unpin();
472296177Sjhibbits
473296177Sjhibbits	return (val);
474296177Sjhibbits}
475296177Sjhibbits
476296177Sjhibbitst_Error
477296177Sjhibbitsqman_fqr_pull_frame(t_Handle fqr, uint32_t fqid_off, t_DpaaFD *frame)
478296177Sjhibbits{
479296177Sjhibbits	struct qman_softc *sc;
480296177Sjhibbits	t_Error error;
481296177Sjhibbits	t_Handle portal;
482296177Sjhibbits
483296177Sjhibbits	sc = qman_sc;
484296177Sjhibbits	sched_pin();
485296177Sjhibbits
486296177Sjhibbits	/* Ensure we have got QMan port initialized */
487296177Sjhibbits	portal = qman_portal_setup(sc);
488296177Sjhibbits	if (portal == NULL) {
489296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
490296177Sjhibbits		sched_unpin();
491296177Sjhibbits		return (E_NOT_SUPPORTED);
492296177Sjhibbits	}
493296177Sjhibbits
494296177Sjhibbits	error = QM_FQR_PullFrame(fqr, portal, fqid_off, frame);
495296177Sjhibbits
496296177Sjhibbits	sched_unpin();
497296177Sjhibbits
498296177Sjhibbits	return (error);
499296177Sjhibbits}
500296177Sjhibbits
501296177Sjhibbitsuint32_t
502296177Sjhibbitsqman_fqr_get_base_fqid(t_Handle fqr)
503296177Sjhibbits{
504296177Sjhibbits	struct qman_softc *sc;
505296177Sjhibbits	uint32_t val;
506296177Sjhibbits	t_Handle portal;
507296177Sjhibbits
508296177Sjhibbits	sc = qman_sc;
509296177Sjhibbits	sched_pin();
510296177Sjhibbits
511296177Sjhibbits	/* Ensure we have got QMan port initialized */
512296177Sjhibbits	portal = qman_portal_setup(sc);
513296177Sjhibbits	if (portal == NULL) {
514296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
515296177Sjhibbits		sched_unpin();
516296177Sjhibbits		return (0);
517296177Sjhibbits	}
518296177Sjhibbits
519296177Sjhibbits	val = QM_FQR_GetFqid(fqr);
520296177Sjhibbits
521296177Sjhibbits	sched_unpin();
522296177Sjhibbits
523296177Sjhibbits	return (val);
524296177Sjhibbits}
525296177Sjhibbits
526296177Sjhibbitst_Error
527296177Sjhibbitsqman_poll(e_QmPortalPollSource source)
528296177Sjhibbits{
529296177Sjhibbits	struct qman_softc *sc;
530296177Sjhibbits	t_Error error;
531296177Sjhibbits	t_Handle portal;
532296177Sjhibbits
533296177Sjhibbits	sc = qman_sc;
534296177Sjhibbits	sched_pin();
535296177Sjhibbits
536296177Sjhibbits	/* Ensure we have got QMan port initialized */
537296177Sjhibbits	portal = qman_portal_setup(sc);
538296177Sjhibbits	if (portal == NULL) {
539296177Sjhibbits		device_printf(sc->sc_dev, "could not setup QMan portal\n");
540296177Sjhibbits		sched_unpin();
541296177Sjhibbits		return (E_NOT_SUPPORTED);
542296177Sjhibbits	}
543296177Sjhibbits
544296177Sjhibbits	error = QM_Poll(sc->sc_qh, source);
545296177Sjhibbits
546296177Sjhibbits	sched_unpin();
547296177Sjhibbits
548296177Sjhibbits	return (error);
549296177Sjhibbits}
550296177Sjhibbits
551296177Sjhibbits/*
552296177Sjhibbits * TODO: add polling and/or congestion support.
553296177Sjhibbits */
554296177Sjhibbits
555296177Sjhibbits/** @} */
556