Add some AHCI debugging dumps

This commit is contained in:
Justin C. Miller
2018-05-20 02:02:06 -07:00
parent 81fc559802
commit 193d9939f0
3 changed files with 25 additions and 12 deletions

View File

@@ -62,6 +62,8 @@ hba::hba(pci_device *device)
device_manager &dm = device_manager::get(); device_manager &dm = device_manager::get();
uint32_t bar5 = device->get_bar(5); uint32_t bar5 = device->get_bar(5);
log::debug(logs::driver, "HBA raw BAR5 is %08lx", bar5);
m_data = reinterpret_cast<hba_data *>(bar5 & ~0xfffull); m_data = reinterpret_cast<hba_data *>(bar5 & ~0xfffull);
pm->map_offset_pointer(reinterpret_cast<void **>(&m_data), 0x2000); pm->map_offset_pointer(reinterpret_cast<void **>(&m_data), 0x2000);
@@ -93,6 +95,7 @@ hba::hba(pci_device *device)
m_data->host_control |= 0x02; // enable interrupts m_data->host_control |= 0x02; // enable interrupts
} }
dump();
for (auto &p : m_ports) { for (auto &p : m_ports) {
if (!p.active()) continue; if (!p.active()) continue;

View File

@@ -301,11 +301,17 @@ port::read_async(uint64_t offset, size_t length, void *dest)
size_t size_t
port::read(uint64_t offset, size_t length, void *dest) port::read(uint64_t offset, size_t length, void *dest)
{ {
dump();
int slot = read_async(offset, length, dest); int slot = read_async(offset, length, dest);
dump();
int timeout = 0; int timeout = 0;
while (m_pending[slot].type == command_type::read) { while (m_pending[slot].type == command_type::read) {
if (timeout++ > 10) return 0; if (timeout++ > 5) {
m_hba->dump();
dump();
return 0;
}
asm("hlt"); asm("hlt");
} }
kassert(m_pending[slot].type == command_type::finished, kassert(m_pending[slot].type == command_type::finished,

View File

@@ -97,9 +97,12 @@ pci_device::pci_device(pci_group &group, uint8_t bus, uint8_t device, uint8_t fu
uint16_t *command = reinterpret_cast<uint16_t *>(&m_base[1]); uint16_t *command = reinterpret_cast<uint16_t *>(&m_base[1]);
*command |= 0x400; // Mask old INTx style interrupts *command |= 0x400; // Mask old INTx style interrupts
uint16_t *status = command + 1;
log::info(logs::device, "Found PCIe device at %02d:%02d:%d of type %d.%d id %04x:%04x", log::info(logs::device, "Found PCIe device at %02d:%02d:%d of type %d.%d id %04x:%04x",
bus, device, func, m_class, m_subclass, m_vendor, m_device); bus, device, func, m_class, m_subclass, m_vendor, m_device);
if (*status & 0x0010) {
// Walk the extended capabilities list // Walk the extended capabilities list
uint8_t next = m_base[13] & 0xff; uint8_t next = m_base[13] & 0xff;
while (next) { while (next) {
@@ -114,6 +117,7 @@ pci_device::pci_device(pci_group &group, uint8_t bus, uint8_t device, uint8_t fu
mcap->control |= 0x01; // Enable interrupts, at most 1 vector allocated mcap->control |= 0x01; // Enable interrupts, at most 1 vector allocated
} }
} }
}
} }
uint32_t uint32_t