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