| /* Copyright (c) 2015 Google Inc | 
 |  * Davide Libenzi <dlibenzi@google.com> | 
 |  * See LICENSE for details. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include <arch/arch.h> | 
 | #include <arch/topology.h> | 
 | #include <ros/common.h> | 
 | #include <stdio.h> | 
 | #include <string.h> | 
 | #include <bitops.h> | 
 |  | 
 | struct core_set { | 
 | 	unsigned long cpus[DIV_ROUND_UP(MAX_NUM_CORES, BITS_PER_LONG)]; | 
 | }; | 
 |  | 
 | static inline void core_set_init(struct core_set *cset) | 
 | { | 
 | 	memset(cset, 0, sizeof(*cset)); | 
 | } | 
 |  | 
 | static inline void core_set_setcpu(struct core_set *cset, unsigned int cpuno) | 
 | { | 
 | 	__set_bit(cpuno, cset->cpus); | 
 | } | 
 |  | 
 | static inline void core_set_clearcpu(struct core_set *cset, unsigned int cpuno) | 
 | { | 
 | 	__clear_bit(cpuno, cset->cpus); | 
 | } | 
 |  | 
 | static inline bool core_set_getcpu(const struct core_set *cset, | 
 | 				   unsigned int cpuno) | 
 | { | 
 | 	return test_bit(cpuno, cset->cpus); | 
 | } | 
 |  | 
 | static inline void core_set_fill_available(struct core_set *cset) | 
 | { | 
 | 	for (int i = 0; i < num_cores; i++) | 
 | 		core_set_setcpu(cset, i); | 
 | } | 
 |  | 
 | static inline int core_set_count(const struct core_set *cset) | 
 | { | 
 | 	int count = 0; | 
 |  | 
 | 	for (size_t i = 0; i < ARRAY_SIZE(cset->cpus); i++) { | 
 | 		for (unsigned long v = cset->cpus[i]; v; v >>= 1) | 
 | 			count += (int) (v & 1); | 
 | 	} | 
 |  | 
 | 	return count; | 
 | } | 
 |  | 
 | static inline int core_set_remote_count(const struct core_set *cset) | 
 | { | 
 | 	int count = core_set_count(cset), cpu = core_id(); | 
 |  | 
 | 	return core_set_getcpu(cset, cpu) ? count - 1: count; | 
 | } |