123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*
- * (C) 2003 - 2004 Dominik Brodowski <linux@dominikbrodowski.de>
- *
- * Licensed under the terms of the GNU GPL License version 2.
- *
- * Based on code found in
- * linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
- * and originally developed by Jeremy Fitzhardinge.
- *
- * USAGE: simply run it to decode the current settings on CPU 0,
- * or pass the CPU number as argument, or pass the MSR content
- * as argument.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <unistd.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #define MCPU 32
- #define MSR_IA32_PERF_STATUS 0x198
- static int rdmsr(unsigned int cpu, unsigned int msr,
- unsigned int *lo, unsigned int *hi)
- {
- int fd;
- char file[20];
- unsigned long long val;
- int retval = -1;
- *lo = *hi = 0;
- if (cpu > MCPU)
- goto err1;
- sprintf(file, "/dev/cpu/%d/msr", cpu);
- fd = open(file, O_RDONLY);
- if (fd < 0)
- goto err1;
- if (lseek(fd, msr, SEEK_CUR) == -1)
- goto err2;
- if (read(fd, &val, 8) != 8)
- goto err2;
- *lo = (uint32_t )(val & 0xffffffffull);
- *hi = (uint32_t )(val>>32 & 0xffffffffull);
- retval = 0;
- err2:
- close(fd);
- err1:
- return retval;
- }
- static void decode (unsigned int msr)
- {
- unsigned int multiplier;
- unsigned int mv;
- multiplier = ((msr >> 8) & 0xFF);
- mv = (((msr & 0xFF) * 16) + 700);
- printf("0x%x means multiplier %d @ %d mV\n", msr, multiplier, mv);
- }
- static int decode_live(unsigned int cpu)
- {
- unsigned int lo, hi;
- int err;
- err = rdmsr(cpu, MSR_IA32_PERF_STATUS, &lo, &hi);
- if (err) {
- printf("can't get MSR_IA32_PERF_STATUS for cpu %d\n", cpu);
- printf("Possible trouble: you don't run an Enhanced SpeedStep capable cpu\n");
- printf("or you are not root, or the msr driver is not present\n");
- return 1;
- }
- decode(lo);
- return 0;
- }
- int main (int argc, char **argv)
- {
- unsigned int cpu, mode = 0;
- if (argc < 2)
- cpu = 0;
- else {
- cpu = strtoul(argv[1], NULL, 0);
- if (cpu >= MCPU)
- mode = 1;
- }
- if (mode)
- decode(cpu);
- else
- decode_live(cpu);
- return 0;
- }
|