Store PCI addresses and types as 32-bit uints

This commit is contained in:
Josh Holtrop 2023-10-24 10:25:16 -04:00
parent d86bf47211
commit f8f9b72588

View File

@ -29,14 +29,36 @@ struct Pci
*/ */
struct Address struct Address
{ {
/** Bus number (0-255). */ uint address;
ubyte bus_nr;
/** Device number (0-31). */ this(ubyte bus_nr, ubyte device_nr, ubyte function_nr)
ubyte device_nr; {
this.address = (bus_nr << 16u) | (device_nr << 8u) | function_nr;
}
/** Function number (0-7). */ /**
ubyte function_nr; * Bus number (0-255).
*/
public @property ubyte bus_nr() const
{
return cast(ubyte)(address >> 16u);
}
/**
* Device number (0-31).
*/
public @property ubyte device_nr() const
{
return cast(ubyte)(address >> 8u);
}
/**
* Function number (0-7).
*/
public @property ubyte function_nr() const
{
return cast(ubyte)address;
}
} }
/** /**
@ -44,14 +66,36 @@ struct Pci
*/ */
struct Type struct Type
{ {
/** Class ID. */ uint type;
ubyte class_id;
/** Subclass ID. */ this(ubyte class_id, ubyte subclass_id, ubyte interface_id)
ubyte subclass_id; {
this.type = (class_id << 16u) | (subclass_id << 8u) | interface_id;
}
/** Interface ID. */ /**
ubyte interface_id; * Class ID.
*/
public @property ubyte class_id() const
{
return cast(ubyte)(type >> 16u);
}
/**
* Subclass ID.
*/
public @property ubyte subclass_id() const
{
return cast(ubyte)(type >> 8u);
}
/**
* Interface ID.
*/
public @property ubyte interface_id() const
{
return cast(ubyte)type;
}
} }
/** /**
@ -69,9 +113,7 @@ struct Pci
{ {
this.config = config; this.config = config;
this.address = address; this.address = address;
type.class_id = config.class_id; type = Type(config.class_id, config.subclass_id, config.interface_id);
type.subclass_id = config.subclass_id;
type.interface_id = config.interface_id;
Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u.%u", Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u.%u",
config.vendor_id, config.device_id, config.vendor_id, config.device_id,
type.class_id, type.subclass_id, type.interface_id, type.class_id, type.subclass_id, type.interface_id,