On Fri, Nov 11, 2022 at 02:58:30PM +0100, Thomas Gleixner wrote: > +static struct msi_domain_template pci_msi_template = { > + .chip = { > + .name = "PCI-MSI", > + .irq_mask = pci_mask_msi, > + .irq_unmask = pci_unmask_msi, > + .irq_write_msi_msg = pci_msi_domain_write_msg, > + .flags = IRQCHIP_ONESHOT_SAFE, > + }, > + > + .ops = { > + .set_desc = pci_device_domain_set_desc, > + }, > + > + .info = { > + .flags = MSI_COMMON_FLAGS | MSI_FLAG_MULTI_PCI_MSI, > + .bus_token = DOMAIN_BUS_PCI_DEVICE_MSI, > + }, > +}; > + > +static void pci_mask_msix(struct irq_data *data) > +{ > + pci_msix_mask(irq_data_get_msi_desc(data)); > +} > + > +static void pci_unmask_msix(struct irq_data *data) > +{ > + pci_msix_unmask(irq_data_get_msi_desc(data)); > +} > + > +static struct msi_domain_template pci_msix_template = { > + .chip = { > + .name = "PCI-MSIX", > + .irq_mask = pci_mask_msix, > + .irq_unmask = pci_unmask_msix, > + .irq_write_msi_msg = pci_msi_domain_write_msg, > + .flags = IRQCHIP_ONESHOT_SAFE, > + }, > + > + .ops = { > + .set_desc = pci_device_domain_set_desc, > + }, > + > + .info = { > + .flags = MSI_COMMON_FLAGS | MSI_FLAG_PCI_MSIX, > + .bus_token = DOMAIN_BUS_PCI_DEVICE_MSIX, > + }, > +}; I like this splitting alot, it makes the whole thing make so much more sense. > +bool pci_setup_msi_device_domain(struct pci_dev *pdev) > +{ > + if (WARN_ON_ONCE(pdev->msix_enabled)) > + return false; > + > + if (pci_match_device_domain(pdev, DOMAIN_BUS_PCI_DEVICE_MSI)) > + return true; > + if (pci_match_device_domain(pdev, DOMAIN_BUS_PCI_DEVICE_MSIX)) > + msi_remove_device_irq_domain(&pdev->dev, MSI_DEFAULT_DOMAIN); > + > + return pci_create_device_domain(pdev, &pci_msi_template, 1); Hardwired to one 1? What about multi-msi? Jason