#pragma once #include "arch/PCI.h" #include "fs/devices/DeviceRegistry.h" #include "lib/KMutex.h" #include #include namespace ATA { class Controller; class Channel { public: Channel(Controller* controller, u8 channel_index, Badge); bool initialize(); private: Controller* m_controller; u8 m_channel_index; bool m_is_pci_native_mode; u32 m_base_address; u32 m_control_port_base_address; }; class Controller { public: static Result scan(); const PCI::Device& device() const { return m_device; } bool initialize(); private: Controller(const PCI::Device& device); PCI::Device m_device; Channel m_primary_channel; Channel m_secondary_channel; KMutex<100> m_lock; }; } class ATADevice : public Device { public: // Initializer for DeviceRegistry. static Result create(SharedPtr controller, int channel, int drive); Result read(u8*, usize, usize) const override; Result write(const u8*, usize, usize) override; bool blocking() const override; Result ioctl(int request, void* arg) override; usize size() const override; virtual ~ATADevice() = default; private: ATADevice(SharedPtr controller); SharedPtr m_controller; int m_channel; int m_drive; };