113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
/*
 | 
						|
 * Copyright (C) 2021 The Android Open Source Project
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include <aidl/android/hardware/power/WorkDuration.h>
 | 
						|
#include <perfmgr/HintManager.h>
 | 
						|
 | 
						|
#include <chrono>
 | 
						|
#include <thread>
 | 
						|
#include <unordered_map>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "AdaptiveCpuConfig.h"
 | 
						|
#include "AdaptiveCpuStats.h"
 | 
						|
#include "Device.h"
 | 
						|
#include "KernelCpuFeatureReader.h"
 | 
						|
#include "Model.h"
 | 
						|
#include "WorkDurationProcessor.h"
 | 
						|
 | 
						|
namespace aidl {
 | 
						|
namespace google {
 | 
						|
namespace hardware {
 | 
						|
namespace power {
 | 
						|
namespace impl {
 | 
						|
namespace pixel {
 | 
						|
 | 
						|
using std::chrono_literals::operator""ms;
 | 
						|
using ::aidl::android::hardware::power::WorkDuration;
 | 
						|
using ::android::perfmgr::HintManager;
 | 
						|
 | 
						|
// Applies CPU frequency hints infered by an ML model based on the recent CPU statistics and work
 | 
						|
// durations.
 | 
						|
// This class's public members are not synchronised and should not be used from multiple threads,
 | 
						|
// with the exception of ReportWorkDuration, which can be called from an arbitrary thread.
 | 
						|
class AdaptiveCpu {
 | 
						|
  public:
 | 
						|
    AdaptiveCpu();
 | 
						|
 | 
						|
    bool IsEnabled() const;
 | 
						|
 | 
						|
    // Called when the Adaptive CPU hint is received. This method enables/disables the Adaptive CPU
 | 
						|
    // thread.
 | 
						|
    void HintReceived(bool enable);
 | 
						|
 | 
						|
    // Reports work durations for processing. This method returns immediately as work durations are
 | 
						|
    // processed asynchonuously.
 | 
						|
    void ReportWorkDurations(const std::vector<WorkDuration> &workDurations,
 | 
						|
                             std::chrono::nanoseconds targetDuration);
 | 
						|
 | 
						|
    // Dump info to a file descriptor. Called when dumping service info.
 | 
						|
    void DumpToFd(int fd) const;
 | 
						|
 | 
						|
    // When PowerExt receives a hint with this name, HintReceived() is called.
 | 
						|
    static constexpr char HINT_NAME[] = "ADAPTIVE_CPU";
 | 
						|
 | 
						|
  private:
 | 
						|
    void StartThread();
 | 
						|
 | 
						|
    void SuspendThread();
 | 
						|
 | 
						|
    // The main loop of Adaptive CPU, which runs in a separate thread.
 | 
						|
    void RunMainLoop();
 | 
						|
 | 
						|
    void WaitForEnabledAndWorkDurations();
 | 
						|
 | 
						|
    Model mModel;
 | 
						|
    WorkDurationProcessor mWorkDurationProcessor;
 | 
						|
    KernelCpuFeatureReader mKernelCpuFeatureReader;
 | 
						|
    AdaptiveCpuStats mAdaptiveCpuStats;
 | 
						|
    const TimeSource mTimeSource;
 | 
						|
 | 
						|
    // The thread in which work durations are processed.
 | 
						|
    std::thread mLoopThread;
 | 
						|
 | 
						|
    // Guards against creating multiple threads in the case HintReceived(true) is called on separate
 | 
						|
    // threads simultaneously.
 | 
						|
    std::mutex mThreadCreationMutex;
 | 
						|
    // Used when waiting in WaitForEnabledAndWorkDurations().
 | 
						|
    std::mutex mWaitMutex;
 | 
						|
 | 
						|
    // A condition variable that will be notified when new work durations arrive.
 | 
						|
    std::condition_variable mWorkDurationsAvailableCondition;
 | 
						|
 | 
						|
    volatile bool mIsEnabled = false;
 | 
						|
    bool mIsInitialized = false;
 | 
						|
    volatile bool mShouldReloadConfig = false;
 | 
						|
    std::chrono::nanoseconds mLastEnabledHintTime;
 | 
						|
    std::chrono::nanoseconds mLastThrottleHintTime;
 | 
						|
    Device mDevice;
 | 
						|
    AdaptiveCpuConfig mConfig = AdaptiveCpuConfig::DEFAULT;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace pixel
 | 
						|
}  // namespace impl
 | 
						|
}  // namespace power
 | 
						|
}  // namespace hardware
 | 
						|
}  // namespace google
 | 
						|
}  // namespace aidl
 |