浏览代码

Kernel: Add a method to retrieve the Physical ID for a PCI address

Liav A 4 年之前
父节点
当前提交
97b36febd5
共有 2 个文件被更改,包括 20 次插入0 次删除
  1. 18 0
      Kernel/PCI/Access.cpp
  2. 2 0
      Kernel/PCI/Access.h

+ 18 - 0
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);

+ 2 - 0
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;