[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:
parent
c645405ca8
commit
f26fd73116
21 changed files with 371 additions and 124 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue