// Returns the length of the given BAR register's memory area. export fn probe_bar_size(dev: u32, bar: u8) size = { let val = readl(dev, PCI_BAR0 + bar * 4); defer write(dev, PCI_BAR0 + bar * 4, val); write(dev, PCI_BAR0 + bar * 4, ~0); val = readl(dev, PCI_BAR0 + bar * 4); if (val & 1 == 1) { val &= 0xFFFFFFFC; } else { // TODO: Not exactly right for 64-bit BARs val &= 0xFFFFFFF0; }; return ~val + 1; };