xref: /openbmc/linux/tools/perf/util/cpumap.h (revision 7780c25b)
1a12b51c4SPaul Mackerras #ifndef __PERF_CPUMAP_H
2a12b51c4SPaul Mackerras #define __PERF_CPUMAP_H
3a12b51c4SPaul Mackerras 
49ae7d335SArnaldo Carvalho de Melo #include <stdio.h>
5a14bb7a6SArnaldo Carvalho de Melo #include <stdbool.h>
69ae7d335SArnaldo Carvalho de Melo 
77780c25bSDon Zickus #include "perf.h"
87780c25bSDon Zickus #include "util/debug.h"
97780c25bSDon Zickus 
1060d567e2SArnaldo Carvalho de Melo struct cpu_map {
1160d567e2SArnaldo Carvalho de Melo 	int nr;
1260d567e2SArnaldo Carvalho de Melo 	int map[];
1360d567e2SArnaldo Carvalho de Melo };
1460d567e2SArnaldo Carvalho de Melo 
1560d567e2SArnaldo Carvalho de Melo struct cpu_map *cpu_map__new(const char *cpu_list);
1660d567e2SArnaldo Carvalho de Melo struct cpu_map *cpu_map__dummy_new(void);
17915fce20SArnaldo Carvalho de Melo void cpu_map__delete(struct cpu_map *map);
187ae92e74SYan, Zheng struct cpu_map *cpu_map__read(FILE *file);
199ae7d335SArnaldo Carvalho de Melo size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
205ac59a8aSStephane Eranian int cpu_map__get_socket(struct cpu_map *map, int idx);
2112c08a9fSStephane Eranian int cpu_map__get_core(struct cpu_map *map, int idx);
225ac59a8aSStephane Eranian int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp);
2312c08a9fSStephane Eranian int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep);
245ac59a8aSStephane Eranian 
255ac59a8aSStephane Eranian static inline int cpu_map__socket(struct cpu_map *sock, int s)
265ac59a8aSStephane Eranian {
275ac59a8aSStephane Eranian 	if (!sock || s > sock->nr || s < 0)
285ac59a8aSStephane Eranian 		return 0;
295ac59a8aSStephane Eranian 	return sock->map[s];
305ac59a8aSStephane Eranian }
319ae7d335SArnaldo Carvalho de Melo 
3212c08a9fSStephane Eranian static inline int cpu_map__id_to_socket(int id)
3312c08a9fSStephane Eranian {
3412c08a9fSStephane Eranian 	return id >> 16;
3512c08a9fSStephane Eranian }
3612c08a9fSStephane Eranian 
3712c08a9fSStephane Eranian static inline int cpu_map__id_to_cpu(int id)
3812c08a9fSStephane Eranian {
3912c08a9fSStephane Eranian 	return id & 0xffff;
4012c08a9fSStephane Eranian }
4112c08a9fSStephane Eranian 
42a14bb7a6SArnaldo Carvalho de Melo static inline int cpu_map__nr(const struct cpu_map *map)
43a14bb7a6SArnaldo Carvalho de Melo {
44a14bb7a6SArnaldo Carvalho de Melo 	return map ? map->nr : 1;
45a14bb7a6SArnaldo Carvalho de Melo }
46a14bb7a6SArnaldo Carvalho de Melo 
47ec1e7e43SSukadev Bhattiprolu static inline bool cpu_map__empty(const struct cpu_map *map)
48a14bb7a6SArnaldo Carvalho de Melo {
49a14bb7a6SArnaldo Carvalho de Melo 	return map ? map->map[0] == -1 : true;
50a14bb7a6SArnaldo Carvalho de Melo }
51a14bb7a6SArnaldo Carvalho de Melo 
527780c25bSDon Zickus int max_cpu_num;
537780c25bSDon Zickus int max_node_num;
547780c25bSDon Zickus int *cpunode_map;
557780c25bSDon Zickus 
567780c25bSDon Zickus int cpu__setup_cpunode_map(void);
577780c25bSDon Zickus 
587780c25bSDon Zickus static inline int cpu__max_node(void)
597780c25bSDon Zickus {
607780c25bSDon Zickus 	if (unlikely(!max_node_num))
617780c25bSDon Zickus 		pr_debug("cpu_map not initialized\n");
627780c25bSDon Zickus 
637780c25bSDon Zickus 	return max_node_num;
647780c25bSDon Zickus }
657780c25bSDon Zickus 
667780c25bSDon Zickus static inline int cpu__max_cpu(void)
677780c25bSDon Zickus {
687780c25bSDon Zickus 	if (unlikely(!max_cpu_num))
697780c25bSDon Zickus 		pr_debug("cpu_map not initialized\n");
707780c25bSDon Zickus 
717780c25bSDon Zickus 	return max_cpu_num;
727780c25bSDon Zickus }
737780c25bSDon Zickus 
747780c25bSDon Zickus static inline int cpu__get_node(int cpu)
757780c25bSDon Zickus {
767780c25bSDon Zickus 	if (unlikely(cpunode_map == NULL)) {
777780c25bSDon Zickus 		pr_debug("cpu_map not initialized\n");
787780c25bSDon Zickus 		return -1;
797780c25bSDon Zickus 	}
807780c25bSDon Zickus 
817780c25bSDon Zickus 	return cpunode_map[cpu];
827780c25bSDon Zickus }
837780c25bSDon Zickus 
84a12b51c4SPaul Mackerras #endif /* __PERF_CPUMAP_H */
85