Xen-pciback driver was designed to be built for x86 only. But it can also be used by other architectures, e.g. Arm. Currently PCI backend implements multiple functionalities at a time, such as: 1. It is used as a database for assignable PCI devices, e.g. xl pci-assignable-{add|remove|list} manipulates that list. So, whenever the toolstack needs to know which PCI devices can be passed through it reads that from the relevant sysfs entries of the pciback. 2. It is used to hold the unbound PCI devices list, e.g. when passing through a PCI device it needs to be unbound from the relevant device driver and bound to pciback (strictly speaking it is not required that the device is bound to pciback, but pciback is again used as a database of the passed through PCI devices, so we can re-bind the devices back to their original drivers when guest domain shuts down) 3. Device reset for the devices being passed through 4. Para-virtualised use-cases support The para-virtualised part of the driver is not always needed as some architectures, e.g. Arm or x86 PVH Dom0, are not using backend-frontend model for PCI device passthrough. For such use-cases make the very first step in splitting the xen-pciback driver into two parts: Xen PCI stub and PCI PV backend drivers. For that add new configuration options CONFIG_XEN_PCI_STUB and CONFIG_XEN_PCIDEV_STUB, so the driver can be limited in its functionality, e.g. no support for para-virtualised scenario. x86 platform will continue using CONFIG_XEN_PCIDEV_BACKEND for the fully featured backend driver. Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> Signed-off-by: Anastasiia Lukianenko <anastasiia_lukianenko@epam.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Reviewed-by: Juergen Gross <jgross@suse.com> Link: https://lore.kernel.org/r/20211028143620.144936-1-andr2000@gmail.com Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
67 lines
1.8 KiB
C
67 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_XEN_PCI_H
|
|
#define _ASM_X86_XEN_PCI_H
|
|
|
|
#if defined(CONFIG_PCI_XEN)
|
|
extern int __init pci_xen_init(void);
|
|
extern int __init pci_xen_hvm_init(void);
|
|
#define pci_xen 1
|
|
#else
|
|
#define pci_xen 0
|
|
#define pci_xen_init (0)
|
|
static inline int pci_xen_hvm_init(void)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_XEN_PV_DOM0
|
|
int __init pci_xen_initial_domain(void);
|
|
#else
|
|
static inline int __init pci_xen_initial_domain(void)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
#if defined(CONFIG_PCI_MSI)
|
|
#if defined(CONFIG_PCI_XEN)
|
|
/* The drivers/pci/xen-pcifront.c sets this structure to
|
|
* its own functions.
|
|
*/
|
|
struct xen_pci_frontend_ops {
|
|
int (*enable_msi)(struct pci_dev *dev, int vectors[]);
|
|
void (*disable_msi)(struct pci_dev *dev);
|
|
int (*enable_msix)(struct pci_dev *dev, int vectors[], int nvec);
|
|
void (*disable_msix)(struct pci_dev *dev);
|
|
};
|
|
|
|
extern struct xen_pci_frontend_ops *xen_pci_frontend;
|
|
|
|
static inline int xen_pci_frontend_enable_msi(struct pci_dev *dev,
|
|
int vectors[])
|
|
{
|
|
if (xen_pci_frontend && xen_pci_frontend->enable_msi)
|
|
return xen_pci_frontend->enable_msi(dev, vectors);
|
|
return -ENOSYS;
|
|
}
|
|
static inline void xen_pci_frontend_disable_msi(struct pci_dev *dev)
|
|
{
|
|
if (xen_pci_frontend && xen_pci_frontend->disable_msi)
|
|
xen_pci_frontend->disable_msi(dev);
|
|
}
|
|
static inline int xen_pci_frontend_enable_msix(struct pci_dev *dev,
|
|
int vectors[], int nvec)
|
|
{
|
|
if (xen_pci_frontend && xen_pci_frontend->enable_msix)
|
|
return xen_pci_frontend->enable_msix(dev, vectors, nvec);
|
|
return -ENOSYS;
|
|
}
|
|
static inline void xen_pci_frontend_disable_msix(struct pci_dev *dev)
|
|
{
|
|
if (xen_pci_frontend && xen_pci_frontend->disable_msix)
|
|
xen_pci_frontend->disable_msix(dev);
|
|
}
|
|
#endif /* CONFIG_PCI_XEN */
|
|
#endif /* CONFIG_PCI_MSI */
|
|
|
|
#endif /* _ASM_X86_XEN_PCI_H */
|