Add Pci.Device class
This commit is contained in:
parent
dd07a08388
commit
d600e089e5
@ -2,6 +2,7 @@ module hulk.pci;
|
||||
|
||||
import hulk.cpu;
|
||||
import hulk.klog;
|
||||
import hulk.hurl.a1;
|
||||
|
||||
struct Pci
|
||||
{
|
||||
@ -23,6 +24,43 @@ struct Pci
|
||||
ubyte function_nr;
|
||||
}
|
||||
|
||||
struct Device
|
||||
{
|
||||
Address address;
|
||||
ushort vendor_id;
|
||||
ushort device_id;
|
||||
ubyte class_id;
|
||||
ubyte subclass_id;
|
||||
ubyte if_id;
|
||||
|
||||
void initialize(Address address, ushort vendor_id, ushort device_id)
|
||||
{
|
||||
this.vendor_id = vendor_id;
|
||||
this.device_id = device_id;
|
||||
uint reg2 = read_config_register(address, 2u);
|
||||
class_id = (reg2 >> 24u) & 0xFFu;
|
||||
subclass_id = (reg2 >> 16u) & 0xFFu;
|
||||
if_id = (reg2 >> 8u) & 0xFFu;
|
||||
Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u.%u",
|
||||
vendor_id, device_id,
|
||||
class_id, subclass_id, if_id,
|
||||
address.bus_nr, address.device_nr, address.function_nr);
|
||||
init_device(class_id, subclass_id, if_id);
|
||||
if (address.function_nr == 0u)
|
||||
{
|
||||
uint reg3 = read_config_register(address, 3u);
|
||||
if ((reg3 & (1u << 23u)) != 0u)
|
||||
{
|
||||
/* Multi-function device found. */
|
||||
for (address.function_nr = 1u; address.function_nr < 8u; address.function_nr++)
|
||||
{
|
||||
scan(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct SerialBusController
|
||||
{
|
||||
enum ID = 0x0Cu;
|
||||
@ -91,29 +129,10 @@ struct Pci
|
||||
ulong reg0 = read_config_register(address, 0u);
|
||||
if (reg0 != 0xFFFFFFFFu)
|
||||
{
|
||||
uint reg2 = read_config_register(address, 2u);
|
||||
ushort vendor_id = reg0 & 0xFFFFu;
|
||||
ushort device_id = (reg0 >> 16u) & 0xFFFFu;
|
||||
ubyte class_id = (reg2 >> 24u) & 0xFFu;
|
||||
ubyte subclass_id = (reg2 >> 16u) & 0xFFu;
|
||||
ubyte if_id = (reg2 >> 8u) & 0xFFu;
|
||||
Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u.%u",
|
||||
vendor_id, device_id,
|
||||
class_id, subclass_id, if_id,
|
||||
address.bus_nr, address.device_nr, address.function_nr);
|
||||
init_device(class_id, subclass_id, if_id);
|
||||
if (address.function_nr == 0u)
|
||||
{
|
||||
uint reg3 = read_config_register(address, 3u);
|
||||
if ((reg3 & (1u << 23u)) != 0u)
|
||||
{
|
||||
/* Multi-function device found. */
|
||||
for (address.function_nr = 1u; address.function_nr < 8u; address.function_nr++)
|
||||
{
|
||||
scan(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
Device * device = A1.allocate!Device();
|
||||
device.initialize(address, vendor_id, device_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user