1*0aeed3e9SJustin Hibbits /****************************************************************************** 2*0aeed3e9SJustin Hibbits 3*0aeed3e9SJustin Hibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc. 4*0aeed3e9SJustin Hibbits All rights reserved. 5*0aeed3e9SJustin Hibbits 6*0aeed3e9SJustin Hibbits This is proprietary source code of Freescale Semiconductor Inc., 7*0aeed3e9SJustin Hibbits and its use is subject to the NetComm Device Drivers EULA. 8*0aeed3e9SJustin Hibbits The copyright notice above does not evidence any actual or intended 9*0aeed3e9SJustin Hibbits publication of such source code. 10*0aeed3e9SJustin Hibbits 11*0aeed3e9SJustin Hibbits ALTERNATIVELY, redistribution and use in source and binary forms, with 12*0aeed3e9SJustin Hibbits or without modification, are permitted provided that the following 13*0aeed3e9SJustin Hibbits conditions are met: 14*0aeed3e9SJustin Hibbits * Redistributions of source code must retain the above copyright 15*0aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer. 16*0aeed3e9SJustin Hibbits * Redistributions in binary form must reproduce the above copyright 17*0aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer in the 18*0aeed3e9SJustin Hibbits documentation and/or other materials provided with the distribution. 19*0aeed3e9SJustin Hibbits * Neither the name of Freescale Semiconductor nor the 20*0aeed3e9SJustin Hibbits names of its contributors may be used to endorse or promote products 21*0aeed3e9SJustin Hibbits derived from this software without specific prior written permission. 22*0aeed3e9SJustin Hibbits 23*0aeed3e9SJustin Hibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 24*0aeed3e9SJustin Hibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25*0aeed3e9SJustin Hibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26*0aeed3e9SJustin Hibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 27*0aeed3e9SJustin Hibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28*0aeed3e9SJustin Hibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29*0aeed3e9SJustin Hibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30*0aeed3e9SJustin Hibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31*0aeed3e9SJustin Hibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32*0aeed3e9SJustin Hibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*0aeed3e9SJustin Hibbits * 34*0aeed3e9SJustin Hibbits 35*0aeed3e9SJustin Hibbits **************************************************************************/ 36*0aeed3e9SJustin Hibbits /****************************************************************************** 37*0aeed3e9SJustin Hibbits @File fsl_qman.h 38*0aeed3e9SJustin Hibbits 39*0aeed3e9SJustin Hibbits @Description QM header 40*0aeed3e9SJustin Hibbits *//***************************************************************************/ 41*0aeed3e9SJustin Hibbits #ifndef __FSL_QMAN_H 42*0aeed3e9SJustin Hibbits #define __FSL_QMAN_H 43*0aeed3e9SJustin Hibbits 44*0aeed3e9SJustin Hibbits #include "std_ext.h" 45*0aeed3e9SJustin Hibbits #include "string_ext.h" 46*0aeed3e9SJustin Hibbits #include "qm_ext.h" 47*0aeed3e9SJustin Hibbits 48*0aeed3e9SJustin Hibbits 49*0aeed3e9SJustin Hibbits /*************************************************/ 50*0aeed3e9SJustin Hibbits /* QMan s/w corenet portal, low-level i/face */ 51*0aeed3e9SJustin Hibbits /*************************************************/ 52*0aeed3e9SJustin Hibbits typedef enum { 53*0aeed3e9SJustin Hibbits e_QmPortalPCI = 0, /* PI index, cache-inhibited */ 54*0aeed3e9SJustin Hibbits e_QmPortalPCE, /* PI index, cache-enabled */ 55*0aeed3e9SJustin Hibbits e_QmPortalPVB /* valid-bit */ 56*0aeed3e9SJustin Hibbits } e_QmPortalProduceMode; 57*0aeed3e9SJustin Hibbits 58*0aeed3e9SJustin Hibbits typedef enum { 59*0aeed3e9SJustin Hibbits e_QmPortalEqcrCCI = 0, /* CI index, cache-inhibited */ 60*0aeed3e9SJustin Hibbits e_QmPortalEqcrCCE /* CI index, cache-enabled */ 61*0aeed3e9SJustin Hibbits } e_QmPortalEqcrConsumeMode; 62*0aeed3e9SJustin Hibbits 63*0aeed3e9SJustin Hibbits typedef enum { 64*0aeed3e9SJustin Hibbits e_QmPortalDqrrCCI = 0, /* CI index, cache-inhibited */ 65*0aeed3e9SJustin Hibbits e_QmPortalDqrrCCE, /* CI index, cache-enabled */ 66*0aeed3e9SJustin Hibbits e_QmPortalDqrrDCA /* Discrete Consumption Acknowledgment */ 67*0aeed3e9SJustin Hibbits } e_QmPortalDqrrConsumeMode; 68*0aeed3e9SJustin Hibbits 69*0aeed3e9SJustin Hibbits typedef enum { 70*0aeed3e9SJustin Hibbits e_QmPortalMrCCI = 0, /* CI index, cache-inhibited */ 71*0aeed3e9SJustin Hibbits e_QmPortalMrCCE /* CI index, cache-enabled */ 72*0aeed3e9SJustin Hibbits } e_QmPortalMrConsumeMode; 73*0aeed3e9SJustin Hibbits 74*0aeed3e9SJustin Hibbits typedef enum { 75*0aeed3e9SJustin Hibbits e_QmPortalDequeuePushMode = 0, /* SDQCR + VDQCR */ 76*0aeed3e9SJustin Hibbits e_QmPortalDequeuePullMode /* PDQCR */ 77*0aeed3e9SJustin Hibbits } e_QmPortalDequeueMode; 78*0aeed3e9SJustin Hibbits 79*0aeed3e9SJustin Hibbits /* Portal constants */ 80*0aeed3e9SJustin Hibbits #define QM_EQCR_SIZE 8 81*0aeed3e9SJustin Hibbits #define QM_DQRR_SIZE 16 82*0aeed3e9SJustin Hibbits #define QM_MR_SIZE 8 83*0aeed3e9SJustin Hibbits 84*0aeed3e9SJustin Hibbits /* Hardware constants */ 85*0aeed3e9SJustin Hibbits 86*0aeed3e9SJustin Hibbits enum qm_isr_reg { 87*0aeed3e9SJustin Hibbits qm_isr_status = 0, 88*0aeed3e9SJustin Hibbits qm_isr_enable = 1, 89*0aeed3e9SJustin Hibbits qm_isr_disable = 2, 90*0aeed3e9SJustin Hibbits qm_isr_inhibit = 3 91*0aeed3e9SJustin Hibbits }; 92*0aeed3e9SJustin Hibbits enum qm_dc_portal { 93*0aeed3e9SJustin Hibbits qm_dc_portal_fman0 = 0, 94*0aeed3e9SJustin Hibbits qm_dc_portal_fman1 = 1, 95*0aeed3e9SJustin Hibbits qm_dc_portal_caam = 2, 96*0aeed3e9SJustin Hibbits qm_dc_portal_pme = 3 97*0aeed3e9SJustin Hibbits }; 98*0aeed3e9SJustin Hibbits 99*0aeed3e9SJustin Hibbits /* Represents s/w corenet portal mapped data structures */ 100*0aeed3e9SJustin Hibbits struct qm_eqcr_entry; /* EQCR (EnQueue Command Ring) entries */ 101*0aeed3e9SJustin Hibbits struct qm_dqrr_entry; /* DQRR (DeQueue Response Ring) entries */ 102*0aeed3e9SJustin Hibbits struct qm_mr_entry; /* MR (Message Ring) entries */ 103*0aeed3e9SJustin Hibbits struct qm_mc_command; /* MC (Management Command) command */ 104*0aeed3e9SJustin Hibbits struct qm_mc_result; /* MC result */ 105*0aeed3e9SJustin Hibbits 106*0aeed3e9SJustin Hibbits /* This type represents a s/w corenet portal space, and is used for creating the 107*0aeed3e9SJustin Hibbits * portal objects within it (EQCR, DQRR, etc) */ 108*0aeed3e9SJustin Hibbits struct qm_portal; 109*0aeed3e9SJustin Hibbits 110*0aeed3e9SJustin Hibbits /* When iterating the available portals, this is the exposed config structure */ 111*0aeed3e9SJustin Hibbits struct qm_portal_config { 112*0aeed3e9SJustin Hibbits /* If the caller enables DQRR stashing (and thus wishes to operate the 113*0aeed3e9SJustin Hibbits * portal from only one cpu), this is the logical CPU that the portal 114*0aeed3e9SJustin Hibbits * will stash to. Whether stashing is enabled or not, this setting is 115*0aeed3e9SJustin Hibbits * also used for any "core-affine" portals, ie. default portals 116*0aeed3e9SJustin Hibbits * associated to the corresponding cpu. -1 implies that there is no core 117*0aeed3e9SJustin Hibbits * affinity configured. */ 118*0aeed3e9SJustin Hibbits int cpu; 119*0aeed3e9SJustin Hibbits /* portal interrupt line */ 120*0aeed3e9SJustin Hibbits int irq; 121*0aeed3e9SJustin Hibbits /* The portal's dedicated channel id, use this value for initializing 122*0aeed3e9SJustin Hibbits * frame queues to target this portal when scheduled. */ 123*0aeed3e9SJustin Hibbits e_QmFQChannel channel; 124*0aeed3e9SJustin Hibbits /* A mask of which pool channels this portal has dequeue access to 125*0aeed3e9SJustin Hibbits * (using QM_SDQCR_CHANNELS_POOL(n) for the bitmask) */ 126*0aeed3e9SJustin Hibbits uint32_t pools; 127*0aeed3e9SJustin Hibbits /* which portal sub-interfaces are already bound (ie. "in use") */ 128*0aeed3e9SJustin Hibbits uint8_t bound; 129*0aeed3e9SJustin Hibbits }; 130*0aeed3e9SJustin Hibbits /* qm_portal_config::bound uses these bit masks */ 131*0aeed3e9SJustin Hibbits #define QM_BIND_EQCR 0x01 132*0aeed3e9SJustin Hibbits #define QM_BIND_DQRR 0x02 133*0aeed3e9SJustin Hibbits #define QM_BIND_MR 0x04 134*0aeed3e9SJustin Hibbits #define QM_BIND_MC 0x08 135*0aeed3e9SJustin Hibbits #define QM_BIND_ISR 0x10 136*0aeed3e9SJustin Hibbits 137*0aeed3e9SJustin Hibbits /* This struct represents a pool channel */ 138*0aeed3e9SJustin Hibbits struct qm_pool_channel { 139*0aeed3e9SJustin Hibbits /* The QM_SDQCR_CHANNELS_POOL(n) bit that corresponds to this channel */ 140*0aeed3e9SJustin Hibbits uint32_t pool; 141*0aeed3e9SJustin Hibbits /* The channel id, used for initialising frame queues to target this 142*0aeed3e9SJustin Hibbits * channel. */ 143*0aeed3e9SJustin Hibbits e_QmFQChannel channel; 144*0aeed3e9SJustin Hibbits /* Bitmask of portal (logical-, not cell-)indices that have dequeue 145*0aeed3e9SJustin Hibbits * access to this channel; 146*0aeed3e9SJustin Hibbits * 0x001 -> qm_portal_get(0) 147*0aeed3e9SJustin Hibbits * 0x002 -> qm_portal_get(1) 148*0aeed3e9SJustin Hibbits * 0x004 -> qm_portal_get(2) 149*0aeed3e9SJustin Hibbits * ... 150*0aeed3e9SJustin Hibbits * 0x200 -> qm_portal_get(9) 151*0aeed3e9SJustin Hibbits */ 152*0aeed3e9SJustin Hibbits uint32_t portals; 153*0aeed3e9SJustin Hibbits }; 154*0aeed3e9SJustin Hibbits 155*0aeed3e9SJustin Hibbits /* ------------------------------ */ 156*0aeed3e9SJustin Hibbits /* --- Portal enumeration API --- */ 157*0aeed3e9SJustin Hibbits 158*0aeed3e9SJustin Hibbits /* Obtain the number of portals available */ 159*0aeed3e9SJustin Hibbits uint8_t qm_portal_num(void); 160*0aeed3e9SJustin Hibbits 161*0aeed3e9SJustin Hibbits /* Obtain a portal handle and configuration information about it */ 162*0aeed3e9SJustin Hibbits struct qm_portal *qm_portal_get(uint8_t idx); 163*0aeed3e9SJustin Hibbits 164*0aeed3e9SJustin Hibbits 165*0aeed3e9SJustin Hibbits /* ------------------------------------ */ 166*0aeed3e9SJustin Hibbits /* --- Pool channel enumeration API --- */ 167*0aeed3e9SJustin Hibbits 168*0aeed3e9SJustin Hibbits /* Obtain a mask of the available pool channels, expressed using 169*0aeed3e9SJustin Hibbits * QM_SDQCR_CHANNELS_POOL(n). */ 170*0aeed3e9SJustin Hibbits uint32_t qm_pools(void); 171*0aeed3e9SJustin Hibbits 172*0aeed3e9SJustin Hibbits /* Retrieve a pool channel configuration, given a QM_SDQCR_CHANNEL_POOL(n) 173*0aeed3e9SJustin Hibbits * bit-mask (the least significant bit of 'mask' is used if more than one bit is 174*0aeed3e9SJustin Hibbits * set). */ 175*0aeed3e9SJustin Hibbits const struct qm_pool_channel *qm_pool_channel(uint32_t mask); 176*0aeed3e9SJustin Hibbits 177*0aeed3e9SJustin Hibbits /* Flags to qm_fq_free_flags() */ 178*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT 0x00000001 /* wait if RCR is full */ 179*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_INT 0x00000002 /* if wait, interruptible? */ 180*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_SYNC 0x00000004 /* if wait, until consumed? */ 181*0aeed3e9SJustin Hibbits 182*0aeed3e9SJustin Hibbits 183*0aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_CHANNELS 0x0 184*0aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_SPECIFICWQ 0x40000000 185*0aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_EXACT1 0x0 186*0aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_UPTO3 0x20000000 187*0aeed3e9SJustin Hibbits #define QM_SDQCR_DEDICATED_PRECEDENCE 0x10000000 188*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_MASK 0x03000000 189*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_NULL 0x0 190*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_PRIO_QOS 0x01000000 191*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE_QOS 0x02000000 192*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE 0x03000000 193*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_SET(v) (((v) & 0x03) << (31-7)) 194*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_MASK 0x00ff0000 195*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_SET(v) (((v) & 0xff) << 16) 196*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_GET(v) (((v) >> 16) & 0xff) 197*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_DEDICATED 0x00008000 198*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL_MASK 0x00007fff 199*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL(n) (0x00008000 >> (n)) 200*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_MASK 0x000000f7 201*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_DEDICATED 0x00000000 202*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_POOL(n) ((n) << 4) 203*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_WQ(n) (n) 204*0aeed3e9SJustin Hibbits 205*0aeed3e9SJustin Hibbits /* For qm_dqrr_vdqcr_set(); Choose one PRECEDENCE. EXACT is optional. Use 206*0aeed3e9SJustin Hibbits * NUMFRAMES(n) (6-bit) or NUMFRAMES_TILLEMPTY to fill in the frame-count. Use 207*0aeed3e9SJustin Hibbits * FQID(n) to fill in the frame queue ID. */ 208*0aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_VDQCR 0x0 209*0aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_SDQCR 0x80000000 210*0aeed3e9SJustin Hibbits #define QM_VDQCR_EXACT 0x40000000 211*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_MASK 0x3f000000 212*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_SET(n) (((n) & 0x3f) << 24) 213*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_GET(n) (((n) >> 24) & 0x3f) 214*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_TILLEMPTY QM_VDQCR_NUMFRAMES_SET(0) 215*0aeed3e9SJustin Hibbits #define QM_VDQCR_FQID_MASK 0x00ffffff 216*0aeed3e9SJustin Hibbits #define QM_VDQCR_FQID(n) ((n) & QM_VDQCR_FQID_MASK) 217*0aeed3e9SJustin Hibbits 218*0aeed3e9SJustin Hibbits /* For qm_dqrr_pdqcr_set(); Choose one MODE. Choose one COUNT. 219*0aeed3e9SJustin Hibbits * If MODE==SCHEDULED 220*0aeed3e9SJustin Hibbits * Choose SCHEDULED_CHANNELS or SCHEDULED_SPECIFICWQ. Choose one dequeue TYPE. 221*0aeed3e9SJustin Hibbits * If CHANNELS, 222*0aeed3e9SJustin Hibbits * Choose CHANNELS_DEDICATED and/or CHANNELS_POOL() channels. 223*0aeed3e9SJustin Hibbits * You can choose DEDICATED_PRECEDENCE if the portal channel should have 224*0aeed3e9SJustin Hibbits * priority. 225*0aeed3e9SJustin Hibbits * If SPECIFICWQ, 226*0aeed3e9SJustin Hibbits * Either select the work-queue ID with SPECIFICWQ_WQ(), or select the 227*0aeed3e9SJustin Hibbits * channel (SPECIFICWQ_DEDICATED or SPECIFICWQ_POOL()) and specify the 228*0aeed3e9SJustin Hibbits * work-queue priority (0-7) with SPECIFICWQ_WQ() - either way, you get the 229*0aeed3e9SJustin Hibbits * same value. 230*0aeed3e9SJustin Hibbits * If MODE==UNSCHEDULED 231*0aeed3e9SJustin Hibbits * Choose FQID(). 232*0aeed3e9SJustin Hibbits */ 233*0aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_SCHEDULED 0x0 234*0aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_UNSCHEDULED 0x80000000 235*0aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_CHANNELS 0x0 236*0aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_SPECIFICWQ 0x40000000 237*0aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_EXACT1 0x0 238*0aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_UPTO3 0x20000000 239*0aeed3e9SJustin Hibbits #define QM_PDQCR_DEDICATED_PRECEDENCE 0x10000000 240*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_MASK 0x03000000 241*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_NULL 0x0 242*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_PRIO_QOS 0x01000000 243*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE_QOS 0x02000000 244*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE 0x03000000 245*0aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_DEDICATED 0x00008000 246*0aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_POOL(n) (0x00008000 >> (n)) 247*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_MASK 0x000000f7 248*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_DEDICATED 0x00000000 249*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_POOL(n) ((n) << 4) 250*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_WQ(n) (n) 251*0aeed3e9SJustin Hibbits #define QM_PDQCR_FQID(n) ((n) & 0xffffff) 252*0aeed3e9SJustin Hibbits 253*0aeed3e9SJustin Hibbits /* ------------------------------------- */ 254*0aeed3e9SJustin Hibbits /* --- Portal interrupt register API --- */ 255*0aeed3e9SJustin Hibbits 256*0aeed3e9SJustin Hibbits /* Quick explanation of the Qman interrupt model. Each bit has a source 257*0aeed3e9SJustin Hibbits * condition, that source is asserted iff the condition is true. Eg. Each 258*0aeed3e9SJustin Hibbits * DQAVAIL source bit tracks whether the corresponding channel's work queues 259*0aeed3e9SJustin Hibbits * contain any truly scheduled frame queues. That source exists "asserted" if 260*0aeed3e9SJustin Hibbits * and while there are truly-scheduled FQs available, it is deasserted as/when 261*0aeed3e9SJustin Hibbits * there are no longer any truly-scheduled FQs available. The same is true for 262*0aeed3e9SJustin Hibbits * the various other interrupt source conditions (QM_PIRQ_***). The following 263*0aeed3e9SJustin Hibbits * steps indicate what those source bits affect; 264*0aeed3e9SJustin Hibbits * 1. if the corresponding bit is set in the disable register, the source 265*0aeed3e9SJustin Hibbits * bit is masked off, we never see any effect from it. 266*0aeed3e9SJustin Hibbits * 2. otherwise, the corresponding bit is set in the status register. Once 267*0aeed3e9SJustin Hibbits * asserted in the status register, it must be write-1-to-clear'd - the 268*0aeed3e9SJustin Hibbits * status register bit will stay set even if the source condition 269*0aeed3e9SJustin Hibbits * deasserts. 270*0aeed3e9SJustin Hibbits * 3. if a bit is set in the status register but *not* set in the enable 271*0aeed3e9SJustin Hibbits * register, it will not cause the interrupt to assert. Other bits may 272*0aeed3e9SJustin Hibbits * still cause the interrupt to assert of course, and a read of the 273*0aeed3e9SJustin Hibbits * status register can still reveal un-enabled bits - this is why the 274*0aeed3e9SJustin Hibbits * enable and disable registers aren't strictly speaking "opposites". 275*0aeed3e9SJustin Hibbits * "Un-enabled" means it won't, on its own, trigger an interrupt. 276*0aeed3e9SJustin Hibbits * "Disabled" means it won't even show up in the status register. 277*0aeed3e9SJustin Hibbits * 4. if a bit is set in the status register *and* the enable register, the 278*0aeed3e9SJustin Hibbits * interrupt line will assert if and only if the inhibit register is 279*0aeed3e9SJustin Hibbits * zero. The inhibit register is the only interrupt-related register that 280*0aeed3e9SJustin Hibbits * does not share the bit definitions - it is a boolean on/off register. 281*0aeed3e9SJustin Hibbits */ 282*0aeed3e9SJustin Hibbits 283*0aeed3e9SJustin Hibbits /* Create/destroy */ 284*0aeed3e9SJustin Hibbits 285*0aeed3e9SJustin Hibbits /* Used by all portal interrupt registers except 'inhibit' */ 286*0aeed3e9SJustin Hibbits #define QM_PIRQ_CSCI 0x00100000 /* Congestion State Change */ 287*0aeed3e9SJustin Hibbits #define QM_PIRQ_EQCI 0x00080000 /* Enqueue Command Committed */ 288*0aeed3e9SJustin Hibbits #define QM_PIRQ_EQRI 0x00040000 /* EQCR Ring (below threshold) */ 289*0aeed3e9SJustin Hibbits #define QM_PIRQ_DQRI 0x00020000 /* DQRR Ring (non-empty) */ 290*0aeed3e9SJustin Hibbits #define QM_PIRQ_MRI 0x00010000 /* MR Ring (non-empty) */ 291*0aeed3e9SJustin Hibbits /* The DQAVAIL interrupt fields break down into these bits; */ 292*0aeed3e9SJustin Hibbits #define QM_PIRQ_DQAVAIL 0x0000ffff /* Channels with frame availability */ 293*0aeed3e9SJustin Hibbits #define QM_DQAVAIL_PORTAL 0x8000 /* Portal channel */ 294*0aeed3e9SJustin Hibbits #define QM_DQAVAIL_POOL(n) (0x8000 >> (n)) /* Pool channel, n==[1..15] */ 295*0aeed3e9SJustin Hibbits 296*0aeed3e9SJustin Hibbits /* These are qm_<reg>_<verb>(). So for example, qm_disable_write() means "write 297*0aeed3e9SJustin Hibbits * the disable register" rather than "disable the ability to write". */ 298*0aeed3e9SJustin Hibbits #define qm_isr_status_read(qm) __qm_isr_read(qm, qm_isr_status) 299*0aeed3e9SJustin Hibbits #define qm_isr_status_clear(qm, m) __qm_isr_write(qm, qm_isr_status, m) 300*0aeed3e9SJustin Hibbits #define qm_isr_enable_read(qm) __qm_isr_read(qm, qm_isr_enable) 301*0aeed3e9SJustin Hibbits #define qm_isr_enable_write(qm, v) __qm_isr_write(qm, qm_isr_enable, v) 302*0aeed3e9SJustin Hibbits #define qm_isr_disable_read(qm) __qm_isr_read(qm, qm_isr_disable) 303*0aeed3e9SJustin Hibbits #define qm_isr_disable_write(qm, v) __qm_isr_write(qm, qm_isr_disable, v) 304*0aeed3e9SJustin Hibbits #define qm_isr_inhibit(qm) __qm_isr_write(qm, qm_isr_inhibit, 1) 305*0aeed3e9SJustin Hibbits #define qm_isr_uninhibit(qm) __qm_isr_write(qm, qm_isr_inhibit, 0) 306*0aeed3e9SJustin Hibbits 307*0aeed3e9SJustin Hibbits /* ------------------------------------------------------- */ 308*0aeed3e9SJustin Hibbits /* --- Qman data structures (and associated constants) --- */ 309*0aeed3e9SJustin Hibbits 310*0aeed3e9SJustin Hibbits /* See David Lapp's "Frame formats" document, "dpateam", Jan 07, 2008 */ 311*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_SG 0x4 312*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_LONG 0x2 313*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_COMPOUND 0x1 314*0aeed3e9SJustin Hibbits enum qm_fd_format { 315*0aeed3e9SJustin Hibbits /* 'contig' implies a contiguous buffer, whereas 'sg' implies a 316*0aeed3e9SJustin Hibbits * scatter-gather table. 'big' implies a 29-bit length with no offset 317*0aeed3e9SJustin Hibbits * field, otherwise length is 20-bit and offset is 9-bit. 'compound' 318*0aeed3e9SJustin Hibbits * implies a s/g-like table, where each entry itself represents a frame 319*0aeed3e9SJustin Hibbits * (contiguous or scatter-gather) and the 29-bit "length" is 320*0aeed3e9SJustin Hibbits * interpreted purely for congestion calculations, ie. a "congestion 321*0aeed3e9SJustin Hibbits * weight". */ 322*0aeed3e9SJustin Hibbits qm_fd_contig = 0, 323*0aeed3e9SJustin Hibbits qm_fd_contig_big = QM_FD_FORMAT_LONG, 324*0aeed3e9SJustin Hibbits qm_fd_sg = QM_FD_FORMAT_SG, 325*0aeed3e9SJustin Hibbits qm_fd_sg_big = QM_FD_FORMAT_SG | QM_FD_FORMAT_LONG, 326*0aeed3e9SJustin Hibbits qm_fd_compound = QM_FD_FORMAT_COMPOUND 327*0aeed3e9SJustin Hibbits }; 328*0aeed3e9SJustin Hibbits 329*0aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__) 330*0aeed3e9SJustin Hibbits #pragma pack(push,1) 331*0aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */ 332*0aeed3e9SJustin Hibbits #define MEM_MAP_START 333*0aeed3e9SJustin Hibbits 334*0aeed3e9SJustin Hibbits _Packed struct qm_fqd_stashing { 335*0aeed3e9SJustin Hibbits /* See QM_STASHING_EXCL_<...> */ 336*0aeed3e9SJustin Hibbits volatile uint8_t exclusive; 337*0aeed3e9SJustin Hibbits volatile uint8_t reserved1:2; 338*0aeed3e9SJustin Hibbits /* Numbers of cachelines */ 339*0aeed3e9SJustin Hibbits volatile uint8_t annotation_cl:2; 340*0aeed3e9SJustin Hibbits volatile uint8_t data_cl:2; 341*0aeed3e9SJustin Hibbits volatile uint8_t context_cl:2; 342*0aeed3e9SJustin Hibbits } _PackedType; 343*0aeed3e9SJustin Hibbits 344*0aeed3e9SJustin Hibbits typedef _Packed union { 345*0aeed3e9SJustin Hibbits /* Treat it as 64-bit opaque */ 346*0aeed3e9SJustin Hibbits _Packed struct { 347*0aeed3e9SJustin Hibbits volatile uint32_t hi; 348*0aeed3e9SJustin Hibbits volatile uint32_t lo; 349*0aeed3e9SJustin Hibbits } _PackedType; 350*0aeed3e9SJustin Hibbits /* Treat it as s/w portal stashing config */ 351*0aeed3e9SJustin Hibbits /* See 1.5.6.7.1: "FQD Context_A field used for [...] */ 352*0aeed3e9SJustin Hibbits _Packed struct { 353*0aeed3e9SJustin Hibbits struct qm_fqd_stashing stashing; 354*0aeed3e9SJustin Hibbits volatile uint8_t reserved1; 355*0aeed3e9SJustin Hibbits /* 40-bit address of FQ context to 356*0aeed3e9SJustin Hibbits * stash, must be cacheline-aligned */ 357*0aeed3e9SJustin Hibbits volatile uint8_t context_hi; 358*0aeed3e9SJustin Hibbits volatile uint32_t context_lo; 359*0aeed3e9SJustin Hibbits } _PackedType; 360*0aeed3e9SJustin Hibbits } _PackedType u_QmFqdContextA; 361*0aeed3e9SJustin Hibbits 362*0aeed3e9SJustin Hibbits /* See 1.5.1.1: "Frame Descriptor (FD)" */ 363*0aeed3e9SJustin Hibbits _Packed struct qm_fd { 364*0aeed3e9SJustin Hibbits volatile uint8_t dd:2; /* dynamic debug */ 365*0aeed3e9SJustin Hibbits volatile uint8_t liodn_offset:6; /* aka. "Partition ID" in rev1.0 */ 366*0aeed3e9SJustin Hibbits volatile uint8_t bpid; /* Buffer Pool ID */ 367*0aeed3e9SJustin Hibbits volatile uint8_t eliodn_offset:4; 368*0aeed3e9SJustin Hibbits volatile uint8_t reserved:4; 369*0aeed3e9SJustin Hibbits volatile uint8_t addr_hi; /* high 8-bits of 40-bit address */ 370*0aeed3e9SJustin Hibbits volatile uint32_t addr_lo; /* low 32-bits of 40-bit address */ 371*0aeed3e9SJustin Hibbits /* The 'format' field indicates the interpretation of the remaining 29 372*0aeed3e9SJustin Hibbits * bits of the 32-bit word. For packing reasons, it is duplicated in the 373*0aeed3e9SJustin Hibbits * other union elements. */ 374*0aeed3e9SJustin Hibbits _Packed union { 375*0aeed3e9SJustin Hibbits /* If 'format' is _contig or _sg, 20b length and 9b offset */ 376*0aeed3e9SJustin Hibbits _Packed struct { 377*0aeed3e9SJustin Hibbits volatile enum qm_fd_format format:3; 378*0aeed3e9SJustin Hibbits volatile uint16_t offset:9; 379*0aeed3e9SJustin Hibbits volatile uint32_t length20:20; 380*0aeed3e9SJustin Hibbits } _PackedType; 381*0aeed3e9SJustin Hibbits /* If 'format' is _contig_big or _sg_big, 29b length */ 382*0aeed3e9SJustin Hibbits _Packed struct { 383*0aeed3e9SJustin Hibbits volatile enum qm_fd_format _format1:3; 384*0aeed3e9SJustin Hibbits volatile uint32_t length29:29; 385*0aeed3e9SJustin Hibbits } _PackedType; 386*0aeed3e9SJustin Hibbits /* If 'format' is _compound, 29b "congestion weight" */ 387*0aeed3e9SJustin Hibbits _Packed struct { 388*0aeed3e9SJustin Hibbits volatile enum qm_fd_format _format2:3; 389*0aeed3e9SJustin Hibbits volatile uint32_t cong_weight:29; 390*0aeed3e9SJustin Hibbits } _PackedType; 391*0aeed3e9SJustin Hibbits /* For easier/faster copying of this part of the fd (eg. from a 392*0aeed3e9SJustin Hibbits * DQRR entry to an EQCR entry) copy 'opaque' */ 393*0aeed3e9SJustin Hibbits volatile uint32_t opaque; 394*0aeed3e9SJustin Hibbits } _PackedType; 395*0aeed3e9SJustin Hibbits _Packed union { 396*0aeed3e9SJustin Hibbits volatile uint32_t cmd; 397*0aeed3e9SJustin Hibbits volatile uint32_t status; 398*0aeed3e9SJustin Hibbits }_PackedType; 399*0aeed3e9SJustin Hibbits } _PackedType; 400*0aeed3e9SJustin Hibbits 401*0aeed3e9SJustin Hibbits #define QM_FD_DD_NULL 0x00 402*0aeed3e9SJustin Hibbits #define QM_FD_PID_MASK 0x3f 403*0aeed3e9SJustin Hibbits 404*0aeed3e9SJustin Hibbits /* See 1.5.8.1: "Enqueue Command" */ 405*0aeed3e9SJustin Hibbits _Packed struct qm_eqcr_entry { 406*0aeed3e9SJustin Hibbits volatile uint8_t __dont_write_directly__verb; 407*0aeed3e9SJustin Hibbits volatile uint8_t dca; 408*0aeed3e9SJustin Hibbits volatile uint16_t seqnum; 409*0aeed3e9SJustin Hibbits volatile uint32_t orp; /* 24-bit */ 410*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 411*0aeed3e9SJustin Hibbits volatile uint32_t tag; 412*0aeed3e9SJustin Hibbits volatile struct qm_fd fd; 413*0aeed3e9SJustin Hibbits volatile uint8_t reserved3[32]; 414*0aeed3e9SJustin Hibbits } _PackedType; 415*0aeed3e9SJustin Hibbits 416*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_VBIT 0x80 417*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_MASK 0x61 /* but only one value; */ 418*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_ENQUEUE 0x01 419*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_MASK 0x18 /* 4 possible values; */ 420*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_GREEN 0x00 421*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_YELLOW 0x08 422*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_RED 0x10 423*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_OVERRIDE 0x18 424*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_INTERRUPT 0x04 /* on command consumption */ 425*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_ORP 0x02 /* enable order restoration */ 426*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_ENABLE 0x80 427*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_PARK 0x40 428*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_IDXMASK 0x0f /* "DQRR::idx" goes here */ 429*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NESN 0x8000 /* Advance NESN */ 430*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NLIS 0x4000 /* More fragments to come */ 431*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_SEQMASK 0x3fff /* sequence number goes here */ 432*0aeed3e9SJustin Hibbits #define QM_EQCR_FQID_NULL 0 /* eg. for an ORP seqnum hole */ 433*0aeed3e9SJustin Hibbits 434*0aeed3e9SJustin Hibbits /* See 1.5.8.2: "Frame Dequeue Response" */ 435*0aeed3e9SJustin Hibbits _Packed struct qm_dqrr_entry { 436*0aeed3e9SJustin Hibbits volatile uint8_t verb; 437*0aeed3e9SJustin Hibbits volatile uint8_t stat; 438*0aeed3e9SJustin Hibbits volatile uint16_t seqnum; /* 15-bit */ 439*0aeed3e9SJustin Hibbits volatile uint8_t tok; 440*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[3]; 441*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 442*0aeed3e9SJustin Hibbits volatile uint32_t contextB; 443*0aeed3e9SJustin Hibbits volatile struct qm_fd fd; 444*0aeed3e9SJustin Hibbits volatile uint8_t reserved4[32]; 445*0aeed3e9SJustin Hibbits } _PackedType; 446*0aeed3e9SJustin Hibbits 447*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_VBIT 0x80 448*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_MASK 0x7f /* where the verb contains; */ 449*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_FRAME_DEQUEUE 0x60 /* "this format" */ 450*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_EMPTY 0x80 /* FQ empty */ 451*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_HELDACTIVE 0x40 /* FQ held active */ 452*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_FORCEELIGIBLE 0x20 /* FQ was force-eligible'd */ 453*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FD_VALID 0x10 /* has a non-NULL FD */ 454*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_UNSCHEDULED 0x02 /* Unscheduled dequeue */ 455*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_DQCR_EXPIRED 0x01 /* VDQCR or PDQCR expired*/ 456*0aeed3e9SJustin Hibbits 457*0aeed3e9SJustin Hibbits #define VDQCR_DONE (QM_DQRR_STAT_UNSCHEDULED | QM_DQRR_STAT_DQCR_EXPIRED) 458*0aeed3e9SJustin Hibbits 459*0aeed3e9SJustin Hibbits 460*0aeed3e9SJustin Hibbits /* See 1.5.8.3: "ERN Message Response" */ 461*0aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */ 462*0aeed3e9SJustin Hibbits _Packed struct qm_mr_entry { 463*0aeed3e9SJustin Hibbits volatile uint8_t verb; 464*0aeed3e9SJustin Hibbits _Packed union { 465*0aeed3e9SJustin Hibbits _Packed struct { 466*0aeed3e9SJustin Hibbits volatile uint8_t dca; 467*0aeed3e9SJustin Hibbits volatile uint16_t seqnum; 468*0aeed3e9SJustin Hibbits volatile uint8_t rc; /* Rejection Code */ 469*0aeed3e9SJustin Hibbits volatile uint32_t orp:24; 470*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 471*0aeed3e9SJustin Hibbits volatile uint32_t tag; 472*0aeed3e9SJustin Hibbits volatile struct qm_fd fd; 473*0aeed3e9SJustin Hibbits } _PackedType ern; 474*0aeed3e9SJustin Hibbits _Packed struct { 475*0aeed3e9SJustin Hibbits volatile uint8_t colour:2; /* See QM_MR_DCERN_COLOUR_* */ 476*0aeed3e9SJustin Hibbits volatile uint8_t reserved1:3; 477*0aeed3e9SJustin Hibbits volatile enum qm_dc_portal portal:3; 478*0aeed3e9SJustin Hibbits volatile uint16_t reserved2; 479*0aeed3e9SJustin Hibbits volatile uint8_t rc; /* Rejection Code */ 480*0aeed3e9SJustin Hibbits volatile uint32_t reserved3:24; 481*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 482*0aeed3e9SJustin Hibbits volatile uint32_t tag; 483*0aeed3e9SJustin Hibbits volatile struct qm_fd fd; 484*0aeed3e9SJustin Hibbits } _PackedType dcern; 485*0aeed3e9SJustin Hibbits _Packed struct { 486*0aeed3e9SJustin Hibbits volatile uint8_t fqs; /* Frame Queue Status */ 487*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[6]; 488*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 489*0aeed3e9SJustin Hibbits volatile uint32_t contextB; 490*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[16]; 491*0aeed3e9SJustin Hibbits } _PackedType fq; /* FQRN/FQRNI/FQRL/FQPN */ 492*0aeed3e9SJustin Hibbits } _PackedType; 493*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[32]; 494*0aeed3e9SJustin Hibbits } _PackedType; 495*0aeed3e9SJustin Hibbits 496*0aeed3e9SJustin Hibbits #define QM_MR_VERB_VBIT 0x80 497*0aeed3e9SJustin Hibbits /* The "ern" VERB bits match QM_EQCR_VERB_*** so aren't reproduced here. ERNs 498*0aeed3e9SJustin Hibbits * originating from direct-connect portals ("dcern") use 0x20 as a verb which 499*0aeed3e9SJustin Hibbits * would be invalid as a s/w enqueue verb. A s/w ERN can be distinguished from 500*0aeed3e9SJustin Hibbits * the other MR types by noting if the 0x20 bit is unset. */ 501*0aeed3e9SJustin Hibbits #define QM_MR_VERB_TYPE_MASK 0x23 502*0aeed3e9SJustin Hibbits #define QM_MR_VERB_DC_ERN 0x20 503*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRN 0x21 504*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRNI 0x22 505*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRL 0x23 506*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQPN 0x24 507*0aeed3e9SJustin Hibbits #define QM_MR_RC_MASK 0xf0 /* contains one of; */ 508*0aeed3e9SJustin Hibbits #define QM_MR_RC_CGR_TAILDROP 0x00 509*0aeed3e9SJustin Hibbits #define QM_MR_RC_WRED 0x10 510*0aeed3e9SJustin Hibbits #define QM_MR_RC_ERROR 0x20 511*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_EARLY 0x30 512*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_LATE 0x40 513*0aeed3e9SJustin Hibbits #define QM_MR_RC_FQ_TAILDROP 0x50 514*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_RETIRED 0x60 515*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_DISABLE 0x70 516*0aeed3e9SJustin Hibbits #define QM_MR_FQS_ORLPRESENT 0x02 /* ORL fragments to come */ 517*0aeed3e9SJustin Hibbits #define QM_MR_FQS_NOTEMPTY 0x01 /* FQ has enqueued frames */ 518*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_GREEN 0x00 519*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_YELLOW 0x01 520*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_RED 0x02 521*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_OVERRIDE 0x03 522*0aeed3e9SJustin Hibbits 523*0aeed3e9SJustin Hibbits /* This identical structure of FQD fields is present in the "Init FQ" command 524*0aeed3e9SJustin Hibbits * and the "Query FQ" result. It's suctioned out here into its own struct. It's 525*0aeed3e9SJustin Hibbits * also used as the qman_query_fq() result structure in the high-level API. */ 526*0aeed3e9SJustin Hibbits 527*0aeed3e9SJustin Hibbits /* TODO What about OAC for intra-class? */ 528*0aeed3e9SJustin Hibbits #define QM_FQD_TD_THRESH_OAC_EN 0x4000 529*0aeed3e9SJustin Hibbits 530*0aeed3e9SJustin Hibbits _Packed struct qm_fqd { 531*0aeed3e9SJustin Hibbits _Packed union { 532*0aeed3e9SJustin Hibbits volatile uint8_t orpc; 533*0aeed3e9SJustin Hibbits _Packed struct { 534*0aeed3e9SJustin Hibbits volatile uint8_t reserved1:2; 535*0aeed3e9SJustin Hibbits volatile uint8_t orprws:3; 536*0aeed3e9SJustin Hibbits volatile uint8_t oa:1; 537*0aeed3e9SJustin Hibbits volatile uint8_t olws:2; 538*0aeed3e9SJustin Hibbits } _PackedType; 539*0aeed3e9SJustin Hibbits } _PackedType; 540*0aeed3e9SJustin Hibbits volatile uint8_t cgid; 541*0aeed3e9SJustin Hibbits volatile uint16_t fq_ctrl; /* See QM_FQCTRL_<...> */ 542*0aeed3e9SJustin Hibbits _Packed union { 543*0aeed3e9SJustin Hibbits volatile uint16_t dest_wq; 544*0aeed3e9SJustin Hibbits _Packed struct { 545*0aeed3e9SJustin Hibbits volatile uint16_t channel:13; /* enum qm_channel */ 546*0aeed3e9SJustin Hibbits volatile uint16_t wq:3; 547*0aeed3e9SJustin Hibbits } _PackedType dest; 548*0aeed3e9SJustin Hibbits } _PackedType; 549*0aeed3e9SJustin Hibbits volatile uint16_t reserved2:1; 550*0aeed3e9SJustin Hibbits volatile uint16_t ics_cred:15; 551*0aeed3e9SJustin Hibbits _Packed union { 552*0aeed3e9SJustin Hibbits volatile uint16_t td_thresh; 553*0aeed3e9SJustin Hibbits _Packed struct { 554*0aeed3e9SJustin Hibbits volatile uint16_t reserved1:3; 555*0aeed3e9SJustin Hibbits volatile uint16_t mant:8; 556*0aeed3e9SJustin Hibbits volatile uint16_t exp:5; 557*0aeed3e9SJustin Hibbits } _PackedType td; 558*0aeed3e9SJustin Hibbits } _PackedType; 559*0aeed3e9SJustin Hibbits volatile uint32_t context_b; 560*0aeed3e9SJustin Hibbits volatile u_QmFqdContextA context_a; 561*0aeed3e9SJustin Hibbits } _PackedType; 562*0aeed3e9SJustin Hibbits 563*0aeed3e9SJustin Hibbits /* See 1.5.2.2: "Frame Queue Descriptor (FQD)" */ 564*0aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'fq_ctrl' uses these constants */ 565*0aeed3e9SJustin Hibbits #define QM_FQCTRL_MASK 0x07ff /* 'fq_ctrl' flags; */ 566*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CGE 0x0400 /* Congestion Group Enable */ 567*0aeed3e9SJustin Hibbits #define QM_FQCTRL_TDE 0x0200 /* Tail-Drop Enable */ 568*0aeed3e9SJustin Hibbits #define QM_FQCTRL_ORP 0x0100 /* ORP Enable */ 569*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CTXASTASHING 0x0080 /* Context-A stashing */ 570*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CPCSTASH 0x0040 /* CPC Stash Enable */ 571*0aeed3e9SJustin Hibbits #define QM_FQCTRL_FORCESFDR 0x0008 /* High-priority SFDRs */ 572*0aeed3e9SJustin Hibbits #define QM_FQCTRL_AVOIDBLOCK 0x0004 /* Don't block active */ 573*0aeed3e9SJustin Hibbits #define QM_FQCTRL_HOLDACTIVE 0x0002 /* Hold active in portal */ 574*0aeed3e9SJustin Hibbits #define QM_FQCTRL_LOCKINCACHE 0x0001 /* Aggressively cache FQD */ 575*0aeed3e9SJustin Hibbits 576*0aeed3e9SJustin Hibbits /* See 1.5.6.7.1: "FQD Context_A field used for [...] */ 577*0aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'CONTEXT_A' uses these constants */ 578*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_ANNOTATION 0x04 579*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_DATA 0x02 580*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_CONTEXT 0x01 581*0aeed3e9SJustin Hibbits 582*0aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */ 583*0aeed3e9SJustin Hibbits /* This struct represents the 32-bit "WR_PARM_[GYR]" parameters in CGR fields 584*0aeed3e9SJustin Hibbits * and associated commands/responses. The WRED parameters are calculated from 585*0aeed3e9SJustin Hibbits * these fields as follows; 586*0aeed3e9SJustin Hibbits * MaxTH = MA * (2 ^ Mn) 587*0aeed3e9SJustin Hibbits * Slope = SA / (2 ^ Sn) 588*0aeed3e9SJustin Hibbits * MaxP = 4 * (Pn + 1) 589*0aeed3e9SJustin Hibbits */ 590*0aeed3e9SJustin Hibbits _Packed struct qm_cgr_wr_parm { 591*0aeed3e9SJustin Hibbits _Packed union { 592*0aeed3e9SJustin Hibbits volatile uint32_t word; 593*0aeed3e9SJustin Hibbits _Packed struct { 594*0aeed3e9SJustin Hibbits volatile uint32_t MA:8; 595*0aeed3e9SJustin Hibbits volatile uint32_t Mn:5; 596*0aeed3e9SJustin Hibbits volatile uint32_t SA:7; /* must be between 64-127 */ 597*0aeed3e9SJustin Hibbits volatile uint32_t Sn:6; 598*0aeed3e9SJustin Hibbits volatile uint32_t Pn:6; 599*0aeed3e9SJustin Hibbits } _PackedType; 600*0aeed3e9SJustin Hibbits } _PackedType; 601*0aeed3e9SJustin Hibbits } _PackedType; 602*0aeed3e9SJustin Hibbits 603*0aeed3e9SJustin Hibbits /* This struct represents the 13-bit "CS_THRES" CGR field. In the corresponding 604*0aeed3e9SJustin Hibbits * management commands, this is padded to a 16-bit structure field, so that's 605*0aeed3e9SJustin Hibbits * how we represent it here. The congestion state threshold is calculated from 606*0aeed3e9SJustin Hibbits * these fields as follows; 607*0aeed3e9SJustin Hibbits * CS threshold = TA * (2 ^ Tn) 608*0aeed3e9SJustin Hibbits */ 609*0aeed3e9SJustin Hibbits _Packed struct qm_cgr_cs_thres { 610*0aeed3e9SJustin Hibbits volatile uint16_t reserved:3; 611*0aeed3e9SJustin Hibbits volatile uint16_t TA:8; 612*0aeed3e9SJustin Hibbits volatile uint16_t Tn:5; 613*0aeed3e9SJustin Hibbits } _PackedType; 614*0aeed3e9SJustin Hibbits 615*0aeed3e9SJustin Hibbits /* This identical structure of CGR fields is present in the "Init/Modify CGR" 616*0aeed3e9SJustin Hibbits * commands and the "Query CGR" result. It's suctioned out here into its own 617*0aeed3e9SJustin Hibbits * struct. */ 618*0aeed3e9SJustin Hibbits _Packed struct __qm_mc_cgr { 619*0aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_g; 620*0aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_y; 621*0aeed3e9SJustin Hibbits volatile struct qm_cgr_wr_parm wr_parm_r; 622*0aeed3e9SJustin Hibbits volatile uint8_t wr_en_g; /* boolean, use QM_CGR_EN */ 623*0aeed3e9SJustin Hibbits volatile uint8_t wr_en_y; /* boolean, use QM_CGR_EN */ 624*0aeed3e9SJustin Hibbits volatile uint8_t wr_en_r; /* boolean, use QM_CGR_EN */ 625*0aeed3e9SJustin Hibbits volatile uint8_t cscn_en; /* boolean, use QM_CGR_EN */ 626*0aeed3e9SJustin Hibbits volatile uint32_t cscn_targ; /* use QM_CGR_TARG_* */ 627*0aeed3e9SJustin Hibbits volatile uint8_t cstd_en; /* boolean, use QM_CGR_EN */ 628*0aeed3e9SJustin Hibbits volatile uint8_t cs; /* boolean, only used in query response */ 629*0aeed3e9SJustin Hibbits volatile struct qm_cgr_cs_thres cs_thres; 630*0aeed3e9SJustin Hibbits volatile uint8_t frame_mode; /* boolean, use QM_CGR_EN */ 631*0aeed3e9SJustin Hibbits } _PackedType; 632*0aeed3e9SJustin Hibbits 633*0aeed3e9SJustin Hibbits #define QM_CGR_EN 0x01 /* For wr_en_*, cscn_en, cstd_en, frame_mode */ 634*0aeed3e9SJustin Hibbits 635*0aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */ 636*0aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */ 637*0aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */ 638*0aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */ 639*0aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */ 640*0aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */ 641*0aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */ 642*0aeed3e9SJustin Hibbits _Packed struct qm_mc_command { 643*0aeed3e9SJustin Hibbits volatile uint8_t __dont_write_directly__verb; 644*0aeed3e9SJustin Hibbits _Packed union { 645*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_initfq { 646*0aeed3e9SJustin Hibbits volatile uint8_t reserved1; 647*0aeed3e9SJustin Hibbits volatile uint16_t we_mask; /* Write Enable Mask */ 648*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 649*0aeed3e9SJustin Hibbits volatile uint16_t count; /* Initialises 'count+1' FQDs */ 650*0aeed3e9SJustin Hibbits volatile struct qm_fqd fqd; /* the FQD fields go here */ 651*0aeed3e9SJustin Hibbits volatile uint8_t reserved3[32]; 652*0aeed3e9SJustin Hibbits } _PackedType initfq; 653*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_queryfq { 654*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[3]; 655*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 656*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[56]; 657*0aeed3e9SJustin Hibbits } _PackedType queryfq; 658*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_queryfq_np { 659*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[3]; 660*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 661*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[56]; 662*0aeed3e9SJustin Hibbits } _PackedType queryfq_np; 663*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_alterfq { 664*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[3]; 665*0aeed3e9SJustin Hibbits volatile uint32_t fqid; /* 24-bit */ 666*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[12]; 667*0aeed3e9SJustin Hibbits volatile uint32_t context_b; 668*0aeed3e9SJustin Hibbits volatile uint8_t reserved3[40]; 669*0aeed3e9SJustin Hibbits } _PackedType alterfq; 670*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_initcgr { 671*0aeed3e9SJustin Hibbits volatile uint8_t reserved1; 672*0aeed3e9SJustin Hibbits volatile uint16_t we_mask; /* Write Enable Mask */ 673*0aeed3e9SJustin Hibbits volatile struct __qm_mc_cgr cgr; /* CGR fields */ 674*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[2]; 675*0aeed3e9SJustin Hibbits volatile uint8_t cgid; 676*0aeed3e9SJustin Hibbits volatile uint8_t reserved4[32]; 677*0aeed3e9SJustin Hibbits } _PackedType initcgr; 678*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_querycgr { 679*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[30]; 680*0aeed3e9SJustin Hibbits volatile uint8_t cgid; 681*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[32]; 682*0aeed3e9SJustin Hibbits } _PackedType querycgr; 683*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_querycongestion { 684*0aeed3e9SJustin Hibbits volatile uint8_t reserved[63]; 685*0aeed3e9SJustin Hibbits } _PackedType querycongestion; 686*0aeed3e9SJustin Hibbits _Packed struct qm_mcc_querywq { 687*0aeed3e9SJustin Hibbits volatile uint8_t reserved; 688*0aeed3e9SJustin Hibbits /* select channel if verb != QUERYWQ_DEDICATED */ 689*0aeed3e9SJustin Hibbits _Packed union { 690*0aeed3e9SJustin Hibbits volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */ 691*0aeed3e9SJustin Hibbits _Packed struct { 692*0aeed3e9SJustin Hibbits volatile uint16_t id:13; /* enum qm_channel */ 693*0aeed3e9SJustin Hibbits volatile uint16_t reserved1:3; 694*0aeed3e9SJustin Hibbits } _PackedType channel; 695*0aeed3e9SJustin Hibbits } _PackedType; 696*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[60]; 697*0aeed3e9SJustin Hibbits } _PackedType querywq; 698*0aeed3e9SJustin Hibbits } _PackedType; 699*0aeed3e9SJustin Hibbits } _PackedType; 700*0aeed3e9SJustin Hibbits 701*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_VBIT 0x80 702*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_MASK 0x7f /* where the verb contains; */ 703*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_PARKED 0x40 704*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_SCHED 0x41 705*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ 0x44 706*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ_NP 0x45 /* "non-programmable" fields */ 707*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ 0x46 708*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ_DEDICATED 0x47 709*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_SCHED 0x48 /* Schedule FQ */ 710*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_FE 0x49 /* Force Eligible FQ */ 711*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE 0x4a /* Retire FQ */ 712*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_OOS 0x4b /* Take FQ out of service */ 713*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE_CTXB 0x4c /* Retire FQ with contextB*/ 714*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITCGR 0x50 715*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_MODIFYCGR 0x51 716*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCGR 0x58 717*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCONGESTION 0x59 718*0aeed3e9SJustin Hibbits /* INITFQ-specific flags */ 719*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_MASK 0x01ff /* 'Write Enable' flags; */ 720*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_OAC 0x0100 721*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ORPC 0x0080 722*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CGID 0x0040 723*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_FQCTRL 0x0020 724*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_DESTWQ 0x0010 725*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ICSCRED 0x0008 726*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_TDTHRESH 0x0004 727*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTB 0x0002 728*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTA 0x0001 729*0aeed3e9SJustin Hibbits /* INITCGR/MODIFYCGR-specific flags */ 730*0aeed3e9SJustin Hibbits #define QM_CGR_WE_MASK 0x07ff /* 'Write Enable Mask'; */ 731*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_G 0x0400 732*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_Y 0x0200 733*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_R 0x0100 734*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_G 0x0080 735*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_Y 0x0040 736*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_R 0x0020 737*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_EN 0x0010 738*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_TARG 0x0008 739*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSTD_EN 0x0004 740*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CS_THRES 0x0002 741*0aeed3e9SJustin Hibbits #define QM_CGR_WE_MODE 0x0001 742*0aeed3e9SJustin Hibbits 743*0aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */ 744*0aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */ 745*0aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */ 746*0aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */ 747*0aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */ 748*0aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */ 749*0aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */ 750*0aeed3e9SJustin Hibbits _Packed struct qm_mc_result { 751*0aeed3e9SJustin Hibbits volatile uint8_t verb; 752*0aeed3e9SJustin Hibbits volatile uint8_t result; 753*0aeed3e9SJustin Hibbits _Packed union { 754*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_initfq { 755*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[62]; 756*0aeed3e9SJustin Hibbits } _PackedType initfq; 757*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_queryfq { 758*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[8]; 759*0aeed3e9SJustin Hibbits volatile struct qm_fqd fqd; /* the FQD fields are here */ 760*0aeed3e9SJustin Hibbits volatile uint16_t oac; 761*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[30]; 762*0aeed3e9SJustin Hibbits } _PackedType queryfq; 763*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_queryfq_np { 764*0aeed3e9SJustin Hibbits volatile uint8_t reserved1; 765*0aeed3e9SJustin Hibbits volatile uint8_t state; /* QM_MCR_NP_STATE_*** */ 766*0aeed3e9SJustin Hibbits volatile uint8_t reserved2; 767*0aeed3e9SJustin Hibbits volatile uint32_t fqd_link:24; 768*0aeed3e9SJustin Hibbits volatile uint16_t odp_seq; 769*0aeed3e9SJustin Hibbits volatile uint16_t orp_nesn; 770*0aeed3e9SJustin Hibbits volatile uint16_t orp_ea_hseq; 771*0aeed3e9SJustin Hibbits volatile uint16_t orp_ea_tseq; 772*0aeed3e9SJustin Hibbits volatile uint8_t reserved3; 773*0aeed3e9SJustin Hibbits volatile uint32_t orp_ea_hptr:24; 774*0aeed3e9SJustin Hibbits volatile uint8_t reserved4; 775*0aeed3e9SJustin Hibbits volatile uint32_t orp_ea_tptr:24; 776*0aeed3e9SJustin Hibbits volatile uint8_t reserved5; 777*0aeed3e9SJustin Hibbits volatile uint32_t pfdr_hptr:24; 778*0aeed3e9SJustin Hibbits volatile uint8_t reserved6; 779*0aeed3e9SJustin Hibbits volatile uint32_t pfdr_tptr:24; 780*0aeed3e9SJustin Hibbits volatile uint8_t reserved7[5]; 781*0aeed3e9SJustin Hibbits volatile uint8_t reserved8:7; 782*0aeed3e9SJustin Hibbits volatile uint8_t is:1; 783*0aeed3e9SJustin Hibbits volatile uint16_t ics_surp; 784*0aeed3e9SJustin Hibbits volatile uint32_t byte_cnt; 785*0aeed3e9SJustin Hibbits volatile uint8_t reserved9; 786*0aeed3e9SJustin Hibbits volatile uint32_t frm_cnt:24; 787*0aeed3e9SJustin Hibbits volatile uint32_t reserved10; 788*0aeed3e9SJustin Hibbits volatile uint16_t ra1_sfdr; /* QM_MCR_NP_RA1_*** */ 789*0aeed3e9SJustin Hibbits volatile uint16_t ra2_sfdr; /* QM_MCR_NP_RA2_*** */ 790*0aeed3e9SJustin Hibbits volatile uint16_t reserved11; 791*0aeed3e9SJustin Hibbits volatile uint16_t od1_sfdr; /* QM_MCR_NP_OD1_*** */ 792*0aeed3e9SJustin Hibbits volatile uint16_t od2_sfdr; /* QM_MCR_NP_OD2_*** */ 793*0aeed3e9SJustin Hibbits volatile uint16_t od3_sfdr; /* QM_MCR_NP_OD3_*** */ 794*0aeed3e9SJustin Hibbits } _PackedType queryfq_np; 795*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_alterfq { 796*0aeed3e9SJustin Hibbits volatile uint8_t fqs; /* Frame Queue Status */ 797*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[61]; 798*0aeed3e9SJustin Hibbits } _PackedType alterfq; 799*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_initcgr { 800*0aeed3e9SJustin Hibbits volatile uint8_t reserved1[62]; 801*0aeed3e9SJustin Hibbits } _PackedType initcgr; 802*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_querycgr { 803*0aeed3e9SJustin Hibbits volatile uint16_t reserved1; 804*0aeed3e9SJustin Hibbits volatile struct __qm_mc_cgr cgr; /* CGR fields */ 805*0aeed3e9SJustin Hibbits volatile uint8_t reserved2[3]; 806*0aeed3e9SJustin Hibbits volatile uint32_t reserved3:24; 807*0aeed3e9SJustin Hibbits volatile uint32_t i_bcnt_hi:8;/* high 8-bits of 40-bit "Instant" */ 808*0aeed3e9SJustin Hibbits volatile uint32_t i_bcnt_lo; /* low 32-bits of 40-bit */ 809*0aeed3e9SJustin Hibbits volatile uint32_t reserved4:24; 810*0aeed3e9SJustin Hibbits volatile uint32_t a_bcnt_hi:8;/* high 8-bits of 40-bit "Average" */ 811*0aeed3e9SJustin Hibbits volatile uint32_t a_bcnt_lo; /* low 32-bits of 40-bit */ 812*0aeed3e9SJustin Hibbits volatile uint32_t lgt; /* Last Group Tick */ 813*0aeed3e9SJustin Hibbits volatile uint8_t reserved5[12]; 814*0aeed3e9SJustin Hibbits } _PackedType querycgr; 815*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_querycongestion { 816*0aeed3e9SJustin Hibbits volatile uint8_t reserved[30]; 817*0aeed3e9SJustin Hibbits /* Access this struct using QM_MCR_QUERYCONGESTION() */ 818*0aeed3e9SJustin Hibbits _Packed struct __qm_mcr_querycongestion { 819*0aeed3e9SJustin Hibbits volatile uint32_t __state[8]; 820*0aeed3e9SJustin Hibbits } _PackedType state; 821*0aeed3e9SJustin Hibbits } _PackedType querycongestion; 822*0aeed3e9SJustin Hibbits _Packed struct qm_mcr_querywq { 823*0aeed3e9SJustin Hibbits _Packed union { 824*0aeed3e9SJustin Hibbits volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */ 825*0aeed3e9SJustin Hibbits _Packed struct { 826*0aeed3e9SJustin Hibbits volatile uint16_t id:13; /* enum qm_channel */ 827*0aeed3e9SJustin Hibbits volatile uint16_t reserved:3; 828*0aeed3e9SJustin Hibbits } _PackedType channel; 829*0aeed3e9SJustin Hibbits } _PackedType; 830*0aeed3e9SJustin Hibbits volatile uint8_t reserved[28]; 831*0aeed3e9SJustin Hibbits volatile uint32_t wq_len[8]; 832*0aeed3e9SJustin Hibbits } _PackedType querywq; 833*0aeed3e9SJustin Hibbits } _PackedType; 834*0aeed3e9SJustin Hibbits } _PackedType; 835*0aeed3e9SJustin Hibbits 836*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_RRID 0x80 837*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_MASK QM_MCC_VERB_MASK 838*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_PARKED QM_MCC_VERB_INITFQ_PARKED 839*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_SCHED QM_MCC_VERB_INITFQ_SCHED 840*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ QM_MCC_VERB_QUERYFQ 841*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ_NP QM_MCC_VERB_QUERYFQ_NP 842*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ QM_MCC_VERB_QUERYWQ 843*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ_DEDICATED QM_MCC_VERB_QUERYWQ_DEDICATED 844*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_SCHED QM_MCC_VERB_ALTER_SCHED 845*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_FE QM_MCC_VERB_ALTER_FE 846*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE QM_MCC_VERB_ALTER_RETIRE 847*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE_CTXB QM_MCC_VERB_ALTER_RETIRE_CTXB 848*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_OOS QM_MCC_VERB_ALTER_OOS 849*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_NULL 0x00 850*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_OK 0xf0 851*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQID 0xf1 852*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQSTATE 0xf2 853*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_NOTEMPTY 0xf3 /* OOS fails if FQ is !empty */ 854*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCHANNEL 0xf4 855*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_PENDING 0xf8 856*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCOMMAND 0xff 857*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_FE 0x10 858*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_R 0x08 859*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_MASK 0x07 /* Reads FQD::STATE; */ 860*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_OOS 0x00 861*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_RETIRED 0x01 862*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TEN_SCHED 0x02 863*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TRU_SCHED 0x03 864*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_PARKED 0x04 865*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_ACTIVE 0x05 866*0aeed3e9SJustin Hibbits #define QM_MCR_NP_PTR_MASK 0x07ff /* for RA[12] & OD[123] */ 867*0aeed3e9SJustin Hibbits #define QM_MCR_NP_RA1_NRA(v) (((v) >> 14) & 0x3) /* FQD::NRA */ 868*0aeed3e9SJustin Hibbits #define QM_MCR_NP_RA2_IT(v) (((v) >> 14) & 0x1) /* FQD::IT */ 869*0aeed3e9SJustin Hibbits #define QM_MCR_NP_OD1_NOD(v) (((v) >> 14) & 0x3) /* FQD::NOD */ 870*0aeed3e9SJustin Hibbits #define QM_MCR_NP_OD3_NPC(v) (((v) >> 14) & 0x3) /* FQD::NPC */ 871*0aeed3e9SJustin Hibbits #define QM_MCR_FQS_ORLPRESENT 0x02 /* ORL fragments to come */ 872*0aeed3e9SJustin Hibbits #define QM_MCR_FQS_NOTEMPTY 0x01 /* FQ has enqueued frames */ 873*0aeed3e9SJustin Hibbits 874*0aeed3e9SJustin Hibbits #define MEM_MAP_END 875*0aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__) 876*0aeed3e9SJustin Hibbits #pragma pack(pop) 877*0aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */ 878*0aeed3e9SJustin Hibbits 879*0aeed3e9SJustin Hibbits 880*0aeed3e9SJustin Hibbits /* This extracts the state for congestion group 'n' from a query response. 881*0aeed3e9SJustin Hibbits * Eg. 882*0aeed3e9SJustin Hibbits * uint8_t cgr = [...]; 883*0aeed3e9SJustin Hibbits * struct qm_mc_result *res = [...]; 884*0aeed3e9SJustin Hibbits * printf("congestion group %d congestion state: %d\n", cgr, 885*0aeed3e9SJustin Hibbits * QM_MCR_QUERYCONGESTION(&res->querycongestion.state, cgr)); 886*0aeed3e9SJustin Hibbits */ 887*0aeed3e9SJustin Hibbits #define __CGR_WORD(num) (num >> 5) 888*0aeed3e9SJustin Hibbits #define __CGR_SHIFT(num) (num & 0x1f) 889*0aeed3e9SJustin Hibbits static __inline__ int QM_MCR_QUERYCONGESTION(struct __qm_mcr_querycongestion *p, 890*0aeed3e9SJustin Hibbits uint8_t cgr) 891*0aeed3e9SJustin Hibbits { 892*0aeed3e9SJustin Hibbits return (int)(p->__state[__CGR_WORD(cgr)] & (0x80000000 >> __CGR_SHIFT(cgr))); 893*0aeed3e9SJustin Hibbits } 894*0aeed3e9SJustin Hibbits 895*0aeed3e9SJustin Hibbits 896*0aeed3e9SJustin Hibbits /*********************/ 897*0aeed3e9SJustin Hibbits /* Utility interface */ 898*0aeed3e9SJustin Hibbits /*********************/ 899*0aeed3e9SJustin Hibbits 900*0aeed3e9SJustin Hibbits /* Represents an allocator over a range of FQIDs. NB, accesses are not locked, 901*0aeed3e9SJustin Hibbits * spinlock them yourself if needed. */ 902*0aeed3e9SJustin Hibbits struct qman_fqid_pool; 903*0aeed3e9SJustin Hibbits 904*0aeed3e9SJustin Hibbits /* Create/destroy a FQID pool, num must be a multiple of 32. NB, _destroy() 905*0aeed3e9SJustin Hibbits * always succeeds, but returns non-zero if there were "leaked" FQID 906*0aeed3e9SJustin Hibbits * allocations. */ 907*0aeed3e9SJustin Hibbits struct qman_fqid_pool *qman_fqid_pool_create(uint32_t fqid_start, uint32_t num); 908*0aeed3e9SJustin Hibbits int qman_fqid_pool_destroy(struct qman_fqid_pool *pool); 909*0aeed3e9SJustin Hibbits /* Alloc/free a FQID from the range. _alloc() returns zero for success. */ 910*0aeed3e9SJustin Hibbits int qman_fqid_pool_alloc(struct qman_fqid_pool *pool, uint32_t *fqid); 911*0aeed3e9SJustin Hibbits void qman_fqid_pool_free(struct qman_fqid_pool *pool, uint32_t fqid); 912*0aeed3e9SJustin Hibbits uint32_t qman_fqid_pool_used(struct qman_fqid_pool *pool); 913*0aeed3e9SJustin Hibbits 914*0aeed3e9SJustin Hibbits /*******************************************************************/ 915*0aeed3e9SJustin Hibbits /* Managed (aka "shared" or "mux/demux") portal, high-level i/face */ 916*0aeed3e9SJustin Hibbits /*******************************************************************/ 917*0aeed3e9SJustin Hibbits 918*0aeed3e9SJustin Hibbits /* Congestion Groups */ 919*0aeed3e9SJustin Hibbits /* ----------------- */ 920*0aeed3e9SJustin Hibbits /* This wrapper represents a bit-array for the state of the 256 Qman congestion 921*0aeed3e9SJustin Hibbits * groups. Is also used as a *mask* for congestion groups, eg. so we ignore 922*0aeed3e9SJustin Hibbits * those that don't concern us. We harness the structure and accessor details 923*0aeed3e9SJustin Hibbits * already used in the management command to query congestion groups. */ 924*0aeed3e9SJustin Hibbits struct qman_cgrs { 925*0aeed3e9SJustin Hibbits struct __qm_mcr_querycongestion q; 926*0aeed3e9SJustin Hibbits }; 927*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_INIT(struct qman_cgrs *c) 928*0aeed3e9SJustin Hibbits { 929*0aeed3e9SJustin Hibbits memset(c, 0, sizeof(*c)); 930*0aeed3e9SJustin Hibbits } 931*0aeed3e9SJustin Hibbits static __inline__ int QMAN_CGRS_GET(struct qman_cgrs *c, int num) 932*0aeed3e9SJustin Hibbits { 933*0aeed3e9SJustin Hibbits return QM_MCR_QUERYCONGESTION(&c->q, (uint8_t)num); 934*0aeed3e9SJustin Hibbits } 935*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_SET(struct qman_cgrs *c, int num) 936*0aeed3e9SJustin Hibbits { 937*0aeed3e9SJustin Hibbits c->q.__state[__CGR_WORD(num)] |= (0x80000000 >> __CGR_SHIFT(num)); 938*0aeed3e9SJustin Hibbits } 939*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_UNSET(struct qman_cgrs *c, int num) 940*0aeed3e9SJustin Hibbits { 941*0aeed3e9SJustin Hibbits c->q.__state[__CGR_WORD(num)] &= ~(0x80000000 >> __CGR_SHIFT(num)); 942*0aeed3e9SJustin Hibbits } 943*0aeed3e9SJustin Hibbits 944*0aeed3e9SJustin Hibbits /* Portal and Frame Queues */ 945*0aeed3e9SJustin Hibbits /* ----------------------- */ 946*0aeed3e9SJustin Hibbits 947*0aeed3e9SJustin Hibbits /* This object type represents Qman frame queue descriptors (FQD), and is 948*0aeed3e9SJustin Hibbits * stored within a cacheline passed to qman_new_fq(). */ 949*0aeed3e9SJustin Hibbits struct qman_fq; 950*0aeed3e9SJustin Hibbits 951*0aeed3e9SJustin Hibbits /* This enum, and the callback type that returns it, are used when handling 952*0aeed3e9SJustin Hibbits * dequeued frames via DQRR. Note that for "null" callbacks registered with the 953*0aeed3e9SJustin Hibbits * portal object (for handling dequeues that do not demux because contextB is 954*0aeed3e9SJustin Hibbits * NULL), the return value *MUST* be qman_cb_dqrr_consume. */ 955*0aeed3e9SJustin Hibbits enum qman_cb_dqrr_result { 956*0aeed3e9SJustin Hibbits /* DQRR entry can be consumed */ 957*0aeed3e9SJustin Hibbits qman_cb_dqrr_consume, 958*0aeed3e9SJustin Hibbits /* DQRR entry cannot be consumed now, pause until next poll request */ 959*0aeed3e9SJustin Hibbits qman_cb_dqrr_pause, 960*0aeed3e9SJustin Hibbits /* Like _consume, but requests parking - FQ must be held-active */ 961*0aeed3e9SJustin Hibbits qman_cb_dqrr_park, 962*0aeed3e9SJustin Hibbits /* Does not consume, for DCA mode only. This allows out-of-order 963*0aeed3e9SJustin Hibbits * consumes by explicit calls to qman_dca() and/or the use of implicit 964*0aeed3e9SJustin Hibbits * DCA via EQCR entries. */ 965*0aeed3e9SJustin Hibbits qman_cb_dqrr_defer 966*0aeed3e9SJustin Hibbits }; 967*0aeed3e9SJustin Hibbits 968*0aeed3e9SJustin Hibbits /*typedef enum qman_cb_dqrr_result (*qman_cb_dqrr)(t_Handle h_Arg, 969*0aeed3e9SJustin Hibbits t_Handle h_QmPortal, 970*0aeed3e9SJustin Hibbits struct qman_fq *fq, 971*0aeed3e9SJustin Hibbits const struct qm_dqrr_entry *dqrr);*/ 972*0aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_dqrr; 973*0aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_fqs; 974*0aeed3e9SJustin Hibbits typedef t_QmRejectedFrameCallback * qman_cb_ern; 975*0aeed3e9SJustin Hibbits /* This callback type is used when handling ERNs, FQRNs and FQRLs via MR. They 976*0aeed3e9SJustin Hibbits * are always consumed after the callback returns. */ 977*0aeed3e9SJustin Hibbits typedef void (*qman_cb_mr)(t_Handle h_Arg, 978*0aeed3e9SJustin Hibbits t_Handle h_QmPortal, 979*0aeed3e9SJustin Hibbits struct qman_fq *fq, 980*0aeed3e9SJustin Hibbits const struct qm_mr_entry *msg); 981*0aeed3e9SJustin Hibbits 982*0aeed3e9SJustin Hibbits struct qman_fq_cb { 983*0aeed3e9SJustin Hibbits qman_cb_dqrr dqrr; /* for dequeued frames */ 984*0aeed3e9SJustin Hibbits qman_cb_ern ern; /* for s/w ERNs */ 985*0aeed3e9SJustin Hibbits qman_cb_mr dc_ern; /* for diverted h/w ERNs */ 986*0aeed3e9SJustin Hibbits qman_cb_mr fqs; /* frame-queue state changes*/ 987*0aeed3e9SJustin Hibbits }; 988*0aeed3e9SJustin Hibbits 989*0aeed3e9SJustin Hibbits enum qman_fq_state { 990*0aeed3e9SJustin Hibbits qman_fq_state_oos, 991*0aeed3e9SJustin Hibbits qman_fq_state_waiting_parked, 992*0aeed3e9SJustin Hibbits qman_fq_state_parked, 993*0aeed3e9SJustin Hibbits qman_fq_state_sched, 994*0aeed3e9SJustin Hibbits qman_fq_state_retired 995*0aeed3e9SJustin Hibbits }; 996*0aeed3e9SJustin Hibbits 997*0aeed3e9SJustin Hibbits /* Flags to qman_create_portal() */ 998*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ 0x00000001 /* use interrupt handler */ 999*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_FAST 0x00000002 /* ... for fast-path too! */ 1000*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_SLOW 0x00000003 /* ... for slow-path too! */ 1001*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DCA 0x00000004 /* use DCA */ 1002*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_LOCKED 0x00000008 /* multi-core locking */ 1003*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_NOTAFFINE 0x00000010 /* not cpu-default portal */ 1004*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RSTASH 0x00000020 /* enable DQRR entry stashing */ 1005*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DSTASH 0x00000040 /* enable data stashing */ 1006*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RECOVER 0x00000080 /* recovery mode */ 1007*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT 0x00000100 /* for recovery; can wait */ 1008*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT_INT 0x00000200 /* for wait; interruptible */ 1009*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_CACHE 0x00000400 /* use cachable area for EQCR/DQRR */ 1010*0aeed3e9SJustin Hibbits 1011*0aeed3e9SJustin Hibbits /* Flags to qman_create_fq() */ 1012*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_ENQUEUE 0x00000001 /* can't enqueue */ 1013*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_MODIFY 0x00000002 /* can only enqueue */ 1014*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_TO_DCPORTAL 0x00000004 /* consumed by CAAM/PME/Fman */ 1015*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_LOCKED 0x00000008 /* multi-core locking */ 1016*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_RECOVER 0x00000010 /* recovery mode */ 1017*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_DYNAMIC_FQID 0x00000020 /* (de)allocate fqid */ 1018*0aeed3e9SJustin Hibbits 1019*0aeed3e9SJustin Hibbits /* Flags to qman_destroy_fq() */ 1020*0aeed3e9SJustin Hibbits #define QMAN_FQ_DESTROY_PARKED 0x00000001 /* FQ can be parked or OOS */ 1021*0aeed3e9SJustin Hibbits 1022*0aeed3e9SJustin Hibbits /* Flags from qman_fq_state() */ 1023*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CHANGING 0x80000000 /* 'state' is changing */ 1024*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_NE 0x40000000 /* retired FQ isn't empty */ 1025*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_ORL 0x20000000 /* retired FQ has ORL */ 1026*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_BLOCKOOS 0xe0000000 /* if any are set, no OOS */ 1027*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CGR_EN 0x10000000 /* CGR enabled */ 1028*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_VDQCR 0x08000000 /* being volatile dequeued */ 1029*0aeed3e9SJustin Hibbits 1030*0aeed3e9SJustin Hibbits /* Flags to qman_init_fq() */ 1031*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_SCHED 0x00000001 /* schedule rather than park */ 1032*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_NULL 0x00000002 /* zero 'contextB', no demux */ 1033*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_LOCAL 0x00000004 /* set dest portal */ 1034*0aeed3e9SJustin Hibbits 1035*0aeed3e9SJustin Hibbits /* Flags to qman_volatile_dequeue() */ 1036*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT_INT 0x00000001 /* if we wait, interruptible? */ 1037*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT 0x00000002 /* wait if VDQCR is in use */ 1038*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_FINISH 0x00000004 /* wait till VDQCR completes */ 1039*0aeed3e9SJustin Hibbits 1040*0aeed3e9SJustin Hibbits /* Flags to qman_enqueue(). NB, the strange numbering is to align with 1041*0aeed3e9SJustin Hibbits * hardware, bit-wise. */ 1042*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT 0x00010000 /* wait if EQCR is full */ 1043*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_INT 0x00020000 /* if wait, interruptible? */ 1044*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_SYNC 0x00040000 /* if wait, until consumed? */ 1045*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WATCH_CGR 0x00080000 /* watch congestion state */ 1046*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_INTERRUPT 0x00000004 /* on command consumption */ 1047*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA 0x00008000 /* perform enqueue-DCA */ 1048*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PARK 0x00004000 /* If DCA, requests park */ 1049*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PTR(p) /* If DCA, p is DQRR entry */ \ 1050*0aeed3e9SJustin Hibbits (((uint32_t)(p) << 2) & 0x00000f00) 1051*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_GREEN 0x00000000 /* choose one C_*** flag */ 1052*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_YELLOW 0x00000008 1053*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_RED 0x00000010 1054*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_OVERRIDE 0x00000018 1055*0aeed3e9SJustin Hibbits /* For the ORP-specific qman_enqueue_orp() variant, this flag indicates "Not 1056*0aeed3e9SJustin Hibbits * Last In Sequence", ie. a non-terminating fragment. */ 1057*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NLIS 0x01000000 1058*0aeed3e9SJustin Hibbits /* - this flag performs no enqueue but fills in an ORP sequence number that 1059*0aeed3e9SJustin Hibbits * would otherwise block it (eg. if a frame has been dropped). */ 1060*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_HOLE 0x02000000 1061*0aeed3e9SJustin Hibbits /* - this flag performs no enqueue but advances NESN to the given sequence 1062*0aeed3e9SJustin Hibbits * number. */ 1063*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NESN 0x04000000 1064*0aeed3e9SJustin Hibbits 1065*0aeed3e9SJustin Hibbits /* FQ management */ 1066*0aeed3e9SJustin Hibbits /* ------------- */ 1067*0aeed3e9SJustin Hibbits /** 1068*0aeed3e9SJustin Hibbits * qman_free_fq - Deallocates a FQ 1069*0aeed3e9SJustin Hibbits * @fq: the frame queue object to release 1070*0aeed3e9SJustin Hibbits * @flags: bit-mask of QMAN_FQ_FREE_*** options 1071*0aeed3e9SJustin Hibbits * 1072*0aeed3e9SJustin Hibbits * The memory for this frame queue object ('mem' provided in qman_new_fq()) is 1073*0aeed3e9SJustin Hibbits * not deallocated but the caller regains ownership, to do with as desired. The 1074*0aeed3e9SJustin Hibbits * FQ must be in the 'out-of-service' state unless the QMAN_FQ_FREE_PARKED flag 1075*0aeed3e9SJustin Hibbits * is specified, in which case it may also be in the 'parked' state. 1076*0aeed3e9SJustin Hibbits */ 1077*0aeed3e9SJustin Hibbits void qman_free_fq(struct qman_fq *fq, uint32_t flags); 1078*0aeed3e9SJustin Hibbits 1079*0aeed3e9SJustin Hibbits /** 1080*0aeed3e9SJustin Hibbits * qman_fq_fqid - Queries the frame queue ID of a FQ object 1081*0aeed3e9SJustin Hibbits * @fq: the frame queue object to query 1082*0aeed3e9SJustin Hibbits */ 1083*0aeed3e9SJustin Hibbits uint32_t qman_fq_fqid(struct qman_fq *fq); 1084*0aeed3e9SJustin Hibbits 1085*0aeed3e9SJustin Hibbits /** 1086*0aeed3e9SJustin Hibbits * qman_fq_state - Queries the state of a FQ object 1087*0aeed3e9SJustin Hibbits * @fq: the frame queue object to query 1088*0aeed3e9SJustin Hibbits * @state: pointer to state enum to return the FQ scheduling state 1089*0aeed3e9SJustin Hibbits * @flags: pointer to state flags to receive QMAN_FQ_STATE_*** bitmask 1090*0aeed3e9SJustin Hibbits * 1091*0aeed3e9SJustin Hibbits * Queries the state of the FQ object, without performing any h/w commands. 1092*0aeed3e9SJustin Hibbits * This captures the state, as seen by the driver, at the time the function 1093*0aeed3e9SJustin Hibbits * executes. 1094*0aeed3e9SJustin Hibbits */ 1095*0aeed3e9SJustin Hibbits void qman_fq_state(struct qman_fq *fq, enum qman_fq_state *state, uint32_t *flags); 1096*0aeed3e9SJustin Hibbits 1097*0aeed3e9SJustin Hibbits #endif /* __FSL_QMAN_H */ 1098