Skip to content

Commit f4bc684

Browse files
committed
virtio: extract common logic to map capability bar
Signed-off-by: Waldemar Kozaczuk <jwkozaczuk@gmail.com>
1 parent ae529f0 commit f4bc684

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

drivers/virtio-pci-device.cc

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,17 @@ bool virtio_modern_pci_device::parse_pci_config()
322322
return _common_cfg && _isr_cfg && _notify_cfg;
323323
}
324324

325+
pci::bar* virtio_modern_pci_device::map_capability_bar(u8 cap_offset, u8 &bar_no)
326+
{
327+
u8 bar_index = _dev->pci_readb(cap_offset + offsetof(struct virtio_pci_cap, bar));
328+
bar_no = bar_index + 1;
329+
auto bar = _dev->get_bar(bar_no);
330+
if (bar && bar->is_mmio() && !bar->is_mapped()) {
331+
bar->map();
332+
}
333+
return bar;
334+
}
335+
325336
// Parse a single virtio PCI capability, whose type must match @type and store
326337
// it in @ptr.
327338
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,
337348
}
338349

339350
if (cfg_offset != 0xFF) {
340-
u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct virtio_pci_cap, bar));
341-
auto bar_no = bar_index + 1;
342-
auto bar = _dev->get_bar(bar_no);
343-
if (bar && bar->is_mmio() && !bar->is_mapped()) {
344-
bar->map();
345-
}
351+
u8 bar_no;
352+
auto bar = map_capability_bar(cfg_offset, bar_no);
346353

347354
u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct virtio_pci_cap, offset));
348355
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<
368375
}
369376

370377
auto cfg_offset = cfg_offset_and_type.first;
371-
u8 bar_index = _dev->pci_readb(cfg_offset + offsetof(struct virtio_pci_cap, bar));
372-
auto bar_no = bar_index + 1;
373-
auto bar = _dev->get_bar(bar_no);
374-
if (bar && bar->is_mmio() && !bar->is_mapped()) {
375-
bar->map();
376-
}
378+
u8 bar_no;
379+
auto bar = map_capability_bar(cfg_offset, bar_no);
377380

378381
u64 offset = _dev->pci_readl(cfg_offset + offsetof(struct virtio_pci_cap, offset));
379382
u64 length = _dev->pci_readl(cfg_offset + offsetof(struct virtio_pci_cap, length));

drivers/virtio-pci-device.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ protected:
292292
virtual bool parse_pci_config();
293293
private:
294294
void find_vendor_capabilities(std::vector<std::pair<u8,u8>>& offsets_and_types);
295+
pci::bar* map_capability_bar(u8 cap_offset, u8 &bar_no);
295296
void parse_virtio_capability(std::vector<std::pair<u8,u8>> &offsets_and_types,
296297
std::unique_ptr<virtio_capability> &ptr, u8 type);
297298
void parse_virtio_capabilities(std::vector<std::pair<u8,u8>> &offsets_and_types,

0 commit comments

Comments
 (0)