10b9a52e3Sopenharmony_ci/* 20b9a52e3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 30b9a52e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40b9a52e3Sopenharmony_ci * you may not use this file except in compliance with the License. 50b9a52e3Sopenharmony_ci * You may obtain a copy of the License at 60b9a52e3Sopenharmony_ci * 70b9a52e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80b9a52e3Sopenharmony_ci * 90b9a52e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100b9a52e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110b9a52e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120b9a52e3Sopenharmony_ci * See the License for the specific language governing permissions and 130b9a52e3Sopenharmony_ci * limitations under the License. 140b9a52e3Sopenharmony_ci */ 150b9a52e3Sopenharmony_ci 160b9a52e3Sopenharmony_ci#include "rtg_interface.h" 170b9a52e3Sopenharmony_ci#include <sys/ioctl.h> 180b9a52e3Sopenharmony_ci#include <fcntl.h> 190b9a52e3Sopenharmony_ci#include <unistd.h> 200b9a52e3Sopenharmony_ci#include <securec.h> 210b9a52e3Sopenharmony_ci#include <cstdio> 220b9a52e3Sopenharmony_ci#include <string> 230b9a52e3Sopenharmony_ci#include <vector> 240b9a52e3Sopenharmony_ci#include <cerrno> 250b9a52e3Sopenharmony_ci#include "bits/ioctl.h" 260b9a52e3Sopenharmony_ci#include "rme_log_domain.h" 270b9a52e3Sopenharmony_ci 280b9a52e3Sopenharmony_ci#undef LOG_TAG 290b9a52e3Sopenharmony_ci#define LOG_TAG "rtg_interface" 300b9a52e3Sopenharmony_ci 310b9a52e3Sopenharmony_cinamespace OHOS { 320b9a52e3Sopenharmony_cinamespace RME { 330b9a52e3Sopenharmony_cinamespace { 340b9a52e3Sopenharmony_ciconstexpr size_t MAX_LENGTH = 100; 350b9a52e3Sopenharmony_ci} 360b9a52e3Sopenharmony_ci 370b9a52e3Sopenharmony_ciconst char RTG_SCHED_IPC_MAGIC = 0xAB; 380b9a52e3Sopenharmony_cistatic int g_fd = -1; 390b9a52e3Sopenharmony_ci 400b9a52e3Sopenharmony_ci#define CMD_ID_SET_ENABLE \ 410b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_ENABLE, struct rtg_enable_data) 420b9a52e3Sopenharmony_ci#define CMD_ID_SET_RTG \ 430b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_RTG, struct rtg_str_data) 440b9a52e3Sopenharmony_ci#define CMD_ID_SET_CONFIG \ 450b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_CONFIG, struct rtg_str_data) 460b9a52e3Sopenharmony_ci#define CMD_ID_SET_RTG_ATTR \ 470b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_RTG_ATTR, struct rtg_str_data) 480b9a52e3Sopenharmony_ci#define CMD_ID_BEGIN_FRAME_FREQ \ 490b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, BEGIN_FRAME_FREQ, struct proc_state_data) 500b9a52e3Sopenharmony_ci#define CMD_ID_END_FRAME_FREQ \ 510b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, END_FRAME_FREQ, struct proc_state_data) 520b9a52e3Sopenharmony_ci#define CMD_ID_END_SCENE \ 530b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, END_SCENE, struct proc_state_data) 540b9a52e3Sopenharmony_ci#define CMD_ID_SET_MIN_UTIL \ 550b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_MIN_UTIL, struct proc_state_data) 560b9a52e3Sopenharmony_ci#define CMD_ID_SET_MAX_UTIL \ 570b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_MAX_UTIL, struct proc_state_data) 580b9a52e3Sopenharmony_ci#define CMD_ID_SET_MARGIN \ 590b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SET_MARGIN, struct proc_state_data) 600b9a52e3Sopenharmony_ci#define CMD_ID_SEARCH_RTG \ 610b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, SEARCH_RTG, struct proc_state_data) 620b9a52e3Sopenharmony_ci#define CMD_ID_GET_ENABLE \ 630b9a52e3Sopenharmony_ci _IOWR(RTG_SCHED_IPC_MAGIC, GET_ENABLE, struct rtg_enable_data) 640b9a52e3Sopenharmony_ci 650b9a52e3Sopenharmony_ci__attribute__((constructor)) void BasicOpenRtgNode() 660b9a52e3Sopenharmony_ci{ 670b9a52e3Sopenharmony_ci char fileName[] = "/proc/self/sched_rtg_ctrl"; 680b9a52e3Sopenharmony_ci g_fd = open(fileName, O_RDWR); 690b9a52e3Sopenharmony_ci if (g_fd < 0) { 700b9a52e3Sopenharmony_ci RME_LOGI("rtg Open fail, errno = %{public}d(%{public}s), dev = %{public}s", errno, strerror(errno), fileName); 710b9a52e3Sopenharmony_ci return; 720b9a52e3Sopenharmony_ci } 730b9a52e3Sopenharmony_ci RME_LOGI("rtg Open success"); 740b9a52e3Sopenharmony_ci return; 750b9a52e3Sopenharmony_ci} 760b9a52e3Sopenharmony_ci 770b9a52e3Sopenharmony_ci__attribute__((destructor)) void BasicCloseRtgNode() 780b9a52e3Sopenharmony_ci{ 790b9a52e3Sopenharmony_ci if (g_fd < 0) { 800b9a52e3Sopenharmony_ci return; 810b9a52e3Sopenharmony_ci } 820b9a52e3Sopenharmony_ci RME_LOGI("rtg Close g_fd ret is %{public}d", g_fd); 830b9a52e3Sopenharmony_ci close(g_fd); 840b9a52e3Sopenharmony_ci g_fd = -1; 850b9a52e3Sopenharmony_ci} 860b9a52e3Sopenharmony_ci 870b9a52e3Sopenharmony_ciint EnableRtg(bool flag) 880b9a52e3Sopenharmony_ci{ 890b9a52e3Sopenharmony_ci int ret = 0; 900b9a52e3Sopenharmony_ci struct rtg_enable_data enableData; 910b9a52e3Sopenharmony_ci char configStr[] = "load_freq_switch:1;sched_cycle:1"; 920b9a52e3Sopenharmony_ci enableData.enable = flag; 930b9a52e3Sopenharmony_ci enableData.len = sizeof(configStr); 940b9a52e3Sopenharmony_ci enableData.data = configStr; 950b9a52e3Sopenharmony_ci if (g_fd < 0) { 960b9a52e3Sopenharmony_ci return g_fd; 970b9a52e3Sopenharmony_ci } 980b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_ENABLE, &enableData); 990b9a52e3Sopenharmony_ci if (ret != 0) { 1000b9a52e3Sopenharmony_ci RME_LOGE("set rtg config to [%{public}d] failed, ret = %{public}d, errno = %{public}d (%{public}s)", 1010b9a52e3Sopenharmony_ci flag, 1020b9a52e3Sopenharmony_ci ret, 1030b9a52e3Sopenharmony_ci errno, 1040b9a52e3Sopenharmony_ci strerror(errno)); 1050b9a52e3Sopenharmony_ci } else { 1060b9a52e3Sopenharmony_ci RME_LOGI("set rtg config to [%{public}d] success.", flag); 1070b9a52e3Sopenharmony_ci } 1080b9a52e3Sopenharmony_ci return 0; 1090b9a52e3Sopenharmony_ci}; 1100b9a52e3Sopenharmony_ci 1110b9a52e3Sopenharmony_ciint AddThreadToRtg(int tid, int grpId, int prioType, [[maybe_unused]] bool isBlue) 1120b9a52e3Sopenharmony_ci{ 1130b9a52e3Sopenharmony_ci if (g_fd < 0) { 1140b9a52e3Sopenharmony_ci return g_fd; 1150b9a52e3Sopenharmony_ci } 1160b9a52e3Sopenharmony_ci struct rtg_grp_data grp_data; 1170b9a52e3Sopenharmony_ci int ret; 1180b9a52e3Sopenharmony_ci (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); 1190b9a52e3Sopenharmony_ci grp_data.tid_num = 1; 1200b9a52e3Sopenharmony_ci grp_data.tids[0] = tid; 1210b9a52e3Sopenharmony_ci grp_data.grp_id = grpId; 1220b9a52e3Sopenharmony_ci grp_data.rtg_cmd = CMD_ADD_RTG_THREAD; 1230b9a52e3Sopenharmony_ci grp_data.prio_type = prioType; 1240b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); 1250b9a52e3Sopenharmony_ci if (ret != 0) { 1260b9a52e3Sopenharmony_ci RME_LOGE("add thread to rtg failed, grpId = %{public}d, ret = %{public}d, errno = %{public}d (%{public}s)", 1270b9a52e3Sopenharmony_ci grpId, 1280b9a52e3Sopenharmony_ci ret, 1290b9a52e3Sopenharmony_ci errno, 1300b9a52e3Sopenharmony_ci strerror(errno)); 1310b9a52e3Sopenharmony_ci } else { 1320b9a52e3Sopenharmony_ci RME_LOGI("add thread to rtg success"); 1330b9a52e3Sopenharmony_ci } 1340b9a52e3Sopenharmony_ci return ret; 1350b9a52e3Sopenharmony_ci} 1360b9a52e3Sopenharmony_ci 1370b9a52e3Sopenharmony_ciint AddThreadsToRtg(vector<int> tids, int grpId, int prioType, [[maybe_unused]] bool isBlue) 1380b9a52e3Sopenharmony_ci{ 1390b9a52e3Sopenharmony_ci struct rtg_grp_data grp_data; 1400b9a52e3Sopenharmony_ci int ret; 1410b9a52e3Sopenharmony_ci if (g_fd < 0) { 1420b9a52e3Sopenharmony_ci return g_fd; 1430b9a52e3Sopenharmony_ci } 1440b9a52e3Sopenharmony_ci (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); 1450b9a52e3Sopenharmony_ci int num = static_cast<int>(tids.size()); 1460b9a52e3Sopenharmony_ci if (num > MAX_TID_NUM) { 1470b9a52e3Sopenharmony_ci return -1; 1480b9a52e3Sopenharmony_ci } 1490b9a52e3Sopenharmony_ci grp_data.tid_num = num; 1500b9a52e3Sopenharmony_ci grp_data.grp_id = grpId; 1510b9a52e3Sopenharmony_ci grp_data.rtg_cmd = CMD_ADD_RTG_THREAD; 1520b9a52e3Sopenharmony_ci grp_data.prio_type = prioType; 1530b9a52e3Sopenharmony_ci for (int i = 0; i < num; i++) { 1540b9a52e3Sopenharmony_ci if (tids[i] < 0) { 1550b9a52e3Sopenharmony_ci return -1; 1560b9a52e3Sopenharmony_ci } 1570b9a52e3Sopenharmony_ci grp_data.tids[i] = tids[i]; 1580b9a52e3Sopenharmony_ci } 1590b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); 1600b9a52e3Sopenharmony_ci if (ret == 0) { 1610b9a52e3Sopenharmony_ci RME_LOGI("add rtg grp success"); 1620b9a52e3Sopenharmony_ci } else { 1630b9a52e3Sopenharmony_ci RME_LOGE("add thread to rtg failed, grpId = %{public}d, ret = %{public}d, errno = %{public}d (%{public}s)", 1640b9a52e3Sopenharmony_ci grpId, 1650b9a52e3Sopenharmony_ci ret, 1660b9a52e3Sopenharmony_ci errno, 1670b9a52e3Sopenharmony_ci strerror(errno)); 1680b9a52e3Sopenharmony_ci } 1690b9a52e3Sopenharmony_ci return ret; 1700b9a52e3Sopenharmony_ci}; 1710b9a52e3Sopenharmony_ci 1720b9a52e3Sopenharmony_ciint RemoveRtgThread(int tid, [[maybe_unused]] bool isBlue) 1730b9a52e3Sopenharmony_ci{ 1740b9a52e3Sopenharmony_ci if (g_fd < 0) { 1750b9a52e3Sopenharmony_ci return g_fd; 1760b9a52e3Sopenharmony_ci } 1770b9a52e3Sopenharmony_ci struct rtg_grp_data grp_data; 1780b9a52e3Sopenharmony_ci int ret; 1790b9a52e3Sopenharmony_ci (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); 1800b9a52e3Sopenharmony_ci grp_data.tid_num = 1; 1810b9a52e3Sopenharmony_ci grp_data.tids[0] = tid; 1820b9a52e3Sopenharmony_ci grp_data.rtg_cmd = CMD_REMOVE_RTG_THREAD; 1830b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); 1840b9a52e3Sopenharmony_ci if (ret != 0) { 1850b9a52e3Sopenharmony_ci RME_LOGE("remove grp failed, ret = %{public}d, errno = %{public}d (%{public}s)", ret, errno, strerror(errno)); 1860b9a52e3Sopenharmony_ci } else { 1870b9a52e3Sopenharmony_ci RME_LOGI("remove grp success."); 1880b9a52e3Sopenharmony_ci } 1890b9a52e3Sopenharmony_ci return ret; 1900b9a52e3Sopenharmony_ci}; 1910b9a52e3Sopenharmony_ci 1920b9a52e3Sopenharmony_ciint RemoveRtgThreads(vector<int> tids, [[maybe_unused]] bool isBlue) 1930b9a52e3Sopenharmony_ci{ 1940b9a52e3Sopenharmony_ci struct rtg_grp_data grp_data; 1950b9a52e3Sopenharmony_ci int ret; 1960b9a52e3Sopenharmony_ci if (g_fd < 0) { 1970b9a52e3Sopenharmony_ci return g_fd; 1980b9a52e3Sopenharmony_ci } 1990b9a52e3Sopenharmony_ci (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); 2000b9a52e3Sopenharmony_ci int num = static_cast<int>(tids.size()); 2010b9a52e3Sopenharmony_ci if (num > MAX_TID_NUM) { 2020b9a52e3Sopenharmony_ci return -1; 2030b9a52e3Sopenharmony_ci } 2040b9a52e3Sopenharmony_ci grp_data.tid_num = num; 2050b9a52e3Sopenharmony_ci grp_data.rtg_cmd = CMD_REMOVE_RTG_THREAD; 2060b9a52e3Sopenharmony_ci for (int i = 0; i < num; i++) { 2070b9a52e3Sopenharmony_ci if (tids[i] < 0) { 2080b9a52e3Sopenharmony_ci return -1; 2090b9a52e3Sopenharmony_ci } 2100b9a52e3Sopenharmony_ci grp_data.tids[i] = tids[i]; 2110b9a52e3Sopenharmony_ci } 2120b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); 2130b9a52e3Sopenharmony_ci if (ret < 0) { 2140b9a52e3Sopenharmony_ci RME_LOGE("remove grp threads failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); 2150b9a52e3Sopenharmony_ci } else { 2160b9a52e3Sopenharmony_ci RME_LOGI("remove grp threads success, get rtg id %{public}d.", ret); 2170b9a52e3Sopenharmony_ci } 2180b9a52e3Sopenharmony_ci return ret; 2190b9a52e3Sopenharmony_ci} 2200b9a52e3Sopenharmony_ci 2210b9a52e3Sopenharmony_ciint DestroyRtgGrp(int grpId) 2220b9a52e3Sopenharmony_ci{ 2230b9a52e3Sopenharmony_ci if (g_fd < 0) { 2240b9a52e3Sopenharmony_ci return g_fd; 2250b9a52e3Sopenharmony_ci } 2260b9a52e3Sopenharmony_ci struct rtg_grp_data grp_data; 2270b9a52e3Sopenharmony_ci int ret; 2280b9a52e3Sopenharmony_ci (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); 2290b9a52e3Sopenharmony_ci grp_data.rtg_cmd = CMD_DESTROY_RTG_GRP; 2300b9a52e3Sopenharmony_ci grp_data.grp_id = grpId; 2310b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); 2320b9a52e3Sopenharmony_ci if (ret != 0) { 2330b9a52e3Sopenharmony_ci RME_LOGE("destroy rtg grp failed, grpId = %{public}d, ret = %{public}d, errno = %{public}d (%{public}s)", 2340b9a52e3Sopenharmony_ci grpId, 2350b9a52e3Sopenharmony_ci ret, 2360b9a52e3Sopenharmony_ci errno, 2370b9a52e3Sopenharmony_ci strerror(errno)); 2380b9a52e3Sopenharmony_ci } else { 2390b9a52e3Sopenharmony_ci RME_LOGI("destroy rtg grp success, get rtg id:%{public}d, ret:%{public}d.", grpId, ret); 2400b9a52e3Sopenharmony_ci } 2410b9a52e3Sopenharmony_ci return ret; 2420b9a52e3Sopenharmony_ci}; 2430b9a52e3Sopenharmony_ci 2440b9a52e3Sopenharmony_ciint SetFrameRateAndPrioType(int rtgId, int rate, int rtgType) 2450b9a52e3Sopenharmony_ci{ 2460b9a52e3Sopenharmony_ci if (g_fd < 0) { 2470b9a52e3Sopenharmony_ci return g_fd; 2480b9a52e3Sopenharmony_ci } 2490b9a52e3Sopenharmony_ci int ret = 0; 2500b9a52e3Sopenharmony_ci char str_data[MAX_LENGTH] = {}; 2510b9a52e3Sopenharmony_ci (void)sprintf_s(str_data, sizeof(str_data), "rtgId:%d;rate:%d;type:%d", rtgId, rate, rtgType); 2520b9a52e3Sopenharmony_ci struct rtg_str_data strData; 2530b9a52e3Sopenharmony_ci strData.len = strlen(str_data); 2540b9a52e3Sopenharmony_ci strData.data = str_data; 2550b9a52e3Sopenharmony_ci 2560b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_RTG_ATTR, &strData); 2570b9a52e3Sopenharmony_ci if (ret != 0) { 2580b9a52e3Sopenharmony_ci RME_LOGE("set rtg attr failed (rtgId:%{public}d;rate:%{public}d;type:%{public}d), ret = %{public}d, errno = " 2590b9a52e3Sopenharmony_ci "%{public}d (%{public}s)", 2600b9a52e3Sopenharmony_ci rtgId, 2610b9a52e3Sopenharmony_ci rate, 2620b9a52e3Sopenharmony_ci rtgType, 2630b9a52e3Sopenharmony_ci ret, 2640b9a52e3Sopenharmony_ci errno, 2650b9a52e3Sopenharmony_ci strerror(errno)); 2660b9a52e3Sopenharmony_ci } else { 2670b9a52e3Sopenharmony_ci RME_LOGD("set rtg attr success."); 2680b9a52e3Sopenharmony_ci } 2690b9a52e3Sopenharmony_ci return ret; 2700b9a52e3Sopenharmony_ci} 2710b9a52e3Sopenharmony_ci 2720b9a52e3Sopenharmony_ciint BeginFrameFreq(int stateParam) 2730b9a52e3Sopenharmony_ci{ 2740b9a52e3Sopenharmony_ci if (g_fd < 0) { 2750b9a52e3Sopenharmony_ci return g_fd; 2760b9a52e3Sopenharmony_ci } 2770b9a52e3Sopenharmony_ci int ret = 0; 2780b9a52e3Sopenharmony_ci struct proc_state_data state_data; 2790b9a52e3Sopenharmony_ci state_data.state_param = stateParam; 2800b9a52e3Sopenharmony_ci 2810b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_BEGIN_FRAME_FREQ, &state_data); 2820b9a52e3Sopenharmony_ci return ret; 2830b9a52e3Sopenharmony_ci} 2840b9a52e3Sopenharmony_ci 2850b9a52e3Sopenharmony_ciint EndFrameFreq(int stateParam) 2860b9a52e3Sopenharmony_ci{ 2870b9a52e3Sopenharmony_ci if (g_fd < 0) { 2880b9a52e3Sopenharmony_ci return g_fd; 2890b9a52e3Sopenharmony_ci } 2900b9a52e3Sopenharmony_ci int ret = 0; 2910b9a52e3Sopenharmony_ci struct proc_state_data state_data; 2920b9a52e3Sopenharmony_ci state_data.state_param = stateParam; 2930b9a52e3Sopenharmony_ci 2940b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_END_FRAME_FREQ, &state_data); 2950b9a52e3Sopenharmony_ci return ret; 2960b9a52e3Sopenharmony_ci} 2970b9a52e3Sopenharmony_ci 2980b9a52e3Sopenharmony_ciint EndScene(int grpId) 2990b9a52e3Sopenharmony_ci{ 3000b9a52e3Sopenharmony_ci int ret = 0; 3010b9a52e3Sopenharmony_ci if (g_fd < 0) { 3020b9a52e3Sopenharmony_ci RME_LOGE("Open fail /proc/self/sched_rtg_ctrl"); 3030b9a52e3Sopenharmony_ci return g_fd; 3040b9a52e3Sopenharmony_ci } 3050b9a52e3Sopenharmony_ci struct proc_state_data state_data; 3060b9a52e3Sopenharmony_ci state_data.grp_id = grpId; 3070b9a52e3Sopenharmony_ci 3080b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_END_SCENE, &state_data); 3090b9a52e3Sopenharmony_ci if (ret == 0) { 3100b9a52e3Sopenharmony_ci RME_LOGI("set EndScene success."); 3110b9a52e3Sopenharmony_ci } 3120b9a52e3Sopenharmony_ci return ret; 3130b9a52e3Sopenharmony_ci} 3140b9a52e3Sopenharmony_ci 3150b9a52e3Sopenharmony_ciint SetMinUtil(int stateParam) 3160b9a52e3Sopenharmony_ci{ 3170b9a52e3Sopenharmony_ci int ret = 0; 3180b9a52e3Sopenharmony_ci struct proc_state_data state_data; 3190b9a52e3Sopenharmony_ci state_data.state_param = stateParam; 3200b9a52e3Sopenharmony_ci 3210b9a52e3Sopenharmony_ci if (g_fd < 0) { 3220b9a52e3Sopenharmony_ci return g_fd; 3230b9a52e3Sopenharmony_ci } 3240b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_MIN_UTIL, &state_data); 3250b9a52e3Sopenharmony_ci if (ret != 0) { 3260b9a52e3Sopenharmony_ci RME_LOGE("set min util failed, ret = %{public}d, errno = %{public}d (%{public}s)", ret, errno, strerror(errno)); 3270b9a52e3Sopenharmony_ci } else { 3280b9a52e3Sopenharmony_ci RME_LOGI("set min util success, get ret %{public}d.", ret); 3290b9a52e3Sopenharmony_ci } 3300b9a52e3Sopenharmony_ci return ret; 3310b9a52e3Sopenharmony_ci} 3320b9a52e3Sopenharmony_ci 3330b9a52e3Sopenharmony_ciint SetMaxUtil(int grpId, int stateParam) 3340b9a52e3Sopenharmony_ci{ 3350b9a52e3Sopenharmony_ci return 0; 3360b9a52e3Sopenharmony_ci} 3370b9a52e3Sopenharmony_ci 3380b9a52e3Sopenharmony_ciint SetMargin(int stateParam) 3390b9a52e3Sopenharmony_ci{ 3400b9a52e3Sopenharmony_ci int ret = 0; 3410b9a52e3Sopenharmony_ci struct proc_state_data state_data; 3420b9a52e3Sopenharmony_ci state_data.state_param = stateParam; 3430b9a52e3Sopenharmony_ci 3440b9a52e3Sopenharmony_ci if (g_fd < 0) { 3450b9a52e3Sopenharmony_ci return g_fd; 3460b9a52e3Sopenharmony_ci } 3470b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SET_MARGIN, &state_data); 3480b9a52e3Sopenharmony_ci return ret; 3490b9a52e3Sopenharmony_ci} 3500b9a52e3Sopenharmony_ci 3510b9a52e3Sopenharmony_ciint SearchRtgForTid(int tid) 3520b9a52e3Sopenharmony_ci{ 3530b9a52e3Sopenharmony_ci if (g_fd < 0) { 3540b9a52e3Sopenharmony_ci return g_fd; 3550b9a52e3Sopenharmony_ci } 3560b9a52e3Sopenharmony_ci if (tid <= 0) { 3570b9a52e3Sopenharmony_ci RME_LOGI("Search tid err: invalid tid."); 3580b9a52e3Sopenharmony_ci return -1; 3590b9a52e3Sopenharmony_ci } 3600b9a52e3Sopenharmony_ci int ret = 0; 3610b9a52e3Sopenharmony_ci struct proc_state_data search_data; 3620b9a52e3Sopenharmony_ci (void)memset_s(&search_data, sizeof(struct proc_state_data), 0, sizeof(struct proc_state_data)); 3630b9a52e3Sopenharmony_ci search_data.state_param = tid; 3640b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_SEARCH_RTG, &search_data); 3650b9a52e3Sopenharmony_ci if (ret >= 0) { 3660b9a52e3Sopenharmony_ci RME_LOGD("Search tid %{public}d success with rtg_grp %{public}d", tid, ret); 3670b9a52e3Sopenharmony_ci } 3680b9a52e3Sopenharmony_ci return ret; 3690b9a52e3Sopenharmony_ci} 3700b9a52e3Sopenharmony_ci 3710b9a52e3Sopenharmony_ciint GetRtgEnable() 3720b9a52e3Sopenharmony_ci{ 3730b9a52e3Sopenharmony_ci if (g_fd < 0) { 3740b9a52e3Sopenharmony_ci return g_fd; 3750b9a52e3Sopenharmony_ci } 3760b9a52e3Sopenharmony_ci int ret = 0; 3770b9a52e3Sopenharmony_ci struct rtg_enable_data enableData; 3780b9a52e3Sopenharmony_ci ret = ioctl(g_fd, CMD_ID_GET_ENABLE, &enableData); 3790b9a52e3Sopenharmony_ci if (ret < 0) { 3800b9a52e3Sopenharmony_ci RME_LOGE( 3810b9a52e3Sopenharmony_ci "get rtg enable failed, ret = %{public}d, errno = %{public}d (%{public}s)", ret, errno, strerror(errno)); 3820b9a52e3Sopenharmony_ci } 3830b9a52e3Sopenharmony_ci return ret; 3840b9a52e3Sopenharmony_ci} 3850b9a52e3Sopenharmony_ci 3860b9a52e3Sopenharmony_cibool GetAppExpelAbility(const std::string &appBundleName) 3870b9a52e3Sopenharmony_ci{ 3880b9a52e3Sopenharmony_ci return false; 3890b9a52e3Sopenharmony_ci} 3900b9a52e3Sopenharmony_ci} // namespace RME 3910b9a52e3Sopenharmony_ci} // namespace OHOS 392