Commit Graph

114 Commits

Author SHA1 Message Date
Myron Stowe 47b6374106 genirq/msi: Silence 'set affinity failed' warning
JIRA: https://issues.redhat.com/browse/RHEL-67693
Upstream Status: 5297bba507dc54045e6efeb9955c1271ca9aafe1

commit 5297bba507dc54045e6efeb9955c1271ca9aafe1
Author: Marek Vasut <marek.vasut+renesas@mailbox.org>
Date:   Tue Jul 23 15:27:01 2024 +0200

    genirq/msi: Silence 'set affinity failed' warning

    Various PCI controllers that mux MSIs onto a single IRQ line produce these
    "IRQ%d: set affinity failed" warnings when entering suspend. This has been
    discussed before [1] [2] and an example test case is included at the end of
    this commit message.

    Controller drivers that create MSI IRQ domain with
    MSI_FLAG_USE_DEF_CHIP_OPS and do not override the .irq_set_affinity()
    irqchip callback get assigned the default msi_domain_set_affinity()
    callback. That is not desired on controllers where it is not possible to
    set affinity of each MSI IRQ line to a specific CPU core due to hardware
    limitation.

    Introduce flag MSI_FLAG_NO_AFFINITY, which keeps .irq_set_affinity() unset
    if the controller driver did not assign it.  This way, migrate_one_irq()
    can exit right away, without printing the warning. The .irq_set_affinity()
    implementations which only return -EINVAL can be removed from multiple
    controller drivers.

      $ grep 25 /proc/interrupts
       25:   0 0 0 0 0 0 0 0   PCIe MSI   0   Edge   PCIe PME

      $ echo core > /sys/power/pm_test ; echo mem > /sys/power/state
      ...
      Disabling non-boot CPUs ...
      IRQ25: set affinity failed(-22). <---------- This is being silenced here
      psci: CPU7 killed (polled 4 ms)
      ...

    [1] https://lore.kernel.org/all/d4a6eea3c5e33a3a4056885419df95a7@kernel.org/
    [2] https://lore.kernel.org/all/5f4947b18bf381615a37aa81c2242477@kernel.org/

    Link: https://lore.kernel.org/r/20240723132958.41320-2-marek.vasut+renesas@mailbox.org
    Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
    [bhelgaas: commit log]
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Acked-by: Thomas Gleixner <tglx@linutronix.de>

Signed-off-by: Myron Stowe <mstowe@redhat.com>
2025-02-18 09:48:09 -07:00
Prarit Bhargava 754be43641 x86/pci/xen: populate MSI sysfs entries
JIRA: https://issues.redhat.com/browse/RHEL-25415

commit 335b4223466dd75f9f3ea4918187afbadd22e5c8
Author: Maximilian Heyne <mheyne@amazon.de>
Date:   Wed May 3 13:16:53 2023 +0000

    x86/pci/xen: populate MSI sysfs entries

    Commit bf5e758f02fc ("genirq/msi: Simplify sysfs handling") reworked the
    creation of sysfs entries for MSI IRQs. The creation used to be in
    msi_domain_alloc_irqs_descs_locked after calling ops->domain_alloc_irqs.
    Then it moved into __msi_domain_alloc_irqs which is an implementation of
    domain_alloc_irqs. However, Xen comes with the only other implementation
    of domain_alloc_irqs and hence doesn't run the sysfs population code
    anymore.

    Commit 6c796996ee70 ("x86/pci/xen: Fixup fallout from the PCI/MSI
    overhaul") set the flag MSI_FLAG_DEV_SYSFS for the xen msi_domain_info
    but that doesn't actually have an effect because Xen uses it's own
    domain_alloc_irqs implementation.

    Fix this by making use of the fallback functions for sysfs population.

    Fixes: bf5e758f02fc ("genirq/msi: Simplify sysfs handling")
    Signed-off-by: Maximilian Heyne <mheyne@amazon.de>
    Reviewed-by: Juergen Gross <jgross@suse.com>
    Link: https://lore.kernel.org/r/20230503131656.15928-1-mheyne@amazon.de
    Signed-off-by: Juergen Gross <jgross@suse.com>

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
2024-03-20 09:43:03 -04:00
Jerry Snitselaar 3a9dee058d irq/s390: Add arch_is_isolated_msi() for s390
Bugzilla: https://bugzilla.redhat.com/2181354
Upstream Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

commit bf210f793937a634bae6eda6a6d699c00b2b53d9
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Mon Nov 28 20:31:57 2022 -0400

    irq/s390: Add arch_is_isolated_msi() for s390

    s390 doesn't use irq_domains, so it has no place to set
    IRQ_DOMAIN_FLAG_ISOLATED_MSI. Instead of continuing to abuse the iommu
    subsystem to convey this information add a simple define which s390 can
    make statically true. The define will cause msi_device_has_isolated() to
    return true.

    Remove IOMMU_CAP_INTR_REMAP from the s390 iommu driver.

    Link: https://lore.kernel.org/r/8-v3-3313bb5dd3a3+10f11-secure_msi_jgg@nvidia.com
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

(cherry picked from commit bf210f793937a634bae6eda6a6d699c00b2b53d9)
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
2023-05-03 08:22:11 -07:00
Jerry Snitselaar 4e059c4604 genirq/msi: Rename IRQ_DOMAIN_MSI_REMAP to IRQ_DOMAIN_ISOLATED_MSI
Bugzilla: https://bugzilla.redhat.com/2181354
Upstream Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

commit dcb83f6ec1bf08a44b3f19719b56e8dc18058ff5
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Mon Nov 28 20:12:43 2022 -0400

    genirq/msi: Rename IRQ_DOMAIN_MSI_REMAP to IRQ_DOMAIN_ISOLATED_MSI

    What x86 calls "interrupt remapping" is one way to achieve isolated MSI,
    make it clear this is talking about isolated MSI, no matter how it is
    achieved. This matches the new driver facing API name of
    msi_device_has_isolated_msi()

    No functional change.

    Link: https://lore.kernel.org/r/6-v3-3313bb5dd3a3+10f11-secure_msi_jgg@nvidia.com
    Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

(cherry picked from commit dcb83f6ec1bf08a44b3f19719b56e8dc18058ff5)
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
2023-05-03 08:22:11 -07:00
Jerry Snitselaar 951c883706 genirq/msi: Add msi_device_has_isolated_msi()
Bugzilla: https://bugzilla.redhat.com/2181354
Upstream Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

commit 17cde5e601b165174e8a433b550f84f362731164
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Mon Nov 28 17:06:42 2022 -0400

    genirq/msi: Add msi_device_has_isolated_msi()

    This will replace irq_domain_check_msi_remap() in following patches.

    The new API makes it more clear what "msi_remap" actually means from a
    functional perspective instead of identifying an implementation specific
    HW feature.

    Isolated MSI means that HW modeled by an irq_domain on the path from the
    initiating device to the CPU will validate that the MSI message specifies
    an interrupt number that the device is authorized to trigger. This must
    block devices from triggering interrupts they are not authorized to
    trigger.  Currently authorization means the MSI vector is one assigned to
    the device.

    This is interesting for securing VFIO use cases where a rouge MSI (eg
    created by abusing a normal PCI MemWr DMA) must not allow the VFIO
    userspace to impact outside its security domain, eg userspace triggering
    interrupts on kernel drivers, a VM triggering interrupts on the
    hypervisor, or a VM triggering interrupts on another VM.

    As this is actually modeled as a per-irq_domain property, not a global
    platform property, correct the interface to accept the device parameter
    and scan through only the part of the irq_domains hierarchy originating
    from the source device.

    Locate the new code in msi.c as it naturally only works with
    CONFIG_GENERIC_MSI_IRQ, which also requires CONFIG_IRQ_DOMAIN and
    IRQ_DOMAIN_HIERARCHY.

    Link: https://lore.kernel.org/r/1-v3-3313bb5dd3a3+10f11-secure_msi_jgg@nvidia.com
    Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

(cherry picked from commit 17cde5e601b165174e8a433b550f84f362731164)
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
2023-05-03 08:22:11 -07:00
David Arcari 84d6224c61 genirq/msi, platform-msi: Ensure that MSI descriptors are unreferenced
Bugzilla: https://bugzilla.redhat.com/2175165

commit 0fb7fb713461e44b12e72c292bf90ee300f40710
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Wed Mar 1 22:07:48 2023 +0100

    genirq/msi, platform-msi: Ensure that MSI descriptors are unreferenced

    Miquel reported a warning in the MSI core which is triggered when
    interrupts are freed via platform_msi_device_domain_free().

    This code got reworked to use core functions for freeing the MSI
    descriptors, but nothing took care to clear the msi_desc->irq entry, which
    then triggers the warning in msi_free_msi_desc() which uses desc->irq to
    validate that the descriptor has been torn down. The same issue exists in
    msi_domain_populate_irqs().

    Up to the point that msi_free_msi_descs() grew a warning for this case,
    this went un-noticed.

    Provide the counterpart of msi_domain_populate_irqs() and invoke it in
    platform_msi_device_domain_free() before freeing the interrupts and MSI
    descriptors and also in the error path of msi_domain_populate_irqs().

    Fixes: 2f2940d16823 ("genirq/msi: Remove filter from msi_free_descs_free_range()")
    Reported-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/87mt4wkwnv.ffs@tglx

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:45 -04:00
David Arcari 89a0b1f145 genirq/msi: Take the per-device MSI lock before validating the control structure
Bugzilla: https://bugzilla.redhat.com/2175165

commit 0af2795f936f1ea1f9f1497447145dfcc7ed2823
Author: Marc Zyngier <maz@kernel.org>
Date:   Mon Feb 20 19:01:01 2023 +0000

    genirq/msi: Take the per-device MSI lock before validating the control structure

    Calling msi_ctrl_valid() ultimately results in calling
    msi_get_device_domain(), which requires holding the device MSI lock.

    However, in msi_domain_populate_irqs() the lock is taken right after having
    called msi_ctrl_valid(), which is just a tad too late.

    Take the lock before invoking msi_ctrl_valid().

    Fixes: 40742716f294 ("genirq/msi: Make msi_add_simple_msi_descs() device domain aware")
    Reported-by: "Russell King (Oracle)" <linux@armlinux.org.uk>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/Y/Opu6ETe3ZzZ/8E@shell.armlinux.org.uk
    Link: https://lore.kernel.org/r/20230220190101.314446-1-maz@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:45 -04:00
David Arcari 3bc8b0fdf4 genirq/msi: Free the fwnode created by msi_create_device_irq_domain()
Bugzilla: https://bugzilla.redhat.com/2175165

commit ac8f29aef2f1695956ff6773b33f975290437f29
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Tue Jan 17 15:16:17 2023 -0400

    genirq/msi: Free the fwnode created by msi_create_device_irq_domain()

    msi_create_device_irq_domain() creates a firmware node for the new domain,
    which is never freed. kmemleak reports:

    unreferenced object 0xffff888120ba9a00 (size 96):
      comm "systemd-modules", pid 221, jiffies 4294893411 (age 635.732s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 e0 19 8b 83 ff ff ff ff  ................
        00 00 00 00 00 00 00 00 18 9a ba 20 81 88 ff ff  ........... ....
      backtrace:
        [<000000008cdbc98d>] __irq_domain_alloc_fwnode+0x51/0x2b0
        [<00000000c57acf9d>] msi_create_device_irq_domain+0x283/0x670
        [<000000009b567982>] __pci_enable_msix_range+0x49e/0xdb0
        [<0000000077cc1445>] pci_alloc_irq_vectors_affinity+0x11f/0x1c0
        [<00000000532e9ef5>] mlx5_irq_table_create+0x24c/0x940 [mlx5_core]
        [<00000000fabd2b80>] mlx5_load+0x1fa/0x680 [mlx5_core]
        [<000000006bb22ae4>] mlx5_init_one+0x485/0x670 [mlx5_core]
        [<00000000eaa5e1ad>] probe_one+0x4c2/0x720 [mlx5_core]
        [<00000000df8efb43>] local_pci_probe+0xd6/0x170
        [<0000000085cb9924>] pci_device_probe+0x231/0x6e0

    Use the proper free operation for the firmware wnode so the name is freed
    during error unwind of msi_create_device_irq_domain() and also free the
    node in msi_remove_device_irq_domain() if it was automatically allocated.

    To avoid extra NULL pointer checks make irq_domain_free_fwnode() tolerant
    of NULL.

    Fixes: 27a6dea3ebaa ("genirq/msi: Provide msi_create/free_device_irq_domain()")
    Reported-by: Omri Barazi <obarazi@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Kalle Valo <kvalo@kernel.org>
    Tested-by: Leon Romanovsky <leonro@nvidia.com>
    Link: https://lore.kernel.org/r/0-v2-24af6665e2da+c9-msi_leak_jgg@nvidia.com

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:45 -04:00
David Arcari 095506732e genirq/msi: Return MSI_XA_DOMAIN_SIZE as the maximum MSI index when no domain is present
Bugzilla: https://bugzilla.redhat.com/2175165

commit e982ad82bd8f7931f5788a15dfa3709f7a7ee79f
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Dec 16 11:08:52 2022 +0000

    genirq/msi: Return MSI_XA_DOMAIN_SIZE as the maximum MSI index when no domain is present

    On architectures such as s390 that do not use irq domains for MSI,
    returning 0 as the maximum MSI index is a bit counter-productive,
    as it indicates that no MSI can be allocated. Bad idea.

    Instead, return the maximum we're willing to support in the MSI
    backing store (MSI_XA_DOMAIN_SIZE), and let the arch code do its
    usual thing.

    Thanks to Matthew Rosato for fixing the fix.

    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    [maz: commit message]
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/87fsdgzpqs.ffs@tglx

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:44 -04:00
David Arcari e1dd005386 genirq/msi: Check for the presence of an irq domain when validating msi_ctrl
Bugzilla: https://bugzilla.redhat.com/2175165

commit db3568fd80a3999413c04ea0cf52596b7b0ad9aa
Author: Marc Zyngier <maz@kernel.org>
Date:   Fri Dec 16 11:03:02 2022 +0000

    genirq/msi: Check for the presence of an irq domain when validating msi_ctrl

    For architectures such as s390 and powerpc that do not use
    irq domains for MSIs, dev->msi.domain is always NULL, so
    the per-device, per-bus MSI domain is also guaranteed to
    be NULL.

    So checking one without checking the other is bound to result
    in a splat, followed by a memory leak as we don't free the MSI
    descriptors.

    Add the missing check.

    Reported-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/e570e70d-19bc-101b-0481-ff9a3cab3504@linux.ibm.com

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:44 -04:00
David Arcari fdd32cf2f8 genirq/msi: Provide msi_domain_alloc_irq_at()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 3d393b21740bffbeeae7d4fa534a6b16c3e3e832
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:26:18 2022 +0100

    genirq/msi: Provide msi_domain_alloc_irq_at()

    For supporting post MSI-X enable allocations and for the upcoming PCI/IMS
    support a separate interface is required which allows not only the
    allocation of a specific index, but also the allocation of any, i.e. the
    next free index. The latter is especially required for IMS because IMS
    completely does away with index to functionality mappings which are
    often found in MSI/MSI-X implementation.

    But even with MSI-X there are devices where only the first few indices have
    a fixed functionality and the rest is freely assignable by software,
    e.g. to queues.

    msi_domain_alloc_irq_at() is also different from the range based interfaces
    as it always enforces that the MSI descriptor is allocated by the core code
    and not preallocated by the caller like the PCI/MSI[-X] enable code path
    does.

    msi_domain_alloc_irq_at() can be invoked with the index argument set to
    MSI_ANY_INDEX which makes the core code pick the next free index. The irq
    domain can provide a prepare_desc() operation callback in it's
    msi_domain_ops to do domain specific post allocation initialization before
    the actual Linux interrupt and the associated interrupt descriptor and
    hierarchy alloccations are conducted.

    The function also takes an optional @icookie argument which is of type
    union msi_instance_cookie. This cookie is not used by the core code and is
    stored in the allocated msi_desc::data::icookie. The meaning of the cookie
    is completely implementation defined. In case of IMS this might be a PASID
    or a pointer to a device queue, but for the MSI core it's opaque and not
    used in any way.

    The function returns a struct msi_map which on success contains the
    allocated index number and the Linux interrupt number so the caller can
    spare the index to Linux interrupt number lookup.

    On failure map::index contains the error code and map::virq is 0.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232326.501359457@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:44 -04:00
David Arcari 394efb8c0a genirq/msi: Provide msi_domain_ops:: Prepare_desc()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 8f986fd7755bec8b8c5776824afa1bd1151986d9
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:26:16 2022 +0100

    genirq/msi: Provide msi_domain_ops:: Prepare_desc()

    The existing MSI domain ops msi_prepare() and set_desc() turned out to be
    unsuitable for implementing IMS support.

    msi_prepare() does not operate on the MSI descriptors. set_desc() lacks
    an irq_domain pointer and has a completely different purpose.

    Introduce a prepare_desc() op which allows IMS implementations to amend an
    MSI descriptor which was allocated by the core code, e.g. by adjusting the
    iomem base or adding some data based on the allocated index. This is way
    better than requiring that all IMS domain implementations preallocate the
    MSI descriptor and then allocate the interrupt.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232326.444560717@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:44 -04:00
David Arcari ad98e46bba genirq/msi: Provide BUS_DEVICE_PCI_MSI[X]
Bugzilla: https://bugzilla.redhat.com/2175165

commit bd141a3db40c877e01de8e981edb57c03199d876
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:26:02 2022 +0100

    genirq/msi: Provide BUS_DEVICE_PCI_MSI[X]

    Provide new bus tokens for the upcoming per device PCI/MSI and PCI/MSIX
    interrupt domains.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.917219885@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari 3411b20b13 genirq/msi: Add range checking to msi_insert_desc()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 36db3d9003ea85217b357a658cf7b37920c2c38e
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:59 2022 +0100

    genirq/msi: Add range checking to msi_insert_desc()

    Per device domains provide the real domain size to the core code. This
    allows range checking on insertion of MSI descriptors and also paves the
    way for dynamic index allocations which are required e.g. for IMS. This
    avoids external mechanisms like bitmaps on the device side and just
    utilizes the core internal MSI descriptor storxe for it.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.798556374@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari 88d398e8e5 genirq/msi: Provide msi_match_device_domain()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 26e91b75bf6108550035355c835bf0c93c885b61
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:57 2022 +0100

    genirq/msi: Provide msi_match_device_domain()

    Provide an interface to match a per device domain bus token. This allows to
    query which type of domain is installed for a particular domain id. Will be
    used for PCI to avoid frequent create/remove cycles for the MSI resp. MSI-X
    domains.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.738047902@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari 9258a2b89d genirq/msi: Provide msi_create/free_device_irq_domain()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 27a6dea3ebaab3d6f8ded969ec3af710bcbe0c02
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:56 2022 +0100

    genirq/msi: Provide msi_create/free_device_irq_domain()

    Now that all prerequsites are in place, provide the actual interfaces for
    creating and removing per device interrupt domains.

    MSI device interrupt domains are created from the provided
    msi_domain_template which is duplicated so that it can be modified for the
    particular device.

    The name of the domain and the name of the interrupt chip are composed by
    "$(PREFIX)$(CHIPNAME)-$(DEVNAME)"

      $PREFIX:   The optional prefix provided by the underlying MSI parent domain
                 via msi_parent_ops::prefix.
      $CHIPNAME: The name of the irq_chip in the template
      $DEVNAME:  The name of the device

    The domain is further initialized through a MSI parent domain callback which
    fills in the required functionality for the parent domain or domains further
    down the hierarchy. This initialization can fail, e.g. when the requested
    feature or MSI domain type cannot be supported.

    The domain pointer is stored in the pointer array inside of msi_device_data
    which is attached to the domain.

    The domain can be removed via the API or left for disposal via devres when
    the device is torn down. The API removal is useful e.g. for PCI to have
    seperate domains for MSI and MSI-X, which are mutually exclusive and always
    occupy the default domain id slot.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.678838546@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari ab2bee8aab genirq/msi: Split msi_create_irq_domain()
Bugzilla: https://bugzilla.redhat.com/2175165

commit a80c0aceeaffdb3afe9536fe747480e85841da7f
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:52 2022 +0100

    genirq/msi: Split msi_create_irq_domain()

    Split the functionality of msi_create_irq_domain() so it can
    be reused for creating per device irq domains.

    No functional change.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.559086358@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari 5c1a0c343e genirq/msi: Add size info to struct msi_domain_info
Bugzilla: https://bugzilla.redhat.com/2175165

commit 61bf992fc618503c910416f28afa0b015838b72b
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:51 2022 +0100

    genirq/msi: Add size info to struct msi_domain_info

    To allow proper range checking especially for dynamic allocations add a
    size field to struct msi_domain_info. If the field is 0 then the size is
    unknown or unlimited (up to MSI_MAX_INDEX) to provide backwards
    compability.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.501144862@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:43 -04:00
David Arcari 1ef4ea6253 genirq/msi: Provide struct msi_parent_ops
Bugzilla: https://bugzilla.redhat.com/2175165

commit b78780d93b068706d04f8f2f02bd08db5da01479
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:25:48 2022 +0100

    genirq/msi: Provide struct msi_parent_ops

    MSI parent domains must have some control over the MSI domains which are
    built on top. On domain creation they need to fill in e.g. architecture
    specific chip callbacks or msi domain ops to make the outermost domain
    parent agnostic which is obviously required for architecture independence
    etc.

    The structure contains:

        1) A bitfield which exposes the supported functional features. This
           allows to check for features and is also used in the initialization
           callback to mask out unsupported features when the actual domain
           implementation requests a broader range, e.g. on x86 PCI multi-MSI
           is only supported by remapping domains but not by the underlying
           vector domain. The PCI/MSI code can then always request multi-MSI
           support, but the resulting feature set after creation might not
           have it set.

        2) An optional string prefix which is put in front of domain and chip
           names during creation of the MSI domain. That allows to keep the
           naming schemes e.g. on x86 where PCI-MSI domains have a IR- prefix
           when interrupt remapping is enabled.

        3) An initialization callback to sanity check the domain info of
           the to be created MSI domain, to restrict features and to
           apply changes in MSI ops and interrupt chip callbacks to
           accomodate to the particular MSI parent implementation and/or
           the underlying hierarchy.

    Add a conveniance function to delegate the initialization from the
    MSI parent domain to an underlying domain in the hierarchy.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124232325.382485843@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari fdec3a1d59 genirq/msi: Remove unused alloc/free interfaces
Bugzilla: https://bugzilla.redhat.com/2175165

commit c459f11f32a022d0f97694030419d16816275a9d
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:43 2022 +0100

    genirq/msi: Remove unused alloc/free interfaces

    Now that all users are converted remove the old interfaces.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.694291814@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari 23541237b6 genirq/msi: Provide new domain id allocation functions
Bugzilla: https://bugzilla.redhat.com/2175165

commit f2480e7dacdcd9aab25641346ae53b7ff03777fc
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:35 2022 +0100

    genirq/msi: Provide new domain id allocation functions

    Provide two sorts of interfaces to handle the different use cases:

      - msi_domain_alloc_irqs_range():

            Handles a caller defined precise range

      - msi_domain_alloc_irqs_all():

            Allocates all interrupts associated to a domain by scanning the
            allocated MSI descriptors

    The latter is useful for the existing PCI/MSI support which does not have
    range information available.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.396497163@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari f80888e26c genirq/msi: Provide new domain id based interfaces for freeing interrupts
Bugzilla: https://bugzilla.redhat.com/2175165

commit 4cd5f4403f283766f73749c4c936801f58ffe77a
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:33 2022 +0100

    genirq/msi: Provide new domain id based interfaces for freeing interrupts

    Provide two sorts of interfaces to handle the different use cases:

      - msi_domain_free_irqs_range():

            Handles a caller defined precise range

      - msi_domain_free_irqs_all():

            Frees all interrupts associated to a domain

    The latter is useful for device teardown and to handle the legacy MSI support
    which does not have any range information available.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.337844751@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari 19468c179b genirq/msi: Make msi_add_simple_msi_descs() device domain aware
Bugzilla: https://bugzilla.redhat.com/2175165

commit 40742716f294449549884421170ea18356a2abe8
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:32 2022 +0100

    genirq/msi: Make msi_add_simple_msi_descs() device domain aware

    Allocating simple interrupt descriptors in the core code has to be multi
    device irqdomain aware for the upcoming PCI/IMS support.

    Change the interfaces to take a domain id into account. Use the internal
    control struct for transport of arguments.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.279112474@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari 43b20afa86 genirq/msi: Make descriptor freeing domain aware
Bugzilla: https://bugzilla.redhat.com/2175165

commit 377712c5a45f6de40bffef5ddc31b39cd86cf23f
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:30 2022 +0100

    genirq/msi: Make descriptor freeing domain aware

    Change the descriptor free functions to take a domain id to prepare for the
    upcoming multi MSI domain per device support.

    To avoid changing and extending the interfaces over and over use an core
    internal control struct and hand the pointer through the various functions.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.220788011@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari e4564c1e7a genirq/msi: Make descriptor allocation device domain aware
Bugzilla: https://bugzilla.redhat.com/2175165

commit fc8ab388325ddfd848d00f3a3383b4304594546a
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:29 2022 +0100

    genirq/msi: Make descriptor allocation device domain aware

    Change the descriptor allocation and insertion functions to take a domain
    id to prepare for the upcoming multi MSI domain per device support.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.163043028@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari 9774aaac6a genirq/msi: Rename msi_add_msi_desc() to msi_insert_msi_desc()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 1c89396300292da4e4a87db63bef45975461fa25
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:27 2022 +0100

    genirq/msi: Rename msi_add_msi_desc() to msi_insert_msi_desc()

    This reflects the functionality better. No functional change.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.103554618@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:42 -04:00
David Arcari 3c001c7adf genirq/msi: Make msi_get_virq() device domain aware
Bugzilla: https://bugzilla.redhat.com/2175165

commit 98043704f375f63a47efeff123ab92fcf34b95e6
Author: Ahmed S. Darwish <darwi@linutronix.de>
Date:   Fri Nov 25 00:24:25 2022 +0100

    genirq/msi: Make msi_get_virq() device domain aware

    In preparation of the upcoming per device multi MSI domain support, change
    the interface to support lookups based on domain id and zero based index
    within the domain.

    Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230314.044613697@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
David Arcari 2934d63d5b genirq/msi: Make MSI descriptor iterators device domain aware
Bugzilla: https://bugzilla.redhat.com/2175165

commit 94ff94cfea2827e287a42781a47f37c9ef82186b
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:24 2022 +0100

    genirq/msi: Make MSI descriptor iterators device domain aware

    To support multiple MSI interrupt domains per device it is necessary to
    segment the xarray MSI descriptor storage. Each domain gets up to
    MSI_MAX_INDEX entries.

    Change the iterators so they operate with domain ids and take the domain
    offsets into account.

    The publicly available iterators which are mostly used in legacy
    implementations and the PCI/MSI core default to MSI_DEFAULT_DOMAIN (0)
    which is the id for the existing "global" domains.

    No functional change.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230313.985498981@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
David Arcari 746e0bd035 genirq/msi: Add pointers for per device irq domains
Bugzilla: https://bugzilla.redhat.com/2175165

commit 64258eaa442b0b7d7eac8942cf27863ad9e6028e
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:22 2022 +0100

    genirq/msi: Add pointers for per device irq domains

    With the upcoming per device MSI interrupt domain support it is necessary
    to store the domain pointers per device.

    Instead of delegating that storage to device drivers or subsystems add a
    domain pointer to the msi_dev_domain array in struct msi_device_data.

    This pointer is also used to take care of tearing down the irq domains when
    msi_device_data is cleaned up via devres.

    The interfaces into the MSI core will be changed from irqdomain pointer
    based interfaces to domain id based interfaces to support multiple MSI
    domains on a single device (e.g. PCI/MSI[-X] and PCI/IMS.

    Once the per device domain support is complete the irq domain pointer in
    struct device::msi.domain will not longer contain a pointer to the "global"
    MSI domain. It will contain a pointer to the MSI parent domain instead.

    It would be a horrible maze of conditionals to evaluate all over the place
    which domain pointer should be used, i.e. the "global" one in
    device::msi::domain or one from the internal pointer array.

    To avoid this evaluate in msi_setup_device_data() whether the irq domain
    which is associated to a device is a "global" or a parent MSI domain. If it
    is global then copy the pointer into the first entry of the msi_dev_domain
    array.

    This allows to convert interfaces and implementation to domain ids while
    keeping everything existing working.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230313.923860399@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
David Arcari a9c80271b9 genirq/msi: Move xarray into a separate struct and create an array
Bugzilla: https://bugzilla.redhat.com/2175165

commit f1139f905bd2d8bec59be0c1404b592279ae0ac9
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:20 2022 +0100

    genirq/msi: Move xarray into a separate struct and create an array

    The upcoming support for multiple MSI domains per device requires storage
    for the MSI descriptors and in a second step storage for the irqdomain
    pointers.

    Move the xarray into a separate data structure msi_dev_domain and create an
    array with size 1 in msi_device_data, which can be expanded later when the
    support for per device domains is implemented.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230313.864887773@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
David Arcari aa96004e39 genirq/msi: Check for invalid MSI parent domain usage
Bugzilla: https://bugzilla.redhat.com/2175165

commit 3e86a3a3ed031dd498e614db0fa082a58d700df9
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:19 2022 +0100

    genirq/msi: Check for invalid MSI parent domain usage

    In the upcoming per device MSI domain concept the MSI parent domains are
    not allowed to be used as regular MSI domains where the MSI allocation/free
    operations are applicable.

    Add appropriate checks.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230313.806128070@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
David Arcari 5167caf1c1 genirq/msi: Move IRQ_DOMAIN_MSI_NOMASK_QUIRK to MSI flags
Bugzilla: https://bugzilla.redhat.com/2175165

commit 3dad5f9ad99b77dfd234d31e2ea3d77f620efc09
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 25 00:24:08 2022 +0100

    genirq/msi: Move IRQ_DOMAIN_MSI_NOMASK_QUIRK to MSI flags

    It's truly a MSI only flag and for the upcoming per device MSI domains this
    must be in the MSI flags so it can be set during domain setup without
    exposing this quirk outside of x86.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221124230313.454246167@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:40 -04:00
David Arcari 6f119b79d9 genirq/msi: Remove msi_domain_ops:: Msi_check()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 2569f62ca473584a8ba389f455fc00805389f7da
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:55:15 2022 +0100

    genirq/msi: Remove msi_domain_ops:: Msi_check()

    No more users.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122015.807616900@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:40 -04:00
David Arcari 5d8086422a genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
Bugzilla: https://bugzilla.redhat.com/2175165
Conflicts: RHEL does not have IMX_MU_MSI.  The remainder are minor
	   contextual differences due to drift, but all of the
	   replacements are applied.

Omitted-fix: 49f262bc3c7a "scsi: ufs: qcom: fix platform_msi_domain_free_irqs() reference"
	     The referenced code is not in RHEL

commit 13e7accb81d6c07993385af8342238ff22b41ac8
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:40 2022 +0100

    genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN

    Adjust to reality and remove another layer of pointless Kconfig
    indirection. CONFIG_GENERIC_MSI_IRQ is good enough to serve
    all purposes.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122014.524842979@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:38 -04:00
David Arcari 1a9c69be08 genirq/msi: Add bus token to struct msi_domain_info
Bugzilla: https://bugzilla.redhat.com/2175165

commit 22db089a4437a72277677f99717af499560b13f2
Author: Ahmed S. Darwish <darwi@linutronix.de>
Date:   Fri Nov 11 14:54:33 2022 +0100

    genirq/msi: Add bus token to struct msi_domain_info

    Add a bus token member to struct msi_domain_info and let
    msi_create_irq_domain() set the bus token.

    That allows to remove the bus token updates at the call sites.

    Suggested-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122014.294554462@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:38 -04:00
David Arcari 1d0cf804f4 genirq/msi: Make __msi_domain_free_irqs() static
Bugzilla: https://bugzilla.redhat.com/2175165

commit 057c97a1cd665ebb38841418adcd35f57b33cc21
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:30 2022 +0100

    genirq/msi: Make __msi_domain_free_irqs() static

    Now that the last user is gone, confine it to the core code.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122014.179595843@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:38 -04:00
David Arcari c13662340b genirq/msi: Provide msi_domain_ops:: Post_free()
Bugzilla: https://bugzilla.redhat.com/2175165

commit f6d3486a3d2f3c67d732641834eec872fcc66472
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:27 2022 +0100

    genirq/msi: Provide msi_domain_ops:: Post_free()

    To prepare for removing the exposure of __msi_domain_free_irqs() provide a
    post_free() callback in the MSI domain ops which can be used to solve
    the problem of the only user of __msi_domain_free_irqs() in arch/powerpc.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122014.063153448@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:37 -04:00
David Arcari 18e3d8f80b genirq/msi: Make __msi_domain_alloc_irqs() static
Bugzilla: https://bugzilla.redhat.com/2175165

commit 762687ceb31fc296e2e1406559e8bb50251c5277
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:25 2022 +0100

    genirq/msi: Make __msi_domain_alloc_irqs() static

    Nothing outside of the core code requires this.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122014.004725919@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:37 -04:00
David Arcari cedc96e80e genirq/msi: Add missing kernel doc to msi_next_desc()
Bugzilla: https://bugzilla.redhat.com/2175165

commit fdd5340411b25450612767270ac3cd0d8454183c
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:23 2022 +0100

    genirq/msi: Add missing kernel doc to msi_next_desc()

    W=1 complains about this.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122013.947071142@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:37 -04:00
David Arcari 49c9f1c0d5 genirq/msi: Remove filter from msi_free_descs_free_range()
Bugzilla: https://bugzilla.redhat.com/2175165

commit 2f2940d168236a92df524a1bd99fc7b0325918b5
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:22 2022 +0100

    genirq/msi: Remove filter from msi_free_descs_free_range()

    When a range of descriptors is freed then all of them are not associated to
    a linux interrupt. Remove the filter and add a warning to the free function.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122013.888850936@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:37 -04:00
David Arcari 4e9c73ed57 genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
Bugzilla: https://bugzilla.redhat.com/2175165

commit befd780253e774ea9388dd8dfad7c627a0aa7e02
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Nov 11 14:54:20 2022 +0100

    genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()

    There are no associated MSI descriptors in the requested range when the MSI
    descriptor allocation fails. Use MSI_DESC_ALL as the filter which prepares
    the next step to get rid of the filter for freeing.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20221111122013.831151822@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:37 -04:00
David Arcari 700322786a genirq/msi: Shutdown managed interrupts with unsatifiable affinities
Bugzilla: https://bugzilla.redhat.com/2175165

commit d802057c7c553ad426520a053da9f9fe08e2c35a
Author: Marc Zyngier <maz@kernel.org>
Date:   Tue Apr 5 19:50:38 2022 +0100

    genirq/msi: Shutdown managed interrupts with unsatifiable affinities

    When booting with maxcpus=<small number>, interrupt controllers
    such as the GICv3 ITS may not be able to satisfy the affinity of
    some managed interrupts, as some of the HW resources are simply
    not available.

    The same thing happens when loading a driver using managed interrupts
    while CPUs are offline.

    In order to deal with this, do not try to activate such interrupt
    if there is no online CPU capable of handling it. Instead, place
    it in shutdown state. Once a capable CPU shows up, it will be
    activated.

    Reported-by: John Garry <john.garry@huawei.com>
    Reported-by: David Decotigny <ddecotig@google.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: John Garry <john.garry@huawei.com>
    Link: https://lore.kernel.org/r/20220405185040.206297-2-maz@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:36 -04:00
David Arcari a1745de4a8 genirq/msi: Populate sysfs entry only once
Bugzilla: https://bugzilla.redhat.com/2175165

commit 74a5257a0c175810d620b5e631c4e7554955ac25
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Jan 10 19:12:45 2022 +0100

    genirq/msi: Populate sysfs entry only once

    The MSI entries for multi-MSI are populated en bloc for the MSI descriptor,
    but the current code invokes the population inside the per interrupt loop
    which triggers a warning in the sysfs code and causes the interrupt
    allocation to fail.

    Move it outside of the loop so it works correctly for single and multi-MSI.

    Fixes: bf5e758f02fc ("genirq/msi: Simplify sysfs handling")
    Reported-by: Borislav Petkov <bp@alien8.de>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Borislav Petkov <bp@suse.de>
    Link: https://lore.kernel.org/r/87leznqx2a.ffs@tglx

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:36 -04:00
David Arcari d31b6a12be genirq/msi: Convert storage to xarray
Bugzilla: https://bugzilla.redhat.com/2175165

commit cd6cf06590b9792340dceaa285138777f3cc4d90
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:52 2021 +0100

    genirq/msi: Convert storage to xarray

    The current linked list storage for MSI descriptors is suboptimal in
    several ways:

      1) Looking up a MSI desciptor requires a O(n) list walk in the worst case

      2) The upcoming support of runtime expansion of MSI-X vectors would need
         to do a full list walk to figure out whether a particular index is
         already associated.

      3) Runtime expansion of sparse allocations is even more complex as the
         current implementation assumes an ordered list (increasing MSI index).

    Use an xarray which solves all of the above problems nicely.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210749.280627070@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:36 -04:00
David Arcari 3dbe218f76 genirq/msi: Simplify sysfs handling
Bugzilla: https://bugzilla.redhat.com/2175165

commit bf5e758f02fc739589dcc6a3395c3a3eb77b5c90
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:50 2021 +0100

    genirq/msi: Simplify sysfs handling

    The sysfs handling for MSI is a convoluted maze and it is in the way of
    supporting dynamic expansion of the MSI-X vectors because it only supports
    a one off bulk population/free of the sysfs entries.

    Change it to do:

       1) Creating an empty sysfs attribute group when msi_device_data is
          allocated

       2) Populate the entries when the MSI descriptor is initialized

       3) Free the entries when a MSI descriptor is detached from a Linux
          interrupt.

       4) Provide functions for the legacy non-irqdomain fallback code to
          do a bulk population/free. This code won't support dynamic
          expansion.

    This makes the code simpler and reduces the number of allocations as the
    empty attribute group can be shared.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210749.224917330@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:36 -04:00
David Arcari d0e5ddf759 genirq/msi: Mop up old interfaces
Bugzilla: https://bugzilla.redhat.com/2175165

commit cc9a246dbf6bdef56d9eee296a1db52dd0607976
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:47 2021 +0100

    genirq/msi: Mop up old interfaces

    Get rid of the old iterators, alloc/free functions and adjust the core code
    accordingly.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210749.117395027@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:35 -04:00
David Arcari 39d786a9b7 genirq/msi: Convert to new functions
Bugzilla: https://bugzilla.redhat.com/2175165

commit 495c66aca3da704e063fa373fdbe371e71d3f4ee
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:45 2021 +0100

    genirq/msi: Convert to new functions

    Use the new iterator functions and add locking where required.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210749.063705667@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:35 -04:00
David Arcari 0bcef6076d genirq/msi: Make interrupt allocation less convoluted
Bugzilla: https://bugzilla.redhat.com/2175165

commit ef8dd01538ea2553ab101ddce6a85a321406d9c0
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:44 2021 +0100

    genirq/msi: Make interrupt allocation less convoluted

    There is no real reason to do several loops over the MSI descriptors
    instead of just doing one loop. In case of an error everything is undone
    anyway so it does not matter whether it's a partial or a full rollback.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210749.010234767@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:35 -04:00
David Arcari 48ffe18259 platform-msi: Simplify platform device MSI code
Bugzilla: https://bugzilla.redhat.com/2175165

commit a80713fea3d12344e1da18f9113c74cdb3c463f1
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:42 2021 +0100

    platform-msi: Simplify platform device MSI code

    The allocation code is overly complex. It tries to have the MSI index space
    packed, which is not working when an interrupt is freed. There is no
    requirement for this. The only requirement is that the MSI index is unique.

    Move the MSI descriptor allocation into msi_domain_populate_irqs() and use
    the Linux interrupt number as MSI index which fulfils the unique
    requirement.

    This requires to lock the MSI descriptors which makes the lock order
    reverse to the regular MSI alloc/free functions vs. the domain
    mutex. Assign a seperate lockdep class for these MSI device domains.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210748.956731741@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:35 -04:00
David Arcari a27e80a743 genirq/msi: Provide domain flags to allocate/free MSI descriptors automatically
Bugzilla: https://bugzilla.redhat.com/2175165

commit 645474e2cee450131e8b8d8a69a5d9bbabd43f3f
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Mon Dec 6 23:51:12 2021 +0100

    genirq/msi: Provide domain flags to allocate/free MSI descriptors automatically

    Provide domain info flags which tell the core to allocate simple
    descriptors or to free descriptors when the interrupts are freed and
    implement the required functionality.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Michael Kelley <mikelley@microsoft.com>
    Tested-by: Nishanth Menon <nm@ti.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20211206210747.928198636@linutronix.de

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:34 -04:00