1/**
2 * @file op_cpufreq.c
3 * get cpu frequency definition
4 *
5 * @remark Copyright 2003 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14
15#include "op_fileio.h"
16
17double op_cpu_frequency(void)
18{
19	double fval = 0.0;
20	unsigned long uval;
21	char * line = NULL;
22
23	FILE * fp = op_try_open_file("/proc/cpuinfo", "r");
24	if (!fp)
25		return 0.0;
26
27	while (1) {
28		line = op_get_line(fp);
29
30		if (!line)
31			break;
32
33		if (line[0] == '\0') {
34			free(line);
35			continue;
36		}
37
38		/* x86/parisc/ia64/x86_64 */
39		if (sscanf(line, "cpu MHz : %lf", &fval) == 1)
40			break;
41		/* ppc/ppc64 */
42		if (sscanf(line, "clock : %lfMHz", &fval) == 1)
43			break;
44		/* alpha */
45		if (sscanf(line, "cycle frequency [Hz] : %lu", &uval) == 1) {
46			fval = uval / 1E6;
47			break;
48		}
49		/* sparc64 if CONFIG_SMP only */
50		if (sscanf(line, "Cpu0ClkTck : %lx", &uval) == 1) {
51			fval = uval / 1E6;
52			break;
53		}
54		/* mips including loongson2 */
55		if (sscanf(line, "BogoMIPS		: %lu", &uval) == 1) {
56			fval = uval * 3 / 2;
57			break;
58		}
59		/* s390 doesn't provide cpu freq, checked up to 2.6-test4 */
60
61		free(line);
62	}
63
64	if (line)
65		free(line);
66	op_close_file(fp);
67
68	return fval;
69}
70