diff --git a/sortix/include/sortix/kernel/pci.h b/sortix/include/sortix/kernel/pci.h index b331d0e4..154099ea 100644 --- a/sortix/include/sortix/kernel/pci.h +++ b/sortix/include/sortix/kernel/pci.h @@ -67,6 +67,9 @@ pciid_t GetDeviceId(uint32_t devaddr); pcitype_t GetDeviceType(uint32_t devaddr); uint32_t SearchForDevice(pcifind_t pcifind); addr_t ParseDevBar0(uint32_t devaddr); +bool IsIOSpaceBar(uint32_t devaddr, uint8_t bar); +bool Is64BitBar(uint32_t devaddr, uint8_t bar); +uint64_t GetPCIBAR(uint32_t devaddr, uint8_t bar); } // namespace PCI } // namespace Sortix diff --git a/sortix/pci.cpp b/sortix/pci.cpp index 685bb55b..72e21481 100644 --- a/sortix/pci.cpp +++ b/sortix/pci.cpp @@ -186,6 +186,28 @@ addr_t ParseDevBar0(uint32_t devaddr) } } +bool IsIOSpaceBar(uint32_t devaddr, uint8_t bar) +{ + uint32_t val = PCI::Read32(devaddr, 0x10 + 4 * bar); + return val & 0x1; +} + +bool Is64BitBar(uint32_t devaddr, uint8_t bar) +{ + uint32_t val = PCI::Read32(devaddr, 0x10 + 4 * bar); + return (val & 0x3 << 1) == 0x2 << 1; +} + +uint64_t GetPCIBAR(uint32_t devaddr, uint8_t bar) +{ + uint64_t low = PCI::Read32(devaddr, 0x10 + 4 * (bar+0)); + if ( (low & (0x3 << 1)) != (0x2 << 1) ) + return low & 0xFFFFFFF0ULL; + uint64_t high = PCI::Read32(devaddr, 0x10 + 4 * (bar+1)); + return (low & 0xFFFFFFF0ULL) | high << 32ULL; +} + + void Init() { }