diff options
Diffstat (limited to 'cvmx-coremask.h')
-rw-r--r-- | cvmx-coremask.h | 168 |
1 files changed, 162 insertions, 6 deletions
diff --git a/cvmx-coremask.h b/cvmx-coremask.h index d0c5825fa2c9..7f19659a5e1e 100644 --- a/cvmx-coremask.h +++ b/cvmx-coremask.h @@ -1,5 +1,5 @@ /***********************license start*************** - * Copyright (c) 2003-2010 Cavium Networks (support@cavium.com). All rights + * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights * reserved. * * @@ -15,7 +15,7 @@ * disclaimer in the documentation and/or other materials provided * with the distribution. - * * Neither the name of Cavium Networks nor the names of + * * Neither the name of Cavium Inc. nor the names of * its contributors may be used to endorse or promote products * derived from this software without specific prior written * permission. @@ -26,7 +26,7 @@ * countries. * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" - * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR + * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM @@ -51,7 +51,7 @@ * initialization and differentiation of roles within a single shared binary * executable image. * - * <hr>$Revision: 49448 $<hr> + * <hr>$Revision: 70030 $<hr> * */ @@ -65,6 +65,162 @@ extern "C" { #endif +typedef uint64_t cvmx_coremask_holder_t; /* basic type to hold the + coremask bits */ + +#define CVMX_COREMASK_HLDRSZ ((int)(sizeof(cvmx_coremask_holder_t) * 8)) + /* bits per holder */ + +#define CVMX_COREMASK_BMPSZ ((int)(CVMX_MAX_CORES / CVMX_COREMASK_HLDRSZ + 1)) + /* bit map size */ + +/* + * The macro pair implement a way to iterate active cores in the mask. + * @param fec_pcm points to the coremask. + * @param fec_ppid is the active core's id. + */ +#define CVMX_COREMASK_FOR_EACH_CORE_BEGIN(fec_pcm, fec_ppid) \ + do { \ + int fec_i, fec_j; \ + \ + for (fec_i = 0; fec_i < CVMX_COREMASK_BMPSZ; fec_i++) \ + { \ + for (fec_j = 0; fec_j < CVMX_COREMASK_HLDRSZ; fec_j++) \ + { \ + if (((cvmx_coremask_holder_t)1 << fec_j) & \ + (fec_pcm)->coremask_bitmap[fec_i]) \ + { \ + fec_ppid = fec_i * CVMX_COREMASK_HLDRSZ + fec_j; + + +#define CVMX_COREMASK_FOR_EACH_CORE_END \ + } \ + } \ + } \ + } while (0) + +struct cvmx_coremask { + /* + * Big-endian. Array elems of larger indices represent cores of + * bigger ids. So do MSBs within a cvmx_coremask_holder_t. Ditto + * MSbs within a byte. + */ + cvmx_coremask_holder_t coremask_bitmap[CVMX_COREMASK_BMPSZ]; +}; + +/* + * Is ``core'' set in the coremask? + * + * @param pcm is the pointer to the coremask. + * @param core + * @return 1 if core is set and 0 if not. + */ +static inline int cvmx_coremask_is_set_core(struct cvmx_coremask *pcm, + int core) +{ + int n, i; + + n = core % CVMX_COREMASK_HLDRSZ; + i = core / CVMX_COREMASK_HLDRSZ; + + return (int)((pcm->coremask_bitmap[i] & (1ull << n)) != 0); +} + +/* + * Set ``core'' in the coremask. + * + * @param pcm is the pointer to the coremask. + * @param core + * @return 0. + */ +static inline int cvmx_coremask_set_core(struct cvmx_coremask *pcm, + int core) +{ + int n, i; + + n = core % CVMX_COREMASK_HLDRSZ; + i = core / CVMX_COREMASK_HLDRSZ; + pcm->coremask_bitmap[i] |= (1ull << n); + + return 0; +} + +/* + * Clear ``core'' from the coremask. + * + * @param pcm is the pointer to the coremask. + * @param core + * @return 0. + */ +static inline int cvmx_coremask_clear_core(struct cvmx_coremask *pcm, + int core) +{ + int n, i; + + n = core % CVMX_COREMASK_HLDRSZ; + i = core / CVMX_COREMASK_HLDRSZ; + pcm->coremask_bitmap[i] &= ~(1ull << n); + + return 0; +} + +/* + * Clear the coremask. + * + * @param pcm is the pointer to the coremask. + * @return 0. + */ +static inline int cvmx_coremask_clear_all(struct cvmx_coremask *pcm) +{ + int i; + + for (i = 0; i < CVMX_COREMASK_BMPSZ; i++) + pcm->coremask_bitmap[i] = 0; + + return 0; +} + +/* + * Is the current core the first in the coremask? + * + * @param pcm is the pointer to the coremask. + * @return 1 for yes and 0 for no. + */ +static inline int cvmx_coremask_first_core_bmp(struct cvmx_coremask *pcm) +{ + int n, i; + + n = (int) cvmx_get_core_num(); + for (i = 0; i < CVMX_COREMASK_BMPSZ; i++) + { + if (pcm->coremask_bitmap[i]) + { + if (n == 0 && pcm->coremask_bitmap[i] & 1) + return 1; + + if (n >= CVMX_COREMASK_HLDRSZ) + return 0; + + return ((((1ull << n) - 1) & pcm->coremask_bitmap[i]) == 0); + } + else + n -= CVMX_COREMASK_HLDRSZ; + } + + return 0; +} + +/* + * Is the current core a member of the coremask? + * + * @param pcm is the pointer to the coremask. + * @return 1 for yes and 0 for no. + */ +static inline int cvmx_coremask_is_member_bmp(struct cvmx_coremask *pcm) +{ + return cvmx_coremask_is_set_core(pcm, (int)cvmx_get_core_num()); +} + /* * coremask is simply unsigned int (32 bits). * @@ -101,7 +257,7 @@ static inline unsigned int cvmx_coremask_core(unsigned int core_id) */ static inline unsigned int cvmx_coremask_numcores(unsigned int num_cores) { - return (CVMX_COREMASK_MAX >> (32 - num_cores)); + return (CVMX_COREMASK_MAX >> (CVMX_MAX_CORES - num_cores)); } /** @@ -115,7 +271,7 @@ static inline unsigned int cvmx_coremask_numcores(unsigned int num_cores) */ static inline unsigned int cvmx_coremask_range(unsigned int low, unsigned int high) { - return ((CVMX_COREMASK_MAX >> (31 - high + low)) << low); + return ((CVMX_COREMASK_MAX >> (CVMX_MAX_CORES - 1 - high + low)) << low); } |