nx: migrate to perfmgr OSS power HAL

- Exercise greater control over hinting, power profiles, specific
  behavior, etc.
- Better support in the future vs maintaining phs
- Totally nuke nvcpl to remove variables in display handling and
  power profiles

Change-Id: If9076248fcacfdc8165bd814ad78786134997b97
This commit is contained in:
tmakin authored and Nolen Johnson committed 2025-02-14 12:52:37 -05:00
1 parent d33f7e37f9
commit 6fe016e60e
9 files changed
+675 -63

No files matched your search

+4
View File
@@ -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
@@ -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);
@@ -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);
}
}
@@ -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");
+9
View File
@@ -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
+50
View File
@@ -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,
}
+30
View File
@@ -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.
+256
View File
@@ -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"
}
]
}
+284
View File
@@ -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"
}
]
}