brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · 700cd31 Raw
113 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 *  (C) 2003 - 2004  Dominik Brodowski <linux@dominikbrodowski.de>4 *5 * Based on code found in6 * linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c7 * and originally developed by Jeremy Fitzhardinge.8 *9 * USAGE: simply run it to decode the current settings on CPU 0,10 *	  or pass the CPU number as argument, or pass the MSR content11 *	  as argument.12 */13 14#include <stdio.h>15#include <stdlib.h>16#include <stdint.h>17#include <unistd.h>18#include <errno.h>19#include <fcntl.h>20 21#include <sys/types.h>22#include <sys/stat.h>23 24#define MCPU	3225 26#define MSR_IA32_PERF_STATUS	0x19827 28static int rdmsr(unsigned int cpu, unsigned int msr,29		 unsigned int *lo, unsigned int *hi)30{31	int fd;32	char file[20];33	unsigned long long val;34	int retval = -1;35 36	*lo = *hi = 0;37 38	if (cpu > MCPU)39		goto err1;40 41	sprintf(file, "/dev/cpu/%d/msr", cpu);42	fd = open(file, O_RDONLY);43 44	if (fd < 0)45		goto err1;46 47	if (lseek(fd, msr, SEEK_CUR) == -1)48		goto err2;49 50	if (read(fd, &val, 8) != 8)51		goto err2;52 53	*lo = (uint32_t )(val & 0xffffffffull);54	*hi = (uint32_t )(val>>32 & 0xffffffffull);55 56	retval = 0;57err2:58	close(fd);59err1:60	return retval;61}62 63static void decode (unsigned int msr)64{65	unsigned int multiplier;66	unsigned int mv;67 68	multiplier = ((msr >> 8) & 0xFF);69 70	mv = (((msr & 0xFF) * 16) + 700);71 72	printf("0x%x means multiplier %d @ %d mV\n", msr, multiplier, mv);73}74 75static int decode_live(unsigned int cpu)76{77	unsigned int lo, hi;78	int err;79 80	err = rdmsr(cpu, MSR_IA32_PERF_STATUS, &lo, &hi);81 82	if (err) {83		printf("can't get MSR_IA32_PERF_STATUS for cpu %d\n", cpu);84		printf("Possible trouble: you don't run an Enhanced SpeedStep capable cpu\n");85		printf("or you are not root, or the msr driver is not present\n");86		return 1;87	}88 89	decode(lo);90 91	return 0;92}93 94int main (int argc, char **argv)95{96	unsigned int cpu, mode = 0;97 98	if (argc < 2)99		cpu = 0;100	else {101		cpu = strtoul(argv[1], NULL, 0);102		if (cpu >= MCPU)103			mode = 1;104	}105 106	if (mode)107		decode(cpu);108	else109		decode_live(cpu);110 111	return 0;112}113