110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_cpufreq.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * get cpu frequency definition
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2003 OProfile authors
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h>
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h>
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_fileio.h"
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectdouble op_cpu_frequency(void)
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	double fval = 0.0;
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long uval;
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * line = NULL;
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	FILE * fp = op_try_open_file("/proc/cpuinfo", "r");
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (!fp)
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return 0.0;
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	while (1) {
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		line = op_get_line(fp);
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (!line)
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (line[0] == '\0') {
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			free(line);
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			continue;
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* x86/parisc/ia64/x86_64 */
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (sscanf(line, "cpu MHz : %lf", &fval) == 1)
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* ppc/ppc64 */
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (sscanf(line, "clock : %lfMHz", &fval) == 1)
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* alpha */
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (sscanf(line, "cycle frequency [Hz] : %lu", &uval) == 1) {
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			fval = uval / 1E6;
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* sparc64 if CONFIG_SMP only */
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (sscanf(line, "Cpu0ClkTck : %lx", &uval) == 1) {
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			fval = uval / 1E6;
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
547a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		/* mips including loongson2 */
557a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		if (sscanf(line, "BogoMIPS		: %lu", &uval) == 1) {
567a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			fval = uval * 3 / 2;
577a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown			break;
587a33c86eb98056ef0570c99e713214f8dc56b6efJeff Brown		}
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* s390 doesn't provide cpu freq, checked up to 2.6-test4 */
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		free(line);
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (line)
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		free(line);
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	op_close_file(fp);
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return fval;
6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
70