summaryrefslogtreecommitdiff
path: root/Kernel/PCI
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2020-12-18 20:24:32 +0200
committerAndreas Kling <kling@serenityos.org>2020-12-21 00:19:21 +0100
commit97b36febd5670550a209272db9587776c17237dd (patch)
tree9bc7434afdca67ced4f3b848af0fd41cd4f0893f /Kernel/PCI
parent85b4256d10633397516fa39fc3c41517c51ff63a (diff)
downloadserenity-97b36febd5670550a209272db9587776c17237dd.zip
Kernel: Add a method to retrieve the Physical ID for a PCI address
Diffstat (limited to 'Kernel/PCI')
-rw-r--r--Kernel/PCI/Access.cpp18
-rw-r--r--Kernel/PCI/Access.h2
2 files changed, 20 insertions, 0 deletions
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<u8> get_capabilities_pointer(Address address)
return {};
}
+PhysicalID get_physical_id(Address address)
+{
+ return Access::the().get_physical_id(address);
+}
+
Vector<Capability> 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<void(Address, ID)>) = 0;