Linux Audio

Check our new training course

Loading...
  1#if defined(__i386__) || defined(__x86_64__)
  2
  3#include <fcntl.h>
  4#include <stdio.h>
  5#include <unistd.h>
  6#include <stdint.h>
  7
  8#include "helpers/helpers.h"
  9
 10/* Intel specific MSRs */
 11#define MSR_IA32_PERF_STATUS		0x198
 12#define MSR_IA32_MISC_ENABLES		0x1a0
 13#define MSR_IA32_ENERGY_PERF_BIAS	0x1b0
 14#define MSR_NEHALEM_TURBO_RATIO_LIMIT	0x1ad
 15
 16/*
 17 * read_msr
 18 *
 19 * Will return 0 on success and -1 on failure.
 20 * Possible errno values could be:
 21 * EFAULT -If the read/write did not fully complete
 22 * EIO    -If the CPU does not support MSRs
 23 * ENXIO  -If the CPU does not exist
 24 */
 25
 26int read_msr(int cpu, unsigned int idx, unsigned long long *val)
 27{
 28	int fd;
 29	char msr_file_name[64];
 30
 31	sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
 32	fd = open(msr_file_name, O_RDONLY);
 33	if (fd < 0)
 34		return -1;
 35	if (lseek(fd, idx, SEEK_CUR) == -1)
 36		goto err;
 37	if (read(fd, val, sizeof *val) != sizeof *val)
 38		goto err;
 39	close(fd);
 40	return 0;
 41 err:
 42	close(fd);
 43	return -1;
 44}
 45
 46/*
 47 * write_msr
 48 *
 49 * Will return 0 on success and -1 on failure.
 50 * Possible errno values could be:
 51 * EFAULT -If the read/write did not fully complete
 52 * EIO    -If the CPU does not support MSRs
 53 * ENXIO  -If the CPU does not exist
 54 */
 55int write_msr(int cpu, unsigned int idx, unsigned long long val)
 56{
 57	int fd;
 58	char msr_file_name[64];
 59
 60	sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
 61	fd = open(msr_file_name, O_WRONLY);
 62	if (fd < 0)
 63		return -1;
 64	if (lseek(fd, idx, SEEK_CUR) == -1)
 65		goto err;
 66	if (write(fd, &val, sizeof val) != sizeof val)
 67		goto err;
 68	close(fd);
 69	return 0;
 70 err:
 71	close(fd);
 72	return -1;
 73}
 74
 75int msr_intel_get_perf_bias(unsigned int cpu)
 76{
 77	unsigned long long val;
 78	int ret;
 79
 80	if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS))
 81		return -1;
 82
 83	ret = read_msr(cpu, MSR_IA32_ENERGY_PERF_BIAS, &val);
 84	if (ret)
 85		return ret;
 86	return val;
 87}
 88
 89int msr_intel_set_perf_bias(unsigned int cpu, unsigned int val)
 90{
 91	int ret;
 92
 93	if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS))
 94		return -1;
 95
 96	ret = write_msr(cpu, MSR_IA32_ENERGY_PERF_BIAS, val);
 97	if (ret)
 98		return ret;
 99	return 0;
100}
101
102unsigned long long msr_intel_get_turbo_ratio(unsigned int cpu)
103{
104	unsigned long long val;
105	int ret;
106
107	if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_HAS_TURBO_RATIO))
108		return -1;
109
110	ret = read_msr(cpu, MSR_NEHALEM_TURBO_RATIO_LIMIT, &val);
111	if (ret)
112		return ret;
113	return val;
114}
115#endif