sm6375-common: power-libperfmgr: Add PID tunables for sample window
Bug: 191480755 Test: Build Signed-off-by: Wei Wang <wvw@google.com> Change-Id: Id559796ee4a423410148b8c2df0524909658af82
This commit is contained in:
parent
c64f218687
commit
c3ec3fccba
1 changed files with 34 additions and 19 deletions
|
@ -21,12 +21,10 @@
|
||||||
#include <android-base/parsedouble.h>
|
#include <android-base/parsedouble.h>
|
||||||
#include <android-base/properties.h>
|
#include <android-base/properties.h>
|
||||||
#include <android-base/stringprintf.h>
|
#include <android-base/stringprintf.h>
|
||||||
#include <log/log.h>
|
#include <sys/syscall.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <utils/Trace.h>
|
#include <utils/Trace.h>
|
||||||
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
|
|
||||||
#include "PowerHintSession.h"
|
#include "PowerHintSession.h"
|
||||||
#include "PowerSessionManager.h"
|
#include "PowerSessionManager.h"
|
||||||
|
|
||||||
|
@ -52,7 +50,9 @@ constexpr char kPowerHalAdpfUclampEnable[] = "vendor.powerhal.adpf.uclamp";
|
||||||
constexpr char kPowerHalAdpfUclampBoostCap[] = "vendor.powerhal.adpf.uclamp.boost_cap";
|
constexpr char kPowerHalAdpfUclampBoostCap[] = "vendor.powerhal.adpf.uclamp.boost_cap";
|
||||||
constexpr char kPowerHalAdpfUclampGranularity[] = "vendor.powerhal.adpf.uclamp.granularity";
|
constexpr char kPowerHalAdpfUclampGranularity[] = "vendor.powerhal.adpf.uclamp.granularity";
|
||||||
constexpr char kPowerHalAdpfStaleTimeFactor[] = "vendor.powerhal.adpf.stale_timeout_factor";
|
constexpr char kPowerHalAdpfStaleTimeFactor[] = "vendor.powerhal.adpf.stale_timeout_factor";
|
||||||
constexpr char kPowerHalAdpfSamplingWindow[] = "vendor.powerhal.adpf.sampling_window";
|
constexpr char kPowerHalAdpfPSamplingWindow[] = "vendor.powerhal.adpf.p.window";
|
||||||
|
constexpr char kPowerHalAdpfISamplingWindow[] = "vendor.powerhal.adpf.i.window";
|
||||||
|
constexpr char kPowerHalAdpfDSamplingWindow[] = "vendor.powerhal.adpf.d.window";
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/* there is no glibc or bionic wrapper */
|
/* there is no glibc or bionic wrapper */
|
||||||
|
@ -105,14 +105,18 @@ static const int64_t sPidIClamp =
|
||||||
: std::abs(static_cast<int64_t>(::android::base::GetIntProperty<int64_t>(
|
: std::abs(static_cast<int64_t>(::android::base::GetIntProperty<int64_t>(
|
||||||
kPowerHalAdpfPidIClamp, 512) /
|
kPowerHalAdpfPidIClamp, 512) /
|
||||||
sPidI));
|
sPidI));
|
||||||
static const int sUclampCap =
|
static const int32_t sUclampCap =
|
||||||
::android::base::GetIntProperty<int>(kPowerHalAdpfUclampBoostCap, 512);
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfUclampBoostCap, 512);
|
||||||
static const uint32_t sUclampGranularity =
|
static const uint32_t sUclampGranularity =
|
||||||
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfUclampGranularity, 5);
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfUclampGranularity, 5);
|
||||||
static const int64_t sStaleTimeFactor =
|
static const int64_t sStaleTimeFactor =
|
||||||
::android::base::GetIntProperty<int64_t>(kPowerHalAdpfStaleTimeFactor, 20);
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfStaleTimeFactor, 20);
|
||||||
static const size_t sSamplingWindow =
|
static const int64_t sPSamplingWindow =
|
||||||
::android::base::GetUintProperty<size_t>(kPowerHalAdpfSamplingWindow, 0);
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfPSamplingWindow, 1);
|
||||||
|
static const int64_t sISamplingWindow =
|
||||||
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfISamplingWindow, 0);
|
||||||
|
static const int64_t sDSamplingWindow =
|
||||||
|
::android::base::GetUintProperty<uint32_t>(kPowerHalAdpfDSamplingWindow, 1);
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
@ -270,12 +274,17 @@ ndk::ScopedAStatus PowerHintSession::reportActualWorkDuration(
|
||||||
mDescriptor->integral_error = std::max(sPidIInit, mDescriptor->integral_error);
|
mDescriptor->integral_error = std::max(sPidIInit, mDescriptor->integral_error);
|
||||||
}
|
}
|
||||||
int64_t targetDurationNanos = (int64_t)mDescriptor->duration.count();
|
int64_t targetDurationNanos = (int64_t)mDescriptor->duration.count();
|
||||||
size_t length = actualDurations.size();
|
int64_t length = actualDurations.size();
|
||||||
size_t start = sSamplingWindow == 0 || sSamplingWindow > length ? 0 : length - sSamplingWindow;
|
int64_t p_start =
|
||||||
|
sPSamplingWindow == 0 || sPSamplingWindow > length ? 0 : length - sPSamplingWindow;
|
||||||
|
int64_t i_start =
|
||||||
|
sISamplingWindow == 0 || sISamplingWindow > length ? 0 : length - sISamplingWindow;
|
||||||
|
int64_t d_start =
|
||||||
|
sDSamplingWindow == 0 || sDSamplingWindow > length ? 0 : length - sDSamplingWindow;
|
||||||
int64_t dt = ns_to_100us(targetDurationNanos);
|
int64_t dt = ns_to_100us(targetDurationNanos);
|
||||||
int64_t err_sum = 0;
|
int64_t err_sum = 0;
|
||||||
int64_t derivative_sum = 0;
|
int64_t derivative_sum = 0;
|
||||||
for (size_t i = start; i < length; i++) {
|
for (int64_t i = std::min({p_start, i_start, d_start}); i < length; i++) {
|
||||||
int64_t actualDurationNanos = actualDurations[i].durationNanos;
|
int64_t actualDurationNanos = actualDurations[i].durationNanos;
|
||||||
if (std::abs(actualDurationNanos) > targetDurationNanos * 20) {
|
if (std::abs(actualDurationNanos) > targetDurationNanos * 20) {
|
||||||
ALOGW("The actual duration is way far from the target (%" PRId64 " >> %" PRId64 ")",
|
ALOGW("The actual duration is way far from the target (%" PRId64 " >> %" PRId64 ")",
|
||||||
|
@ -284,16 +293,22 @@ ndk::ScopedAStatus PowerHintSession::reportActualWorkDuration(
|
||||||
// PID control algorithm
|
// PID control algorithm
|
||||||
int64_t error = ns_to_100us(actualDurationNanos - targetDurationNanos) +
|
int64_t error = ns_to_100us(actualDurationNanos - targetDurationNanos) +
|
||||||
static_cast<int64_t>(sPidOffset);
|
static_cast<int64_t>(sPidOffset);
|
||||||
|
if (i >= d_start) {
|
||||||
derivative_sum += error - mDescriptor->previous_error;
|
derivative_sum += error - mDescriptor->previous_error;
|
||||||
|
}
|
||||||
|
if (i >= p_start) {
|
||||||
err_sum += error;
|
err_sum += error;
|
||||||
mDescriptor->previous_error = error;
|
}
|
||||||
|
if (i >= i_start) {
|
||||||
mDescriptor->integral_error = mDescriptor->integral_error + error * dt;
|
mDescriptor->integral_error = mDescriptor->integral_error + error * dt;
|
||||||
mDescriptor->integral_error = std::min(sPidIClamp, mDescriptor->integral_error);
|
mDescriptor->integral_error = std::min(sPidIClamp, mDescriptor->integral_error);
|
||||||
mDescriptor->integral_error = std::max(-sPidIClamp, mDescriptor->integral_error);
|
mDescriptor->integral_error = std::max(-sPidIClamp, mDescriptor->integral_error);
|
||||||
}
|
}
|
||||||
int64_t pOut = static_cast<int64_t>(sPidP * err_sum / (length - start));
|
mDescriptor->previous_error = error;
|
||||||
|
}
|
||||||
|
int64_t pOut = static_cast<int64_t>(sPidP * err_sum / (length - p_start));
|
||||||
int64_t iOut = static_cast<int64_t>(sPidI * mDescriptor->integral_error);
|
int64_t iOut = static_cast<int64_t>(sPidI * mDescriptor->integral_error);
|
||||||
int64_t dOut = static_cast<int64_t>(sPidD * derivative_sum / dt / (length - start));
|
int64_t dOut = static_cast<int64_t>(sPidD * derivative_sum / dt / (length - d_start));
|
||||||
|
|
||||||
int64_t output = pOut + iOut + dOut;
|
int64_t output = pOut + iOut + dOut;
|
||||||
if (ATRACE_ENABLED()) {
|
if (ATRACE_ENABLED()) {
|
||||||
|
|
Loading…
Reference in a new issue