2 * (C) 2010,2011 Thomas Renninger <trenn@suse.de>, Novell Inc.
4 * Licensed under the terms of the GNU GPL License version 2.
8 #ifndef __CPUIDLE_INFO_HW__
9 #define __CPUIDLE_INFO_HW__
14 #include "idle_monitor/idle_monitors.h"
16 #define MONITORS_MAX 20
17 #define MONITOR_NAME_LEN 20
19 /* CSTATE_NAME_LEN is limited by header field width defined
20 * in cpupower-monitor.c. Header field width is defined to be
21 * sum of percent width and two spaces for padding.
24 #define CSTATE_NAME_LEN 7
26 #define CSTATE_NAME_LEN 5
28 #define CSTATE_DESC_LEN 60
32 /* Hard to define the right names ...: */
34 RANGE_THREAD, /* Lowest in topology hierarcy, AMD: core, Intel: thread
36 RANGE_CORE, /* AMD: unit, Intel: core, kernel_sysfs: core_id */
37 RANGE_PACKAGE, /* Package, processor socket */
38 RANGE_MACHINE, /* Machine, platform wide */
41 typedef struct cstate {
43 enum power_range_e range;
44 char name[CSTATE_NAME_LEN];
45 char desc[CSTATE_DESC_LEN];
47 /* either provide a percentage or a general count */
48 int (*get_count_percent)(unsigned int self_id, double *percent,
50 int (*get_count)(unsigned int self_id, unsigned long long *count,
54 struct cpuidle_monitor {
55 /* Name must not contain whitespaces */
56 char name[MONITOR_NAME_LEN];
62 struct cpuidle_monitor* (*do_register) (void);
63 void (*unregister)(void);
64 unsigned int overflow_s;
68 extern long long timespec_diff_us(struct timespec start, struct timespec end);
70 #define print_overflow_err(mes, ov) \
72 fprintf(stderr, gettext("Measure took %u seconds, but registers could " \
73 "overflow at %u seconds, results " \
74 "could be inaccurate\n"), mes, ov); \
78 /* Taken over from x86info project sources -> return 0 on success */
80 #include <sys/types.h>
82 static inline int bind_cpu(int cpu)
86 if (sched_getaffinity(getpid(), sizeof(set), &set) == 0) {
89 return sched_setaffinity(getpid(), sizeof(set), &set);
94 #endif /* __CPUIDLE_INFO_HW__ */