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