Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com> --- 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 osv-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/20200317044119.1198-2-jwkozaczuk%40gmail.com.