[Zion][Denali] Move to MSI for AHCI devices.

This will allow us to properly do interrupts for XHCI devices in the
future.

Also move PCI device header parsing to a shared library.

Get rid of the old irq register format which supplied an irq number and
instead pass the appropriate irq number back out to the caller.
This commit is contained in:
Drew Galbraith 2025-05-05 23:13:59 -07:00
parent c645405ca8
commit f26fd73116
21 changed files with 371 additions and 124 deletions

View file

@ -9,18 +9,24 @@ DriverManager& DriverManager::Get() { return *gDriverManager; }
DriverManager::DriverManager() { gDriverManager = this; }
void DriverManager::WriteMessage(uint64_t irq_num, IpcMessage&& message) {
if (!driver_map_.Contains(irq_num)) {
if (irq_num < IRQ_OFFSET) {
dbgln("WARN IRQ {x} below min offset {x}", irq_num, IRQ_OFFSET);
}
uint64_t offset = irq_num - IRQ_OFFSET;
if (offset >= driver_list_.size()) {
dbgln("WARN IRQ for {x} with no registered driver", irq_num);
return;
}
driver_map_.at(irq_num)->Send(glcr::Move(message));
driver_list_[offset]->Send(glcr::Move(message));
}
glcr::ErrorCode DriverManager::RegisterListener(uint64_t irq_num,
glcr::RefPtr<Port> port) {
if (driver_map_.Contains(irq_num)) {
return glcr::ALREADY_EXISTS;
glcr::ErrorOr<uint8_t> DriverManager::RegisterListener(
glcr::RefPtr<Port> port) {
if (driver_list_.size() + IRQ_OFFSET >= 0xFF) {
return glcr::EXHAUSTED;
}
return driver_map_.Insert(irq_num, port);
uint8_t offset = (driver_list_.size() + IRQ_OFFSET);
driver_list_.PushBack(port);
return offset;
}