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