linux/tools/power/cpupower/utils/helpers/msr.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#if defined(__i386__) || defined(__x86_64__)
   3
   4#include <fcntl.h>
   5#include <stdio.h>
   6#include <unistd.h>
   7#include <stdint.h>
   8
   9#include "helpers/helpers.h"
  10
  11/* Intel specific MSRs */
  12#define MSR_IA32_PERF_STATUS            0x198
  13#define MSR_IA32_MISC_ENABLES           0x1a0
  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
  75unsigned long long msr_intel_get_turbo_ratio(unsigned int cpu)
  76{
  77        unsigned long long val;
  78        int ret;
  79
  80        if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_HAS_TURBO_RATIO))
  81                return -1;
  82
  83        ret = read_msr(cpu, MSR_NEHALEM_TURBO_RATIO_LIMIT, &val);
  84        if (ret)
  85                return ret;
  86        return val;
  87}
  88#endif
  89