acadia/sys/denali/ahci/ahci_controller.h

48 lines
1.1 KiB
C
Raw Normal View History

#pragma once
#include <glacier/memory/unique_ptr.h>
2023-06-21 18:38:11 -07:00
#include <glacier/status/error_or.h>
#include <mammoth/proc/thread.h>
#include <ztypes.h>
#include "ahci/ahci.h"
2023-12-08 14:30:08 -08:00
#include "ahci/ahci_port.h"
class AhciController {
public:
static glcr::ErrorOr<glcr::UniquePtr<AhciController>> Init(
mmth::OwnedMemoryRegion&& ahci_phys);
glcr::ErrorCode RegisterIrq();
void InterruptLoop();
2023-12-08 14:30:08 -08:00
glcr::ErrorOr<AhciPort*> GetDevice(uint64_t id);
2023-06-15 16:20:29 -07:00
void DumpCapabilities();
void DumpPorts();
private:
mmth::OwnedMemoryRegion pci_region_;
volatile PciDeviceHeader* pci_device_header_ = nullptr;
mmth::OwnedMemoryRegion ahci_region_;
volatile AhciHba* ahci_hba_ = nullptr;
2023-12-08 15:14:52 -08:00
glcr::UniquePtr<AhciPort> ports_[32];
Thread irq_thread_;
uint64_t irq_port_cap_ = 0;
uint8_t num_ports_;
uint8_t num_commands_;
2023-06-21 18:38:11 -07:00
glcr::ErrorCode LoadCapabilities();
glcr::ErrorCode LoadHbaRegisters();
glcr::ErrorCode ResetHba();
2023-12-08 15:14:52 -08:00
glcr::ErrorCode LoadPorts();
AhciController(mmth::OwnedMemoryRegion&& pci_region)
: pci_region_(glcr::Move(pci_region)),
pci_device_header_(
reinterpret_cast<PciDeviceHeader*>(pci_region_.vaddr())) {}
};