diff options
author | Jiqian Chen <Jiqian.Chen@amd.com> | 2024-09-24 14:14:35 +0800 |
---|---|---|
committer | Juergen Gross <jgross@suse.com> | 2024-09-25 09:54:40 +0200 |
commit | 88801d043b1d16caae76a5e2e5991e8b1f55ce7f (patch) | |
tree | ebf5a437d235f1c70d05bcb757ef2631f4c0fa7c /drivers/xen/pci.c | |
parent | c3dea3d54f4d399f8044547f0f1abdccbdfb0fee (diff) | |
download | lwn-88801d043b1d16caae76a5e2e5991e8b1f55ce7f.tar.gz lwn-88801d043b1d16caae76a5e2e5991e8b1f55ce7f.zip |
xen/pci: Add a function to reset device for xen
When device on dom0 side has been reset, the vpci on Xen side
won't get notification, so that the cached state in vpci is
all out of date with the real device state.
To solve that problem, add a new function to clear all vpci
device state when device is reset on dom0 side.
And call that function in pcistub_init_device. Because when
using "pci-assignable-add" to assign a passthrough device in
Xen, it will reset passthrough device and the vpci state will
out of date, and then device will fail to restore bar state.
Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Message-ID: <20240924061437.2636766-2-Jiqian.Chen@amd.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Diffstat (limited to 'drivers/xen/pci.c')
-rw-r--r-- | drivers/xen/pci.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/xen/pci.c b/drivers/xen/pci.c index a2facd8f7e51..416f231809cb 100644 --- a/drivers/xen/pci.c +++ b/drivers/xen/pci.c @@ -173,6 +173,19 @@ static int xen_remove_device(struct device *dev) return r; } +int xen_reset_device(const struct pci_dev *dev) +{ + struct pci_device_reset device = { + .dev.seg = pci_domain_nr(dev->bus), + .dev.bus = dev->bus->number, + .dev.devfn = dev->devfn, + .flags = PCI_DEVICE_RESET_FLR, + }; + + return HYPERVISOR_physdev_op(PHYSDEVOP_pci_device_reset, &device); +} +EXPORT_SYMBOL_GPL(xen_reset_device); + static int xen_pci_notifier(struct notifier_block *nb, unsigned long action, void *data) { |