#pragma once #include #include #include #include #include #include namespace Kernel { class NVMeController final : public StorageController, public CharacterDevice { BAN_NON_COPYABLE(NVMeController); BAN_NON_MOVABLE(NVMeController); public: static BAN::ErrorOr> create(PCI::Device&); ~NVMeController() { ASSERT_NOT_REACHED(); } NVMeQueue& io_queue() { return *m_io_queue; } virtual dev_t rdev() const override { return m_rdev; } virtual BAN::StringView name() const override { return m_name; } protected: virtual bool can_read_impl() const override { return false; } virtual bool can_write_impl() const override { return false; } virtual bool has_error_impl() const override { return false; } private: NVMeController(PCI::Device& pci_device); virtual BAN::ErrorOr initialize() override; BAN::ErrorOr identify_controller(); BAN::ErrorOr identify_namespaces(); BAN::ErrorOr wait_until_ready(bool expected_value); BAN::ErrorOr create_admin_queue(); BAN::ErrorOr create_io_queue(); private: PCI::Device& m_pci_device; BAN::UniqPtr m_bar0; volatile NVMe::ControllerRegisters* m_controller_registers; BAN::UniqPtr m_admin_queue; BAN::UniqPtr m_io_queue; BAN::Vector> m_namespaces; char m_name[20]; const dev_t m_rdev; }; }