| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /* |
| * Implementation of the HPS interface. |
| */ |
| #ifndef HPS_HPS_IMPL_H_ |
| #define HPS_HPS_IMPL_H_ |
| |
| #include <fstream> |
| #include <iostream> |
| #include <memory> |
| #include <utility> |
| |
| #include <base/files/file_path.h> |
| #include <base/threading/thread.h> |
| |
| #include "hps/dev.h" |
| #include "hps/hps.h" |
| #include "hps/hps_metrics.h" |
| #include "hps/hps_reg.h" |
| |
| namespace hps { |
| |
| class HPS_impl : public HPS { |
| public: |
| friend class HPSTestButUsingAMock; |
| explicit HPS_impl(std::unique_ptr<DevInterface> dev) |
| : device_(std::move(dev)), |
| hw_rev_(0), |
| stage1_version_(0), |
| write_protect_off_(false), |
| feat_enabled_(0) {} |
| |
| // Methods for HPS |
| void Init(uint32_t stage1_version, |
| const base::FilePath& mcu, |
| const base::FilePath& fpga_bitstream, |
| const base::FilePath& fpga_app_image) override; |
| bool Boot() override; |
| bool Enable(uint8_t feature) override; |
| bool Disable(uint8_t feature) override; |
| FeatureResult Result(int feature) override; |
| DevInterface* Device() override { return this->device_.get(); } |
| bool Download(hps::HpsBank bank, const base::FilePath& source) override; |
| void SetDownloadObserver(DownloadObserver) override; |
| |
| void SetMetricsLibraryForTesting( |
| std::unique_ptr<MetricsLibraryInterface> metrics_lib) { |
| hps_metrics_.SetMetricsLibraryForTesting(std::move(metrics_lib)); |
| } |
| |
| MetricsLibraryInterface* metrics_library_for_testing() { |
| return hps_metrics_.metrics_library_for_testing(); |
| } |
| |
| private: |
| enum class BootResult { |
| kFail, |
| kOk, |
| kUpdate, |
| }; |
| |
| // This is is virtual to allow unit tests to override |
| virtual void Sleep(base::TimeDelta duration) { |
| base::PlatformThread::Sleep(duration); |
| } |
| BootResult TryBoot(); |
| bool CheckMagic(); |
| BootResult CheckStage0(); |
| BootResult CheckStage1(); |
| BootResult CheckApplication(); |
| bool Reboot(); |
| void Fault(); |
| bool WaitForBankReady(uint8_t bank); |
| BootResult SendStage1Update(); |
| BootResult SendApplicationUpdate(); |
| bool WriteFile(uint8_t bank, const base::FilePath& source); |
| std::unique_ptr<DevInterface> device_; |
| HpsMetrics hps_metrics_; |
| uint16_t hw_rev_; |
| uint32_t stage1_version_; |
| bool write_protect_off_; |
| uint16_t feat_enabled_; |
| base::FilePath mcu_blob_; |
| base::FilePath fpga_bitstream_; |
| base::FilePath fpga_app_image_; |
| DownloadObserver download_observer_{}; |
| }; |
| |
| } // namespace hps |
| |
| #endif // HPS_HPS_IMPL_H_ |