From: Waldemar Kozaczuk <[email protected]>
Committer: Waldemar Kozaczuk <[email protected]>
Branch: master

virtio: extract common logic to map capability bar

Signed-off-by: Waldemar Kozaczuk <[email protected]>

---
diff --git a/drivers/virtio-pci-device.cc b/drivers/virtio-pci-device.cc
--- a/drivers/virtio-pci-device.cc
+++ b/drivers/virtio-pci-device.cc
@@ -322,6 +322,17 @@ bool virtio_modern_pci_device::parse_pci_config()
     return _common_cfg && _isr_cfg && _notify_cfg;
 }
 
+pci::bar* virtio_modern_pci_device::map_capability_bar(u8 cap_offset, u8 
&bar_no)
+{
+    u8 bar_index = _dev->pci_readb(cap_offset + offsetof(struct 
virtio_pci_cap, bar));
+    bar_no = bar_index + 1;
+    auto bar = _dev->get_bar(bar_no);
+    if (bar && bar->is_mmio() && !bar->is_mapped()) {
+        bar->map();
+    }
+    return bar;
+}
+
 // Parse a single virtio PCI capability, whose type must match @type and store
 // it in @ptr.
 void 
virtio_modern_pci_device::parse_virtio_capability(std::vector<std::pair<u8,u8>> 
&offsets_and_types,
@@ -337,12 +348,8 @@ void 
virtio_modern_pci_device::parse_virtio_capability(std::vector<std::pair<u8,
     }
 
     if (cfg_offset != 0xFF) {
-        u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct 
virtio_pci_cap, bar));
-        auto bar_no = bar_index + 1;
-        auto bar = _dev->get_bar(bar_no);
-        if (bar && bar->is_mmio() && !bar->is_mapped()) {
-            bar->map();
-        }
+        u8 bar_no;
+        auto bar = map_capability_bar(cfg_offset, bar_no);
 
         u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, offset));
         u64 length = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, length));
@@ -368,12 +375,8 @@ void virtio_modern_pci_device::parse_virtio_capabilities( 
std::vector<std::pair<
         }
 
         auto cfg_offset = cfg_offset_and_type.first;
-        u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct 
virtio_pci_cap, bar));
-        auto bar_no = bar_index + 1;
-        auto bar = _dev->get_bar(bar_no);
-        if (bar && bar->is_mmio() && !bar->is_mapped()) {
-            bar->map();
-        }
+        u8 bar_no;
+        auto bar = map_capability_bar(cfg_offset, bar_no);
 
         u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, offset));
         u64 length = _dev->pci_readl(cfg_offset + offsetof(struct 
virtio_pci_cap, length));
diff --git a/drivers/virtio-pci-device.hh b/drivers/virtio-pci-device.hh
--- a/drivers/virtio-pci-device.hh
+++ b/drivers/virtio-pci-device.hh
@@ -292,6 +292,7 @@ protected:
     virtual bool parse_pci_config();
 private:
     void find_vendor_capabilities(std::vector<std::pair<u8,u8>>& 
offsets_and_types);
+    pci::bar* map_capability_bar(u8 cap_offset, u8 &bar_no);
     void parse_virtio_capability(std::vector<std::pair<u8,u8>> 
&offsets_and_types,
             std::unique_ptr<virtio_capability> &ptr, u8 type);
     void parse_virtio_capabilities(std::vector<std::pair<u8,u8>> 
&offsets_and_types,

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/000000000000f9cc7305a13883c0%40google.com.

Reply via email to