10aeed3e9SJustin Hibbits /******************************************************************************
20aeed3e9SJustin Hibbits
30aeed3e9SJustin Hibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
40aeed3e9SJustin Hibbits All rights reserved.
50aeed3e9SJustin Hibbits
60aeed3e9SJustin Hibbits This is proprietary source code of Freescale Semiconductor Inc.,
70aeed3e9SJustin Hibbits and its use is subject to the NetComm Device Drivers EULA.
80aeed3e9SJustin Hibbits The copyright notice above does not evidence any actual or intended
90aeed3e9SJustin Hibbits publication of such source code.
100aeed3e9SJustin Hibbits
110aeed3e9SJustin Hibbits ALTERNATIVELY, redistribution and use in source and binary forms, with
120aeed3e9SJustin Hibbits or without modification, are permitted provided that the following
130aeed3e9SJustin Hibbits conditions are met:
140aeed3e9SJustin Hibbits * Redistributions of source code must retain the above copyright
150aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer.
160aeed3e9SJustin Hibbits * Redistributions in binary form must reproduce the above copyright
170aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer in the
180aeed3e9SJustin Hibbits documentation and/or other materials provided with the distribution.
190aeed3e9SJustin Hibbits * Neither the name of Freescale Semiconductor nor the
200aeed3e9SJustin Hibbits names of its contributors may be used to endorse or promote products
210aeed3e9SJustin Hibbits derived from this software without specific prior written permission.
220aeed3e9SJustin Hibbits
230aeed3e9SJustin Hibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
240aeed3e9SJustin Hibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
250aeed3e9SJustin Hibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
260aeed3e9SJustin Hibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
270aeed3e9SJustin Hibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
280aeed3e9SJustin Hibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
290aeed3e9SJustin Hibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
300aeed3e9SJustin Hibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
310aeed3e9SJustin Hibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
320aeed3e9SJustin Hibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
330aeed3e9SJustin Hibbits *
340aeed3e9SJustin Hibbits
350aeed3e9SJustin Hibbits **************************************************************************/
360aeed3e9SJustin Hibbits /******************************************************************************
370aeed3e9SJustin Hibbits @File fsl_qman.h
380aeed3e9SJustin Hibbits
390aeed3e9SJustin Hibbits @Description QM header
400aeed3e9SJustin Hibbits *//***************************************************************************/
410aeed3e9SJustin Hibbits #ifndef __FSL_QMAN_H
420aeed3e9SJustin Hibbits #define __FSL_QMAN_H
430aeed3e9SJustin Hibbits
440aeed3e9SJustin Hibbits #include "std_ext.h"
450aeed3e9SJustin Hibbits #include "string_ext.h"
460aeed3e9SJustin Hibbits #include "qm_ext.h"
470aeed3e9SJustin Hibbits
480aeed3e9SJustin Hibbits
490aeed3e9SJustin Hibbits /*************************************************/
500aeed3e9SJustin Hibbits /* QMan s/w corenet portal, low-level i/face */
510aeed3e9SJustin Hibbits /*************************************************/
520aeed3e9SJustin Hibbits typedef enum {
530aeed3e9SJustin Hibbits e_QmPortalPCI = 0, /* PI index, cache-inhibited */
540aeed3e9SJustin Hibbits e_QmPortalPCE, /* PI index, cache-enabled */
550aeed3e9SJustin Hibbits e_QmPortalPVB /* valid-bit */
560aeed3e9SJustin Hibbits } e_QmPortalProduceMode;
570aeed3e9SJustin Hibbits
580aeed3e9SJustin Hibbits typedef enum {
590aeed3e9SJustin Hibbits e_QmPortalEqcrCCI = 0, /* CI index, cache-inhibited */
600aeed3e9SJustin Hibbits e_QmPortalEqcrCCE /* CI index, cache-enabled */
610aeed3e9SJustin Hibbits } e_QmPortalEqcrConsumeMode;
620aeed3e9SJustin Hibbits
630aeed3e9SJustin Hibbits typedef enum {
640aeed3e9SJustin Hibbits e_QmPortalDqrrCCI = 0, /* CI index, cache-inhibited */
650aeed3e9SJustin Hibbits e_QmPortalDqrrCCE, /* CI index, cache-enabled */
660aeed3e9SJustin Hibbits e_QmPortalDqrrDCA /* Discrete Consumption Acknowledgment */
670aeed3e9SJustin Hibbits } e_QmPortalDqrrConsumeMode;
680aeed3e9SJustin Hibbits
690aeed3e9SJustin Hibbits typedef enum {
700aeed3e9SJustin Hibbits e_QmPortalMrCCI = 0, /* CI index, cache-inhibited */
710aeed3e9SJustin Hibbits e_QmPortalMrCCE /* CI index, cache-enabled */
720aeed3e9SJustin Hibbits } e_QmPortalMrConsumeMode;
730aeed3e9SJustin Hibbits
740aeed3e9SJustin Hibbits typedef enum {
750aeed3e9SJustin Hibbits e_QmPortalDequeuePushMode = 0, /* SDQCR + VDQCR */
760aeed3e9SJustin Hibbits e_QmPortalDequeuePullMode /* PDQCR */
770aeed3e9SJustin Hibbits } e_QmPortalDequeueMode;
780aeed3e9SJustin Hibbits
790aeed3e9SJustin Hibbits /* Portal constants */
800aeed3e9SJustin Hibbits #define QM_EQCR_SIZE 8
810aeed3e9SJustin Hibbits #define QM_DQRR_SIZE 16
820aeed3e9SJustin Hibbits #define QM_MR_SIZE 8
830aeed3e9SJustin Hibbits
840aeed3e9SJustin Hibbits /* Hardware constants */
850aeed3e9SJustin Hibbits
860aeed3e9SJustin Hibbits enum qm_isr_reg {
870aeed3e9SJustin Hibbits qm_isr_status = 0,
880aeed3e9SJustin Hibbits qm_isr_enable = 1,
890aeed3e9SJustin Hibbits qm_isr_disable = 2,
900aeed3e9SJustin Hibbits qm_isr_inhibit = 3
910aeed3e9SJustin Hibbits };
920aeed3e9SJustin Hibbits enum qm_dc_portal {
930aeed3e9SJustin Hibbits qm_dc_portal_fman0 = 0,
940aeed3e9SJustin Hibbits qm_dc_portal_fman1 = 1,
950aeed3e9SJustin Hibbits qm_dc_portal_caam = 2,
960aeed3e9SJustin Hibbits qm_dc_portal_pme = 3
970aeed3e9SJustin Hibbits };
980aeed3e9SJustin Hibbits
990aeed3e9SJustin Hibbits /* Represents s/w corenet portal mapped data structures */
1000aeed3e9SJustin Hibbits struct qm_eqcr_entry; /* EQCR (EnQueue Command Ring) entries */
1010aeed3e9SJustin Hibbits struct qm_dqrr_entry; /* DQRR (DeQueue Response Ring) entries */
1020aeed3e9SJustin Hibbits struct qm_mr_entry; /* MR (Message Ring) entries */
1030aeed3e9SJustin Hibbits struct qm_mc_command; /* MC (Management Command) command */
1040aeed3e9SJustin Hibbits struct qm_mc_result; /* MC result */
1050aeed3e9SJustin Hibbits
1060aeed3e9SJustin Hibbits /* This type represents a s/w corenet portal space, and is used for creating the
1070aeed3e9SJustin Hibbits * portal objects within it (EQCR, DQRR, etc) */
1080aeed3e9SJustin Hibbits struct qm_portal;
1090aeed3e9SJustin Hibbits
1100aeed3e9SJustin Hibbits /* When iterating the available portals, this is the exposed config structure */
1110aeed3e9SJustin Hibbits struct qm_portal_config {
1120aeed3e9SJustin Hibbits /* If the caller enables DQRR stashing (and thus wishes to operate the
1130aeed3e9SJustin Hibbits * portal from only one cpu), this is the logical CPU that the portal
1140aeed3e9SJustin Hibbits * will stash to. Whether stashing is enabled or not, this setting is
1150aeed3e9SJustin Hibbits * also used for any "core-affine" portals, ie. default portals
1160aeed3e9SJustin Hibbits * associated to the corresponding cpu. -1 implies that there is no core
1170aeed3e9SJustin Hibbits * affinity configured. */
1180aeed3e9SJustin Hibbits int cpu;
1190aeed3e9SJustin Hibbits /* portal interrupt line */
120*852ba100SJustin Hibbits uintptr_t irq;
1210aeed3e9SJustin Hibbits /* The portal's dedicated channel id, use this value for initializing
1220aeed3e9SJustin Hibbits * frame queues to target this portal when scheduled. */
1230aeed3e9SJustin Hibbits e_QmFQChannel channel;
1240aeed3e9SJustin Hibbits /* A mask of which pool channels this portal has dequeue access to
1250aeed3e9SJustin Hibbits * (using QM_SDQCR_CHANNELS_POOL(n) for the bitmask) */
1260aeed3e9SJustin Hibbits uint32_t pools;
1270aeed3e9SJustin Hibbits /* which portal sub-interfaces are already bound (ie. "in use") */
1280aeed3e9SJustin Hibbits uint8_t bound;
1290aeed3e9SJustin Hibbits };
1300aeed3e9SJustin Hibbits /* qm_portal_config::bound uses these bit masks */
1310aeed3e9SJustin Hibbits #define QM_BIND_EQCR 0x01
1320aeed3e9SJustin Hibbits #define QM_BIND_DQRR 0x02
1330aeed3e9SJustin Hibbits #define QM_BIND_MR 0x04
1340aeed3e9SJustin Hibbits #define QM_BIND_MC 0x08
1350aeed3e9SJustin Hibbits #define QM_BIND_ISR 0x10
1360aeed3e9SJustin Hibbits
1370aeed3e9SJustin Hibbits /* This struct represents a pool channel */
1380aeed3e9SJustin Hibbits struct qm_pool_channel {
1390aeed3e9SJustin Hibbits /* The QM_SDQCR_CHANNELS_POOL(n) bit that corresponds to this channel */
1400aeed3e9SJustin Hibbits uint32_t pool;
1410aeed3e9SJustin Hibbits /* The channel id, used for initialising frame queues to target this
1420aeed3e9SJustin Hibbits * channel. */
1430aeed3e9SJustin Hibbits e_QmFQChannel channel;
1440aeed3e9SJustin Hibbits /* Bitmask of portal (logical-, not cell-)indices that have dequeue
1450aeed3e9SJustin Hibbits * access to this channel;
1460aeed3e9SJustin Hibbits * 0x001 -> qm_portal_get(0)
1470aeed3e9SJustin Hibbits * 0x002 -> qm_portal_get(1)
1480aeed3e9SJustin Hibbits * 0x004 -> qm_portal_get(2)
1490aeed3e9SJustin Hibbits * ...
1500aeed3e9SJustin Hibbits * 0x200 -> qm_portal_get(9)
1510aeed3e9SJustin Hibbits */
1520aeed3e9SJustin Hibbits uint32_t portals;
1530aeed3e9SJustin Hibbits };
1540aeed3e9SJustin Hibbits
1550aeed3e9SJustin Hibbits /* ------------------------------ */
1560aeed3e9SJustin Hibbits /* --- Portal enumeration API --- */
1570aeed3e9SJustin Hibbits
1580aeed3e9SJustin Hibbits /* Obtain the number of portals available */
1590aeed3e9SJustin Hibbits uint8_t qm_portal_num(void);
1600aeed3e9SJustin Hibbits
1610aeed3e9SJustin Hibbits /* Obtain a portal handle and configuration information about it */
1620aeed3e9SJustin Hibbits struct qm_portal *qm_portal_get(uint8_t idx);
1630aeed3e9SJustin Hibbits
1640aeed3e9SJustin Hibbits
1650aeed3e9SJustin Hibbits /* ------------------------------------ */
1660aeed3e9SJustin Hibbits /* --- Pool channel enumeration API --- */
1670aeed3e9SJustin Hibbits
1680aeed3e9SJustin Hibbits /* Obtain a mask of the available pool channels, expressed using
1690aeed3e9SJustin Hibbits * QM_SDQCR_CHANNELS_POOL(n). */
1700aeed3e9SJustin Hibbits uint32_t qm_pools(void);
1710aeed3e9SJustin Hibbits
1720aeed3e9SJustin Hibbits /* Retrieve a pool channel configuration, given a QM_SDQCR_CHANNEL_POOL(n)
1730aeed3e9SJustin Hibbits * bit-mask (the least significant bit of 'mask' is used if more than one bit is
1740aeed3e9SJustin Hibbits * set). */
1750aeed3e9SJustin Hibbits const struct qm_pool_channel *qm_pool_channel(uint32_t mask);
1760aeed3e9SJustin Hibbits
1770aeed3e9SJustin Hibbits /* Flags to qm_fq_free_flags() */
1780aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT 0x00000001 /* wait if RCR is full */
1790aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_INT 0x00000002 /* if wait, interruptible? */
1800aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_SYNC 0x00000004 /* if wait, until consumed? */
1810aeed3e9SJustin Hibbits
1820aeed3e9SJustin Hibbits
1830aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_CHANNELS 0x0
1840aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_SPECIFICWQ 0x40000000
1850aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_EXACT1 0x0
1860aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_UPTO3 0x20000000
1870aeed3e9SJustin Hibbits #define QM_SDQCR_DEDICATED_PRECEDENCE 0x10000000
1880aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_MASK 0x03000000
1890aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_NULL 0x0
1900aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_PRIO_QOS 0x01000000
1910aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE_QOS 0x02000000
1920aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE 0x03000000
1930aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_SET(v) (((v) & 0x03) << (31-7))
1940aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_MASK 0x00ff0000
1950aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_SET(v) (((v) & 0xff) << 16)
1960aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_GET(v) (((v) >> 16) & 0xff)
1970aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_DEDICATED 0x00008000
1980aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL_MASK 0x00007fff
1990aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL(n) (0x00008000 >> (n))
2000aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_MASK 0x000000f7
2010aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_DEDICATED 0x00000000
2020aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_POOL(n) ((n) << 4)
2030aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_WQ(n) (n)
2040aeed3e9SJustin Hibbits
2050aeed3e9SJustin Hibbits /* For qm_dqrr_vdqcr_set(); Choose one PRECEDENCE. EXACT is optional. Use
2060aeed3e9SJustin Hibbits * NUMFRAMES(n) (6-bit) or NUMFRAMES_TILLEMPTY to fill in the frame-count. Use
2070aeed3e9SJustin Hibbits * FQID(n) to fill in the frame queue ID. */
2080aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_VDQCR 0x0
2090aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_SDQCR 0x80000000
2100aeed3e9SJustin Hibbits #define QM_VDQCR_EXACT 0x40000000
2110aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_MASK 0x3f000000
2120aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_SET(n) (((n) & 0x3f) << 24)
2130aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_GET(n) (((n) >> 24) & 0x3f)
2140aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_TILLEMPTY QM_VDQCR_NUMFRAMES_SET(0)
2150aeed3e9SJustin Hibbits #define QM_VDQCR_FQID_MASK 0x00ffffff
2160aeed3e9SJustin Hibbits #define QM_VDQCR_FQID(n) ((n) & QM_VDQCR_FQID_MASK)
2170aeed3e9SJustin Hibbits
2180aeed3e9SJustin Hibbits /* For qm_dqrr_pdqcr_set(); Choose one MODE. Choose one COUNT.
2190aeed3e9SJustin Hibbits * If MODE==SCHEDULED
2200aeed3e9SJustin Hibbits * Choose SCHEDULED_CHANNELS or SCHEDULED_SPECIFICWQ. Choose one dequeue TYPE.
2210aeed3e9SJustin Hibbits * If CHANNELS,
2220aeed3e9SJustin Hibbits * Choose CHANNELS_DEDICATED and/or CHANNELS_POOL() channels.
2230aeed3e9SJustin Hibbits * You can choose DEDICATED_PRECEDENCE if the portal channel should have
2240aeed3e9SJustin Hibbits * priority.
2250aeed3e9SJustin Hibbits * If SPECIFICWQ,
2260aeed3e9SJustin Hibbits * Either select the work-queue ID with SPECIFICWQ_WQ(), or select the
2270aeed3e9SJustin Hibbits * channel (SPECIFICWQ_DEDICATED or SPECIFICWQ_POOL()) and specify the
2280aeed3e9SJustin Hibbits * work-queue priority (0-7) with SPECIFICWQ_WQ() - either way, you get the
2290aeed3e9SJustin Hibbits * same value.
2300aeed3e9SJustin Hibbits * If MODE==UNSCHEDULED
2310aeed3e9SJustin Hibbits * Choose FQID().
2320aeed3e9SJustin Hibbits */
2330aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_SCHEDULED 0x0
2340aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_UNSCHEDULED 0x80000000
2350aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_CHANNELS 0x0
2360aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_SPECIFICWQ 0x40000000
2370aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_EXACT1 0x0
2380aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_UPTO3 0x20000000
2390aeed3e9SJustin Hibbits #define QM_PDQCR_DEDICATED_PRECEDENCE 0x10000000
2400aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_MASK 0x03000000
2410aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_NULL 0x0
2420aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_PRIO_QOS 0x01000000
2430aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE_QOS 0x02000000
2440aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE 0x03000000
2450aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_DEDICATED 0x00008000
2460aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_POOL(n) (0x00008000 >> (n))
2470aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_MASK 0x000000f7
2480aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_DEDICATED 0x00000000
2490aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_POOL(n) ((n) << 4)
2500aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_WQ(n) (n)
2510aeed3e9SJustin Hibbits #define QM_PDQCR_FQID(n) ((n) & 0xffffff)
2520aeed3e9SJustin Hibbits
2530aeed3e9SJustin Hibbits /* ------------------------------------- */
2540aeed3e9SJustin Hibbits /* --- Portal interrupt register API --- */
2550aeed3e9SJustin Hibbits
2560aeed3e9SJustin Hibbits /* Quick explanation of the Qman interrupt model. Each bit has a source
2570aeed3e9SJustin Hibbits * condition, that source is asserted iff the condition is true. Eg. Each
2580aeed3e9SJustin Hibbits * DQAVAIL source bit tracks whether the corresponding channel's work queues
2590aeed3e9SJustin Hibbits * contain any truly scheduled frame queues. That source exists "asserted" if
2600aeed3e9SJustin Hibbits * and while there are truly-scheduled FQs available, it is deasserted as/when
2610aeed3e9SJustin Hibbits * there are no longer any truly-scheduled FQs available. The same is true for
2620aeed3e9SJustin Hibbits * the various other interrupt source conditions (QM_PIRQ_***). The following
2630aeed3e9SJustin Hibbits * steps indicate what those source bits affect;
2640aeed3e9SJustin Hibbits * 1. if the corresponding bit is set in the disable register, the source
2650aeed3e9SJustin Hibbits * bit is masked off, we never see any effect from it.
2660aeed3e9SJustin Hibbits * 2. otherwise, the corresponding bit is set in the status register. Once
2670aeed3e9SJustin Hibbits * asserted in the status register, it must be write-1-to-clear'd - the
2680aeed3e9SJustin Hibbits * status register bit will stay set even if the source condition
2690aeed3e9SJustin Hibbits * deasserts.
2700aeed3e9SJustin Hibbits * 3. if a bit is set in the status register but *not* set in the enable
2710aeed3e9SJustin Hibbits * register, it will not cause the interrupt to assert. Other bits may
2720aeed3e9SJustin Hibbits * still cause the interrupt to assert of course, and a read of the
2730aeed3e9SJustin Hibbits * status register can still reveal un-enabled bits - this is why the
2740aeed3e9SJustin Hibbits * enable and disable registers aren't strictly speaking "opposites".
2750aeed3e9SJustin Hibbits * "Un-enabled" means it won't, on its own, trigger an interrupt.
2760aeed3e9SJustin Hibbits * "Disabled" means it won't even show up in the status register.
2770aeed3e9SJustin Hibbits * 4. if a bit is set in the status register *and* the enable register, the
2780aeed3e9SJustin Hibbits * interrupt line will assert if and only if the inhibit register is
2790aeed3e9SJustin Hibbits * zero. The inhibit register is the only interrupt-related register that
2800aeed3e9SJustin Hibbits * does not share the bit definitions - it is a boolean on/off register.
2810aeed3e9SJustin Hibbits */
2820aeed3e9SJustin Hibbits
2830aeed3e9SJustin Hibbits /* Create/destroy */
2840aeed3e9SJustin Hibbits
2850aeed3e9SJustin Hibbits /* Used by all portal interrupt registers except 'inhibit' */
2860aeed3e9SJustin Hibbits #define QM_PIRQ_CSCI 0x00100000 /* Congestion State Change */
2870aeed3e9SJustin Hibbits #define QM_PIRQ_EQCI 0x00080000 /* Enqueue Command Committed */
2880aeed3e9SJustin Hibbits #define QM_PIRQ_EQRI 0x00040000 /* EQCR Ring (below threshold) */
2890aeed3e9SJustin Hibbits #define QM_PIRQ_DQRI 0x00020000 /* DQRR Ring (non-empty) */
2900aeed3e9SJustin Hibbits #define QM_PIRQ_MRI 0x00010000 /* MR Ring (non-empty) */
2910aeed3e9SJustin Hibbits /* The DQAVAIL interrupt fields break down into these bits; */
2920aeed3e9SJustin Hibbits #define QM_PIRQ_DQAVAIL 0x0000ffff /* Channels with frame availability */
2930aeed3e9SJustin Hibbits #define QM_DQAVAIL_PORTAL 0x8000 /* Portal channel */
2940aeed3e9SJustin Hibbits #define QM_DQAVAIL_POOL(n) (0x8000 >> (n)) /* Pool channel, n==[1..15] */
2950aeed3e9SJustin Hibbits
2960aeed3e9SJustin Hibbits /* These are qm_<reg>_<verb>(). So for example, qm_disable_write() means "write
2970aeed3e9SJustin Hibbits * the disable register" rather than "disable the ability to write". */
2980aeed3e9SJustin Hibbits #define qm_isr_status_read(qm) __qm_isr_read(qm, qm_isr_status)
2990aeed3e9SJustin Hibbits #define qm_isr_status_clear(qm, m) __qm_isr_write(qm, qm_isr_status, m)
3000aeed3e9SJustin Hibbits #define qm_isr_enable_read(qm) __qm_isr_read(qm, qm_isr_enable)
3010aeed3e9SJustin Hibbits #define qm_isr_enable_write(qm, v) __qm_isr_write(qm, qm_isr_enable, v)
3020aeed3e9SJustin Hibbits #define qm_isr_disable_read(qm) __qm_isr_read(qm, qm_isr_disable)
3030aeed3e9SJustin Hibbits #define qm_isr_disable_write(qm, v) __qm_isr_write(qm, qm_isr_disable, v)
3040aeed3e9SJustin Hibbits #define qm_isr_inhibit(qm) __qm_isr_write(qm, qm_isr_inhibit, 1)
3050aeed3e9SJustin Hibbits #define qm_isr_uninhibit(qm) __qm_isr_write(qm, qm_isr_inhibit, 0)
3060aeed3e9SJustin Hibbits
3070aeed3e9SJustin Hibbits /* ------------------------------------------------------- */
3080aeed3e9SJustin Hibbits /* --- Qman data structures (and associated constants) --- */
3090aeed3e9SJustin Hibbits
3100aeed3e9SJustin Hibbits /* See David Lapp's "Frame formats" document, "dpateam", Jan 07, 2008 */
3110aeed3e9SJustin Hibbits #define QM_FD_FORMAT_SG 0x4
3120aeed3e9SJustin Hibbits #define QM_FD_FORMAT_LONG 0x2
3130aeed3e9SJustin Hibbits #define QM_FD_FORMAT_COMPOUND 0x1
3140aeed3e9SJustin Hibbits enum qm_fd_format {
3150aeed3e9SJustin Hibbits /* 'contig' implies a contiguous buffer, whereas 'sg' implies a
3160aeed3e9SJustin Hibbits * scatter-gather table. 'big' implies a 29-bit length with no offset
3170aeed3e9SJustin Hibbits * field, otherwise length is 20-bit and offset is 9-bit. 'compound'
3180aeed3e9SJustin Hibbits * implies a s/g-like table, where each entry itself represents a frame
3190aeed3e9SJustin Hibbits * (contiguous or scatter-gather) and the 29-bit "length" is
3200aeed3e9SJustin Hibbits * interpreted purely for congestion calculations, ie. a "congestion
3210aeed3e9SJustin Hibbits * weight". */
3220aeed3e9SJustin Hibbits qm_fd_contig = 0,
3230aeed3e9SJustin Hibbits qm_fd_contig_big = QM_FD_FORMAT_LONG,
3240aeed3e9SJustin Hibbits qm_fd_sg = QM_FD_FORMAT_SG,
3250aeed3e9SJustin Hibbits qm_fd_sg_big = QM_FD_FORMAT_SG | QM_FD_FORMAT_LONG,
3260aeed3e9SJustin Hibbits qm_fd_compound = QM_FD_FORMAT_COMPOUND
3270aeed3e9SJustin Hibbits };
3280aeed3e9SJustin Hibbits
3290aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
3300aeed3e9SJustin Hibbits #pragma pack(push,1)
3310aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
3320aeed3e9SJustin Hibbits #define MEM_MAP_START
3330aeed3e9SJustin Hibbits
3340aeed3e9SJustin Hibbits _Packed struct qm_fqd_stashing {
3350aeed3e9SJustin Hibbits /* See QM_STASHING_EXCL_<...> */
3360aeed3e9SJustin Hibbits volatile uint8_t exclusive;
3370aeed3e9SJustin Hibbits volatile uint8_t reserved1:2;
3380aeed3e9SJustin Hibbits /* Numbers of cachelines */
3390aeed3e9SJustin Hibbits volatile uint8_t annotation_cl:2;
3400aeed3e9SJustin Hibbits volatile uint8_t data_cl:2;
3410aeed3e9SJustin Hibbits volatile uint8_t context_cl:2;
3420aeed3e9SJustin Hibbits } _PackedType;
3430aeed3e9SJustin Hibbits
3440aeed3e9SJustin Hibbits typedef _Packed union {
3450aeed3e9SJustin Hibbits /* Treat it as 64-bit opaque */
3460aeed3e9SJustin Hibbits _Packed struct {
3470aeed3e9SJustin Hibbits volatile uint32_t hi;
3480aeed3e9SJustin Hibbits volatile uint32_t lo;
3490aeed3e9SJustin Hibbits } _PackedType;
3500aeed3e9SJustin Hibbits /* Treat it as s/w portal stashing config */
3510aeed3e9SJustin Hibbits /* See 1.5.6.7.1: "FQD Context_A field used for [...] */
3520aeed3e9SJustin Hibbits _Packed struct {
3530aeed3e9SJustin Hibbits struct qm_fqd_stashing stashing;
3540aeed3e9SJustin Hibbits volatile uint8_t reserved1;
3550aeed3e9SJustin Hibbits /* 40-bit address of FQ context to
3560aeed3e9SJustin Hibbits * stash, must be cacheline-aligned */
3570aeed3e9SJustin Hibbits volatile uint8_t context_hi;
3580aeed3e9SJustin Hibbits volatile uint32_t context_lo;
3590aeed3e9SJustin Hibbits } _PackedType;
3600aeed3e9SJustin Hibbits } _PackedType u_QmFqdContextA;
3610aeed3e9SJustin Hibbits
3620aeed3e9SJustin Hibbits /* See 1.5.1.1: "Frame Descriptor (FD)" */
3630aeed3e9SJustin Hibbits _Packed struct qm_fd {
3640aeed3e9SJustin Hibbits volatile uint8_t dd:2; /* dynamic debug */
3650aeed3e9SJustin Hibbits volatile uint8_t liodn_offset:6; /* aka. "Partition ID" in rev1.0 */
3660aeed3e9SJustin Hibbits volatile uint8_t bpid; /* Buffer Pool ID */
3670aeed3e9SJustin Hibbits volatile uint8_t eliodn_offset:4;
3680aeed3e9SJustin Hibbits volatile uint8_t reserved:4;
3690aeed3e9SJustin Hibbits volatile uint8_t addr_hi; /* high 8-bits of 40-bit address */
3700aeed3e9SJustin Hibbits volatile uint32_t addr_lo; /* low 32-bits of 40-bit address */
3710aeed3e9SJustin Hibbits /* The 'format' field indicates the interpretation of the remaining 29
3720aeed3e9SJustin Hibbits * bits of the 32-bit word. For packing reasons, it is duplicated in the
3730aeed3e9SJustin Hibbits * other union elements. */
3740aeed3e9SJustin Hibbits _Packed union {
3750aeed3e9SJustin Hibbits /* If 'format' is _contig or _sg, 20b length and 9b offset */
3760aeed3e9SJustin Hibbits _Packed struct {
3770aeed3e9SJustin Hibbits volatile enum qm_fd_format format:3;
3780aeed3e9SJustin Hibbits volatile uint16_t offset:9;
3790aeed3e9SJustin Hibbits volatile uint32_t length20:20;
3800aeed3e9SJustin Hibbits } _PackedType;
3810aeed3e9SJustin Hibbits /* If 'format' is _contig_big or _sg_big, 29b length */
3820aeed3e9SJustin Hibbits _Packed struct {
3830aeed3e9SJustin Hibbits volatile enum qm_fd_format _format1:3;
3840aeed3e9SJustin Hibbits volatile uint32_t length29:29;
3850aeed3e9SJustin Hibbits } _PackedType;
3860aeed3e9SJustin Hibbits /* If 'format' is _compound, 29b "congestion weight" */
3870aeed3e9SJustin Hibbits _Packed struct {
3880aeed3e9SJustin Hibbits volatile enum qm_fd_format _format2:3;
3890aeed3e9SJustin Hibbits volatile uint32_t cong_weight:29;
3900aeed3e9SJustin Hibbits } _PackedType;
3910aeed3e9SJustin Hibbits /* For easier/faster copying of this part of the fd (eg. from a
3920aeed3e9SJustin Hibbits * DQRR entry to an EQCR entry) copy 'opaque' */
3930aeed3e9SJustin Hibbits volatile uint32_t opaque;
3940aeed3e9SJustin Hibbits } _PackedType;
3950aeed3e9SJustin Hibbits _Packed union {
3960aeed3e9SJustin Hibbits volatile uint32_t cmd;
3970aeed3e9SJustin Hibbits volatile uint32_t status;
3980aeed3e9SJustin Hibbits }_PackedType;
3990aeed3e9SJustin Hibbits } _PackedType;
4000aeed3e9SJustin Hibbits
4010aeed3e9SJustin Hibbits #define QM_FD_DD_NULL 0x00
4020aeed3e9SJustin Hibbits #define QM_FD_PID_MASK 0x3f
4030aeed3e9SJustin Hibbits
4040aeed3e9SJustin Hibbits /* See 1.5.8.1: "Enqueue Command" */
4050aeed3e9SJustin Hibbits _Packed struct qm_eqcr_entry {
4060aeed3e9SJustin Hibbits volatile uint8_t __dont_write_directly__verb;
4070aeed3e9SJustin Hibbits volatile uint8_t dca;
4080aeed3e9SJustin Hibbits volatile uint16_t seqnum;
4090aeed3e9SJustin Hibbits volatile uint32_t orp; /* 24-bit */
4100aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
4110aeed3e9SJustin Hibbits volatile uint32_t tag;
4120aeed3e9SJustin Hibbits volatile struct qm_fd fd;
4130aeed3e9SJustin Hibbits volatile uint8_t reserved3[32];
4140aeed3e9SJustin Hibbits } _PackedType;
4150aeed3e9SJustin Hibbits
4160aeed3e9SJustin Hibbits #define QM_EQCR_VERB_VBIT 0x80
4170aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_MASK 0x61 /* but only one value; */
4180aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_ENQUEUE 0x01
4190aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_MASK 0x18 /* 4 possible values; */
4200aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_GREEN 0x00
4210aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_YELLOW 0x08
4220aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_RED 0x10
4230aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_OVERRIDE 0x18
4240aeed3e9SJustin Hibbits #define QM_EQCR_VERB_INTERRUPT 0x04 /* on command consumption */
4250aeed3e9SJustin Hibbits #define QM_EQCR_VERB_ORP 0x02 /* enable order restoration */
4260aeed3e9SJustin Hibbits #define QM_EQCR_DCA_ENABLE 0x80
4270aeed3e9SJustin Hibbits #define QM_EQCR_DCA_PARK 0x40
4280aeed3e9SJustin Hibbits #define QM_EQCR_DCA_IDXMASK 0x0f /* "DQRR::idx" goes here */
4290aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NESN 0x8000 /* Advance NESN */
4300aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NLIS 0x4000 /* More fragments to come */
4310aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_SEQMASK 0x3fff /* sequence number goes here */
4320aeed3e9SJustin Hibbits #define QM_EQCR_FQID_NULL 0 /* eg. for an ORP seqnum hole */
4330aeed3e9SJustin Hibbits
4340aeed3e9SJustin Hibbits /* See 1.5.8.2: "Frame Dequeue Response" */
4350aeed3e9SJustin Hibbits _Packed struct qm_dqrr_entry {
4360aeed3e9SJustin Hibbits volatile uint8_t verb;
4370aeed3e9SJustin Hibbits volatile uint8_t stat;
4380aeed3e9SJustin Hibbits volatile uint16_t seqnum; /* 15-bit */
4390aeed3e9SJustin Hibbits volatile uint8_t tok;
4400aeed3e9SJustin Hibbits volatile uint8_t reserved2[3];
4410aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
4420aeed3e9SJustin Hibbits volatile uint32_t contextB;
4430aeed3e9SJustin Hibbits volatile struct qm_fd fd;
4440aeed3e9SJustin Hibbits volatile uint8_t reserved4[32];
4450aeed3e9SJustin Hibbits } _PackedType;
4460aeed3e9SJustin Hibbits
4470aeed3e9SJustin Hibbits #define QM_DQRR_VERB_VBIT 0x80
4480aeed3e9SJustin Hibbits #define QM_DQRR_VERB_MASK 0x7f /* where the verb contains; */
4490aeed3e9SJustin Hibbits #define QM_DQRR_VERB_FRAME_DEQUEUE 0x60 /* "this format" */
4500aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_EMPTY 0x80 /* FQ empty */
4510aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_HELDACTIVE 0x40 /* FQ held active */
4520aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_FORCEELIGIBLE 0x20 /* FQ was force-eligible'd */
4530aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FD_VALID 0x10 /* has a non-NULL FD */
4540aeed3e9SJustin Hibbits #define QM_DQRR_STAT_UNSCHEDULED 0x02 /* Unscheduled dequeue */
4550aeed3e9SJustin Hibbits #define QM_DQRR_STAT_DQCR_EXPIRED 0x01 /* VDQCR or PDQCR expired*/
4560aeed3e9SJustin Hibbits
4570aeed3e9SJustin Hibbits #define VDQCR_DONE (QM_DQRR_STAT_UNSCHEDULED | QM_DQRR_STAT_DQCR_EXPIRED)
4580aeed3e9SJustin Hibbits
4590aeed3e9SJustin Hibbits
4600aeed3e9SJustin Hibbits /* See 1.5.8.3: "ERN Message Response" */
4610aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */
4620aeed3e9SJustin Hibbits _Packed struct qm_mr_entry {
4630aeed3e9SJustin Hibbits volatile uint8_t verb;
4640aeed3e9SJustin Hibbits _Packed union {
4650aeed3e9SJustin Hibbits _Packed struct {
4660aeed3e9SJustin Hibbits volatile uint8_t dca;
4670aeed3e9SJustin Hibbits volatile uint16_t seqnum;
4680aeed3e9SJustin Hibbits volatile uint8_t rc; /* Rejection Code */
4690aeed3e9SJustin Hibbits volatile uint32_t orp:24;
4700aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
4710aeed3e9SJustin Hibbits volatile uint32_t tag;
4720aeed3e9SJustin Hibbits volatile struct qm_fd fd;
4730aeed3e9SJustin Hibbits } _PackedType ern;
4740aeed3e9SJustin Hibbits _Packed struct {
4750aeed3e9SJustin Hibbits volatile uint8_t colour:2; /* See QM_MR_DCERN_COLOUR_* */
4760aeed3e9SJustin Hibbits volatile uint8_t reserved1:3;
4770aeed3e9SJustin Hibbits volatile enum qm_dc_portal portal:3;
4780aeed3e9SJustin Hibbits volatile uint16_t reserved2;
4790aeed3e9SJustin Hibbits volatile uint8_t rc; /* Rejection Code */
4800aeed3e9SJustin Hibbits volatile uint32_t reserved3:24;
4810aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
4820aeed3e9SJustin Hibbits volatile uint32_t tag;
4830aeed3e9SJustin Hibbits volatile struct qm_fd fd;
4840aeed3e9SJustin Hibbits } _PackedType dcern;
4850aeed3e9SJustin Hibbits _Packed struct {
4860aeed3e9SJustin Hibbits volatile uint8_t fqs; /* Frame Queue Status */
4870aeed3e9SJustin Hibbits volatile uint8_t reserved1[6];
4880aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
4890aeed3e9SJustin Hibbits volatile uint32_t contextB;
4900aeed3e9SJustin Hibbits volatile uint8_t reserved2[16];
4910aeed3e9SJustin Hibbits } _PackedType fq; /* FQRN/FQRNI/FQRL/FQPN */
4920aeed3e9SJustin Hibbits } _PackedType;
4930aeed3e9SJustin Hibbits volatile uint8_t reserved2[32];
4940aeed3e9SJustin Hibbits } _PackedType;
4950aeed3e9SJustin Hibbits
4960aeed3e9SJustin Hibbits #define QM_MR_VERB_VBIT 0x80
4970aeed3e9SJustin Hibbits /* The "ern" VERB bits match QM_EQCR_VERB_*** so aren't reproduced here. ERNs
4980aeed3e9SJustin Hibbits * originating from direct-connect portals ("dcern") use 0x20 as a verb which
4990aeed3e9SJustin Hibbits * would be invalid as a s/w enqueue verb. A s/w ERN can be distinguished from
5000aeed3e9SJustin Hibbits * the other MR types by noting if the 0x20 bit is unset. */
5010aeed3e9SJustin Hibbits #define QM_MR_VERB_TYPE_MASK 0x23
5020aeed3e9SJustin Hibbits #define QM_MR_VERB_DC_ERN 0x20
5030aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRN 0x21
5040aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRNI 0x22
5050aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRL 0x23
5060aeed3e9SJustin Hibbits #define QM_MR_VERB_FQPN 0x24
5070aeed3e9SJustin Hibbits #define QM_MR_RC_MASK 0xf0 /* contains one of; */
5080aeed3e9SJustin Hibbits #define QM_MR_RC_CGR_TAILDROP 0x00
5090aeed3e9SJustin Hibbits #define QM_MR_RC_WRED 0x10
5100aeed3e9SJustin Hibbits #define QM_MR_RC_ERROR 0x20
5110aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_EARLY 0x30
5120aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_LATE 0x40
5130aeed3e9SJustin Hibbits #define QM_MR_RC_FQ_TAILDROP 0x50
5140aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_RETIRED 0x60
5150aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_DISABLE 0x70
5160aeed3e9SJustin Hibbits #define QM_MR_FQS_ORLPRESENT 0x02 /* ORL fragments to come */
5170aeed3e9SJustin Hibbits #define QM_MR_FQS_NOTEMPTY 0x01 /* FQ has enqueued frames */
5180aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_GREEN 0x00
5190aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_YELLOW 0x01
5200aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_RED 0x02
5210aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_OVERRIDE 0x03
5220aeed3e9SJustin Hibbits
5230aeed3e9SJustin Hibbits /* This identical structure of FQD fields is present in the "Init FQ" command
5240aeed3e9SJustin Hibbits * and the "Query FQ" result. It's suctioned out here into its own struct. It's
5250aeed3e9SJustin Hibbits * also used as the qman_query_fq() result structure in the high-level API. */
5260aeed3e9SJustin Hibbits
5270aeed3e9SJustin Hibbits /* TODO What about OAC for intra-class? */
5280aeed3e9SJustin Hibbits #define QM_FQD_TD_THRESH_OAC_EN 0x4000
5290aeed3e9SJustin Hibbits
5300aeed3e9SJustin Hibbits _Packed struct qm_fqd {
5310aeed3e9SJustin Hibbits _Packed union {
5320aeed3e9SJustin Hibbits volatile uint8_t orpc;
5330aeed3e9SJustin Hibbits _Packed struct {
5340aeed3e9SJustin Hibbits volatile uint8_t reserved1:2;
5350aeed3e9SJustin Hibbits volatile uint8_t orprws:3;
5360aeed3e9SJustin Hibbits volatile uint8_t oa:1;
5370aeed3e9SJustin Hibbits volatile uint8_t olws:2;
5380aeed3e9SJustin Hibbits } _PackedType;
5390aeed3e9SJustin Hibbits } _PackedType;
5400aeed3e9SJustin Hibbits volatile uint8_t cgid;
5410aeed3e9SJustin Hibbits volatile uint16_t fq_ctrl; /* See QM_FQCTRL_<...> */
5420aeed3e9SJustin Hibbits _Packed union {
5430aeed3e9SJustin Hibbits volatile uint16_t dest_wq;
5440aeed3e9SJustin Hibbits _Packed struct {
5450aeed3e9SJustin Hibbits volatile uint16_t channel:13; /* enum qm_channel */
5460aeed3e9SJustin Hibbits volatile uint16_t wq:3;
5470aeed3e9SJustin Hibbits } _PackedType dest;
5480aeed3e9SJustin Hibbits } _PackedType;
5490aeed3e9SJustin Hibbits volatile uint16_t reserved2:1;
5500aeed3e9SJustin Hibbits volatile uint16_t ics_cred:15;
5510aeed3e9SJustin Hibbits _Packed union {
5520aeed3e9SJustin Hibbits volatile uint16_t td_thresh;
5530aeed3e9SJustin Hibbits _Packed struct {
5540aeed3e9SJustin Hibbits volatile uint16_t reserved1:3;
5550aeed3e9SJustin Hibbits volatile uint16_t mant:8;
5560aeed3e9SJustin Hibbits volatile uint16_t exp:5;
5570aeed3e9SJustin Hibbits } _PackedType td;
5580aeed3e9SJustin Hibbits } _PackedType;
5590aeed3e9SJustin Hibbits volatile uint32_t context_b;
5600aeed3e9SJustin Hibbits volatile u_QmFqdContextA context_a;
5610aeed3e9SJustin Hibbits } _PackedType;
5620aeed3e9SJustin Hibbits
5630aeed3e9SJustin Hibbits /* See 1.5.2.2: "Frame Queue Descriptor (FQD)" */
5640aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'fq_ctrl' uses these constants */
5650aeed3e9SJustin Hibbits #define QM_FQCTRL_MASK 0x07ff /* 'fq_ctrl' flags; */
5660aeed3e9SJustin Hibbits #define QM_FQCTRL_CGE 0x0400 /* Congestion Group Enable */
5670aeed3e9SJustin Hibbits #define QM_FQCTRL_TDE 0x0200 /* Tail-Drop Enable */
5680aeed3e9SJustin Hibbits #define QM_FQCTRL_ORP 0x0100 /* ORP Enable */
5690aeed3e9SJustin Hibbits #define QM_FQCTRL_CTXASTASHING 0x0080 /* Context-A stashing */
5700aeed3e9SJustin Hibbits #define QM_FQCTRL_CPCSTASH 0x0040 /* CPC Stash Enable */
5710aeed3e9SJustin Hibbits #define QM_FQCTRL_FORCESFDR 0x0008 /* High-priority SFDRs */
5720aeed3e9SJustin Hibbits #define QM_FQCTRL_AVOIDBLOCK 0x0004 /* Don't block active */
5730aeed3e9SJustin Hibbits #define QM_FQCTRL_HOLDACTIVE 0x0002 /* Hold active in portal */
5740aeed3e9SJustin Hibbits #define QM_FQCTRL_LOCKINCACHE 0x0001 /* Aggressively cache FQD */
5750aeed3e9SJustin Hibbits
5760aeed3e9SJustin Hibbits /* See 1.5.6.7.1: "FQD Context_A field used for [...] */
5770aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'CONTEXT_A' uses these constants */
5780aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_ANNOTATION 0x04
5790aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_DATA 0x02
5800aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_CONTEXT 0x01
5810aeed3e9SJustin Hibbits
5820aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */
5830aeed3e9SJustin Hibbits /* This struct represents the 32-bit "WR_PARM_[GYR]" parameters in CGR fields
5840aeed3e9SJustin Hibbits * and associated commands/responses. The WRED parameters are calculated from
5850aeed3e9SJustin Hibbits * these fields as follows;
5860aeed3e9SJustin Hibbits * MaxTH = MA * (2 ^ Mn)
5870aeed3e9SJustin Hibbits * Slope = SA / (2 ^ Sn)
5880aeed3e9SJustin Hibbits * MaxP = 4 * (Pn + 1)
5890aeed3e9SJustin Hibbits */
5900aeed3e9SJustin Hibbits _Packed struct qm_cgr_wr_parm {
5910aeed3e9SJustin Hibbits _Packed union {
5920aeed3e9SJustin Hibbits volatile uint32_t word;
5930aeed3e9SJustin Hibbits _Packed struct {
5940aeed3e9SJustin Hibbits volatile uint32_t MA:8;
5950aeed3e9SJustin Hibbits volatile uint32_t Mn:5;
5960aeed3e9SJustin Hibbits volatile uint32_t SA:7; /* must be between 64-127 */
5970aeed3e9SJustin Hibbits volatile uint32_t Sn:6;
5980aeed3e9SJustin Hibbits volatile uint32_t Pn:6;
5990aeed3e9SJustin Hibbits } _PackedType;
6000aeed3e9SJustin Hibbits } _PackedType;
6010aeed3e9SJustin Hibbits } _PackedType;
6020aeed3e9SJustin Hibbits
6030aeed3e9SJustin Hibbits /* This struct represents the 13-bit "CS_THRES" CGR field. In the corresponding
6040aeed3e9SJustin Hibbits * management commands, this is padded to a 16-bit structure field, so that's
6050aeed3e9SJustin Hibbits * how we represent it here. The congestion state threshold is calculated from
6060aeed3e9SJustin Hibbits * these fields as follows;
6070aeed3e9SJustin Hibbits * CS threshold = TA * (2 ^ Tn)
6080aeed3e9SJustin Hibbits */
6090aeed3e9SJustin Hibbits _Packed struct qm_cgr_cs_thres {
6100aeed3e9SJustin Hibbits volatile uint16_t reserved:3;
6110aeed3e9SJustin Hibbits volatile uint16_t TA:8;
6120aeed3e9SJustin Hibbits volatile uint16_t Tn:5;
6130aeed3e9SJustin Hibbits } _PackedType;
6140aeed3e9SJustin Hibbits
6150aeed3e9SJustin Hibbits /* This identical structure of CGR fields is present in the "Init/Modify CGR"
6160aeed3e9SJustin Hibbits * commands and the "Query CGR" result. It's suctioned out here into its own
6170aeed3e9SJustin Hibbits * struct. */
6180aeed3e9SJustin Hibbits _Packed struct __qm_mc_cgr {
6190aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_g;
6200aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_y;
6210aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_r;
6220aeed3e9SJustin Hibbits volatile uint8_t wr_en_g; /* boolean, use QM_CGR_EN */
6230aeed3e9SJustin Hibbits volatile uint8_t wr_en_y; /* boolean, use QM_CGR_EN */
6240aeed3e9SJustin Hibbits volatile uint8_t wr_en_r; /* boolean, use QM_CGR_EN */
6250aeed3e9SJustin Hibbits volatile uint8_t cscn_en; /* boolean, use QM_CGR_EN */
6260aeed3e9SJustin Hibbits volatile uint32_t cscn_targ; /* use QM_CGR_TARG_* */
6270aeed3e9SJustin Hibbits volatile uint8_t cstd_en; /* boolean, use QM_CGR_EN */
6280aeed3e9SJustin Hibbits volatile uint8_t cs; /* boolean, only used in query response */
6290aeed3e9SJustin Hibbits volatile struct qm_cgr_cs_thres cs_thres;
6300aeed3e9SJustin Hibbits volatile uint8_t frame_mode; /* boolean, use QM_CGR_EN */
6310aeed3e9SJustin Hibbits } _PackedType;
6320aeed3e9SJustin Hibbits
6330aeed3e9SJustin Hibbits #define QM_CGR_EN 0x01 /* For wr_en_*, cscn_en, cstd_en, frame_mode */
6340aeed3e9SJustin Hibbits
6350aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */
6360aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */
6370aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */
6380aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */
6390aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */
6400aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */
6410aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */
6420aeed3e9SJustin Hibbits _Packed struct qm_mc_command {
6430aeed3e9SJustin Hibbits volatile uint8_t __dont_write_directly__verb;
6440aeed3e9SJustin Hibbits _Packed union {
6450aeed3e9SJustin Hibbits _Packed struct qm_mcc_initfq {
6460aeed3e9SJustin Hibbits volatile uint8_t reserved1;
6470aeed3e9SJustin Hibbits volatile uint16_t we_mask; /* Write Enable Mask */
6480aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
6490aeed3e9SJustin Hibbits volatile uint16_t count; /* Initialises 'count+1' FQDs */
6500aeed3e9SJustin Hibbits volatile struct qm_fqd fqd; /* the FQD fields go here */
6510aeed3e9SJustin Hibbits volatile uint8_t reserved3[32];
6520aeed3e9SJustin Hibbits } _PackedType initfq;
6530aeed3e9SJustin Hibbits _Packed struct qm_mcc_queryfq {
6540aeed3e9SJustin Hibbits volatile uint8_t reserved1[3];
6550aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
6560aeed3e9SJustin Hibbits volatile uint8_t reserved2[56];
6570aeed3e9SJustin Hibbits } _PackedType queryfq;
6580aeed3e9SJustin Hibbits _Packed struct qm_mcc_queryfq_np {
6590aeed3e9SJustin Hibbits volatile uint8_t reserved1[3];
6600aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
6610aeed3e9SJustin Hibbits volatile uint8_t reserved2[56];
6620aeed3e9SJustin Hibbits } _PackedType queryfq_np;
6630aeed3e9SJustin Hibbits _Packed struct qm_mcc_alterfq {
6640aeed3e9SJustin Hibbits volatile uint8_t reserved1[3];
6650aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */
6660aeed3e9SJustin Hibbits volatile uint8_t reserved2[12];
6670aeed3e9SJustin Hibbits volatile uint32_t context_b;
6680aeed3e9SJustin Hibbits volatile uint8_t reserved3[40];
6690aeed3e9SJustin Hibbits } _PackedType alterfq;
6700aeed3e9SJustin Hibbits _Packed struct qm_mcc_initcgr {
6710aeed3e9SJustin Hibbits volatile uint8_t reserved1;
6720aeed3e9SJustin Hibbits volatile uint16_t we_mask; /* Write Enable Mask */
6730aeed3e9SJustin Hibbits volatile struct __qm_mc_cgr cgr; /* CGR fields */
6740aeed3e9SJustin Hibbits volatile uint8_t reserved2[2];
6750aeed3e9SJustin Hibbits volatile uint8_t cgid;
6760aeed3e9SJustin Hibbits volatile uint8_t reserved4[32];
6770aeed3e9SJustin Hibbits } _PackedType initcgr;
6780aeed3e9SJustin Hibbits _Packed struct qm_mcc_querycgr {
6790aeed3e9SJustin Hibbits volatile uint8_t reserved1[30];
6800aeed3e9SJustin Hibbits volatile uint8_t cgid;
6810aeed3e9SJustin Hibbits volatile uint8_t reserved2[32];
6820aeed3e9SJustin Hibbits } _PackedType querycgr;
6830aeed3e9SJustin Hibbits _Packed struct qm_mcc_querycongestion {
6840aeed3e9SJustin Hibbits volatile uint8_t reserved[63];
6850aeed3e9SJustin Hibbits } _PackedType querycongestion;
6860aeed3e9SJustin Hibbits _Packed struct qm_mcc_querywq {
6870aeed3e9SJustin Hibbits volatile uint8_t reserved;
6880aeed3e9SJustin Hibbits /* select channel if verb != QUERYWQ_DEDICATED */
6890aeed3e9SJustin Hibbits _Packed union {
6900aeed3e9SJustin Hibbits volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */
6910aeed3e9SJustin Hibbits _Packed struct {
6920aeed3e9SJustin Hibbits volatile uint16_t id:13; /* enum qm_channel */
6930aeed3e9SJustin Hibbits volatile uint16_t reserved1:3;
6940aeed3e9SJustin Hibbits } _PackedType channel;
6950aeed3e9SJustin Hibbits } _PackedType;
6960aeed3e9SJustin Hibbits volatile uint8_t reserved2[60];
6970aeed3e9SJustin Hibbits } _PackedType querywq;
6980aeed3e9SJustin Hibbits } _PackedType;
6990aeed3e9SJustin Hibbits } _PackedType;
7000aeed3e9SJustin Hibbits
7010aeed3e9SJustin Hibbits #define QM_MCC_VERB_VBIT 0x80
7020aeed3e9SJustin Hibbits #define QM_MCC_VERB_MASK 0x7f /* where the verb contains; */
7030aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_PARKED 0x40
7040aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_SCHED 0x41
7050aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ 0x44
7060aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ_NP 0x45 /* "non-programmable" fields */
7070aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ 0x46
7080aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ_DEDICATED 0x47
7090aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_SCHED 0x48 /* Schedule FQ */
7100aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_FE 0x49 /* Force Eligible FQ */
7110aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE 0x4a /* Retire FQ */
7120aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_OOS 0x4b /* Take FQ out of service */
7130aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE_CTXB 0x4c /* Retire FQ with contextB*/
7140aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITCGR 0x50
7150aeed3e9SJustin Hibbits #define QM_MCC_VERB_MODIFYCGR 0x51
7160aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCGR 0x58
7170aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCONGESTION 0x59
7180aeed3e9SJustin Hibbits /* INITFQ-specific flags */
7190aeed3e9SJustin Hibbits #define QM_INITFQ_WE_MASK 0x01ff /* 'Write Enable' flags; */
7200aeed3e9SJustin Hibbits #define QM_INITFQ_WE_OAC 0x0100
7210aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ORPC 0x0080
7220aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CGID 0x0040
7230aeed3e9SJustin Hibbits #define QM_INITFQ_WE_FQCTRL 0x0020
7240aeed3e9SJustin Hibbits #define QM_INITFQ_WE_DESTWQ 0x0010
7250aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ICSCRED 0x0008
7260aeed3e9SJustin Hibbits #define QM_INITFQ_WE_TDTHRESH 0x0004
7270aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTB 0x0002
7280aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTA 0x0001
7290aeed3e9SJustin Hibbits /* INITCGR/MODIFYCGR-specific flags */
7300aeed3e9SJustin Hibbits #define QM_CGR_WE_MASK 0x07ff /* 'Write Enable Mask'; */
7310aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_G 0x0400
7320aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_Y 0x0200
7330aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_R 0x0100
7340aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_G 0x0080
7350aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_Y 0x0040
7360aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_R 0x0020
7370aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_EN 0x0010
7380aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_TARG 0x0008
7390aeed3e9SJustin Hibbits #define QM_CGR_WE_CSTD_EN 0x0004
7400aeed3e9SJustin Hibbits #define QM_CGR_WE_CS_THRES 0x0002
7410aeed3e9SJustin Hibbits #define QM_CGR_WE_MODE 0x0001
7420aeed3e9SJustin Hibbits
7430aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */
7440aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */
7450aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */
7460aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */
7470aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */
7480aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */
7490aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */
7500aeed3e9SJustin Hibbits _Packed struct qm_mc_result {
7510aeed3e9SJustin Hibbits volatile uint8_t verb;
7520aeed3e9SJustin Hibbits volatile uint8_t result;
7530aeed3e9SJustin Hibbits _Packed union {
7540aeed3e9SJustin Hibbits _Packed struct qm_mcr_initfq {
7550aeed3e9SJustin Hibbits volatile uint8_t reserved1[62];
7560aeed3e9SJustin Hibbits } _PackedType initfq;
7570aeed3e9SJustin Hibbits _Packed struct qm_mcr_queryfq {
7580aeed3e9SJustin Hibbits volatile uint8_t reserved1[8];
7590aeed3e9SJustin Hibbits volatile struct qm_fqd fqd; /* the FQD fields are here */
7600aeed3e9SJustin Hibbits volatile uint16_t oac;
7610aeed3e9SJustin Hibbits volatile uint8_t reserved2[30];
7620aeed3e9SJustin Hibbits } _PackedType queryfq;
7630aeed3e9SJustin Hibbits _Packed struct qm_mcr_queryfq_np {
7640aeed3e9SJustin Hibbits volatile uint8_t reserved1;
7650aeed3e9SJustin Hibbits volatile uint8_t state; /* QM_MCR_NP_STATE_*** */
7660aeed3e9SJustin Hibbits volatile uint8_t reserved2;
7670aeed3e9SJustin Hibbits volatile uint32_t fqd_link:24;
7680aeed3e9SJustin Hibbits volatile uint16_t odp_seq;
7690aeed3e9SJustin Hibbits volatile uint16_t orp_nesn;
7700aeed3e9SJustin Hibbits volatile uint16_t orp_ea_hseq;
7710aeed3e9SJustin Hibbits volatile uint16_t orp_ea_tseq;
7720aeed3e9SJustin Hibbits volatile uint8_t reserved3;
7730aeed3e9SJustin Hibbits volatile uint32_t orp_ea_hptr:24;
7740aeed3e9SJustin Hibbits volatile uint8_t reserved4;
7750aeed3e9SJustin Hibbits volatile uint32_t orp_ea_tptr:24;
7760aeed3e9SJustin Hibbits volatile uint8_t reserved5;
7770aeed3e9SJustin Hibbits volatile uint32_t pfdr_hptr:24;
7780aeed3e9SJustin Hibbits volatile uint8_t reserved6;
7790aeed3e9SJustin Hibbits volatile uint32_t pfdr_tptr:24;
7800aeed3e9SJustin Hibbits volatile uint8_t reserved7[5];
7810aeed3e9SJustin Hibbits volatile uint8_t reserved8:7;
7820aeed3e9SJustin Hibbits volatile uint8_t is:1;
7830aeed3e9SJustin Hibbits volatile uint16_t ics_surp;
7840aeed3e9SJustin Hibbits volatile uint32_t byte_cnt;
7850aeed3e9SJustin Hibbits volatile uint8_t reserved9;
7860aeed3e9SJustin Hibbits volatile uint32_t frm_cnt:24;
7870aeed3e9SJustin Hibbits volatile uint32_t reserved10;
7880aeed3e9SJustin Hibbits volatile uint16_t ra1_sfdr; /* QM_MCR_NP_RA1_*** */
7890aeed3e9SJustin Hibbits volatile uint16_t ra2_sfdr; /* QM_MCR_NP_RA2_*** */
7900aeed3e9SJustin Hibbits volatile uint16_t reserved11;
7910aeed3e9SJustin Hibbits volatile uint16_t od1_sfdr; /* QM_MCR_NP_OD1_*** */
7920aeed3e9SJustin Hibbits volatile uint16_t od2_sfdr; /* QM_MCR_NP_OD2_*** */
7930aeed3e9SJustin Hibbits volatile uint16_t od3_sfdr; /* QM_MCR_NP_OD3_*** */
7940aeed3e9SJustin Hibbits } _PackedType queryfq_np;
7950aeed3e9SJustin Hibbits _Packed struct qm_mcr_alterfq {
7960aeed3e9SJustin Hibbits volatile uint8_t fqs; /* Frame Queue Status */
7970aeed3e9SJustin Hibbits volatile uint8_t reserved1[61];
7980aeed3e9SJustin Hibbits } _PackedType alterfq;
7990aeed3e9SJustin Hibbits _Packed struct qm_mcr_initcgr {
8000aeed3e9SJustin Hibbits volatile uint8_t reserved1[62];
8010aeed3e9SJustin Hibbits } _PackedType initcgr;
8020aeed3e9SJustin Hibbits _Packed struct qm_mcr_querycgr {
8030aeed3e9SJustin Hibbits volatile uint16_t reserved1;
8040aeed3e9SJustin Hibbits volatile struct __qm_mc_cgr cgr; /* CGR fields */
8050aeed3e9SJustin Hibbits volatile uint8_t reserved2[3];
8060aeed3e9SJustin Hibbits volatile uint32_t reserved3:24;
8070aeed3e9SJustin Hibbits volatile uint32_t i_bcnt_hi:8;/* high 8-bits of 40-bit "Instant" */
8080aeed3e9SJustin Hibbits volatile uint32_t i_bcnt_lo; /* low 32-bits of 40-bit */
8090aeed3e9SJustin Hibbits volatile uint32_t reserved4:24;
8100aeed3e9SJustin Hibbits volatile uint32_t a_bcnt_hi:8;/* high 8-bits of 40-bit "Average" */
8110aeed3e9SJustin Hibbits volatile uint32_t a_bcnt_lo; /* low 32-bits of 40-bit */
8120aeed3e9SJustin Hibbits volatile uint32_t lgt; /* Last Group Tick */
8130aeed3e9SJustin Hibbits volatile uint8_t reserved5[12];
8140aeed3e9SJustin Hibbits } _PackedType querycgr;
8150aeed3e9SJustin Hibbits _Packed struct qm_mcr_querycongestion {
8160aeed3e9SJustin Hibbits volatile uint8_t reserved[30];
8170aeed3e9SJustin Hibbits /* Access this struct using QM_MCR_QUERYCONGESTION() */
8180aeed3e9SJustin Hibbits _Packed struct __qm_mcr_querycongestion {
8190aeed3e9SJustin Hibbits volatile uint32_t __state[8];
8200aeed3e9SJustin Hibbits } _PackedType state;
8210aeed3e9SJustin Hibbits } _PackedType querycongestion;
8220aeed3e9SJustin Hibbits _Packed struct qm_mcr_querywq {
8230aeed3e9SJustin Hibbits _Packed union {
8240aeed3e9SJustin Hibbits volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */
8250aeed3e9SJustin Hibbits _Packed struct {
8260aeed3e9SJustin Hibbits volatile uint16_t id:13; /* enum qm_channel */
8270aeed3e9SJustin Hibbits volatile uint16_t reserved:3;
8280aeed3e9SJustin Hibbits } _PackedType channel;
8290aeed3e9SJustin Hibbits } _PackedType;
8300aeed3e9SJustin Hibbits volatile uint8_t reserved[28];
8310aeed3e9SJustin Hibbits volatile uint32_t wq_len[8];
8320aeed3e9SJustin Hibbits } _PackedType querywq;
8330aeed3e9SJustin Hibbits } _PackedType;
8340aeed3e9SJustin Hibbits } _PackedType;
8350aeed3e9SJustin Hibbits
8360aeed3e9SJustin Hibbits #define QM_MCR_VERB_RRID 0x80
8370aeed3e9SJustin Hibbits #define QM_MCR_VERB_MASK QM_MCC_VERB_MASK
8380aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_PARKED QM_MCC_VERB_INITFQ_PARKED
8390aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_SCHED QM_MCC_VERB_INITFQ_SCHED
8400aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ QM_MCC_VERB_QUERYFQ
8410aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ_NP QM_MCC_VERB_QUERYFQ_NP
8420aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ QM_MCC_VERB_QUERYWQ
8430aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ_DEDICATED QM_MCC_VERB_QUERYWQ_DEDICATED
8440aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_SCHED QM_MCC_VERB_ALTER_SCHED
8450aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_FE QM_MCC_VERB_ALTER_FE
8460aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE QM_MCC_VERB_ALTER_RETIRE
8470aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE_CTXB QM_MCC_VERB_ALTER_RETIRE_CTXB
8480aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_OOS QM_MCC_VERB_ALTER_OOS
8490aeed3e9SJustin Hibbits #define QM_MCR_RESULT_NULL 0x00
8500aeed3e9SJustin Hibbits #define QM_MCR_RESULT_OK 0xf0
8510aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQID 0xf1
8520aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQSTATE 0xf2
8530aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_NOTEMPTY 0xf3 /* OOS fails if FQ is !empty */
8540aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCHANNEL 0xf4
8550aeed3e9SJustin Hibbits #define QM_MCR_RESULT_PENDING 0xf8
8560aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCOMMAND 0xff
8570aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_FE 0x10
8580aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_R 0x08
8590aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_MASK 0x07 /* Reads FQD::STATE; */
8600aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_OOS 0x00
8610aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_RETIRED 0x01
8620aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TEN_SCHED 0x02
8630aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TRU_SCHED 0x03
8640aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_PARKED 0x04
8650aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_ACTIVE 0x05
8660aeed3e9SJustin Hibbits #define QM_MCR_NP_PTR_MASK 0x07ff /* for RA[12] & OD[123] */
8670aeed3e9SJustin Hibbits #define QM_MCR_NP_RA1_NRA(v) (((v) >> 14) & 0x3) /* FQD::NRA */
8680aeed3e9SJustin Hibbits #define QM_MCR_NP_RA2_IT(v) (((v) >> 14) & 0x1) /* FQD::IT */
8690aeed3e9SJustin Hibbits #define QM_MCR_NP_OD1_NOD(v) (((v) >> 14) & 0x3) /* FQD::NOD */
8700aeed3e9SJustin Hibbits #define QM_MCR_NP_OD3_NPC(v) (((v) >> 14) & 0x3) /* FQD::NPC */
8710aeed3e9SJustin Hibbits #define QM_MCR_FQS_ORLPRESENT 0x02 /* ORL fragments to come */
8720aeed3e9SJustin Hibbits #define QM_MCR_FQS_NOTEMPTY 0x01 /* FQ has enqueued frames */
8730aeed3e9SJustin Hibbits
8740aeed3e9SJustin Hibbits #define MEM_MAP_END
8750aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
8760aeed3e9SJustin Hibbits #pragma pack(pop)
8770aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
8780aeed3e9SJustin Hibbits
8790aeed3e9SJustin Hibbits
8800aeed3e9SJustin Hibbits /* This extracts the state for congestion group 'n' from a query response.
8810aeed3e9SJustin Hibbits * Eg.
8820aeed3e9SJustin Hibbits * uint8_t cgr = [...];
8830aeed3e9SJustin Hibbits * struct qm_mc_result *res = [...];
8840aeed3e9SJustin Hibbits * printf("congestion group %d congestion state: %d\n", cgr,
8850aeed3e9SJustin Hibbits * QM_MCR_QUERYCONGESTION(&res->querycongestion.state, cgr));
8860aeed3e9SJustin Hibbits */
8870aeed3e9SJustin Hibbits #define __CGR_WORD(num) (num >> 5)
8880aeed3e9SJustin Hibbits #define __CGR_SHIFT(num) (num & 0x1f)
QM_MCR_QUERYCONGESTION(struct __qm_mcr_querycongestion * p,uint8_t cgr)8890aeed3e9SJustin Hibbits static __inline__ int QM_MCR_QUERYCONGESTION(struct __qm_mcr_querycongestion *p,
8900aeed3e9SJustin Hibbits uint8_t cgr)
8910aeed3e9SJustin Hibbits {
8920aeed3e9SJustin Hibbits return (int)(p->__state[__CGR_WORD(cgr)] & (0x80000000 >> __CGR_SHIFT(cgr)));
8930aeed3e9SJustin Hibbits }
8940aeed3e9SJustin Hibbits
8950aeed3e9SJustin Hibbits
8960aeed3e9SJustin Hibbits /*********************/
8970aeed3e9SJustin Hibbits /* Utility interface */
8980aeed3e9SJustin Hibbits /*********************/
8990aeed3e9SJustin Hibbits
9000aeed3e9SJustin Hibbits /* Represents an allocator over a range of FQIDs. NB, accesses are not locked,
9010aeed3e9SJustin Hibbits * spinlock them yourself if needed. */
9020aeed3e9SJustin Hibbits struct qman_fqid_pool;
9030aeed3e9SJustin Hibbits
9040aeed3e9SJustin Hibbits /* Create/destroy a FQID pool, num must be a multiple of 32. NB, _destroy()
9050aeed3e9SJustin Hibbits * always succeeds, but returns non-zero if there were "leaked" FQID
9060aeed3e9SJustin Hibbits * allocations. */
9070aeed3e9SJustin Hibbits struct qman_fqid_pool *qman_fqid_pool_create(uint32_t fqid_start, uint32_t num);
9080aeed3e9SJustin Hibbits int qman_fqid_pool_destroy(struct qman_fqid_pool *pool);
9090aeed3e9SJustin Hibbits /* Alloc/free a FQID from the range. _alloc() returns zero for success. */
9100aeed3e9SJustin Hibbits int qman_fqid_pool_alloc(struct qman_fqid_pool *pool, uint32_t *fqid);
9110aeed3e9SJustin Hibbits void qman_fqid_pool_free(struct qman_fqid_pool *pool, uint32_t fqid);
9120aeed3e9SJustin Hibbits uint32_t qman_fqid_pool_used(struct qman_fqid_pool *pool);
9130aeed3e9SJustin Hibbits
9140aeed3e9SJustin Hibbits /*******************************************************************/
9150aeed3e9SJustin Hibbits /* Managed (aka "shared" or "mux/demux") portal, high-level i/face */
9160aeed3e9SJustin Hibbits /*******************************************************************/
9170aeed3e9SJustin Hibbits
9180aeed3e9SJustin Hibbits /* Congestion Groups */
9190aeed3e9SJustin Hibbits /* ----------------- */
9200aeed3e9SJustin Hibbits /* This wrapper represents a bit-array for the state of the 256 Qman congestion
9210aeed3e9SJustin Hibbits * groups. Is also used as a *mask* for congestion groups, eg. so we ignore
9220aeed3e9SJustin Hibbits * those that don't concern us. We harness the structure and accessor details
9230aeed3e9SJustin Hibbits * already used in the management command to query congestion groups. */
9240aeed3e9SJustin Hibbits struct qman_cgrs {
9250aeed3e9SJustin Hibbits struct __qm_mcr_querycongestion q;
9260aeed3e9SJustin Hibbits };
QMAN_CGRS_INIT(struct qman_cgrs * c)9270aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_INIT(struct qman_cgrs *c)
9280aeed3e9SJustin Hibbits {
9290aeed3e9SJustin Hibbits memset(c, 0, sizeof(*c));
9300aeed3e9SJustin Hibbits }
QMAN_CGRS_GET(struct qman_cgrs * c,int num)9310aeed3e9SJustin Hibbits static __inline__ int QMAN_CGRS_GET(struct qman_cgrs *c, int num)
9320aeed3e9SJustin Hibbits {
9330aeed3e9SJustin Hibbits return QM_MCR_QUERYCONGESTION(&c->q, (uint8_t)num);
9340aeed3e9SJustin Hibbits }
QMAN_CGRS_SET(struct qman_cgrs * c,int num)9350aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_SET(struct qman_cgrs *c, int num)
9360aeed3e9SJustin Hibbits {
9370aeed3e9SJustin Hibbits c->q.__state[__CGR_WORD(num)] |= (0x80000000 >> __CGR_SHIFT(num));
9380aeed3e9SJustin Hibbits }
QMAN_CGRS_UNSET(struct qman_cgrs * c,int num)9390aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_UNSET(struct qman_cgrs *c, int num)
9400aeed3e9SJustin Hibbits {
9410aeed3e9SJustin Hibbits c->q.__state[__CGR_WORD(num)] &= ~(0x80000000 >> __CGR_SHIFT(num));
9420aeed3e9SJustin Hibbits }
9430aeed3e9SJustin Hibbits
9440aeed3e9SJustin Hibbits /* Portal and Frame Queues */
9450aeed3e9SJustin Hibbits /* ----------------------- */
9460aeed3e9SJustin Hibbits
9470aeed3e9SJustin Hibbits /* This object type represents Qman frame queue descriptors (FQD), and is
9480aeed3e9SJustin Hibbits * stored within a cacheline passed to qman_new_fq(). */
9490aeed3e9SJustin Hibbits struct qman_fq;
9500aeed3e9SJustin Hibbits
9510aeed3e9SJustin Hibbits /* This enum, and the callback type that returns it, are used when handling
9520aeed3e9SJustin Hibbits * dequeued frames via DQRR. Note that for "null" callbacks registered with the
9530aeed3e9SJustin Hibbits * portal object (for handling dequeues that do not demux because contextB is
9540aeed3e9SJustin Hibbits * NULL), the return value *MUST* be qman_cb_dqrr_consume. */
9550aeed3e9SJustin Hibbits enum qman_cb_dqrr_result {
9560aeed3e9SJustin Hibbits /* DQRR entry can be consumed */
9570aeed3e9SJustin Hibbits qman_cb_dqrr_consume,
9580aeed3e9SJustin Hibbits /* DQRR entry cannot be consumed now, pause until next poll request */
9590aeed3e9SJustin Hibbits qman_cb_dqrr_pause,
9600aeed3e9SJustin Hibbits /* Like _consume, but requests parking - FQ must be held-active */
9610aeed3e9SJustin Hibbits qman_cb_dqrr_park,
9620aeed3e9SJustin Hibbits /* Does not consume, for DCA mode only. This allows out-of-order
9630aeed3e9SJustin Hibbits * consumes by explicit calls to qman_dca() and/or the use of implicit
9640aeed3e9SJustin Hibbits * DCA via EQCR entries. */
9650aeed3e9SJustin Hibbits qman_cb_dqrr_defer
9660aeed3e9SJustin Hibbits };
9670aeed3e9SJustin Hibbits
9680aeed3e9SJustin Hibbits /*typedef enum qman_cb_dqrr_result (*qman_cb_dqrr)(t_Handle h_Arg,
9690aeed3e9SJustin Hibbits t_Handle h_QmPortal,
9700aeed3e9SJustin Hibbits struct qman_fq *fq,
9710aeed3e9SJustin Hibbits const struct qm_dqrr_entry *dqrr);*/
9720aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_dqrr;
9730aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_fqs;
9740aeed3e9SJustin Hibbits typedef t_QmRejectedFrameCallback * qman_cb_ern;
9750aeed3e9SJustin Hibbits /* This callback type is used when handling ERNs, FQRNs and FQRLs via MR. They
9760aeed3e9SJustin Hibbits * are always consumed after the callback returns. */
9770aeed3e9SJustin Hibbits typedef void (*qman_cb_mr)(t_Handle h_Arg,
9780aeed3e9SJustin Hibbits t_Handle h_QmPortal,
9790aeed3e9SJustin Hibbits struct qman_fq *fq,
9800aeed3e9SJustin Hibbits const struct qm_mr_entry *msg);
9810aeed3e9SJustin Hibbits
9820aeed3e9SJustin Hibbits struct qman_fq_cb {
9830aeed3e9SJustin Hibbits qman_cb_dqrr dqrr; /* for dequeued frames */
9840aeed3e9SJustin Hibbits qman_cb_ern ern; /* for s/w ERNs */
9850aeed3e9SJustin Hibbits qman_cb_mr dc_ern; /* for diverted h/w ERNs */
9860aeed3e9SJustin Hibbits qman_cb_mr fqs; /* frame-queue state changes*/
9870aeed3e9SJustin Hibbits };
9880aeed3e9SJustin Hibbits
9890aeed3e9SJustin Hibbits enum qman_fq_state {
9900aeed3e9SJustin Hibbits qman_fq_state_oos,
9910aeed3e9SJustin Hibbits qman_fq_state_waiting_parked,
9920aeed3e9SJustin Hibbits qman_fq_state_parked,
9930aeed3e9SJustin Hibbits qman_fq_state_sched,
9940aeed3e9SJustin Hibbits qman_fq_state_retired
9950aeed3e9SJustin Hibbits };
9960aeed3e9SJustin Hibbits
9970aeed3e9SJustin Hibbits /* Flags to qman_create_portal() */
9980aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ 0x00000001 /* use interrupt handler */
9990aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_FAST 0x00000002 /* ... for fast-path too! */
10000aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_SLOW 0x00000003 /* ... for slow-path too! */
10010aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DCA 0x00000004 /* use DCA */
10020aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_LOCKED 0x00000008 /* multi-core locking */
10030aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_NOTAFFINE 0x00000010 /* not cpu-default portal */
10040aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RSTASH 0x00000020 /* enable DQRR entry stashing */
10050aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DSTASH 0x00000040 /* enable data stashing */
10060aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RECOVER 0x00000080 /* recovery mode */
10070aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT 0x00000100 /* for recovery; can wait */
10080aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT_INT 0x00000200 /* for wait; interruptible */
10090aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_CACHE 0x00000400 /* use cachable area for EQCR/DQRR */
10100aeed3e9SJustin Hibbits
10110aeed3e9SJustin Hibbits /* Flags to qman_create_fq() */
10120aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_ENQUEUE 0x00000001 /* can't enqueue */
10130aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_MODIFY 0x00000002 /* can only enqueue */
10140aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_TO_DCPORTAL 0x00000004 /* consumed by CAAM/PME/Fman */
10150aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_LOCKED 0x00000008 /* multi-core locking */
10160aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_RECOVER 0x00000010 /* recovery mode */
10170aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_DYNAMIC_FQID 0x00000020 /* (de)allocate fqid */
10180aeed3e9SJustin Hibbits
10190aeed3e9SJustin Hibbits /* Flags to qman_destroy_fq() */
10200aeed3e9SJustin Hibbits #define QMAN_FQ_DESTROY_PARKED 0x00000001 /* FQ can be parked or OOS */
10210aeed3e9SJustin Hibbits
10220aeed3e9SJustin Hibbits /* Flags from qman_fq_state() */
10230aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CHANGING 0x80000000 /* 'state' is changing */
10240aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_NE 0x40000000 /* retired FQ isn't empty */
10250aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_ORL 0x20000000 /* retired FQ has ORL */
10260aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_BLOCKOOS 0xe0000000 /* if any are set, no OOS */
10270aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CGR_EN 0x10000000 /* CGR enabled */
10280aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_VDQCR 0x08000000 /* being volatile dequeued */
10290aeed3e9SJustin Hibbits
10300aeed3e9SJustin Hibbits /* Flags to qman_init_fq() */
10310aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_SCHED 0x00000001 /* schedule rather than park */
10320aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_NULL 0x00000002 /* zero 'contextB', no demux */
10330aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_LOCAL 0x00000004 /* set dest portal */
10340aeed3e9SJustin Hibbits
10350aeed3e9SJustin Hibbits /* Flags to qman_volatile_dequeue() */
10360aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT_INT 0x00000001 /* if we wait, interruptible? */
10370aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT 0x00000002 /* wait if VDQCR is in use */
10380aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_FINISH 0x00000004 /* wait till VDQCR completes */
10390aeed3e9SJustin Hibbits
10400aeed3e9SJustin Hibbits /* Flags to qman_enqueue(). NB, the strange numbering is to align with
10410aeed3e9SJustin Hibbits * hardware, bit-wise. */
10420aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT 0x00010000 /* wait if EQCR is full */
10430aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_INT 0x00020000 /* if wait, interruptible? */
10440aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_SYNC 0x00040000 /* if wait, until consumed? */
10450aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WATCH_CGR 0x00080000 /* watch congestion state */
10460aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_INTERRUPT 0x00000004 /* on command consumption */
10470aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA 0x00008000 /* perform enqueue-DCA */
10480aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PARK 0x00004000 /* If DCA, requests park */
10490aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PTR(p) /* If DCA, p is DQRR entry */ \
10500aeed3e9SJustin Hibbits (((uint32_t)(p) << 2) & 0x00000f00)
10510aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_GREEN 0x00000000 /* choose one C_*** flag */
10520aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_YELLOW 0x00000008
10530aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_RED 0x00000010
10540aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_OVERRIDE 0x00000018
10550aeed3e9SJustin Hibbits /* For the ORP-specific qman_enqueue_orp() variant, this flag indicates "Not
10560aeed3e9SJustin Hibbits * Last In Sequence", ie. a non-terminating fragment. */
10570aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NLIS 0x01000000
10580aeed3e9SJustin Hibbits /* - this flag performs no enqueue but fills in an ORP sequence number that
10590aeed3e9SJustin Hibbits * would otherwise block it (eg. if a frame has been dropped). */
10600aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_HOLE 0x02000000
10610aeed3e9SJustin Hibbits /* - this flag performs no enqueue but advances NESN to the given sequence
10620aeed3e9SJustin Hibbits * number. */
10630aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NESN 0x04000000
10640aeed3e9SJustin Hibbits
10650aeed3e9SJustin Hibbits /* FQ management */
10660aeed3e9SJustin Hibbits /* ------------- */
10670aeed3e9SJustin Hibbits /**
10680aeed3e9SJustin Hibbits * qman_free_fq - Deallocates a FQ
10690aeed3e9SJustin Hibbits * @fq: the frame queue object to release
10700aeed3e9SJustin Hibbits * @flags: bit-mask of QMAN_FQ_FREE_*** options
10710aeed3e9SJustin Hibbits *
10720aeed3e9SJustin Hibbits * The memory for this frame queue object ('mem' provided in qman_new_fq()) is
10730aeed3e9SJustin Hibbits * not deallocated but the caller regains ownership, to do with as desired. The
10740aeed3e9SJustin Hibbits * FQ must be in the 'out-of-service' state unless the QMAN_FQ_FREE_PARKED flag
10750aeed3e9SJustin Hibbits * is specified, in which case it may also be in the 'parked' state.
10760aeed3e9SJustin Hibbits */
10770aeed3e9SJustin Hibbits void qman_free_fq(struct qman_fq *fq, uint32_t flags);
10780aeed3e9SJustin Hibbits
10790aeed3e9SJustin Hibbits /**
10800aeed3e9SJustin Hibbits * qman_fq_fqid - Queries the frame queue ID of a FQ object
10810aeed3e9SJustin Hibbits * @fq: the frame queue object to query
10820aeed3e9SJustin Hibbits */
10830aeed3e9SJustin Hibbits uint32_t qman_fq_fqid(struct qman_fq *fq);
10840aeed3e9SJustin Hibbits
10850aeed3e9SJustin Hibbits /**
10860aeed3e9SJustin Hibbits * qman_fq_state - Queries the state of a FQ object
10870aeed3e9SJustin Hibbits * @fq: the frame queue object to query
10880aeed3e9SJustin Hibbits * @state: pointer to state enum to return the FQ scheduling state
10890aeed3e9SJustin Hibbits * @flags: pointer to state flags to receive QMAN_FQ_STATE_*** bitmask
10900aeed3e9SJustin Hibbits *
10910aeed3e9SJustin Hibbits * Queries the state of the FQ object, without performing any h/w commands.
10920aeed3e9SJustin Hibbits * This captures the state, as seen by the driver, at the time the function
10930aeed3e9SJustin Hibbits * executes.
10940aeed3e9SJustin Hibbits */
10950aeed3e9SJustin Hibbits void qman_fq_state(struct qman_fq *fq, enum qman_fq_state *state, uint32_t *flags);
10960aeed3e9SJustin Hibbits
10970aeed3e9SJustin Hibbits #endif /* __FSL_QMAN_H */
1098