The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ncsw/Peripherals/BM/fsl_bman.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /******************************************************************************
    2 
    3  © 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
    4  All rights reserved.
    5 
    6  This is proprietary source code of Freescale Semiconductor Inc.,
    7  and its use is subject to the NetComm Device Drivers EULA.
    8  The copyright notice above does not evidence any actual or intended
    9  publication of such source code.
   10 
   11  ALTERNATIVELY, redistribution and use in source and binary forms, with
   12  or without modification, are permitted provided that the following
   13  conditions are met:
   14      * Redistributions of source code must retain the above copyright
   15        notice, this list of conditions and the following disclaimer.
   16      * Redistributions in binary form must reproduce the above copyright
   17        notice, this list of conditions and the following disclaimer in the
   18        documentation and/or other materials provided with the distribution.
   19      * Neither the name of Freescale Semiconductor nor the
   20        names of its contributors may be used to endorse or promote products
   21        derived from this software without specific prior written permission.
   22 
   23  THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
   24  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   25  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   26  DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
   27  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   28  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   29  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   30  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   31  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   32  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   33  *
   34 
   35  **************************************************************************/
   36 /******************************************************************************
   37  @File          fsl_bman.h
   38 
   39  @Description   BM header
   40 *//***************************************************************************/
   41 #ifndef __FSL_BMAN_H
   42 #define __FSL_BMAN_H
   43 
   44 #include "std_ext.h"
   45 
   46 
   47 /*************************************************/
   48 /*   BMan s/w corenet portal, low-level i/face   */
   49 /*************************************************/
   50 typedef enum {
   51     e_BmPortalPCI = 0,          /* PI index, cache-inhibited */
   52     e_BmPortalPCE,              /* PI index, cache-enabled */
   53     e_BmPortalPVB               /* valid-bit */
   54 } e_BmPortalProduceMode;
   55 
   56 typedef enum {
   57     e_BmPortalRcrCCI = 0,      /* CI index, cache-inhibited */
   58     e_BmPortalRcrCCE           /* CI index, cache-enabled */
   59 } e_BmPortalRcrConsumeMode;
   60 
   61 /* Portal constants */
   62 #define BM_RCR_SIZE        8
   63 
   64 /* Hardware constants */
   65 enum bm_isr_reg {
   66     bm_isr_status = 0,
   67     bm_isr_enable = 1,
   68     bm_isr_disable = 2,
   69     bm_isr_inhibit = 3
   70 };
   71 
   72 /* Represents s/w corenet portal mapped data structures */
   73 struct bm_rcr_entry;    /* RCR (Release Command Ring) entries */
   74 struct bm_mc_command;    /* MC (Management Command) command */
   75 struct bm_mc_result;    /* MC result */
   76 
   77 /* This type represents a s/w corenet portal space, and is used for creating the
   78  * portal objects within it (RCR, etc) */
   79 struct bm_portal;
   80 
   81 /* This wrapper represents a bit-array for the depletion state of the 64 Bman
   82  * buffer pools. */
   83 struct bman_depletion {
   84     uint32_t __state[2];
   85 };
   86 #define __bmdep_word(x) ((x) >> 5)
   87 #define __bmdep_shift(x) ((x) & 0x1f)
   88 #define __bmdep_bit(x) (0x80000000 >> __bmdep_shift(x))
   89 static __inline__ void bman_depletion_init(struct bman_depletion *c)
   90 {
   91     c->__state[0] = c->__state[1] = 0;
   92 }
   93 static __inline__ void bman_depletion_fill(struct bman_depletion *c)
   94 {
   95     c->__state[0] = c->__state[1] = (uint32_t)~0;
   96 }
   97 static __inline__ int bman_depletion_get(const struct bman_depletion *c, uint8_t bpid)
   98 {
   99     return (int)(c->__state[__bmdep_word(bpid)] & __bmdep_bit(bpid));
  100 }
  101 static __inline__ void bman_depletion_set(struct bman_depletion *c, uint8_t bpid)
  102 {
  103     c->__state[__bmdep_word(bpid)] |= __bmdep_bit(bpid);
  104 }
  105 static __inline__ void bman_depletion_unset(struct bman_depletion *c, uint8_t bpid)
  106 {
  107     c->__state[__bmdep_word(bpid)] &= ~__bmdep_bit(bpid);
  108 }
  109 
  110 /* ------------------------------ */
  111 /* --- Portal enumeration API --- */
  112 
  113 /* ------------------------------ */
  114 /* --- Buffer pool allocation --- */
  115 #define BM_POOL_THRESH_SW_ENTER 0
  116 #define BM_POOL_THRESH_SW_EXIT  1
  117 #define BM_POOL_THRESH_HW_ENTER 2
  118 #define BM_POOL_THRESH_HW_EXIT  3
  119 
  120 /* --------------- */
  121 /* --- RCR API --- */
  122 
  123 /* Create/destroy */
  124 t_Error bm_rcr_init(struct bm_portal *portal,
  125                     e_BmPortalProduceMode pmode,
  126                     e_BmPortalRcrConsumeMode cmode);
  127 void bm_rcr_finish(struct bm_portal *portal);
  128 
  129 /* Start/abort RCR entry */
  130 struct bm_rcr_entry *bm_rcr_start(struct bm_portal *portal);
  131 void bm_rcr_abort(struct bm_portal *portal);
  132 
  133 /* For PI modes only. This presumes a started but uncommitted RCR entry. If
  134  * there's no more room in the RCR, this function returns NULL. Otherwise it
  135  * returns the next RCR entry and increments an internal PI counter without
  136  * flushing it to h/w. */
  137 struct bm_rcr_entry *bm_rcr_pend_and_next(struct bm_portal *portal, uint8_t myverb);
  138 
  139 /* Commit RCR entries, including pending ones (aka "write PI") */
  140 void bm_rcr_pci_commit(struct bm_portal *portal, uint8_t myverb);
  141 void bm_rcr_pce_prefetch(struct bm_portal *portal);
  142 void bm_rcr_pce_commit(struct bm_portal *portal, uint8_t myverb);
  143 void bm_rcr_pvb_commit(struct bm_portal *portal, uint8_t myverb);
  144 
  145 /* Track h/w consumption. Returns non-zero if h/w had consumed previously
  146  * unconsumed RCR entries. */
  147 uint8_t bm_rcr_cci_update(struct bm_portal *portal);
  148 void bm_rcr_cce_prefetch(struct bm_portal *portal);
  149 uint8_t bm_rcr_cce_update(struct bm_portal *portal);
  150 /* Returns the number of available RCR entries */
  151 uint8_t bm_rcr_get_avail(struct bm_portal *portal);
  152 /* Returns the number of unconsumed RCR entries */
  153 uint8_t bm_rcr_get_fill(struct bm_portal *portal);
  154 
  155 /* Read/write the RCR interrupt threshold */
  156 uint8_t bm_rcr_get_ithresh(struct bm_portal *portal);
  157 void bm_rcr_set_ithresh(struct bm_portal *portal, uint8_t ithresh);
  158 
  159 
  160 /* ------------------------------ */
  161 /* --- Management command API --- */
  162 
  163 /* Create/destroy */
  164 t_Error bm_mc_init(struct bm_portal *portal);
  165 void bm_mc_finish(struct bm_portal *portal);
  166 
  167 /* Start/abort mgmt command */
  168 struct bm_mc_command *bm_mc_start(struct bm_portal *portal);
  169 void bm_mc_abort(struct bm_portal *portal);
  170 
  171 /* Writes 'verb' with appropriate 'vbit'. Invalidates and pre-fetches the
  172  * response. */
  173 void bm_mc_commit(struct bm_portal *portal, uint8_t myverb);
  174 
  175 /* Poll for result. If NULL, invalidates and prefetches for the next call. */
  176 struct bm_mc_result *bm_mc_result(struct bm_portal *portal);
  177 
  178 
  179 /* ------------------------------------- */
  180 /* --- Portal interrupt register API --- */
  181 
  182 /* For a quick explanation of the Bman interrupt model, see the comments in the
  183  * equivalent section of the qman_portal.h header.
  184  */
  185 
  186 /* Create/destroy */
  187 t_Error bm_isr_init(struct bm_portal *portal);
  188 void bm_isr_finish(struct bm_portal *portal);
  189 
  190 /* BSCN masking is a per-portal configuration */
  191 void bm_isr_bscn_mask(struct bm_portal *portal, uint8_t bpid, int enable);
  192 
  193 /* Used by all portal interrupt registers except 'inhibit' */
  194 #define BM_PIRQ_RCRI    0x00000002    /* RCR Ring (below threshold) */
  195 #define BM_PIRQ_BSCN    0x00000001    /* Buffer depletion State Change */
  196 
  197 /* These are bm_<reg>_<verb>(). So for example, bm_disable_write() means "write
  198  * the disable register" rather than "disable the ability to write". */
  199 #define bm_isr_status_read(bm)      __bm_isr_read(bm, bm_isr_status)
  200 #define bm_isr_status_clear(bm, m)  __bm_isr_write(bm, bm_isr_status, m)
  201 #define bm_isr_enable_read(bm)      __bm_isr_read(bm, bm_isr_enable)
  202 #define bm_isr_enable_write(bm, v)  __bm_isr_write(bm, bm_isr_enable, v)
  203 #define bm_isr_disable_read(bm)     __bm_isr_read(bm, bm_isr_disable)
  204 #define bm_isr_disable_write(bm, v) __bm_isr_write(bm, bm_isr_disable, v)
  205 #define bm_isr_inhibit(bm)          __bm_isr_write(bm, bm_isr_inhibit, 1)
  206 #define bm_isr_uninhibit(bm)        __bm_isr_write(bm, bm_isr_inhibit, 0)
  207 
  208 /* Don't use these, use the wrappers above*/
  209 uint32_t __bm_isr_read(struct bm_portal *portal, enum bm_isr_reg n);
  210 void __bm_isr_write(struct bm_portal *portal, enum bm_isr_reg n, uint32_t val);
  211 
  212 /* ------------------------------------------------------- */
  213 /* --- Bman data structures (and associated constants) --- */
  214 /* Code-reduction, define a wrapper for 48-bit buffers. In cases where a buffer
  215  * pool id specific to this buffer is needed (BM_RCR_VERB_CMD_BPID_MULTI,
  216  * BM_MCC_VERB_ACQUIRE), the 'bpid' field is used. */
  217 
  218 #define BM_RCR_VERB_VBIT                0x80
  219 #define BM_RCR_VERB_CMD_MASK            0x70    /* one of two values; */
  220 #define BM_RCR_VERB_CMD_BPID_SINGLE     0x20
  221 #define BM_RCR_VERB_CMD_BPID_MULTI      0x30
  222 #define BM_RCR_VERB_BUFCOUNT_MASK       0x0f    /* values 1..8 */
  223 
  224 #define BM_MCC_VERB_VBIT                0x80
  225 #define BM_MCC_VERB_CMD_MASK            0x70    /* where the verb contains; */
  226 #define BM_MCC_VERB_CMD_ACQUIRE         0x10
  227 #define BM_MCC_VERB_CMD_QUERY           0x40
  228 #define BM_MCC_VERB_ACQUIRE_BUFCOUNT    0x0f    /* values 1..8 go here */
  229 
  230 
  231 #if defined(__MWERKS__) && !defined(__GNUC__)
  232 #pragma pack(push,1)
  233 #endif /* defined(__MWERKS__) && ... */
  234 #define MEM_MAP_START
  235 
  236 _Packed struct bm_buffer {
  237     volatile uint8_t reserved1;
  238     volatile uint8_t bpid;
  239     volatile uint16_t hi;    /* High 16-bits of 48-bit address */
  240     volatile uint32_t lo;    /* Low 32-bits of 48-bit address */
  241 } _PackedType;
  242 
  243 /* See 1.5.3.5.4: "Release Command" */
  244 _Packed struct bm_rcr_entry {
  245     _Packed union {
  246         _Packed struct {
  247             volatile uint8_t __dont_write_directly__verb;
  248             volatile uint8_t bpid; /* used with BM_RCR_VERB_CMD_BPID_SINGLE */
  249             volatile uint8_t reserved1[62];
  250         } _PackedType;
  251         volatile struct bm_buffer bufs[8];
  252     } _PackedType;
  253 } _PackedType;
  254 
  255 /* See 1.5.3.1: "Acquire Command" */
  256 /* See 1.5.3.2: "Query Command" */
  257 _Packed struct bm_mc_command {
  258     volatile uint8_t __dont_write_directly__verb;
  259     _Packed union {
  260         _Packed struct bm_mcc_acquire {
  261             volatile uint8_t bpid;
  262             volatile uint8_t reserved1[62];
  263         } _PackedType acquire;
  264         _Packed struct bm_mcc_query {
  265             volatile uint8_t reserved1[63];
  266         } _PackedType query;
  267     } _PackedType;
  268 } _PackedType;
  269 
  270 /* See 1.5.3.3: "Acquire Reponse" */
  271 /* See 1.5.3.4: "Query Reponse" */
  272 _Packed struct bm_mc_result {
  273     _Packed union {
  274         _Packed struct {
  275             volatile uint8_t verb;
  276             volatile uint8_t reserved1[63];
  277         } _PackedType;
  278         _Packed union {
  279             _Packed struct {
  280                 volatile uint8_t reserved1;
  281                 volatile uint8_t bpid;
  282                 volatile uint8_t reserved2[62];
  283             } _PackedType;
  284             volatile struct bm_buffer bufs[8];
  285         } _PackedType acquire;
  286         _Packed struct {
  287             volatile uint8_t reserved1[32];
  288             /* "availability state" and "depletion state" */
  289             _Packed struct {
  290                 volatile uint8_t reserved1[8];
  291                 /* Access using bman_depletion_***() */
  292                 volatile struct bman_depletion state;
  293             } _PackedType as, ds;
  294         } _PackedType query;
  295     } _PackedType;
  296 } _PackedType;
  297 
  298 #define MEM_MAP_END
  299 #if defined(__MWERKS__) && !defined(__GNUC__)
  300 #pragma pack(pop)
  301 #endif /* defined(__MWERKS__) && ... */
  302 
  303 
  304 #define BM_MCR_VERB_VBIT                0x80
  305 #define BM_MCR_VERB_CMD_MASK            BM_MCC_VERB_CMD_MASK
  306 #define BM_MCR_VERB_CMD_ACQUIRE         BM_MCC_VERB_CMD_ACQUIRE
  307 #define BM_MCR_VERB_CMD_QUERY           BM_MCC_VERB_CMD_QUERY
  308 #define BM_MCR_VERB_CMD_ERR_INVALID     0x60
  309 #define BM_MCR_VERB_CMD_ERR_ECC         0x70
  310 #define BM_MCR_VERB_ACQUIRE_BUFCOUNT    BM_MCC_VERB_ACQUIRE_BUFCOUNT /* 0..8 */
  311 /* Determine the "availability state" of pool 'p' from a query result 'r' */
  312 #define BM_MCR_QUERY_AVAILABILITY(r,p) bman_depletion_get(&r->query.as.state,p)
  313 /* Determine the "depletion state" of pool 'p' from a query result 'r' */
  314 #define BM_MCR_QUERY_DEPLETION(r,p) bman_depletion_get(&r->query.ds.state,p)
  315 
  316 
  317 /* Portal and Buffer Pools */
  318 /* ----------------------- */
  319 
  320 /* Flags to bman_create_portal() */
  321 #define BMAN_PORTAL_FLAG_IRQ         0x00000001 /* use interrupt handler */
  322 #define BMAN_PORTAL_FLAG_IRQ_FAST    0x00000002 /* ... for fast-path too! */
  323 #define BMAN_PORTAL_FLAG_COMPACT     0x00000004 /* use compaction algorithm */
  324 #define BMAN_PORTAL_FLAG_RECOVER     0x00000008 /* recovery mode */
  325 #define BMAN_PORTAL_FLAG_WAIT        0x00000010 /* wait if RCR is full */
  326 #define BMAN_PORTAL_FLAG_WAIT_INT    0x00000020 /* if wait, interruptible? */
  327 #define BMAN_PORTAL_FLAG_CACHE       0x00000400 /* use cache-able area for rings */
  328 
  329 /* Flags to bman_new_pool() */
  330 #define BMAN_POOL_FLAG_NO_RELEASE    0x00000001 /* can't release to pool */
  331 #define BMAN_POOL_FLAG_ONLY_RELEASE  0x00000002 /* can only release to pool */
  332 #define BMAN_POOL_FLAG_DEPLETION     0x00000004 /* track depletion entry/exit */
  333 #define BMAN_POOL_FLAG_DYNAMIC_BPID  0x00000008 /* (de)allocate bpid */
  334 #define BMAN_POOL_FLAG_THRESH        0x00000010 /* set depletion thresholds */
  335 #define BMAN_POOL_FLAG_STOCKPILE     0x00000020 /* stockpile to reduce hw ops */
  336 
  337 /* Flags to bman_release() */
  338 #define BMAN_RELEASE_FLAG_WAIT       0x00000001 /* wait if RCR is full */
  339 #define BMAN_RELEASE_FLAG_WAIT_INT   0x00000002 /* if we wait, interruptible? */
  340 #define BMAN_RELEASE_FLAG_WAIT_SYNC  0x00000004 /* if wait, until consumed? */
  341 #define BMAN_RELEASE_FLAG_NOW        0x00000008 /* issue immediate release */
  342 
  343 /* Flags to bman_acquire() */
  344 #define BMAN_ACQUIRE_FLAG_STOCKPILE  0x00000001 /* no hw op, stockpile only */
  345 
  346 
  347 #endif /* __FSL_BMAN_H */

Cache object: 0140b09a345e03b89f4bd40cfbc2b552


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.