1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _ASM_X86_XEN_PCI_H 3#define _ASM_X86_XEN_PCI_H 4 5#if defined(CONFIG_PCI_XEN) 6extern int __init pci_xen_init(void); 7extern int __init pci_xen_hvm_init(void); 8#define pci_xen 1 9#else 10#define pci_xen 0 11#define pci_xen_init (0) 12static inline int pci_xen_hvm_init(void) 13{ 14 return -1; 15} 16#endif 17#if defined(CONFIG_XEN_DOM0) 18int __init pci_xen_initial_domain(void); 19int xen_find_device_domain_owner(struct pci_dev *dev); 20int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain); 21int xen_unregister_device_domain_owner(struct pci_dev *dev); 22#else 23static inline int __init pci_xen_initial_domain(void) 24{ 25 return -1; 26} 27static inline int xen_find_device_domain_owner(struct pci_dev *dev) 28{ 29 return -1; 30} 31static inline int xen_register_device_domain_owner(struct pci_dev *dev, 32 uint16_t domain) 33{ 34 return -1; 35} 36static inline int xen_unregister_device_domain_owner(struct pci_dev *dev) 37{ 38 return -1; 39} 40#endif 41 42#if defined(CONFIG_PCI_MSI) 43#if defined(CONFIG_PCI_XEN) 44/* The drivers/pci/xen-pcifront.c sets this structure to 45 * its own functions. 46 */ 47struct xen_pci_frontend_ops { 48 int (*enable_msi)(struct pci_dev *dev, int vectors[]); 49 void (*disable_msi)(struct pci_dev *dev); 50 int (*enable_msix)(struct pci_dev *dev, int vectors[], int nvec); 51 void (*disable_msix)(struct pci_dev *dev); 52}; 53 54extern struct xen_pci_frontend_ops *xen_pci_frontend; 55 56static inline int xen_pci_frontend_enable_msi(struct pci_dev *dev, 57 int vectors[]) 58{ 59 if (xen_pci_frontend && xen_pci_frontend->enable_msi) 60 return xen_pci_frontend->enable_msi(dev, vectors); 61 return -ENOSYS; 62} 63static inline void xen_pci_frontend_disable_msi(struct pci_dev *dev) 64{ 65 if (xen_pci_frontend && xen_pci_frontend->disable_msi) 66 xen_pci_frontend->disable_msi(dev); 67} 68static inline int xen_pci_frontend_enable_msix(struct pci_dev *dev, 69 int vectors[], int nvec) 70{ 71 if (xen_pci_frontend && xen_pci_frontend->enable_msix) 72 return xen_pci_frontend->enable_msix(dev, vectors, nvec); 73 return -ENOSYS; 74} 75static inline void xen_pci_frontend_disable_msix(struct pci_dev *dev) 76{ 77 if (xen_pci_frontend && xen_pci_frontend->disable_msix) 78 xen_pci_frontend->disable_msix(dev); 79} 80#endif /* CONFIG_PCI_XEN */ 81#endif /* CONFIG_PCI_MSI */ 82 83#endif /* _ASM_X86_XEN_PCI_H */ 84