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