| // Copyright 2019 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 SRC_STORAGE_BLOCK_DRIVERS_AHCI_TEST_FAKE_BUS_H_ |
| #define SRC_STORAGE_BLOCK_DRIVERS_AHCI_TEST_FAKE_BUS_H_ |
| |
| #include <lib/sync/completion.h> |
| |
| #include <vector> |
| |
| #include "../ahci.h" |
| #include "../bus.h" |
| #include "../port.h" |
| |
| namespace ahci { |
| |
| // Fake bus for unit testing the AHCI driver. |
| |
| struct FakePort { |
| uint32_t num = 0; |
| union { |
| ahci_port_reg_t reg{}; |
| uint32_t raw[sizeof(ahci_port_reg_t) / sizeof(uint32_t)]; |
| }; |
| union { |
| ahci_cl_t* cl_ = nullptr; |
| uintptr_t cl_raw; |
| }; |
| union { |
| ahci_fis_t* fis_ = nullptr; |
| uintptr_t fis_raw; |
| }; |
| zx_status_t Read(size_t offset, uint32_t* val_out); |
| zx_status_t Write(size_t offset, uint32_t val); |
| }; |
| |
| class FakeBus : public Bus { |
| public: |
| FakeBus(); |
| virtual ~FakeBus() override; |
| virtual zx_status_t Configure(zx_device_t* parent) override; |
| virtual zx_status_t IoBufferInit(io_buffer_t* buffer_, size_t size, uint32_t flags, |
| zx_paddr_t* phys_out, void** virt_out) override; |
| virtual zx_status_t BtiPin(uint32_t options, const zx::unowned_vmo& vmo, uint64_t offset, |
| uint64_t size, zx_paddr_t* addrs, size_t addrs_count, |
| zx::pmt* pmt_out) override; |
| |
| virtual zx_status_t RegRead(size_t offset, uint32_t* val_out) override; |
| virtual zx_status_t RegWrite(size_t offset, uint32_t val) override; |
| |
| virtual zx_status_t InterruptWait() override; |
| virtual void InterruptCancel() override; |
| |
| // Test control functions. |
| |
| // Cause calls to Configure() to return an error. |
| void DoFailConfigure() { fail_configure_ = true; } |
| |
| // Override a register value without going through the normal Write path. |
| void PortRegOverride(uint32_t port, size_t offset, uint32_t value) { |
| port_[port].raw[offset / sizeof(uint32_t)] = value; |
| } |
| |
| private: |
| zx_status_t HbaRead(size_t offset, uint32_t* val_out); |
| zx_status_t HbaWrite(size_t offset, uint32_t val); |
| |
| sync_completion_t irq_completion_; |
| bool interrupt_cancelled_ = false; |
| |
| bool fail_configure_ = false; |
| |
| uint32_t slots_ = 32; |
| uint32_t num_ports_ = 4; |
| |
| // Fake host bus adapter registers. |
| uint32_t ghc_ = 0; |
| |
| // Array of unique pointers to allocated io bufs. |
| std::vector<std::unique_ptr<ahci_port_mem_t>> iobufs_; |
| |
| FakePort port_[AHCI_MAX_PORTS]; |
| }; |
| |
| } // namespace ahci |
| |
| #endif // SRC_STORAGE_BLOCK_DRIVERS_AHCI_TEST_FAKE_BUS_H_ |