brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · c559d31 Raw
96 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 *  (C) 2010,2011       Thomas Renninger <trenn@suse.de>, Novell Inc.4 */5 6#ifndef __CPUIDLE_INFO_HW__7#define __CPUIDLE_INFO_HW__8 9#include <stdarg.h>10#include <time.h>11 12#include "idle_monitor/idle_monitors.h"13 14#define MONITORS_MAX 2015#define MONITOR_NAME_LEN 2016 17/* CSTATE_NAME_LEN is limited by header field width defined18 * in cpupower-monitor.c. Header field width is defined to be19 * sum of percent width and two spaces for padding.20 */21#ifdef __powerpc__22#define CSTATE_NAME_LEN 723#else24#define CSTATE_NAME_LEN 525#endif26#define CSTATE_DESC_LEN 6027 28extern int cpu_count;29 30/* Hard to define the right names ...: */31enum power_range_e {32	RANGE_THREAD,	/* Lowest in topology hierarcy, AMD: core, Intel: thread33			   kernel sysfs: cpu */34	RANGE_CORE,	/* AMD: unit, Intel: core, kernel_sysfs: core_id */35	RANGE_PACKAGE,	/* Package, processor socket */36	RANGE_MACHINE,	/* Machine, platform wide */37	RANGE_MAX };38 39typedef struct cstate {40	int  id;41	enum power_range_e range;42	char name[CSTATE_NAME_LEN];43	char desc[CSTATE_DESC_LEN];44 45	/* either provide a percentage or a general count */46	int (*get_count_percent)(unsigned int self_id, double *percent,47				 unsigned int cpu);48	int (*get_count)(unsigned int self_id, unsigned long long *count,49			 unsigned int cpu);50} cstate_t;51 52struct cpuidle_monitor {53	/* Name must not contain whitespaces */54	char name[MONITOR_NAME_LEN];55	int name_len;56	int hw_states_num;57	cstate_t *hw_states;58	int (*start) (void);59	int (*stop) (void);60	struct cpuidle_monitor* (*do_register) (void);61	void (*unregister)(void);62	unsigned int overflow_s;63	struct {64		unsigned int needs_root:1;65		unsigned int per_cpu_schedule:1;66	} flags;67};68 69extern long long timespec_diff_us(struct timespec start, struct timespec end);70 71#define print_overflow_err(mes, ov)						\72{										\73	fprintf(stderr, gettext("Measure took %u seconds, but registers could "	\74				"overflow at %u seconds, results "		\75				"could be inaccurate\n"), mes, ov);		\76}77 78 79/* Taken over from x86info project sources  -> return 0 on success */80#include <sched.h>81#include <sys/types.h>82#include <unistd.h>83static inline int bind_cpu(int cpu)84{85	cpu_set_t set;86 87	if (sched_getaffinity(getpid(), sizeof(set), &set) == 0) {88		CPU_ZERO(&set);89		CPU_SET(cpu, &set);90		return sched_setaffinity(getpid(), sizeof(set), &set);91	}92	return 1;93}94 95#endif /* __CPUIDLE_INFO_HW__ */96