]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: virt-pci: Switch to msi_create_parent_irq_domain()
authorNam Cao <namcao@linutronix.de>
Mon, 30 Jun 2025 06:51:16 +0000 (08:51 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 11 Jul 2025 06:49:01 +0000 (08:49 +0200)
Move away from the legacy MSI domain setup, switch to use
msi_create_parent_irq_domain().

Signed-off-by: Nam Cao <namcao@linutronix.de>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Tested-by: Johannes Berg <johannes@sipsolutions.net>
Link: https://patch.msgid.link/5f0bd8e877e7bfdfb1a7e99d6b126caf6a7eea48.1751266049.git.namcao@linutronix.de
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/drivers/Kconfig
arch/um/drivers/virt-pci.c

index 34085bfc6d4168225fab9e0346ac889e991b7925..6a0354ca032fb013fff3ee487062f3f8c49eccb2 100644 (file)
@@ -160,6 +160,7 @@ config UML_RTC
 config UML_PCI
        bool
        select FORCE_PCI
+       select IRQ_MSI_LIB
        select UML_IOMEM_EMULATION
        select UML_DMA_EMULATION
        select PCI_MSI
index 0fe207ca4b72ee56ff02b9821810133496150971..557d93aea00a140fbf7e9d9c1c60757d8d159a02 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/pci.h>
 #include <linux/logic_iomem.h>
 #include <linux/of_platform.h>
+#include <linux/irqchip/irq-msi-lib.h>
 #include <linux/irqdomain.h>
 #include <linux/msi.h>
 #include <linux/unaligned.h>
@@ -29,7 +30,6 @@ static struct um_pci_device *um_pci_platform_device;
 static struct um_pci_device_reg um_pci_devices[MAX_DEVICES];
 static struct fwnode_handle *um_pci_fwnode;
 static struct irq_domain *um_pci_inner_domain;
-static struct irq_domain *um_pci_msi_domain;
 static unsigned long um_pci_msi_used[BITS_TO_LONGS(MAX_MSI_VECTORS)];
 
 static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset,
@@ -400,21 +400,24 @@ static void um_pci_inner_domain_free(struct irq_domain *domain,
 }
 
 static const struct irq_domain_ops um_pci_inner_domain_ops = {
+       .select = msi_lib_irq_domain_select,
        .alloc = um_pci_inner_domain_alloc,
        .free = um_pci_inner_domain_free,
 };
 
-static struct irq_chip um_pci_msi_irq_chip = {
-       .name = "UM virtual PCIe MSI",
-       .irq_mask = pci_msi_mask_irq,
-       .irq_unmask = pci_msi_unmask_irq,
-};
-
-static struct msi_domain_info um_pci_msi_domain_info = {
-       .flags  = MSI_FLAG_USE_DEF_DOM_OPS |
-                 MSI_FLAG_USE_DEF_CHIP_OPS |
-                 MSI_FLAG_PCI_MSIX,
-       .chip   = &um_pci_msi_irq_chip,
+#define UM_PCI_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS            | \
+                                  MSI_FLAG_USE_DEF_CHIP_OPS            | \
+                                  MSI_FLAG_NO_AFFINITY)
+#define UM_PCI_MSI_FLAGS_SUPPORTED (MSI_GENERIC_FLAGS_MASK             | \
+                                   MSI_FLAG_PCI_MSIX)
+
+static const struct msi_parent_ops um_pci_msi_parent_ops = {
+       .required_flags         = UM_PCI_MSI_FLAGS_REQUIRED,
+       .supported_flags        = UM_PCI_MSI_FLAGS_SUPPORTED,
+       .bus_select_token       = DOMAIN_BUS_NEXUS,
+       .bus_select_mask        = MATCH_PCI_MSI,
+       .prefix                 = "UM-virtual-",
+       .init_dev_msi_info      = msi_lib_init_dev_msi_info,
 };
 
 static struct resource busn_resource = {
@@ -559,17 +562,14 @@ static int __init um_pci_init(void)
                goto free;
        }
 
-       um_pci_inner_domain = irq_domain_create_linear(um_pci_fwnode, MAX_MSI_VECTORS,
-                                                      &um_pci_inner_domain_ops, NULL);
-       if (!um_pci_inner_domain) {
-               err = -ENOMEM;
-               goto free;
-       }
+       struct irq_domain_info info = {
+               .fwnode         = um_pci_fwnode,
+               .ops            = &um_pci_inner_domain_ops,
+               .size           = MAX_MSI_VECTORS,
+       };
 
-       um_pci_msi_domain = pci_msi_create_irq_domain(um_pci_fwnode,
-                                                     &um_pci_msi_domain_info,
-                                                     um_pci_inner_domain);
-       if (!um_pci_msi_domain) {
+       um_pci_inner_domain = msi_create_parent_irq_domain(&info, &um_pci_msi_parent_ops);
+       if (!um_pci_inner_domain) {
                err = -ENOMEM;
                goto free;
        }
@@ -611,7 +611,6 @@ device_initcall(um_pci_init);
 
 static void __exit um_pci_exit(void)
 {
-       irq_domain_remove(um_pci_msi_domain);
        irq_domain_remove(um_pci_inner_domain);
        pci_free_resource_list(&bridge->windows);
        pci_free_host_bridge(bridge);