Added a "pcistatus" command to KDL that prints and clears the PCI device status register.
Also clear the status register during init. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25523 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -248,6 +248,13 @@ write_io(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
pcistatus(int argc, char **argv)
|
||||||
|
{
|
||||||
|
sPCI->ClearDeviceStatus(NULL, true);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// #pragma mark bus manager init/uninit
|
// #pragma mark bus manager init/uninit
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
@@ -282,6 +289,8 @@ pci_init(void)
|
|||||||
sPCI->InitDomainData();
|
sPCI->InitDomainData();
|
||||||
sPCI->InitBus();
|
sPCI->InitBus();
|
||||||
|
|
||||||
|
add_debugger_command("pcistatus", &pcistatus, "dump and clear pci device status registers");
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,6 +361,7 @@ PCI::InitBus()
|
|||||||
if (fRootBus) {
|
if (fRootBus) {
|
||||||
DiscoverBus(fRootBus);
|
DiscoverBus(fRootBus);
|
||||||
RefreshDeviceInfo(fRootBus);
|
RefreshDeviceInfo(fRootBus);
|
||||||
|
ClearDeviceStatus(fRootBus, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -650,6 +660,45 @@ PCI::FixupDevices(int domain, uint8 bus)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PCI::ClearDeviceStatus(PCIBus *bus, bool dumpStatus)
|
||||||
|
{
|
||||||
|
if (!bus) {
|
||||||
|
if (!fRootBus)
|
||||||
|
return;
|
||||||
|
bus = fRootBus;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PCIDev *dev = bus->child; dev; dev = dev->next) {
|
||||||
|
uint16 status = ReadPciConfig(dev->domain, dev->bus, dev->dev, dev->func, PCI_status, 2);
|
||||||
|
if (dumpStatus) {
|
||||||
|
|
||||||
|
kprintf("domain %u, bus %u, dev %2u, func %u, PCI device status 0x%04x\n",
|
||||||
|
dev->domain, dev->bus, dev->dev, dev->func, status);
|
||||||
|
if (status & (1 << 15))
|
||||||
|
kprintf(" Detected Parity Error\n");
|
||||||
|
if (status & (1 << 14))
|
||||||
|
kprintf(" Signalled System Error\n");
|
||||||
|
if (status & (1 << 13))
|
||||||
|
kprintf(" Received Master-Abort\n");
|
||||||
|
if (status & (1 << 12))
|
||||||
|
kprintf(" Received Target-Abort\n");
|
||||||
|
if (status & (1 << 11))
|
||||||
|
kprintf(" Signalled Target-Abort\n");
|
||||||
|
if (status & (1 << 8))
|
||||||
|
kprintf(" Master Data Parity Error\n");
|
||||||
|
}
|
||||||
|
WritePciConfig(dev->domain, dev->bus, dev->dev, dev->func, PCI_status, 2, status);
|
||||||
|
|
||||||
|
if (dev->child)
|
||||||
|
ClearDeviceStatus(dev->child, dumpStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus->next)
|
||||||
|
ClearDeviceStatus(bus->next, dumpStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PCI::DiscoverBus(PCIBus *bus)
|
PCI::DiscoverBus(PCIBus *bus)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ class PCI {
|
|||||||
|
|
||||||
status_t ResolveVirtualBus(uint8 virtualBus, int *domain, uint8 *bus);
|
status_t ResolveVirtualBus(uint8 virtualBus, int *domain, uint8 *bus);
|
||||||
|
|
||||||
|
void ClearDeviceStatus(PCIBus *bus, bool dumpStatus);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void EnumerateBus(int domain, uint8 bus, uint8 *subordinate_bus = NULL);
|
void EnumerateBus(int domain, uint8 bus, uint8 *subordinate_bus = NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user