diff --git a/device.mk b/device.mk index 84b2a4e..67ac0e6 100644 --- a/device.mk +++ b/device.mk @@ -18,11 +18,13 @@ TARGET_TEGRA_VARIANT ?= common TARGET_TEGRA_BT ?= bcm TARGET_TEGRA_CEC := aosp +TARGET_TEGRA_CPL := none TARGET_TEGRA_KERNEL ?= 4.9 TARGET_TEGRA_KEYSTORE := software TARGET_TEGRA_LIGHT ?= lineage TARGET_TEGRA_MAN_LVL := 5 TARGET_TEGRA_MEMTRACK ?= rel-shield-r +TARGET_TEGRA_POWER := perfmgr TARGET_TEGRA_THERMAL ?= lineage TARGET_TEGRA_UBOOT := prebuilt TARGET_TEGRA_WIDEVINE ?= rel-shield-r @@ -167,8 +169,10 @@ PRODUCT_COPY_FILES += \ system/core/libprocessgroup/profiles/task_profiles_28.json:$(TARGET_COPY_OUT_VENDOR)/etc/task_profiles.json # PHS +ifneq ($(TARGET_TEGRA_PHS),) PRODUCT_PACKAGES += \ nvphsd.conf +endif # Recovery PRODUCT_SYSTEM_DEFAULT_PROPERTIES += persist.vendor.recovery_update=true diff --git a/devicesettings/src/org/lineageos/settings/device/BootCompletedReceiver.java b/devicesettings/src/org/lineageos/settings/device/BootCompletedReceiver.java index 368a790..1bbeef3 100644 --- a/devicesettings/src/org/lineageos/settings/device/BootCompletedReceiver.java +++ b/devicesettings/src/org/lineageos/settings/device/BootCompletedReceiver.java @@ -20,9 +20,17 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.hardware.power.IPower; +import android.hardware.power.Mode; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; +import android.util.Log; public class BootCompletedReceiver extends BroadcastReceiver { + private static final String TAG = BootCompletedReceiver.class.getSimpleName(); + private IPower mPerfMgr; + @Override public void onReceive(Context context, Intent intent) { if (SystemProperties.get("ro.product.device", "").equals("nx") && @@ -30,10 +38,27 @@ public class BootCompletedReceiver extends BroadcastReceiver { context.startService(new Intent(context, DockService.class)); } + final SharedPreferences sharedPrefs = context.getSharedPreferences( + "org.lineageos.settings.device_preferences", Context.MODE_PRIVATE); + + mPerfMgr = IPower.Stub.asInterface( + ServiceManager.waitForDeclaredService(IPower.DESCRIPTOR + "/default")); + + // Enable/disable perf mode power mode with perfmgr + final boolean perfMode = sharedPrefs.getBoolean("perf_mode", false); + + try { + mPerfMgr.setMode(Mode.SUSTAINED_PERFORMANCE, false); + if (!perfMode) + mPerfMgr.setMode(Mode.LOW_POWER, true); + else + mPerfMgr.setMode(Mode.LOW_POWER, false); + } catch (RemoteException e) { + Log.e(TAG, "Failed to set on boot power mode!"); + } + // Set preferred OLED panel mode if(SystemProperties.get("ro.boot.hardware.sku", "").equals("fric")) { - final SharedPreferences sharedPrefs = context.getSharedPreferences( - "org.lineageos.settings.device_preferences", Context.MODE_PRIVATE); final String panelMode = sharedPrefs.getString("panel_color_mode", "0x23"); DisplayUtils.setPanelColorMode(panelMode); diff --git a/devicesettings/src/org/lineageos/settings/device/DisplayUtils.java b/devicesettings/src/org/lineageos/settings/device/DisplayUtils.java index 8704ca4..811cfb0 100644 --- a/devicesettings/src/org/lineageos/settings/device/DisplayUtils.java +++ b/devicesettings/src/org/lineageos/settings/device/DisplayUtils.java @@ -17,8 +17,6 @@ package org.lineageos.settings.device; import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; import android.os.RemoteException; import android.provider.Settings; @@ -31,9 +29,6 @@ import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.HashMap; -import com.nvidia.NvCPLSvc.INvCPLRemoteService; -import com.nvidia.framework.NvConstants; - import vendor.nvidia.hardware.graphics.display.V1_0.HwcSvcDisplay; import vendor.nvidia.hardware.graphics.display.V1_0.HwcSvcDisplayMode; import vendor.nvidia.hardware.graphics.display.V1_0.HwcSvcDisplayModePixEnc; @@ -48,8 +43,6 @@ public class DisplayUtils { "/sys/class/backlight/backlight/brightness"; public static final String PANEL_MODE_SYSFS = "/sys/devices/50000000.host1x/tegradc.0/panel_color_mode"; - public static final String PWM_FAN_PROFILE_SYSFS = "/sys/devices/pwm-fan/fan_profile"; - public static final String EST_FAN_PROFILE_SYSFS = "/sys/devices/thermal-fan-est/fan_profile"; public static final String INT_DISPLAY_MODE_SYSFS = "/sys/bus/platform/devices/tegradc.0/enable"; @@ -209,35 +202,4 @@ public class DisplayUtils { public static Integer getPanelBrightness(ContentResolver resolver) { return Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS, 0); } - - - public static void setFanProfile(String profile) { - Log.i(TAG, "Setting fan profile: " + profile); - try { - final FileOutputStream pwmProfile = new FileOutputStream(PWM_FAN_PROFILE_SYSFS); - pwmProfile.write(profile.getBytes()); - pwmProfile.close(); - final FileOutputStream estProfile = new FileOutputStream(EST_FAN_PROFILE_SYSFS); - estProfile.write(profile.getBytes()); - estProfile.close(); - } catch (IOException e) { - Log.w(TAG, "Failed to update fan profile"); - } - } - - public static void setPowerMode(INvCPLRemoteService service, int index) throws RemoteException { - Log.i(TAG, "Setting power mode: " + String.valueOf(index)); - - if(service == null) { - Log.e(TAG, "setPowerMode called on null INvCPLRemoteService"); - return; - } - - Intent intent = new Intent(); - intent.setClassName(NvConstants.NvCPLSvc, NvConstants.NvCPLService); - intent.putExtra(NvConstants.NvOrigin, 1); - intent.putExtra(NvConstants.NvPowerMode , String.valueOf(index)); - - service.handleIntent(intent); - } } diff --git a/devicesettings/src/org/lineageos/settings/device/DockService.java b/devicesettings/src/org/lineageos/settings/device/DockService.java index 6f3f182..532bf78 100644 --- a/devicesettings/src/org/lineageos/settings/device/DockService.java +++ b/devicesettings/src/org/lineageos/settings/device/DockService.java @@ -29,9 +29,8 @@ import android.util.Log; import android.view.IWindowManager; import android.view.WindowManagerPolicyConstants; -import com.nvidia.NvCPLSvc.INvCPLRemoteService; - -import com.nvidia.framework.NvConstants; +import android.hardware.power.IPower; +import android.hardware.power.Mode; import vendor.nvidia.hardware.graphics.display.V1_0.INvDisplay; @@ -41,7 +40,7 @@ public class DockService extends Service { final private Receiver mReceiver = new Receiver(); private INvDisplay mDisplayService; private IWindowManager mWindowManager; - private INvCPLRemoteService mNvCPLSvc = null; + private IPower mPerfMgr; @Override public IBinder onBind(Intent intent) { @@ -53,6 +52,8 @@ public class DockService extends Service { public int onStartCommand(Intent intent, int flags, int startId) { mWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); + mPerfMgr = IPower.Stub.asInterface( + ServiceManager.waitForDeclaredService(IPower.DESCRIPTOR + "/default")); try { mDisplayService = INvDisplay.getService(true /* retry */); @@ -73,29 +74,20 @@ public class DockService extends Service { .getSharedPreferences("org.lineageos.settings.device_preferences", Context.MODE_PRIVATE); final boolean perfMode = sharedPrefs.getBoolean("perf_mode", false); - final String sku = SystemProperties.get("ro.boot.hardware.sku", ""); - - if (mNvCPLSvc == null) { - try { - mNvCPLSvc = INvCPLRemoteService.Stub.asInterface( - ServiceManager.getService("nvcpl")); - } catch (Exception e) { - Log.e(TAG, "Failed to bind to service. " + e.getMessage()); - return; - } - } try { if (connected) { - DisplayUtils.setFanProfile(perfMode ? "Cool" : "Console"); - DisplayUtils.setPowerMode(mNvCPLSvc, perfMode ? - NvConstants.NV_POWER_MODE_MAX_PERF : - NvConstants.NV_POWER_MODE_OPTIMIZED); + mPerfMgr.setMode(Mode.LOW_POWER, false); + if (perfMode) + mPerfMgr.setMode(Mode.SUSTAINED_PERFORMANCE, true); + else + mPerfMgr.setMode(Mode.SUSTAINED_PERFORMANCE, false); } else { - DisplayUtils.setFanProfile(perfMode ? "Cool" : "Handheld"); - DisplayUtils.setPowerMode(mNvCPLSvc, perfMode ? - NvConstants.NV_POWER_MODE_OPTIMIZED : - NvConstants.NV_POWER_MODE_BATTERY_SAVER); + mPerfMgr.setMode(Mode.SUSTAINED_PERFORMANCE, false); + if (perfMode) + mPerfMgr.setMode(Mode.LOW_POWER, false); + else + mPerfMgr.setMode(Mode.LOW_POWER, true); } } catch (RemoteException e) { Log.e(TAG, "Failed to set power profiles"); diff --git a/initfiles/init.nx.rc b/initfiles/init.nx.rc index 14f61d7..5c4c093 100644 --- a/initfiles/init.nx.rc +++ b/initfiles/init.nx.rc @@ -21,11 +21,20 @@ import /vendor/etc/init/hw/init.${ro.boot.hardware.sku}.rc on init setprop ro.surface_flinger.primary_display_orientation ORIENTATION_270 setprop ro.boot.secureos none + setprop vendor.powerhal.config powerhint.${ro.boot.hardware.sku}.json on fs mount_all /vendor/etc/fstab.nx swapon_all /vendor/etc/fstab.nx +on post-fs-data + chmod 0664 /sys/devices/57000000.gpu/devfreq/57000000.gpu/max_freq + chown system system /sys/devices/57000000.gpu/devfreq/57000000.gpu/max_freq + chmod 0664 /sys/devices/57000000.gpu/devfreq/57000000.gpu/min_freq + chown system system /sys/devices/57000000.gpu/devfreq/57000000.gpu/min_freq + chmod 0666 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + on boot write /sys/devices/system/cpu/cpufreq/schedutil/up_rate_limit_us 500 write /sys/module/input_cfboost/parameters/boost_gpu 460800 diff --git a/power/Android.bp b/power/Android.bp new file mode 100644 index 0000000..4499c69 --- /dev/null +++ b/power/Android.bp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2024 The LineageOS Project + * + * 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. + */ + +phony { + name: "powerhint.json", + required: [ + "powerhint.odin.json", + "powerhint.modin.json", + "powerhint.vali.json", + "powerhint.fric.json", + ], +} + +prebuilt_etc { + name: "powerhint.odin.json", + src: "powerhint.t210.json", + vendor: true, +} + +prebuilt_etc { + name: "powerhint.modin.json", + src: "powerhint.t210b01.json", + vendor: true, +} + +/* NOTE: vali sets kernel-side limits so scaling is locked down */ +prebuilt_etc { + name: "powerhint.vali.json", + src: "powerhint.t210b01.json", + vendor: true, +} + +prebuilt_etc { + name: "powerhint.fric.json", + src: "powerhint.t210b01.json", + vendor: true, +} diff --git a/power/README.powerhint b/power/README.powerhint new file mode 100644 index 0000000..af92f8b --- /dev/null +++ b/power/README.powerhint @@ -0,0 +1,30 @@ +# `libperfmgr` Power Profiles + +In lieu of comments, this document is presented. + +## Configs + +We have three `powerhint.${sku}.json` configs, parsed by `libperfmgr` and chosen on init via `vendor.powerhal.config` (see `init.nx.rc`). + +The `odin` config handles T210 performance, based on `CPU_PLL_CVB_TABLE_ODN` and `NA_FREQ_CVB_TABLE`. + +The `modin` config handles performance for `modin` and `fric` which have more robuse cooling and power solutions than `vali` and can support the range of T210B01 freqs, based on `CPUB01_PLL_CVB_TABLE` and `GPUB01_NA_CVB_TABLE`. We rely on `cpufreq` and `devfreq` closest freq matching for the SLT freqs instead of having a billion configs for different tables. + +The `vali` config is tuned for stripped-down B01 performance due to its limited nature. + +## Clocks + +Clocks are based on DVFS tables for ODN (`odin`) and B01. Defaults are chosen based on HOS (low-power and standard profiles) and Shield (perf mode, now mapped to `SUSTAINED_PERFORMANCE` hint fired by `devicesettings`). + +For overclocking, we will provide an option to have init poke the OC sysfs node, and with the perf mode profiles we will likely not have userspace clock limits. This does not allow for fine-grained control, so we may opt to set up some other system for setting `userspace` governor or something like that and allowing users with experience to manually set freqs. + +Profiles are as such: +- LOW_POWER (handheld standard) +- Default (docked standard / handheld perf mode) +- SUSTAINED_PERFORMANCE (docked perf mode) + +DeviceSettings's BootCompletedRecevier handles requesting these on boot. + +## `nvcpl`, `nvphs` + +`libperfmgr` replaces both here. It does not do all CPL does but this is for the best, especially on `nx` where undefined behavior tuned for Shield tables is nsuboptimal. We do not implement CPL's app profiles functionality or some of PHS's hinting--this is stubbed in `tegra-common` and not much uses these APIs anyway. diff --git a/power/powerhint.t210.json b/power/powerhint.t210.json new file mode 100644 index 0000000..5bfca5c --- /dev/null +++ b/power/powerhint.t210.json @@ -0,0 +1,256 @@ +{ + "Nodes": [ + { + "Name": "CPUMinFreq", + "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", + "Values": [ + "204000", + "306000", + "408000", + "510000", + "612000", + "714000", + "816000", + "918000", + "1020000", + "1122000", + "1224000", + "1326000", + "1428000", + "1581000", + "1683000", + "1785000", + "1887000", + "1989000", + "2091000" + ], + "DefaultIndex": 0, + "ResetOnInit": true + }, + { + "Name": "CPUMaxFreq", + "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", + "Values": [ + "204000", + "306000", + "408000", + "510000", + "612000", + "714000", + "816000", + "918000", + "1020000", + "1122000", + "1224000", + "1326000", + "1428000", + "1581000", + "1683000", + "1785000", + "1887000", + "1989000", + "2091000" + ], + "DefaultIndex": 13, + "ResetOnInit": false + }, + { + "Name": "GPUMinFreq", + "Path": "/sys/devices/57000000.gpu/devfreq/57000000.gpu/min_freq", + "Values": [ + "76800000", + "153600000", + "230400000", + "307200000", + "384000000", + "460800000", + "537600000", + "614400000", + "691200000", + "768000000", + "844800000", + "921600000", + "998400000" + ], + "DefaultIndex": 0, + "ResetOnInit": true + }, + { + "Name": "GPUMaxFreq", + "Path": "/sys/devices/57000000.gpu/devfreq/57000000.gpu/max_freq", + "Values": [ + "76800000", + "153600000", + "230400000", + "307200000", + "384000000", + "460800000", + "537600000", + "614400000", + "691200000", + "768000000", + "844800000", + "921600000", + "998400000" + ], + "DefaultIndex": 9, + "ResetOnInit": false + }, + { + "Name": "PwmFanProfile", + "Path": "/sys/devices/pwm-fan/fan_profile", + "Values": [ + "Handheld", + "Console", + "Cool" + ], + "DefaultIndex": 1, + "ResetOnInit": false + }, + { + "Name": "EstFanProfile", + "Path": "/sys/devices/thermal-fan-est/fan_profile", + "Values": [ + "Handheld", + "Console", + "Cool" + ], + "DefaultIndex": 1, + "ResetOnInit": false + } + ], + "Actions": [ + { + "PowerHint": "INTERACTION", + "Node": "CPUMinFreq", + "Duration": 1000, + "Value": "1326000" + }, + { + "PowerHint": "INTERACTION", + "Node": "GPUMinFreq", + "Duration": 1000, + "Value": "537600000" + }, + { + "PowerHint": "GAME_LOADING", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "1326000" + }, + { + "PowerHint": "GAME", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "1326000" + }, + { + "PowerHint": "GAME", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "537600000" + }, + { + "PowerHint": "INTERACTIVE", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "537600000" + }, + { + "PowerHint": "DISPLAY_INACTIVE", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "76800000" + }, + { + "PowerHint": "DISPLAY_INACTIVE", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "204000" + }, + { + "PowerHint": "LAUNCH", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1428000" + }, + { + "PowerHint": "LAUNCH", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "DISPLAY_CHANGE", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1581000" + }, + { + "PowerHint": "DISPLAY_CHANGE", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "DISPLAY_UPDATE_IMMINENT", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1581000" + }, + { + "PowerHint": "DISPLAY_UPDATE_IMMINENT", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "PwmFanProfile", + "Duration": 0, + "Value": "Cool" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "EstFanProfile", + "Duration": 0, + "Value": "Cool" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "CPUMaxFreq", + "Duration": 0, + "Value": "2091000" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "921600000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "204000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "CPUMaxFreq", + "Duration": 0, + "Value": "1224000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "76800000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "460800000" + } + ] +} diff --git a/power/powerhint.t210b01.json b/power/powerhint.t210b01.json new file mode 100644 index 0000000..e188f67 --- /dev/null +++ b/power/powerhint.t210b01.json @@ -0,0 +1,284 @@ +{ + "Nodes": [ + { + "Name": "CPUMinFreq", + "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", + "Values": [ + "204000", + "306000", + "408000", + "510000", + "612000", + "714000", + "816000", + "918000", + "1020000", + "1122000", + "1224000", + "1326000", + "1428000", + "1581000", + "1683000", + "1785000", + "1887000", + "1963500", + "2014500", + "2091000", + "2193000", + "2295000", + "2397000" + ], + "DefaultIndex": 0, + "ResetOnInit": true + }, + { + "Name": "CPUMaxFreq", + "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", + "Values": [ + "204000", + "306000", + "408000", + "510000", + "612000", + "714000", + "816000", + "918000", + "1020000", + "1122000", + "1224000", + "1326000", + "1428000", + "1581000", + "1683000", + "1785000", + "1887000", + "1963500", + "2014500", + "2091000", + "2193000", + "2295000", + "2397000" + ], + "DefaultIndex": 15, + "ResetOnInit": false + }, + { + "Name": "GPUMinFreq", + "Path": "/sys/devices/57000000.gpu/devfreq/57000000.gpu/min_freq", + "Values": [ + "76800000", + "153600000", + "230400000", + "307200000", + "384000000", + "460800000", + "537600000", + "614400000", + "691200000", + "768000000", + "844800000", + "921600000", + "998400000", + "1075200000", + "1152000000", + "1228800000", + "1267200000" + ], + "DefaultIndex": 0, + "ResetOnInit": true + }, + { + "Name": "GPUMaxFreq", + "Path": "/sys/devices/57000000.gpu/devfreq/57000000.gpu/max_freq", + "Values": [ + "76800000", + "153600000", + "230400000", + "307200000", + "384000000", + "460800000", + "537600000", + "614400000", + "691200000", + "768000000", + "844800000", + "921600000", + "998400000", + "1075200000", + "1152000000", + "1228800000", + "1267200000" + ], + "DefaultIndex": 11, + "ResetOnInit": false + }, + { + "Name": "PwmFanProfile", + "Path": "/sys/devices/pwm-fan/fan_profile", + "Values": [ + "Handheld", + "Console", + "Cool" + ], + "DefaultIndex": 1, + "ResetOnInit": false + }, + { + "Name": "EstFanProfile", + "Path": "/sys/devices/thermal-fan-est/fan_profile", + "Values": [ + "Handheld", + "Console", + "Cool" + ], + "DefaultIndex": 1, + "ResetOnInit": false + } + ], + "Actions": [ + { + "PowerHint": "INTERACTION", + "Node": "CPUMinFreq", + "Duration": 1000, + "Value": "1326000" + }, + { + "PowerHint": "INTERACTION", + "Node": "GPUMinFreq", + "Duration": 1000, + "Value": "537600000" + }, + { + "PowerHint": "GAME_LOADING", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "1326000" + }, + { + "PowerHint": "GAME", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "1326000" + }, + { + "PowerHint": "GAME", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "537600000" + }, + { + "PowerHint": "INTERACTIVE", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "537600000" + }, + { + "PowerHint": "DISPLAY_INACTIVE", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "76800000" + }, + { + "PowerHint": "DISPLAY_INACTIVE", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "204000" + }, + { + "PowerHint": "LAUNCH", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1428000" + }, + { + "PowerHint": "LAUNCH", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "DISPLAY_CHANGE", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1581000" + }, + { + "PowerHint": "DISPLAY_CHANGE", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "DISPLAY_UPDATE_IMMINENT", + "Node": "CPUMinFreq", + "Duration": 5000, + "Value": "1581000" + }, + { + "PowerHint": "DISPLAY_UPDATE_IMMINENT", + "Node": "GPUMinFreq", + "Duration": 5000, + "Value": "307200000" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "PwmFanProfile", + "Duration": 0, + "Value": "Cool" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "EstFanProfile", + "Duration": 0, + "Value": "Cool" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "CPUMaxFreq", + "Duration": 0, + "Value": "2397000" + }, + { + "PowerHint": "SUSTAINED_PERFORMANCE", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "1267200000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "PwmFanProfile", + "Duration": 0, + "Value": "Handheld" + }, + { + "PowerHint": "LOW_POWER", + "Node": "EstFanProfile", + "Duration": 0, + "Value": "Handheld" + }, + { + "PowerHint": "LOW_POWER", + "Node": "CPUMinFreq", + "Duration": 0, + "Value": "204000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "CPUMaxFreq", + "Duration": 0, + "Value": "1785000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "GPUMinFreq", + "Duration": 0, + "Value": "76800000" + }, + { + "PowerHint": "LOW_POWER", + "Node": "GPUMaxFreq", + "Duration": 0, + "Value": "768000000" + } + ] +}