diff options
Diffstat (limited to 'arch/x86/pci/xen.c')
| -rw-r--r-- | arch/x86/pci/xen.c | 38 | 
1 files changed, 16 insertions, 22 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 12da00558631..9bb1e2941179 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c @@ -184,7 +184,7 @@ static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)  	if (ret)  		goto error;  	i = 0; -	for_each_pci_msi_entry(msidesc, dev) { +	msi_for_each_desc(msidesc, &dev->dev, MSI_DESC_NOTASSOCIATED) {  		irq = xen_bind_pirq_msi_to_irq(dev, msidesc, v[i],  					       (type == PCI_CAP_ID_MSI) ? nvec : 1,  					       (type == PCI_CAP_ID_MSIX) ? @@ -235,7 +235,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)  	if (type == PCI_CAP_ID_MSI && nvec > 1)  		return 1; -	for_each_pci_msi_entry(msidesc, dev) { +	msi_for_each_desc(msidesc, &dev->dev, MSI_DESC_NOTASSOCIATED) {  		pirq = xen_allocate_pirq_msi(dev, msidesc);  		if (pirq < 0) {  			irq = -ENODEV; @@ -270,7 +270,7 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)  	int ret = 0;  	struct msi_desc *msidesc; -	for_each_pci_msi_entry(msidesc, dev) { +	msi_for_each_desc(msidesc, &dev->dev, MSI_DESC_NOTASSOCIATED) {  		struct physdev_map_pirq map_irq;  		domid_t domid; @@ -306,7 +306,7 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)  				return -EINVAL;  			map_irq.table_base = pci_resource_start(dev, bir); -			map_irq.entry_nr = msidesc->msi_attrib.entry_nr; +			map_irq.entry_nr = msidesc->msi_index;  		}  		ret = -EINVAL; @@ -351,10 +351,13 @@ out:  	return ret;  } -static void xen_initdom_restore_msi_irqs(struct pci_dev *dev) +bool xen_initdom_restore_msi(struct pci_dev *dev)  {  	int ret = 0; +	if (!xen_initial_domain()) +		return true; +  	if (pci_seg_supported) {  		struct physdev_pci_device restore_ext; @@ -375,10 +378,10 @@ static void xen_initdom_restore_msi_irqs(struct pci_dev *dev)  		ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore);  		WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret);  	} +	return false;  }  #else /* CONFIG_XEN_PV_DOM0 */  #define xen_initdom_setup_msi_irqs	NULL -#define xen_initdom_restore_msi_irqs	NULL  #endif /* !CONFIG_XEN_PV_DOM0 */  static void xen_teardown_msi_irqs(struct pci_dev *dev) @@ -386,19 +389,15 @@ static void xen_teardown_msi_irqs(struct pci_dev *dev)  	struct msi_desc *msidesc;  	int i; -	for_each_pci_msi_entry(msidesc, dev) { -		if (msidesc->irq) { -			for (i = 0; i < msidesc->nvec_used; i++) -				xen_destroy_irq(msidesc->irq + i); -		} +	msi_for_each_desc(msidesc, &dev->dev, MSI_DESC_ASSOCIATED) { +		for (i = 0; i < msidesc->nvec_used; i++) +			xen_destroy_irq(msidesc->irq + i);  	}  }  static void xen_pv_teardown_msi_irqs(struct pci_dev *dev)  { -	struct msi_desc *msidesc = first_pci_msi_entry(dev); - -	if (msidesc->msi_attrib.is_msix) +	if (dev->msix_enabled)  		xen_pci_frontend_disable_msix(dev);  	else  		xen_pci_frontend_disable_msi(dev); @@ -414,10 +413,7 @@ static int xen_msi_domain_alloc_irqs(struct irq_domain *domain,  	if (WARN_ON_ONCE(!dev_is_pci(dev)))  		return -EINVAL; -	if (first_msi_entry(dev)->msi_attrib.is_msix) -		type = PCI_CAP_ID_MSIX; -	else -		type = PCI_CAP_ID_MSI; +	type = to_pci_dev(dev)->msix_enabled ? PCI_CAP_ID_MSIX : PCI_CAP_ID_MSI;  	return xen_msi_ops.setup_msi_irqs(to_pci_dev(dev), nvec, type);  } @@ -466,12 +462,10 @@ static __init struct irq_domain *xen_create_pci_msi_domain(void)  static __init void xen_setup_pci_msi(void)  {  	if (xen_pv_domain()) { -		if (xen_initial_domain()) { +		if (xen_initial_domain())  			xen_msi_ops.setup_msi_irqs = xen_initdom_setup_msi_irqs; -			x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; -		} else { +		else  			xen_msi_ops.setup_msi_irqs = xen_setup_msi_irqs; -		}  		xen_msi_ops.teardown_msi_irqs = xen_pv_teardown_msi_irqs;  		pci_msi_ignore_mask = 1;  	} else if (xen_hvm_domain()) {  |