blob: cda114c5efea9e6a31a78100217cbe7c995f74e7 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef POWER_MANAGER_H_
#define POWER_MANAGER_H_
#include <chrono>
#include <deque>
#include <magma_util/register_io.h>
class PowerManager {
public:
PowerManager(magma::RegisterIo* io);
void EnableCores(magma::RegisterIo* io, uint64_t shader_bitmask);
void ReceivedPowerInterrupt(magma::RegisterIo* io);
uint64_t shader_ready_status() const { return shader_ready_status_; }
uint64_t l2_ready_status() const { return l2_ready_status_; }
// This is called whenever the GPU starts or stops processing work.
void UpdateGpuActive(bool active);
// Retrieves information on what fraction of time in the recent past (last
// 100 ms or so) the GPU was actively processing commands.
void GetGpuActiveInfo(std::chrono::steady_clock::duration* total_time_out,
std::chrono::steady_clock::duration* active_time_out);
private:
friend class TestMsdArmDevice;
friend class TestPowerManager;
struct TimePeriod {
std::chrono::steady_clock::time_point end_time;
std::chrono::steady_clock::duration total_time;
std::chrono::steady_clock::duration active_time;
};
std::deque<TimePeriod>& time_periods() { return time_periods_; }
uint64_t tiler_ready_status_ = 0;
uint64_t l2_ready_status_ = 0;
uint64_t shader_ready_status_ = 0;
std::deque<TimePeriod> time_periods_;
bool gpu_active_ = false;
std::chrono::steady_clock::time_point last_check_time_;
};
#endif // POWER_MANAGER_H_