Commit Graph

214 Commits

Author SHA1 Message Date
Jerry Snitselaar 1907f3a585 genirq/irqdomain: Remove unused irq_domain_check_msi_remap() code
Bugzilla: https://bugzilla.redhat.com/2181354
Upstream Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

commit a5e72a6bac14181249ffd04f35f6a7c9bf47fbb9
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Thu Dec 8 10:51:02 2022 -0400

    genirq/irqdomain: Remove unused irq_domain_check_msi_remap() code

    After converting the users of irq_domain_check_msi_remap() it and the
    helpers are no longer needed.

    The new version does not require all the #ifdef helpers and inlines
    because CONFIG_GENERIC_MSI_IRQ always requires CONFIG_IRQ_DOMAIN and
    IRQ_DOMAIN_HIERARCHY.

    Link: https://lore.kernel.org/r/5-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 a5e72a6bac14181249ffd04f35f6a7c9bf47fbb9)
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
2023-05-03 08:22:11 -07:00
David Arcari 0ad84c9c15 irqdomain: Add missing NULL pointer check in irq_domain_create_hierarchy()
Bugzilla: https://bugzilla.redhat.com/2114045

commit ad32ab9604f29827494024828f527228e84fbd2c
Author: Juergen Gross <jgross@suse.com>
Date:   Thu Feb 23 09:38:00 2023 +0100

    irqdomain: Add missing NULL pointer check in irq_domain_create_hierarchy()

    The recent switch to per-domain locking caused a NULL dereference in
    irq_domain_create_hierarchy(), as Xen code is calling
    msi_create_irq_domain() with a NULL parent pointer.

    Fix that by testing parent to be set before dereferencing it. For a
    non-existing parent the irqdomain's root will stay to point to
    itself.

    Fixes: 9dbb8e3452ab ("irqdomain: Switch to per-domain locking")
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20230223083800.31347-1-jgross@suse.com

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:53 -04:00
David Arcari 4b795b9c3b irqdomain: Switch to per-domain locking
Bugzilla: https://bugzilla.redhat.com/2114045

commit 9dbb8e3452aba34e6fa4f63054b3adc66aceb7ec
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:43:02 2023 +0100

    irqdomain: Switch to per-domain locking

    The IRQ domain structures are currently protected by the global
    irq_domain_mutex. Switch to using more fine-grained per-domain locking,
    which can speed up parallel probing by reducing lock contention.

    On a recent arm64 laptop, the total time spent waiting for the locks
    during boot drops from 160 to 40 ms on average, while the maximum
    aggregate wait time drops from 550 to 90 ms over ten runs for example.

    Note that the domain lock of the root domain (innermost domain) must be
    used for hierarchical domains. For non-hierarchical domains (as for root
    domains), the new root pointer is set to the domain itself so that
    &domain->root->mutex always points to the right lock.

    Also note that hierarchical domains should be constructed using
    irq_domain_create_hierarchy() (or irq_domain_add_hierarchy()) to avoid
    having racing allocations access a not fully initialised domain. As a
    safeguard, the lockdep assertion in irq_domain_set_mapping() will catch
    any offenders that also fail to set the root domain pointer.

    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-21-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:53 -04:00
David Arcari 8390076f98 irqdomain: Clean up irq_domain_push/pop_irq()
Bugzilla: https://bugzilla.redhat.com/2114045

commit 930a1bbbef01cdcd682d9c2b4bc9e36b9618fed3
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:53 2023 +0100

    irqdomain: Clean up irq_domain_push/pop_irq()

    The irq_domain_push_irq() interface is used to add a new (outmost) level
    to a hierarchical domain after IRQs have been allocated.

    Possibly due to differing mental images of hierarchical domains, the
    names used for the irq_data variables make these functions much harder
    to understand than what they need to be.

    Rename the struct irq_data pointer to the data embedded in the
    descriptor as simply 'irq_data' and refer to the data allocated by this
    interface as 'parent_irq_data' so that the names reflect how
    hierarchical domains are implemented.

    Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-12-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:51 -04:00
David Arcari 22979de23c irqdomain: Drop leftover brackets
Bugzilla: https://bugzilla.redhat.com/2114045

commit 4e0d86df9344bfd1951eb2571e4ef8f3d37000a4
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:52 2023 +0100

    irqdomain: Drop leftover brackets

    Drop some unnecessary brackets that were left in place when the
    corresponding code was updated.

    Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-11-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:51 -04:00
David Arcari cefc095d2c irqdomain: Drop dead domain-name assignment
Bugzilla: https://bugzilla.redhat.com/2114045

commit 28a9ff23d8b56db09cb01cef174a205ea5e2ca49
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:51 2023 +0100

    irqdomain: Drop dead domain-name assignment

    Since commit d59f6617ee ("genirq: Allow fwnode to carry name
    information only") an IRQ domain is always given a name during
    allocation (e.g. used for the debugfs entry).

    Drop the leftover name assignment when allocating the first IRQ.

    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-10-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:51 -04:00
David Arcari f9d2d9b5b9 irqdomain: Drop revmap mutex
Bugzilla: https://bugzilla.redhat.com/2114045

commit 47d1932f37de99bae3345bb93f098ac8750ab0fb
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:50 2023 +0100

    irqdomain: Drop revmap mutex

    The revmap mutex is essentially only used to maintain the integrity of
    the radix tree during updates (lookups use RCU).

    As the global irq_domain_mutex is now held in all paths that update the
    revmap structures there is strictly no longer any need for the dedicated
    mutex, which can be removed.

    Drop the revmap mutex and add lockdep assertions to the revmap helpers
    to make sure that the global lock is always held when updating the
    revmap.

    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-9-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:50 -04:00
David Arcari e26d95376d irqdomain: Fix domain registration race
Bugzilla: https://bugzilla.redhat.com/2114045

commit 8932c32c3053accd50702b36e944ac2016cd103c
Author: Marc Zyngier <maz@kernel.org>
Date:   Mon Feb 13 11:42:49 2023 +0100

    irqdomain: Fix domain registration race

    Hierarchical domains created using irq_domain_create_hierarchy() are
    currently added to the domain list before having been fully initialised.

    This specifically means that a racing allocation request might fail to
    allocate irq data for the inner domains of a hierarchy in case the
    parent domain pointer has not yet been set up.

    Note that this is not really any issue for irqchip drivers that are
    registered early (e.g. via IRQCHIP_DECLARE() or IRQCHIP_ACPI_DECLARE())
    but could potentially cause trouble with drivers that are registered
    later (e.g. modular drivers using IRQCHIP_PLATFORM_DRIVER_BEGIN(),
    gpiochip drivers, etc.).

    Fixes: afb7da83b9 ("irqdomain: Introduce helper function irq_domain_add_hierarchy()")
    Cc: stable@vger.kernel.org      # 3.19
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    [ johan: add commit message ]
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-8-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:50 -04:00
David Arcari e5bad2ae25 irqdomain: Fix mapping-creation race
Bugzilla: https://bugzilla.redhat.com/2114045

commit 601363cc08da25747feb87c55573dd54de91d66a
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:48 2023 +0100

    irqdomain: Fix mapping-creation race

    Parallel probing of devices that share interrupts (e.g. when a driver
    uses asynchronous probing) can currently result in two mappings for the
    same hardware interrupt to be created due to missing serialisation.

    Make sure to hold the irq_domain_mutex when creating mappings so that
    looking for an existing mapping before creating a new one is done
    atomically.

    Fixes: 765230b5f0 ("driver-core: add asynchronous probing support for drivers")
    Fixes: b62b2cf575 ("irqdomain: Fix handling of type settings for existing mappings")
    Link: https://lore.kernel.org/r/YuJXMHoT4ijUxnRb@hovoldconsulting.com
    Cc: stable@vger.kernel.org      # 4.8
    Cc: Dmitry Torokhov <dtor@chromium.org>
    Cc: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-7-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:50 -04:00
David Arcari 6d6186d6dd irqdomain: Refactor __irq_domain_alloc_irqs()
Bugzilla: https://bugzilla.redhat.com/2114045

commit d55f7f4c58c07beb5050a834bf57ae2ede599c7e
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:47 2023 +0100

    irqdomain: Refactor __irq_domain_alloc_irqs()

    Refactor __irq_domain_alloc_irqs() so that it can be called internally
    while holding the irq_domain_mutex.

    This will be used to fix a shared-interrupt mapping race, hence the
    Fixes tag.

    Fixes: b62b2cf575 ("irqdomain: Fix handling of type settings for existing mappings")
    Cc: stable@vger.kernel.org      # 4.8
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-6-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:50 -04:00
David Arcari e73bb5d827 irqdomain: Look for existing mapping only once
Bugzilla: https://bugzilla.redhat.com/2114045

commit 6e6f75c9c98d2d246d90411ff2b6f0cd271f4cba
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:46 2023 +0100

    irqdomain: Look for existing mapping only once

    Avoid looking for an existing mapping twice when creating a new mapping
    using irq_create_fwspec_mapping() by factoring out the actual allocation
    which is shared with irq_create_mapping_affinity().

    The new helper function will also be used to fix a shared-interrupt
    mapping race, hence the Fixes tag.

    Fixes: b62b2cf575 ("irqdomain: Fix handling of type settings for existing mappings")
    Cc: stable@vger.kernel.org      # 4.8
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-5-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:50 -04:00
David Arcari f91e0c7d75 irqdomain: Drop bogus fwspec-mapping error handling
Bugzilla: https://bugzilla.redhat.com/2114045

commit e3b7ab025e931accdc2c12acf9b75c6197f1c062
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:45 2023 +0100

    irqdomain: Drop bogus fwspec-mapping error handling

    In case a newly allocated IRQ ever ends up not having any associated
    struct irq_data it would not even be possible to dispose the mapping.

    Replace the bogus disposal with a WARN_ON().

    This will also be used to fix a shared-interrupt mapping race, hence the
    CC-stable tag.

    Fixes: 1e2a7d7849 ("irqdomain: Don't set type when mapping an IRQ")
    Cc: stable@vger.kernel.org      # 4.8
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-4-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:49 -04:00
David Arcari 7e20eda241 irqdomain: Fix disassociation race
Bugzilla: https://bugzilla.redhat.com/2114045

commit 3f883c38f5628f46b30bccf090faec054088e262
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:44 2023 +0100

    irqdomain: Fix disassociation race

    The global irq_domain_mutex is held when mapping interrupts from
    non-hierarchical domains but currently not when disposing them.

    This specifically means that updates of the domain mapcount is racy
    (currently only used for statistics in debugfs).

    Make sure to hold the global irq_domain_mutex also when disposing
    mappings from non-hierarchical domains.

    Fixes: 9dc6be3d41 ("genirq/irqdomain: Add map counter")
    Cc: stable@vger.kernel.org      # 4.13
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-3-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:49 -04:00
David Arcari f8b59af3fb irqdomain: Fix association race
Bugzilla: https://bugzilla.redhat.com/2114045

commit b06730a571a9ff1ba5bd6b20bf9e50e5a12f1ec6
Author: Johan Hovold <johan+linaro@kernel.org>
Date:   Mon Feb 13 11:42:43 2023 +0100

    irqdomain: Fix association race

    The sanity check for an already mapped virq is done outside of the
    irq_domain_mutex-protected section which means that an (unlikely) racing
    association may not be detected.

    Fix this by factoring out the association implementation, which will
    also be used in a follow-on change to fix a shared-interrupt mapping
    race.

    Fixes: ddaf144c61 ("irqdomain: Refactor irq_domain_associate_many()")
    Cc: stable@vger.kernel.org      # 3.11
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-2-johan+linaro@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:49 -04:00
David Arcari 60ca61ecb8 irqdomain: Use hwirq_max instead of revmap_size for NOMAP domains
Bugzilla: https://bugzilla.redhat.com/2114045

commit ef50cd57a73a8bbfad403e5e2edb3309611f58ad
Author: Xu Qiang <xuqiang36@huawei.com>
Date:   Tue Jul 19 06:36:41 2022 +0000

    irqdomain: Use hwirq_max instead of revmap_size for NOMAP domains

    NOMAP irq domains use the revmap_size field to indicate the maximum
    hwirq number the domain accepts. This is a bit confusing as
    revmap_size is usually used to indicate the size of the revmap array,
    which a NOMAP domain doesn't have.

    Instead, use the hwirq_max field which has the correct semantics, and
    keep revmap_size to 0 for a NOMAP domain.

    Signed-off-by: Xu Qiang <xuqiang36@huawei.com>
    [maz: commit message]
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20220719063641.56541-3-xuqiang36@huawei.com

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:49 -04:00
David Arcari e97ae40a48 PCI: apple: Add INTx and per-port interrupt support
Bugzilla: https://bugzilla.redhat.com/2114045
Conflicts: dropped pcie-apple.c hunks

commit d8fcbe52d7d382106ab1dfa89c4b6a4952524125
Author: Marc Zyngier <maz@kernel.org>
Date:   Wed Sep 29 17:38:39 2021 +0100

    PCI: apple: Add INTx and per-port interrupt support

    Add support for the per-port interrupt controller that deals with both INTx
    signalling and management interrupts.

    This allows the Link-up/Link-down interrupts to be wired, allowing the
    bring-up to be synchronised (and provide debug information).  The framework
    can further be used to handle the rest of the per port events if and when
    necessary.

    Likewise, INTx signalling is implemented so that end-points can actually be
    used.

    Link: https://lore.kernel.org/r/20210929163847.2807812-7-maz@kernel.org
    Link: https://lore.kernel.org/r/20211004150552.3844830-1-maz@kernel.org
    Tested-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:49 -04:00
David Arcari 6bf881b4ea irqdomain: Change the type of 'size' in __irq_domain_add() to be consistent
Bugzilla: https://bugzilla.redhat.com/2114045

commit 20c36ce2164f1774b487d443ece99b754bc6ad43
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Thu Sep 16 10:52:03 2021 +0800

    irqdomain: Change the type of 'size' in __irq_domain_add() to be consistent

    The 'size' is used in struct_size(domain, revmap, size) and its input
    parameter type is 'size_t'(unsigned int).
    Changing the size to 'unsigned int' to make the type consistent.

    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210916025203.44841-1-cuibixuan@huawei.com

Signed-off-by: David Arcari <darcari@redhat.com>
2023-04-07 07:31:48 -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 cdca4eb1dd irqdomain: Let irq_domain_set_{info,hwirq_and_chip} take a const irq_chip
Bugzilla: https://bugzilla.redhat.com/2175165

commit 45ec846c1cd11835a29c85645065115dd791aa45
Author: Marc Zyngier <maz@kernel.org>
Date:   Wed Feb 9 16:25:58 2022 +0000

    irqdomain: Let irq_domain_set_{info,hwirq_and_chip} take a const irq_chip

    In order to let a const irqchip be fed to the irqchip layer, adjust
    the various prototypes. An extra cast in irq_domain_set_hwirq_and_chip()
    is required to avoid a warning.

    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20220209162607.1118325-2-maz@kernel.org

Signed-off-by: David Arcari <darcari@redhat.com>
2023-03-13 09:52:41 -04:00
Eric Chanudet 27fcb935cd irqdomain: Export irq_domain_disconnect_hierarchy()
Bugzilla: https://bugzilla.redhat.com/2132140

commit 131d326ba969847daa43d708ac11c27978d78566
Author: Maulik Shah <mkshah@codeaurora.org>
Date:   Mon Aug 23 13:34:39 2021 +0530

    irqdomain: Export irq_domain_disconnect_hierarchy()

    Export irq_domain_disconnect_hierarchy() so irqchip module drivers
    can use it.

    Signed-off-by: Maulik Shah <mkshah@codeaurora.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/1629705880-27877-2-git-send-email-mkshah@codeaurora.org

Signed-off-by: Eric Chanudet <echanude@redhat.com>
2022-10-05 18:55:36 -04:00
Marc Zyngier d22558dd0a irqdomain: Introduce irq_resolve_mapping()
Rework irq_find_mapping() to return an both an irq_desc pointer,
optionally the virtual irq number, and rename the result to
__irq_resolve_mapping(). a new helper called irq_resolve_mapping()
is provided for code that doesn't need the virtual irq number.

irq_find_mapping() is also rewritten in terms of __irq_resolve_mapping().

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:18 +01:00
Marc Zyngier d4a45c68dc irqdomain: Protect the linear revmap with RCU
It is pretty odd that the radix tree uses RCU while the linear
portion doesn't, leading to potential surprises for the users,
depending on how the irqdomain has been created.

Fix this by moving the update of the linear revmap under
the mutex, and the lookup under the RCU read-side lock.

The mutex name is updated to reflect that it doesn't only
cover the radix-tree anymore.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:18 +01:00
Marc Zyngier 48b15a7921 irqdomain: Cache irq_data instead of a virq number in the revmap
Caching a virq number in the revmap is pretty inefficient, as
it means we will need to convert it back to either an irq_data
or irq_desc to do anything with it.

It is also a bit odd, as the radix tree does cache irq_data
pointers.

Change the revmap type to be an irq_data pointer instead of
an unsigned int, and preserve the current API for now.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:18 +01:00
Marc Zyngier 426fa31614 irqdomain: Use struct_size() helper when allocating irqdomain
Instead of open-coding the size computation of struct irqdomain,
use the struct_size() helper instead.

This is going to be handy as we change the type of the revmap
array.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:17 +01:00
Marc Zyngier 4f86a06e2d irqdomain: Make normal and nomap irqdomains exclusive
Direct mappings are completely exclusive of normal mappings, meaning
that we can refactor the code slightly so that we can get rid of
the revmap_direct_max_irq field and use the revmap_size field
instead, reducing the size of the irqdomain structure.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:17 +01:00
Marc Zyngier e37af8011a powerpc: Move the use of irq_domain_add_nomap() behind a config option
Only a handful of old PPC systems are still using the old 'nomap'
variant of the irqdomain library. Move the associated definitions
behind a configuration option, which will allow us to make some
more radical changes.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:17 +01:00
Marc Zyngier 1da027362a irqdomain: Reimplement irq_linear_revmap() with irq_find_mapping()
irq_linear_revmap() is supposed to be a fast path for domain
lookups, but it only exposes low-level details of the irqdomain
implementation, details which are better kept private.

The *overhead* between the two is only a function call and
a couple of tests, so it is likely that noone can show any
meaningful difference compared to the cost of taking an
interrupt.

Reimplement irq_linear_revmap() with irq_find_mapping()
in order to preserve source code compatibility, and
rename the internal field for a measure.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-06-10 13:09:17 +01:00
Linus Torvalds 5d6a1b84e0 gpio updates for v5.13
- new driver for the Realtek Otto GPIO controller
 - ACPI support for gpio-mpc8xxx
 - edge event support for gpio-sch (+ Kconfig fixes)
 - Kconfig improvements in gpio-ich
 - fixes to older issues in gpio-mockup
 - ACPI quirk for ignoring EC wakeups on Dell Venue 10 Pro 5055
 - improve the GPIO aggregator code by using more generic interfaces instead of
   reimplementing them in the driver
 - convert the DT bindings for gpio-74x164 to yaml
 - documentation improvements
 - a slew of other minor fixes and improvements to GPIO drivers
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEFp3rbAvDxGAT0sefEacuoBRx13IFAmCSptQACgkQEacuoBRx
 13KFDQ/+NOkRQuJarKAvGuR5LJ81CbBfH72/m9gJMB9gwNBS7g+esNWrZG/riWVM
 BVs2fxlC52+ppN1rV7iMEaXSyREULrcidgoZ0H7X2vsI9MRkk/fjzpTRwbJbSLPo
 C+IXBAHHfuUC1FQNtQk1cuZXl7PToHd/A14KZIkLOBxLjQddpSo7TTkv23Ub1BA7
 Se13EaDrBJxzfmLR900kAKCFDyM8VRnIt7/euhmlTcXCxOg/lCbGZ4eBpEZasUs5
 UA9PQX0dnnwtMER4b4TQPIdQ345A0l+xqALr8X2leqQ0AqsWQ7kveMwfSRlXI5Hr
 zyuXRiA0e84h6HXIHE59kXqoa4LJVnW59hgjYx0D+fcZ5gNVnaRg/4LsztJmMd/f
 uVAZazE4jd81Cr/kbtpEu5mfGPjOVBeUCeDnKtRovnaSMi24HwqvHqIauI9sM8fN
 locTCYOdLfvxucAJHZ/BWe8yl301/+IlwiHiN+7+/3ljYB+HjAH42rdPwFpP1BWJ
 bpgd90KxLHezeqsv83U9CTTrVK9ZM2yisVunQUo3bVi6Ztxl2Juv16P5Qs0IJW2F
 mly+KNTa4M6NKCdP6luEnazmifFIsnreCzTMfPoa9w+eu/vpIw6lZDFpDAbePV+A
 8XJ99TxV1Bk9kUjvKiEi2qx6uW7f5k8JIwvRvJWhRXkEzufJyUI=
 =5vLN
 -----END PGP SIGNATURE-----

Merge tag 'gpio-updates-for-v5.13-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio updates from Bartosz Golaszewski:

 - new driver for the Realtek Otto GPIO controller

 - ACPI support for gpio-mpc8xxx

 - edge event support for gpio-sch (+ Kconfig fixes)

 - Kconfig improvements in gpio-ich

 - fixes to older issues in gpio-mockup

 - ACPI quirk for ignoring EC wakeups on Dell Venue 10 Pro 5055

 - improve the GPIO aggregator code by using more generic interfaces
   instead of reimplementing them in the driver

 - convert the DT bindings for gpio-74x164 to yaml

 - documentation improvements

 - a slew of other minor fixes and improvements to GPIO drivers

* tag 'gpio-updates-for-v5.13-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: (34 commits)
  dt-bindings: gpio: add YAML description for rockchip,gpio-bank
  gpio: mxs: remove useless function
  dt-bindings: gpio: fairchild,74hc595: Convert to json-schema
  gpio: it87: remove unused code
  gpio: 104-dio-48e: Fix coding style issues
  gpio: mpc8xxx: Add ACPI support
  gpio: ich: Switch to be dependent on LPC_ICH
  gpio: sch: Drop MFD_CORE selection
  gpio: sch: depends on LPC_SCH
  gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055
  gpio: sch: Hook into ACPI GPE handler to catch GPIO edge events
  gpio: sch: Add edge event support
  gpio: aggregator: Replace custom get_arg() with a generic next_arg()
  lib/cmdline: Export next_arg() for being used in modules
  gpio: omap: Use device_get_match_data() helper
  gpio: Add Realtek Otto GPIO support
  dt-bindings: gpio: Binding for Realtek Otto GPIO
  docs: kernel-parameters: Add gpio_mockup_named_lines
  docs: kernel-parameters: Move gpio-mockup for alphabetic order
  lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc()
  ...
2021-05-05 12:39:29 -07:00
Thomas Gleixner 765822e156 irqchip updates for Linux 5.13
New HW support:
 
 - New driver for the Nuvoton WPCM450 interrupt controller
 - New driver for the IDT 79rc3243x interrupt controller
 - Add support for interrupt trigger configuration to the MStar irqchip
 - Add more external interrupt support to the STM32 irqchip
 - Add new compatible strings for QCOM SC7280 to the qcom-pdc binding
 
 Fixes and cleanups:
 
 - Drop irq_create_strict_mappings() and irq_create_identity_mapping()
   from the irqdomain API, with cleanups in a couple of drivers
 - Fix nested NMI issue with spurious interrupts on GICv3
 - Don't allow GICv4.1 vSGIs when the CPU doesn't support them
 - Various cleanups and minor fixes
 -----BEGIN PGP SIGNATURE-----
 
 iQJDBAABCgAtFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAmCD5kwPHG1hekBrZXJu
 ZWwub3JnAAoJECPQ0LrRPXpDCWsQAL5yHXtApf4l3F0W99SJIooumrQh3UR6nENG
 2WVR66g+MiuZ/JQcHAojdLQ6W6K9W8eTcY3hRNFCqlI1lrKffz6ovstuYg3Wphog
 JX1gQYcpqt67WYtb/TVw3JM5D3NLU4XKPKZPhRzSHv5G9utI2QeAv13EBcPoHxZd
 UBRAEdUrv90KIFDe2CxWo8B5ra07xfgOpDvlYYKlee+jQLtf6i4Kj7Tm0XoK3hoW
 w0Mo//5r2SggdXfFLW1sm0BGs0bpJMSNixKCZWRfXbnZLAYIaBynSoLT9XoYT/uC
 FDegtFZ9IG/5NXJ1d3Yl0RjsPp+iPUOOTq/5gAoXI0hRCLZ1f8G1IuDEoIf8ElOg
 kxA1JpYE1fewxNt7oh48BAs3Qa3fdjJ1+k6gFlau4ctJBjxTHMz7v7lr7PmjhPz7
 HgcmzFCu9Wb8pj1IDHMINkOMmAiQhgr3N0WK372wQyNE8Z8iB0ZeCYX9jAV5YTK6
 eQdsDgNW18rv1ks/f7vzJw4EHRUM2tzSYimgf3oW+EJq6xKacMHfDMp9ERtHcnfJ
 +4CCEEafrSOj/KsNpNnA7Bq3Qjh+RdRXDtCPsoGQ3LS1L5/JOaUoSmrCkWNNfXuZ
 kUKTrNzopmMPvvwx6Q1YUypMbKCloNvlO3IgKalKNVP5drWA184abOIU2MGp+yI1
 LAA8SFYU
 =RqVj
 -----END PGP SIGNATURE-----

Merge tag 'irqchip-5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core

Pull irqchip and irqdomain updates from Marc Zyngier:

 New HW support:

  - New driver for the Nuvoton WPCM450 interrupt controller
  - New driver for the IDT 79rc3243x interrupt controller
  - Add support for interrupt trigger configuration to the MStar irqchip
  - Add more external interrupt support to the STM32 irqchip
  - Add new compatible strings for QCOM SC7280 to the qcom-pdc binding

 Fixes and cleanups:

  - Drop irq_create_strict_mappings() and irq_create_identity_mapping()
    from the irqdomain API, with cleanups in a couple of drivers
  - Fix nested NMI issue with spurious interrupts on GICv3
  - Don't allow GICv4.1 vSGIs when the CPU doesn't support them
  - Various cleanups and minor fixes

Link: https://lore.kernel.org/r/20210424094640.1731920-1-maz@kernel.org
2021-04-24 21:18:44 +02:00
Marc Zyngier 817aad5d08 irqdomain: Drop references to recusive irqdomain setup
It was never completely implemented, and was removed a long time
ago. Adjust the documentation to reflect this.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210406093557.1073423-8-maz@kernel.org
2021-04-22 15:55:22 +01:00
Marc Zyngier 1a0b05e435 irqdomain: Get rid of irq_create_strict_mappings()
No user of this helper is left, remove it.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-04-22 15:55:22 +01:00
Marc Zyngier 4a35d6a037 irqdomain: Get rid of irq_create_identity_mapping()
The sole user of irq_create_identity_mapping() having been converted,
get rid of the unused helper.

Signed-off-by: Marc Zyngier <maz@kernel.org>
2021-04-07 13:25:52 +01:00
Andy Shevchenko 67196fea0f irqdomain: Introduce irq_domain_create_simple() API
Linus Walleij pointed out that ird_domain_add_simple() gained
additional functionality and can't be anymore replaced with
a simple conditional. In preparation to upgrade GPIO library
to use fwnode, introduce irq_domain_create_simple() API which is
functional equivalent to the existing irq_domain_add_simple(),
but takes a pointer to the struct fwnode_handle as a parameter.

While at it, amend documentation to mention irq_domain_create_*()
functions where it makes sense.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2021-03-26 14:56:18 +01:00
Ingo Molnar a359f75796 irq: Fix typos in comments
Fix ~36 single-word typos in the IRQ, irqchip and irqdomain code comments.

Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2021-03-22 04:23:14 +01:00
Greg Kroah-Hartman 69dd4503a7 irqdomain: Remove debugfs_file from struct irq_domain
There's no need to keep around a dentry pointer to a simple file that
debugfs itself can look up when we need to remove it from the system.
So simplify the code by deleting the variable and cleaning up the logic
around the debugfs file.

Cc: Marc Zyngier <maz@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/YCvYV53ZdzQSWY6w@kroah.com
2021-03-08 20:12:08 +00:00
Saravana Kannan ed1054a02a irqdomain: Mark fwnodes when their irqdomain is added/removed
This allows fw_devlink to recognize irqdomain drivers that don't use the
device-driver model to initialize the device. fw_devlink will use this
information to make sure consumers of such irqdomain aren't indefinitely
blocked from probing, waiting for the irqdomain device to appear and
bind to a driver.

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Saravana Kannan <saravanak@google.com>
Link: https://lore.kernel.org/r/20210205222644.2357303-7-saravanak@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-02-09 14:31:06 +01:00
Linus Torvalds 2cffa11e2a Generic interrupt and irqchips subsystem:
Core:
 
      - Consolidation and robustness changes for irq time accounting
 
      - Cleanup and consolidation of irq stats
 
      - Remove the fasteoi IPI flow which has been proved useless
 
      - Provide an interface for converting legacy interrupt mechanism into
        irqdomains
 
  Drivers:
 
      The rare event of not having completely new chip driver code, just new
      DT bindings and extensions of existing drivers to accomodate new
      variants!
 
      - Preliminary support for managed interrupts on platform devices
 
      - Correctly identify allocation of MSIs proxyied by another device
 
      - Generalise the Ocelot support to new SoCs
 
      - Improve GICv4.1 vcpu entry, matching the corresponding KVM optimisation
 
      - Work around spurious interrupts on Qualcomm PDC
 
      - Random fixes and cleanups
 
 Thanks,
 
 	tglx
 -----BEGIN PGP SIGNATURE-----
 
 iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl/YwZgTHHRnbHhAbGlu
 dXRyb25peC5kZQAKCRCmGPVMDXSYoW4CD/90rTi1OQrMe3nb5okVjUZmktz/K3BN
 Cl5+evFiXiNoH+yJSMIVP+8eMAtBH6RgoaD0EUtSYmgzb9h/JRRQYwtPxobXcMb2
 2xcWyLPJkVJL431JKNM8BBRYjLA2VnQ6Ia+Kx3BxqpgKXn5+cEMh1dwIy27Ll2rj
 +2NHAQe1sHL7o/KcCDhYqbVIDjw5K/d7YPwjEuPeEoNv1DOxrOCdCEfgFN0jBtRE
 CoaRTBskeAaHIzHNp47Mxyz43g4tA/D8kB68X0OjpEykVkPUbgNK1FHSwaPbIsFT
 FTSPU3zg8Q6DZ+RGyjNJykIFgUbirlJxARk2c6Ct8Kc3DN6K1jQt4EsU7CXRCc98
 BTBjUNeFeNj3irZ4GHhyMKOQJCA1Z5nCRfBUGiW6gK8183us3BLfH5DM1zEsAYUh
 DCp+UKsLuXhbB80EWq7kl82/2mNGZ8En8EerE6XJA7Z3JN8FplOHEuLezYYzwzbb
 RIes971Vc50J2u2Wf/M2c3PDz3D/4FzfwUeA4LJfTnmOL09RYZ8CsqSckpx4ku/F
 XiBnjwtGEpDXWJ8z13DC7yONrxFGByV19+sqHTBlub5DmIs0gXjhC0dKAPAruUIS
 iCC+Vx6xLgOpTDu8shFsjibbi9Hb6vuZrF2Te+WR5Rf7d80C0J4b5K5PS4daUjr6
 IuD2tz+3CtPjHw==
 =iytv
 -----END PGP SIGNATURE-----

Merge tag 'irq-core-2020-12-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq updates from Thomas Gleixner:
 "Generic interrupt and irqchips subsystem updates. Unusually, there is
  not a single completely new irq chip driver, just new DT bindings and
  extensions of existing drivers to accomodate new variants!

  Core:

   - Consolidation and robustness changes for irq time accounting

   - Cleanup and consolidation of irq stats

   - Remove the fasteoi IPI flow which has been proved useless

   - Provide an interface for converting legacy interrupt mechanism into
     irqdomains

  Drivers:

   - Preliminary support for managed interrupts on platform devices

   - Correctly identify allocation of MSIs proxyied by another device

   - Generalise the Ocelot support to new SoCs

   - Improve GICv4.1 vcpu entry, matching the corresponding KVM
     optimisation

   - Work around spurious interrupts on Qualcomm PDC

   - Random fixes and cleanups"

* tag 'irq-core-2020-12-15' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (54 commits)
  irqchip/qcom-pdc: Fix phantom irq when changing between rising/falling
  driver core: platform: Add devm_platform_get_irqs_affinity()
  ACPI: Drop acpi_dev_irqresource_disabled()
  resource: Add irqresource_disabled()
  genirq/affinity: Add irq_update_affinity_desc()
  irqchip/gic-v3-its: Flag device allocation as proxied if behind a PCI bridge
  irqchip/gic-v3-its: Tag ITS device as shared if allocating for a proxy device
  platform-msi: Track shared domain allocation
  irqchip/ti-sci-intr: Fix freeing of irqs
  irqchip/ti-sci-inta: Fix printing of inta id on probe success
  drivers/irqchip: Remove EZChip NPS interrupt controller
  Revert "genirq: Add fasteoi IPI flow"
  irqchip/hip04: Make IPIs use handle_percpu_devid_irq()
  irqchip/bcm2836: Make IPIs use handle_percpu_devid_irq()
  irqchip/armada-370-xp: Make IPIs use handle_percpu_devid_irq()
  irqchip/gic, gic-v3: Make SGIs use handle_percpu_devid_irq()
  irqchip/ocelot: Add support for Jaguar2 platforms
  irqchip/ocelot: Add support for Serval platforms
  irqchip/ocelot: Add support for Luton platforms
  irqchip/ocelot: prepare to support more SoC
  ...
2020-12-15 15:03:31 -08:00
Linus Torvalds 7240153a9b Driver core updates for 5.11-rc1
Here is the big driver core updates for 5.11-rc1
 
 This time there was a lot of different work happening here for some
 reason:
 	- redo of the fwnode link logic, speeding it up greatly
 	- auxiliary bus added (this was a tag that will be pulled in
 	  from other trees/maintainers this merge window as well, as
 	  driver subsystems started to rely on it)
 	- platform driver core cleanups on the way to fixing some
 	  long-time api updates in future releases
 	- minor fixes and tweaks.
 
 All have been in linux-next with no (finally) reported issues.  Testing
 there did helped in shaking issues out a lot :)
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 
 iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCX9iEUQ8cZ3JlZ0Brcm9h
 aC5jb20ACgkQMUfUDdst+ynBJwCgjBAtVWXquZz4m/pyjn0HoTC7tdYAnAlQIj9s
 vRbPjOgH9R+YRJzFs1Kx
 =X6UP
 -----END PGP SIGNATURE-----

Merge tag 'driver-core-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core

Pull driver core updates from Greg KH:
 "Here is the big driver core updates for 5.11-rc1

  This time there was a lot of different work happening here for some
  reason:

   - redo of the fwnode link logic, speeding it up greatly

   - auxiliary bus added (this was a tag that will be pulled in from
     other trees/maintainers this merge window as well, as driver
     subsystems started to rely on it)

   - platform driver core cleanups on the way to fixing some long-time
     api updates in future releases

   - minor fixes and tweaks.

  All have been in linux-next with no (finally) reported issues. Testing
  there did helped in shaking issues out a lot :)"

* tag 'driver-core-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (39 commits)
  driver core: platform: don't oops in platform_shutdown() on unbound devices
  ACPI: Use fwnode_init() to set up fwnode
  misc: pvpanic: Replace OF headers by mod_devicetable.h
  misc: pvpanic: Combine ACPI and platform drivers
  usb: host: sl811: Switch to use platform_get_mem_or_io()
  vfio: platform: Switch to use platform_get_mem_or_io()
  driver core: platform: Introduce platform_get_mem_or_io()
  dyndbg: fix use before null check
  soc: fix comment for freeing soc_dev_attr
  driver core: platform: use bus_type functions
  driver core: platform: change logic implementing platform_driver_probe
  driver core: platform: reorder functions
  driver core: make driver_probe_device() static
  driver core: Fix a couple of typos
  driver core: Reorder devices on successful probe
  driver core: Delete pointless parameter in fwnode_operations.add_links
  driver core: Refactor fw_devlink feature
  efi: Update implementation of add_links() to create fwnode links
  of: property: Update implementation of add_links() to create fwnode links
  driver core: Use device's fwnode to check if it is waiting for suppliers
  ...
2020-12-15 14:02:26 -08:00
Linus Torvalds 148842c98a Yet another large set of x86 interrupt management updates:
- Simplification and distangling of the MSI related functionality
 
    - Let IO/APIC construct the RTE entries from an MSI message instead of
      having IO/APIC specific code in the interrupt remapping drivers
 
    - Make the retrieval of the parent interrupt domain (vector or remap
      unit) less hardcoded and use the relevant irqdomain callbacks for
      selection.
 
    - Allow the handling of more than 255 CPUs without a virtualized IOMMU
      when the hypervisor supports it. This has made been possible by the
      above modifications and also simplifies the existing workaround in the
      HyperV specific virtual IOMMU.
 
    - Cleanup of the historical timer_works() irq flags related
      inconsistencies.
 -----BEGIN PGP SIGNATURE-----
 
 iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl/Xxd8THHRnbHhAbGlu
 dXRyb25peC5kZQAKCRCmGPVMDXSYoYpOD/9C5TppNlPMUyx2SflH6bxt37pJEpln
 +hYTKsk+jSThntr5mfj+GifGvgmHOVBTGnlDUnUnrpN7TQmLFBzwTOtnBLW53AO2
 16/u0+Xci4LNCtEkaymf0Rq4MfsfriXHPJr0A/CnZ0tpHSf5QKHAiitSiGujdMlb
 gbq43+zXd+jNkH7vkOLPX/7dZVI1hNASQEevJu2tRR4xYTuXFdBxvLgYkHtYKKrK
 R1sbs6nI6yIzye2u4m4xGu29SxgUft+zdUf+UehJKM3yFmf51d9qpkX+kLaTWuaL
 VPsMItbn0kdvxwXQWO6DYnIAAnVKCklyHQJTZCoNq9Fe91OoByak1CEVspSOa1av
 JmycNSch4IYWasR4vVCB1gbb+V9SejcKu5SV3CDrEDqwkOIpfiqpriUXSCJTLlFd
 QOEDOLuuk/79Qs//J/tb/nJ4IuKv8WPudDfIlMro8wUsAr67DjD4mnXprZ+svwWx
 Ct/0/Memk+BSa0cw6pvg24BUZGN6zrufkBu2HKT9GOXRUdNkdLkiPhT8mK4T/O0l
 f90QCLjPSOJ/K/pLEWdUHEPmgC5Q9RsXOmwVGqX+RbjfP7mYTJXlmWnBb+cFNch0
 xFIH3SxVGylxxT06NX3SkvinrHj10CoAlmneefBlLtx6dF+2P84DAMZSF0OFToVI
 c2KMg5zoesI4bg==
 =8Gfs
 -----END PGP SIGNATURE-----

Merge tag 'x86-apic-2020-12-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 apic updates from Thomas Gleixner:
 "Yet another large set of x86 interrupt management updates:

   - Simplification and distangling of the MSI related functionality

   - Let IO/APIC construct the RTE entries from an MSI message instead
     of having IO/APIC specific code in the interrupt remapping drivers

   - Make the retrieval of the parent interrupt domain (vector or remap
     unit) less hardcoded and use the relevant irqdomain callbacks for
     selection.

   - Allow the handling of more than 255 CPUs without a virtualized
     IOMMU when the hypervisor supports it. This has made been possible
     by the above modifications and also simplifies the existing
     workaround in the HyperV specific virtual IOMMU.

   - Cleanup of the historical timer_works() irq flags related
     inconsistencies"

* tag 'x86-apic-2020-12-14' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (42 commits)
  x86/ioapic: Cleanup the timer_works() irqflags mess
  iommu/hyper-v: Remove I/O-APIC ID check from hyperv_irq_remapping_select()
  iommu/amd: Fix IOMMU interrupt generation in X2APIC mode
  iommu/amd: Don't register interrupt remapping irqdomain when IR is disabled
  iommu/amd: Fix union of bitfields in intcapxt support
  x86/ioapic: Correct the PCI/ISA trigger type selection
  x86/ioapic: Use I/O-APIC ID for finding irqdomain, not index
  x86/hyperv: Enable 15-bit APIC ID if the hypervisor supports it
  x86/kvm: Enable 15-bit extension when KVM_FEATURE_MSI_EXT_DEST_ID detected
  iommu/hyper-v: Disable IRQ pseudo-remapping if 15 bit APIC IDs are available
  x86/apic: Support 15 bits of APIC ID in MSI where available
  x86/ioapic: Handle Extended Destination ID field in RTE
  iommu/vt-d: Simplify intel_irq_remapping_select()
  x86: Kill all traces of irq_remapping_get_irq_domain()
  x86/ioapic: Use irq_find_matching_fwspec() to find remapping irqdomain
  x86/hpet: Use irq_find_matching_fwspec() to find remapping irqdomain
  iommu/hyper-v: Implement select() method on remapping irqdomain
  iommu/vt-d: Implement select() method on remapping irqdomain
  iommu/amd: Implement select() method on remapping irqdomain
  x86/apic: Add select() method on vector irqdomain
  ...
2020-12-14 18:59:53 -08:00
Saravana Kannan 01bb86b380 driver core: Add fwnode_init()
There are multiple locations in the kernel where a struct fwnode_handle
is initialized. Add fwnode_init() so that we have one way of
initializing a fwnode_handle.

Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Saravana Kannan <saravanak@google.com>
Link: https://lore.kernel.org/r/20201121020232.908850-8-saravanak@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-12-09 19:10:20 +01:00
Marc Zyngier 4615fbc378 genirq/irqdomain: Don't try to free an interrupt that has no mapping
When an interrupt allocation fails for N interrupts, it is pretty
common for the error handling code to free the same number of interrupts,
no matter how many interrupts have actually been allocated.

This may result in the domain freeing code to be unexpectedly called
for interrupts that have no mapping in that domain. Things end pretty
badly.

Instead, add some checks to irq_domain_free_irqs_hierarchy() to make sure
that thiss does not follow the hierarchy if no mapping exists for a given
interrupt.

Fixes: 6a6544e520 ("genirq/irqdomain: Remove auto-recursive hierarchy support")
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20201129135551.396777-1-maz@kernel.org
2020-11-30 14:50:21 +01:00
Laurent Vivier bb4c6910c8 genirq/irqdomain: Add an irq_create_mapping_affinity() function
There is currently no way to convey the affinity of an interrupt
via irq_create_mapping(), which creates issues for devices that
expect that affinity to be managed by the kernel.

In order to sort this out, rename irq_create_mapping() to
irq_create_mapping_affinity() with an additional affinity parameter that
can be passed down to irq_domain_alloc_descs().

irq_create_mapping() is re-implemented as a wrapper around
irq_create_mapping_affinity().

No functional change.

Fixes: e75eafb9b0 ("genirq/msi: Switch to new irq spreading infrastructure")
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Greg Kurz <groug@kaod.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20201126082852.1178497-2-lvivier@redhat.com
2020-11-30 12:21:31 +01:00
Thomas Gleixner e906a546bd genirq/irqdomain: Make irq_domain_disassociate() static
No users outside of the core code.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/87a6vja7mb.fsf@nanos.tec.linutronix.de
2020-11-15 12:01:11 +01:00
Andy Shevchenko b6e95788fd irqdomain: Introduce irq_domain_create_legacy() API
Introduce irq_domain_create_legacy() API which is functional equivalent
to the existing irq_domain_add_legacy(), but takes a pointer to the struct
fwnode_handle as a parameter.

This is useful for non OF systems.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20201030165919.86234-5-andriy.shevchenko@linux.intel.com
2020-11-07 11:33:46 +01:00
Andy Shevchenko c3a877fea9 irqdomain: Replace open coded of_node_to_fwnode()
of_node_to_fwnode() should be used for conversion.  Replace the open coded
variant of it in of_phandle_args_to_fwspec().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20201030165919.86234-4-andriy.shevchenko@linux.intel.com
2020-11-07 11:33:45 +01:00
David Woodhouse 2cbd5a45e5 genirq/irqdomain: Implement get_name() method on irqchip fwnodes
Prerequisite to make x86 more irqdomain compliant.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201024213535.443185-23-dwmw2@infradead.org
2020-10-28 20:26:27 +01:00
Marc Zyngier 5556797662 genirq/irqdomain: Allow partial trimming of irq_data hierarchy
It appears that some HW is ugly enough that not all the interrupts
connected to a particular interrupt controller end up with the same
hierarchy depth (some of them are terminated early). This leaves
the irqchip hacker with only two choices, both equally bad:

- create discrete domain chains, one for each "hierarchy depth",
  which is very hard to maintain

- create fake hierarchy levels for the shallow paths, leading
  to all kind of problems (what are the safe hwirq values for these
  fake levels?)

Implement the ability to cut short a single interrupt hierarchy
from a level marked as being disconnected by using the new
irq_domain_disconnect_hierarchy() helper.

The irqdomain allocation code will then perform the trimming

Signed-off-by: Marc Zyngier <maz@kernel.org>
2020-10-10 12:12:10 +01:00
John Stultz 8a667928cf irqdomain: Export irq_domain_update_bus_token
Add export for irq_domain_update_bus_token() so that
we can allow drivers like the qcom-pdc driver to be
loadable as a module.

Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Cc: Andy Gross <agross@kernel.org>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Maulik Shah <mkshah@codeaurora.org>
Cc: Lina Iyer <ilina@codeaurora.org>
Cc: Saravana Kannan <saravanak@google.com>
Cc: Todd Kjos <tkjos@google.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-arm-msm@vger.kernel.org
Cc: iommu@lists.linux-foundation.org
Cc: linux-gpio@vger.kernel.org
Link: https://lore.kernel.org/r/20200710231824.60699-2-john.stultz@linaro.org
2020-07-27 08:55:02 +01:00
Zenghui Yu 45e9504f10 genirq/irqdomain: Remove redundant NULL pointer check on fwnode
The is_fwnode_irqchip() helper will check if the fwnode_handle is empty.
There is no need to perform a redundant check outside of it.

Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200716083905.287-1-yuzenghui@huawei.com
2020-07-27 08:55:02 +01:00
Andy Shevchenko 9ed78b05f9 irqdomain: Allow software nodes for IRQ domain creation
In some cases we need to have an IRQ domain created out of software node.

One of such cases is DesignWare GPIO driver when it's instantiated from
half-baked ACPI table (alas, we can't fix it for devices which are few years
on market) and thus using software nodes to quirk this. But the driver
is using IRQ domains based on per GPIO port firmware nodes, which are in
the above case software ones. This brings a warning message to be printed

  [   73.957183] irq: Invalid fwnode type for irqdomain

and creates an anonymous IRQ domain without a debugfs entry.

Allowing software nodes to be valid for IRQ domains rids us of the warning
and debugs gets correctly populated.

  % ls -1 /sys/kernel/debug/irq/domains/
  ...
  intel-quark-dw-apb-gpio:portA

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
[maz: refactored commit message]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200520164927.39090-3-andriy.shevchenko@linux.intel.com
2020-05-21 10:53:17 +01:00