aboutsummaryrefslogtreecommitdiffstats
path: root/cvmx-coremask.h
diff options
context:
space:
mode:
Diffstat (limited to 'cvmx-coremask.h')
-rw-r--r--cvmx-coremask.h168
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);
}