From 97b36febd5670550a209272db9587776c17237dd Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 18 Dec 2020 20:24:32 +0200 Subject: [PATCH] Kernel: Add a method to retrieve the Physical ID for a PCI address --- Kernel/PCI/Access.cpp | 18 ++++++++++++++++++ Kernel/PCI/Access.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/Kernel/PCI/Access.cpp b/Kernel/PCI/Access.cpp index 3941b77dc6b..cb1fb7e18dc 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 4b6ade98d24..2b53ceaf594 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;