blob: baa083bd0a779737a90d2e3adfa7bcbcab50eccf [file] [log] [blame]
// Copyright 2020 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 ZIRCON_SYSTEM_ULIB_CLOCKTREE_TEST_TESTCLOCK_H_
#define ZIRCON_SYSTEM_ULIB_CLOCKTREE_TEST_TESTCLOCK_H_
#include "baseclock.h"
namespace clk {
// Trivial Clock implementation that doesn't support any operations.
class TestNullClock : public BaseClock {
public:
TestNullClock(const char* name, uint32_t id, uint32_t parent)
: BaseClock(name, id), parent_(parent) {}
zx_status_t Enable() override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t Disable() override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t IsHwEnabled(bool* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t SetRate(const Hertz rate, const Hertz parent_rate) override {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t QuerySupportedRate(const Hertz max, const Hertz parent_rate, Hertz* out) override {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t GetRate(const Hertz parent_rate, Hertz* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t SetInput(const uint32_t index) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetNumInputs(uint32_t* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetInput(uint32_t* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetInputId(const uint32_t index, uint32_t* id) override {
return ZX_ERR_NOT_SUPPORTED;
}
uint32_t ParentId() override final { return parent_; }
private:
const uint32_t parent_;
};
class TestGateClock : public BaseClock {
public:
TestGateClock(const char* name, uint32_t id, uint32_t parent, bool enabled = false)
: BaseClock(name, id),
parent_(parent),
enabled_(enabled),
enable_count_(0),
disable_count_(0) {}
zx_status_t Enable() override final {
enable_count_++;
enabled_ = true;
return ZX_OK;
}
zx_status_t Disable() override final {
disable_count_++;
enabled_ = false;
return ZX_OK;
}
zx_status_t IsHwEnabled(bool* out) override final {
*out = enabled_;
return ZX_OK;
}
zx_status_t SetRate(const Hertz rate, const Hertz parent_rate) override {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t QuerySupportedRate(const Hertz max, const Hertz parent_rate, Hertz* out) override {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t GetRate(const Hertz parent_rate, Hertz* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t SetInput(const uint32_t index) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetNumInputs(uint32_t* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetInput(uint32_t* out) override { return ZX_ERR_NOT_SUPPORTED; }
zx_status_t GetInputId(const uint32_t index, uint32_t* id) override {
return ZX_ERR_NOT_SUPPORTED;
}
uint32_t ParentId() override final { return parent_; }
uint32_t EnableCount() const { return enable_count_; }
uint32_t DisableCount() const { return disable_count_; }
private:
const uint32_t parent_;
bool enabled_;
uint32_t enable_count_;
uint32_t disable_count_;
};
// Simple clock implementation that returns ZX_ERR_INTERNAL for each call.
class TestFailClock : public BaseClock {
public:
TestFailClock(const char* name, uint32_t id, uint32_t parent)
: BaseClock(name, id), parent_(parent) {}
zx_status_t Enable() override { return ZX_ERR_INTERNAL; }
zx_status_t Disable() override { return ZX_ERR_INTERNAL; }
zx_status_t IsHwEnabled(bool* out) override { return ZX_ERR_INTERNAL; }
zx_status_t SetRate(const Hertz rate, const Hertz parent_rate) override {
return ZX_ERR_INTERNAL;
}
zx_status_t QuerySupportedRate(const Hertz max, const Hertz parent_rate, Hertz* out) override {
return ZX_ERR_INTERNAL;
}
zx_status_t GetRate(const Hertz parent_rate, Hertz* out) override { return ZX_ERR_INTERNAL; }
zx_status_t SetInput(const uint32_t index) override { return ZX_ERR_INTERNAL; }
zx_status_t GetNumInputs(uint32_t* out) override { return ZX_ERR_INTERNAL; }
zx_status_t GetInput(uint32_t* out) override { return ZX_ERR_INTERNAL; }
zx_status_t GetInputId(const uint32_t index, uint32_t* id) override { return ZX_ERR_INTERNAL; }
uint32_t ParentId() override final { return parent_; }
private:
const uint32_t parent_;
};
class TestMuxClockTrivial : public BaseClock {
public:
TestMuxClockTrivial(const char* name, const uint32_t id, const uint32_t* parents, uint32_t n)
: BaseClock(name, id), parents_(parents), n_(n), index_(0) {}
/// Clock Gating Control.
virtual zx_status_t Enable() override { return ZX_ERR_NOT_SUPPORTED; };
virtual zx_status_t Disable() override { return ZX_ERR_NOT_SUPPORTED; };
virtual zx_status_t IsHwEnabled(bool* out) override { return ZX_ERR_NOT_SUPPORTED; };
// Clock frequency control.
virtual zx_status_t SetRate(const Hertz rate, const Hertz parent_rate) override { return ZX_ERR_NOT_SUPPORTED; };
virtual zx_status_t QuerySupportedRate(const Hertz max, const Hertz parent_rate, Hertz* out) override { return ZX_ERR_NOT_SUPPORTED; };
virtual zx_status_t GetRate(const Hertz parent_rate, Hertz* out) override { return ZX_ERR_NOT_SUPPORTED; };
zx_status_t SetInput(const uint32_t index) override;
zx_status_t GetNumInputs(uint32_t* out) override;
zx_status_t GetInput(uint32_t* out) override;
zx_status_t GetInputId(const uint32_t index, uint32_t* id) override;
uint32_t ParentId() override;
private:
const uint32_t* parents_;
const uint32_t n_;
uint32_t index_;
};
class TestMuxClockFail : public TestMuxClockTrivial {
public:
TestMuxClockFail(const char* name, const uint32_t id, const uint32_t* parents, uint32_t n)
: TestMuxClockTrivial(name, id, parents, n) {}
zx_status_t SetInput(const uint32_t index) override { return ZX_ERR_INTERNAL; }
};
} // namespace clk
#endif // ZIRCON_SYSTEM_ULIB_CLOCKTREE_TEST_TESTCLOCK_H_