Signed-off-by: Waldemar Kozaczuk <[email protected]>
---
drivers/virtio-pci-device.cc | 27 +++++++++++++++------------
drivers/virtio-pci-device.hh | 1 +
2 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/drivers/virtio-pci-device.cc b/drivers/virtio-pci-device.cc
index 89130e01..4171f3a6 100644
--- 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
index 9941bcac..701fe820 100644
--- 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,
--
2.20.1
--
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/20200317044119.1198-2-jwkozaczuk%40gmail.com.