/* * Copyright (C) 2011-2012 sakuramilk <c.sakuramilk@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sakuramilk.TweakGS2.CpuControl; import java.io.File; import java.util.ArrayList; import android.content.Context; import net.sakuramilk.util.Misc; import net.sakuramilk.util.SettingManager; import net.sakuramilk.util.SysFs; public class CpuGovernorSetting extends SettingManager { private static final int SAMPING_RATE_MAX = 100000000; public class Parameter { public static final int TYPE_SEEK_BAR = 0; public static final int TYPE_LIST = 1; Parameter(String name, int min, int max) { this(name, min, max, ""); } Parameter(String name, int min, int max, String unit) { this.name = name; this.type = TYPE_SEEK_BAR; this.min = min; this.max = max; this.unit = unit; this.listEntries = null; this.listValues = null; } Parameter(String name, String[] listEntries, String[] listValues) { this.name = name; this.type = TYPE_LIST; this.listEntries = listEntries; this.listValues = listValues; this.min = 0; this.max = 0; this.unit = null; } public String name; public String listEntries[]; public String listValues[]; public int type; public int min; public int max; public String unit; } private static ArrayList<Parameter> mParams; private String mGovernor; private static final String CTRL_PATH = "/sys/devices/system/cpu/cpufreq"; protected CpuGovernorSetting(Context context, String governor) { super(context); mGovernor = governor; mParams = new ArrayList<Parameter>(); File[] govParams = new File(CTRL_PATH + "/" + governor).listFiles(); if (govParams == null) { return; } // setup governor parameter list if ("sakuractive".equals(governor)) { for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("sampling_rate")) { mParams.add(new Parameter("sampling_rate", 10000, 1000000, "μs")); } else if (fileName.equals("up_threshold")) { mParams.add(new Parameter("up_threshold", 1, 100, "%")); } else if (fileName.equals("down_threshold")) { mParams.add(new Parameter("down_threshold", 1, 100, "%")); } else if (fileName.equals("hotplug_in_sampling_periods")) { mParams.add(new Parameter("hotplug_in_sampling_periods", 0, 0)); } else if (fileName.equals("hotplug_out_sampling_periods")) { mParams.add(new Parameter("hotplug_out_sampling_periods", 0, 0)); } else if (fileName.equals("ignore_nice_load")) { mParams.add(new Parameter("ignore_nice_load", 0, 1)); } else if (fileName.equals("boost_timeout")) { mParams.add(new Parameter("boost_timeout", 0, 10000000, "μs")); } } //mParams.add(new Parameter("down_differential", 0, 0)); } else if ("lulzactive".equals(governor)) { CpuControlSetting cpuControlSetting = new CpuControlSetting(context); String[] freqValues = cpuControlSetting.getAvailableFrequencies(); String[] freqEntries = Misc.getFreqencyEntries(freqValues); for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("inc_cpu_load")) { mParams.add(new Parameter("inc_cpu_load", 10, 100)); } else if (fileName.equals("pump_up_step")) { mParams.add(new Parameter("pump_up_step", 0, freqEntries.length)); } else if (fileName.equals("pump_down_step")) { mParams.add(new Parameter("pump_down_step", 0, freqEntries.length)); } else if (fileName.equals("screen_off_min_step")) { mParams.add(new Parameter("screen_off_min_step", 0, freqEntries.length)); } else if (fileName.equals("up_sample_time")) { mParams.add(new Parameter("up_sample_time", 10000, 50000, "μs")); } else if (fileName.equals("down_sample_time")) { mParams.add(new Parameter("down_sample_time", 10000, 100000, "μs")); } } } else if ("smartassV2".equals(governor)) { mGovernor = "smartass"; CpuControlSetting cpuControlSetting = new CpuControlSetting(context); String[] freqValues = cpuControlSetting.getAvailableFrequencies(); String[] freqEntries = Misc.getFreqencyEntries(freqValues); for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("max_cpu_load")) { mParams.add(new Parameter("max_cpu_load", 1, 100, "%")); } else if (fileName.equals("min_cpu_load")) { mParams.add(new Parameter("min_cpu_load", 1, 100, "%")); } else if (fileName.equals("up_rate_us")) { mParams.add(new Parameter("up_rate_us", 1, 100000000, "μs")); } else if (fileName.equals("down_rate_us")) { mParams.add(new Parameter("down_rate_us", 1, 100000000, "μs")); } else if (fileName.equals("ramp_down_step")) { mParams.add(new Parameter("ramp_down_step", 1, 100000000, "μs")); } else if (fileName.equals("ramp_up_step")) { mParams.add(new Parameter("ramp_up_step", 1, 100000000, "μs")); } else if (fileName.equals("sample_rate_jiffies")) { mParams.add(new Parameter("sample_rate_jiffies", 1, 1000)); } else if (fileName.equals("awake_ideal_freq")) { mParams.add(new Parameter("awake_ideal_freq", freqEntries, freqValues)); } else if (fileName.equals("sleep_ideal_freq")) { mParams.add(new Parameter("sleep_ideal_freq", freqEntries, freqValues)); } else if (fileName.equals("sleep_wakeup_freq")) { mParams.add(new Parameter("sleep_wakeup_freq", freqEntries, freqValues)); } //mParams.add(new Parameter("debug_mask", 0, 0)); } } else if ("interactiveX".equals(governor)) { for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("min_sample_time")) { mParams.add(new Parameter("min_sample_time", 10000, 1000000)); } } } else if ("interactive".equals(governor)) { CpuControlSetting cpuControlSetting = new CpuControlSetting(context); String[] freqValues = cpuControlSetting.getAvailableFrequencies(); String[] freqEntries = Misc.getFreqencyEntries(freqValues); for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("go_maxspeed_load")) { mParams.add(new Parameter("go_maxspeed_load", 5, 100, "%")); } else if (fileName.equals("min_sample_time")) { mParams.add(new Parameter("min_sample_time", 10000, 1000000, "μs")); } else if (fileName.equals("above_hispeed_delay")) { mParams.add(new Parameter("above_hispeed_delay", 10000, 1000000, "μs")); } else if (fileName.equals("boost")) { mParams.add(new Parameter("boost", 0, 1)); } else if (fileName.equals("go_hispeed_load")) { mParams.add(new Parameter("go_hispeed_load", 5, 100)); } else if (fileName.equals("hispeed_freq")) { mParams.add(new Parameter("hispeed_freq", freqEntries, freqValues)); } else if (fileName.equals("input_boost")) { mParams.add(new Parameter("input_boost", 0, 1)); } else if (fileName.equals("timer_rate")) { mParams.add(new Parameter("min_sample_time", 10000, 1000000, "μs")); } } } else if ("hotplug".equals(governor)) { for (File param : govParams) { String fileName = param.getName(); if (fileName.equals("sampling_rate")) { mParams.add(new Parameter("sampling_rate", 10000, 1000000, "μs")); } else if (fileName.equals("up_threshold")) { mParams.add(new Parameter("up_threshold", 1, 100, "%")); } else if (fileName.equals("down_threshold")) { mParams.add(new Parameter("down_threshold", 1, 100, "%")); } else if (fileName.equals("hotplug_in_sampling_periods")) { mParams.add(new Parameter("hotplug_in_sampling_periods", 0, 0)); } else if (fileName.equals("hotplug_out_sampling_periods")) { mParams.add(new Parameter("hotplug_out_sampling_periods", 0, 0)); } else if (fileName.equals("ignore_nice_load")) { mParams.add(new Parameter("ignore_nice_load", 0, 1)); } } } else if ("wheatley".equals(governor)) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/sampling_rate_min"); String samplingRateMin = sysFs.read(mRootProcess); mParams.add(new Parameter("sampling_rate", Integer.valueOf(samplingRateMin), SAMPING_RATE_MAX)); mParams.add(new Parameter("ignore_nice_load", 0, 1)); mParams.add(new Parameter("powersave_bias", 0, 1000)); mParams.add(new Parameter("up_threshold", 1, 100, "%")); mParams.add(new Parameter("allowed_misses", 0, 100)); mParams.add(new Parameter("target_residency", 10, 100000)); } else if ("adaptive".equals(governor)) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/sampling_rate_min"); String samplingRateMin = sysFs.read(mRootProcess); mParams.add(new Parameter("sampling_rate", Integer.valueOf(samplingRateMin), SAMPING_RATE_MAX)); mParams.add(new Parameter("ignore_nice_load", 0, 1)); mParams.add(new Parameter("up_threshold", 1, 100, "%")); } else if ("conservative".equals(governor)) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/sampling_rate_min"); String samplingRateMin = sysFs.read(mRootProcess); mParams.add(new Parameter("sampling_rate", Integer.valueOf(samplingRateMin), SAMPING_RATE_MAX)); mParams.add(new Parameter("up_threshold", 1, 100, "%")); mParams.add(new Parameter("down_threshold", 1, 100, "%")); mParams.add(new Parameter("freq_step", 5, 100, "%")); mParams.add(new Parameter("ignore_nice_load", 0, 1)); //mParams.add(new Parameter("sampling_down_factor", 0, 0)); } else if ("ondemandx".equals(governor)) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/sampling_rate_min"); String samplingRateMin = sysFs.read(mRootProcess); CpuControlSetting cpuControlSetting = new CpuControlSetting(context); String[] freqValues = cpuControlSetting.getAvailableFrequencies(); String[] freqEntries = Misc.getFreqencyEntries(freqValues); mParams.add(new Parameter("sampling_rate", Integer.valueOf(samplingRateMin), SAMPING_RATE_MAX)); mParams.add(new Parameter("up_threshold", 5, 100, "%")); mParams.add(new Parameter("ignore_nice_load", 0, 1)); mParams.add(new Parameter("powersave_bias", 0, 1000)); mParams.add(new Parameter("suspend_freq", freqEntries, freqValues)); //mParams.add(new Parameter("down_differential", 0, 0)); } else if ("ondemand".equals(governor)) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/sampling_rate_min"); String samplingRateMin = sysFs.read(mRootProcess); mParams.add(new Parameter("sampling_rate", Integer.valueOf(samplingRateMin), SAMPING_RATE_MAX)); mParams.add(new Parameter("up_threshold", 5, 100, "%")); mParams.add(new Parameter("ignore_nice_load", 0, 1)); mParams.add(new Parameter("powersave_bias", 0, 1000)); } else if ("powersave".equals(governor)) { // nothing parameter } else if ("powersave".equals(governor)) { // nothing parameter } } public Parameter[] getParameters() { return mParams.toArray(new Parameter[0]); } public String makeKey(String paramName) { return "cpu_" + mGovernor + "_" + paramName; } public String getValue(String paramName) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/" + paramName); return sysFs.read(mRootProcess); } public void setValue(String paramName, String value) { SysFs sysFs = new SysFs(CTRL_PATH + "/" + mGovernor + "/" + paramName); sysFs.write(value, mRootProcess); } public String loadValue(String paramName) { String key = makeKey(paramName); return super.getStringValue(key); } @Override public void setOnBoot() { // noop } @Override public void setRecommend() { // noop } @Override public void reset() { // noop } }