Add Pci.init_device() skeleton
This commit is contained in:
parent
f6fde01b06
commit
8de86dd647
@ -11,6 +11,21 @@ struct Pci
|
|||||||
/* IO address for PCI configuration data. */
|
/* IO address for PCI configuration data. */
|
||||||
enum IO_ADDR_CONFIG_DATA = 0xCFCu;
|
enum IO_ADDR_CONFIG_DATA = 0xCFCu;
|
||||||
|
|
||||||
|
struct SerialBusController
|
||||||
|
{
|
||||||
|
enum ID = 0x0Cu;
|
||||||
|
|
||||||
|
struct USBController
|
||||||
|
{
|
||||||
|
enum ID = 0x03u;
|
||||||
|
|
||||||
|
struct XHCIController
|
||||||
|
{
|
||||||
|
enum ID = 0x30u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static ulong read_config_register(ulong bus_id, ulong device_idx, ulong register_id)
|
private static ulong read_config_register(ulong bus_id, ulong device_idx, ulong register_id)
|
||||||
{
|
{
|
||||||
ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_idx << 11u) | (register_id << 2u);
|
ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_idx << 11u) | (register_id << 2u);
|
||||||
@ -18,6 +33,32 @@ struct Pci
|
|||||||
return in32(IO_ADDR_CONFIG_DATA);
|
return in32(IO_ADDR_CONFIG_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void init_device(ubyte class_id, ubyte subclass_id, ubyte if_id)
|
||||||
|
{
|
||||||
|
switch (class_id)
|
||||||
|
{
|
||||||
|
case SerialBusController.ID:
|
||||||
|
switch (subclass_id)
|
||||||
|
{
|
||||||
|
case SerialBusController.USBController.ID:
|
||||||
|
switch (if_id)
|
||||||
|
{
|
||||||
|
case SerialBusController.USBController.XHCIController.ID:
|
||||||
|
/* TODO */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void scan(ulong bus_id, ulong device_idx)
|
private static void scan(ulong bus_id, ulong device_idx)
|
||||||
{
|
{
|
||||||
ulong reg0 = read_config_register(bus_id, device_idx, 0u);
|
ulong reg0 = read_config_register(bus_id, device_idx, 0u);
|
||||||
@ -26,13 +67,14 @@ struct Pci
|
|||||||
ulong reg2 = read_config_register(bus_id, device_idx, 2u);
|
ulong reg2 = read_config_register(bus_id, device_idx, 2u);
|
||||||
ushort vendor_id = reg0 & 0xFFFFu;
|
ushort vendor_id = reg0 & 0xFFFFu;
|
||||||
ushort device_id = (reg0 >> 16u) & 0xFFFFu;
|
ushort device_id = (reg0 >> 16u) & 0xFFFFu;
|
||||||
ubyte class_code = (reg2 >> 24u) & 0xFFu;
|
ubyte class_id = (reg2 >> 24u) & 0xFFu;
|
||||||
ubyte subclass = (reg2 >> 16u) & 0xFFu;
|
ubyte subclass_id = (reg2 >> 16u) & 0xFFu;
|
||||||
ubyte prog_if = (reg2 >> 8u) & 0xFFu;
|
ubyte if_id = (reg2 >> 8u) & 0xFFu;
|
||||||
Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u",
|
Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u",
|
||||||
vendor_id, device_id,
|
vendor_id, device_id,
|
||||||
class_code, subclass, prog_if,
|
class_id, subclass_id, if_id,
|
||||||
bus_id, device_idx);
|
bus_id, device_idx);
|
||||||
|
init_device(class_id, subclass_id, if_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user