sm6375-common: power-libperfmgr: allow powerhint calls as soon as service starts

Bug: 147840817
Test: boot
Change-Id: Ic1d6e04109683b999bb99484930e95dc9813fc59
This commit is contained in:
Wei Wang 2024-07-18 20:16:00 +05:30 committed by Anand S
parent a1435fd888
commit 3a0fabd235
No known key found for this signature in database
GPG key ID: 3B2983FA448B3D61
5 changed files with 23 additions and 53 deletions

View file

@ -41,7 +41,11 @@ constexpr char kPowerHalStateProp[] = "vendor.powerhal.state";
constexpr char kPowerHalAudioProp[] = "vendor.powerhal.audio"; constexpr char kPowerHalAudioProp[] = "vendor.powerhal.audio";
constexpr char kPowerHalRenderingProp[] = "vendor.powerhal.rendering"; constexpr char kPowerHalRenderingProp[] = "vendor.powerhal.rendering";
void Power::setReady() { Power::Power(std::shared_ptr<HintManager> hm)
: mHintManager(hm),
mInteractionHandler(nullptr),
mVRModeOn(false),
mSustainedPerfModeOn(false) {
mInteractionHandler = std::make_unique<InteractionHandler>(mHintManager); mInteractionHandler = std::make_unique<InteractionHandler>(mHintManager);
mInteractionHandler->Init(); mInteractionHandler->Init();
@ -76,14 +80,10 @@ void Power::setReady() {
} }
// Now start to take powerhint // Now start to take powerhint
mReady.store(true);
ALOGI("PowerHAL ready to process hints"); ALOGI("PowerHAL ready to process hints");
} }
ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) {
if (!mReady) {
return ndk::ScopedAStatus::ok();
}
LOG(DEBUG) << "Power setMode: " << toString(type) << " to: " << enabled; LOG(DEBUG) << "Power setMode: " << toString(type) << " to: " << enabled;
ATRACE_INT(toString(type).c_str(), enabled); ATRACE_INT(toString(type).c_str(), enabled);
switch (type) { switch (type) {
@ -170,9 +170,6 @@ ndk::ScopedAStatus Power::isModeSupported(Mode type, bool *_aidl_return) {
} }
ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) { ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) {
if (!mReady) {
return ndk::ScopedAStatus::ok();
}
LOG(DEBUG) << "Power setBoost: " << toString(type) << " duration: " << durationMs; LOG(DEBUG) << "Power setBoost: " << toString(type) << " duration: " << durationMs;
ATRACE_INT(toString(type).c_str(), durationMs); ATRACE_INT(toString(type).c_str(), durationMs);
switch (type) { switch (type) {
@ -221,20 +218,18 @@ constexpr const char *boolToString(bool b) {
} }
binder_status_t Power::dump(int fd, const char **, uint32_t) { binder_status_t Power::dump(int fd, const char **, uint32_t) {
if (mReady) { std::string buf(::android::base::StringPrintf(
std::string buf(::android::base::StringPrintf( "HintManager Running: %s\n"
"HintManager Running: %s\n" "VRMode: %s\n"
"VRMode: %s\n" "SustainedPerformanceMode: %s\n",
"SustainedPerformanceMode: %s\n", boolToString(mHintManager->IsRunning()), boolToString(mVRModeOn),
boolToString(mHintManager->IsRunning()), boolToString(mVRModeOn), boolToString(mSustainedPerfModeOn)));
boolToString(mSustainedPerfModeOn))); // Dump nodes through libperfmgr
// Dump nodes through libperfmgr mHintManager->DumpToFd(fd);
mHintManager->DumpToFd(fd); if (!::android::base::WriteStringToFd(buf, fd)) {
if (!::android::base::WriteStringToFd(buf, fd)) { PLOG(ERROR) << "Failed to dump state to fd";
PLOG(ERROR) << "Failed to dump state to fd";
}
fsync(fd);
} }
fsync(fd);
return STATUS_OK; return STATUS_OK;
} }

View file

@ -37,26 +37,18 @@ using ::android::perfmgr::HintManager;
class Power : public BnPower { class Power : public BnPower {
public: public:
Power(std::shared_ptr<HintManager> hm) Power(std::shared_ptr<HintManager> hm);
: mHintManager(hm),
mInteractionHandler(nullptr),
mVRModeOn(false),
mSustainedPerfModeOn(false),
mReady(false) {}
ndk::ScopedAStatus setMode(Mode type, bool enabled) override; ndk::ScopedAStatus setMode(Mode type, bool enabled) override;
ndk::ScopedAStatus isModeSupported(Mode type, bool *_aidl_return) override; ndk::ScopedAStatus isModeSupported(Mode type, bool *_aidl_return) override;
ndk::ScopedAStatus setBoost(Boost type, int32_t durationMs) override; ndk::ScopedAStatus setBoost(Boost type, int32_t durationMs) override;
ndk::ScopedAStatus isBoostSupported(Boost type, bool *_aidl_return) override; ndk::ScopedAStatus isBoostSupported(Boost type, bool *_aidl_return) override;
binder_status_t dump(int fd, const char **args, uint32_t numArgs) override; binder_status_t dump(int fd, const char **args, uint32_t numArgs) override;
void setReady();
private: private:
std::shared_ptr<HintManager> mHintManager; std::shared_ptr<HintManager> mHintManager;
std::unique_ptr<InteractionHandler> mInteractionHandler; std::unique_ptr<InteractionHandler> mInteractionHandler;
std::atomic<bool> mVRModeOn; std::atomic<bool> mVRModeOn;
std::atomic<bool> mSustainedPerfModeOn; std::atomic<bool> mSustainedPerfModeOn;
std::atomic<bool> mReady;
}; };
} // namespace pixel } // namespace pixel

View file

@ -38,16 +38,7 @@ namespace extension {
namespace power { namespace power {
namespace impl { namespace impl {
void PowerExt::setReady() {
// Now start to take powerhint
mReady.store(true);
ALOGI("PowerHAL extension ready to process hints");
}
ndk::ScopedAStatus PowerExt::setMode(const std::string &mode, bool enabled) { ndk::ScopedAStatus PowerExt::setMode(const std::string &mode, bool enabled) {
if (!mReady) {
return ndk::ScopedAStatus::ok();
}
LOG(DEBUG) << "PowerExt setMode: " << mode << " to: " << enabled; LOG(DEBUG) << "PowerExt setMode: " << mode << " to: " << enabled;
ATRACE_INT(mode.c_str(), enabled); ATRACE_INT(mode.c_str(), enabled);
@ -68,9 +59,6 @@ ndk::ScopedAStatus PowerExt::isModeSupported(const std::string &mode, bool *_aid
} }
ndk::ScopedAStatus PowerExt::setBoost(const std::string &boost, int32_t durationMs) { ndk::ScopedAStatus PowerExt::setBoost(const std::string &boost, int32_t durationMs) {
if (!mReady) {
return ndk::ScopedAStatus::ok();
}
LOG(DEBUG) << "PowerExt setBoost: " << boost << " duration: " << durationMs; LOG(DEBUG) << "PowerExt setBoost: " << boost << " duration: " << durationMs;
ATRACE_INT(boost.c_str(), durationMs); ATRACE_INT(boost.c_str(), durationMs);

View file

@ -35,17 +35,14 @@ using ::android::perfmgr::HintManager;
class PowerExt : public BnPowerExt { class PowerExt : public BnPowerExt {
public: public:
PowerExt(std::shared_ptr<HintManager> hm) : mHintManager(hm), mReady(false) {} PowerExt(std::shared_ptr<HintManager> hm) : mHintManager(hm) {}
ndk::ScopedAStatus setMode(const std::string &mode, bool enabled) override; ndk::ScopedAStatus setMode(const std::string &mode, bool enabled) override;
ndk::ScopedAStatus isModeSupported(const std::string &mode, bool *_aidl_return) override; ndk::ScopedAStatus isModeSupported(const std::string &mode, bool *_aidl_return) override;
ndk::ScopedAStatus setBoost(const std::string &boost, int32_t durationMs) override; ndk::ScopedAStatus setBoost(const std::string &boost, int32_t durationMs) override;
ndk::ScopedAStatus isBoostSupported(const std::string &boost, bool *_aidl_return) override; ndk::ScopedAStatus isBoostSupported(const std::string &boost, bool *_aidl_return) override;
void setReady();
private: private:
std::shared_ptr<HintManager> mHintManager; std::shared_ptr<HintManager> mHintManager;
std::atomic<bool> mReady;
}; };
} // namespace impl } // namespace impl

View file

@ -34,7 +34,7 @@ constexpr char kPowerHalConfigPath[] = "/vendor/etc/powerhint.json";
constexpr char kPowerHalInitProp[] = "vendor.powerhal.init"; constexpr char kPowerHalInitProp[] = "vendor.powerhal.init";
int main() { int main() {
LOG(INFO) << "Power HAL AIDL Service for moto_sm6375 is starting."; LOG(INFO) << "Power HAL AIDL Service for moto_sm6375 with Extension is starting.";
// Parse config but do not start the looper // Parse config but do not start the looper
std::shared_ptr<HintManager> hm = HintManager::GetFromJSON(kPowerHalConfigPath, false); std::shared_ptr<HintManager> hm = HintManager::GetFromJSON(kPowerHalConfigPath, false);
@ -45,14 +45,14 @@ int main() {
// single thread // single thread
ABinderProcess_setThreadPoolMaxThreadCount(0); ABinderProcess_setThreadPoolMaxThreadCount(0);
// power hal core service // core service
std::shared_ptr<Power> pw = ndk::SharedRefBase::make<Power>(hm); std::shared_ptr<Power> pw = ndk::SharedRefBase::make<Power>(hm);
ndk::SpAIBinder pwBinder = pw->asBinder(); ndk::SpAIBinder pwBinder = pw->asBinder();
// making the extension service // extension service
std::shared_ptr<PowerExt> pwExt = ndk::SharedRefBase::make<PowerExt>(hm); std::shared_ptr<PowerExt> pwExt = ndk::SharedRefBase::make<PowerExt>(hm);
// need to attach the extension to the same binder we will be registering // attach the extension to the same binder we will be registering
CHECK(STATUS_OK == AIBinder_setExtension(pwBinder.get(), pwExt->asBinder().get())); CHECK(STATUS_OK == AIBinder_setExtension(pwBinder.get(), pwExt->asBinder().get()));
const std::string instance = std::string() + Power::descriptor + "/default"; const std::string instance = std::string() + Power::descriptor + "/default";
@ -63,12 +63,10 @@ int main() {
std::thread initThread([&]() { std::thread initThread([&]() {
::android::base::WaitForProperty(kPowerHalInitProp, "1"); ::android::base::WaitForProperty(kPowerHalInitProp, "1");
hm->Start(); hm->Start();
pw->setReady();
pwExt->setReady();
}); });
initThread.detach(); initThread.detach();
ABinderProcess_joinThreadPool(); ABinderProcess_joinThreadPool();
LOG(ERROR) << "Power HAL AIDL Service for moto_sm6375 died."; LOG(ERROR) << "Power HAL AIDL Service for moto_sm6375 with Extension just died.";
return EXIT_FAILURE; // should not reach return EXIT_FAILURE; // should not reach
} }