diff --git a/Kernel/PCI/Access.cpp b/Kernel/PCI/Access.cpp index 3941b77dc6..cb1fb7e18d 100644 --- a/Kernel/PCI/Access.cpp +++ b/Kernel/PCI/Access.cpp @@ -58,6 +58,19 @@ Access::Access() s_access = this; } +PhysicalID Access::get_physical_id(Address address) const +{ + for (auto physical_id : m_physical_ids) { + if (physical_id.address().seg() == address.seg() + && physical_id.address().bus() == address.bus() + && physical_id.address().slot() == address.slot() + && physical_id.address().function() == address.function()) { + return physical_id; + } + } + ASSERT_NOT_REACHED(); +} + u8 Access::early_read8_field(Address address, u32 field) { IO::out32(PCI_ADDRESS_PORT, address.io_address_for_field(field)); @@ -137,6 +150,11 @@ Optional get_capabilities_pointer(Address address) return {}; } +PhysicalID get_physical_id(Address address) +{ + return Access::the().get_physical_id(address); +} + Vector get_capabilities(Address address) { auto capabilities_pointer = PCI::get_capabilities_pointer(address); diff --git a/Kernel/PCI/Access.h b/Kernel/PCI/Access.h index 4b6ade98d2..2b53ceaf59 100644 --- a/Kernel/PCI/Access.h +++ b/Kernel/PCI/Access.h @@ -60,6 +60,8 @@ public: virtual u16 read16_field(Address address, u32 field) = 0; virtual u32 read32_field(Address address, u32 field) = 0; + PhysicalID get_physical_id(Address address) const; + protected: virtual void enumerate_hardware(Function) = 0;