linux/arch/mips/include/asm/octeon/cvmx-coremask.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (c) 2016  Cavium Inc. (support@cavium.com).
   7 *
   8 */
   9
  10/*
  11 * Module to support operations on bitmap of cores. Coremask can be used to
  12 * select a specific core, a group of cores, or all available cores, for
  13 * initialization and differentiation of roles within a single shared binary
  14 * executable image.
  15 *
  16 * The core numbers used in this file are the same value as what is found in
  17 * the COP0_EBASE register and the rdhwr 0 instruction.
  18 *
  19 * For the CN78XX and other multi-node environments the core numbers are not
  20 * contiguous.  The core numbers for the CN78XX are as follows:
  21 *
  22 * Node 0:      Cores 0 - 47
  23 * Node 1:      Cores 128 - 175
  24 * Node 2:      Cores 256 - 303
  25 * Node 3:      Cores 384 - 431
  26 *
  27 */
  28
  29#ifndef __CVMX_COREMASK_H__
  30#define __CVMX_COREMASK_H__
  31
  32#define CVMX_MIPS_MAX_CORES 1024
  33/* bits per holder */
  34#define CVMX_COREMASK_ELTSZ 64
  35
  36/* cvmx_coremask_t's size in u64 */
  37#define CVMX_COREMASK_BMPSZ (CVMX_MIPS_MAX_CORES / CVMX_COREMASK_ELTSZ)
  38
  39
  40/* cvmx_coremask_t */
  41struct cvmx_coremask {
  42        u64 coremask_bitmap[CVMX_COREMASK_BMPSZ];
  43};
  44
  45/*
  46 * Is ``core'' set in the coremask?
  47 */
  48static inline bool cvmx_coremask_is_core_set(const struct cvmx_coremask *pcm,
  49                                            int core)
  50{
  51        int n, i;
  52
  53        n = core % CVMX_COREMASK_ELTSZ;
  54        i = core / CVMX_COREMASK_ELTSZ;
  55
  56        return (pcm->coremask_bitmap[i] & ((u64)1 << n)) != 0;
  57}
  58
  59/*
  60 * Make a copy of a coremask
  61 */
  62static inline void cvmx_coremask_copy(struct cvmx_coremask *dest,
  63                                      const struct cvmx_coremask *src)
  64{
  65        memcpy(dest, src, sizeof(*dest));
  66}
  67
  68/*
  69 * Set the lower 64-bit of the coremask.
  70 */
  71static inline void cvmx_coremask_set64(struct cvmx_coremask *pcm,
  72                                       uint64_t coremask_64)
  73{
  74        pcm->coremask_bitmap[0] = coremask_64;
  75}
  76
  77/*
  78 * Clear ``core'' from the coremask.
  79 */
  80static inline void cvmx_coremask_clear_core(struct cvmx_coremask *pcm, int core)
  81{
  82        int n, i;
  83
  84        n = core % CVMX_COREMASK_ELTSZ;
  85        i = core / CVMX_COREMASK_ELTSZ;
  86        pcm->coremask_bitmap[i] &= ~(1ull << n);
  87}
  88
  89#endif /* __CVMX_COREMASK_H__ */
  90