#pragma once #include #include #include #include #include #include #include #include "ahci/ahci.h" #include "ahci/command.h" class AhciPort { public: AhciPort() {} // Caller retains ownership of the pointer. AhciPort(AhciPortHba* port_struct); void DumpInfo(); bool IsSata() { return port_struct_->signature == 0x101; } bool IsInit() { return is_init_; } glcr::ErrorCode Identify(); glcr::ErrorOr IssueRead(uint64_t lba, uint16_t sector_cnt, uint64_t paddr); void HandleIrq(); AhciPort(const AhciPort&) = delete; AhciPort& operator=(const AhciPort&) = delete; private: volatile AhciPortHba* port_struct_ = nullptr; mmth::OwnedMemoryRegion command_structures_; volatile CommandList* command_list_ = nullptr; volatile ReceivedFis* received_fis_ = nullptr; glcr::ArrayView command_tables_; glcr::Array command_signals_; uint32_t commands_issued_ = 0; bool is_init_ = false; uint64_t lba_count_ = 0; uint32_t sector_size_ = 0; glcr::ErrorOr IssueCommand(const CommandInfo& command); };