blob: 7a09ce88163635e99ae425ff2fb7a8c01f201914 [file] [log] [blame]
// Copyright 2016 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 FORCEWAKE_H
#define FORCEWAKE_H
#include <lib/magma/util/short_macros.h>
#include <optional>
#include "msd_intel_register_io.h"
#include "registers.h"
class ForceWake {
public:
ForceWake(MsdIntelRegisterIo* register_io, uint32_t device_id);
registers::ForceWakeStatus* get_status_register(ForceWakeDomain domain) {
switch (domain) {
case ForceWakeDomain::RENDER:
return status_render_ ? &(*status_render_) : nullptr;
case ForceWakeDomain::GEN9_MEDIA:
return status_gen9_media_ ? &(*status_gen9_media_) : nullptr;
case ForceWakeDomain::GEN12_VDBOX0:
return status_gen12_vdbox0_ ? &(*status_gen12_vdbox0_) : nullptr;
}
}
bool is_active_cached(ForceWakeDomain domain) {
return (get_status_register(domain)->status() & (1 << kThreadShift)) != 0;
}
static uint32_t get_request_offset(ForceWakeDomain domain) {
switch (domain) {
case ForceWakeDomain::RENDER:
return registers::ForceWakeRequest::kRenderOffset;
case ForceWakeDomain::GEN9_MEDIA:
return registers::ForceWakeRequest::kGen9MediaOffset;
case ForceWakeDomain::GEN12_VDBOX0:
return registers::ForceWakeRequest::kGen12Vdbox0Offset;
}
}
bool IsActive(MsdIntelRegisterIo* reg_io, ForceWakeDomain domain);
bool Reset(MsdIntelRegisterIo* reg_io, ForceWakeDomain domain);
bool Request(MsdIntelRegisterIo* reg_io, ForceWakeDomain domain);
bool Release(MsdIntelRegisterIo* reg_io, ForceWakeDomain domain);
static constexpr uint32_t kThreadShift = 0;
static constexpr uint32_t kMaxRetries = 20;
static constexpr uint32_t kRetryDelayUs = 10;
static constexpr uint32_t kRetryMaxUs = kMaxRetries * kRetryDelayUs;
private:
bool Wait(MsdIntelRegisterIo* register_io, ForceWakeDomain domain, bool set);
std::optional<registers::ForceWakeStatus> status_render_;
std::optional<registers::ForceWakeStatus> status_gen9_media_;
std::optional<registers::ForceWakeStatus> status_gen12_vdbox0_;
};
#endif // FORCEWAKE_H