18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_X86_XEN_PCI_H
38c2ecf20Sopenharmony_ci#define _ASM_X86_XEN_PCI_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#if defined(CONFIG_PCI_XEN)
68c2ecf20Sopenharmony_ciextern int __init pci_xen_init(void);
78c2ecf20Sopenharmony_ciextern int __init pci_xen_hvm_init(void);
88c2ecf20Sopenharmony_ci#define pci_xen 1
98c2ecf20Sopenharmony_ci#else
108c2ecf20Sopenharmony_ci#define pci_xen 0
118c2ecf20Sopenharmony_ci#define pci_xen_init (0)
128c2ecf20Sopenharmony_cistatic inline int pci_xen_hvm_init(void)
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	return -1;
158c2ecf20Sopenharmony_ci}
168c2ecf20Sopenharmony_ci#endif
178c2ecf20Sopenharmony_ci#if defined(CONFIG_XEN_DOM0)
188c2ecf20Sopenharmony_ciint __init pci_xen_initial_domain(void);
198c2ecf20Sopenharmony_ciint xen_find_device_domain_owner(struct pci_dev *dev);
208c2ecf20Sopenharmony_ciint xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain);
218c2ecf20Sopenharmony_ciint xen_unregister_device_domain_owner(struct pci_dev *dev);
228c2ecf20Sopenharmony_ci#else
238c2ecf20Sopenharmony_cistatic inline int __init pci_xen_initial_domain(void)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	return -1;
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_cistatic inline int xen_find_device_domain_owner(struct pci_dev *dev)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	return -1;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_cistatic inline int xen_register_device_domain_owner(struct pci_dev *dev,
328c2ecf20Sopenharmony_ci						   uint16_t domain)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	return -1;
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_cistatic inline int xen_unregister_device_domain_owner(struct pci_dev *dev)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	return -1;
398c2ecf20Sopenharmony_ci}
408c2ecf20Sopenharmony_ci#endif
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#if defined(CONFIG_PCI_MSI)
438c2ecf20Sopenharmony_ci#if defined(CONFIG_PCI_XEN)
448c2ecf20Sopenharmony_ci/* The drivers/pci/xen-pcifront.c sets this structure to
458c2ecf20Sopenharmony_ci * its own functions.
468c2ecf20Sopenharmony_ci */
478c2ecf20Sopenharmony_cistruct xen_pci_frontend_ops {
488c2ecf20Sopenharmony_ci	int (*enable_msi)(struct pci_dev *dev, int vectors[]);
498c2ecf20Sopenharmony_ci	void (*disable_msi)(struct pci_dev *dev);
508c2ecf20Sopenharmony_ci	int (*enable_msix)(struct pci_dev *dev, int vectors[], int nvec);
518c2ecf20Sopenharmony_ci	void (*disable_msix)(struct pci_dev *dev);
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ciextern struct xen_pci_frontend_ops *xen_pci_frontend;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cistatic inline int xen_pci_frontend_enable_msi(struct pci_dev *dev,
578c2ecf20Sopenharmony_ci					      int vectors[])
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	if (xen_pci_frontend && xen_pci_frontend->enable_msi)
608c2ecf20Sopenharmony_ci		return xen_pci_frontend->enable_msi(dev, vectors);
618c2ecf20Sopenharmony_ci	return -ENOSYS;
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_cistatic inline void xen_pci_frontend_disable_msi(struct pci_dev *dev)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	if (xen_pci_frontend && xen_pci_frontend->disable_msi)
668c2ecf20Sopenharmony_ci			xen_pci_frontend->disable_msi(dev);
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_cistatic inline int xen_pci_frontend_enable_msix(struct pci_dev *dev,
698c2ecf20Sopenharmony_ci					       int vectors[], int nvec)
708c2ecf20Sopenharmony_ci{
718c2ecf20Sopenharmony_ci	if (xen_pci_frontend && xen_pci_frontend->enable_msix)
728c2ecf20Sopenharmony_ci		return xen_pci_frontend->enable_msix(dev, vectors, nvec);
738c2ecf20Sopenharmony_ci	return -ENOSYS;
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_cistatic inline void xen_pci_frontend_disable_msix(struct pci_dev *dev)
768c2ecf20Sopenharmony_ci{
778c2ecf20Sopenharmony_ci	if (xen_pci_frontend && xen_pci_frontend->disable_msix)
788c2ecf20Sopenharmony_ci			xen_pci_frontend->disable_msix(dev);
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci#endif /* CONFIG_PCI_XEN */
818c2ecf20Sopenharmony_ci#endif /* CONFIG_PCI_MSI */
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#endif	/* _ASM_X86_XEN_PCI_H */
84