1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <optional>
20 #include <string>
21 
22 namespace android {
23 namespace perfmgr {
24 
25 struct AdpfConfig {
26     std::string mName;
27     // Pid control
28     bool mPidOn;
29     double mPidPo;
30     double mPidPu;
31     double mPidI;
32     int64_t mPidIInit;
33     int64_t mPidIHigh;
34     int64_t mPidILow;
35     double mPidDo;
36     double mPidDu;
37     // Uclamp boost control
38     bool mUclampMinOn;
39     uint32_t mUclampMinInit;
40     uint32_t mUclampMinHigh;
41     uint32_t mUclampMinLow;
42     // Batch update control
43     uint64_t mSamplingWindowP;
44     uint64_t mSamplingWindowI;
45     uint64_t mSamplingWindowD;
46     int64_t mReportingRateLimitNs;
47     double mTargetTimeFactor;
48     // Stale control
49     double mStaleTimeFactor;
50 
51     std::optional<bool> mGpuBoostOn;
52     std::optional<uint64_t> mGpuBoostCapacityMax;
53     uint64_t mGpuCapacityLoadUpHeadroom;
54 
55     // Heuristic boost control
56     std::optional<bool> mHeuristicBoostOn;
57     std::optional<uint32_t> mHBoostModerateJankThreshold;
58     std::optional<double> mHBoostOffMaxAvgDurRatio;
59     std::optional<double> mHBoostSevereJankPidPu;
60     std::optional<uint32_t> mHBoostSevereJankThreshold;
61     std::optional<std::pair<uint32_t, uint32_t>> mHBoostUclampMinCeilingRange;
62     std::optional<std::pair<uint32_t, uint32_t>> mHBoostUclampMinFloorRange;
63     std::optional<double> mJankCheckTimeFactor;
64     std::optional<uint32_t> mLowFrameRateThreshold;
65     std::optional<uint32_t> mMaxRecordsNum;
66 
67     uint32_t mUclampMinLoadUp;
68     uint32_t mUclampMinLoadReset;
69 
70     // Power efficient sessions
71     std::optional<int32_t> mUclampMaxEfficientBase;
72     std::optional<int32_t> mUclampMaxEfficientOffset;
73 
74     int64_t getPidIInitDivI();
75     int64_t getPidIHighDivI();
76     int64_t getPidILowDivI();
77     void dumpToFd(int fd);
78 
AdpfConfigAdpfConfig79     AdpfConfig(std::string name, bool pidOn, double pidPo, double pidPu, double pidI,
80                int64_t pidIInit, int64_t pidIHigh, int64_t pidILow, double pidDo, double pidDu,
81                bool uclampMinOn, uint32_t uclampMinInit, uint32_t uclampMinHigh,
82                uint32_t uclampMinLow, uint64_t samplingWindowP, uint64_t samplingWindowI,
83                uint64_t samplingWindowD, int64_t reportingRateLimitNs, double targetTimeFactor,
84                double staleTimeFactor, std::optional<bool> gpuBoostOn,
85                std::optional<uint64_t> gpuBoostCapacityMax, uint64_t gpuCapacityLoadUpHeadroom,
86                std::optional<bool> heuristicBoostOn,
87                std::optional<uint32_t> hBoostModerateJankThreshold,
88                std::optional<double> hBoostOffMaxAvgDurRatio,
89                std::optional<double> hBoostSevereJankPidPu,
90                std::optional<uint32_t> hBoostSevereJankThreshold,
91                std::optional<std::pair<uint32_t, uint32_t>> hBoostUclampMinCeilingRange,
92                std::optional<std::pair<uint32_t, uint32_t>> hBoostUclampMinFloorRange,
93                std::optional<double> jankCheckTimeFactor,
94                std::optional<uint32_t> lowFrameRateThreshold, std::optional<uint32_t> maxRecordsNum,
95                uint32_t uclampMinLoadUp, uint32_t uclampMinLoadReset,
96                std::optional<int32_t> uclampMaxEfficientBase,
97                std::optional<int32_t> uclampMaxEfficientOffset)
98         : mName(std::move(name)),
99           mPidOn(pidOn),
100           mPidPo(pidPo),
101           mPidPu(pidPu),
102           mPidI(pidI),
103           mPidIInit(pidIInit),
104           mPidIHigh(pidIHigh),
105           mPidILow(pidILow),
106           mPidDo(pidDo),
107           mPidDu(pidDu),
108           mUclampMinOn(uclampMinOn),
109           mUclampMinInit(uclampMinInit),
110           mUclampMinHigh(uclampMinHigh),
111           mUclampMinLow(uclampMinLow),
112           mSamplingWindowP(samplingWindowP),
113           mSamplingWindowI(samplingWindowI),
114           mSamplingWindowD(samplingWindowD),
115           mReportingRateLimitNs(reportingRateLimitNs),
116           mTargetTimeFactor(targetTimeFactor),
117           mStaleTimeFactor(staleTimeFactor),
118           mGpuBoostOn(gpuBoostOn),
119           mGpuBoostCapacityMax(gpuBoostCapacityMax),
120           mGpuCapacityLoadUpHeadroom(gpuCapacityLoadUpHeadroom),
121           mHeuristicBoostOn(heuristicBoostOn),
122           mHBoostModerateJankThreshold(hBoostModerateJankThreshold),
123           mHBoostOffMaxAvgDurRatio(hBoostOffMaxAvgDurRatio),
124           mHBoostSevereJankPidPu(hBoostSevereJankPidPu),
125           mHBoostSevereJankThreshold(hBoostSevereJankThreshold),
126           mHBoostUclampMinCeilingRange(hBoostUclampMinCeilingRange),
127           mHBoostUclampMinFloorRange(hBoostUclampMinFloorRange),
128           mJankCheckTimeFactor(jankCheckTimeFactor),
129           mLowFrameRateThreshold(lowFrameRateThreshold),
130           mMaxRecordsNum(maxRecordsNum),
131           mUclampMinLoadUp(uclampMinLoadUp),
132           mUclampMinLoadReset(uclampMinLoadReset),
133           mUclampMaxEfficientBase(uclampMaxEfficientBase),
134           mUclampMaxEfficientOffset(uclampMaxEfficientOffset) {}
135 };
136 
137 }  // namespace perfmgr
138 }  // namespace android
139