cregit-Linux how code gets into the kernel

Release 4.11 tools/power/cpupower/debug/i386/centrino-decode.c

/*
 *  (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; }

Contributors

PersonTokensPropCommitsCommitProp
Dominik Brodowski164100.00%1100.00%
Total164100.00%1100.00%


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); }

Contributors

PersonTokensPropCommitsCommitProp
Dominik Brodowski57100.00%1100.00%
Total57100.00%1100.00%


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; }

Contributors

PersonTokensPropCommitsCommitProp
Dominik Brodowski68100.00%1100.00%
Total68100.00%1100.00%


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; }

Contributors

PersonTokensPropCommitsCommitProp
Dominik Brodowski76100.00%1100.00%
Total76100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Dominik Brodowski398100.00%1100.00%
Total398100.00%1100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.