Commit acf84412 by triazo

Add function to detect ahci bridge

parent 82512f3e
Showing with 50 additions and 0 deletions
...@@ -67,6 +67,8 @@ void kernel_main(multiboot_info* mbt, uint32_t magic) ...@@ -67,6 +67,8 @@ void kernel_main(multiboot_info* mbt, uint32_t magic)
// PCI // PCI
checkAllBuses(); checkAllBuses();
void* ahciAddr = pciFindAHCI();
serial_hexstring(ahciAddr, 0x1100);
test_idt(); test_idt();
while(true) while(true)
......
...@@ -80,3 +80,50 @@ void checkAllBuses(void) ...@@ -80,3 +80,50 @@ void checkAllBuses(void)
} }
} }
} }
// pciFindAHCI enumerates the pci bus to find the AHCI controller
void* pciFindAHCI()
{
uint8_t bus;
uint8_t device;
uint8_t function;
void* baseAddr = 0;
for (bus = 0; bus < 255; bus++)
{
for (device = 0; device <32; device++)
{
for (function = 0; function < 8; function++)
{
uint16_t classID = pciConfigReadWord(bus, device, function, 8) >> 16;
if (classID != 0xffff)
{
serial_hexhword(classID);
serial_writechar('\n');
}
// This class ID is for any
if (classID == 0x0106)
{
if (baseAddr != 0)
{
serial_writestring("Found too many SATA devices!\n");
return baseAddr;
}
serial_writestring("Found AHCI address\n");
pciSerialInfo(bus, device, function, 0);
pciSerialInfo(bus, device, function, 8);
serial_writestring("AHCI Base address: 0x");
baseAddr = (void*) pciConfigReadWord(bus, device, function, 0x24);
serial_hexword((uint32_t) baseAddr);
serial_writechar('\n');
}
}
}
}
if (baseAddr == 0)
{
serial_writestring("Could not find an ahci device\n");
}
return baseAddr;
}
...@@ -16,5 +16,6 @@ uint32_t pciConfigReadWord(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offs ...@@ -16,5 +16,6 @@ uint32_t pciConfigReadWord(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offs
void checkAllBuses(); void checkAllBuses();
void* pciFindAHCI();
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment