mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-22 01:07:57 +00:00
hv: vpci: restore PCI BARs when doing PCIe FLR
ACRN hypervisor should trap guest doing PCIe FLR. Besides, it should save some status before doing the FLR and restore them later, only BARs values for now. This patch will trap guest Device Capabilities Register write operation if the device supports PCI Express Capability and check whether it wants to do device FLR. If it does, call pdev_do_flr to do the job. Tracked-On: #3465 Signed-off-by: Li Fei1 <fei1.li@intel.com>
This commit is contained in:
@@ -233,6 +233,9 @@ void init_vdev_pt(struct pci_vdev *vdev)
|
||||
vdev->nr_bars = vdev->pdev->nr_bars;
|
||||
pbdf.value = vdev->pdev->bdf.value;
|
||||
|
||||
vdev->has_flr = vdev->pdev->has_flr;
|
||||
vdev->pcie_capoff = vdev->pdev->pcie_capoff;
|
||||
|
||||
for (idx = 0U; idx < vdev->nr_bars; idx++) {
|
||||
vbar = &vdev->bar[idx];
|
||||
offset = pci_bar_offset(idx);
|
||||
|
@@ -337,6 +337,10 @@ static int32_t vpci_write_pt_dev_cfg(struct pci_vdev *vdev, uint32_t offset,
|
||||
vmsi_write_cfg(vdev, offset, bytes, val);
|
||||
} else if (msixcap_access(vdev, offset)) {
|
||||
vmsix_write_cfg(vdev, offset, bytes, val);
|
||||
} else if (vdev->has_flr && ((vdev->pcie_capoff + PCIR_PCIE_DEVCTRL) == offset) &&
|
||||
((val & PCIM_PCIE_FLR) != 0U)) {
|
||||
/* Assume that guest write FLR must be 4 bytes aligned */
|
||||
pdev_do_flr(vdev->pdev->bdf, offset, bytes, val);
|
||||
} else {
|
||||
/* passthru to physical device */
|
||||
pci_pdev_write_cfg(vdev->pdev->bdf, offset, bytes, val);
|
||||
|
Reference in New Issue
Block a user