static int do_new_policy(unsigned int cpu, struct cpufreq_policy *new_pol) { struct cpufreq_policy *cur_pol = cpufreq_get_policy(cpu); int ret; if (!cur_pol) { printf(_("wrong, unknown or unhandled CPU?\n")); return -EINVAL; } if (!new_pol->min) new_pol->min = cur_pol->min; if (!new_pol->max) new_pol->max = cur_pol->max; if (!new_pol->governor) new_pol->governor = cur_pol->governor; ret = cpufreq_set_policy(cpu, new_pol); cpufreq_put_policy(cur_pol); return ret; }
static int restore_before_settings() { for (int cpu = 0; cpu < num_cpus; cpu++) { int ret; if ( ret = cpufreq_set_policy(cpu, saved_policies[cpu]) ) return ret; cpufreq_put_policy(saved_policies[cpu]); } free(saved_policies); return 0; }
static void read_governors() { unsigned int cpu; for ( cpu=0; cpu<ncpu; ++cpu ) { struct cpufreq_policy* policy = cpufreq_get_policy(cpu); if (policy) { strcpy(governor[cpu], policy->governor); cpufreq_put_policy(policy); } else { strcpy(governor[cpu], empty); } } }
static gboolean cpufreq_monitor_libcpufreq_run (CPUFreqMonitor *monitor) { guint cpu; CPUFreqPolicy *policy; g_object_get (G_OBJECT (monitor), "cpu", &cpu, NULL); policy = cpufreq_get_policy (cpu); if (!policy) { /* Check whether it failed because * cpu is not online. */ #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0) if (!cpufreq_cpu_exists (cpu)) { #else if (cpupower_is_cpu_online (cpu)) { #endif g_object_set (G_OBJECT (monitor), "online", FALSE, NULL); return TRUE; } return FALSE; } g_object_set (G_OBJECT (monitor), "online", TRUE, "governor", policy->governor, "frequency", cpufreq_get_freq_kernel (cpu), NULL); cpufreq_put_policy (policy); return TRUE; } static gint compare (gconstpointer a, gconstpointer b) { gint aa, bb; aa = atoi ((gchar *) a); bb = atoi ((gchar *) b); if (aa == bb) return 0; else if (aa > bb) return -1; else return 1; }
int main(int argc, char *argv[]) { struct timespec ts,ts1; int i,ncpu; int idcpu; unsigned long freq[8]; XEvent event; char gov[20]; char drv[20],*ptr,*endptr; char prg[LN_PATH]; ts.tv_sec=0; ts.tv_nsec=DELAY; prg[0]=0; idcpu=0; for(i=0;i<MAX_CPU;i++) freq[i]=0; if(argc >1) { for (i=1; i<=argc; i++) { if (!strcmp(argv[i], "-v")) { printf(WMCPUFREQ_VERSION); exit(0); } if (!strcmp(argv[i], "-exe")) { if(strlen(argv[i+1]) < LN_PATH ) strcpy(prg,argv[i+1]); break; } if (!strcmp(argv[i], "-cpuid")) { if(strlen(argv[i+1]) < LN_PATH ) idcpu=strtol(argv[i+1],&endptr,0); printf("cpuid= %d \n",idcpu); break; } printf("only -v, -exe, -cpuid supported \n"); exit(0); } } /* basic checks */ if ( idcpu < 0 ) { printf("cpuid < 0 \n"); exit(-1); } /* get driver name (guess all cpu have the same driver) */ ptr=cpufreq_get_driver(cpu); if(!ptr) { printf("no driver found \n"); exit(-1); } strcpy(drv,ptr); cpufreq_put_driver(ptr); /* get number of cpu (0=cpu0, 1=cpu1 ...) */ ncpu=-1; for(i=0;i<MAX_CPU;i++) { if( cpufreq_cpu_exists(idcpu+i) ==0) { printf("cpuid %d found\n",idcpu+i); ncpu=i; } } switch ( ncpu ) { case -1: printf("no cpuid found \n"); exit(-1); case 0: wm_xpm=wmcpufreq_master_xpm_1; wm_bits=wmcpufreq_mask_bits_1; break; case 1: wm_xpm=wmcpufreq_master_xpm_2; wm_bits=wmcpufreq_mask_bits_2; break; case 2: wm_xpm=wmcpufreq_master_3; wm_bits=wmcpufreq_mask_3_bits; break; case 3: wm_xpm=wmcpufreq_master_3; wm_bits=wmcpufreq_mask_3_bits; break; default: printf("no yet implemented: cpuid %d \n",ncpu); exit(-1); break; } /* guess every cpu has the same limits */ if(cpufreq_get_hardware_limits(cpu, &f_min, &f_max)) { printf("can't determine hardware limits \n"); exit(-1); } openXwindow(argc,argv, wm_xpm, (char*)wm_bits, wmcpufreq_mask_width, wmcpufreq_mask_height); while(1) { /* Process any pending X events */ while(XPending(display)) { XNextEvent(display, &event); switch(event.type) { case Expose: RedrawWindow(); break; case ButtonPress: if(strlen(prg)) execCommand(prg); break; case ButtonRelease: break; } } RedrawWindow(); /* get info */ for(i=0;i<=ncpu;i++) freq[i]=cpufreq_get_freq_kernel(i+idcpu); policy=cpufreq_get_policy(cpu); strcpy(gov,policy->governor); max=policy->max; min=policy->min; cpufreq_put_policy(policy); /* show info */ show_mhz(freq,ncpu); if (ncpu==0) show_driver(drv); show_governor(gov); /* delay */ nanosleep(&ts,&ts1); } }
void print_cpu(unsigned int cpu, unsigned int n_cpus) { int i; char str[MAXLEN]; char premark[MAXLEN]; char postmark[MAXLEN]; unsigned long curfreq, freq; struct cpufreq_available_frequencies* freqs; struct cpufreq_available_governors* govs; struct cpufreq_policy* policy; if (cpu + 1 == n_cpus) // last cpu column printf("<item label='cpu %u'/>\n", cpu); else if (cpu + 1 < n_cpus) { printf("<menu label='cpu %u' id='obcpufreq-cpu%u'>\n", cpu, cpu + 1); print_cpu(cpu + 1, n_cpus); printf("</menu>\n"); } printf(SEPARATOR); curfreq = cpufreq_get_freq_kernel(cpu); policy = cpufreq_get_policy(cpu); // print available governors govs = cpufreq_get_available_governors(cpu); if (govs) { printf("<menu label='governors' id='obcpufreq-governors%u'>\n", cpu); for (; govs; govs = govs->next) { premark[0] = ' '; premark[1] = '\0'; if (!strcmp(govs->governor, policy->governor)) premark[0] = '*'; printf(" <item label='%s%s'><action name='Execute'><command>" CPUFREQ_SET " --cpu %u -g %s</command></action></item>\n", premark, govs->governor, cpu, govs->governor); } printf("</menu>\n"); cpufreq_put_available_governors(govs); } else printf("<item label='%s'/>\n", "no available governors"); printf(SEPARATOR); // print available freqs freqs = cpufreq_get_available_frequencies(cpu); if (freqs) { for (i = 0; freqs; freqs = freqs->next, i++) { freq = freqs->frequency; get_human_speed(str, freq); premark[0] = ' '; premark[1] = '\0'; if (freq == curfreq) premark[0] = '*'; postmark[0] = '\0'; if (policy) { if (freq == policy->max && freq == policy->min) strcpy(postmark, " (max,min)"); else if (freq == policy->max) strcpy(postmark, " (max)"); else if (freq == policy->min) strcpy(postmark, " (min)"); } printf("<menu label='%s%s%s' id='obcpufreq-freq%d'>\n" " <item label='set as max'><action name='Execute'><command>" CPUFREQ_SET " --cpu %u --max %lu</command></action></item>\n" " <item label='set as min'><action name='Execute'><command>" CPUFREQ_SET " --cpu %u --min %lu</command></action></item>\n</menu>\n", premark, str, postmark, i, cpu, freqs->frequency, cpu, freqs->frequency); } cpufreq_put_available_frequencies(freqs); } else printf("<item label='%s'/>\n", "no available freqs"); cpufreq_put_policy(policy); return; }