* [patch 00/39] genirq, PCI/MSI: Support for per device MSI and PCI/IMS - Part 1 cleanups
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Hi!
This is a three part series which provides support for per device MSI
interrupt domains. This solves conceptual problems of the current PCI/MSI
design which are in the way of providing support for PCI/MSI[-X] and
the upcoming PCI/IMS mechanism on the same device.
IMS (Interrupt Message Store] is a new specification which allows device
manufactures to provide implementaton defined storage for MSI messages
contrary to the uniform and specification defined storage mechanisms for
PCI/MSI and PCI/MSI-X. IMS not only allows to overcome the size limitions
of the MSI-X table, but also gives the device manufacturer the freedom to
store the message in arbitrary places, even in host memory which is shared
with the device.
There have been several attempts to glue this into the current MSI code,
but after lengthy discussions in various threads:
https://lore.kernel.org/all/20211126230957.239391799@linutronix.de
https://lore.kernel.org/all/MWHPR11MB188603D0D809C1079F5817DC8C099@MWHPR11MB1886.namprd11.prod.outlook.com
https://lore.kernel.org/all/160408357912.912050.17005584526266191420.stgit@djiang5-desk3.ch.intel.com
it turned out that there is a fundamental design problem in the current
PCI/MSI-X implementation. This needs some historical background.
When PCI/MSI[-X] support was added around 2003 interrupt management was
completely different from what we have today in the actively developed
architectures. Interrupt management was completely architecture specific
and while there were attempts to create common infrastructure the
commonalities were rudimental and just providing shared data structures and
interfaces so that drivers could be written in an architecture agnostic
way.
The initial PCI/MSI[-X] support obviously plugged into this model which
resulted in some basic shared infrastructure in the PCI core code for
setting up MSI descriptors, which are a pure software construct for holding
data relevant for a particular MSI interrupt, but the actual association to
Linux interrupts was completely architecture specific. This model is still
supported today to keep museum architectures and notorious stranglers
alive.
In 2013 Intel tried to add support for hotplugable IO/APICs to the kernel
which was creating yet another architecture specific mechanism and resulted
in an unholy mess on top of the existing horrors of x86 interrupt handling.
The x86 interrupt management code was already an uncomprehensible maze of
indirections between the CPU vector management, interrupt remapping and the
actual IO/APIC and PCI/MSI[-X] implementation.
At roughly the same time ARM struggled with the ever growing SoC specific
extensions which were glued on top of the architected GIC interrupt
controller.
This resulted in a fundamental redesign of interrupt management and
provided the today prevailing concept of hierarchical interrupt
domains. This allows to disentangle the interactions between x86 vector
domain and interrupt remapping and also allowed ARM to handle the zoo of
SoC specific interrupt components in a sane way.
The concept of hierarchical interrupt domains aims to encapsulate the
functionality of particual IP blocks which are involved in interrupt
delivery so that they become extensible and pluggable. The X86
encapsulation looks like this:
|--- device 1
[Vector]---[Remapping]---[PCI/MSI]--|...
|--- device N
where the remapping domain is an optional component and in case that it is
not available the PCI/MSI[-X] domains have the vector domain as their
parent. This reduced the required interaction between the domains pretty
much to the initialization phase where it is obviously required to
establish the proper parent relation ship in the components of the
hierarchy.
While in most cases the model is strictly representing the chain of IP
blocks and abstracting them so they can be plugged together to form a
hierarchy, the design stopped short on PCI/MSI[-X]. Looking at the hardware
it's clear that the actual PCI/MSI[-X] interrupt controller is not a global
entity, but strict a per PCI device entity.
Here we took a short cut on the hierarchical model and went for the easy
solution of providing "global" PCI/MSI domains which was possible because
the PCI/MSI[-X] handling is uniform accross the devices. This also allowed
to keep the existing PCI/MSI[-X] infrastructure mostly unchanged which in
turn made it simple to keep the existing architecture specific management
alive.
A similar problem was created in the ARM world with support for IP block
specific message storage. Instead of going all the way to stack a IP block
specific domain on top of the generic MSI domain this ended in a construct
which provides a "global" platform MSI domain which allows overriding the
irq_write_msi_msg() callback per allocation.
In course of the lengthy discussions we identified other abuse of the MSI
infrastructure in wireless drivers, NTB etc. where support for
implementation specific message storage was just mindlessly glued into the
existing infrastructure. Some of this just works by chance on particular
platforms but will fail in hard to diagnose ways when the driver is used
on platforms where the underlying MSI interrupt management code does not
expect the creative abuse.
Another shortcoming of todays PCI/MSI-X support is the inability to
allocate or free individual vectors after the initial enablement of
MSI-X. This results in an works by chance implementation of VFIO (PCI
passthrough) where interrupts on the host side are not set up upfront to
avoid resource exhaustion. They are expanded at runtime when the guest
actually tries to use them. The way how this is implemented is that the
host disables MSI-X and the enables it with a larger number of vectors
again. That works by chance because most device drivers set up all
interrupts before the device actually will utilize them. But that's not
universally true because some drivers allocate a large enough number of
vectors but do not utilize them until it's actually required,
e.g. acceleration support. But at that point other interrupts of the device
might be in active use and the MSI-X disable/enable dance can just result
in losing interrupts and therefore hard to diagnose subtle problems.
Last but not least the "global" PCI/MSI-X domain approach prevents to
utilize PCI/MSI[-X] and PCI/IMS on the same device due to the fact that IMS
is not longer providing a uniform storage and configuration model.
The solution to this is to implement the missing step and switch from
global MSI domains to per device MSI domains. The resulting hierarchy then
looks like this:
|--- [PCI/MSI] device 1
[Vector]---[Remapping]---|...
|--- [PCI/MSI] device N
which in turn allows provide support for multiple domains per device:
|--- [PCI/MSI] device 1
|--- [PCI/IMS] device 1
[Vector]---[Remapping]---|...
|--- [PCI/MSI] device N
|--- [PCI/IMS] device N
To achieve this and to provide solutions for the other identified issues,
e.g. VFIO, this needs a major overhaul of the affected infrastructure.
The 90+ patches series is split into three parts for submission:
1) General cleanups of the core infrastructure and the PCI/MSI code
2) Preparatory changes for per device (multiple) MSI domain support
including a complete replacement of the MSI core interfaces
switching from a domain pointer based to a domain ID based model
and providing support for proper range based allocation/free
3) The actual implementation for per device domains, the conversion of
the PCI/MSI-X infrastructure, dynamic allocation/free for MSI-X,
initial support for PCI/IMS and enablement for X86. Plus a demo
IMS driver for IDXD.
The three parts are available from git:
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git devmsi-v1-part1
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git devmsi-v1-part2
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git devmsi-v1-part3
To complete the picture we went all the way and converted ARM64 including
the platform-MSI horrors over to the new model. It's barely tested in a VM
(at least the PCI/MSI-X) part can be validated that way. For the rest this
just compiles and we can't do much more as we lack hardware. The reason why
this conversion was done is to ensure that the design, the underlying data
structures and the resulting interfaces are correct and can handle the
requirements of ARM64. The result looks pretty good and while the initial
support does not cover some of the oddball issues of the ARM64 zoo, it
turned out that the extra functionality required is just extending the
provided infrastructure but does not require any design changes. This is
also available from git for the adventurous, but be warned that it might
eat your harddisk, confuse your cat and make your kids miss the bus:
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/devel.git devmsi-v1-arm
This is not going to be posted as its work in progress. It's provided for
reference and for Marc to play with.
We did look into NTB and other places like VFIO, but did not come around to
actually convert them over partly because of lack of time, but also because
the code is simply incomprehensible.
We tested the creation of a secondary MSI domain with a mockup driver, but
again due to lack of hardware there is no way to validate any functionality.
The dynamic allocation/free of MSI-X interrupts post MSI-X enable was
tested by hacking up a device driver and allocating only one interrupt at
MSI-X enable time and then allocate the rest with the new interfaces. Also
the dynamic free was tested that way.
Note, that dynamic allocation of MSI-X interrupt requires opt-in of the
underlying MSI parent domain. It is neither supported on the legacy
architecture specific MSI mechanism, which is still in use on ia64, sparc,
PPC and a few subarchitectures of MIPS.
The reason why this cannot be supported unconditionally is that due to the
history of PCI/MSI support in the kernel there are many implementations
which expect that MSI[-X] enable is a one off operation which allocates and
associates all required interrupts right at that point. Even architectures
which utilize hierarchical irq domains have such assumptions which are in
some cases even enforced through the underlying hypervisor/firmware.
IMS is opt-in too and it requires that the architecture/platform has been
converted to the per device MSI model and the underlying interrupt domains
have the necessary support in place, which might never happen for ia64 and
some parts of MIPS, SPARC, PPC and S390.
That means driver writers have to be careful about the limitiations of
this. For dynamic MSI-X allocation/free there is a query interface. For IMS
domains that's momentarily just the domain creation failing with an error
code. If necessary for driver conveniance then implementing a query
interface is trivial enough.
Enough of history and theory. Here comes part 1:
This is just a cleanup and a reorganisation of the PCI/MSI code which
became quite an unreadable mess over time. There is no intentional
functional change in this series.
It's just a separate step to make the subsequent changes in the
infrastructure easier both to implement and to review.
Thanks,
tglx
----
Documentation/PCI/msi-howto.rst | 10
arch/powerpc/platforms/pseries/msi.c | 7
arch/um/drivers/Kconfig | 1
arch/um/include/asm/pci.h | 2
arch/x86/Kconfig | 1
arch/x86/include/asm/irqdomain.h | 4
arch/x86/include/asm/pci.h | 4
arch/x86/kernel/apic/msi.c | 11
arch/x86/kernel/apic/vector.c | 4
drivers/base/Makefile | 2
drivers/base/platform-msi.c | 2
drivers/bus/fsl-mc/Kconfig | 2
drivers/dma/Kconfig | 2
drivers/dma/qcom/hidma.c | 8
drivers/iommu/Kconfig | 2
drivers/iommu/amd/iommu.c | 10
drivers/iommu/intel/irq_remapping.c | 10
drivers/irqchip/Kconfig | 6
drivers/mailbox/Kconfig | 2
drivers/pci/Kconfig | 7
drivers/pci/controller/Kconfig | 30 -
drivers/pci/controller/dwc/Kconfig | 48 -
drivers/pci/controller/mobiveil/Kconfig | 6
drivers/pci/controller/pci-hyperv.c | 15
drivers/pci/msi/Makefile | 3
drivers/pci/msi/api.c | 336 +++++++++++
drivers/pci/msi/irqdomain.c | 91 +--
drivers/pci/msi/msi.c | 949 +++++++++++---------------------
drivers/pci/msi/msi.h | 110 +++
drivers/pci/probe.c | 2
drivers/perf/Kconfig | 2
drivers/soc/ti/Kconfig | 2
include/asm-generic/msi.h | 4
include/linux/device.h | 8
include/linux/gpio/driver.h | 2
include/linux/irqdomain.h | 31 -
include/linux/irqdomain_defs.h | 26
include/linux/msi.h | 85 +-
include/linux/pci.h | 17
kernel/irq/Kconfig | 7
kernel/irq/msi.c | 60 --
41 files changed, 992 insertions(+), 939 deletions(-)
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
lacks a check for already enabled MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 5 +++++
1 file changed, 5 insertions(+)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
if (maxvec < minvec)
return -ERANGE;
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
+ return -EINVAL;
+ }
+
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
lacks a check for already enabled MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 5 +++++
1 file changed, 5 insertions(+)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
if (maxvec < minvec)
return -ERANGE;
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
+ return -EINVAL;
+ }
+
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 15:39 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 15:39 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
nit:
Can the pre-enabled checks for msi and msix be moved up before any vector
range check?
not that it matters for how it fails, does EBUSY sound better?
looks good.
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-16 15:39 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 15:39 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
nit:
Can the pre-enabled checks for msi and msix be moved up before any vector
range check?
not that it matters for how it fails, does EBUSY sound better?
looks good.
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-16 15:39 ` Ashok Raj
@ 2022-11-17 13:07 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 13:07 UTC (permalink / raw)
To: Ashok Raj
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Wed, Nov 16 2022 at 07:39, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
>
> Can the pre-enabled checks for msi and msix be moved up before any vector
> range check?
>
> not that it matters for how it fails, does EBUSY sound better?
Does any caller care about the error code or about the ordering in which
the caller stupity is detected?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-17 13:07 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 13:07 UTC (permalink / raw)
To: Ashok Raj
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 07:39, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
>
> Can the pre-enabled checks for msi and msix be moved up before any vector
> range check?
>
> not that it matters for how it fails, does EBUSY sound better?
Does any caller care about the error code or about the ordering in which
the caller stupity is detected?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-17 13:07 ` Thomas Gleixner
@ 2022-11-17 14:00 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-17 14:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Thu, Nov 17, 2022 at 02:07:33PM +0100, Thomas Gleixner wrote:
> On Wed, Nov 16 2022 at 07:39, Ashok Raj wrote:
> > On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> >
> > Can the pre-enabled checks for msi and msix be moved up before any vector
> > range check?
> >
> > not that it matters for how it fails, does EBUSY sound better?
>
> Does any caller care about the error code or about the ordering in which
> the caller stupity is detected?
No, I don't think so. That's why I prefixed it with "not that it matters" :-)
Just thought it would be good hygiene, but doesn't change anything functionally.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-17 14:00 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-17 14:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Thu, Nov 17, 2022 at 02:07:33PM +0100, Thomas Gleixner wrote:
> On Wed, Nov 16 2022 at 07:39, Ashok Raj wrote:
> > On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> >
> > Can the pre-enabled checks for msi and msix be moved up before any vector
> > range check?
> >
> > not that it matters for how it fails, does EBUSY sound better?
>
> Does any caller care about the error code or about the ordering in which
> the caller stupity is detected?
No, I don't think so. That's why I prefixed it with "not that it matters" :-)
Just thought it would be good hygiene, but doesn't change anything functionally.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:35 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:35 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-16 16:35 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:35 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:43 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-16 17:43 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:15PM +0100, Thomas Gleixner wrote:
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
` (3 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, Bjorn Helgaas, x86,
linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: fe97f59a78fefda6c4a8c8ee6a070b1f769fc801
Gitweb: https://git.kernel.org/tip/fe97f59a78fefda6c4a8c8ee6a070b1f769fc801
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:15 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
PCI/MSI: Check for MSI enabled in __pci_msix_enable()
PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
lacks a check for already enabled MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122013.653556720@linutronix.de
---
drivers/pci/msi/msi.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index fdd2ec0..160af9f 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
if (maxvec < minvec)
return -ERANGE;
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
+ return -EINVAL;
+ }
+
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* RE: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-18 7:35 ` Tian, Kevin
-1 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:35 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Jiang, Dave, Alex Williamson, Williams, Dan J,
Logan Gunthorpe, Raj, Ashok, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Chatre, Reinette
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:54 PM
>
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
a same check remains in __pci_enable_msix():
/* Check whether driver already requested for MSI IRQ */
if (dev->msi_enabled) {
pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
return -EINVAL;
}
return msix_capability_init(dev, entries, nvec, affd);
It's removed later in patch33 when sanitizing MSI-X checks. But logically
the removal can come with this patch.
^ permalink raw reply [flat|nested] 283+ messages in thread
* RE: [patch 01/39] PCI/MSI: Check for MSI enabled in __pci_msix_enable()
@ 2022-11-18 7:35 ` Tian, Kevin
0 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:35 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: Logan Gunthorpe, Allen Hubbe, Lorenzo Pieralisi, Jiang, Dave,
Raj, Ashok, Greg Kroah-Hartman, linux-pci, Joerg Roedel, x86,
linuxppc-dev, Chatre, Reinette, Alex Williamson, Jason Gunthorpe,
Marc Zyngier, Bjorn Helgaas, Williams, Dan J, Jon Mason,
Will Deacon, Ahmed S. Darwish
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:54 PM
>
> PCI/MSI and PCI/MSI-X are mutually exclusive, but the MSI-X enable code
> lacks a check for already enabled MSI.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -935,6 +935,11 @@ static int __pci_enable_msix_range(struc
> if (maxvec < minvec)
> return -ERANGE;
>
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> + return -EINVAL;
> + }
> +
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
a same check remains in __pci_enable_msix():
/* Check whether driver already requested for MSI IRQ */
if (dev->msi_enabled) {
pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
return -EINVAL;
}
return msix_capability_init(dev, entries, nvec, affd);
It's removed later in patch33 when sanitizing MSI-X checks. But logically
the removal can come with this patch.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
PCI/Multi-MSI is MSI specific and not supported for MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/iommu/intel/irq_remapping.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
if (!info || !iommu)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
PCI/Multi-MSI is MSI specific and not supported for MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/iommu/intel/irq_remapping.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
if (!info || !iommu)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 15:52 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 15:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/iommu/intel/irq_remapping.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> --- a/drivers/iommu/intel/irq_remapping.c
> +++ b/drivers/iommu/intel/irq_remapping.c
> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
>
> if (!info || !iommu)
> return -EINVAL;
> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> return -EINVAL;
>
> /*
>
This check is only making sure that when multi-msi is requested that the
type has to be either MSI/MSIX.
Wouldn't this change return -EINVAL when type = MSIX?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
@ 2022-11-16 15:52 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 15:52 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/iommu/intel/irq_remapping.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> --- a/drivers/iommu/intel/irq_remapping.c
> +++ b/drivers/iommu/intel/irq_remapping.c
> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
>
> if (!info || !iommu)
> return -EINVAL;
> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> return -EINVAL;
>
> /*
>
This check is only making sure that when multi-msi is requested that the
type has to be either MSI/MSIX.
Wouldn't this change return -EINVAL when type = MSIX?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
2022-11-16 15:52 ` Ashok Raj
@ 2022-11-16 17:02 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:02 UTC (permalink / raw)
To: Ashok Raj
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Wed, Nov 16 2022 at 07:52, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
>> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>> drivers/iommu/intel/irq_remapping.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> --- a/drivers/iommu/intel/irq_remapping.c
>> +++ b/drivers/iommu/intel/irq_remapping.c
>> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
>>
>> if (!info || !iommu)
>> return -EINVAL;
>> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
>> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
>> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
>> return -EINVAL;
>>
>> /*
>>
>
> This check is only making sure that when multi-msi is requested that the
> type has to be either MSI/MSIX.
MSI-X does not support multi vector allocations on a single entry.
> Wouldn't this change return -EINVAL when type = MSIX?
Rightfully so. MSIX vectors are allocated one by one. Has been that way
forever.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
@ 2022-11-16 17:02 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:02 UTC (permalink / raw)
To: Ashok Raj
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 07:52, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
>> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>> drivers/iommu/intel/irq_remapping.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> --- a/drivers/iommu/intel/irq_remapping.c
>> +++ b/drivers/iommu/intel/irq_remapping.c
>> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
>>
>> if (!info || !iommu)
>> return -EINVAL;
>> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
>> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
>> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
>> return -EINVAL;
>>
>> /*
>>
>
> This check is only making sure that when multi-msi is requested that the
> type has to be either MSI/MSIX.
MSI-X does not support multi vector allocations on a single entry.
> Wouldn't this change return -EINVAL when type = MSIX?
Rightfully so. MSIX vectors are allocated one by one. Has been that way
forever.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
2022-11-16 17:02 ` Thomas Gleixner
@ 2022-11-16 17:39 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 17:39 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Wed, Nov 16, 2022 at 06:02:30PM +0100, Thomas Gleixner wrote:
> On Wed, Nov 16 2022 at 07:52, Ashok Raj wrote:
> > On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
> >> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
> >>
> >> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> >> ---
> >> drivers/iommu/intel/irq_remapping.c | 3 +--
> >> 1 file changed, 1 insertion(+), 2 deletions(-)
> >>
> >> --- a/drivers/iommu/intel/irq_remapping.c
> >> +++ b/drivers/iommu/intel/irq_remapping.c
> >> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
> >>
> >> if (!info || !iommu)
> >> return -EINVAL;
> >> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> >> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> >> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> >> return -EINVAL;
> >>
> >> /*
> >>
> >
> > This check is only making sure that when multi-msi is requested that the
> > type has to be either MSI/MSIX.
>
> MSI-X does not support multi vector allocations on a single entry.
>
> > Wouldn't this change return -EINVAL when type = MSIX?
>
> Rightfully so. MSIX vectors are allocated one by one. Has been that way
> forever.
>
I thought why block multi-vector allocation on MSIX, but if there is no
use case makes perfect sense.
Thanks for the clarification.
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 02/39] iommu/vt-d: Remove bogus check for multi MSI-X
@ 2022-11-16 17:39 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 17:39 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16, 2022 at 06:02:30PM +0100, Thomas Gleixner wrote:
> On Wed, Nov 16 2022 at 07:52, Ashok Raj wrote:
> > On Fri, Nov 11, 2022 at 02:54:17PM +0100, Thomas Gleixner wrote:
> >> PCI/Multi-MSI is MSI specific and not supported for MSI-X.
> >>
> >> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> >> ---
> >> drivers/iommu/intel/irq_remapping.c | 3 +--
> >> 1 file changed, 1 insertion(+), 2 deletions(-)
> >>
> >> --- a/drivers/iommu/intel/irq_remapping.c
> >> +++ b/drivers/iommu/intel/irq_remapping.c
> >> @@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(str
> >>
> >> if (!info || !iommu)
> >> return -EINVAL;
> >> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> >> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> >> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> >> return -EINVAL;
> >>
> >> /*
> >>
> >
> > This check is only making sure that when multi-msi is requested that the
> > type has to be either MSI/MSIX.
>
> MSI-X does not support multi vector allocations on a single entry.
>
> > Wouldn't this change return -EINVAL when type = MSIX?
>
> Rightfully so. MSIX vectors are allocated one by one. Has been that way
> forever.
>
I thought why block multi-vector allocation on MSIX, but if there is no
use case makes perfect sense.
Thanks for the clarification.
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] iommu/vt-d: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Thomas Gleixner, Ashok Raj, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 527f378c42eaac0b48a8c6ff16da99a6177ff9e3
Gitweb: https://git.kernel.org/tip/527f378c42eaac0b48a8c6ff16da99a6177ff9e3
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:17 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
iommu/vt-d: Remove bogus check for multi MSI-X
PCI/Multi-MSI is MSI specific and not supported for MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
Link: https://lore.kernel.org/r/20221111122013.713848846@linutronix.de
---
drivers/iommu/intel/irq_remapping.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/iommu/intel/irq_remapping.c b/drivers/iommu/intel/irq_remapping.c
index 5962bb5..0b80a27 100644
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1334,8 +1334,7 @@ static int intel_irq_remapping_alloc(struct irq_domain *domain,
if (!info || !iommu)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
PCI/Multi-MSI is MSI specific and not supported for MSI-X
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/iommu/amd/iommu.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
if (!info)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
PCI/Multi-MSI is MSI specific and not supported for MSI-X
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/iommu/amd/iommu.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
if (!info)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:02 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 16:02 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Fri, Nov 11, 2022 at 02:54:19PM +0100, Thomas Gleixner wrote:
> PCI/Multi-MSI is MSI specific and not supported for MSI-X
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/iommu/amd/iommu.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> --- a/drivers/iommu/amd/iommu.c
> +++ b/drivers/iommu/amd/iommu.c
> @@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
>
> if (!info)
> return -EINVAL;
> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> return -EINVAL;
>
> /*
>
nit:
maybe better to merge patch2/3 since both seem related?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
@ 2022-11-16 16:02 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 16:02 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:19PM +0100, Thomas Gleixner wrote:
> PCI/Multi-MSI is MSI specific and not supported for MSI-X
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/iommu/amd/iommu.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> --- a/drivers/iommu/amd/iommu.c
> +++ b/drivers/iommu/amd/iommu.c
> @@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
>
> if (!info)
> return -EINVAL;
> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
> return -EINVAL;
>
> /*
>
nit:
maybe better to merge patch2/3 since both seem related?
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
2022-11-16 16:02 ` Ashok Raj
@ 2022-11-16 17:03 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:03 UTC (permalink / raw)
To: Ashok Raj
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Wed, Nov 16 2022 at 08:02, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:19PM +0100, Thomas Gleixner wrote:
>> PCI/Multi-MSI is MSI specific and not supported for MSI-X
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>> drivers/iommu/amd/iommu.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> --- a/drivers/iommu/amd/iommu.c
>> +++ b/drivers/iommu/amd/iommu.c
>> @@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
>>
>> if (!info)
>> return -EINVAL;
>> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
>> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
>> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
>> return -EINVAL;
>>
>> /*
>>
>
> nit:
>
> maybe better to merge patch2/3 since both seem related?
What's better about it? It's two different drivers.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 03/39] iommu/amd: Remove bogus check for multi MSI-X
@ 2022-11-16 17:03 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:03 UTC (permalink / raw)
To: Ashok Raj
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 08:02, Ashok Raj wrote:
> On Fri, Nov 11, 2022 at 02:54:19PM +0100, Thomas Gleixner wrote:
>> PCI/Multi-MSI is MSI specific and not supported for MSI-X
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>> ---
>> drivers/iommu/amd/iommu.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> --- a/drivers/iommu/amd/iommu.c
>> +++ b/drivers/iommu/amd/iommu.c
>> @@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct ir
>>
>> if (!info)
>> return -EINVAL;
>> - if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
>> - info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
>> + if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
>> return -EINVAL;
>>
>> /*
>>
>
> nit:
>
> maybe better to merge patch2/3 since both seem related?
What's better about it? It's two different drivers.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] iommu/amd: Remove bogus check for multi MSI-X
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Thomas Gleixner, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 1c82f0d3fcdcb509a7ba1a2c8f58890155750b00
Gitweb: https://git.kernel.org/tip/1c82f0d3fcdcb509a7ba1a2c8f58890155750b00
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:19 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
iommu/amd: Remove bogus check for multi MSI-X
PCI/Multi-MSI is MSI specific and not supported for MSI-X
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20221111122013.772447165@linutronix.de
---
drivers/iommu/amd/iommu.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index d3b39d0..8ece864 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3294,8 +3294,7 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq,
if (!info)
return -EINVAL;
- if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI &&
- info->type != X86_IRQ_ALLOC_TYPE_PCI_MSIX)
+ if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
/*
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
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>
---
kernel/irq/msi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
+ msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
return ret;
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
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>
---
kernel/irq/msi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
+ msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
return ret;
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:12 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 16:12 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Fri, Nov 11, 2022 at 02:54:20PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> kernel/irq/msi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
> fail_mem:
> ret = -ENOMEM;
> fail:
> - msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
> + msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
> return ret;
> }
>
>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
@ 2022-11-16 16:12 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 16:12 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:20PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> kernel/irq/msi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
> fail_mem:
> ret = -ENOMEM;
> fail:
> - msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
> + msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
> return ret;
> }
>
>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:43 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:20PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> kernel/irq/msi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 04/39] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
@ 2022-11-16 17:43 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:20PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> kernel/irq/msi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Use MSI_DESC_ALL in msi_add_simple_msi_descs()
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: befd780253e774ea9388dd8dfad7c627a0aa7e02
Gitweb: https://git.kernel.org/tip/befd780253e774ea9388dd8dfad7c627a0aa7e02
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:20 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
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
---
kernel/irq/msi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index a9ee535..bba6359 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(struct device *dev, unsigned int index, unsi
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_NOTASSOCIATED, index, last);
+ msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
return ret;
}
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
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>
---
drivers/base/platform-msi.c | 2 +-
include/linux/msi.h | 5 ++---
kernel/irq/msi.c | 19 ++++++++++---------
3 files changed, 13 insertions(+), 13 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -325,7 +325,7 @@ void platform_msi_device_domain_free(str
msi_lock_descs(data->dev);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
- msi_free_msi_descs_range(data->dev, MSI_DESC_ALL, virq, virq + nr_irqs - 1);
+ msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -247,8 +247,7 @@ static inline void pci_write_msi_msg(uns
#endif /* CONFIG_PCI_MSI */
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index);
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
/**
* msi_free_msi_descs - Free MSI descriptors of a device
@@ -256,7 +255,7 @@ void msi_free_msi_descs_range(struct dev
*/
static inline void msi_free_msi_descs(struct device *dev)
{
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, 0, MSI_MAX_INDEX);
+ msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
+ msi_free_msi_descs_range(dev, index, last);
return ret;
}
@@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_de
/**
* msi_free_msi_descs_range - Free MSI descriptors of a device
* @dev: Device to free the descriptors
- * @filter: Descriptor state filter
* @first_index: Index to start freeing from
* @last_index: Last index to be freed
*/
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index)
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index,
+ unsigned int last_index)
{
struct xarray *xa = &dev->msi.data->__store;
struct msi_desc *desc;
@@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct dev
lockdep_assert_held(&dev->msi.data->mutex);
xa_for_each_range(xa, idx, desc, first_index, last_index) {
- if (msi_desc_match(desc, filter)) {
- xa_erase(xa, idx);
- msi_free_desc(desc);
- }
+ xa_erase(xa, idx);
+
+ /* Leak the descriptor when it is still referenced */
+ if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
+ continue;
+ msi_free_desc(desc);
}
}
@@ -739,7 +740,7 @@ int msi_domain_populate_irqs(struct irq_
fail:
for (--virq; virq >= virq_base; virq--)
irq_domain_free_irqs_common(domain, virq, 1);
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, virq_base, virq_base + nvec - 1);
+ msi_free_msi_descs_range(dev, virq_base, virq_base + nvec - 1);
unlock:
msi_unlock_descs(dev);
return ret;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
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>
---
drivers/base/platform-msi.c | 2 +-
include/linux/msi.h | 5 ++---
kernel/irq/msi.c | 19 ++++++++++---------
3 files changed, 13 insertions(+), 13 deletions(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -325,7 +325,7 @@ void platform_msi_device_domain_free(str
msi_lock_descs(data->dev);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
- msi_free_msi_descs_range(data->dev, MSI_DESC_ALL, virq, virq + nr_irqs - 1);
+ msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -247,8 +247,7 @@ static inline void pci_write_msi_msg(uns
#endif /* CONFIG_PCI_MSI */
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index);
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
/**
* msi_free_msi_descs - Free MSI descriptors of a device
@@ -256,7 +255,7 @@ void msi_free_msi_descs_range(struct dev
*/
static inline void msi_free_msi_descs(struct device *dev)
{
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, 0, MSI_MAX_INDEX);
+ msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
+ msi_free_msi_descs_range(dev, index, last);
return ret;
}
@@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_de
/**
* msi_free_msi_descs_range - Free MSI descriptors of a device
* @dev: Device to free the descriptors
- * @filter: Descriptor state filter
* @first_index: Index to start freeing from
* @last_index: Last index to be freed
*/
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index)
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index,
+ unsigned int last_index)
{
struct xarray *xa = &dev->msi.data->__store;
struct msi_desc *desc;
@@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct dev
lockdep_assert_held(&dev->msi.data->mutex);
xa_for_each_range(xa, idx, desc, first_index, last_index) {
- if (msi_desc_match(desc, filter)) {
- xa_erase(xa, idx);
- msi_free_desc(desc);
- }
+ xa_erase(xa, idx);
+
+ /* Leak the descriptor when it is still referenced */
+ if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
+ continue;
+ msi_free_desc(desc);
}
}
@@ -739,7 +740,7 @@ int msi_domain_populate_irqs(struct irq_
fail:
for (--virq; virq >= virq_base; virq--)
irq_domain_free_irqs_common(domain, virq, 1);
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, virq_base, virq_base + nvec - 1);
+ msi_free_msi_descs_range(dev, virq_base, virq_base + nvec - 1);
unlock:
msi_unlock_descs(dev);
return ret;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:43 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:22PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> drivers/base/platform-msi.c | 2 +-
> include/linux/msi.h | 5 ++---
> kernel/irq/msi.c | 19 ++++++++++---------
> 3 files changed, 13 insertions(+), 13 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
@ 2022-11-16 17:43 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:22PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> drivers/base/platform-msi.c | 2 +-
> include/linux/msi.h | 5 ++---
> kernel/irq/msi.c | 19 ++++++++++---------
> 3 files changed, 13 insertions(+), 13 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Remove filter from msi_free_descs_free_range()
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 2f2940d168236a92df524a1bd99fc7b0325918b5
Gitweb: https://git.kernel.org/tip/2f2940d168236a92df524a1bd99fc7b0325918b5
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:22 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
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
---
drivers/base/platform-msi.c | 2 +-
include/linux/msi.h | 5 ++---
kernel/irq/msi.c | 19 ++++++++++---------
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/drivers/base/platform-msi.c b/drivers/base/platform-msi.c
index 12b0441..dddafa1 100644
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -325,7 +325,7 @@ void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int vir
msi_lock_descs(data->dev);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
- msi_free_msi_descs_range(data->dev, MSI_DESC_ALL, virq, virq + nr_irqs - 1);
+ msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
}
diff --git a/include/linux/msi.h b/include/linux/msi.h
index fc918a6..969ce46 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -247,8 +247,7 @@ static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
#endif /* CONFIG_PCI_MSI */
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index);
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
/**
* msi_free_msi_descs - Free MSI descriptors of a device
@@ -256,7 +255,7 @@ void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
*/
static inline void msi_free_msi_descs(struct device *dev)
{
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, 0, MSI_MAX_INDEX);
+ msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index bba6359..1ca4846 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(struct device *dev, unsigned int index, unsi
fail_mem:
ret = -ENOMEM;
fail:
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
+ msi_free_msi_descs_range(dev, index, last);
return ret;
}
@@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_desc *desc, enum msi_desc_filter filter)
/**
* msi_free_msi_descs_range - Free MSI descriptors of a device
* @dev: Device to free the descriptors
- * @filter: Descriptor state filter
* @first_index: Index to start freeing from
* @last_index: Last index to be freed
*/
-void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
- unsigned int first_index, unsigned int last_index)
+void msi_free_msi_descs_range(struct device *dev, unsigned int first_index,
+ unsigned int last_index)
{
struct xarray *xa = &dev->msi.data->__store;
struct msi_desc *desc;
@@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
lockdep_assert_held(&dev->msi.data->mutex);
xa_for_each_range(xa, idx, desc, first_index, last_index) {
- if (msi_desc_match(desc, filter)) {
- xa_erase(xa, idx);
- msi_free_desc(desc);
- }
+ xa_erase(xa, idx);
+
+ /* Leak the descriptor when it is still referenced */
+ if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
+ continue;
+ msi_free_desc(desc);
}
}
@@ -739,7 +740,7 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
fail:
for (--virq; virq >= virq_base; virq--)
irq_domain_free_irqs_common(domain, virq, 1);
- msi_free_msi_descs_range(dev, MSI_DESC_ALL, virq_base, virq_base + nvec - 1);
+ msi_free_msi_descs_range(dev, virq_base, virq_base + nvec - 1);
unlock:
msi_unlock_descs(dev);
return ret;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
2022-11-11 13:54 ` Thomas Gleixner
@ 2023-03-01 10:55 ` Miquel Raynal
-1 siblings, 0 replies; 283+ messages in thread
From: Miquel Raynal @ 2023-03-01 10:55 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Thomas Petazzoni
Hi Thomas,
tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
> 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>
> ---
[...]
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
> fail_mem:
> ret = -ENOMEM;
> fail:
> - msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
> + msi_free_msi_descs_range(dev, index, last);
> return ret;
> }
>
> @@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_de
> /**
> * msi_free_msi_descs_range - Free MSI descriptors of a device
> * @dev: Device to free the descriptors
> - * @filter: Descriptor state filter
> * @first_index: Index to start freeing from
> * @last_index: Last index to be freed
> */
> -void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
> - unsigned int first_index, unsigned int last_index)
> +void msi_free_msi_descs_range(struct device *dev, unsigned int first_index,
> + unsigned int last_index)
> {
> struct xarray *xa = &dev->msi.data->__store;
> struct msi_desc *desc;
> @@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct dev
> lockdep_assert_held(&dev->msi.data->mutex);
>
> xa_for_each_range(xa, idx, desc, first_index, last_index) {
> - if (msi_desc_match(desc, filter)) {
> - xa_erase(xa, idx);
> - msi_free_desc(desc);
> - }
> + xa_erase(xa, idx);
> +
> + /* Leak the descriptor when it is still referenced */
> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
> + continue;
> + msi_free_desc(desc);
> }
> }
It looks like since this commit I am getting warnings upon EPROBE_DEFER
errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
internals to understand why this warning was shown, and it seems that
nothing "de-references" the descriptors, which would mean here:
resetting desc->irq to 0.
In my case I don't think the mvpp2_main.c driver nor the
irq_mvebu_icu.c driver behind do anything strange (as far as I
understand them). I believe any error during a ->probe() leading
to an irq_dispose_mapping() call with MSI behind will trigger that
warning.
I am wondering how useful thisd WARN_ON() is, or otherwise where the
desc->irq entry should be zeroed (if I understand that correctly), any
help will be appreciated.
Here is the splat:
[ 2.045857] ------------[ cut here ]------------
[ 2.050497] WARNING: CPU: 2 PID: 9 at kernel/irq/msi.c:197 msi_domain_free_descs+0x120/0x128
[ 2.058993] Modules linked in:
[ 2.062068] CPU: 2 PID: 9 Comm: kworker/u8:0 Not tainted 6.2.0-rc1+ #168
[ 2.068804] Hardware name: Delta TN48M (DT)
[ 2.073008] Workqueue: events_unbound deferred_probe_work_func
[ 2.078878] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 2.085875] pc : msi_domain_free_descs+0x120/0x128
[ 2.090693] lr : msi_domain_free_descs+0xe0/0x128
[ 2.095423] sp : ffff80000a82b8d0
[ 2.098745] x29: ffff80000a82b8d0 x28: 00007bfdbb508ca8 x27: ffff000102e28940
[ 2.105921] x26: 0000000000000004 x25: ffff000100257660 x24: ffff800009a6b8d8
[ 2.113096] x23: ffff800008a1c868 x22: ffff000102e4b700 x21: ffff000101494bb0
[ 2.120270] x20: ffff80000a82b958 x19: ffff800009afe248 x18: 0000000000000010
[ 2.127444] x17: fffffc0000fa4008 x16: 0000000000000008 x15: 000000000000013a
[ 2.134618] x14: ffff80000a82b6a0 x13: 00000000ffffffea x12: ffff80000a82b870
[ 2.141794] x11: 0000000000000002 x10: 0000000000000000 x9 : 0000000000000001
[ 2.148967] x8 : 0000000000000000 x7 : 0000000000000238 x6 : ffff0001005f1230
[ 2.156141] x5 : 0000000000000000 x4 : 0000200000000000 x3 : 0000000000000000
[ 2.163315] x2 : b586accf01c45400 x1 : ffff0001000e0000 x0 : 000000000000002d
[ 2.170489] Call trace:
[ 2.172948] msi_domain_free_descs+0x120/0x128
[ 2.177417] msi_domain_free_msi_descs_range+0x64/0x9c
[ 2.182586] platform_msi_device_domain_free+0x88/0xb8
[ 2.187752] mvebu_icu_irq_domain_free+0x60/0x80
[ 2.192396] irq_domain_free_irqs_hierarchy.part.21+0x94/0xa8
[ 2.198173] irq_domain_free_irqs+0xec/0x150
[ 2.202466] irq_dispose_mapping+0x104/0x120
[ 2.206758] mvpp2_probe+0x2028/0x21f8
[ 2.210530] platform_probe+0x68/0xd8
[ 2.214210] really_probe+0xbc/0x2a8
[ 2.217807] __driver_probe_device+0x78/0xe0
[ 2.222102] driver_probe_device+0x3c/0x108
[ 2.226308] __device_attach_driver+0xb8/0xf8
[ 2.230690] bus_for_each_drv+0x7c/0xd0
[ 2.234547] __device_attach+0xec/0x188
[ 2.238404] device_initial_probe+0x14/0x20
[ 2.242611] bus_probe_device+0x9c/0xa8
[ 2.246468] deferred_probe_work_func+0x88/0xc0
[ 2.251024] process_one_work+0x1fc/0x348
[ 2.255056] worker_thread+0x228/0x420
[ 2.258825] kthread+0x10c/0x118
[ 2.262075] ret_from_fork+0x10/0x20
[ 2.265672] ---[ end trace 0000000000000000 ]---
Thanks,
Miquèl
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
@ 2023-03-01 10:55 ` Miquel Raynal
0 siblings, 0 replies; 283+ messages in thread
From: Miquel Raynal @ 2023-03-01 10:55 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Thomas Petazzoni, Will Deacon, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Jason Gunthorpe,
Allen Hubbe, Kevin Tian, Ahmed S. Darwish, Jon Mason,
linuxppc-dev, Alex Williamson, Bjorn Helgaas, Dan Williams,
Reinette Chatre, Greg Kroah-Hartman, LKML, Marc Zyngier,
Logan Gunthorpe
Hi Thomas,
tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
> 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>
> ---
[...]
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(stru
> fail_mem:
> ret = -ENOMEM;
> fail:
> - msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
> + msi_free_msi_descs_range(dev, index, last);
> return ret;
> }
>
> @@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_de
> /**
> * msi_free_msi_descs_range - Free MSI descriptors of a device
> * @dev: Device to free the descriptors
> - * @filter: Descriptor state filter
> * @first_index: Index to start freeing from
> * @last_index: Last index to be freed
> */
> -void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
> - unsigned int first_index, unsigned int last_index)
> +void msi_free_msi_descs_range(struct device *dev, unsigned int first_index,
> + unsigned int last_index)
> {
> struct xarray *xa = &dev->msi.data->__store;
> struct msi_desc *desc;
> @@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct dev
> lockdep_assert_held(&dev->msi.data->mutex);
>
> xa_for_each_range(xa, idx, desc, first_index, last_index) {
> - if (msi_desc_match(desc, filter)) {
> - xa_erase(xa, idx);
> - msi_free_desc(desc);
> - }
> + xa_erase(xa, idx);
> +
> + /* Leak the descriptor when it is still referenced */
> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
> + continue;
> + msi_free_desc(desc);
> }
> }
It looks like since this commit I am getting warnings upon EPROBE_DEFER
errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
internals to understand why this warning was shown, and it seems that
nothing "de-references" the descriptors, which would mean here:
resetting desc->irq to 0.
In my case I don't think the mvpp2_main.c driver nor the
irq_mvebu_icu.c driver behind do anything strange (as far as I
understand them). I believe any error during a ->probe() leading
to an irq_dispose_mapping() call with MSI behind will trigger that
warning.
I am wondering how useful thisd WARN_ON() is, or otherwise where the
desc->irq entry should be zeroed (if I understand that correctly), any
help will be appreciated.
Here is the splat:
[ 2.045857] ------------[ cut here ]------------
[ 2.050497] WARNING: CPU: 2 PID: 9 at kernel/irq/msi.c:197 msi_domain_free_descs+0x120/0x128
[ 2.058993] Modules linked in:
[ 2.062068] CPU: 2 PID: 9 Comm: kworker/u8:0 Not tainted 6.2.0-rc1+ #168
[ 2.068804] Hardware name: Delta TN48M (DT)
[ 2.073008] Workqueue: events_unbound deferred_probe_work_func
[ 2.078878] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 2.085875] pc : msi_domain_free_descs+0x120/0x128
[ 2.090693] lr : msi_domain_free_descs+0xe0/0x128
[ 2.095423] sp : ffff80000a82b8d0
[ 2.098745] x29: ffff80000a82b8d0 x28: 00007bfdbb508ca8 x27: ffff000102e28940
[ 2.105921] x26: 0000000000000004 x25: ffff000100257660 x24: ffff800009a6b8d8
[ 2.113096] x23: ffff800008a1c868 x22: ffff000102e4b700 x21: ffff000101494bb0
[ 2.120270] x20: ffff80000a82b958 x19: ffff800009afe248 x18: 0000000000000010
[ 2.127444] x17: fffffc0000fa4008 x16: 0000000000000008 x15: 000000000000013a
[ 2.134618] x14: ffff80000a82b6a0 x13: 00000000ffffffea x12: ffff80000a82b870
[ 2.141794] x11: 0000000000000002 x10: 0000000000000000 x9 : 0000000000000001
[ 2.148967] x8 : 0000000000000000 x7 : 0000000000000238 x6 : ffff0001005f1230
[ 2.156141] x5 : 0000000000000000 x4 : 0000200000000000 x3 : 0000000000000000
[ 2.163315] x2 : b586accf01c45400 x1 : ffff0001000e0000 x0 : 000000000000002d
[ 2.170489] Call trace:
[ 2.172948] msi_domain_free_descs+0x120/0x128
[ 2.177417] msi_domain_free_msi_descs_range+0x64/0x9c
[ 2.182586] platform_msi_device_domain_free+0x88/0xb8
[ 2.187752] mvebu_icu_irq_domain_free+0x60/0x80
[ 2.192396] irq_domain_free_irqs_hierarchy.part.21+0x94/0xa8
[ 2.198173] irq_domain_free_irqs+0xec/0x150
[ 2.202466] irq_dispose_mapping+0x104/0x120
[ 2.206758] mvpp2_probe+0x2028/0x21f8
[ 2.210530] platform_probe+0x68/0xd8
[ 2.214210] really_probe+0xbc/0x2a8
[ 2.217807] __driver_probe_device+0x78/0xe0
[ 2.222102] driver_probe_device+0x3c/0x108
[ 2.226308] __device_attach_driver+0xb8/0xf8
[ 2.230690] bus_for_each_drv+0x7c/0xd0
[ 2.234547] __device_attach+0xec/0x188
[ 2.238404] device_initial_probe+0x14/0x20
[ 2.242611] bus_probe_device+0x9c/0xa8
[ 2.246468] deferred_probe_work_func+0x88/0xc0
[ 2.251024] process_one_work+0x1fc/0x348
[ 2.255056] worker_thread+0x228/0x420
[ 2.258825] kthread+0x10c/0x118
[ 2.262075] ret_from_fork+0x10/0x20
[ 2.265672] ---[ end trace 0000000000000000 ]---
Thanks,
Miquèl
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
2023-03-01 10:55 ` Miquel Raynal
@ 2023-03-01 21:07 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2023-03-01 21:07 UTC (permalink / raw)
To: Miquel Raynal
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Thomas Petazzoni
Miquel!
On Wed, Mar 01 2023 at 11:55, Miquel Raynal wrote:
> tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
>
>> 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.
>> + /* Leak the descriptor when it is still referenced */
>> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
>> + continue;
>> + msi_free_desc(desc);
>> }
>> }
>
> It looks like since this commit I am getting warnings upon EPROBE_DEFER
> errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
> internals to understand why this warning was shown, and it seems that
> nothing "de-references" the descriptors, which would mean here:
> resetting desc->irq to 0.
Correct. This platform-msi ^(*&!@&^ hack really needs to die ASAP.
Marc, where are we on that? Is this still in limbo?
> I am wondering how useful thisd WARN_ON() is, or otherwise where the
It is useful as it caught bugs already.
> desc->irq entry should be zeroed (if I understand that correctly), any
> help will be appreciated.
Untested workaround below. I hate it with a passion, but *shrug*.
Thanks,
tglx
---
drivers/base/platform-msi.c | 1 +
include/linux/msi.h | 2 ++
kernel/irq/msi.c | 23 ++++++++++++++++++++++-
3 files changed, 25 insertions(+), 1 deletion(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -324,6 +324,7 @@ void platform_msi_device_domain_free(str
struct platform_msi_priv_data *data = domain->host_data;
msi_lock_descs(data->dev);
+ msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -631,6 +631,8 @@ int msi_domain_prepare_irqs(struct irq_d
int nvec, msi_alloc_info_t *args);
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
int virq, int nvec, msi_alloc_info_t *args);
+void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
+
struct irq_domain *
__platform_msi_create_device_domain(struct device *dev,
unsigned int nvec,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_
return 0;
fail:
- for (--virq; virq >= virq_base; virq--)
+ for (--virq; virq >= virq_base; virq--) {
+ msi_domain_depopulate_descs(dev, virq, 1);
irq_domain_free_irqs_common(domain, virq, 1);
+ }
msi_domain_free_descs(dev, &ctrl);
unlock:
msi_unlock_descs(dev);
return ret;
}
+void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
+{
+ struct msi_ctrl ctrl = {
+ .domid = MSI_DEFAULT_DOMAIN,
+ .first = virq_base,
+ .last = virq_base + nvec - 1,
+ };
+ struct msi_desc *desc;
+ struct xarray *xa;
+ unsigned long idx;
+
+ if (!msi_ctrl_valid(dev, &ctrl))
+ return;
+
+ xa = &dev->msi.data->__domains[ctrl.domid].store;
+ xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
+ desc->irq = 0;
+}
+
/*
* Carefully check whether the device can use reservation mode. If
* reservation mode is enabled then the early activation will assign a
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
@ 2023-03-01 21:07 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2023-03-01 21:07 UTC (permalink / raw)
To: Miquel Raynal
Cc: linux-pci, Thomas Petazzoni, Will Deacon, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Jason Gunthorpe,
Allen Hubbe, Kevin Tian, Ahmed S. Darwish, Jon Mason,
linuxppc-dev, Alex Williamson, Bjorn Helgaas, Dan Williams,
Reinette Chatre, Greg Kroah-Hartman, LKML, Marc Zyngier,
Logan Gunthorpe
Miquel!
On Wed, Mar 01 2023 at 11:55, Miquel Raynal wrote:
> tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
>
>> 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.
>> + /* Leak the descriptor when it is still referenced */
>> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
>> + continue;
>> + msi_free_desc(desc);
>> }
>> }
>
> It looks like since this commit I am getting warnings upon EPROBE_DEFER
> errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
> internals to understand why this warning was shown, and it seems that
> nothing "de-references" the descriptors, which would mean here:
> resetting desc->irq to 0.
Correct. This platform-msi ^(*&!@&^ hack really needs to die ASAP.
Marc, where are we on that? Is this still in limbo?
> I am wondering how useful thisd WARN_ON() is, or otherwise where the
It is useful as it caught bugs already.
> desc->irq entry should be zeroed (if I understand that correctly), any
> help will be appreciated.
Untested workaround below. I hate it with a passion, but *shrug*.
Thanks,
tglx
---
drivers/base/platform-msi.c | 1 +
include/linux/msi.h | 2 ++
kernel/irq/msi.c | 23 ++++++++++++++++++++++-
3 files changed, 25 insertions(+), 1 deletion(-)
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -324,6 +324,7 @@ void platform_msi_device_domain_free(str
struct platform_msi_priv_data *data = domain->host_data;
msi_lock_descs(data->dev);
+ msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -631,6 +631,8 @@ int msi_domain_prepare_irqs(struct irq_d
int nvec, msi_alloc_info_t *args);
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
int virq, int nvec, msi_alloc_info_t *args);
+void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
+
struct irq_domain *
__platform_msi_create_device_domain(struct device *dev,
unsigned int nvec,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_
return 0;
fail:
- for (--virq; virq >= virq_base; virq--)
+ for (--virq; virq >= virq_base; virq--) {
+ msi_domain_depopulate_descs(dev, virq, 1);
irq_domain_free_irqs_common(domain, virq, 1);
+ }
msi_domain_free_descs(dev, &ctrl);
unlock:
msi_unlock_descs(dev);
return ret;
}
+void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
+{
+ struct msi_ctrl ctrl = {
+ .domid = MSI_DEFAULT_DOMAIN,
+ .first = virq_base,
+ .last = virq_base + nvec - 1,
+ };
+ struct msi_desc *desc;
+ struct xarray *xa;
+ unsigned long idx;
+
+ if (!msi_ctrl_valid(dev, &ctrl))
+ return;
+
+ xa = &dev->msi.data->__domains[ctrl.domid].store;
+ xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
+ desc->irq = 0;
+}
+
/*
* Carefully check whether the device can use reservation mode. If
* reservation mode is enabled then the early activation will assign a
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
2023-03-01 21:07 ` Thomas Gleixner
@ 2023-03-02 14:43 ` Miquel Raynal
-1 siblings, 0 replies; 283+ messages in thread
From: Miquel Raynal @ 2023-03-02 14:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Thomas Petazzoni
Hi Thomas,
tglx@linutronix.de wrote on Wed, 01 Mar 2023 22:07:48 +0100:
> Miquel!
>
> On Wed, Mar 01 2023 at 11:55, Miquel Raynal wrote:
> > tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
> >
> >> 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.
> >> + /* Leak the descriptor when it is still referenced */
> >> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
> >> + continue;
> >> + msi_free_desc(desc);
> >> }
> >> }
> >
> > It looks like since this commit I am getting warnings upon EPROBE_DEFER
> > errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
> > internals to understand why this warning was shown, and it seems that
> > nothing "de-references" the descriptors, which would mean here:
> > resetting desc->irq to 0.
>
> Correct. This platform-msi ^(*&!@&^ hack really needs to die ASAP.
:-)
> Marc, where are we on that? Is this still in limbo?
>
> > I am wondering how useful thisd WARN_ON() is, or otherwise where the
>
> It is useful as it caught bugs already.
Sure.
> > desc->irq entry should be zeroed (if I understand that correctly), any
> > help will be appreciated.
>
> Untested workaround below.
Excellent!
> I hate it with a passion, but *shrug*.
:'D
> Thanks,
>
> tglx
> ---
> drivers/base/platform-msi.c | 1 +
> include/linux/msi.h | 2 ++
> kernel/irq/msi.c | 23 ++++++++++++++++++++++-
> 3 files changed, 25 insertions(+), 1 deletion(-)
Kudos for the diff, which indeed works perfectly in my case. I guess
you'll make a proper patch soon, if that's the case you can add my:
Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
Let me know otherwise.
Thanks a lot for the very quick fix!
Miquèl
> --- a/drivers/base/platform-msi.c
> +++ b/drivers/base/platform-msi.c
> @@ -324,6 +324,7 @@ void platform_msi_device_domain_free(str
> struct platform_msi_priv_data *data = domain->host_data;
>
> msi_lock_descs(data->dev);
> + msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
> irq_domain_free_irqs_common(domain, virq, nr_irqs);
> msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
> msi_unlock_descs(data->dev);
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -631,6 +631,8 @@ int msi_domain_prepare_irqs(struct irq_d
> int nvec, msi_alloc_info_t *args);
> int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
> int virq, int nvec, msi_alloc_info_t *args);
> +void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
> +
> struct irq_domain *
> __platform_msi_create_device_domain(struct device *dev,
> unsigned int nvec,
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_
> return 0;
>
> fail:
> - for (--virq; virq >= virq_base; virq--)
> + for (--virq; virq >= virq_base; virq--) {
> + msi_domain_depopulate_descs(dev, virq, 1);
> irq_domain_free_irqs_common(domain, virq, 1);
> + }
> msi_domain_free_descs(dev, &ctrl);
> unlock:
> msi_unlock_descs(dev);
> return ret;
> }
>
> +void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
> +{
> + struct msi_ctrl ctrl = {
> + .domid = MSI_DEFAULT_DOMAIN,
> + .first = virq_base,
> + .last = virq_base + nvec - 1,
> + };
> + struct msi_desc *desc;
> + struct xarray *xa;
> + unsigned long idx;
> +
> + if (!msi_ctrl_valid(dev, &ctrl))
> + return;
> +
> + xa = &dev->msi.data->__domains[ctrl.domid].store;
> + xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
> + desc->irq = 0;
> +}
> +
> /*
> * Carefully check whether the device can use reservation mode. If
> * reservation mode is enabled then the early activation will assign a
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 05/39] genirq/msi: Remove filter from msi_free_descs_free_range()
@ 2023-03-02 14:43 ` Miquel Raynal
0 siblings, 0 replies; 283+ messages in thread
From: Miquel Raynal @ 2023-03-02 14:43 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Thomas Petazzoni, Will Deacon, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Jason Gunthorpe,
Allen Hubbe, Kevin Tian, Ahmed S. Darwish, Jon Mason,
linuxppc-dev, Alex Williamson, Bjorn Helgaas, Dan Williams,
Reinette Chatre, Greg Kroah-Hartman, LKML, Marc Zyngier,
Logan Gunthorpe
Hi Thomas,
tglx@linutronix.de wrote on Wed, 01 Mar 2023 22:07:48 +0100:
> Miquel!
>
> On Wed, Mar 01 2023 at 11:55, Miquel Raynal wrote:
> > tglx@linutronix.de wrote on Fri, 11 Nov 2022 14:54:22 +0100 (CET):
> >
> >> 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.
> >> + /* Leak the descriptor when it is still referenced */
> >> + if (WARN_ON_ONCE(msi_desc_match(desc, MSI_DESC_ASSOCIATED)))
> >> + continue;
> >> + msi_free_desc(desc);
> >> }
> >> }
> >
> > It looks like since this commit I am getting warnings upon EPROBE_DEFER
> > errors in the mvpp2 Marvell Ethernet driver. I looked a bit at the
> > internals to understand why this warning was shown, and it seems that
> > nothing "de-references" the descriptors, which would mean here:
> > resetting desc->irq to 0.
>
> Correct. This platform-msi ^(*&!@&^ hack really needs to die ASAP.
:-)
> Marc, where are we on that? Is this still in limbo?
>
> > I am wondering how useful thisd WARN_ON() is, or otherwise where the
>
> It is useful as it caught bugs already.
Sure.
> > desc->irq entry should be zeroed (if I understand that correctly), any
> > help will be appreciated.
>
> Untested workaround below.
Excellent!
> I hate it with a passion, but *shrug*.
:'D
> Thanks,
>
> tglx
> ---
> drivers/base/platform-msi.c | 1 +
> include/linux/msi.h | 2 ++
> kernel/irq/msi.c | 23 ++++++++++++++++++++++-
> 3 files changed, 25 insertions(+), 1 deletion(-)
Kudos for the diff, which indeed works perfectly in my case. I guess
you'll make a proper patch soon, if that's the case you can add my:
Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
Let me know otherwise.
Thanks a lot for the very quick fix!
Miquèl
> --- a/drivers/base/platform-msi.c
> +++ b/drivers/base/platform-msi.c
> @@ -324,6 +324,7 @@ void platform_msi_device_domain_free(str
> struct platform_msi_priv_data *data = domain->host_data;
>
> msi_lock_descs(data->dev);
> + msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
> irq_domain_free_irqs_common(domain, virq, nr_irqs);
> msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
> msi_unlock_descs(data->dev);
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -631,6 +631,8 @@ int msi_domain_prepare_irqs(struct irq_d
> int nvec, msi_alloc_info_t *args);
> int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
> int virq, int nvec, msi_alloc_info_t *args);
> +void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
> +
> struct irq_domain *
> __platform_msi_create_device_domain(struct device *dev,
> unsigned int nvec,
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_
> return 0;
>
> fail:
> - for (--virq; virq >= virq_base; virq--)
> + for (--virq; virq >= virq_base; virq--) {
> + msi_domain_depopulate_descs(dev, virq, 1);
> irq_domain_free_irqs_common(domain, virq, 1);
> + }
> msi_domain_free_descs(dev, &ctrl);
> unlock:
> msi_unlock_descs(dev);
> return ret;
> }
>
> +void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
> +{
> + struct msi_ctrl ctrl = {
> + .domid = MSI_DEFAULT_DOMAIN,
> + .first = virq_base,
> + .last = virq_base + nvec - 1,
> + };
> + struct msi_desc *desc;
> + struct xarray *xa;
> + unsigned long idx;
> +
> + if (!msi_ctrl_valid(dev, &ctrl))
> + return;
> +
> + xa = &dev->msi.data->__domains[ctrl.domid].store;
> + xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
> + desc->irq = 0;
> +}
> +
> /*
> * Carefully check whether the device can use reservation mode. If
> * reservation mode is enabled then the early activation will assign a
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/urgent] genirq/msi, platform-msi: Ensure that MSI descriptors are unreferenced
2023-03-01 21:07 ` Thomas Gleixner
(?)
(?)
@ 2023-03-02 17:22 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2023-03-02 17:22 UTC (permalink / raw)
To: linux-tip-commits
Cc: Miquel Raynal, Thomas Gleixner, stable, x86, linux-kernel, maz
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: 0fb7fb713461e44b12e72c292bf90ee300f40710
Gitweb: https://git.kernel.org/tip/0fb7fb713461e44b12e72c292bf90ee300f40710
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Wed, 01 Mar 2023 22:07:48 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 02 Mar 2023 18:09:44 +01:00
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
---
drivers/base/platform-msi.c | 1 +
include/linux/msi.h | 2 ++
kernel/irq/msi.c | 23 ++++++++++++++++++++++-
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/drivers/base/platform-msi.c b/drivers/base/platform-msi.c
index 5883e76..f37ad34 100644
--- a/drivers/base/platform-msi.c
+++ b/drivers/base/platform-msi.c
@@ -324,6 +324,7 @@ void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int vir
struct platform_msi_priv_data *data = domain->host_data;
msi_lock_descs(data->dev);
+ msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
irq_domain_free_irqs_common(domain, virq, nr_irqs);
msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
msi_unlock_descs(data->dev);
diff --git a/include/linux/msi.h b/include/linux/msi.h
index a112b91..15dd718 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -631,6 +631,8 @@ int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
int nvec, msi_alloc_info_t *args);
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
int virq, int nvec, msi_alloc_info_t *args);
+void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
+
struct irq_domain *
__platform_msi_create_device_domain(struct device *dev,
unsigned int nvec,
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index efd21b7..d169ee0 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
return 0;
fail:
- for (--virq; virq >= virq_base; virq--)
+ for (--virq; virq >= virq_base; virq--) {
+ msi_domain_depopulate_descs(dev, virq, 1);
irq_domain_free_irqs_common(domain, virq, 1);
+ }
msi_domain_free_descs(dev, &ctrl);
unlock:
msi_unlock_descs(dev);
return ret;
}
+void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
+{
+ struct msi_ctrl ctrl = {
+ .domid = MSI_DEFAULT_DOMAIN,
+ .first = virq_base,
+ .last = virq_base + nvec - 1,
+ };
+ struct msi_desc *desc;
+ struct xarray *xa;
+ unsigned long idx;
+
+ if (!msi_ctrl_valid(dev, &ctrl))
+ return;
+
+ xa = &dev->msi.data->__domains[ctrl.domid].store;
+ xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
+ desc->irq = 0;
+}
+
/*
* Carefully check whether the device can use reservation mode. If
* reservation mode is enabled then the early activation will assign a
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 06/39] genirq/msi: Add missing kernel doc to msi_next_desc()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
W=1 complains about this.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
kernel/irq/msi.c | 1 +
1 file changed, 1 insertion(+)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -282,6 +282,7 @@ EXPORT_SYMBOL_GPL(msi_first_desc);
/**
* msi_next_desc - Get the next MSI descriptor of a device
* @dev: Device to operate on
+ * @filter: Descriptor state filter
*
* The first invocation of msi_next_desc() has to be preceeded by a
* successful invocation of __msi_first_desc(). Consecutive invocations are
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 06/39] genirq/msi: Add missing kernel doc to msi_next_desc()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
W=1 complains about this.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
kernel/irq/msi.c | 1 +
1 file changed, 1 insertion(+)
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -282,6 +282,7 @@ EXPORT_SYMBOL_GPL(msi_first_desc);
/**
* msi_next_desc - Get the next MSI descriptor of a device
* @dev: Device to operate on
+ * @filter: Descriptor state filter
*
* The first invocation of msi_next_desc() has to be preceeded by a
* successful invocation of __msi_first_desc(). Consecutive invocations are
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 06/39] genirq/msi: Add missing kernel doc to msi_next_desc()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:44 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:23PM +0100, Thomas Gleixner wrote:
> W=1 complains about this.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> kernel/irq/msi.c | 1 +
> 1 file changed, 1 insertion(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 06/39] genirq/msi: Add missing kernel doc to msi_next_desc()
@ 2022-11-16 17:44 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:23PM +0100, Thomas Gleixner wrote:
> W=1 complains about this.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> kernel/irq/msi.c | 1 +
> 1 file changed, 1 insertion(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Add missing kernel doc to msi_next_desc()
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: fdd5340411b25450612767270ac3cd0d8454183c
Gitweb: https://git.kernel.org/tip/fdd5340411b25450612767270ac3cd0d8454183c
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:23 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
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
---
kernel/irq/msi.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 1ca4846..8a6d0dc 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -282,6 +282,7 @@ EXPORT_SYMBOL_GPL(msi_first_desc);
/**
* msi_next_desc - Get the next MSI descriptor of a device
* @dev: Device to operate on
+ * @filter: Descriptor state filter
*
* The first invocation of msi_next_desc() has to be preceeded by a
* successful invocation of __msi_first_desc(). Consecutive invocations are
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 07/39] genirq/msi: Make __msi_domain_alloc_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Nothing outside of the core code requires this.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 7 ++-----
kernel/irq/msi.c | 6 ++++--
2 files changed, 6 insertions(+), 7 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -334,9 +334,8 @@ struct msi_domain_info;
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
*
- * This is NOT meant to be abused, but it can be useful to build wrappers
- * for specialized MSI irq domains which need extra work before and after
- * calling __msi_domain_alloc_irqs()/__msi_domain_free_irqs().
+ * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
+ * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -425,8 +424,6 @@ int msi_domain_set_affinity(struct irq_d
struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec);
int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device *dev,
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -462,6 +462,8 @@ static inline void msi_sysfs_remove_desc
#endif /* !CONFIG_SYSFS */
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
{
@@ -852,8 +854,8 @@ static int msi_init_virq(struct irq_doma
return 0;
}
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec)
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
+ int nvec)
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 07/39] genirq/msi: Make __msi_domain_alloc_irqs() static
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Nothing outside of the core code requires this.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 7 ++-----
kernel/irq/msi.c | 6 ++++--
2 files changed, 6 insertions(+), 7 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -334,9 +334,8 @@ struct msi_domain_info;
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
*
- * This is NOT meant to be abused, but it can be useful to build wrappers
- * for specialized MSI irq domains which need extra work before and after
- * calling __msi_domain_alloc_irqs()/__msi_domain_free_irqs().
+ * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
+ * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -425,8 +424,6 @@ int msi_domain_set_affinity(struct irq_d
struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec);
int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device *dev,
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -462,6 +462,8 @@ static inline void msi_sysfs_remove_desc
#endif /* !CONFIG_SYSFS */
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
{
@@ -852,8 +854,8 @@ static int msi_init_virq(struct irq_doma
return 0;
}
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec)
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
+ int nvec)
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 07/39] genirq/msi: Make __msi_domain_alloc_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:44 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:25PM +0100, Thomas Gleixner wrote:
> Nothing outside of the core code requires this.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 7 ++-----
> kernel/irq/msi.c | 6 ++++--
> 2 files changed, 6 insertions(+), 7 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 07/39] genirq/msi: Make __msi_domain_alloc_irqs() static
@ 2022-11-16 17:44 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:25PM +0100, Thomas Gleixner wrote:
> Nothing outside of the core code requires this.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 7 ++-----
> kernel/irq/msi.c | 6 ++++--
> 2 files changed, 6 insertions(+), 7 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Make __msi_domain_alloc_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 762687ceb31fc296e2e1406559e8bb50251c5277
Gitweb: https://git.kernel.org/tip/762687ceb31fc296e2e1406559e8bb50251c5277
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:25 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:18 +01:00
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
---
include/linux/msi.h | 7 ++-----
kernel/irq/msi.c | 6 ++++--
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 969ce46..9b552ee 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -334,9 +334,8 @@ struct msi_domain_info;
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
*
- * This is NOT meant to be abused, but it can be useful to build wrappers
- * for specialized MSI irq domains which need extra work before and after
- * calling __msi_domain_alloc_irqs()/__msi_domain_free_irqs().
+ * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
+ * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -425,8 +424,6 @@ int msi_domain_set_affinity(struct irq_data *data, const struct cpumask *mask,
struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec);
int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device *dev,
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 8a6d0dc..3ccc7f6 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -462,6 +462,8 @@ static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *de
#endif /* !CONFIG_SYSFS */
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
{
@@ -852,8 +854,8 @@ static int msi_init_virq(struct irq_domain *domain, int virq, unsigned int vflag
return 0;
}
-int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
- int nvec)
+static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
+ int nvec)
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
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>
---
include/linux/msi.h | 4 ++++
kernel/irq/msi.c | 2 ++
2 files changed, 6 insertions(+)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -315,6 +315,8 @@ struct msi_domain_info;
* function.
* @domain_free_irqs: Optional function to override the default free
* function.
+ * @msi_post_free: Optional function which is invoked after freeing
+ * all interrupts.
*
* @get_hwirq, @msi_init and @msi_free are callbacks used by the underlying
* irqdomain.
@@ -359,6 +361,8 @@ struct msi_domain_ops {
struct device *dev, int nvec);
void (*domain_free_irqs)(struct irq_domain *domain,
struct device *dev);
+ void (*msi_post_free)(struct irq_domain *domain,
+ struct device *dev);
};
/**
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1026,6 +1026,8 @@ void msi_domain_free_irqs_descs_locked(s
lockdep_assert_held(&dev->msi.data->mutex);
ops->domain_free_irqs(domain, dev);
+ if (ops->msi_post_free)
+ ops->msi_post_free(domain, dev);
msi_domain_free_msi_descs(info, dev);
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
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>
---
include/linux/msi.h | 4 ++++
kernel/irq/msi.c | 2 ++
2 files changed, 6 insertions(+)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -315,6 +315,8 @@ struct msi_domain_info;
* function.
* @domain_free_irqs: Optional function to override the default free
* function.
+ * @msi_post_free: Optional function which is invoked after freeing
+ * all interrupts.
*
* @get_hwirq, @msi_init and @msi_free are callbacks used by the underlying
* irqdomain.
@@ -359,6 +361,8 @@ struct msi_domain_ops {
struct device *dev, int nvec);
void (*domain_free_irqs)(struct irq_domain *domain,
struct device *dev);
+ void (*msi_post_free)(struct irq_domain *domain,
+ struct device *dev);
};
/**
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1026,6 +1026,8 @@ void msi_domain_free_irqs_descs_locked(s
lockdep_assert_held(&dev->msi.data->mutex);
ops->domain_free_irqs(domain, dev);
+ if (ops->msi_post_free)
+ ops->msi_post_free(domain, dev);
msi_domain_free_msi_descs(info, dev);
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:44 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:27PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> include/linux/msi.h | 4 ++++
> kernel/irq/msi.c | 2 ++
> 2 files changed, 6 insertions(+)
Make sense, but I do wonder why PPC needs this ordering..
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
@ 2022-11-16 17:44 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:44 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:27PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> include/linux/msi.h | 4 ++++
> kernel/irq/msi.c | 2 ++
> 2 files changed, 6 insertions(+)
Make sense, but I do wonder why PPC needs this ordering..
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
2022-11-16 17:44 ` Jason Gunthorpe
@ 2022-11-16 22:48 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:48 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Wed, Nov 16 2022 at 13:44, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:27PM +0100, Thomas Gleixner wrote:
>> 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>
>> ---
>> include/linux/msi.h | 4 ++++
>> kernel/irq/msi.c | 2 ++
>> 2 files changed, 6 insertions(+)
>
> Make sense, but I do wonder why PPC needs this ordering..
Some hypervisor thing.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 08/39] genirq/msi: Provide msi_domain_ops::post_free()
@ 2022-11-16 22:48 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:48 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 13:44, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:27PM +0100, Thomas Gleixner wrote:
>> 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>
>> ---
>> include/linux/msi.h | 4 ++++
>> kernel/irq/msi.c | 2 ++
>> 2 files changed, 6 insertions(+)
>
> Make sense, but I do wonder why PPC needs this ordering..
Some hypervisor thing.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Provide msi_domain_ops:: Post_free()
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: f6d3486a3d2f3c67d732641834eec872fcc66472
Gitweb: https://git.kernel.org/tip/f6d3486a3d2f3c67d732641834eec872fcc66472
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:27 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
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
---
include/linux/msi.h | 4 ++++
kernel/irq/msi.c | 2 ++
2 files changed, 6 insertions(+)
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 9b552ee..7f6aba9 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -315,6 +315,8 @@ struct msi_domain_info;
* function.
* @domain_free_irqs: Optional function to override the default free
* function.
+ * @msi_post_free: Optional function which is invoked after freeing
+ * all interrupts.
*
* @get_hwirq, @msi_init and @msi_free are callbacks used by the underlying
* irqdomain.
@@ -359,6 +361,8 @@ struct msi_domain_ops {
struct device *dev, int nvec);
void (*domain_free_irqs)(struct irq_domain *domain,
struct device *dev);
+ void (*msi_post_free)(struct irq_domain *domain,
+ struct device *dev);
};
/**
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 3ccc7f6..c71c37d 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1026,6 +1026,8 @@ void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device
lockdep_assert_held(&dev->msi.data->mutex);
ops->domain_free_irqs(domain, dev);
+ if (ops->msi_post_free)
+ ops->msi_post_free(domain, dev);
msi_domain_free_msi_descs(info, dev);
}
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 09/39] powerpc/pseries/msi: Use msi_domain_ops::msi_post_free()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Use the new msi_post_free() callback which is invoked after the interrupts
have been freed to tell the hypervisor about the shutdown.
This allows to remove the exposure of __msi_domain_free_irqs().
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: linuxppc-dev@lists.ozlabs.org
---
arch/powerpc/platforms/pseries/msi.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -447,21 +447,18 @@ static void pseries_msi_ops_msi_free(str
* RTAS can not disable one MSI at a time. It's all or nothing. Do it
* at the end after all IRQs have been freed.
*/
-static void pseries_msi_domain_free_irqs(struct irq_domain *domain,
- struct device *dev)
+static void pseries_msi_post_free(struct irq_domain *domain, struct device *dev)
{
if (WARN_ON_ONCE(!dev_is_pci(dev)))
return;
- __msi_domain_free_irqs(domain, dev);
-
rtas_disable_msi(to_pci_dev(dev));
}
static struct msi_domain_ops pseries_pci_msi_domain_ops = {
.msi_prepare = pseries_msi_ops_prepare,
.msi_free = pseries_msi_ops_msi_free,
- .domain_free_irqs = pseries_msi_domain_free_irqs,
+ .msi_post_free = pseries_msi_post_free,
};
static void pseries_msi_shutdown(struct irq_data *d)
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 09/39] powerpc/pseries/msi: Use msi_domain_ops::msi_post_free()
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Use the new msi_post_free() callback which is invoked after the interrupts
have been freed to tell the hypervisor about the shutdown.
This allows to remove the exposure of __msi_domain_free_irqs().
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: linuxppc-dev@lists.ozlabs.org
---
arch/powerpc/platforms/pseries/msi.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -447,21 +447,18 @@ static void pseries_msi_ops_msi_free(str
* RTAS can not disable one MSI at a time. It's all or nothing. Do it
* at the end after all IRQs have been freed.
*/
-static void pseries_msi_domain_free_irqs(struct irq_domain *domain,
- struct device *dev)
+static void pseries_msi_post_free(struct irq_domain *domain, struct device *dev)
{
if (WARN_ON_ONCE(!dev_is_pci(dev)))
return;
- __msi_domain_free_irqs(domain, dev);
-
rtas_disable_msi(to_pci_dev(dev));
}
static struct msi_domain_ops pseries_pci_msi_domain_ops = {
.msi_prepare = pseries_msi_ops_prepare,
.msi_free = pseries_msi_ops_msi_free,
- .domain_free_irqs = pseries_msi_domain_free_irqs,
+ .msi_post_free = pseries_msi_post_free,
};
static void pseries_msi_shutdown(struct irq_data *d)
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 09/39] powerpc/pseries/msi: Use msi_domain_ops::msi_post_free()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:45 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:45 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:28PM +0100, Thomas Gleixner wrote:
> Use the new msi_post_free() callback which is invoked after the interrupts
> have been freed to tell the hypervisor about the shutdown.
>
> This allows to remove the exposure of __msi_domain_free_irqs().
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
> Cc: linuxppc-dev@lists.ozlabs.org
> ---
> arch/powerpc/platforms/pseries/msi.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 09/39] powerpc/pseries/msi: Use msi_domain_ops::msi_post_free()
@ 2022-11-16 17:45 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:45 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:28PM +0100, Thomas Gleixner wrote:
> Use the new msi_post_free() callback which is invoked after the interrupts
> have been freed to tell the hypervisor about the shutdown.
>
> This allows to remove the exposure of __msi_domain_free_irqs().
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
> Cc: linuxppc-dev@lists.ozlabs.org
> ---
> arch/powerpc/platforms/pseries/msi.c | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] powerpc/pseries/msi: Use msi_domain_ops:: Msi_post_free()
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: c4bc51b1dd611fcce53849254c6582334368c715
Gitweb: https://git.kernel.org/tip/c4bc51b1dd611fcce53849254c6582334368c715
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:28 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
powerpc/pseries/msi: Use msi_domain_ops:: Msi_post_free()
Use the new msi_post_free() callback which is invoked after the interrupts
have been freed to tell the hypervisor about the shutdown.
This allows to remove the exposure of __msi_domain_free_irqs().
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.120489922@linutronix.de
---
arch/powerpc/platforms/pseries/msi.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
index a3a71d3..3f05507 100644
--- a/arch/powerpc/platforms/pseries/msi.c
+++ b/arch/powerpc/platforms/pseries/msi.c
@@ -447,21 +447,18 @@ static void pseries_msi_ops_msi_free(struct irq_domain *domain,
* RTAS can not disable one MSI at a time. It's all or nothing. Do it
* at the end after all IRQs have been freed.
*/
-static void pseries_msi_domain_free_irqs(struct irq_domain *domain,
- struct device *dev)
+static void pseries_msi_post_free(struct irq_domain *domain, struct device *dev)
{
if (WARN_ON_ONCE(!dev_is_pci(dev)))
return;
- __msi_domain_free_irqs(domain, dev);
-
rtas_disable_msi(to_pci_dev(dev));
}
static struct msi_domain_ops pseries_pci_msi_domain_ops = {
.msi_prepare = pseries_msi_ops_prepare,
.msi_free = pseries_msi_ops_msi_free,
- .domain_free_irqs = pseries_msi_domain_free_irqs,
+ .msi_post_free = pseries_msi_post_free,
};
static void pseries_msi_shutdown(struct irq_data *d)
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 10/39] genirq/msi: Make __msi_domain_free_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Now that the last user is gone, confine it to the core code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 3 ++-
2 files changed, 2 insertions(+), 5 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -335,9 +335,6 @@ struct msi_domain_info;
* are set to the default implementation if NULL and even when
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
- *
- * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
- * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -432,7 +429,6 @@ int msi_domain_alloc_irqs_descs_locked(s
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
int nvec);
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -463,6 +463,7 @@ static inline void msi_sysfs_remove_desc
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
@@ -978,7 +979,7 @@ int msi_domain_alloc_irqs(struct irq_dom
return ret;
}
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
{
struct msi_domain_info *info = domain->host_data;
struct irq_data *irqd;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 10/39] genirq/msi: Make __msi_domain_free_irqs() static
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Now that the last user is gone, confine it to the core code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 3 ++-
2 files changed, 2 insertions(+), 5 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -335,9 +335,6 @@ struct msi_domain_info;
* are set to the default implementation if NULL and even when
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
- *
- * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
- * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -432,7 +429,6 @@ int msi_domain_alloc_irqs_descs_locked(s
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
int nvec);
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -463,6 +463,7 @@ static inline void msi_sysfs_remove_desc
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
@@ -978,7 +979,7 @@ int msi_domain_alloc_irqs(struct irq_dom
return ret;
}
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
{
struct msi_domain_info *info = domain->host_data;
struct irq_data *irqd;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 10/39] genirq/msi: Make __msi_domain_free_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:46 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:46 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:30PM +0100, Thomas Gleixner wrote:
> Now that the last user is gone, confine it to the core code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 4 ----
> kernel/irq/msi.c | 3 ++-
> 2 files changed, 2 insertions(+), 5 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 10/39] genirq/msi: Make __msi_domain_free_irqs() static
@ 2022-11-16 17:46 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:46 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:30PM +0100, Thomas Gleixner wrote:
> Now that the last user is gone, confine it to the core code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 4 ----
> kernel/irq/msi.c | 3 ++-
> 2 files changed, 2 insertions(+), 5 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Make __msi_domain_free_irqs() static
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 057c97a1cd665ebb38841418adcd35f57b33cc21
Gitweb: https://git.kernel.org/tip/057c97a1cd665ebb38841418adcd35f57b33cc21
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:30 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
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
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 3 ++-
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 7f6aba9..ee735ff 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -335,9 +335,6 @@ struct msi_domain_info;
* are set to the default implementation if NULL and even when
* MSI_FLAG_USE_DEF_DOM_OPS is not set to avoid breaking existing users and
* because these callbacks are obviously mandatory.
- *
- * __msi_domain_free_irqs() is exposed for PPC pseries to handle extra
- * work after all interrupts and descriptors have been freed.
*/
struct msi_domain_ops {
irq_hw_number_t (*get_hwirq)(struct msi_domain_info *info,
@@ -432,7 +429,6 @@ int msi_domain_alloc_irqs_descs_locked(struct irq_domain *domain, struct device
int nvec);
int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
int nvec);
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs_descs_locked(struct irq_domain *domain, struct device *dev);
void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain);
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index c71c37d..a2efa00 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -463,6 +463,7 @@ static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *de
#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
static inline void irq_chip_write_msi_msg(struct irq_data *data,
struct msi_msg *msg)
@@ -978,7 +979,7 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nve
return ret;
}
-void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
+static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
{
struct msi_domain_info *info = domain->host_data;
struct irq_data *irqd;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Split the bus token defines out into a seperate header file to avoid
inclusion of irqdomain.h in msi.h.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/irqdomain.h | 22 +---------------------
include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+), 21 deletions(-)
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -31,6 +31,7 @@
#define _LINUX_IRQDOMAIN_H
#include <linux/types.h>
+#include <linux/irqdomain_defs.h>
#include <linux/irqhandler.h>
#include <linux/of.h>
#include <linux/mutex.h>
@@ -68,27 +69,6 @@ struct irq_fwspec {
void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args,
unsigned int count, struct irq_fwspec *fwspec);
-/*
- * Should several domains have the same device node, but serve
- * different purposes (for example one domain is for PCI/MSI, and the
- * other for wired IRQs), they can be distinguished using a
- * bus-specific token. Most domains are expected to only carry
- * DOMAIN_BUS_ANY.
- */
-enum irq_domain_bus_token {
- DOMAIN_BUS_ANY = 0,
- DOMAIN_BUS_WIRED,
- DOMAIN_BUS_GENERIC_MSI,
- DOMAIN_BUS_PCI_MSI,
- DOMAIN_BUS_PLATFORM_MSI,
- DOMAIN_BUS_NEXUS,
- DOMAIN_BUS_IPI,
- DOMAIN_BUS_FSL_MC_MSI,
- DOMAIN_BUS_TI_SCI_INTA_MSI,
- DOMAIN_BUS_WAKEUP,
- DOMAIN_BUS_VMD_MSI,
-};
-
/**
* struct irq_domain_ops - Methods for irq_domain objects
* @match: Match an interrupt controller device node to a host, returns
--- /dev/null
+++ b/include/linux/irqdomain_defs.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_IRQDOMAIN_DEFS_H
+#define _LINUX_IRQDOMAIN_DEFS_H
+
+/*
+ * Should several domains have the same device node, but serve
+ * different purposes (for example one domain is for PCI/MSI, and the
+ * other for wired IRQs), they can be distinguished using a
+ * bus-specific token. Most domains are expected to only carry
+ * DOMAIN_BUS_ANY.
+ */
+enum irq_domain_bus_token {
+ DOMAIN_BUS_ANY = 0,
+ DOMAIN_BUS_WIRED,
+ DOMAIN_BUS_GENERIC_MSI,
+ DOMAIN_BUS_PCI_MSI,
+ DOMAIN_BUS_PLATFORM_MSI,
+ DOMAIN_BUS_NEXUS,
+ DOMAIN_BUS_IPI,
+ DOMAIN_BUS_FSL_MC_MSI,
+ DOMAIN_BUS_TI_SCI_INTA_MSI,
+ DOMAIN_BUS_WAKEUP,
+ DOMAIN_BUS_VMD_MSI,
+};
+
+#endif /* _LINUX_IRQDOMAIN_DEFS_H */
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Split the bus token defines out into a seperate header file to avoid
inclusion of irqdomain.h in msi.h.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/irqdomain.h | 22 +---------------------
include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+), 21 deletions(-)
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -31,6 +31,7 @@
#define _LINUX_IRQDOMAIN_H
#include <linux/types.h>
+#include <linux/irqdomain_defs.h>
#include <linux/irqhandler.h>
#include <linux/of.h>
#include <linux/mutex.h>
@@ -68,27 +69,6 @@ struct irq_fwspec {
void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args,
unsigned int count, struct irq_fwspec *fwspec);
-/*
- * Should several domains have the same device node, but serve
- * different purposes (for example one domain is for PCI/MSI, and the
- * other for wired IRQs), they can be distinguished using a
- * bus-specific token. Most domains are expected to only carry
- * DOMAIN_BUS_ANY.
- */
-enum irq_domain_bus_token {
- DOMAIN_BUS_ANY = 0,
- DOMAIN_BUS_WIRED,
- DOMAIN_BUS_GENERIC_MSI,
- DOMAIN_BUS_PCI_MSI,
- DOMAIN_BUS_PLATFORM_MSI,
- DOMAIN_BUS_NEXUS,
- DOMAIN_BUS_IPI,
- DOMAIN_BUS_FSL_MC_MSI,
- DOMAIN_BUS_TI_SCI_INTA_MSI,
- DOMAIN_BUS_WAKEUP,
- DOMAIN_BUS_VMD_MSI,
-};
-
/**
* struct irq_domain_ops - Methods for irq_domain objects
* @match: Match an interrupt controller device node to a host, returns
--- /dev/null
+++ b/include/linux/irqdomain_defs.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_IRQDOMAIN_DEFS_H
+#define _LINUX_IRQDOMAIN_DEFS_H
+
+/*
+ * Should several domains have the same device node, but serve
+ * different purposes (for example one domain is for PCI/MSI, and the
+ * other for wired IRQs), they can be distinguished using a
+ * bus-specific token. Most domains are expected to only carry
+ * DOMAIN_BUS_ANY.
+ */
+enum irq_domain_bus_token {
+ DOMAIN_BUS_ANY = 0,
+ DOMAIN_BUS_WIRED,
+ DOMAIN_BUS_GENERIC_MSI,
+ DOMAIN_BUS_PCI_MSI,
+ DOMAIN_BUS_PLATFORM_MSI,
+ DOMAIN_BUS_NEXUS,
+ DOMAIN_BUS_IPI,
+ DOMAIN_BUS_FSL_MC_MSI,
+ DOMAIN_BUS_TI_SCI_INTA_MSI,
+ DOMAIN_BUS_WAKEUP,
+ DOMAIN_BUS_VMD_MSI,
+};
+
+#endif /* _LINUX_IRQDOMAIN_DEFS_H */
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:02 ` Ashok Raj
-1 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 17:02 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre, Ashok Raj
On Fri, Nov 11, 2022 at 02:54:32PM +0100, Thomas Gleixner wrote:
> Split the bus token defines out into a seperate header file to avoid
> inclusion of irqdomain.h in msi.h.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/irqdomain.h | 22 +---------------------
> include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
> 2 files changed, 27 insertions(+), 21 deletions(-)
>
for Patches 5-11:
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
@ 2022-11-16 17:02 ` Ashok Raj
0 siblings, 0 replies; 283+ messages in thread
From: Ashok Raj @ 2022-11-16 17:02 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:32PM +0100, Thomas Gleixner wrote:
> Split the bus token defines out into a seperate header file to avoid
> inclusion of irqdomain.h in msi.h.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/irqdomain.h | 22 +---------------------
> include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
> 2 files changed, 27 insertions(+), 21 deletions(-)
>
for Patches 5-11:
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:48 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:48 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:32PM +0100, Thomas Gleixner wrote:
> Split the bus token defines out into a seperate header file to avoid
> inclusion of irqdomain.h in msi.h.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/irqdomain.h | 22 +---------------------
> include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
> 2 files changed, 27 insertions(+), 21 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 11/39] genirq/irqdomain: Move bus token enum into a seperate header
@ 2022-11-16 17:48 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:48 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:32PM +0100, Thomas Gleixner wrote:
> Split the bus token defines out into a seperate header file to avoid
> inclusion of irqdomain.h in msi.h.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/irqdomain.h | 22 +---------------------
> include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
> 2 files changed, 27 insertions(+), 21 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/irqdomain: Move bus token enum into a seperate header
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ashok Raj, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: aeef20527c87fed37c6f159d9eafd063a099f6ed
Gitweb: https://git.kernel.org/tip/aeef20527c87fed37c6f159d9eafd063a099f6ed
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:32 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
genirq/irqdomain: Move bus token enum into a seperate header
Split the bus token defines out into a seperate header file to avoid
inclusion of irqdomain.h in msi.h.
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.237221143@linutronix.de
---
include/linux/irqdomain.h | 22 +---------------------
include/linux/irqdomain_defs.h | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+), 21 deletions(-)
create mode 100644 include/linux/irqdomain_defs.h
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 00d577f..a4af7f8 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -31,6 +31,7 @@
#define _LINUX_IRQDOMAIN_H
#include <linux/types.h>
+#include <linux/irqdomain_defs.h>
#include <linux/irqhandler.h>
#include <linux/of.h>
#include <linux/mutex.h>
@@ -68,27 +69,6 @@ struct irq_fwspec {
void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args,
unsigned int count, struct irq_fwspec *fwspec);
-/*
- * Should several domains have the same device node, but serve
- * different purposes (for example one domain is for PCI/MSI, and the
- * other for wired IRQs), they can be distinguished using a
- * bus-specific token. Most domains are expected to only carry
- * DOMAIN_BUS_ANY.
- */
-enum irq_domain_bus_token {
- DOMAIN_BUS_ANY = 0,
- DOMAIN_BUS_WIRED,
- DOMAIN_BUS_GENERIC_MSI,
- DOMAIN_BUS_PCI_MSI,
- DOMAIN_BUS_PLATFORM_MSI,
- DOMAIN_BUS_NEXUS,
- DOMAIN_BUS_IPI,
- DOMAIN_BUS_FSL_MC_MSI,
- DOMAIN_BUS_TI_SCI_INTA_MSI,
- DOMAIN_BUS_WAKEUP,
- DOMAIN_BUS_VMD_MSI,
-};
-
/**
* struct irq_domain_ops - Methods for irq_domain objects
* @match: Match an interrupt controller device node to a host, returns
diff --git a/include/linux/irqdomain_defs.h b/include/linux/irqdomain_defs.h
new file mode 100644
index 0000000..69035b4
--- /dev/null
+++ b/include/linux/irqdomain_defs.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_IRQDOMAIN_DEFS_H
+#define _LINUX_IRQDOMAIN_DEFS_H
+
+/*
+ * Should several domains have the same device node, but serve
+ * different purposes (for example one domain is for PCI/MSI, and the
+ * other for wired IRQs), they can be distinguished using a
+ * bus-specific token. Most domains are expected to only carry
+ * DOMAIN_BUS_ANY.
+ */
+enum irq_domain_bus_token {
+ DOMAIN_BUS_ANY = 0,
+ DOMAIN_BUS_WIRED,
+ DOMAIN_BUS_GENERIC_MSI,
+ DOMAIN_BUS_PCI_MSI,
+ DOMAIN_BUS_PLATFORM_MSI,
+ DOMAIN_BUS_NEXUS,
+ DOMAIN_BUS_IPI,
+ DOMAIN_BUS_FSL_MC_MSI,
+ DOMAIN_BUS_TI_SCI_INTA_MSI,
+ DOMAIN_BUS_WAKEUP,
+ DOMAIN_BUS_VMD_MSI,
+};
+
+#endif /* _LINUX_IRQDOMAIN_DEFS_H */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
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>
---
include/linux/msi.h | 19 +++++++++++--------
kernel/irq/msi.c | 7 +++++--
2 files changed, 16 insertions(+), 10 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -16,6 +16,7 @@
* abuse. The only function which is relevant for drivers is msi_get_virq().
*/
+#include <linux/irqdomain_defs.h>
#include <linux/cpumask.h>
#include <linux/xarray.h>
#include <linux/mutex.h>
@@ -365,6 +366,7 @@ struct msi_domain_ops {
/**
* struct msi_domain_info - MSI interrupt domain data
* @flags: Flags to decribe features and capabilities
+ * @bus_token: The domain bus token
* @ops: The callback data structure
* @chip: Optional: associated interrupt chip
* @chip_data: Optional: associated interrupt chip data
@@ -374,14 +376,15 @@ struct msi_domain_ops {
* @data: Optional: domain specific data
*/
struct msi_domain_info {
- u32 flags;
- struct msi_domain_ops *ops;
- struct irq_chip *chip;
- void *chip_data;
- irq_flow_handler_t handler;
- void *handler_data;
- const char *handler_name;
- void *data;
+ u32 flags;
+ enum irq_domain_bus_token bus_token;
+ struct msi_domain_ops *ops;
+ struct irq_chip *chip;
+ void *chip_data;
+ irq_flow_handler_t handler;
+ void *handler_data;
+ const char *handler_name;
+ void *data;
};
/* Flags for msi_domain_info */
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -694,8 +694,11 @@ struct irq_domain *msi_create_irq_domain
domain = irq_domain_create_hierarchy(parent, IRQ_DOMAIN_FLAG_MSI, 0,
fwnode, &msi_domain_ops, info);
- if (domain && !domain->name && info->chip)
- domain->name = info->chip->name;
+ if (domain) {
+ if (!domain->name && info->chip)
+ domain->name = info->chip->name;
+ irq_domain_update_bus_token(domain, info->bus_token);
+ }
return domain;
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
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>
---
include/linux/msi.h | 19 +++++++++++--------
kernel/irq/msi.c | 7 +++++--
2 files changed, 16 insertions(+), 10 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -16,6 +16,7 @@
* abuse. The only function which is relevant for drivers is msi_get_virq().
*/
+#include <linux/irqdomain_defs.h>
#include <linux/cpumask.h>
#include <linux/xarray.h>
#include <linux/mutex.h>
@@ -365,6 +366,7 @@ struct msi_domain_ops {
/**
* struct msi_domain_info - MSI interrupt domain data
* @flags: Flags to decribe features and capabilities
+ * @bus_token: The domain bus token
* @ops: The callback data structure
* @chip: Optional: associated interrupt chip
* @chip_data: Optional: associated interrupt chip data
@@ -374,14 +376,15 @@ struct msi_domain_ops {
* @data: Optional: domain specific data
*/
struct msi_domain_info {
- u32 flags;
- struct msi_domain_ops *ops;
- struct irq_chip *chip;
- void *chip_data;
- irq_flow_handler_t handler;
- void *handler_data;
- const char *handler_name;
- void *data;
+ u32 flags;
+ enum irq_domain_bus_token bus_token;
+ struct msi_domain_ops *ops;
+ struct irq_chip *chip;
+ void *chip_data;
+ irq_flow_handler_t handler;
+ void *handler_data;
+ const char *handler_name;
+ void *data;
};
/* Flags for msi_domain_info */
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -694,8 +694,11 @@ struct irq_domain *msi_create_irq_domain
domain = irq_domain_create_hierarchy(parent, IRQ_DOMAIN_FLAG_MSI, 0,
fwnode, &msi_domain_ops, info);
- if (domain && !domain->name && info->chip)
- domain->name = info->chip->name;
+ if (domain) {
+ if (!domain->name && info->chip)
+ domain->name = info->chip->name;
+ irq_domain_update_bus_token(domain, info->bus_token);
+ }
return domain;
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:49 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:49 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:33PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> 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>
> ---
> include/linux/msi.h | 19 +++++++++++--------
> kernel/irq/msi.c | 7 +++++--
> 2 files changed, 16 insertions(+), 10 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> struct msi_domain_info {
> - u32 flags;
> - struct msi_domain_ops *ops;
> - struct irq_chip *chip;
> - void *chip_data;
> - irq_flow_handler_t handler;
> - void *handler_data;
> - const char *handler_name;
> - void *data;
> + u32 flags;
> + enum irq_domain_bus_token bus_token;
> + struct msi_domain_ops *ops;
> + struct irq_chip *chip;
> + void *chip_data;
> + irq_flow_handler_t handler;
> + void *handler_data;
> + const char *handler_name;
> + void *data;
> };
This is why I've been frowning on horizontal alignment :(
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
@ 2022-11-16 17:49 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:49 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:33PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> 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>
> ---
> include/linux/msi.h | 19 +++++++++++--------
> kernel/irq/msi.c | 7 +++++--
> 2 files changed, 16 insertions(+), 10 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> struct msi_domain_info {
> - u32 flags;
> - struct msi_domain_ops *ops;
> - struct irq_chip *chip;
> - void *chip_data;
> - irq_flow_handler_t handler;
> - void *handler_data;
> - const char *handler_name;
> - void *data;
> + u32 flags;
> + enum irq_domain_bus_token bus_token;
> + struct msi_domain_ops *ops;
> + struct irq_chip *chip;
> + void *chip_data;
> + irq_flow_handler_t handler;
> + void *handler_data;
> + const char *handler_name;
> + void *data;
> };
This is why I've been frowning on horizontal alignment :(
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
2022-11-16 17:49 ` Jason Gunthorpe
@ 2022-11-16 22:50 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:50 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Wed, Nov 16 2022 at 13:49, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:33PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> 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>
>> ---
>> include/linux/msi.h | 19 +++++++++++--------
>> kernel/irq/msi.c | 7 +++++--
>> 2 files changed, 16 insertions(+), 10 deletions(-)
>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
>
>> struct msi_domain_info {
>> - u32 flags;
>> - struct msi_domain_ops *ops;
>> - struct irq_chip *chip;
>> - void *chip_data;
>> - irq_flow_handler_t handler;
>> - void *handler_data;
>> - const char *handler_name;
>> - void *data;
>> + u32 flags;
>> + enum irq_domain_bus_token bus_token;
>> + struct msi_domain_ops *ops;
>> + struct irq_chip *chip;
>> + void *chip_data;
>> + irq_flow_handler_t handler;
>> + void *handler_data;
>> + const char *handler_name;
>> + void *data;
>> };
>
> This is why I've been frowning on horizontal alignment :(
Yes, it's annoying when you have to adjust it, but it's fundamentaly
simpler to parse than the clogged together word salad.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 12/39] genirq/msi: Add bus token to struct msi_domain_info
@ 2022-11-16 22:50 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:50 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Wed, Nov 16 2022 at 13:49, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:33PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> 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>
>> ---
>> include/linux/msi.h | 19 +++++++++++--------
>> kernel/irq/msi.c | 7 +++++--
>> 2 files changed, 16 insertions(+), 10 deletions(-)
>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
>
>> struct msi_domain_info {
>> - u32 flags;
>> - struct msi_domain_ops *ops;
>> - struct irq_chip *chip;
>> - void *chip_data;
>> - irq_flow_handler_t handler;
>> - void *handler_data;
>> - const char *handler_name;
>> - void *data;
>> + u32 flags;
>> + enum irq_domain_bus_token bus_token;
>> + struct msi_domain_ops *ops;
>> + struct irq_chip *chip;
>> + void *chip_data;
>> + irq_flow_handler_t handler;
>> + void *handler_data;
>> + const char *handler_name;
>> + void *data;
>> };
>
> This is why I've been frowning on horizontal alignment :(
Yes, it's annoying when you have to adjust it, but it's fundamentaly
simpler to parse than the clogged together word salad.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Add bus token to struct msi_domain_info
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ahmed S. Darwish, Jason Gunthorpe, x86,
linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 22db089a4437a72277677f99717af499560b13f2
Gitweb: https://git.kernel.org/tip/22db089a4437a72277677f99717af499560b13f2
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:33 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
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
---
include/linux/msi.h | 19 +++++++++++--------
kernel/irq/msi.c | 7 +++++--
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/include/linux/msi.h b/include/linux/msi.h
index ee735ff..2dfd7b2 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -16,6 +16,7 @@
* abuse. The only function which is relevant for drivers is msi_get_virq().
*/
+#include <linux/irqdomain_defs.h>
#include <linux/cpumask.h>
#include <linux/xarray.h>
#include <linux/mutex.h>
@@ -365,6 +366,7 @@ struct msi_domain_ops {
/**
* struct msi_domain_info - MSI interrupt domain data
* @flags: Flags to decribe features and capabilities
+ * @bus_token: The domain bus token
* @ops: The callback data structure
* @chip: Optional: associated interrupt chip
* @chip_data: Optional: associated interrupt chip data
@@ -374,14 +376,15 @@ struct msi_domain_ops {
* @data: Optional: domain specific data
*/
struct msi_domain_info {
- u32 flags;
- struct msi_domain_ops *ops;
- struct irq_chip *chip;
- void *chip_data;
- irq_flow_handler_t handler;
- void *handler_data;
- const char *handler_name;
- void *data;
+ u32 flags;
+ enum irq_domain_bus_token bus_token;
+ struct msi_domain_ops *ops;
+ struct irq_chip *chip;
+ void *chip_data;
+ irq_flow_handler_t handler;
+ void *handler_data;
+ const char *handler_name;
+ void *data;
};
/* Flags for msi_domain_info */
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index a2efa00..b46b747 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -694,8 +694,11 @@ struct irq_domain *msi_create_irq_domain(struct fwnode_handle *fwnode,
domain = irq_domain_create_hierarchy(parent, IRQ_DOMAIN_FLAG_MSI, 0,
fwnode, &msi_domain_ops, info);
- if (domain && !domain->name && info->chip)
- domain->name = info->chip->name;
+ if (domain) {
+ if (!domain->name && info->chip)
+ domain->name = info->chip->name;
+ irq_domain_update_bus_token(domain, info->bus_token);
+ }
return domain;
}
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
Set the bus token in the msi_domain_info structure and let the core code
handle the update.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
struct msi_domain_info *info,
struct irq_domain *parent)
{
- struct irq_domain *domain;
-
if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
@@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
/* PCI-MSI is oneshot-safe */
info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
+ /* Let the core update the bus token */
+ info->bus_token = DOMAIN_BUS_PCI_MSI;
- domain = msi_create_irq_domain(fwnode, info, parent);
- if (!domain)
- return NULL;
-
- irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI);
- return domain;
+ return msi_create_irq_domain(fwnode, info, parent);
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
Set the bus token in the msi_domain_info structure and let the core code
handle the update.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
struct msi_domain_info *info,
struct irq_domain *parent)
{
- struct irq_domain *domain;
-
if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
@@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
/* PCI-MSI is oneshot-safe */
info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
+ /* Let the core update the bus token */
+ info->bus_token = DOMAIN_BUS_PCI_MSI;
- domain = msi_create_irq_domain(fwnode, info, parent);
- if (!domain)
- return NULL;
-
- irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI);
- return domain;
+ return msi_create_irq_domain(fwnode, info, parent);
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:14 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:14 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Set the bus token in the msi_domain_info structure and let the core code
> handle the update.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
> struct msi_domain_info *info,
> struct irq_domain *parent)
> {
> - struct irq_domain *domain;
> -
> if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
> info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
>
> @@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
>
> /* PCI-MSI is oneshot-safe */
> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
> + /* Let the core update the bus token */
> + info->bus_token = DOMAIN_BUS_PCI_MSI;
>
> - domain = msi_create_irq_domain(fwnode, info, parent);
> - if (!domain)
> - return NULL;
> -
> - irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI);
> - return domain;
> + return msi_create_irq_domain(fwnode, info, parent);
> }
> EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
@ 2022-11-16 16:14 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:14 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Set the bus token in the msi_domain_info structure and let the core code
> handle the update.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
> struct msi_domain_info *info,
> struct irq_domain *parent)
> {
> - struct irq_domain *domain;
> -
> if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
> info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
>
> @@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
>
> /* PCI-MSI is oneshot-safe */
> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
> + /* Let the core update the bus token */
> + info->bus_token = DOMAIN_BUS_PCI_MSI;
>
> - domain = msi_create_irq_domain(fwnode, info, parent);
> - if (!domain)
> - return NULL;
> -
> - irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI);
> - return domain;
> + return msi_create_irq_domain(fwnode, info, parent);
> }
> EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:51 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:51 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Set the bus token in the msi_domain_info structure and let the core code
> handle the update.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
> struct msi_domain_info *info,
> struct irq_domain *parent)
> {
> - struct irq_domain *domain;
> -
> if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
> info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
>
> @@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
>
> /* PCI-MSI is oneshot-safe */
> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
> + /* Let the core update the bus token */
> + info->bus_token = DOMAIN_BUS_PCI_MSI;
comment seems a bit obvious
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Should the callers be updated to set this in their "struct
msi_domain_info" ?
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
@ 2022-11-16 17:51 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:51 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Set the bus token in the msi_domain_info structure and let the core code
> handle the update.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_do
> struct msi_domain_info *info,
> struct irq_domain *parent)
> {
> - struct irq_domain *domain;
> -
> if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
> info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
>
> @@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_do
>
> /* PCI-MSI is oneshot-safe */
> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
> + /* Let the core update the bus token */
> + info->bus_token = DOMAIN_BUS_PCI_MSI;
comment seems a bit obvious
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Should the callers be updated to set this in their "struct
msi_domain_info" ?
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
2022-11-16 17:51 ` Jason Gunthorpe
@ 2022-11-16 22:51 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:51 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Wed, Nov 16 2022 at 13:51, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
>> /* PCI-MSI is oneshot-safe */
>> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
>> + /* Let the core update the bus token */
>> + info->bus_token = DOMAIN_BUS_PCI_MSI;
>
> comment seems a bit obvious
:)
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
>
> Should the callers be updated to set this in their "struct
> msi_domain_info" ?
For PCI/MSI we can handle that in the core for all of them. :)
The other msi_domain_info usage in various places needs obviously
special care.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 13/39] PCI/MSI: Use msi_domain_info::bus_token
@ 2022-11-16 22:51 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 22:51 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Wed, Nov 16 2022 at 13:51, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:54:35PM +0100, Thomas Gleixner wrote:
>> /* PCI-MSI is oneshot-safe */
>> info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
>> + /* Let the core update the bus token */
>> + info->bus_token = DOMAIN_BUS_PCI_MSI;
>
> comment seems a bit obvious
:)
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
>
> Should the callers be updated to set this in their "struct
> msi_domain_info" ?
For PCI/MSI we can handle that in the core for all of them. :)
The other msi_domain_info usage in various places needs obviously
special care.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Use msi_domain_info:: Bus_token
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Jason Gunthorpe,
Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 38c0c10ae6a3d386c50e182227f606d8243124b8
Gitweb: https://git.kernel.org/tip/38c0c10ae6a3d386c50e182227f606d8243124b8
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:35 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
PCI/MSI: Use msi_domain_info:: Bus_token
Set the bus token in the msi_domain_info structure and let the core code
handle the update.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.352437595@linutronix.de
---
drivers/pci/msi/irqdomain.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c
index e9cf318..7766fa6 100644
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -162,8 +162,6 @@ struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent)
{
- struct irq_domain *domain;
-
if (WARN_ON(info->flags & MSI_FLAG_LEVEL_CAPABLE))
info->flags &= ~MSI_FLAG_LEVEL_CAPABLE;
@@ -178,13 +176,10 @@ struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
/* PCI-MSI is oneshot-safe */
info->chip->flags |= IRQCHIP_ONESHOT_SAFE;
+ /* Let the core update the bus token */
+ info->bus_token = DOMAIN_BUS_PCI_MSI;
- domain = msi_create_irq_domain(fwnode, info, parent);
- if (!domain)
- return NULL;
-
- irq_domain_update_bus_token(domain, DOMAIN_BUS_PCI_MSI);
- return domain;
+ return msi_create_irq_domain(fwnode, info, parent);
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 14/39] PCI/MSI: Let the MSI core free descriptors
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
Let the core do the freeing of descriptors and just keep it around for the
legacy case.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
struct irq_domain *domain;
domain = dev_get_msi_domain(&dev->dev);
- if (domain && irq_domain_is_hierarchy(domain))
+ if (domain && irq_domain_is_hierarchy(domain)) {
msi_domain_free_irqs_descs_locked(domain, &dev->dev);
- else
+ } else {
pci_msi_legacy_teardown_msi_irqs(dev);
- msi_free_msi_descs(&dev->dev);
+ msi_free_msi_descs(&dev->dev);
+ }
}
/**
@@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
pci_msi_domain_update_chip_ops(info);
+ /* Let the core code free MSI descriptors when freeing interrupts */
+ info->flags |= MSI_FLAG_FREE_MSI_DESCS;
+
info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
info->flags |= MSI_FLAG_MUST_REACTIVATE;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 14/39] PCI/MSI: Let the MSI core free descriptors
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
Let the core do the freeing of descriptors and just keep it around for the
legacy case.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
struct irq_domain *domain;
domain = dev_get_msi_domain(&dev->dev);
- if (domain && irq_domain_is_hierarchy(domain))
+ if (domain && irq_domain_is_hierarchy(domain)) {
msi_domain_free_irqs_descs_locked(domain, &dev->dev);
- else
+ } else {
pci_msi_legacy_teardown_msi_irqs(dev);
- msi_free_msi_descs(&dev->dev);
+ msi_free_msi_descs(&dev->dev);
+ }
}
/**
@@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
pci_msi_domain_update_chip_ops(info);
+ /* Let the core code free MSI descriptors when freeing interrupts */
+ info->flags |= MSI_FLAG_FREE_MSI_DESCS;
+
info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
info->flags |= MSI_FLAG_MUST_REACTIVATE;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 14/39] PCI/MSI: Let the MSI core free descriptors
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:15 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:15 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:37PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Let the core do the freeing of descriptors and just keep it around for the
> legacy case.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
> struct irq_domain *domain;
>
> domain = dev_get_msi_domain(&dev->dev);
> - if (domain && irq_domain_is_hierarchy(domain))
> + if (domain && irq_domain_is_hierarchy(domain)) {
> msi_domain_free_irqs_descs_locked(domain, &dev->dev);
> - else
> + } else {
> pci_msi_legacy_teardown_msi_irqs(dev);
> - msi_free_msi_descs(&dev->dev);
> + msi_free_msi_descs(&dev->dev);
> + }
> }
>
> /**
> @@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
> if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
> pci_msi_domain_update_chip_ops(info);
>
> + /* Let the core code free MSI descriptors when freeing interrupts */
> + info->flags |= MSI_FLAG_FREE_MSI_DESCS;
> +
> info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
> if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
> info->flags |= MSI_FLAG_MUST_REACTIVATE;
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 14/39] PCI/MSI: Let the MSI core free descriptors
@ 2022-11-16 16:15 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:15 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:37PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Let the core do the freeing of descriptors and just keep it around for the
> legacy case.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
> struct irq_domain *domain;
>
> domain = dev_get_msi_domain(&dev->dev);
> - if (domain && irq_domain_is_hierarchy(domain))
> + if (domain && irq_domain_is_hierarchy(domain)) {
> msi_domain_free_irqs_descs_locked(domain, &dev->dev);
> - else
> + } else {
> pci_msi_legacy_teardown_msi_irqs(dev);
> - msi_free_msi_descs(&dev->dev);
> + msi_free_msi_descs(&dev->dev);
> + }
> }
>
> /**
> @@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
> if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
> pci_msi_domain_update_chip_ops(info);
>
> + /* Let the core code free MSI descriptors when freeing interrupts */
> + info->flags |= MSI_FLAG_FREE_MSI_DESCS;
> +
> info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
> if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
> info->flags |= MSI_FLAG_MUST_REACTIVATE;
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 14/39] PCI/MSI: Let the MSI core free descriptors
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:53 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:53 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:37PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Let the core do the freeing of descriptors and just keep it around for the
> legacy case.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
> struct irq_domain *domain;
>
> domain = dev_get_msi_domain(&dev->dev);
> - if (domain && irq_domain_is_hierarchy(domain))
> + if (domain && irq_domain_is_hierarchy(domain)) {
> msi_domain_free_irqs_descs_locked(domain, &dev->dev);
> - else
> + } else {
> pci_msi_legacy_teardown_msi_irqs(dev);
> - msi_free_msi_descs(&dev->dev);
> + msi_free_msi_descs(&dev->dev);
> + }
> }
>
> /**
> @@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
> if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
> pci_msi_domain_update_chip_ops(info);
>
> + /* Let the core code free MSI descriptors when freeing interrupts */
> + info->flags |= MSI_FLAG_FREE_MSI_DESCS;
Comment repeats the one on the enum declaration?
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 14/39] PCI/MSI: Let the MSI core free descriptors
@ 2022-11-16 17:53 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:53 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:37PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Let the core do the freeing of descriptors and just keep it around for the
> legacy case.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pc
> struct irq_domain *domain;
>
> domain = dev_get_msi_domain(&dev->dev);
> - if (domain && irq_domain_is_hierarchy(domain))
> + if (domain && irq_domain_is_hierarchy(domain)) {
> msi_domain_free_irqs_descs_locked(domain, &dev->dev);
> - else
> + } else {
> pci_msi_legacy_teardown_msi_irqs(dev);
> - msi_free_msi_descs(&dev->dev);
> + msi_free_msi_descs(&dev->dev);
> + }
> }
>
> /**
> @@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_do
> if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
> pci_msi_domain_update_chip_ops(info);
>
> + /* Let the core code free MSI descriptors when freeing interrupts */
> + info->flags |= MSI_FLAG_FREE_MSI_DESCS;
Comment repeats the one on the enum declaration?
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Let the MSI core free descriptors
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Jason Gunthorpe,
Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: b2bdda205c0c256d6483231d0afe58a6d68fd3ed
Gitweb: https://git.kernel.org/tip/b2bdda205c0c256d6483231d0afe58a6d68fd3ed
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:37 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
PCI/MSI: Let the MSI core free descriptors
Let the core do the freeing of descriptors and just keep it around for the
legacy case.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.409654736@linutronix.de
---
drivers/pci/msi/irqdomain.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c
index 7766fa6..edd0cc2 100644
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -24,11 +24,12 @@ void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
struct irq_domain *domain;
domain = dev_get_msi_domain(&dev->dev);
- if (domain && irq_domain_is_hierarchy(domain))
+ if (domain && irq_domain_is_hierarchy(domain)) {
msi_domain_free_irqs_descs_locked(domain, &dev->dev);
- else
+ } else {
pci_msi_legacy_teardown_msi_irqs(dev);
- msi_free_msi_descs(&dev->dev);
+ msi_free_msi_descs(&dev->dev);
+ }
}
/**
@@ -170,6 +171,9 @@ struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
pci_msi_domain_update_chip_ops(info);
+ /* Let the core code free MSI descriptors when freeing interrupts */
+ info->flags |= MSI_FLAG_FREE_MSI_DESCS;
+
info->flags |= MSI_FLAG_ACTIVATE_EARLY | MSI_FLAG_DEV_SYSFS;
if (IS_ENABLED(CONFIG_GENERIC_IRQ_RESERVATION_MODE))
info->flags |= MSI_FLAG_MUST_REACTIVATE;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
What a zoo:
PCI_MSI
select GENERIC_MSI_IRQ
PCI_MSI_IRQ_DOMAIN
def_bool y
depends on PCI_MSI
select GENERIC_MSI_IRQ_DOMAIN
Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
just an indirection to PCI_MSI.
Match the reality and just admit that PCI_MSI requires
GENERIC_MSI_IRQ_DOMAIN.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/um/drivers/Kconfig | 1
arch/um/include/asm/pci.h | 2 -
arch/x86/Kconfig | 1
arch/x86/include/asm/pci.h | 4 +-
drivers/pci/Kconfig | 8 +----
drivers/pci/controller/Kconfig | 30 +++++++++-----------
drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
drivers/pci/controller/mobiveil/Kconfig | 6 ++--
drivers/pci/msi/Makefile | 2 -
drivers/pci/probe.c | 2 -
include/linux/msi.h | 32 ++++++---------------
11 files changed, 56 insertions(+), 80 deletions(-)
--- a/arch/um/drivers/Kconfig
+++ b/arch/um/drivers/Kconfig
@@ -381,7 +381,6 @@ config UML_PCI_OVER_VIRTIO
select UML_IOMEM_EMULATION
select UML_DMA_EMULATION
select PCI_MSI
- select PCI_MSI_IRQ_DOMAIN
select PCI_LOCKLESS_CONFIG
config UML_PCI_OVER_VIRTIO_DEVICE_ID
--- a/arch/um/include/asm/pci.h
+++ b/arch/um/include/asm/pci.h
@@ -7,7 +7,7 @@
/* Generic PCI */
#include <asm-generic/pci.h>
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
/*
* This is a bit of an annoying hack, and it assumes we only have
* the virt-pci (if anything). Which is true, but still.
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1109,7 +1109,6 @@ config X86_LOCAL_APIC
def_bool y
depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC || PCI_MSI
select IRQ_DOMAIN_HIERARCHY
- select PCI_MSI_IRQ_DOMAIN if PCI_MSI
config X86_IO_APIC
def_bool y
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -21,7 +21,7 @@ struct pci_sysdata {
#ifdef CONFIG_X86_64
void *iommu; /* IOMMU private data */
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
void *fwnode; /* IRQ domain for MSI assignment */
#endif
#if IS_ENABLED(CONFIG_VMD)
@@ -52,7 +52,7 @@ static inline int pci_proc_domain(struct
}
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
{
return to_pci_sysdata(bus)->fwnode;
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,6 +38,7 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
+ select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
@@ -51,11 +52,6 @@ config PCI_MSI
If you don't know what to do here, say Y.
-config PCI_MSI_IRQ_DOMAIN
- def_bool y
- depends on PCI_MSI
- select GENERIC_MSI_IRQ_DOMAIN
-
config PCI_MSI_ARCH_FALLBACKS
bool
@@ -192,7 +188,7 @@ config PCI_LABEL
config PCI_HYPERV
tristate "Hyper-V PCI Frontend"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && SYSFS
select PCI_HYPERV_INTERFACE
help
The PCI device frontend driver allows the kernel to import arbitrary
--- a/drivers/pci/controller/Kconfig
+++ b/drivers/pci/controller/Kconfig
@@ -19,7 +19,7 @@ config PCI_AARDVARK
tristate "Aardvark PCIe controller"
depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_BRIDGE_EMUL
help
Add support for Aardvark 64bit PCIe Host Controller. This
@@ -29,7 +29,7 @@ config PCI_AARDVARK
config PCIE_XILINX_NWL
bool "NWL PCIe Core"
depends on ARCH_ZYNQMP || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel support for Xilinx
NWL PCIe controller. The controller can act as Root Port
@@ -53,7 +53,7 @@ config PCI_IXP4XX
config PCI_TEGRA
bool "NVIDIA Tegra PCIe controller"
depends on ARCH_TEGRA || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want support for the PCIe host controller found
on NVIDIA Tegra SoCs.
@@ -70,7 +70,7 @@ config PCI_RCAR_GEN2
config PCIE_RCAR_HOST
bool "Renesas R-Car PCIe host controller"
depends on ARCH_RENESAS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe controller support on R-Car SoCs in host
mode.
@@ -99,7 +99,7 @@ config PCI_HOST_GENERIC
config PCIE_XILINX
bool "Xilinx AXI PCIe host bridge support"
depends on OF || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
Host Bridge driver.
@@ -124,7 +124,7 @@ config PCI_XGENE
config PCI_XGENE_MSI
bool "X-Gene v1 PCIe MSI feature"
depends on PCI_XGENE
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default y
help
Say Y here if you want PCIe MSI support for the APM X-Gene v1 SoC.
@@ -170,7 +170,7 @@ config PCIE_IPROC_BCMA
config PCIE_IPROC_MSI
bool "Broadcom iProc PCIe MSI support"
depends on PCIE_IPROC_PLATFORM || PCIE_IPROC_BCMA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BCM_IPROC
help
Say Y here if you want to enable MSI support for Broadcom's iProc
@@ -186,7 +186,7 @@ config PCIE_ALTERA
config PCIE_ALTERA_MSI
tristate "Altera PCIe MSI feature"
depends on PCIE_ALTERA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe MSI support for the Altera FPGA.
This MSI driver supports Altera MSI to GIC controller IP.
@@ -215,7 +215,7 @@ config PCIE_ROCKCHIP_HOST
tristate "Rockchip PCIe host controller"
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select MFD_SYSCON
select PCIE_ROCKCHIP
help
@@ -239,7 +239,7 @@ config PCIE_MEDIATEK
tristate "MediaTek PCIe controller"
depends on ARCH_AIROHA || ARCH_MEDIATEK || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want to enable PCIe controller support on
MediaTek SoCs.
@@ -247,7 +247,7 @@ config PCIE_MEDIATEK
config PCIE_MEDIATEK_GEN3
tristate "MediaTek Gen3 PCIe controller"
depends on ARCH_MEDIATEK || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Adds support for PCIe Gen3 MAC controller for MediaTek SoCs.
This PCIe controller is compatible with Gen3, Gen2 and Gen1 speed,
@@ -277,7 +277,7 @@ config PCIE_BRCMSTB
depends on ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCMBCA || \
BMIPS_GENERIC || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BRCMSTB || BMIPS_GENERIC
help
Say Y here to enable PCIe host controller support for
@@ -285,7 +285,7 @@ config PCIE_BRCMSTB
config PCI_HYPERV_INTERFACE
tristate "Hyper-V PCI Interface"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI
help
The Hyper-V PCI Interface is a helper driver allows other drivers to
have a common interface with the Hyper-V PCI frontend driver.
@@ -303,8 +303,6 @@ config PCI_LOONGSON
config PCIE_MICROCHIP_HOST
bool "Microchip AXI PCIe host bridge support"
depends on PCI_MSI && OF
- select PCI_MSI_IRQ_DOMAIN
- select GENERIC_MSI_IRQ_DOMAIN
select PCI_HOST_COMMON
help
Say Y here if you want kernel to support the Microchip AXI PCIe
@@ -326,7 +324,7 @@ config PCIE_APPLE
tristate "Apple PCIe controller"
depends on ARCH_APPLE || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_HOST_COMMON
help
Say Y here if you want to enable PCIe controller support on Apple
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -21,7 +21,7 @@ config PCI_DRA7XX_HOST
tristate "TI DRA7xx PCIe controller Host Mode"
depends on SOC_DRA7XX || COMPILE_TEST
depends on OF && HAS_IOMEM && TI_PIPE3
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_DRA7XX
default y if SOC_DRA7XX
@@ -53,7 +53,7 @@ config PCIE_DW_PLAT
config PCIE_DW_PLAT_HOST
bool "Platform bus based DesignWare PCIe Controller - Host mode"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_DW_PLAT
help
@@ -67,7 +67,7 @@ config PCIE_DW_PLAT_HOST
config PCIE_DW_PLAT_EP
bool "Platform bus based DesignWare PCIe Controller - Endpoint mode"
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI && PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_DW_PLAT
@@ -83,7 +83,7 @@ config PCIE_DW_PLAT_EP
config PCI_EXYNOS
tristate "Samsung Exynos PCIe controller"
depends on ARCH_EXYNOS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Enables support for the PCIe controller in the Samsung Exynos SoCs
@@ -94,13 +94,13 @@ config PCI_EXYNOS
config PCI_IMX6
bool "Freescale i.MX6/7/8 PCIe controller"
depends on ARCH_MXC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
config PCIE_SPEAR13XX
bool "STMicroelectronics SPEAr PCIe controller"
depends on ARCH_SPEAR13XX || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe support on SPEAr13XX SoCs.
@@ -111,7 +111,7 @@ config PCI_KEYSTONE
config PCI_KEYSTONE_HOST
bool "PCI Keystone Host Mode"
depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_KEYSTONE
help
@@ -135,7 +135,7 @@ config PCI_KEYSTONE_EP
config PCI_LAYERSCAPE
bool "Freescale Layerscape PCIe controller - Host mode"
depends on OF && (ARM || ARCH_LAYERSCAPE || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select MFD_SYSCON
help
@@ -160,7 +160,7 @@ config PCI_LAYERSCAPE_EP
config PCI_HISI
depends on OF && (ARM64 || COMPILE_TEST)
bool "HiSilicon Hip05 and Hip06 SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_HOST_COMMON
help
@@ -170,7 +170,7 @@ config PCI_HISI
config PCIE_QCOM
bool "Qualcomm PCIe controller"
depends on OF && (ARCH_QCOM || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select CRC8
help
@@ -191,7 +191,7 @@ config PCIE_QCOM_EP
config PCIE_ARMADA_8K
bool "Marvell Armada-8K PCIe controller"
depends on ARCH_MVEBU || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCIe controller support on
@@ -205,7 +205,7 @@ config PCIE_ARTPEC6
config PCIE_ARTPEC6_HOST
bool "Axis ARTPEC-6 PCIe controller Host Mode"
depends on MACH_ARTPEC6 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_ARTPEC6
help
@@ -226,7 +226,7 @@ config PCIE_ROCKCHIP_DW_HOST
bool "Rockchip DesignWare PCIe controller"
select PCIE_DW
select PCIE_DW_HOST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
help
@@ -236,7 +236,7 @@ config PCIE_ROCKCHIP_DW_HOST
config PCIE_INTEL_GW
bool "Intel Gateway PCIe host controller support"
depends on OF && (X86 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say 'Y' here to enable PCIe Host controller support on Intel
@@ -250,7 +250,7 @@ config PCIE_KEEMBAY
config PCIE_KEEMBAY_HOST
bool "Intel Keem Bay PCIe controller - Host mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_KEEMBAY
help
@@ -262,7 +262,7 @@ config PCIE_KEEMBAY_HOST
config PCIE_KEEMBAY_EP
bool "Intel Keem Bay PCIe controller - Endpoint mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_KEEMBAY
@@ -275,7 +275,7 @@ config PCIE_KEEMBAY_EP
config PCIE_KIRIN
depends on OF && (ARM64 || COMPILE_TEST)
tristate "HiSilicon Kirin series SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support
@@ -284,7 +284,7 @@ config PCIE_KIRIN
config PCIE_HISI_STB
bool "HiSilicon STB SoCs PCIe controllers"
depends on ARCH_HISI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on HiSilicon STB SoCs
@@ -292,7 +292,7 @@ config PCIE_HISI_STB
config PCI_MESON
tristate "MESON PCIe controller"
default m if ARCH_MESON
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCI controller support on Amlogic
@@ -306,7 +306,7 @@ config PCIE_TEGRA194
config PCIE_TEGRA194_HOST
tristate "NVIDIA Tegra194 (and later) PCIe controller - Host Mode"
depends on ARCH_TEGRA_194_SOC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PHY_TEGRA194_P2U
select PCIE_TEGRA194
@@ -336,7 +336,7 @@ config PCIE_TEGRA194_EP
config PCIE_VISCONTI_HOST
bool "Toshiba Visconti PCIe controllers"
depends on ARCH_VISCONTI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on Toshiba Visconti SoC.
@@ -346,7 +346,7 @@ config PCIE_UNIPHIER
bool "Socionext UniPhier PCIe host controllers"
depends on ARCH_UNIPHIER || COMPILE_TEST
depends on OF && HAS_IOMEM
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe host controller support on UniPhier SoCs.
@@ -365,7 +365,7 @@ config PCIE_UNIPHIER_EP
config PCIE_AL
bool "Amazon Annapurna Labs PCIe controller"
depends on OF && (ARM64 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_ECAM
help
@@ -377,7 +377,7 @@ config PCIE_AL
config PCIE_FU740
bool "SiFive FU740 PCIe host controller"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on SOC_SIFIVE || COMPILE_TEST
select PCIE_DW_HOST
help
--- a/drivers/pci/controller/mobiveil/Kconfig
+++ b/drivers/pci/controller/mobiveil/Kconfig
@@ -8,14 +8,14 @@ config PCIE_MOBIVEIL
config PCIE_MOBIVEIL_HOST
bool
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL
config PCIE_MOBIVEIL_PLAT
bool "Mobiveil AXI PCIe controller"
depends on ARCH_ZYNQMP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want to enable support for the Mobiveil AXI PCIe
@@ -25,7 +25,7 @@ config PCIE_MOBIVEIL_PLAT
config PCIE_LAYERSCAPE_GEN4
bool "Freescale Layerscape PCIe Gen4 controller"
depends on ARCH_LAYERSCAPE || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want PCIe Gen4 controller support on
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -3,5 +3,5 @@
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI_IRQ_DOMAIN) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridg
if (!d)
d = pci_host_bridge_acpi_msi_domain(bus);
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
/*
* If no IRQ domain was found via the OF tree, try looking it up
* directly through the fwnode_handle.
@@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridg
d = irq_find_matching_fwnode(fwnode,
DOMAIN_BUS_PCI_MSI);
}
-#endif
return d;
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -238,15 +238,6 @@ static inline void msi_desc_set_iommu_co
}
#endif
-#ifdef CONFIG_PCI_MSI
-struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
-void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
-#else /* CONFIG_PCI_MSI */
-static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
-#endif /* CONFIG_PCI_MSI */
-
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
@@ -259,12 +250,6 @@ static inline void msi_free_msi_descs(st
msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
-void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-
-void pci_msi_mask_irq(struct irq_data *data);
-void pci_msi_unmask_irq(struct irq_data *data);
-
/*
* The arch hooks to setup up msi irqs. Default functions are implemented
* as weak symbols so that they /can/ be overriden by architecture specific
@@ -466,20 +451,21 @@ int platform_msi_device_domain_alloc(str
void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nvec);
void *platform_msi_get_host_data(struct irq_domain *domain);
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+/* PCI specific interfaces */
+struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
+void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
+void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void pci_msi_mask_irq(struct irq_data *data);
+void pci_msi_unmask_irq(struct irq_data *data);
struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
-#else
-static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
-{
- return NULL;
-}
-#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
+
+#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
#endif /* LINUX_MSI_H */
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
What a zoo:
PCI_MSI
select GENERIC_MSI_IRQ
PCI_MSI_IRQ_DOMAIN
def_bool y
depends on PCI_MSI
select GENERIC_MSI_IRQ_DOMAIN
Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
just an indirection to PCI_MSI.
Match the reality and just admit that PCI_MSI requires
GENERIC_MSI_IRQ_DOMAIN.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/um/drivers/Kconfig | 1
arch/um/include/asm/pci.h | 2 -
arch/x86/Kconfig | 1
arch/x86/include/asm/pci.h | 4 +-
drivers/pci/Kconfig | 8 +----
drivers/pci/controller/Kconfig | 30 +++++++++-----------
drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
drivers/pci/controller/mobiveil/Kconfig | 6 ++--
drivers/pci/msi/Makefile | 2 -
drivers/pci/probe.c | 2 -
include/linux/msi.h | 32 ++++++---------------
11 files changed, 56 insertions(+), 80 deletions(-)
--- a/arch/um/drivers/Kconfig
+++ b/arch/um/drivers/Kconfig
@@ -381,7 +381,6 @@ config UML_PCI_OVER_VIRTIO
select UML_IOMEM_EMULATION
select UML_DMA_EMULATION
select PCI_MSI
- select PCI_MSI_IRQ_DOMAIN
select PCI_LOCKLESS_CONFIG
config UML_PCI_OVER_VIRTIO_DEVICE_ID
--- a/arch/um/include/asm/pci.h
+++ b/arch/um/include/asm/pci.h
@@ -7,7 +7,7 @@
/* Generic PCI */
#include <asm-generic/pci.h>
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
/*
* This is a bit of an annoying hack, and it assumes we only have
* the virt-pci (if anything). Which is true, but still.
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1109,7 +1109,6 @@ config X86_LOCAL_APIC
def_bool y
depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC || PCI_MSI
select IRQ_DOMAIN_HIERARCHY
- select PCI_MSI_IRQ_DOMAIN if PCI_MSI
config X86_IO_APIC
def_bool y
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -21,7 +21,7 @@ struct pci_sysdata {
#ifdef CONFIG_X86_64
void *iommu; /* IOMMU private data */
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
void *fwnode; /* IRQ domain for MSI assignment */
#endif
#if IS_ENABLED(CONFIG_VMD)
@@ -52,7 +52,7 @@ static inline int pci_proc_domain(struct
}
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
{
return to_pci_sysdata(bus)->fwnode;
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,6 +38,7 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
+ select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
@@ -51,11 +52,6 @@ config PCI_MSI
If you don't know what to do here, say Y.
-config PCI_MSI_IRQ_DOMAIN
- def_bool y
- depends on PCI_MSI
- select GENERIC_MSI_IRQ_DOMAIN
-
config PCI_MSI_ARCH_FALLBACKS
bool
@@ -192,7 +188,7 @@ config PCI_LABEL
config PCI_HYPERV
tristate "Hyper-V PCI Frontend"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && SYSFS
select PCI_HYPERV_INTERFACE
help
The PCI device frontend driver allows the kernel to import arbitrary
--- a/drivers/pci/controller/Kconfig
+++ b/drivers/pci/controller/Kconfig
@@ -19,7 +19,7 @@ config PCI_AARDVARK
tristate "Aardvark PCIe controller"
depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_BRIDGE_EMUL
help
Add support for Aardvark 64bit PCIe Host Controller. This
@@ -29,7 +29,7 @@ config PCI_AARDVARK
config PCIE_XILINX_NWL
bool "NWL PCIe Core"
depends on ARCH_ZYNQMP || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel support for Xilinx
NWL PCIe controller. The controller can act as Root Port
@@ -53,7 +53,7 @@ config PCI_IXP4XX
config PCI_TEGRA
bool "NVIDIA Tegra PCIe controller"
depends on ARCH_TEGRA || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want support for the PCIe host controller found
on NVIDIA Tegra SoCs.
@@ -70,7 +70,7 @@ config PCI_RCAR_GEN2
config PCIE_RCAR_HOST
bool "Renesas R-Car PCIe host controller"
depends on ARCH_RENESAS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe controller support on R-Car SoCs in host
mode.
@@ -99,7 +99,7 @@ config PCI_HOST_GENERIC
config PCIE_XILINX
bool "Xilinx AXI PCIe host bridge support"
depends on OF || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
Host Bridge driver.
@@ -124,7 +124,7 @@ config PCI_XGENE
config PCI_XGENE_MSI
bool "X-Gene v1 PCIe MSI feature"
depends on PCI_XGENE
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default y
help
Say Y here if you want PCIe MSI support for the APM X-Gene v1 SoC.
@@ -170,7 +170,7 @@ config PCIE_IPROC_BCMA
config PCIE_IPROC_MSI
bool "Broadcom iProc PCIe MSI support"
depends on PCIE_IPROC_PLATFORM || PCIE_IPROC_BCMA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BCM_IPROC
help
Say Y here if you want to enable MSI support for Broadcom's iProc
@@ -186,7 +186,7 @@ config PCIE_ALTERA
config PCIE_ALTERA_MSI
tristate "Altera PCIe MSI feature"
depends on PCIE_ALTERA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe MSI support for the Altera FPGA.
This MSI driver supports Altera MSI to GIC controller IP.
@@ -215,7 +215,7 @@ config PCIE_ROCKCHIP_HOST
tristate "Rockchip PCIe host controller"
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select MFD_SYSCON
select PCIE_ROCKCHIP
help
@@ -239,7 +239,7 @@ config PCIE_MEDIATEK
tristate "MediaTek PCIe controller"
depends on ARCH_AIROHA || ARCH_MEDIATEK || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want to enable PCIe controller support on
MediaTek SoCs.
@@ -247,7 +247,7 @@ config PCIE_MEDIATEK
config PCIE_MEDIATEK_GEN3
tristate "MediaTek Gen3 PCIe controller"
depends on ARCH_MEDIATEK || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Adds support for PCIe Gen3 MAC controller for MediaTek SoCs.
This PCIe controller is compatible with Gen3, Gen2 and Gen1 speed,
@@ -277,7 +277,7 @@ config PCIE_BRCMSTB
depends on ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCMBCA || \
BMIPS_GENERIC || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BRCMSTB || BMIPS_GENERIC
help
Say Y here to enable PCIe host controller support for
@@ -285,7 +285,7 @@ config PCIE_BRCMSTB
config PCI_HYPERV_INTERFACE
tristate "Hyper-V PCI Interface"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI
help
The Hyper-V PCI Interface is a helper driver allows other drivers to
have a common interface with the Hyper-V PCI frontend driver.
@@ -303,8 +303,6 @@ config PCI_LOONGSON
config PCIE_MICROCHIP_HOST
bool "Microchip AXI PCIe host bridge support"
depends on PCI_MSI && OF
- select PCI_MSI_IRQ_DOMAIN
- select GENERIC_MSI_IRQ_DOMAIN
select PCI_HOST_COMMON
help
Say Y here if you want kernel to support the Microchip AXI PCIe
@@ -326,7 +324,7 @@ config PCIE_APPLE
tristate "Apple PCIe controller"
depends on ARCH_APPLE || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_HOST_COMMON
help
Say Y here if you want to enable PCIe controller support on Apple
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -21,7 +21,7 @@ config PCI_DRA7XX_HOST
tristate "TI DRA7xx PCIe controller Host Mode"
depends on SOC_DRA7XX || COMPILE_TEST
depends on OF && HAS_IOMEM && TI_PIPE3
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_DRA7XX
default y if SOC_DRA7XX
@@ -53,7 +53,7 @@ config PCIE_DW_PLAT
config PCIE_DW_PLAT_HOST
bool "Platform bus based DesignWare PCIe Controller - Host mode"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_DW_PLAT
help
@@ -67,7 +67,7 @@ config PCIE_DW_PLAT_HOST
config PCIE_DW_PLAT_EP
bool "Platform bus based DesignWare PCIe Controller - Endpoint mode"
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI && PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_DW_PLAT
@@ -83,7 +83,7 @@ config PCIE_DW_PLAT_EP
config PCI_EXYNOS
tristate "Samsung Exynos PCIe controller"
depends on ARCH_EXYNOS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Enables support for the PCIe controller in the Samsung Exynos SoCs
@@ -94,13 +94,13 @@ config PCI_EXYNOS
config PCI_IMX6
bool "Freescale i.MX6/7/8 PCIe controller"
depends on ARCH_MXC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
config PCIE_SPEAR13XX
bool "STMicroelectronics SPEAr PCIe controller"
depends on ARCH_SPEAR13XX || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe support on SPEAr13XX SoCs.
@@ -111,7 +111,7 @@ config PCI_KEYSTONE
config PCI_KEYSTONE_HOST
bool "PCI Keystone Host Mode"
depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_KEYSTONE
help
@@ -135,7 +135,7 @@ config PCI_KEYSTONE_EP
config PCI_LAYERSCAPE
bool "Freescale Layerscape PCIe controller - Host mode"
depends on OF && (ARM || ARCH_LAYERSCAPE || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select MFD_SYSCON
help
@@ -160,7 +160,7 @@ config PCI_LAYERSCAPE_EP
config PCI_HISI
depends on OF && (ARM64 || COMPILE_TEST)
bool "HiSilicon Hip05 and Hip06 SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_HOST_COMMON
help
@@ -170,7 +170,7 @@ config PCI_HISI
config PCIE_QCOM
bool "Qualcomm PCIe controller"
depends on OF && (ARCH_QCOM || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select CRC8
help
@@ -191,7 +191,7 @@ config PCIE_QCOM_EP
config PCIE_ARMADA_8K
bool "Marvell Armada-8K PCIe controller"
depends on ARCH_MVEBU || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCIe controller support on
@@ -205,7 +205,7 @@ config PCIE_ARTPEC6
config PCIE_ARTPEC6_HOST
bool "Axis ARTPEC-6 PCIe controller Host Mode"
depends on MACH_ARTPEC6 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_ARTPEC6
help
@@ -226,7 +226,7 @@ config PCIE_ROCKCHIP_DW_HOST
bool "Rockchip DesignWare PCIe controller"
select PCIE_DW
select PCIE_DW_HOST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
help
@@ -236,7 +236,7 @@ config PCIE_ROCKCHIP_DW_HOST
config PCIE_INTEL_GW
bool "Intel Gateway PCIe host controller support"
depends on OF && (X86 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say 'Y' here to enable PCIe Host controller support on Intel
@@ -250,7 +250,7 @@ config PCIE_KEEMBAY
config PCIE_KEEMBAY_HOST
bool "Intel Keem Bay PCIe controller - Host mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_KEEMBAY
help
@@ -262,7 +262,7 @@ config PCIE_KEEMBAY_HOST
config PCIE_KEEMBAY_EP
bool "Intel Keem Bay PCIe controller - Endpoint mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_KEEMBAY
@@ -275,7 +275,7 @@ config PCIE_KEEMBAY_EP
config PCIE_KIRIN
depends on OF && (ARM64 || COMPILE_TEST)
tristate "HiSilicon Kirin series SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support
@@ -284,7 +284,7 @@ config PCIE_KIRIN
config PCIE_HISI_STB
bool "HiSilicon STB SoCs PCIe controllers"
depends on ARCH_HISI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on HiSilicon STB SoCs
@@ -292,7 +292,7 @@ config PCIE_HISI_STB
config PCI_MESON
tristate "MESON PCIe controller"
default m if ARCH_MESON
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCI controller support on Amlogic
@@ -306,7 +306,7 @@ config PCIE_TEGRA194
config PCIE_TEGRA194_HOST
tristate "NVIDIA Tegra194 (and later) PCIe controller - Host Mode"
depends on ARCH_TEGRA_194_SOC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PHY_TEGRA194_P2U
select PCIE_TEGRA194
@@ -336,7 +336,7 @@ config PCIE_TEGRA194_EP
config PCIE_VISCONTI_HOST
bool "Toshiba Visconti PCIe controllers"
depends on ARCH_VISCONTI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on Toshiba Visconti SoC.
@@ -346,7 +346,7 @@ config PCIE_UNIPHIER
bool "Socionext UniPhier PCIe host controllers"
depends on ARCH_UNIPHIER || COMPILE_TEST
depends on OF && HAS_IOMEM
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe host controller support on UniPhier SoCs.
@@ -365,7 +365,7 @@ config PCIE_UNIPHIER_EP
config PCIE_AL
bool "Amazon Annapurna Labs PCIe controller"
depends on OF && (ARM64 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_ECAM
help
@@ -377,7 +377,7 @@ config PCIE_AL
config PCIE_FU740
bool "SiFive FU740 PCIe host controller"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on SOC_SIFIVE || COMPILE_TEST
select PCIE_DW_HOST
help
--- a/drivers/pci/controller/mobiveil/Kconfig
+++ b/drivers/pci/controller/mobiveil/Kconfig
@@ -8,14 +8,14 @@ config PCIE_MOBIVEIL
config PCIE_MOBIVEIL_HOST
bool
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL
config PCIE_MOBIVEIL_PLAT
bool "Mobiveil AXI PCIe controller"
depends on ARCH_ZYNQMP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want to enable support for the Mobiveil AXI PCIe
@@ -25,7 +25,7 @@ config PCIE_MOBIVEIL_PLAT
config PCIE_LAYERSCAPE_GEN4
bool "Freescale Layerscape PCIe Gen4 controller"
depends on ARCH_LAYERSCAPE || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want PCIe Gen4 controller support on
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -3,5 +3,5 @@
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI_IRQ_DOMAIN) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridg
if (!d)
d = pci_host_bridge_acpi_msi_domain(bus);
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
/*
* If no IRQ domain was found via the OF tree, try looking it up
* directly through the fwnode_handle.
@@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridg
d = irq_find_matching_fwnode(fwnode,
DOMAIN_BUS_PCI_MSI);
}
-#endif
return d;
}
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -238,15 +238,6 @@ static inline void msi_desc_set_iommu_co
}
#endif
-#ifdef CONFIG_PCI_MSI
-struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
-void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
-#else /* CONFIG_PCI_MSI */
-static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
-#endif /* CONFIG_PCI_MSI */
-
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
@@ -259,12 +250,6 @@ static inline void msi_free_msi_descs(st
msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
-void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-
-void pci_msi_mask_irq(struct irq_data *data);
-void pci_msi_unmask_irq(struct irq_data *data);
-
/*
* The arch hooks to setup up msi irqs. Default functions are implemented
* as weak symbols so that they /can/ be overriden by architecture specific
@@ -466,20 +451,21 @@ int platform_msi_device_domain_alloc(str
void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nvec);
void *platform_msi_get_host_data(struct irq_domain *domain);
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+/* PCI specific interfaces */
+struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
+void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
+void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void pci_msi_mask_irq(struct irq_data *data);
+void pci_msi_unmask_irq(struct irq_data *data);
struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
-#else
-static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
-{
- return NULL;
-}
-#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
+
+#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
#endif /* LINUX_MSI_H */
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:12 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:12 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
> What a zoo:
>
> PCI_MSI
> select GENERIC_MSI_IRQ
>
> PCI_MSI_IRQ_DOMAIN
> def_bool y
> depends on PCI_MSI
> select GENERIC_MSI_IRQ_DOMAIN
>
> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
> just an indirection to PCI_MSI.
>
> Match the reality and just admit that PCI_MSI requires
> GENERIC_MSI_IRQ_DOMAIN.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Just FYI, this will conflict with my work-in-progress to add more
COMPILE_TEST coverage:
https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=72b5e7c401a1
No *actual* conflicts, just textually next door, so should be sipmle
to resolve. Worst case I can postpone my patch until the next cycle.
> ---
> arch/um/drivers/Kconfig | 1
> arch/um/include/asm/pci.h | 2 -
> arch/x86/Kconfig | 1
> arch/x86/include/asm/pci.h | 4 +-
> drivers/pci/Kconfig | 8 +----
> drivers/pci/controller/Kconfig | 30 +++++++++-----------
> drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
> drivers/pci/controller/mobiveil/Kconfig | 6 ++--
> drivers/pci/msi/Makefile | 2 -
> drivers/pci/probe.c | 2 -
> include/linux/msi.h | 32 ++++++---------------
> 11 files changed, 56 insertions(+), 80 deletions(-)
>
> --- a/arch/um/drivers/Kconfig
> +++ b/arch/um/drivers/Kconfig
> @@ -381,7 +381,6 @@ config UML_PCI_OVER_VIRTIO
> select UML_IOMEM_EMULATION
> select UML_DMA_EMULATION
> select PCI_MSI
> - select PCI_MSI_IRQ_DOMAIN
> select PCI_LOCKLESS_CONFIG
>
> config UML_PCI_OVER_VIRTIO_DEVICE_ID
> --- a/arch/um/include/asm/pci.h
> +++ b/arch/um/include/asm/pci.h
> @@ -7,7 +7,7 @@
> /* Generic PCI */
> #include <asm-generic/pci.h>
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> /*
> * This is a bit of an annoying hack, and it assumes we only have
> * the virt-pci (if anything). Which is true, but still.
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -1109,7 +1109,6 @@ config X86_LOCAL_APIC
> def_bool y
> depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC || PCI_MSI
> select IRQ_DOMAIN_HIERARCHY
> - select PCI_MSI_IRQ_DOMAIN if PCI_MSI
>
> config X86_IO_APIC
> def_bool y
> --- a/arch/x86/include/asm/pci.h
> +++ b/arch/x86/include/asm/pci.h
> @@ -21,7 +21,7 @@ struct pci_sysdata {
> #ifdef CONFIG_X86_64
> void *iommu; /* IOMMU private data */
> #endif
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> void *fwnode; /* IRQ domain for MSI assignment */
> #endif
> #if IS_ENABLED(CONFIG_VMD)
> @@ -52,7 +52,7 @@ static inline int pci_proc_domain(struct
> }
> #endif
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
> {
> return to_pci_sysdata(bus)->fwnode;
> --- a/drivers/pci/Kconfig
> +++ b/drivers/pci/Kconfig
> @@ -38,6 +38,7 @@ source "drivers/pci/pcie/Kconfig"
>
> config PCI_MSI
> bool "Message Signaled Interrupts (MSI and MSI-X)"
> + select GENERIC_MSI_IRQ_DOMAIN
> select GENERIC_MSI_IRQ
> help
> This allows device drivers to enable MSI (Message Signaled
> @@ -51,11 +52,6 @@ config PCI_MSI
>
> If you don't know what to do here, say Y.
>
> -config PCI_MSI_IRQ_DOMAIN
> - def_bool y
> - depends on PCI_MSI
> - select GENERIC_MSI_IRQ_DOMAIN
> -
> config PCI_MSI_ARCH_FALLBACKS
> bool
>
> @@ -192,7 +188,7 @@ config PCI_LABEL
>
> config PCI_HYPERV
> tristate "Hyper-V PCI Frontend"
> - depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS
> + depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && SYSFS
> select PCI_HYPERV_INTERFACE
> help
> The PCI device frontend driver allows the kernel to import arbitrary
> --- a/drivers/pci/controller/Kconfig
> +++ b/drivers/pci/controller/Kconfig
> @@ -19,7 +19,7 @@ config PCI_AARDVARK
> tristate "Aardvark PCIe controller"
> depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCI_BRIDGE_EMUL
> help
> Add support for Aardvark 64bit PCIe Host Controller. This
> @@ -29,7 +29,7 @@ config PCI_AARDVARK
> config PCIE_XILINX_NWL
> bool "NWL PCIe Core"
> depends on ARCH_ZYNQMP || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say 'Y' here if you want kernel support for Xilinx
> NWL PCIe controller. The controller can act as Root Port
> @@ -53,7 +53,7 @@ config PCI_IXP4XX
> config PCI_TEGRA
> bool "NVIDIA Tegra PCIe controller"
> depends on ARCH_TEGRA || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want support for the PCIe host controller found
> on NVIDIA Tegra SoCs.
> @@ -70,7 +70,7 @@ config PCI_RCAR_GEN2
> config PCIE_RCAR_HOST
> bool "Renesas R-Car PCIe host controller"
> depends on ARCH_RENESAS || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want PCIe controller support on R-Car SoCs in host
> mode.
> @@ -99,7 +99,7 @@ config PCI_HOST_GENERIC
> config PCIE_XILINX
> bool "Xilinx AXI PCIe host bridge support"
> depends on OF || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
> Host Bridge driver.
> @@ -124,7 +124,7 @@ config PCI_XGENE
> config PCI_XGENE_MSI
> bool "X-Gene v1 PCIe MSI feature"
> depends on PCI_XGENE
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default y
> help
> Say Y here if you want PCIe MSI support for the APM X-Gene v1 SoC.
> @@ -170,7 +170,7 @@ config PCIE_IPROC_BCMA
> config PCIE_IPROC_MSI
> bool "Broadcom iProc PCIe MSI support"
> depends on PCIE_IPROC_PLATFORM || PCIE_IPROC_BCMA
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default ARCH_BCM_IPROC
> help
> Say Y here if you want to enable MSI support for Broadcom's iProc
> @@ -186,7 +186,7 @@ config PCIE_ALTERA
> config PCIE_ALTERA_MSI
> tristate "Altera PCIe MSI feature"
> depends on PCIE_ALTERA
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want PCIe MSI support for the Altera FPGA.
> This MSI driver supports Altera MSI to GIC controller IP.
> @@ -215,7 +215,7 @@ config PCIE_ROCKCHIP_HOST
> tristate "Rockchip PCIe host controller"
> depends on ARCH_ROCKCHIP || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select MFD_SYSCON
> select PCIE_ROCKCHIP
> help
> @@ -239,7 +239,7 @@ config PCIE_MEDIATEK
> tristate "MediaTek PCIe controller"
> depends on ARCH_AIROHA || ARCH_MEDIATEK || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want to enable PCIe controller support on
> MediaTek SoCs.
> @@ -247,7 +247,7 @@ config PCIE_MEDIATEK
> config PCIE_MEDIATEK_GEN3
> tristate "MediaTek Gen3 PCIe controller"
> depends on ARCH_MEDIATEK || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Adds support for PCIe Gen3 MAC controller for MediaTek SoCs.
> This PCIe controller is compatible with Gen3, Gen2 and Gen1 speed,
> @@ -277,7 +277,7 @@ config PCIE_BRCMSTB
> depends on ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCMBCA || \
> BMIPS_GENERIC || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default ARCH_BRCMSTB || BMIPS_GENERIC
> help
> Say Y here to enable PCIe host controller support for
> @@ -285,7 +285,7 @@ config PCIE_BRCMSTB
>
> config PCI_HYPERV_INTERFACE
> tristate "Hyper-V PCI Interface"
> - depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN
> + depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI
> help
> The Hyper-V PCI Interface is a helper driver allows other drivers to
> have a common interface with the Hyper-V PCI frontend driver.
> @@ -303,8 +303,6 @@ config PCI_LOONGSON
> config PCIE_MICROCHIP_HOST
> bool "Microchip AXI PCIe host bridge support"
> depends on PCI_MSI && OF
> - select PCI_MSI_IRQ_DOMAIN
> - select GENERIC_MSI_IRQ_DOMAIN
> select PCI_HOST_COMMON
> help
> Say Y here if you want kernel to support the Microchip AXI PCIe
> @@ -326,7 +324,7 @@ config PCIE_APPLE
> tristate "Apple PCIe controller"
> depends on ARCH_APPLE || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCI_HOST_COMMON
> help
> Say Y here if you want to enable PCIe controller support on Apple
> --- a/drivers/pci/controller/dwc/Kconfig
> +++ b/drivers/pci/controller/dwc/Kconfig
> @@ -21,7 +21,7 @@ config PCI_DRA7XX_HOST
> tristate "TI DRA7xx PCIe controller Host Mode"
> depends on SOC_DRA7XX || COMPILE_TEST
> depends on OF && HAS_IOMEM && TI_PIPE3
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_DRA7XX
> default y if SOC_DRA7XX
> @@ -53,7 +53,7 @@ config PCIE_DW_PLAT
>
> config PCIE_DW_PLAT_HOST
> bool "Platform bus based DesignWare PCIe Controller - Host mode"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_DW_PLAT
> help
> @@ -67,7 +67,7 @@ config PCIE_DW_PLAT_HOST
>
> config PCIE_DW_PLAT_EP
> bool "Platform bus based DesignWare PCIe Controller - Endpoint mode"
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI && PCI_MSI
> depends on PCI_ENDPOINT
> select PCIE_DW_EP
> select PCIE_DW_PLAT
> @@ -83,7 +83,7 @@ config PCIE_DW_PLAT_EP
> config PCI_EXYNOS
> tristate "Samsung Exynos PCIe controller"
> depends on ARCH_EXYNOS || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Enables support for the PCIe controller in the Samsung Exynos SoCs
> @@ -94,13 +94,13 @@ config PCI_EXYNOS
> config PCI_IMX6
> bool "Freescale i.MX6/7/8 PCIe controller"
> depends on ARCH_MXC || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
>
> config PCIE_SPEAR13XX
> bool "STMicroelectronics SPEAr PCIe controller"
> depends on ARCH_SPEAR13XX || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe support on SPEAr13XX SoCs.
> @@ -111,7 +111,7 @@ config PCI_KEYSTONE
> config PCI_KEYSTONE_HOST
> bool "PCI Keystone Host Mode"
> depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_KEYSTONE
> help
> @@ -135,7 +135,7 @@ config PCI_KEYSTONE_EP
> config PCI_LAYERSCAPE
> bool "Freescale Layerscape PCIe controller - Host mode"
> depends on OF && (ARM || ARCH_LAYERSCAPE || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select MFD_SYSCON
> help
> @@ -160,7 +160,7 @@ config PCI_LAYERSCAPE_EP
> config PCI_HISI
> depends on OF && (ARM64 || COMPILE_TEST)
> bool "HiSilicon Hip05 and Hip06 SoCs PCIe controllers"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_HOST_COMMON
> help
> @@ -170,7 +170,7 @@ config PCI_HISI
> config PCIE_QCOM
> bool "Qualcomm PCIe controller"
> depends on OF && (ARCH_QCOM || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select CRC8
> help
> @@ -191,7 +191,7 @@ config PCIE_QCOM_EP
> config PCIE_ARMADA_8K
> bool "Marvell Armada-8K PCIe controller"
> depends on ARCH_MVEBU || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want to enable PCIe controller support on
> @@ -205,7 +205,7 @@ config PCIE_ARTPEC6
> config PCIE_ARTPEC6_HOST
> bool "Axis ARTPEC-6 PCIe controller Host Mode"
> depends on MACH_ARTPEC6 || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_ARTPEC6
> help
> @@ -226,7 +226,7 @@ config PCIE_ROCKCHIP_DW_HOST
> bool "Rockchip DesignWare PCIe controller"
> select PCIE_DW
> select PCIE_DW_HOST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on ARCH_ROCKCHIP || COMPILE_TEST
> depends on OF
> help
> @@ -236,7 +236,7 @@ config PCIE_ROCKCHIP_DW_HOST
> config PCIE_INTEL_GW
> bool "Intel Gateway PCIe host controller support"
> depends on OF && (X86 || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say 'Y' here to enable PCIe Host controller support on Intel
> @@ -250,7 +250,7 @@ config PCIE_KEEMBAY
> config PCIE_KEEMBAY_HOST
> bool "Intel Keem Bay PCIe controller - Host mode"
> depends on ARCH_KEEMBAY || COMPILE_TEST
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_KEEMBAY
> help
> @@ -262,7 +262,7 @@ config PCIE_KEEMBAY_HOST
> config PCIE_KEEMBAY_EP
> bool "Intel Keem Bay PCIe controller - Endpoint mode"
> depends on ARCH_KEEMBAY || COMPILE_TEST
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on PCI_ENDPOINT
> select PCIE_DW_EP
> select PCIE_KEEMBAY
> @@ -275,7 +275,7 @@ config PCIE_KEEMBAY_EP
> config PCIE_KIRIN
> depends on OF && (ARM64 || COMPILE_TEST)
> tristate "HiSilicon Kirin series SoCs PCIe controllers"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support
> @@ -284,7 +284,7 @@ config PCIE_KIRIN
> config PCIE_HISI_STB
> bool "HiSilicon STB SoCs PCIe controllers"
> depends on ARCH_HISI || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support on HiSilicon STB SoCs
> @@ -292,7 +292,7 @@ config PCIE_HISI_STB
> config PCI_MESON
> tristate "MESON PCIe controller"
> default m if ARCH_MESON
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want to enable PCI controller support on Amlogic
> @@ -306,7 +306,7 @@ config PCIE_TEGRA194
> config PCIE_TEGRA194_HOST
> tristate "NVIDIA Tegra194 (and later) PCIe controller - Host Mode"
> depends on ARCH_TEGRA_194_SOC || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PHY_TEGRA194_P2U
> select PCIE_TEGRA194
> @@ -336,7 +336,7 @@ config PCIE_TEGRA194_EP
> config PCIE_VISCONTI_HOST
> bool "Toshiba Visconti PCIe controllers"
> depends on ARCH_VISCONTI || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support on Toshiba Visconti SoC.
> @@ -346,7 +346,7 @@ config PCIE_UNIPHIER
> bool "Socionext UniPhier PCIe host controllers"
> depends on ARCH_UNIPHIER || COMPILE_TEST
> depends on OF && HAS_IOMEM
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe host controller support on UniPhier SoCs.
> @@ -365,7 +365,7 @@ config PCIE_UNIPHIER_EP
> config PCIE_AL
> bool "Amazon Annapurna Labs PCIe controller"
> depends on OF && (ARM64 || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_ECAM
> help
> @@ -377,7 +377,7 @@ config PCIE_AL
>
> config PCIE_FU740
> bool "SiFive FU740 PCIe host controller"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on SOC_SIFIVE || COMPILE_TEST
> select PCIE_DW_HOST
> help
> --- a/drivers/pci/controller/mobiveil/Kconfig
> +++ b/drivers/pci/controller/mobiveil/Kconfig
> @@ -8,14 +8,14 @@ config PCIE_MOBIVEIL
>
> config PCIE_MOBIVEIL_HOST
> bool
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL
>
> config PCIE_MOBIVEIL_PLAT
> bool "Mobiveil AXI PCIe controller"
> depends on ARCH_ZYNQMP || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL_HOST
> help
> Say Y here if you want to enable support for the Mobiveil AXI PCIe
> @@ -25,7 +25,7 @@ config PCIE_MOBIVEIL_PLAT
> config PCIE_LAYERSCAPE_GEN4
> bool "Freescale Layerscape PCIe Gen4 controller"
> depends on ARCH_LAYERSCAPE || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL_HOST
> help
> Say Y here if you want PCIe Gen4 controller support on
> --- a/drivers/pci/msi/Makefile
> +++ b/drivers/pci/msi/Makefile
> @@ -3,5 +3,5 @@
> # Makefile for the PCI/MSI
> obj-$(CONFIG_PCI) += pcidev_msi.o
> obj-$(CONFIG_PCI_MSI) += msi.o
> -obj-$(CONFIG_PCI_MSI_IRQ_DOMAIN) += irqdomain.o
> +obj-$(CONFIG_PCI_MSI) += irqdomain.o
> obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridg
> if (!d)
> d = pci_host_bridge_acpi_msi_domain(bus);
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> /*
> * If no IRQ domain was found via the OF tree, try looking it up
> * directly through the fwnode_handle.
> @@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridg
> d = irq_find_matching_fwnode(fwnode,
> DOMAIN_BUS_PCI_MSI);
> }
> -#endif
>
> return d;
> }
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -238,15 +238,6 @@ static inline void msi_desc_set_iommu_co
> }
> #endif
>
> -#ifdef CONFIG_PCI_MSI
> -struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
> -void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
> -#else /* CONFIG_PCI_MSI */
> -static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
> -{
> -}
> -#endif /* CONFIG_PCI_MSI */
> -
> int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
> void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
>
> @@ -259,12 +250,6 @@ static inline void msi_free_msi_descs(st
> msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
> }
>
> -void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> -void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> -
> -void pci_msi_mask_irq(struct irq_data *data);
> -void pci_msi_unmask_irq(struct irq_data *data);
> -
> /*
> * The arch hooks to setup up msi irqs. Default functions are implemented
> * as weak symbols so that they /can/ be overriden by architecture specific
> @@ -466,20 +451,21 @@ int platform_msi_device_domain_alloc(str
> void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
> unsigned int nvec);
> void *platform_msi_get_host_data(struct irq_domain *domain);
> -#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +/* PCI specific interfaces */
> +struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
> +void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
> +void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> +void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> +void pci_msi_mask_irq(struct irq_data *data);
> +void pci_msi_unmask_irq(struct irq_data *data);
> struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
> struct msi_domain_info *info,
> struct irq_domain *parent);
> u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
> struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
> bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
> -#else
> -static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
> -{
> - return NULL;
> -}
> -#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
> +
> +#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>
> #endif /* LINUX_MSI_H */
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
@ 2022-11-16 16:12 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:12 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
> What a zoo:
>
> PCI_MSI
> select GENERIC_MSI_IRQ
>
> PCI_MSI_IRQ_DOMAIN
> def_bool y
> depends on PCI_MSI
> select GENERIC_MSI_IRQ_DOMAIN
>
> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
> just an indirection to PCI_MSI.
>
> Match the reality and just admit that PCI_MSI requires
> GENERIC_MSI_IRQ_DOMAIN.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Just FYI, this will conflict with my work-in-progress to add more
COMPILE_TEST coverage:
https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=72b5e7c401a1
No *actual* conflicts, just textually next door, so should be sipmle
to resolve. Worst case I can postpone my patch until the next cycle.
> ---
> arch/um/drivers/Kconfig | 1
> arch/um/include/asm/pci.h | 2 -
> arch/x86/Kconfig | 1
> arch/x86/include/asm/pci.h | 4 +-
> drivers/pci/Kconfig | 8 +----
> drivers/pci/controller/Kconfig | 30 +++++++++-----------
> drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
> drivers/pci/controller/mobiveil/Kconfig | 6 ++--
> drivers/pci/msi/Makefile | 2 -
> drivers/pci/probe.c | 2 -
> include/linux/msi.h | 32 ++++++---------------
> 11 files changed, 56 insertions(+), 80 deletions(-)
>
> --- a/arch/um/drivers/Kconfig
> +++ b/arch/um/drivers/Kconfig
> @@ -381,7 +381,6 @@ config UML_PCI_OVER_VIRTIO
> select UML_IOMEM_EMULATION
> select UML_DMA_EMULATION
> select PCI_MSI
> - select PCI_MSI_IRQ_DOMAIN
> select PCI_LOCKLESS_CONFIG
>
> config UML_PCI_OVER_VIRTIO_DEVICE_ID
> --- a/arch/um/include/asm/pci.h
> +++ b/arch/um/include/asm/pci.h
> @@ -7,7 +7,7 @@
> /* Generic PCI */
> #include <asm-generic/pci.h>
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> /*
> * This is a bit of an annoying hack, and it assumes we only have
> * the virt-pci (if anything). Which is true, but still.
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -1109,7 +1109,6 @@ config X86_LOCAL_APIC
> def_bool y
> depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC || PCI_MSI
> select IRQ_DOMAIN_HIERARCHY
> - select PCI_MSI_IRQ_DOMAIN if PCI_MSI
>
> config X86_IO_APIC
> def_bool y
> --- a/arch/x86/include/asm/pci.h
> +++ b/arch/x86/include/asm/pci.h
> @@ -21,7 +21,7 @@ struct pci_sysdata {
> #ifdef CONFIG_X86_64
> void *iommu; /* IOMMU private data */
> #endif
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> void *fwnode; /* IRQ domain for MSI assignment */
> #endif
> #if IS_ENABLED(CONFIG_VMD)
> @@ -52,7 +52,7 @@ static inline int pci_proc_domain(struct
> }
> #endif
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +#ifdef CONFIG_PCI_MSI
> static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
> {
> return to_pci_sysdata(bus)->fwnode;
> --- a/drivers/pci/Kconfig
> +++ b/drivers/pci/Kconfig
> @@ -38,6 +38,7 @@ source "drivers/pci/pcie/Kconfig"
>
> config PCI_MSI
> bool "Message Signaled Interrupts (MSI and MSI-X)"
> + select GENERIC_MSI_IRQ_DOMAIN
> select GENERIC_MSI_IRQ
> help
> This allows device drivers to enable MSI (Message Signaled
> @@ -51,11 +52,6 @@ config PCI_MSI
>
> If you don't know what to do here, say Y.
>
> -config PCI_MSI_IRQ_DOMAIN
> - def_bool y
> - depends on PCI_MSI
> - select GENERIC_MSI_IRQ_DOMAIN
> -
> config PCI_MSI_ARCH_FALLBACKS
> bool
>
> @@ -192,7 +188,7 @@ config PCI_LABEL
>
> config PCI_HYPERV
> tristate "Hyper-V PCI Frontend"
> - depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS
> + depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && SYSFS
> select PCI_HYPERV_INTERFACE
> help
> The PCI device frontend driver allows the kernel to import arbitrary
> --- a/drivers/pci/controller/Kconfig
> +++ b/drivers/pci/controller/Kconfig
> @@ -19,7 +19,7 @@ config PCI_AARDVARK
> tristate "Aardvark PCIe controller"
> depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCI_BRIDGE_EMUL
> help
> Add support for Aardvark 64bit PCIe Host Controller. This
> @@ -29,7 +29,7 @@ config PCI_AARDVARK
> config PCIE_XILINX_NWL
> bool "NWL PCIe Core"
> depends on ARCH_ZYNQMP || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say 'Y' here if you want kernel support for Xilinx
> NWL PCIe controller. The controller can act as Root Port
> @@ -53,7 +53,7 @@ config PCI_IXP4XX
> config PCI_TEGRA
> bool "NVIDIA Tegra PCIe controller"
> depends on ARCH_TEGRA || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want support for the PCIe host controller found
> on NVIDIA Tegra SoCs.
> @@ -70,7 +70,7 @@ config PCI_RCAR_GEN2
> config PCIE_RCAR_HOST
> bool "Renesas R-Car PCIe host controller"
> depends on ARCH_RENESAS || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want PCIe controller support on R-Car SoCs in host
> mode.
> @@ -99,7 +99,7 @@ config PCI_HOST_GENERIC
> config PCIE_XILINX
> bool "Xilinx AXI PCIe host bridge support"
> depends on OF || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
> Host Bridge driver.
> @@ -124,7 +124,7 @@ config PCI_XGENE
> config PCI_XGENE_MSI
> bool "X-Gene v1 PCIe MSI feature"
> depends on PCI_XGENE
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default y
> help
> Say Y here if you want PCIe MSI support for the APM X-Gene v1 SoC.
> @@ -170,7 +170,7 @@ config PCIE_IPROC_BCMA
> config PCIE_IPROC_MSI
> bool "Broadcom iProc PCIe MSI support"
> depends on PCIE_IPROC_PLATFORM || PCIE_IPROC_BCMA
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default ARCH_BCM_IPROC
> help
> Say Y here if you want to enable MSI support for Broadcom's iProc
> @@ -186,7 +186,7 @@ config PCIE_ALTERA
> config PCIE_ALTERA_MSI
> tristate "Altera PCIe MSI feature"
> depends on PCIE_ALTERA
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want PCIe MSI support for the Altera FPGA.
> This MSI driver supports Altera MSI to GIC controller IP.
> @@ -215,7 +215,7 @@ config PCIE_ROCKCHIP_HOST
> tristate "Rockchip PCIe host controller"
> depends on ARCH_ROCKCHIP || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select MFD_SYSCON
> select PCIE_ROCKCHIP
> help
> @@ -239,7 +239,7 @@ config PCIE_MEDIATEK
> tristate "MediaTek PCIe controller"
> depends on ARCH_AIROHA || ARCH_MEDIATEK || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Say Y here if you want to enable PCIe controller support on
> MediaTek SoCs.
> @@ -247,7 +247,7 @@ config PCIE_MEDIATEK
> config PCIE_MEDIATEK_GEN3
> tristate "MediaTek Gen3 PCIe controller"
> depends on ARCH_MEDIATEK || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> help
> Adds support for PCIe Gen3 MAC controller for MediaTek SoCs.
> This PCIe controller is compatible with Gen3, Gen2 and Gen1 speed,
> @@ -277,7 +277,7 @@ config PCIE_BRCMSTB
> depends on ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCMBCA || \
> BMIPS_GENERIC || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> default ARCH_BRCMSTB || BMIPS_GENERIC
> help
> Say Y here to enable PCIe host controller support for
> @@ -285,7 +285,7 @@ config PCIE_BRCMSTB
>
> config PCI_HYPERV_INTERFACE
> tristate "Hyper-V PCI Interface"
> - depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN
> + depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI
> help
> The Hyper-V PCI Interface is a helper driver allows other drivers to
> have a common interface with the Hyper-V PCI frontend driver.
> @@ -303,8 +303,6 @@ config PCI_LOONGSON
> config PCIE_MICROCHIP_HOST
> bool "Microchip AXI PCIe host bridge support"
> depends on PCI_MSI && OF
> - select PCI_MSI_IRQ_DOMAIN
> - select GENERIC_MSI_IRQ_DOMAIN
> select PCI_HOST_COMMON
> help
> Say Y here if you want kernel to support the Microchip AXI PCIe
> @@ -326,7 +324,7 @@ config PCIE_APPLE
> tristate "Apple PCIe controller"
> depends on ARCH_APPLE || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCI_HOST_COMMON
> help
> Say Y here if you want to enable PCIe controller support on Apple
> --- a/drivers/pci/controller/dwc/Kconfig
> +++ b/drivers/pci/controller/dwc/Kconfig
> @@ -21,7 +21,7 @@ config PCI_DRA7XX_HOST
> tristate "TI DRA7xx PCIe controller Host Mode"
> depends on SOC_DRA7XX || COMPILE_TEST
> depends on OF && HAS_IOMEM && TI_PIPE3
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_DRA7XX
> default y if SOC_DRA7XX
> @@ -53,7 +53,7 @@ config PCIE_DW_PLAT
>
> config PCIE_DW_PLAT_HOST
> bool "Platform bus based DesignWare PCIe Controller - Host mode"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_DW_PLAT
> help
> @@ -67,7 +67,7 @@ config PCIE_DW_PLAT_HOST
>
> config PCIE_DW_PLAT_EP
> bool "Platform bus based DesignWare PCIe Controller - Endpoint mode"
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI && PCI_MSI
> depends on PCI_ENDPOINT
> select PCIE_DW_EP
> select PCIE_DW_PLAT
> @@ -83,7 +83,7 @@ config PCIE_DW_PLAT_EP
> config PCI_EXYNOS
> tristate "Samsung Exynos PCIe controller"
> depends on ARCH_EXYNOS || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Enables support for the PCIe controller in the Samsung Exynos SoCs
> @@ -94,13 +94,13 @@ config PCI_EXYNOS
> config PCI_IMX6
> bool "Freescale i.MX6/7/8 PCIe controller"
> depends on ARCH_MXC || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
>
> config PCIE_SPEAR13XX
> bool "STMicroelectronics SPEAr PCIe controller"
> depends on ARCH_SPEAR13XX || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe support on SPEAr13XX SoCs.
> @@ -111,7 +111,7 @@ config PCI_KEYSTONE
> config PCI_KEYSTONE_HOST
> bool "PCI Keystone Host Mode"
> depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_KEYSTONE
> help
> @@ -135,7 +135,7 @@ config PCI_KEYSTONE_EP
> config PCI_LAYERSCAPE
> bool "Freescale Layerscape PCIe controller - Host mode"
> depends on OF && (ARM || ARCH_LAYERSCAPE || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select MFD_SYSCON
> help
> @@ -160,7 +160,7 @@ config PCI_LAYERSCAPE_EP
> config PCI_HISI
> depends on OF && (ARM64 || COMPILE_TEST)
> bool "HiSilicon Hip05 and Hip06 SoCs PCIe controllers"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_HOST_COMMON
> help
> @@ -170,7 +170,7 @@ config PCI_HISI
> config PCIE_QCOM
> bool "Qualcomm PCIe controller"
> depends on OF && (ARCH_QCOM || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select CRC8
> help
> @@ -191,7 +191,7 @@ config PCIE_QCOM_EP
> config PCIE_ARMADA_8K
> bool "Marvell Armada-8K PCIe controller"
> depends on ARCH_MVEBU || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want to enable PCIe controller support on
> @@ -205,7 +205,7 @@ config PCIE_ARTPEC6
> config PCIE_ARTPEC6_HOST
> bool "Axis ARTPEC-6 PCIe controller Host Mode"
> depends on MACH_ARTPEC6 || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_ARTPEC6
> help
> @@ -226,7 +226,7 @@ config PCIE_ROCKCHIP_DW_HOST
> bool "Rockchip DesignWare PCIe controller"
> select PCIE_DW
> select PCIE_DW_HOST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on ARCH_ROCKCHIP || COMPILE_TEST
> depends on OF
> help
> @@ -236,7 +236,7 @@ config PCIE_ROCKCHIP_DW_HOST
> config PCIE_INTEL_GW
> bool "Intel Gateway PCIe host controller support"
> depends on OF && (X86 || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say 'Y' here to enable PCIe Host controller support on Intel
> @@ -250,7 +250,7 @@ config PCIE_KEEMBAY
> config PCIE_KEEMBAY_HOST
> bool "Intel Keem Bay PCIe controller - Host mode"
> depends on ARCH_KEEMBAY || COMPILE_TEST
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCIE_KEEMBAY
> help
> @@ -262,7 +262,7 @@ config PCIE_KEEMBAY_HOST
> config PCIE_KEEMBAY_EP
> bool "Intel Keem Bay PCIe controller - Endpoint mode"
> depends on ARCH_KEEMBAY || COMPILE_TEST
> - depends on PCI && PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on PCI_ENDPOINT
> select PCIE_DW_EP
> select PCIE_KEEMBAY
> @@ -275,7 +275,7 @@ config PCIE_KEEMBAY_EP
> config PCIE_KIRIN
> depends on OF && (ARM64 || COMPILE_TEST)
> tristate "HiSilicon Kirin series SoCs PCIe controllers"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support
> @@ -284,7 +284,7 @@ config PCIE_KIRIN
> config PCIE_HISI_STB
> bool "HiSilicon STB SoCs PCIe controllers"
> depends on ARCH_HISI || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support on HiSilicon STB SoCs
> @@ -292,7 +292,7 @@ config PCIE_HISI_STB
> config PCI_MESON
> tristate "MESON PCIe controller"
> default m if ARCH_MESON
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want to enable PCI controller support on Amlogic
> @@ -306,7 +306,7 @@ config PCIE_TEGRA194
> config PCIE_TEGRA194_HOST
> tristate "NVIDIA Tegra194 (and later) PCIe controller - Host Mode"
> depends on ARCH_TEGRA_194_SOC || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PHY_TEGRA194_P2U
> select PCIE_TEGRA194
> @@ -336,7 +336,7 @@ config PCIE_TEGRA194_EP
> config PCIE_VISCONTI_HOST
> bool "Toshiba Visconti PCIe controllers"
> depends on ARCH_VISCONTI || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe controller support on Toshiba Visconti SoC.
> @@ -346,7 +346,7 @@ config PCIE_UNIPHIER
> bool "Socionext UniPhier PCIe host controllers"
> depends on ARCH_UNIPHIER || COMPILE_TEST
> depends on OF && HAS_IOMEM
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> help
> Say Y here if you want PCIe host controller support on UniPhier SoCs.
> @@ -365,7 +365,7 @@ config PCIE_UNIPHIER_EP
> config PCIE_AL
> bool "Amazon Annapurna Labs PCIe controller"
> depends on OF && (ARM64 || COMPILE_TEST)
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_DW_HOST
> select PCI_ECAM
> help
> @@ -377,7 +377,7 @@ config PCIE_AL
>
> config PCIE_FU740
> bool "SiFive FU740 PCIe host controller"
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> depends on SOC_SIFIVE || COMPILE_TEST
> select PCIE_DW_HOST
> help
> --- a/drivers/pci/controller/mobiveil/Kconfig
> +++ b/drivers/pci/controller/mobiveil/Kconfig
> @@ -8,14 +8,14 @@ config PCIE_MOBIVEIL
>
> config PCIE_MOBIVEIL_HOST
> bool
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL
>
> config PCIE_MOBIVEIL_PLAT
> bool "Mobiveil AXI PCIe controller"
> depends on ARCH_ZYNQMP || COMPILE_TEST
> depends on OF
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL_HOST
> help
> Say Y here if you want to enable support for the Mobiveil AXI PCIe
> @@ -25,7 +25,7 @@ config PCIE_MOBIVEIL_PLAT
> config PCIE_LAYERSCAPE_GEN4
> bool "Freescale Layerscape PCIe Gen4 controller"
> depends on ARCH_LAYERSCAPE || COMPILE_TEST
> - depends on PCI_MSI_IRQ_DOMAIN
> + depends on PCI_MSI
> select PCIE_MOBIVEIL_HOST
> help
> Say Y here if you want PCIe Gen4 controller support on
> --- a/drivers/pci/msi/Makefile
> +++ b/drivers/pci/msi/Makefile
> @@ -3,5 +3,5 @@
> # Makefile for the PCI/MSI
> obj-$(CONFIG_PCI) += pcidev_msi.o
> obj-$(CONFIG_PCI_MSI) += msi.o
> -obj-$(CONFIG_PCI_MSI_IRQ_DOMAIN) += irqdomain.o
> +obj-$(CONFIG_PCI_MSI) += irqdomain.o
> obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridg
> if (!d)
> d = pci_host_bridge_acpi_msi_domain(bus);
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> /*
> * If no IRQ domain was found via the OF tree, try looking it up
> * directly through the fwnode_handle.
> @@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridg
> d = irq_find_matching_fwnode(fwnode,
> DOMAIN_BUS_PCI_MSI);
> }
> -#endif
>
> return d;
> }
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -238,15 +238,6 @@ static inline void msi_desc_set_iommu_co
> }
> #endif
>
> -#ifdef CONFIG_PCI_MSI
> -struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
> -void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
> -#else /* CONFIG_PCI_MSI */
> -static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
> -{
> -}
> -#endif /* CONFIG_PCI_MSI */
> -
> int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
> void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
>
> @@ -259,12 +250,6 @@ static inline void msi_free_msi_descs(st
> msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
> }
>
> -void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> -void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> -
> -void pci_msi_mask_irq(struct irq_data *data);
> -void pci_msi_unmask_irq(struct irq_data *data);
> -
> /*
> * The arch hooks to setup up msi irqs. Default functions are implemented
> * as weak symbols so that they /can/ be overriden by architecture specific
> @@ -466,20 +451,21 @@ int platform_msi_device_domain_alloc(str
> void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
> unsigned int nvec);
> void *platform_msi_get_host_data(struct irq_domain *domain);
> -#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>
> -#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
> +/* PCI specific interfaces */
> +struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
> +void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
> +void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> +void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> +void pci_msi_mask_irq(struct irq_data *data);
> +void pci_msi_unmask_irq(struct irq_data *data);
> struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
> struct msi_domain_info *info,
> struct irq_domain *parent);
> u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
> struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
> bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
> -#else
> -static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
> -{
> - return NULL;
> -}
> -#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
> +
> +#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
>
> #endif /* LINUX_MSI_H */
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
2022-11-16 16:12 ` Bjorn Helgaas
@ 2022-11-16 17:04 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:04 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Wed, Nov 16 2022 at 10:12, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
>> What a zoo:
>>
>> PCI_MSI
>> select GENERIC_MSI_IRQ
>>
>> PCI_MSI_IRQ_DOMAIN
>> def_bool y
>> depends on PCI_MSI
>> select GENERIC_MSI_IRQ_DOMAIN
>>
>> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
>> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
>> just an indirection to PCI_MSI.
>>
>> Match the reality and just admit that PCI_MSI requires
>> GENERIC_MSI_IRQ_DOMAIN.
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> Just FYI, this will conflict with my work-in-progress to add more
> COMPILE_TEST coverage:
> https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=72b5e7c401a1
>
> No *actual* conflicts, just textually next door, so should be sipmle
> to resolve. Worst case I can postpone my patch until the next cycle.
Linus should be able to resolve that conflict :)
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
@ 2022-11-16 17:04 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:04 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:12, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
>> What a zoo:
>>
>> PCI_MSI
>> select GENERIC_MSI_IRQ
>>
>> PCI_MSI_IRQ_DOMAIN
>> def_bool y
>> depends on PCI_MSI
>> select GENERIC_MSI_IRQ_DOMAIN
>>
>> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
>> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
>> just an indirection to PCI_MSI.
>>
>> Match the reality and just admit that PCI_MSI requires
>> GENERIC_MSI_IRQ_DOMAIN.
>>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> Just FYI, this will conflict with my work-in-progress to add more
> COMPILE_TEST coverage:
> https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git/commit/?id=72b5e7c401a1
>
> No *actual* conflicts, just textually next door, so should be sipmle
> to resolve. Worst case I can postpone my patch until the next cycle.
Linus should be able to resolve that conflict :)
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:53 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:53 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
> What a zoo:
>
> PCI_MSI
> select GENERIC_MSI_IRQ
>
> PCI_MSI_IRQ_DOMAIN
> def_bool y
> depends on PCI_MSI
> select GENERIC_MSI_IRQ_DOMAIN
>
> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
> just an indirection to PCI_MSI.
>
> Match the reality and just admit that PCI_MSI requires
> GENERIC_MSI_IRQ_DOMAIN.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> arch/um/drivers/Kconfig | 1
> arch/um/include/asm/pci.h | 2 -
> arch/x86/Kconfig | 1
> arch/x86/include/asm/pci.h | 4 +-
> drivers/pci/Kconfig | 8 +----
> drivers/pci/controller/Kconfig | 30 +++++++++-----------
> drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
> drivers/pci/controller/mobiveil/Kconfig | 6 ++--
> drivers/pci/msi/Makefile | 2 -
> drivers/pci/probe.c | 2 -
> include/linux/msi.h | 32 ++++++---------------
> 11 files changed, 56 insertions(+), 80 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 15/39] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
@ 2022-11-16 17:53 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:53 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:38PM +0100, Thomas Gleixner wrote:
> What a zoo:
>
> PCI_MSI
> select GENERIC_MSI_IRQ
>
> PCI_MSI_IRQ_DOMAIN
> def_bool y
> depends on PCI_MSI
> select GENERIC_MSI_IRQ_DOMAIN
>
> Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
> GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
> just an indirection to PCI_MSI.
>
> Match the reality and just admit that PCI_MSI requires
> GENERIC_MSI_IRQ_DOMAIN.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> arch/um/drivers/Kconfig | 1
> arch/um/include/asm/pci.h | 2 -
> arch/x86/Kconfig | 1
> arch/x86/include/asm/pci.h | 4 +-
> drivers/pci/Kconfig | 8 +----
> drivers/pci/controller/Kconfig | 30 +++++++++-----------
> drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++++++----------------
> drivers/pci/controller/mobiveil/Kconfig | 6 ++--
> drivers/pci/msi/Makefile | 2 -
> drivers/pci/probe.c | 2 -
> include/linux/msi.h | 32 ++++++---------------
> 11 files changed, 56 insertions(+), 80 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: a474d3fbe287625c6c1cfc56c2a456c5fb7c479e
Gitweb: https://git.kernel.org/tip/a474d3fbe287625c6c1cfc56c2a456c5fb7c479e
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:38 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:19 +01:00
PCI/MSI: Get rid of PCI_MSI_IRQ_DOMAIN
What a zoo:
PCI_MSI
select GENERIC_MSI_IRQ
PCI_MSI_IRQ_DOMAIN
def_bool y
depends on PCI_MSI
select GENERIC_MSI_IRQ_DOMAIN
Ergo PCI_MSI enables PCI_MSI_IRQ_DOMAIN which in turn selects
GENERIC_MSI_IRQ_DOMAIN. So all the dependencies on PCI_MSI_IRQ_DOMAIN are
just an indirection to PCI_MSI.
Match the reality and just admit that PCI_MSI requires
GENERIC_MSI_IRQ_DOMAIN.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.467556921@linutronix.de
---
arch/um/drivers/Kconfig | 1 +-
arch/um/include/asm/pci.h | 2 +-
arch/x86/Kconfig | 1 +-
arch/x86/include/asm/pci.h | 4 +-
drivers/pci/Kconfig | 8 +---
drivers/pci/controller/Kconfig | 30 +++++++--------
drivers/pci/controller/dwc/Kconfig | 48 ++++++++++++------------
drivers/pci/controller/mobiveil/Kconfig | 6 +--
drivers/pci/msi/Makefile | 2 +-
drivers/pci/probe.c | 2 +-
include/linux/msi.h | 29 +++++----------
11 files changed, 58 insertions(+), 75 deletions(-)
diff --git a/arch/um/drivers/Kconfig b/arch/um/drivers/Kconfig
index 5903e2b..a4f0a19 100644
--- a/arch/um/drivers/Kconfig
+++ b/arch/um/drivers/Kconfig
@@ -381,7 +381,6 @@ config UML_PCI_OVER_VIRTIO
select UML_IOMEM_EMULATION
select UML_DMA_EMULATION
select PCI_MSI
- select PCI_MSI_IRQ_DOMAIN
select PCI_LOCKLESS_CONFIG
config UML_PCI_OVER_VIRTIO_DEVICE_ID
diff --git a/arch/um/include/asm/pci.h b/arch/um/include/asm/pci.h
index 34fe492..238d2e7 100644
--- a/arch/um/include/asm/pci.h
+++ b/arch/um/include/asm/pci.h
@@ -7,7 +7,7 @@
/* Generic PCI */
#include <asm-generic/pci.h>
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
/*
* This is a bit of an annoying hack, and it assumes we only have
* the virt-pci (if anything). Which is true, but still.
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 67745ce..64f81a1 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1109,7 +1109,6 @@ config X86_LOCAL_APIC
def_bool y
depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC || PCI_MSI
select IRQ_DOMAIN_HIERARCHY
- select PCI_MSI_IRQ_DOMAIN if PCI_MSI
config X86_IO_APIC
def_bool y
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index 736793d..c4789de 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -21,7 +21,7 @@ struct pci_sysdata {
#ifdef CONFIG_X86_64
void *iommu; /* IOMMU private data */
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
void *fwnode; /* IRQ domain for MSI assignment */
#endif
#if IS_ENABLED(CONFIG_VMD)
@@ -52,7 +52,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)
}
#endif
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+#ifdef CONFIG_PCI_MSI
static inline void *_pci_root_bus_fwnode(struct pci_bus *bus)
{
return to_pci_sysdata(bus)->fwnode;
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index 55c028a..b7f6221 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,6 +38,7 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
+ select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
@@ -51,11 +52,6 @@ config PCI_MSI
If you don't know what to do here, say Y.
-config PCI_MSI_IRQ_DOMAIN
- def_bool y
- depends on PCI_MSI
- select GENERIC_MSI_IRQ_DOMAIN
-
config PCI_MSI_ARCH_FALLBACKS
bool
@@ -192,7 +188,7 @@ config PCI_LABEL
config PCI_HYPERV
tristate "Hyper-V PCI Frontend"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN && SYSFS
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && SYSFS
select PCI_HYPERV_INTERFACE
help
The PCI device frontend driver allows the kernel to import arbitrary
diff --git a/drivers/pci/controller/Kconfig b/drivers/pci/controller/Kconfig
index bfd9bac..1569d9a 100644
--- a/drivers/pci/controller/Kconfig
+++ b/drivers/pci/controller/Kconfig
@@ -19,7 +19,7 @@ config PCI_AARDVARK
tristate "Aardvark PCIe controller"
depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_BRIDGE_EMUL
help
Add support for Aardvark 64bit PCIe Host Controller. This
@@ -29,7 +29,7 @@ config PCI_AARDVARK
config PCIE_XILINX_NWL
bool "NWL PCIe Core"
depends on ARCH_ZYNQMP || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel support for Xilinx
NWL PCIe controller. The controller can act as Root Port
@@ -53,7 +53,7 @@ config PCI_IXP4XX
config PCI_TEGRA
bool "NVIDIA Tegra PCIe controller"
depends on ARCH_TEGRA || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want support for the PCIe host controller found
on NVIDIA Tegra SoCs.
@@ -70,7 +70,7 @@ config PCI_RCAR_GEN2
config PCIE_RCAR_HOST
bool "Renesas R-Car PCIe host controller"
depends on ARCH_RENESAS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe controller support on R-Car SoCs in host
mode.
@@ -99,7 +99,7 @@ config PCI_HOST_GENERIC
config PCIE_XILINX
bool "Xilinx AXI PCIe host bridge support"
depends on OF || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say 'Y' here if you want kernel to support the Xilinx AXI PCIe
Host Bridge driver.
@@ -124,7 +124,7 @@ config PCI_XGENE
config PCI_XGENE_MSI
bool "X-Gene v1 PCIe MSI feature"
depends on PCI_XGENE
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default y
help
Say Y here if you want PCIe MSI support for the APM X-Gene v1 SoC.
@@ -170,7 +170,7 @@ config PCIE_IPROC_BCMA
config PCIE_IPROC_MSI
bool "Broadcom iProc PCIe MSI support"
depends on PCIE_IPROC_PLATFORM || PCIE_IPROC_BCMA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BCM_IPROC
help
Say Y here if you want to enable MSI support for Broadcom's iProc
@@ -186,7 +186,7 @@ config PCIE_ALTERA
config PCIE_ALTERA_MSI
tristate "Altera PCIe MSI feature"
depends on PCIE_ALTERA
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want PCIe MSI support for the Altera FPGA.
This MSI driver supports Altera MSI to GIC controller IP.
@@ -215,7 +215,7 @@ config PCIE_ROCKCHIP_HOST
tristate "Rockchip PCIe host controller"
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select MFD_SYSCON
select PCIE_ROCKCHIP
help
@@ -239,7 +239,7 @@ config PCIE_MEDIATEK
tristate "MediaTek PCIe controller"
depends on ARCH_AIROHA || ARCH_MEDIATEK || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Say Y here if you want to enable PCIe controller support on
MediaTek SoCs.
@@ -247,7 +247,7 @@ config PCIE_MEDIATEK
config PCIE_MEDIATEK_GEN3
tristate "MediaTek Gen3 PCIe controller"
depends on ARCH_MEDIATEK || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
help
Adds support for PCIe Gen3 MAC controller for MediaTek SoCs.
This PCIe controller is compatible with Gen3, Gen2 and Gen1 speed,
@@ -277,7 +277,7 @@ config PCIE_BRCMSTB
depends on ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCMBCA || \
BMIPS_GENERIC || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
default ARCH_BRCMSTB || BMIPS_GENERIC
help
Say Y here to enable PCIe host controller support for
@@ -285,7 +285,7 @@ config PCIE_BRCMSTB
config PCI_HYPERV_INTERFACE
tristate "Hyper-V PCI Interface"
- depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI_IRQ_DOMAIN
+ depends on ((X86 && X86_64) || ARM64) && HYPERV && PCI_MSI && PCI_MSI
help
The Hyper-V PCI Interface is a helper driver allows other drivers to
have a common interface with the Hyper-V PCI frontend driver.
@@ -303,8 +303,6 @@ config PCI_LOONGSON
config PCIE_MICROCHIP_HOST
bool "Microchip AXI PCIe host bridge support"
depends on PCI_MSI && OF
- select PCI_MSI_IRQ_DOMAIN
- select GENERIC_MSI_IRQ_DOMAIN
select PCI_HOST_COMMON
help
Say Y here if you want kernel to support the Microchip AXI PCIe
@@ -326,7 +324,7 @@ config PCIE_APPLE
tristate "Apple PCIe controller"
depends on ARCH_APPLE || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCI_HOST_COMMON
help
Say Y here if you want to enable PCIe controller support on Apple
diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
index 62ce3ab..f3c4621 100644
--- a/drivers/pci/controller/dwc/Kconfig
+++ b/drivers/pci/controller/dwc/Kconfig
@@ -21,7 +21,7 @@ config PCI_DRA7XX_HOST
tristate "TI DRA7xx PCIe controller Host Mode"
depends on SOC_DRA7XX || COMPILE_TEST
depends on OF && HAS_IOMEM && TI_PIPE3
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_DRA7XX
default y if SOC_DRA7XX
@@ -53,7 +53,7 @@ config PCIE_DW_PLAT
config PCIE_DW_PLAT_HOST
bool "Platform bus based DesignWare PCIe Controller - Host mode"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_DW_PLAT
help
@@ -67,7 +67,7 @@ config PCIE_DW_PLAT_HOST
config PCIE_DW_PLAT_EP
bool "Platform bus based DesignWare PCIe Controller - Endpoint mode"
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI && PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_DW_PLAT
@@ -83,7 +83,7 @@ config PCIE_DW_PLAT_EP
config PCI_EXYNOS
tristate "Samsung Exynos PCIe controller"
depends on ARCH_EXYNOS || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Enables support for the PCIe controller in the Samsung Exynos SoCs
@@ -94,13 +94,13 @@ config PCI_EXYNOS
config PCI_IMX6
bool "Freescale i.MX6/7/8 PCIe controller"
depends on ARCH_MXC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
config PCIE_SPEAR13XX
bool "STMicroelectronics SPEAr PCIe controller"
depends on ARCH_SPEAR13XX || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe support on SPEAr13XX SoCs.
@@ -111,7 +111,7 @@ config PCI_KEYSTONE
config PCI_KEYSTONE_HOST
bool "PCI Keystone Host Mode"
depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_KEYSTONE
help
@@ -135,7 +135,7 @@ config PCI_KEYSTONE_EP
config PCI_LAYERSCAPE
bool "Freescale Layerscape PCIe controller - Host mode"
depends on OF && (ARM || ARCH_LAYERSCAPE || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select MFD_SYSCON
help
@@ -160,7 +160,7 @@ config PCI_LAYERSCAPE_EP
config PCI_HISI
depends on OF && (ARM64 || COMPILE_TEST)
bool "HiSilicon Hip05 and Hip06 SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_HOST_COMMON
help
@@ -170,7 +170,7 @@ config PCI_HISI
config PCIE_QCOM
bool "Qualcomm PCIe controller"
depends on OF && (ARCH_QCOM || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select CRC8
help
@@ -191,7 +191,7 @@ config PCIE_QCOM_EP
config PCIE_ARMADA_8K
bool "Marvell Armada-8K PCIe controller"
depends on ARCH_MVEBU || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCIe controller support on
@@ -205,7 +205,7 @@ config PCIE_ARTPEC6
config PCIE_ARTPEC6_HOST
bool "Axis ARTPEC-6 PCIe controller Host Mode"
depends on MACH_ARTPEC6 || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_ARTPEC6
help
@@ -226,7 +226,7 @@ config PCIE_ROCKCHIP_DW_HOST
bool "Rockchip DesignWare PCIe controller"
select PCIE_DW
select PCIE_DW_HOST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on ARCH_ROCKCHIP || COMPILE_TEST
depends on OF
help
@@ -236,7 +236,7 @@ config PCIE_ROCKCHIP_DW_HOST
config PCIE_INTEL_GW
bool "Intel Gateway PCIe host controller support"
depends on OF && (X86 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say 'Y' here to enable PCIe Host controller support on Intel
@@ -250,7 +250,7 @@ config PCIE_KEEMBAY
config PCIE_KEEMBAY_HOST
bool "Intel Keem Bay PCIe controller - Host mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCIE_KEEMBAY
help
@@ -262,7 +262,7 @@ config PCIE_KEEMBAY_HOST
config PCIE_KEEMBAY_EP
bool "Intel Keem Bay PCIe controller - Endpoint mode"
depends on ARCH_KEEMBAY || COMPILE_TEST
- depends on PCI && PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on PCI_ENDPOINT
select PCIE_DW_EP
select PCIE_KEEMBAY
@@ -275,7 +275,7 @@ config PCIE_KEEMBAY_EP
config PCIE_KIRIN
depends on OF && (ARM64 || COMPILE_TEST)
tristate "HiSilicon Kirin series SoCs PCIe controllers"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support
@@ -284,7 +284,7 @@ config PCIE_KIRIN
config PCIE_HISI_STB
bool "HiSilicon STB SoCs PCIe controllers"
depends on ARCH_HISI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on HiSilicon STB SoCs
@@ -292,7 +292,7 @@ config PCIE_HISI_STB
config PCI_MESON
tristate "MESON PCIe controller"
default m if ARCH_MESON
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want to enable PCI controller support on Amlogic
@@ -306,7 +306,7 @@ config PCIE_TEGRA194
config PCIE_TEGRA194_HOST
tristate "NVIDIA Tegra194 (and later) PCIe controller - Host Mode"
depends on ARCH_TEGRA_194_SOC || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PHY_TEGRA194_P2U
select PCIE_TEGRA194
@@ -336,7 +336,7 @@ config PCIE_TEGRA194_EP
config PCIE_VISCONTI_HOST
bool "Toshiba Visconti PCIe controllers"
depends on ARCH_VISCONTI || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe controller support on Toshiba Visconti SoC.
@@ -346,7 +346,7 @@ config PCIE_UNIPHIER
bool "Socionext UniPhier PCIe host controllers"
depends on ARCH_UNIPHIER || COMPILE_TEST
depends on OF && HAS_IOMEM
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
help
Say Y here if you want PCIe host controller support on UniPhier SoCs.
@@ -365,7 +365,7 @@ config PCIE_UNIPHIER_EP
config PCIE_AL
bool "Amazon Annapurna Labs PCIe controller"
depends on OF && (ARM64 || COMPILE_TEST)
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_DW_HOST
select PCI_ECAM
help
@@ -377,7 +377,7 @@ config PCIE_AL
config PCIE_FU740
bool "SiFive FU740 PCIe host controller"
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
depends on SOC_SIFIVE || COMPILE_TEST
select PCIE_DW_HOST
help
diff --git a/drivers/pci/controller/mobiveil/Kconfig b/drivers/pci/controller/mobiveil/Kconfig
index e4643fb..1d7a07b 100644
--- a/drivers/pci/controller/mobiveil/Kconfig
+++ b/drivers/pci/controller/mobiveil/Kconfig
@@ -8,14 +8,14 @@ config PCIE_MOBIVEIL
config PCIE_MOBIVEIL_HOST
bool
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL
config PCIE_MOBIVEIL_PLAT
bool "Mobiveil AXI PCIe controller"
depends on ARCH_ZYNQMP || COMPILE_TEST
depends on OF
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want to enable support for the Mobiveil AXI PCIe
@@ -25,7 +25,7 @@ config PCIE_MOBIVEIL_PLAT
config PCIE_LAYERSCAPE_GEN4
bool "Freescale Layerscape PCIe Gen4 controller"
depends on ARCH_LAYERSCAPE || COMPILE_TEST
- depends on PCI_MSI_IRQ_DOMAIN
+ depends on PCI_MSI
select PCIE_MOBIVEIL_HOST
help
Say Y here if you want PCIe Gen4 controller support on
diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
index 93ef7b9..4e0a7e0 100644
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -3,5 +3,5 @@
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI_IRQ_DOMAIN) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index b66fa42..fdd7e56 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -842,7 +842,6 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)
if (!d)
d = pci_host_bridge_acpi_msi_domain(bus);
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
/*
* If no IRQ domain was found via the OF tree, try looking it up
* directly through the fwnode_handle.
@@ -854,7 +853,6 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)
d = irq_find_matching_fwnode(fwnode,
DOMAIN_BUS_PCI_MSI);
}
-#endif
return d;
}
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 2dfd7b2..9b84145 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -238,15 +238,6 @@ static inline void msi_desc_set_iommu_cookie(struct msi_desc *desc,
}
#endif
-#ifdef CONFIG_PCI_MSI
-struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
-void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
-#else /* CONFIG_PCI_MSI */
-static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
-#endif /* CONFIG_PCI_MSI */
-
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
@@ -259,12 +250,6 @@ static inline void msi_free_msi_descs(struct device *dev)
msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
}
-void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-
-void pci_msi_mask_irq(struct irq_data *data);
-void pci_msi_unmask_irq(struct irq_data *data);
-
/*
* The arch hooks to setup up msi irqs. Default functions are implemented
* as weak symbols so that they /can/ be overriden by architecture specific
@@ -468,18 +453,26 @@ void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int vir
void *platform_msi_get_host_data(struct irq_domain *domain);
#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
-#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
+/* PCI specific interfaces */
+#ifdef CONFIG_PCI_MSI
+struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
+void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
+void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
+void pci_msi_mask_irq(struct irq_data *data);
+void pci_msi_unmask_irq(struct irq_data *data);
struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
struct msi_domain_info *info,
struct irq_domain *parent);
u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev);
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
-#else
+#else /* CONFIG_PCI_MSI */
static inline struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
{
return NULL;
}
-#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */
+static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg) { }
+#endif /* !CONFIG_PCI_MSI */
#endif /* LINUX_MSI_H */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 16/39] genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
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>
---
drivers/base/Makefile | 2 +-
drivers/bus/fsl-mc/Kconfig | 2 +-
drivers/dma/Kconfig | 2 +-
drivers/dma/qcom/hidma.c | 8 ++++----
drivers/iommu/Kconfig | 2 +-
drivers/irqchip/Kconfig | 6 +++---
drivers/mailbox/Kconfig | 2 +-
drivers/pci/Kconfig | 1 -
drivers/perf/Kconfig | 2 +-
drivers/soc/ti/Kconfig | 2 +-
include/asm-generic/msi.h | 4 ++--
include/linux/device.h | 8 +++-----
include/linux/gpio/driver.h | 2 +-
include/linux/msi.h | 10 ++--------
kernel/irq/Kconfig | 7 +------
kernel/irq/msi.c | 3 ---
16 files changed, 23 insertions(+), 40 deletions(-)
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -22,7 +22,7 @@ obj-$(CONFIG_REGMAP) += regmap/
obj-$(CONFIG_SOC_BUS) += soc.o
obj-$(CONFIG_PINCTRL) += pinctrl.o
obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o
-obj-$(CONFIG_GENERIC_MSI_IRQ_DOMAIN) += platform-msi.o
+obj-$(CONFIG_GENERIC_MSI_IRQ) += platform-msi.o
obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += arch_topology.o
obj-$(CONFIG_GENERIC_ARCH_NUMA) += arch_numa.o
obj-$(CONFIG_ACPI) += physical_location.o
--- a/drivers/bus/fsl-mc/Kconfig
+++ b/drivers/bus/fsl-mc/Kconfig
@@ -8,7 +8,7 @@
config FSL_MC_BUS
bool "QorIQ DPAA2 fsl-mc bus driver"
depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86_LOCAL_APIC || PPC)))
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable the bus infrastructure for the QorIQ DPAA2
architecture. The fsl-mc bus driver handles discovery of
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -462,7 +462,7 @@ config MV_XOR_V2
select DMA_ENGINE
select DMA_ENGINE_RAID
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Enable support for the Marvell version 2 XOR engine.
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -610,7 +610,7 @@ static irqreturn_t hidma_chirq_handler(i
return hidma_ll_inthandler(chirq, lldev);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static irqreturn_t hidma_chirq_handler_msi(int chirq, void *arg)
{
struct hidma_lldev **lldevp = arg;
@@ -671,7 +671,7 @@ static int hidma_sysfs_init(struct hidma
return device_create_file(dev->ddev.dev, dev->chid_attrs);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static void hidma_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
{
struct device *dev = msi_desc_to_dev(desc);
@@ -687,7 +687,7 @@ static void hidma_write_msi_msg(struct m
static void hidma_free_msis(struct hidma_dev *dmadev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
struct device *dev = dmadev->ddev.dev;
int i, virq;
@@ -704,7 +704,7 @@ static void hidma_free_msis(struct hidma
static int hidma_request_msi(struct hidma_dev *dmadev,
struct platform_device *pdev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
int rc, i, virq;
rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -389,7 +389,7 @@ config ARM_SMMU_V3
depends on ARM64
select IOMMU_API
select IOMMU_IO_PGTABLE_LPAE
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Support for implementations of the ARM System MMU architecture
version 3 providing translation support to a PCIe root complex.
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -38,7 +38,7 @@ config ARM_GIC_V3
config ARM_GIC_V3_ITS
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default ARM_GIC_V3
config ARM_GIC_V3_ITS_PCI
@@ -375,7 +375,7 @@ config MVEBU_ICU
config MVEBU_ODMI
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
config MVEBU_PIC
bool
@@ -488,7 +488,7 @@ config IMX_MU_MSI
default m if ARCH_MXC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Provide a driver for the i.MX Messaging Unit block used as a
CPU-to-CPU MSI controller. This requires a specially crafted DT
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -223,7 +223,7 @@ config BCM_FLEXRM_MBOX
tristate "Broadcom FlexRM Mailbox"
depends on ARM64
depends on ARCH_BCM_IPROC || COMPILE_TEST
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default m if ARCH_BCM_IPROC
help
Mailbox implementation of the Broadcom FlexRM ring manager,
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,7 +38,6 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
- select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
--- a/drivers/perf/Kconfig
+++ b/drivers/perf/Kconfig
@@ -93,7 +93,7 @@ config ARM_PMU_ACPI
config ARM_SMMU_V3_PMU
tristate "ARM SMMUv3 Performance Monitors Extension"
depends on (ARM64 && ACPI) || (COMPILE_TEST && 64BIT)
- depends on GENERIC_MSI_IRQ_DOMAIN
+ depends on GENERIC_MSI_IRQ
help
Provides support for the ARM SMMUv3 Performance Monitor Counter
Groups (PMCG), which provide monitoring of transactions passing
--- a/drivers/soc/ti/Kconfig
+++ b/drivers/soc/ti/Kconfig
@@ -98,6 +98,6 @@ endif # SOC_TI
config TI_SCI_INTA_MSI_DOMAIN
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable Interrupt Aggregator specific MSI Domain.
--- a/include/asm-generic/msi.h
+++ b/include/asm-generic/msi.h
@@ -4,7 +4,7 @@
#include <linux/types.h>
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#ifndef NUM_MSI_ALLOC_SCRATCHPAD_REGS
# define NUM_MSI_ALLOC_SCRATCHPAD_REGS 2
@@ -36,6 +36,6 @@ typedef struct msi_alloc_info {
#define GENERIC_MSI_DOMAIN_OPS 1
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
#endif
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -378,10 +378,8 @@ struct dev_links_info {
* @data: Pointer to MSI device data
*/
struct dev_msi_info {
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- struct irq_domain *domain;
-#endif
#ifdef CONFIG_GENERIC_MSI_IRQ
+ struct irq_domain *domain;
struct msi_device_data *data;
#endif
};
@@ -742,7 +740,7 @@ static inline void set_dev_node(struct d
static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
return dev->msi.domain;
#else
return NULL;
@@ -751,7 +749,7 @@ static inline struct irq_domain *dev_get
static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
dev->msi.domain = d;
#endif
}
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -27,7 +27,7 @@ struct gpio_chip;
union gpio_irq_fwspec {
struct irq_fwspec fwspec;
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
msi_alloc_info_t msiinfo;
#endif
};
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -76,13 +76,7 @@ struct platform_msi_priv_data;
struct device_attribute;
void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-#ifdef CONFIG_GENERIC_MSI_IRQ
void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
-#else
-static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
-#endif
typedef void (*irq_write_msi_msg_t)(struct msi_desc *desc,
struct msi_msg *msg);
@@ -278,7 +272,7 @@ static inline void msi_device_destroy_sy
*/
bool arch_restore_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#include <linux/irqhandler.h>
@@ -466,6 +460,6 @@ u32 pci_msi_domain_get_msi_rid(struct ir
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
#endif /* LINUX_MSI_H */
--- a/kernel/irq/Kconfig
+++ b/kernel/irq/Kconfig
@@ -86,15 +86,10 @@ config GENERIC_IRQ_IPI
depends on SMP
select IRQ_DOMAIN_HIERARCHY
-# Generic MSI interrupt support
-config GENERIC_MSI_IRQ
- bool
-
# Generic MSI hierarchical interrupt domain support
-config GENERIC_MSI_IRQ_DOMAIN
+config GENERIC_MSI_IRQ
bool
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ
config IRQ_MSI_IOMMU
bool
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -461,7 +461,6 @@ static inline int msi_sysfs_populate_des
static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) { }
#endif /* !CONFIG_SYSFS */
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
@@ -1058,5 +1057,3 @@ struct msi_domain_info *msi_get_domain_i
{
return (struct msi_domain_info *)domain->host_data;
}
-
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 16/39] genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
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>
---
drivers/base/Makefile | 2 +-
drivers/bus/fsl-mc/Kconfig | 2 +-
drivers/dma/Kconfig | 2 +-
drivers/dma/qcom/hidma.c | 8 ++++----
drivers/iommu/Kconfig | 2 +-
drivers/irqchip/Kconfig | 6 +++---
drivers/mailbox/Kconfig | 2 +-
drivers/pci/Kconfig | 1 -
drivers/perf/Kconfig | 2 +-
drivers/soc/ti/Kconfig | 2 +-
include/asm-generic/msi.h | 4 ++--
include/linux/device.h | 8 +++-----
include/linux/gpio/driver.h | 2 +-
include/linux/msi.h | 10 ++--------
kernel/irq/Kconfig | 7 +------
kernel/irq/msi.c | 3 ---
16 files changed, 23 insertions(+), 40 deletions(-)
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -22,7 +22,7 @@ obj-$(CONFIG_REGMAP) += regmap/
obj-$(CONFIG_SOC_BUS) += soc.o
obj-$(CONFIG_PINCTRL) += pinctrl.o
obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o
-obj-$(CONFIG_GENERIC_MSI_IRQ_DOMAIN) += platform-msi.o
+obj-$(CONFIG_GENERIC_MSI_IRQ) += platform-msi.o
obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += arch_topology.o
obj-$(CONFIG_GENERIC_ARCH_NUMA) += arch_numa.o
obj-$(CONFIG_ACPI) += physical_location.o
--- a/drivers/bus/fsl-mc/Kconfig
+++ b/drivers/bus/fsl-mc/Kconfig
@@ -8,7 +8,7 @@
config FSL_MC_BUS
bool "QorIQ DPAA2 fsl-mc bus driver"
depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86_LOCAL_APIC || PPC)))
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable the bus infrastructure for the QorIQ DPAA2
architecture. The fsl-mc bus driver handles discovery of
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -462,7 +462,7 @@ config MV_XOR_V2
select DMA_ENGINE
select DMA_ENGINE_RAID
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Enable support for the Marvell version 2 XOR engine.
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -610,7 +610,7 @@ static irqreturn_t hidma_chirq_handler(i
return hidma_ll_inthandler(chirq, lldev);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static irqreturn_t hidma_chirq_handler_msi(int chirq, void *arg)
{
struct hidma_lldev **lldevp = arg;
@@ -671,7 +671,7 @@ static int hidma_sysfs_init(struct hidma
return device_create_file(dev->ddev.dev, dev->chid_attrs);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static void hidma_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
{
struct device *dev = msi_desc_to_dev(desc);
@@ -687,7 +687,7 @@ static void hidma_write_msi_msg(struct m
static void hidma_free_msis(struct hidma_dev *dmadev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
struct device *dev = dmadev->ddev.dev;
int i, virq;
@@ -704,7 +704,7 @@ static void hidma_free_msis(struct hidma
static int hidma_request_msi(struct hidma_dev *dmadev,
struct platform_device *pdev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
int rc, i, virq;
rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -389,7 +389,7 @@ config ARM_SMMU_V3
depends on ARM64
select IOMMU_API
select IOMMU_IO_PGTABLE_LPAE
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Support for implementations of the ARM System MMU architecture
version 3 providing translation support to a PCIe root complex.
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -38,7 +38,7 @@ config ARM_GIC_V3
config ARM_GIC_V3_ITS
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default ARM_GIC_V3
config ARM_GIC_V3_ITS_PCI
@@ -375,7 +375,7 @@ config MVEBU_ICU
config MVEBU_ODMI
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
config MVEBU_PIC
bool
@@ -488,7 +488,7 @@ config IMX_MU_MSI
default m if ARCH_MXC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Provide a driver for the i.MX Messaging Unit block used as a
CPU-to-CPU MSI controller. This requires a specially crafted DT
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -223,7 +223,7 @@ config BCM_FLEXRM_MBOX
tristate "Broadcom FlexRM Mailbox"
depends on ARM64
depends on ARCH_BCM_IPROC || COMPILE_TEST
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default m if ARCH_BCM_IPROC
help
Mailbox implementation of the Broadcom FlexRM ring manager,
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,7 +38,6 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
- select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
--- a/drivers/perf/Kconfig
+++ b/drivers/perf/Kconfig
@@ -93,7 +93,7 @@ config ARM_PMU_ACPI
config ARM_SMMU_V3_PMU
tristate "ARM SMMUv3 Performance Monitors Extension"
depends on (ARM64 && ACPI) || (COMPILE_TEST && 64BIT)
- depends on GENERIC_MSI_IRQ_DOMAIN
+ depends on GENERIC_MSI_IRQ
help
Provides support for the ARM SMMUv3 Performance Monitor Counter
Groups (PMCG), which provide monitoring of transactions passing
--- a/drivers/soc/ti/Kconfig
+++ b/drivers/soc/ti/Kconfig
@@ -98,6 +98,6 @@ endif # SOC_TI
config TI_SCI_INTA_MSI_DOMAIN
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable Interrupt Aggregator specific MSI Domain.
--- a/include/asm-generic/msi.h
+++ b/include/asm-generic/msi.h
@@ -4,7 +4,7 @@
#include <linux/types.h>
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#ifndef NUM_MSI_ALLOC_SCRATCHPAD_REGS
# define NUM_MSI_ALLOC_SCRATCHPAD_REGS 2
@@ -36,6 +36,6 @@ typedef struct msi_alloc_info {
#define GENERIC_MSI_DOMAIN_OPS 1
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
#endif
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -378,10 +378,8 @@ struct dev_links_info {
* @data: Pointer to MSI device data
*/
struct dev_msi_info {
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- struct irq_domain *domain;
-#endif
#ifdef CONFIG_GENERIC_MSI_IRQ
+ struct irq_domain *domain;
struct msi_device_data *data;
#endif
};
@@ -742,7 +740,7 @@ static inline void set_dev_node(struct d
static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
return dev->msi.domain;
#else
return NULL;
@@ -751,7 +749,7 @@ static inline struct irq_domain *dev_get
static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
dev->msi.domain = d;
#endif
}
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -27,7 +27,7 @@ struct gpio_chip;
union gpio_irq_fwspec {
struct irq_fwspec fwspec;
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
msi_alloc_info_t msiinfo;
#endif
};
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -76,13 +76,7 @@ struct platform_msi_priv_data;
struct device_attribute;
void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
-#ifdef CONFIG_GENERIC_MSI_IRQ
void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
-#else
-static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
-#endif
typedef void (*irq_write_msi_msg_t)(struct msi_desc *desc,
struct msi_msg *msg);
@@ -278,7 +272,7 @@ static inline void msi_device_destroy_sy
*/
bool arch_restore_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#include <linux/irqhandler.h>
@@ -466,6 +460,6 @@ u32 pci_msi_domain_get_msi_rid(struct ir
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev);
bool pci_dev_has_special_msi_domain(struct pci_dev *pdev);
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
#endif /* LINUX_MSI_H */
--- a/kernel/irq/Kconfig
+++ b/kernel/irq/Kconfig
@@ -86,15 +86,10 @@ config GENERIC_IRQ_IPI
depends on SMP
select IRQ_DOMAIN_HIERARCHY
-# Generic MSI interrupt support
-config GENERIC_MSI_IRQ
- bool
-
# Generic MSI hierarchical interrupt domain support
-config GENERIC_MSI_IRQ_DOMAIN
+config GENERIC_MSI_IRQ
bool
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ
config IRQ_MSI_IOMMU
bool
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -461,7 +461,6 @@ static inline int msi_sysfs_populate_des
static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) { }
#endif /* !CONFIG_SYSFS */
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
@@ -1058,5 +1057,3 @@ struct msi_domain_info *msi_get_domain_i
{
return (struct msi_domain_info *)domain->host_data;
}
-
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 16/39] genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:54 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:54 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:54:40PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> drivers/base/Makefile | 2 +-
> drivers/bus/fsl-mc/Kconfig | 2 +-
> drivers/dma/Kconfig | 2 +-
> drivers/dma/qcom/hidma.c | 8 ++++----
> drivers/iommu/Kconfig | 2 +-
> drivers/irqchip/Kconfig | 6 +++---
> drivers/mailbox/Kconfig | 2 +-
> drivers/pci/Kconfig | 1 -
> drivers/perf/Kconfig | 2 +-
> drivers/soc/ti/Kconfig | 2 +-
> include/asm-generic/msi.h | 4 ++--
> include/linux/device.h | 8 +++-----
> include/linux/gpio/driver.h | 2 +-
> include/linux/msi.h | 10 ++--------
> kernel/irq/Kconfig | 7 +------
> kernel/irq/msi.c | 3 ---
> 16 files changed, 23 insertions(+), 40 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 16/39] genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
@ 2022-11-16 17:54 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:54 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:40PM +0100, Thomas Gleixner wrote:
> 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>
> ---
> drivers/base/Makefile | 2 +-
> drivers/bus/fsl-mc/Kconfig | 2 +-
> drivers/dma/Kconfig | 2 +-
> drivers/dma/qcom/hidma.c | 8 ++++----
> drivers/iommu/Kconfig | 2 +-
> drivers/irqchip/Kconfig | 6 +++---
> drivers/mailbox/Kconfig | 2 +-
> drivers/pci/Kconfig | 1 -
> drivers/perf/Kconfig | 2 +-
> drivers/soc/ti/Kconfig | 2 +-
> include/asm-generic/msi.h | 4 ++--
> include/linux/device.h | 8 +++-----
> include/linux/gpio/driver.h | 2 +-
> include/linux/msi.h | 10 ++--------
> kernel/irq/Kconfig | 7 +------
> kernel/irq/msi.c | 3 ---
> 16 files changed, 23 insertions(+), 40 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq: Get rid of GENERIC_MSI_IRQ_DOMAIN
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Thomas Gleixner
2023-01-13 12:17 ` [PATCH] irqchip/imx: Do not unconditionally enable GENERIC_MSI_IRQ Ingo Molnar
-1 siblings, 1 reply; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 13e7accb81d6c07993385af8342238ff22b41ac8
Gitweb: https://git.kernel.org/tip/13e7accb81d6c07993385af8342238ff22b41ac8
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:40 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
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
---
drivers/base/Makefile | 2 +-
drivers/bus/fsl-mc/Kconfig | 2 +-
drivers/dma/Kconfig | 2 +-
drivers/dma/qcom/hidma.c | 8 ++++----
drivers/iommu/Kconfig | 2 +-
drivers/irqchip/Kconfig | 6 +++---
drivers/mailbox/Kconfig | 2 +-
drivers/pci/Kconfig | 1 -
drivers/perf/Kconfig | 2 +-
drivers/soc/ti/Kconfig | 2 +-
include/asm-generic/msi.h | 4 ++--
include/linux/device.h | 8 +++-----
include/linux/gpio/driver.h | 2 +-
include/linux/msi.h | 8 +++-----
kernel/irq/Kconfig | 7 +------
kernel/irq/msi.c | 3 ---
16 files changed, 24 insertions(+), 37 deletions(-)
diff --git a/drivers/base/Makefile b/drivers/base/Makefile
index 83217d2..3079bfe 100644
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -22,7 +22,7 @@ obj-$(CONFIG_REGMAP) += regmap/
obj-$(CONFIG_SOC_BUS) += soc.o
obj-$(CONFIG_PINCTRL) += pinctrl.o
obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o
-obj-$(CONFIG_GENERIC_MSI_IRQ_DOMAIN) += platform-msi.o
+obj-$(CONFIG_GENERIC_MSI_IRQ) += platform-msi.o
obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += arch_topology.o
obj-$(CONFIG_GENERIC_ARCH_NUMA) += arch_numa.o
obj-$(CONFIG_ACPI) += physical_location.o
diff --git a/drivers/bus/fsl-mc/Kconfig b/drivers/bus/fsl-mc/Kconfig
index b1fd559..9492342 100644
--- a/drivers/bus/fsl-mc/Kconfig
+++ b/drivers/bus/fsl-mc/Kconfig
@@ -8,7 +8,7 @@
config FSL_MC_BUS
bool "QorIQ DPAA2 fsl-mc bus driver"
depends on OF && (ARCH_LAYERSCAPE || (COMPILE_TEST && (ARM || ARM64 || X86_LOCAL_APIC || PPC)))
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable the bus infrastructure for the QorIQ DPAA2
architecture. The fsl-mc bus driver handles discovery of
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 7524b62..25e111a 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -462,7 +462,7 @@ config MV_XOR_V2
select DMA_ENGINE
select DMA_ENGINE_RAID
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Enable support for the Marvell version 2 XOR engine.
diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c
index 210f1a9..04d1c33 100644
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -610,7 +610,7 @@ static irqreturn_t hidma_chirq_handler(int chirq, void *arg)
return hidma_ll_inthandler(chirq, lldev);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static irqreturn_t hidma_chirq_handler_msi(int chirq, void *arg)
{
struct hidma_lldev **lldevp = arg;
@@ -671,7 +671,7 @@ static int hidma_sysfs_init(struct hidma_dev *dev)
return device_create_file(dev->ddev.dev, dev->chid_attrs);
}
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
static void hidma_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
{
struct device *dev = msi_desc_to_dev(desc);
@@ -687,7 +687,7 @@ static void hidma_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
static void hidma_free_msis(struct hidma_dev *dmadev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
struct device *dev = dmadev->ddev.dev;
int i, virq;
@@ -704,7 +704,7 @@ static void hidma_free_msis(struct hidma_dev *dmadev)
static int hidma_request_msi(struct hidma_dev *dmadev,
struct platform_device *pdev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
int rc, i, virq;
rc = platform_msi_domain_alloc_irqs(&pdev->dev, HIDMA_MSI_INTS,
diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index dc5f7a1..8eaf9b7 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -389,7 +389,7 @@ config ARM_SMMU_V3
depends on ARM64
select IOMMU_API
select IOMMU_IO_PGTABLE_LPAE
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Support for implementations of the ARM System MMU architecture
version 3 providing translation support to a PCIe root complex.
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 7ef9f5e..ffea6a8 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -38,7 +38,7 @@ config ARM_GIC_V3
config ARM_GIC_V3_ITS
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default ARM_GIC_V3
config ARM_GIC_V3_ITS_PCI
@@ -375,7 +375,7 @@ config MVEBU_ICU
config MVEBU_ODMI
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
config MVEBU_PIC
bool
@@ -488,7 +488,7 @@ config IMX_MU_MSI
default m if ARCH_MXC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Provide a driver for the i.MX Messaging Unit block used as a
CPU-to-CPU MSI controller. This requires a specially crafted DT
diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
index 05d6fae..d7af896 100644
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -223,7 +223,7 @@ config BCM_FLEXRM_MBOX
tristate "Broadcom FlexRM Mailbox"
depends on ARM64
depends on ARCH_BCM_IPROC || COMPILE_TEST
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
default m if ARCH_BCM_IPROC
help
Mailbox implementation of the Broadcom FlexRM ring manager,
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index b7f6221..9309f24 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -38,7 +38,6 @@ source "drivers/pci/pcie/Kconfig"
config PCI_MSI
bool "Message Signaled Interrupts (MSI and MSI-X)"
- select GENERIC_MSI_IRQ_DOMAIN
select GENERIC_MSI_IRQ
help
This allows device drivers to enable MSI (Message Signaled
diff --git a/drivers/perf/Kconfig b/drivers/perf/Kconfig
index 341010f..692ffd5 100644
--- a/drivers/perf/Kconfig
+++ b/drivers/perf/Kconfig
@@ -93,7 +93,7 @@ config ARM_PMU_ACPI
config ARM_SMMU_V3_PMU
tristate "ARM SMMUv3 Performance Monitors Extension"
depends on (ARM64 && ACPI) || (COMPILE_TEST && 64BIT)
- depends on GENERIC_MSI_IRQ_DOMAIN
+ depends on GENERIC_MSI_IRQ
help
Provides support for the ARM SMMUv3 Performance Monitor Counter
Groups (PMCG), which provide monitoring of transactions passing
diff --git a/drivers/soc/ti/Kconfig b/drivers/soc/ti/Kconfig
index 7e2fb1c..e9a597e 100644
--- a/drivers/soc/ti/Kconfig
+++ b/drivers/soc/ti/Kconfig
@@ -98,6 +98,6 @@ endif # SOC_TI
config TI_SCI_INTA_MSI_DOMAIN
bool
- select GENERIC_MSI_IRQ_DOMAIN
+ select GENERIC_MSI_IRQ
help
Driver to enable Interrupt Aggregator specific MSI Domain.
diff --git a/include/asm-generic/msi.h b/include/asm-generic/msi.h
index bf910d4..124c734 100644
--- a/include/asm-generic/msi.h
+++ b/include/asm-generic/msi.h
@@ -4,7 +4,7 @@
#include <linux/types.h>
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#ifndef NUM_MSI_ALLOC_SCRATCHPAD_REGS
# define NUM_MSI_ALLOC_SCRATCHPAD_REGS 2
@@ -36,6 +36,6 @@ typedef struct msi_alloc_info {
#define GENERIC_MSI_DOMAIN_OPS 1
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
#endif
diff --git a/include/linux/device.h b/include/linux/device.h
index 424b55d..c90a444 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -378,10 +378,8 @@ struct dev_links_info {
* @data: Pointer to MSI device data
*/
struct dev_msi_info {
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
- struct irq_domain *domain;
-#endif
#ifdef CONFIG_GENERIC_MSI_IRQ
+ struct irq_domain *domain;
struct msi_device_data *data;
#endif
};
@@ -742,7 +740,7 @@ static inline void set_dev_node(struct device *dev, int node)
static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
return dev->msi.domain;
#else
return NULL;
@@ -751,7 +749,7 @@ static inline struct irq_domain *dev_get_msi_domain(const struct device *dev)
static inline void dev_set_msi_domain(struct device *dev, struct irq_domain *d)
{
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
dev->msi.domain = d;
#endif
}
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
index 6aeea10..88ae451 100644
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -27,7 +27,7 @@ struct gpio_chip;
union gpio_irq_fwspec {
struct irq_fwspec fwspec;
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
msi_alloc_info_t msiinfo;
#endif
};
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 9b84145..8b28714 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -79,9 +79,7 @@ void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
#ifdef CONFIG_GENERIC_MSI_IRQ
void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
#else
-static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
-{
-}
+static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg) { }
#endif
typedef void (*irq_write_msi_msg_t)(struct msi_desc *desc,
@@ -278,7 +276,7 @@ static inline void msi_device_destroy_sysfs(struct device *dev) { }
*/
bool arch_restore_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
+#ifdef CONFIG_GENERIC_MSI_IRQ
#include <linux/irqhandler.h>
@@ -451,7 +449,7 @@ int platform_msi_device_domain_alloc(struct irq_domain *domain, unsigned int vir
void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int virq,
unsigned int nvec);
void *platform_msi_get_host_data(struct irq_domain *domain);
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
+#endif /* CONFIG_GENERIC_MSI_IRQ */
/* PCI specific interfaces */
#ifdef CONFIG_PCI_MSI
diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig
index db3d174..b64c44a 100644
--- a/kernel/irq/Kconfig
+++ b/kernel/irq/Kconfig
@@ -86,15 +86,10 @@ config GENERIC_IRQ_IPI
depends on SMP
select IRQ_DOMAIN_HIERARCHY
-# Generic MSI interrupt support
-config GENERIC_MSI_IRQ
- bool
-
# Generic MSI hierarchical interrupt domain support
-config GENERIC_MSI_IRQ_DOMAIN
+config GENERIC_MSI_IRQ
bool
select IRQ_DOMAIN_HIERARCHY
- select GENERIC_MSI_IRQ
config IRQ_MSI_IOMMU
bool
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index b46b747..4fde917 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -461,7 +461,6 @@ static inline int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *d
static inline void msi_sysfs_remove_desc(struct device *dev, struct msi_desc *desc) { }
#endif /* !CONFIG_SYSFS */
-#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN
static int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, int nvec);
static void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev);
@@ -1058,5 +1057,3 @@ struct msi_domain_info *msi_get_domain_info(struct irq_domain *domain)
{
return (struct msi_domain_info *)domain->host_data;
}
-
-#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [PATCH] irqchip/imx: Do not unconditionally enable GENERIC_MSI_IRQ
2022-11-17 15:08 ` [tip: irq/core] " tip-bot2 for Thomas Gleixner
@ 2023-01-13 12:17 ` Ingo Molnar
2023-01-17 9:25 ` Thomas Gleixner
0 siblings, 1 reply; 283+ messages in thread
From: Ingo Molnar @ 2023-01-13 12:17 UTC (permalink / raw)
To: linux-kernel, Thomas Gleixner
Cc: linux-tip-commits, Thomas Gleixner, Jason Gunthorpe, x86, maz
* tip-bot2 for Thomas Gleixner <tip-bot2@linutronix.de> wrote:
> The following commit has been merged into the irq/core branch of tip:
>
> Commit-ID: 13e7accb81d6c07993385af8342238ff22b41ac8
> Gitweb: https://git.kernel.org/tip/13e7accb81d6c07993385af8342238ff22b41ac8
> Author: Thomas Gleixner <tglx@linutronix.de>
> AuthorDate: Fri, 11 Nov 2022 14:54:40 +01:00
> Committer: Thomas Gleixner <tglx@linutronix.de>
> CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
>
> 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
The above commit started triggering a CONFIG_COMPILE_TEST=y build error on
non-APIC x86 builds, the most straightforward fix is to only build that
driver on ARM - given the dependency mess force-selected options generally
cause.
Any better solutions?
Thanks,
Ingo
=====================>
From: Ingo Molnar <mingo@kernel.org>
Date: Fri, 13 Jan 2023 13:10:05 +0100
Subject: [PATCH] irqchip/imx: Do not unconditionally enable GENERIC_MSI_IRQ
The IMX_MU_MSI ARM driver force-selects CONFIG_GENERIC_MSI_IRQ if CONFIG_COMPILE_TEST=y:
config IMX_MU_MSI
tristate "i.MX MU used as MSI controller"
depends on OF && HAS_IOMEM
depends on ARCH_MXC || COMPILE_TEST
default m if ARCH_MXC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
select GENERIC_MSI_IRQ
help
But that's not unconditionally valid - for example on x86 UP kernel builds
that have the local APIC disabled there's no MSI functionality - resulting
in build failures like:
./include/linux/gpio/driver.h:32:33: error: field ‘msiinfo’ has incomplete type
kernel/irq/msi.c:739:19: error: invalid use of incomplete typedef ‘msi_alloc_info_t’ {aka ‘struct irq_alloc_info’}
Fixes: 13e7accb81d6 genirq: ("Get rid of GENERIC_MSI_IRQ_DOMAIN")
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
drivers/irqchip/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index caa952c40ff9..39578da6ee45 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -484,7 +484,7 @@ config IMX_INTMUX
config IMX_MU_MSI
tristate "i.MX MU used as MSI controller"
depends on OF && HAS_IOMEM
- depends on ARCH_MXC || COMPILE_TEST
+ depends on ARCH_MXC
default m if ARCH_MXC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [PATCH] irqchip/imx: Do not unconditionally enable GENERIC_MSI_IRQ
2023-01-13 12:17 ` [PATCH] irqchip/imx: Do not unconditionally enable GENERIC_MSI_IRQ Ingo Molnar
@ 2023-01-17 9:25 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2023-01-17 9:25 UTC (permalink / raw)
To: Ingo Molnar, linux-kernel; +Cc: linux-tip-commits, Jason Gunthorpe, x86, maz
On Fri, Jan 13 2023 at 13:17, Ingo Molnar wrote:
> config IMX_MU_MSI
> tristate "i.MX MU used as MSI controller"
> depends on OF && HAS_IOMEM
> depends on ARCH_MXC || COMPILE_TEST
> default m if ARCH_MXC
> select IRQ_DOMAIN
> select IRQ_DOMAIN_HIERARCHY
> select GENERIC_MSI_IRQ
> help
>
> But that's not unconditionally valid - for example on x86 UP kernel builds
> that have the local APIC disabled there's no MSI functionality - resulting
> in build failures like:
>
> ./include/linux/gpio/driver.h:32:33: error: field ‘msiinfo’ has incomplete type
> kernel/irq/msi.c:739:19: error: invalid use of incomplete typedef ‘msi_alloc_info_t’ {aka ‘struct irq_alloc_info’}
What prevents us from either
- exposing msi_alloc_info_t unconditionally (it should not matter)
or
- killing that 32bit UP && APIC=n combo (which removes quite some
ifdef cruft)
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 17/39] PCI/MSI: Get rid of externs in msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
Follow the style of <linux/pci.h>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -5,12 +5,12 @@
#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
-extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
#else
static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 17/39] PCI/MSI: Get rid of externs in msi.h
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
Follow the style of <linux/pci.h>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -5,12 +5,12 @@
#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
-extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
#else
static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 17/39] PCI/MSI: Get rid of externs in msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:15 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:15 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:42PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Follow the style of <linux/pci.h>
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -5,12 +5,12 @@
>
> #define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
>
> -extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
> +int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
>
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> -extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> +int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> #else
> static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> {
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 17/39] PCI/MSI: Get rid of externs in msi.h
@ 2022-11-16 16:15 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:15 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:42PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Follow the style of <linux/pci.h>
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -5,12 +5,12 @@
>
> #define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
>
> -extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
> +int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
>
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> -extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> +int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> #else
> static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> {
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 17/39] PCI/MSI: Get rid of externs in msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:54 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:54 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:42PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Follow the style of <linux/pci.h>
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 17/39] PCI/MSI: Get rid of externs in msi.h
@ 2022-11-16 17:54 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:54 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:42PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> Follow the style of <linux/pci.h>
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Get rid of externs in msi.h
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Jason Gunthorpe,
Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: db537dd3bf83169d78e5617b75158f64deabcb0b
Gitweb: https://git.kernel.org/tip/db537dd3bf83169d78e5617b75158f64deabcb0b
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:42 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Get rid of externs in msi.h
Follow the style of <linux/pci.h>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.582175082@linutronix.de
---
drivers/pci/msi/msi.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index dbeff06..fc92603 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -5,12 +5,12 @@
#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
-extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
#else
static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
The upcoming support for per device MSI interrupt domains needs to share
some of the inline helpers with the MSI implementation.
Move them to the header file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 61 +--------------------------------------
drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 74 insertions(+), 70 deletions(-)
---
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 160af9f01669..5c310df55d0d 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,7 +16,7 @@
static int pci_msi_enable = 1;
int pci_msi_ignore_mask;
-static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
unsigned long flags;
@@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
raw_spin_unlock_irqrestore(lock, flags);
}
-static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, 0, mask);
-}
-
-static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, mask, 0);
-}
-
-static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
-{
- return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
-}
-
-/*
- * This internal function does not flush PCI writes to the device. All
- * users must ensure that they read from the device before either assuming
- * that the device state is up to date, or returning out of this file.
- * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
- */
-static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
-{
- void __iomem *desc_addr = pci_msix_desc_addr(desc);
-
- if (desc->pci.msi_attrib.can_mask)
- writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
-}
-
-static inline void pci_msix_mask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
- /* Flush write to device */
- readl(desc->pci.mask_base);
-}
-
-static inline void pci_msix_unmask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
-}
-
-static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_mask(desc);
- else
- pci_msi_mask(desc, mask);
-}
-
-static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_unmask(desc);
- else
- pci_msi_unmask(desc, mask);
-}
-
/**
* pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
* @data: pointer to irqdata associated to that interrupt
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index fc92603b33e1..d8f62d911f08 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -8,21 +8,67 @@
int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
-#else
-static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+/* Mask/unmask helpers */
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
+
+static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
- return -ENODEV;
+ pci_msi_update_mask(desc, 0, mask);
}
-static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
+ pci_msi_update_mask(desc, mask, 0);
+}
+
+static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
+{
+ return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
+}
+
+/*
+ * This internal function does not flush PCI writes to the device. All
+ * users must ensure that they read from the device before either assuming
+ * that the device state is up to date, or returning out of this file.
+ * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
+ */
+static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
+{
+ void __iomem *desc_addr = pci_msix_desc_addr(desc);
+
+ if (desc->pci.msi_attrib.can_mask)
+ writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
+}
+
+static inline void pci_msix_mask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+ /* Flush write to device */
+ readl(desc->pci.mask_base);
+}
+
+static inline void pci_msix_unmask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+}
+
+static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_mask(desc);
+ else
+ pci_msi_mask(desc, mask);
+}
+
+static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_unmask(desc);
+ else
+ pci_msi_unmask(desc, mask);
}
-#endif
/*
* PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
@@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return 0xffffffff;
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+
+/* Legacy (!IRQDOMAIN) fallbacks */
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+#else
+static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+ WARN_ON_ONCE(1);
+ return -ENODEV;
+}
+
+static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+{
+ WARN_ON_ONCE(1);
+}
+#endif
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
The upcoming support for per device MSI interrupt domains needs to share
some of the inline helpers with the MSI implementation.
Move them to the header file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 61 +--------------------------------------
drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 74 insertions(+), 70 deletions(-)
---
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 160af9f01669..5c310df55d0d 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,7 +16,7 @@
static int pci_msi_enable = 1;
int pci_msi_ignore_mask;
-static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
unsigned long flags;
@@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
raw_spin_unlock_irqrestore(lock, flags);
}
-static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, 0, mask);
-}
-
-static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, mask, 0);
-}
-
-static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
-{
- return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
-}
-
-/*
- * This internal function does not flush PCI writes to the device. All
- * users must ensure that they read from the device before either assuming
- * that the device state is up to date, or returning out of this file.
- * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
- */
-static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
-{
- void __iomem *desc_addr = pci_msix_desc_addr(desc);
-
- if (desc->pci.msi_attrib.can_mask)
- writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
-}
-
-static inline void pci_msix_mask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
- /* Flush write to device */
- readl(desc->pci.mask_base);
-}
-
-static inline void pci_msix_unmask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
-}
-
-static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_mask(desc);
- else
- pci_msi_mask(desc, mask);
-}
-
-static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_unmask(desc);
- else
- pci_msi_unmask(desc, mask);
-}
-
/**
* pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
* @data: pointer to irqdata associated to that interrupt
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index fc92603b33e1..d8f62d911f08 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -8,21 +8,67 @@
int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
-#else
-static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+/* Mask/unmask helpers */
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
+
+static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
- return -ENODEV;
+ pci_msi_update_mask(desc, 0, mask);
}
-static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
+ pci_msi_update_mask(desc, mask, 0);
+}
+
+static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
+{
+ return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
+}
+
+/*
+ * This internal function does not flush PCI writes to the device. All
+ * users must ensure that they read from the device before either assuming
+ * that the device state is up to date, or returning out of this file.
+ * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
+ */
+static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
+{
+ void __iomem *desc_addr = pci_msix_desc_addr(desc);
+
+ if (desc->pci.msi_attrib.can_mask)
+ writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
+}
+
+static inline void pci_msix_mask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+ /* Flush write to device */
+ readl(desc->pci.mask_base);
+}
+
+static inline void pci_msix_unmask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+}
+
+static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_mask(desc);
+ else
+ pci_msi_mask(desc, mask);
+}
+
+static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_unmask(desc);
+ else
+ pci_msi_unmask(desc, mask);
}
-#endif
/*
* PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
@@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return 0xffffffff;
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+
+/* Legacy (!IRQDOMAIN) fallbacks */
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+#else
+static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+ WARN_ON_ONCE(1);
+ return -ENODEV;
+}
+
+static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+{
+ WARN_ON_ONCE(1);
+}
+#endif
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:16 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:16 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:43PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> The upcoming support for per device MSI interrupt domains needs to share
> some of the inline helpers with the MSI implementation.
>
> Move them to the header file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 61 +--------------------------------------
> drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
> 2 files changed, 74 insertions(+), 70 deletions(-)
> ---
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 160af9f01669..5c310df55d0d 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -16,7 +16,7 @@
> static int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> -static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> +void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> {
> raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
> unsigned long flags;
> @@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
> raw_spin_unlock_irqrestore(lock, flags);
> }
>
> -static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
> -{
> - pci_msi_update_mask(desc, 0, mask);
> -}
> -
> -static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
> -{
> - pci_msi_update_mask(desc, mask, 0);
> -}
> -
> -static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
> -{
> - return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
> -}
> -
> -/*
> - * This internal function does not flush PCI writes to the device. All
> - * users must ensure that they read from the device before either assuming
> - * that the device state is up to date, or returning out of this file.
> - * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
> - */
> -static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
> -{
> - void __iomem *desc_addr = pci_msix_desc_addr(desc);
> -
> - if (desc->pci.msi_attrib.can_mask)
> - writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
> -}
> -
> -static inline void pci_msix_mask(struct msi_desc *desc)
> -{
> - desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
> - pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> - /* Flush write to device */
> - readl(desc->pci.mask_base);
> -}
> -
> -static inline void pci_msix_unmask(struct msi_desc *desc)
> -{
> - desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
> - pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> -}
> -
> -static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
> -{
> - if (desc->pci.msi_attrib.is_msix)
> - pci_msix_mask(desc);
> - else
> - pci_msi_mask(desc, mask);
> -}
> -
> -static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
> -{
> - if (desc->pci.msi_attrib.is_msix)
> - pci_msix_unmask(desc);
> - else
> - pci_msi_unmask(desc, mask);
> -}
> -
> /**
> * pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
> * @data: pointer to irqdata associated to that interrupt
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index fc92603b33e1..d8f62d911f08 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -8,21 +8,67 @@
> int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
>
> -#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> -int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> -#else
> -static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +/* Mask/unmask helpers */
> +void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
> +
> +static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
> {
> - WARN_ON_ONCE(1);
> - return -ENODEV;
> + pci_msi_update_mask(desc, 0, mask);
> }
>
> -static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
> +static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
> {
> - WARN_ON_ONCE(1);
> + pci_msi_update_mask(desc, mask, 0);
> +}
> +
> +static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
> +{
> + return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
> +}
> +
> +/*
> + * This internal function does not flush PCI writes to the device. All
> + * users must ensure that they read from the device before either assuming
> + * that the device state is up to date, or returning out of this file.
> + * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
> + */
> +static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
> +{
> + void __iomem *desc_addr = pci_msix_desc_addr(desc);
> +
> + if (desc->pci.msi_attrib.can_mask)
> + writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
> +}
> +
> +static inline void pci_msix_mask(struct msi_desc *desc)
> +{
> + desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
> + pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> + /* Flush write to device */
> + readl(desc->pci.mask_base);
> +}
> +
> +static inline void pci_msix_unmask(struct msi_desc *desc)
> +{
> + desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
> + pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> +}
> +
> +static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
> +{
> + if (desc->pci.msi_attrib.is_msix)
> + pci_msix_mask(desc);
> + else
> + pci_msi_mask(desc, mask);
> +}
> +
> +static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
> +{
> + if (desc->pci.msi_attrib.is_msix)
> + pci_msix_unmask(desc);
> + else
> + pci_msi_unmask(desc, mask);
> }
> -#endif
>
> /*
> * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
> @@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return 0xffffffff;
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
> +
> +/* Legacy (!IRQDOMAIN) fallbacks */
> +#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> +int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> +#else
> +static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +{
> + WARN_ON_ONCE(1);
> + return -ENODEV;
> +}
> +
> +static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
> +{
> + WARN_ON_ONCE(1);
> +}
> +#endif
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
@ 2022-11-16 16:16 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:16 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:43PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> The upcoming support for per device MSI interrupt domains needs to share
> some of the inline helpers with the MSI implementation.
>
> Move them to the header file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 61 +--------------------------------------
> drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
> 2 files changed, 74 insertions(+), 70 deletions(-)
> ---
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 160af9f01669..5c310df55d0d 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -16,7 +16,7 @@
> static int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> -static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> +void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> {
> raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
> unsigned long flags;
> @@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
> raw_spin_unlock_irqrestore(lock, flags);
> }
>
> -static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
> -{
> - pci_msi_update_mask(desc, 0, mask);
> -}
> -
> -static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
> -{
> - pci_msi_update_mask(desc, mask, 0);
> -}
> -
> -static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
> -{
> - return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
> -}
> -
> -/*
> - * This internal function does not flush PCI writes to the device. All
> - * users must ensure that they read from the device before either assuming
> - * that the device state is up to date, or returning out of this file.
> - * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
> - */
> -static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
> -{
> - void __iomem *desc_addr = pci_msix_desc_addr(desc);
> -
> - if (desc->pci.msi_attrib.can_mask)
> - writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
> -}
> -
> -static inline void pci_msix_mask(struct msi_desc *desc)
> -{
> - desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
> - pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> - /* Flush write to device */
> - readl(desc->pci.mask_base);
> -}
> -
> -static inline void pci_msix_unmask(struct msi_desc *desc)
> -{
> - desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
> - pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> -}
> -
> -static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
> -{
> - if (desc->pci.msi_attrib.is_msix)
> - pci_msix_mask(desc);
> - else
> - pci_msi_mask(desc, mask);
> -}
> -
> -static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
> -{
> - if (desc->pci.msi_attrib.is_msix)
> - pci_msix_unmask(desc);
> - else
> - pci_msi_unmask(desc, mask);
> -}
> -
> /**
> * pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
> * @data: pointer to irqdata associated to that interrupt
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index fc92603b33e1..d8f62d911f08 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -8,21 +8,67 @@
> int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
>
> -#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> -int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> -void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> -#else
> -static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +/* Mask/unmask helpers */
> +void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
> +
> +static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
> {
> - WARN_ON_ONCE(1);
> - return -ENODEV;
> + pci_msi_update_mask(desc, 0, mask);
> }
>
> -static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
> +static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
> {
> - WARN_ON_ONCE(1);
> + pci_msi_update_mask(desc, mask, 0);
> +}
> +
> +static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
> +{
> + return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
> +}
> +
> +/*
> + * This internal function does not flush PCI writes to the device. All
> + * users must ensure that they read from the device before either assuming
> + * that the device state is up to date, or returning out of this file.
> + * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
> + */
> +static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
> +{
> + void __iomem *desc_addr = pci_msix_desc_addr(desc);
> +
> + if (desc->pci.msi_attrib.can_mask)
> + writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
> +}
> +
> +static inline void pci_msix_mask(struct msi_desc *desc)
> +{
> + desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
> + pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> + /* Flush write to device */
> + readl(desc->pci.mask_base);
> +}
> +
> +static inline void pci_msix_unmask(struct msi_desc *desc)
> +{
> + desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
> + pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
> +}
> +
> +static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
> +{
> + if (desc->pci.msi_attrib.is_msix)
> + pci_msix_mask(desc);
> + else
> + pci_msi_mask(desc, mask);
> +}
> +
> +static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
> +{
> + if (desc->pci.msi_attrib.is_msix)
> + pci_msix_unmask(desc);
> + else
> + pci_msi_unmask(desc, mask);
> }
> -#endif
>
> /*
> * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
> @@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return 0xffffffff;
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
> +
> +/* Legacy (!IRQDOMAIN) fallbacks */
> +#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> +int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> +void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
> +#else
> +static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
> +{
> + WARN_ON_ONCE(1);
> + return -ENODEV;
> +}
> +
> +static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
> +{
> + WARN_ON_ONCE(1);
> +}
> +#endif
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 17:55 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:55 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:43PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> The upcoming support for per device MSI interrupt domains needs to share
> some of the inline helpers with the MSI implementation.
>
> Move them to the header file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> ---
> drivers/pci/msi/msi.c | 61 +--------------------------------------
> drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
> 2 files changed, 74 insertions(+), 70 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 18/39] PCI/MSI: Move mask and unmask helpers to msi.h
@ 2022-11-16 17:55 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:55 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:43PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> The upcoming support for per device MSI interrupt domains needs to share
> some of the inline helpers with the MSI implementation.
>
> Move them to the header file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> ---
> drivers/pci/msi/msi.c | 61 +--------------------------------------
> drivers/pci/msi/msi.h | 83 +++++++++++++++++++++++++++++++++++++++++++++-------
> 2 files changed, 74 insertions(+), 70 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move mask and unmask helpers to msi.h
2022-11-11 13:54 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Jason Gunthorpe,
Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: c93fd5266cff2afa908659c817c6aff4d5ed6283
Gitweb: https://git.kernel.org/tip/c93fd5266cff2afa908659c817c6aff4d5ed6283
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:43 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move mask and unmask helpers to msi.h
The upcoming support for per device MSI interrupt domains needs to share
some of the inline helpers with the MSI implementation.
Move them to the header file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.640052354@linutronix.de
---
drivers/pci/msi/msi.c | 61 +-------------------------------
drivers/pci/msi/msi.h | 83 ++++++++++++++++++++++++++++++++++++------
2 files changed, 74 insertions(+), 70 deletions(-)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 160af9f..5c310df 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,7 +16,7 @@
static int pci_msi_enable = 1;
int pci_msi_ignore_mask;
-static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
unsigned long flags;
@@ -32,65 +32,6 @@ static noinline void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 s
raw_spin_unlock_irqrestore(lock, flags);
}
-static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, 0, mask);
-}
-
-static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
-{
- pci_msi_update_mask(desc, mask, 0);
-}
-
-static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
-{
- return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
-}
-
-/*
- * This internal function does not flush PCI writes to the device. All
- * users must ensure that they read from the device before either assuming
- * that the device state is up to date, or returning out of this file.
- * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
- */
-static void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
-{
- void __iomem *desc_addr = pci_msix_desc_addr(desc);
-
- if (desc->pci.msi_attrib.can_mask)
- writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
-}
-
-static inline void pci_msix_mask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
- /* Flush write to device */
- readl(desc->pci.mask_base);
-}
-
-static inline void pci_msix_unmask(struct msi_desc *desc)
-{
- desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
- pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
-}
-
-static void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_mask(desc);
- else
- pci_msi_mask(desc, mask);
-}
-
-static void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
-{
- if (desc->pci.msi_attrib.is_msix)
- pci_msix_unmask(desc);
- else
- pci_msi_unmask(desc, mask);
-}
-
/**
* pci_msi_mask_irq - Generic IRQ chip callback to mask PCI/MSI interrupts
* @data: pointer to irqdata associated to that interrupt
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index fc92603..d8f62d9 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -8,21 +8,67 @@
int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
-#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
-int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
-void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
-#else
-static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+/* Mask/unmask helpers */
+void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
+
+static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
- return -ENODEV;
+ pci_msi_update_mask(desc, 0, mask);
}
-static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
{
- WARN_ON_ONCE(1);
+ pci_msi_update_mask(desc, mask, 0);
+}
+
+static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
+{
+ return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
+}
+
+/*
+ * This internal function does not flush PCI writes to the device. All
+ * users must ensure that they read from the device before either assuming
+ * that the device state is up to date, or returning out of this file.
+ * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
+ */
+static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
+{
+ void __iomem *desc_addr = pci_msix_desc_addr(desc);
+
+ if (desc->pci.msi_attrib.can_mask)
+ writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
+}
+
+static inline void pci_msix_mask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+ /* Flush write to device */
+ readl(desc->pci.mask_base);
+}
+
+static inline void pci_msix_unmask(struct msi_desc *desc)
+{
+ desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
+ pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
+}
+
+static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_mask(desc);
+ else
+ pci_msi_mask(desc, mask);
+}
+
+static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
+{
+ if (desc->pci.msi_attrib.is_msix)
+ pci_msix_unmask(desc);
+ else
+ pci_msi_unmask(desc, mask);
}
-#endif
/*
* PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
@@ -37,3 +83,20 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return 0xffffffff;
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+
+/* Legacy (!IRQDOMAIN) fallbacks */
+#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
+int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
+void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
+#else
+static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+ WARN_ON_ONCE(1);
+ return -ENODEV;
+}
+
+static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
+{
+ WARN_ON_ONCE(1);
+}
+#endif
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 19/39] PCI/MSI: Move pci_disable_msi() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
msi.c is a maze of randomly sorted functions which makes the code
unreadable. As a first step split the driver visible API and the internal
implementation which also allows proper API documentation via one file.
Create drivers/pci/msi/api.c to group all exported device-driver PCI/MSI
APIs in one C file.
Begin by moving pci_disable_msi() there and add kernel-doc for the function
as appropriate.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/Makefile | 3 +--
drivers/pci/msi/api.c | 37 +++++++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 22 +++++-----------------
drivers/pci/msi/msi.h | 4 ++++
4 files changed, 47 insertions(+), 19 deletions(-)
create mode 100644 drivers/pci/msi/api.c
---
diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
index 4e0a7e07965e..839ff72d72a8 100644
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -2,6 +2,5 @@
#
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
-obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += api.o msi.o irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
new file mode 100644
index 000000000000..7485942cbe5d
--- /dev/null
+++ b/drivers/pci/msi/api.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * PCI MSI/MSI-X — Exported APIs for device drivers
+ *
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ * Copyright (C) 2016 Christoph Hellwig.
+ * Copyright (C) 2022 Linutronix GmbH
+ */
+
+#include <linux/export.h>
+
+#include "msi.h"
+
+/**
+ * pci_disable_msi() - Disable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI interrupt mode on device,
+ * free earlier allocated interrupt vectors, and restore INTx emulation.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default
+ * pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msi(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msi_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msi);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 5c310df55d0d..4a1300b74518 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -163,7 +163,7 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-static void free_msi_irqs(struct pci_dev *dev)
+void pci_free_msi_irqs(struct pci_dev *dev)
{
pci_msi_teardown_msi_irqs(dev);
@@ -413,7 +413,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
err:
pci_msi_unmask(entry, msi_multi_mask(entry));
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
fail:
dev->msi_enabled = 0;
unlock:
@@ -531,7 +531,7 @@ static int msix_setup_interrupts(struct pci_dev *dev, void __iomem *base,
goto out_unlock;
out_free:
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
out_unlock:
msi_unlock_descs(&dev->dev);
kfree(masks);
@@ -680,7 +680,7 @@ int pci_msi_vec_count(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_msi_vec_count);
-static void pci_msi_shutdown(struct pci_dev *dev)
+void pci_msi_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -701,18 +701,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msi(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msi_shutdown(dev);
- free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msi);
-
/**
* pci_msix_vec_count - return the number of device's MSI-X table entries
* @dev: pointer to the pci_dev data structure of MSI-X device function
@@ -797,7 +785,7 @@ void pci_disable_msix(struct pci_dev *dev)
msi_lock_descs(&dev->dev);
pci_msix_shutdown(dev);
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msix);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index d8f62d911f08..634879277349 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,10 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* MSI internal functions invoked from the public APIs */
+void pci_msi_shutdown(struct pci_dev *dev);
+void pci_free_msi_irqs(struct pci_dev *dev);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 19/39] PCI/MSI: Move pci_disable_msi() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
msi.c is a maze of randomly sorted functions which makes the code
unreadable. As a first step split the driver visible API and the internal
implementation which also allows proper API documentation via one file.
Create drivers/pci/msi/api.c to group all exported device-driver PCI/MSI
APIs in one C file.
Begin by moving pci_disable_msi() there and add kernel-doc for the function
as appropriate.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/Makefile | 3 +--
drivers/pci/msi/api.c | 37 +++++++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 22 +++++-----------------
drivers/pci/msi/msi.h | 4 ++++
4 files changed, 47 insertions(+), 19 deletions(-)
create mode 100644 drivers/pci/msi/api.c
---
diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
index 4e0a7e07965e..839ff72d72a8 100644
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -2,6 +2,5 @@
#
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
-obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += api.o msi.o irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
new file mode 100644
index 000000000000..7485942cbe5d
--- /dev/null
+++ b/drivers/pci/msi/api.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * PCI MSI/MSI-X — Exported APIs for device drivers
+ *
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ * Copyright (C) 2016 Christoph Hellwig.
+ * Copyright (C) 2022 Linutronix GmbH
+ */
+
+#include <linux/export.h>
+
+#include "msi.h"
+
+/**
+ * pci_disable_msi() - Disable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI interrupt mode on device,
+ * free earlier allocated interrupt vectors, and restore INTx emulation.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default
+ * pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msi(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msi_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msi);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 5c310df55d0d..4a1300b74518 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -163,7 +163,7 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-static void free_msi_irqs(struct pci_dev *dev)
+void pci_free_msi_irqs(struct pci_dev *dev)
{
pci_msi_teardown_msi_irqs(dev);
@@ -413,7 +413,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
err:
pci_msi_unmask(entry, msi_multi_mask(entry));
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
fail:
dev->msi_enabled = 0;
unlock:
@@ -531,7 +531,7 @@ static int msix_setup_interrupts(struct pci_dev *dev, void __iomem *base,
goto out_unlock;
out_free:
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
out_unlock:
msi_unlock_descs(&dev->dev);
kfree(masks);
@@ -680,7 +680,7 @@ int pci_msi_vec_count(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_msi_vec_count);
-static void pci_msi_shutdown(struct pci_dev *dev)
+void pci_msi_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -701,18 +701,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msi(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msi_shutdown(dev);
- free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msi);
-
/**
* pci_msix_vec_count - return the number of device's MSI-X table entries
* @dev: pointer to the pci_dev data structure of MSI-X device function
@@ -797,7 +785,7 @@ void pci_disable_msix(struct pci_dev *dev)
msi_lock_descs(&dev->dev);
pci_msix_shutdown(dev);
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msix);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index d8f62d911f08..634879277349 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,10 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* MSI internal functions invoked from the public APIs */
+void pci_msi_shutdown(struct pci_dev *dev);
+void pci_free_msi_irqs(struct pci_dev *dev);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 19/39] PCI/MSI: Move pci_disable_msi() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:16 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:16 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:45PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> msi.c is a maze of randomly sorted functions which makes the code
> unreadable. As a first step split the driver visible API and the internal
> implementation which also allows proper API documentation via one file.
>
> Create drivers/pci/msi/api.c to group all exported device-driver PCI/MSI
> APIs in one C file.
>
> Begin by moving pci_disable_msi() there and add kernel-doc for the function
> as appropriate.
>
> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/Makefile | 3 +--
> drivers/pci/msi/api.c | 37 +++++++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 22 +++++-----------------
> drivers/pci/msi/msi.h | 4 ++++
> 4 files changed, 47 insertions(+), 19 deletions(-)
> create mode 100644 drivers/pci/msi/api.c
> ---
> diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
> index 4e0a7e07965e..839ff72d72a8 100644
> --- a/drivers/pci/msi/Makefile
> +++ b/drivers/pci/msi/Makefile
> @@ -2,6 +2,5 @@
> #
> # Makefile for the PCI/MSI
> obj-$(CONFIG_PCI) += pcidev_msi.o
> -obj-$(CONFIG_PCI_MSI) += msi.o
> -obj-$(CONFIG_PCI_MSI) += irqdomain.o
> +obj-$(CONFIG_PCI_MSI) += api.o msi.o irqdomain.o
> obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> new file mode 100644
> index 000000000000..7485942cbe5d
> --- /dev/null
> +++ b/drivers/pci/msi/api.c
> @@ -0,0 +1,37 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * PCI MSI/MSI-X — Exported APIs for device drivers
> + *
> + * Copyright (C) 2003-2004 Intel
> + * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
> + * Copyright (C) 2016 Christoph Hellwig.
> + * Copyright (C) 2022 Linutronix GmbH
> + */
> +
> +#include <linux/export.h>
> +
> +#include "msi.h"
> +
> +/**
> + * pci_disable_msi() - Disable MSI interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to disable MSI interrupt mode on device,
> + * free earlier allocated interrupt vectors, and restore INTx emulation.
> + * The PCI device Linux IRQ (@dev->irq) is restored to its default
> + * pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + */
> +void pci_disable_msi(struct pci_dev *dev)
> +{
> + if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
> + return;
> +
> + msi_lock_descs(&dev->dev);
> + pci_msi_shutdown(dev);
> + pci_free_msi_irqs(dev);
> + msi_unlock_descs(&dev->dev);
> +}
> +EXPORT_SYMBOL(pci_disable_msi);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 5c310df55d0d..4a1300b74518 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -163,7 +163,7 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
> }
> EXPORT_SYMBOL_GPL(pci_write_msi_msg);
>
> -static void free_msi_irqs(struct pci_dev *dev)
> +void pci_free_msi_irqs(struct pci_dev *dev)
> {
> pci_msi_teardown_msi_irqs(dev);
>
> @@ -413,7 +413,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
>
> err:
> pci_msi_unmask(entry, msi_multi_mask(entry));
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> fail:
> dev->msi_enabled = 0;
> unlock:
> @@ -531,7 +531,7 @@ static int msix_setup_interrupts(struct pci_dev *dev, void __iomem *base,
> goto out_unlock;
>
> out_free:
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> out_unlock:
> msi_unlock_descs(&dev->dev);
> kfree(masks);
> @@ -680,7 +680,7 @@ int pci_msi_vec_count(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_msi_vec_count);
>
> -static void pci_msi_shutdown(struct pci_dev *dev)
> +void pci_msi_shutdown(struct pci_dev *dev)
> {
> struct msi_desc *desc;
>
> @@ -701,18 +701,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -void pci_disable_msi(struct pci_dev *dev)
> -{
> - if (!pci_msi_enable || !dev || !dev->msi_enabled)
> - return;
> -
> - msi_lock_descs(&dev->dev);
> - pci_msi_shutdown(dev);
> - free_msi_irqs(dev);
> - msi_unlock_descs(&dev->dev);
> -}
> -EXPORT_SYMBOL(pci_disable_msi);
> -
> /**
> * pci_msix_vec_count - return the number of device's MSI-X table entries
> * @dev: pointer to the pci_dev data structure of MSI-X device function
> @@ -797,7 +785,7 @@ void pci_disable_msix(struct pci_dev *dev)
>
> msi_lock_descs(&dev->dev);
> pci_msix_shutdown(dev);
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> msi_unlock_descs(&dev->dev);
> }
> EXPORT_SYMBOL(pci_disable_msix);
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index d8f62d911f08..634879277349 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -84,6 +84,10 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
>
> +/* MSI internal functions invoked from the public APIs */
> +void pci_msi_shutdown(struct pci_dev *dev);
> +void pci_free_msi_irqs(struct pci_dev *dev);
> +
> /* Legacy (!IRQDOMAIN) fallbacks */
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 19/39] PCI/MSI: Move pci_disable_msi() to api.c
@ 2022-11-16 16:16 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:16 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:45PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> msi.c is a maze of randomly sorted functions which makes the code
> unreadable. As a first step split the driver visible API and the internal
> implementation which also allows proper API documentation via one file.
>
> Create drivers/pci/msi/api.c to group all exported device-driver PCI/MSI
> APIs in one C file.
>
> Begin by moving pci_disable_msi() there and add kernel-doc for the function
> as appropriate.
>
> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/Makefile | 3 +--
> drivers/pci/msi/api.c | 37 +++++++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 22 +++++-----------------
> drivers/pci/msi/msi.h | 4 ++++
> 4 files changed, 47 insertions(+), 19 deletions(-)
> create mode 100644 drivers/pci/msi/api.c
> ---
> diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
> index 4e0a7e07965e..839ff72d72a8 100644
> --- a/drivers/pci/msi/Makefile
> +++ b/drivers/pci/msi/Makefile
> @@ -2,6 +2,5 @@
> #
> # Makefile for the PCI/MSI
> obj-$(CONFIG_PCI) += pcidev_msi.o
> -obj-$(CONFIG_PCI_MSI) += msi.o
> -obj-$(CONFIG_PCI_MSI) += irqdomain.o
> +obj-$(CONFIG_PCI_MSI) += api.o msi.o irqdomain.o
> obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> new file mode 100644
> index 000000000000..7485942cbe5d
> --- /dev/null
> +++ b/drivers/pci/msi/api.c
> @@ -0,0 +1,37 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * PCI MSI/MSI-X — Exported APIs for device drivers
> + *
> + * Copyright (C) 2003-2004 Intel
> + * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
> + * Copyright (C) 2016 Christoph Hellwig.
> + * Copyright (C) 2022 Linutronix GmbH
> + */
> +
> +#include <linux/export.h>
> +
> +#include "msi.h"
> +
> +/**
> + * pci_disable_msi() - Disable MSI interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to disable MSI interrupt mode on device,
> + * free earlier allocated interrupt vectors, and restore INTx emulation.
> + * The PCI device Linux IRQ (@dev->irq) is restored to its default
> + * pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + */
> +void pci_disable_msi(struct pci_dev *dev)
> +{
> + if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
> + return;
> +
> + msi_lock_descs(&dev->dev);
> + pci_msi_shutdown(dev);
> + pci_free_msi_irqs(dev);
> + msi_unlock_descs(&dev->dev);
> +}
> +EXPORT_SYMBOL(pci_disable_msi);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 5c310df55d0d..4a1300b74518 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -163,7 +163,7 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
> }
> EXPORT_SYMBOL_GPL(pci_write_msi_msg);
>
> -static void free_msi_irqs(struct pci_dev *dev)
> +void pci_free_msi_irqs(struct pci_dev *dev)
> {
> pci_msi_teardown_msi_irqs(dev);
>
> @@ -413,7 +413,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
>
> err:
> pci_msi_unmask(entry, msi_multi_mask(entry));
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> fail:
> dev->msi_enabled = 0;
> unlock:
> @@ -531,7 +531,7 @@ static int msix_setup_interrupts(struct pci_dev *dev, void __iomem *base,
> goto out_unlock;
>
> out_free:
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> out_unlock:
> msi_unlock_descs(&dev->dev);
> kfree(masks);
> @@ -680,7 +680,7 @@ int pci_msi_vec_count(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_msi_vec_count);
>
> -static void pci_msi_shutdown(struct pci_dev *dev)
> +void pci_msi_shutdown(struct pci_dev *dev)
> {
> struct msi_desc *desc;
>
> @@ -701,18 +701,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -void pci_disable_msi(struct pci_dev *dev)
> -{
> - if (!pci_msi_enable || !dev || !dev->msi_enabled)
> - return;
> -
> - msi_lock_descs(&dev->dev);
> - pci_msi_shutdown(dev);
> - free_msi_irqs(dev);
> - msi_unlock_descs(&dev->dev);
> -}
> -EXPORT_SYMBOL(pci_disable_msi);
> -
> /**
> * pci_msix_vec_count - return the number of device's MSI-X table entries
> * @dev: pointer to the pci_dev data structure of MSI-X device function
> @@ -797,7 +785,7 @@ void pci_disable_msix(struct pci_dev *dev)
>
> msi_lock_descs(&dev->dev);
> pci_msix_shutdown(dev);
> - free_msi_irqs(dev);
> + pci_free_msi_irqs(dev);
> msi_unlock_descs(&dev->dev);
> }
> EXPORT_SYMBOL(pci_disable_msix);
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index d8f62d911f08..634879277349 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -84,6 +84,10 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
>
> +/* MSI internal functions invoked from the public APIs */
> +void pci_msi_shutdown(struct pci_dev *dev);
> +void pci_free_msi_irqs(struct pci_dev *dev);
> +
> /* Legacy (!IRQDOMAIN) fallbacks */
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_disable_msi() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ahmed S. Darwish, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: b12d0bec385b7a58b9e83751e6cd9f04ec3b23a4
Gitweb: https://git.kernel.org/tip/b12d0bec385b7a58b9e83751e6cd9f04ec3b23a4
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:45 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move pci_disable_msi() to api.c
msi.c is a maze of randomly sorted functions which makes the code
unreadable. As a first step split the driver visible API and the internal
implementation which also allows proper API documentation via one file.
Create drivers/pci/msi/api.c to group all exported device-driver PCI/MSI
APIs in one C file.
Begin by moving pci_disable_msi() there and add kernel-doc for the function
as appropriate.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.696798036@linutronix.de
---
drivers/pci/msi/Makefile | 3 +--
drivers/pci/msi/api.c | 37 +++++++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 22 +++++-----------------
drivers/pci/msi/msi.h | 4 ++++
4 files changed, 47 insertions(+), 19 deletions(-)
create mode 100644 drivers/pci/msi/api.c
diff --git a/drivers/pci/msi/Makefile b/drivers/pci/msi/Makefile
index 4e0a7e0..839ff72 100644
--- a/drivers/pci/msi/Makefile
+++ b/drivers/pci/msi/Makefile
@@ -2,6 +2,5 @@
#
# Makefile for the PCI/MSI
obj-$(CONFIG_PCI) += pcidev_msi.o
-obj-$(CONFIG_PCI_MSI) += msi.o
-obj-$(CONFIG_PCI_MSI) += irqdomain.o
+obj-$(CONFIG_PCI_MSI) += api.o msi.o irqdomain.o
obj-$(CONFIG_PCI_MSI_ARCH_FALLBACKS) += legacy.o
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
new file mode 100644
index 0000000..7485942
--- /dev/null
+++ b/drivers/pci/msi/api.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * PCI MSI/MSI-X — Exported APIs for device drivers
+ *
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ * Copyright (C) 2016 Christoph Hellwig.
+ * Copyright (C) 2022 Linutronix GmbH
+ */
+
+#include <linux/export.h>
+
+#include "msi.h"
+
+/**
+ * pci_disable_msi() - Disable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI interrupt mode on device,
+ * free earlier allocated interrupt vectors, and restore INTx emulation.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default
+ * pin-assertion IRQ. This is the cleanup pair of pci_enable_msi().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msi(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msi_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msi_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msi);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 5c310df..4a1300b 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -163,7 +163,7 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-static void free_msi_irqs(struct pci_dev *dev)
+void pci_free_msi_irqs(struct pci_dev *dev)
{
pci_msi_teardown_msi_irqs(dev);
@@ -413,7 +413,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
err:
pci_msi_unmask(entry, msi_multi_mask(entry));
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
fail:
dev->msi_enabled = 0;
unlock:
@@ -531,7 +531,7 @@ static int msix_setup_interrupts(struct pci_dev *dev, void __iomem *base,
goto out_unlock;
out_free:
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
out_unlock:
msi_unlock_descs(&dev->dev);
kfree(masks);
@@ -680,7 +680,7 @@ int pci_msi_vec_count(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_msi_vec_count);
-static void pci_msi_shutdown(struct pci_dev *dev)
+void pci_msi_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -701,18 +701,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msi(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msi_shutdown(dev);
- free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msi);
-
/**
* pci_msix_vec_count - return the number of device's MSI-X table entries
* @dev: pointer to the pci_dev data structure of MSI-X device function
@@ -797,7 +785,7 @@ void pci_disable_msix(struct pci_dev *dev)
msi_lock_descs(&dev->dev);
pci_msix_shutdown(dev);
- free_msi_irqs(dev);
+ pci_free_msi_irqs(dev);
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msix);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index d8f62d9..6348792 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,10 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* MSI internal functions invoked from the public APIs */
+void pci_msi_shutdown(struct pci_dev *dev);
+void pci_free_msi_irqs(struct pci_dev *dev);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c all exported device-driver MSI APIs are now
to be grouped in one file, api.c.
Move pci_enable_msi() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 ++------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 12 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 7485942cbe5d..63d7f8f6a284 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -13,6 +13,29 @@
#include "msi.h"
/**
+ * pci_enable_msi() - Enable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to enable MSI interrupts mode on device and
+ * allocate a single interrupt vector. On success, the allocated vector
+ * Linux IRQ will be saved at @dev->irq. The driver must invoke
+ * pci_disable_msi() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: 0 on success, errno otherwise
+ */
+int pci_enable_msi(struct pci_dev *dev)
+{
+ int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+ if (rc < 0)
+ return rc;
+ return 0;
+}
+EXPORT_SYMBOL(pci_enable_msi);
+
+/**
* pci_disable_msi() - Disable MSI interrupt mode on device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 4a1300b74518..98f07ad9af62 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -790,8 +790,8 @@ void pci_disable_msix(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_disable_msix);
-static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
{
int nvec;
int rc;
@@ -844,16 +844,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-/* deprecated, don't use */
-int pci_enable_msi(struct pci_dev *dev)
-{
- int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
- if (rc < 0)
- return rc;
- return 0;
-}
-EXPORT_SYMBOL(pci_enable_msi);
-
static int __pci_enable_msix_range(struct pci_dev *dev,
struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd,
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 634879277349..00bb98d5bb0e 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -87,6 +87,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c all exported device-driver MSI APIs are now
to be grouped in one file, api.c.
Move pci_enable_msi() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 ++------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 12 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 7485942cbe5d..63d7f8f6a284 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -13,6 +13,29 @@
#include "msi.h"
/**
+ * pci_enable_msi() - Enable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to enable MSI interrupts mode on device and
+ * allocate a single interrupt vector. On success, the allocated vector
+ * Linux IRQ will be saved at @dev->irq. The driver must invoke
+ * pci_disable_msi() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: 0 on success, errno otherwise
+ */
+int pci_enable_msi(struct pci_dev *dev)
+{
+ int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+ if (rc < 0)
+ return rc;
+ return 0;
+}
+EXPORT_SYMBOL(pci_enable_msi);
+
+/**
* pci_disable_msi() - Disable MSI interrupt mode on device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 4a1300b74518..98f07ad9af62 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -790,8 +790,8 @@ void pci_disable_msix(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_disable_msix);
-static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
{
int nvec;
int rc;
@@ -844,16 +844,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-/* deprecated, don't use */
-int pci_enable_msi(struct pci_dev *dev)
-{
- int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
- if (rc < 0)
- return rc;
- return 0;
-}
-EXPORT_SYMBOL(pci_enable_msi);
-
static int __pci_enable_msix_range(struct pci_dev *dev,
struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd,
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 634879277349..00bb98d5bb0e 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -87,6 +87,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:18 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:18 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:46PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c all exported device-driver MSI APIs are now
> to be grouped in one file, api.c.
>
> Move pci_enable_msi() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Nit: suggest "disentangle" or "untangle" for "distangle" here and in
subsequent patches.
> ---
> drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
> drivers/pci/msi/msi.c | 14 ++------------
> drivers/pci/msi/msi.h | 1 +
> 3 files changed, 26 insertions(+), 12 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 7485942cbe5d..63d7f8f6a284 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -13,6 +13,29 @@
> #include "msi.h"
>
> /**
> + * pci_enable_msi() - Enable MSI interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to enable MSI interrupts mode on device and
> + * allocate a single interrupt vector. On success, the allocated vector
> + * Linux IRQ will be saved at @dev->irq. The driver must invoke
> + * pci_disable_msi() on cleanup.
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + *
> + * Return: 0 on success, errno otherwise
> + */
> +int pci_enable_msi(struct pci_dev *dev)
> +{
> + int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> + if (rc < 0)
> + return rc;
> + return 0;
> +}
> +EXPORT_SYMBOL(pci_enable_msi);
> +
> +/**
> * pci_disable_msi() - Disable MSI interrupt mode on device
> * @dev: the PCI device to operate on
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 4a1300b74518..98f07ad9af62 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -790,8 +790,8 @@ void pci_disable_msix(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_disable_msix);
>
> -static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> - struct irq_affinity *affd)
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> + struct irq_affinity *affd)
> {
> int nvec;
> int rc;
> @@ -844,16 +844,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> }
> }
>
> -/* deprecated, don't use */
> -int pci_enable_msi(struct pci_dev *dev)
> -{
> - int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> - if (rc < 0)
> - return rc;
> - return 0;
> -}
> -EXPORT_SYMBOL(pci_enable_msi);
> -
> static int __pci_enable_msix_range(struct pci_dev *dev,
> struct msix_entry *entries, int minvec,
> int maxvec, struct irq_affinity *affd,
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 634879277349..00bb98d5bb0e 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -87,6 +87,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
@ 2022-11-16 16:18 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:18 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:46PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c all exported device-driver MSI APIs are now
> to be grouped in one file, api.c.
>
> Move pci_enable_msi() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Nit: suggest "disentangle" or "untangle" for "distangle" here and in
subsequent patches.
> ---
> drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
> drivers/pci/msi/msi.c | 14 ++------------
> drivers/pci/msi/msi.h | 1 +
> 3 files changed, 26 insertions(+), 12 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 7485942cbe5d..63d7f8f6a284 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -13,6 +13,29 @@
> #include "msi.h"
>
> /**
> + * pci_enable_msi() - Enable MSI interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to enable MSI interrupts mode on device and
> + * allocate a single interrupt vector. On success, the allocated vector
> + * Linux IRQ will be saved at @dev->irq. The driver must invoke
> + * pci_disable_msi() on cleanup.
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + *
> + * Return: 0 on success, errno otherwise
> + */
> +int pci_enable_msi(struct pci_dev *dev)
> +{
> + int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> + if (rc < 0)
> + return rc;
> + return 0;
> +}
> +EXPORT_SYMBOL(pci_enable_msi);
> +
> +/**
> * pci_disable_msi() - Disable MSI interrupt mode on device
> * @dev: the PCI device to operate on
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 4a1300b74518..98f07ad9af62 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -790,8 +790,8 @@ void pci_disable_msix(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_disable_msix);
>
> -static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> - struct irq_affinity *affd)
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> + struct irq_affinity *affd)
> {
> int nvec;
> int rc;
> @@ -844,16 +844,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> }
> }
>
> -/* deprecated, don't use */
> -int pci_enable_msi(struct pci_dev *dev)
> -{
> - int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
> - if (rc < 0)
> - return rc;
> - return 0;
> -}
> -EXPORT_SYMBOL(pci_enable_msi);
> -
> static int __pci_enable_msix_range(struct pci_dev *dev,
> struct msix_entry *entries, int minvec,
> int maxvec, struct irq_affinity *affd,
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 634879277349..00bb98d5bb0e 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -87,6 +87,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
2022-11-16 16:18 ` Bjorn Helgaas
@ 2022-11-16 17:05 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:05 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Wed, Nov 16 2022 at 10:18, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:46PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> To distangle the maze in msi.c all exported device-driver MSI APIs are now
>> to be grouped in one file, api.c.
>>
>> Move pci_enable_msi() and make its kernel-doc comprehensive.
>>
>> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> Nit: suggest "disentangle" or "untangle" for "distangle" here and in
> subsequent patches.
My fault. I suggested the word to Ahmed well knowing that this is one of
the words I never get spelled correctly :)
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 20/39] PCI/MSI: Move pci_enable_msi() API to api.c
@ 2022-11-16 17:05 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:05 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:18, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:46PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> To distangle the maze in msi.c all exported device-driver MSI APIs are now
>> to be grouped in one file, api.c.
>>
>> Move pci_enable_msi() and make its kernel-doc comprehensive.
>>
>> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> Nit: suggest "disentangle" or "untangle" for "distangle" here and in
> subsequent patches.
My fault. I suggested the word to Ahmed well knowing that this is one of
the words I never get spelled correctly :)
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_enable_msi() API to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: bbda3407982211123caadbfdee23594647bd4516
Gitweb: https://git.kernel.org/tip/bbda3407982211123caadbfdee23594647bd4516
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:46 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move pci_enable_msi() API to api.c
To disentangle the maze in msi.c all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_enable_msi() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.755178149@linutronix.de
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 ++------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 7485942..63d7f8f 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -13,6 +13,29 @@
#include "msi.h"
/**
+ * pci_enable_msi() - Enable MSI interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to enable MSI interrupts mode on device and
+ * allocate a single interrupt vector. On success, the allocated vector
+ * Linux IRQ will be saved at @dev->irq. The driver must invoke
+ * pci_disable_msi() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: 0 on success, errno otherwise
+ */
+int pci_enable_msi(struct pci_dev *dev)
+{
+ int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+ if (rc < 0)
+ return rc;
+ return 0;
+}
+EXPORT_SYMBOL(pci_enable_msi);
+
+/**
* pci_disable_msi() - Disable MSI interrupt mode on device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 4a1300b..98f07ad 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -790,8 +790,8 @@ void pci_disable_msix(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_disable_msix);
-static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
{
int nvec;
int rc;
@@ -844,16 +844,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-/* deprecated, don't use */
-int pci_enable_msi(struct pci_dev *dev)
-{
- int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
- if (rc < 0)
- return rc;
- return 0;
-}
-EXPORT_SYMBOL(pci_enable_msi);
-
static int __pci_enable_msix_range(struct pci_dev *dev,
struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd,
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 6348792..00bb98d 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -87,6 +87,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 21/39] PCI/MSI: Move pci_enable_msix_range() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_enable_msix_range() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 32 ++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 30 ++++--------------------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 39 insertions(+), 26 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 63d7f8f6a284..d48050555d55 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -58,3 +58,35 @@ void pci_disable_msi(struct pci_dev *dev)
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msi);
+
+/**
+ * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ * @entries: input/output parameter, array of MSI-X configuration entries
+ * @minvec: minimum required number of MSI-X vectors
+ * @maxvec: maximum desired number of MSI-X vectors
+ *
+ * Legacy device driver API to enable MSI-X interrupt mode on device and
+ * configure its MSI-X capability structure as appropriate. The passed
+ * @entries array must have each of its members "entry" field set to a
+ * desired (valid) MSI-X vector number, where the range of valid MSI-X
+ * vector numbers can be queried through pci_msix_vec_count(). If
+ * successful, the driver must invoke pci_disable_msix() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: number of MSI-X vectors allocated (which might be smaller
+ * than @maxvecs), where Linux IRQ numbers for such allocated vectors
+ * are saved back in the @entries array elements' "vector" field. Return
+ * -ENOSPC if less than @minvecs interrupt vectors are available.
+ * Return -EINVAL if one of the passed @entries members "entry" field
+ * was invalid or a duplicate, or if plain MSI interrupts mode was
+ * earlier enabled on device. Return other errnos otherwise.
+ */
+int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
+ int minvec, int maxvec)
+{
+ return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+}
+EXPORT_SYMBOL(pci_enable_msix_range);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 98f07ad9af62..6700ef1c734e 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -844,10 +844,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-static int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
int rc, nvec = maxvec;
@@ -887,28 +887,6 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_enable_msix_range - configure device's MSI-X capability structure
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * @entries: pointer to an array of MSI-X entries
- * @minvec: minimum number of MSI-X IRQs requested
- * @maxvec: maximum number of MSI-X IRQs requested
- *
- * Setup the MSI-X capability structure of device function with a maximum
- * possible number of interrupts in the range between @minvec and @maxvec
- * upon its software driver call to request for MSI-X mode enabled on its
- * hardware device function. It returns a negative errno if an error occurs.
- * If it succeeds, it returns the actual number of interrupts allocated and
- * indicates the successful configuration of MSI-X capability structure
- * with new allocated MSI-X interrupts.
- **/
-int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
- int minvec, int maxvec)
-{
- return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
-}
-EXPORT_SYMBOL(pci_enable_msix_range);
-
-/**
* pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
* @dev: PCI device to operate on
* @min_vecs: minimum number of vectors required (must be >= 1)
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 00bb98d5bb0e..8c4a5289432d 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -88,8 +88,11 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags);
/* Legacy (!IRQDOMAIN) fallbacks */
+
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 21/39] PCI/MSI: Move pci_enable_msix_range() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_enable_msix_range() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 32 ++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 30 ++++--------------------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 39 insertions(+), 26 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 63d7f8f6a284..d48050555d55 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -58,3 +58,35 @@ void pci_disable_msi(struct pci_dev *dev)
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msi);
+
+/**
+ * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ * @entries: input/output parameter, array of MSI-X configuration entries
+ * @minvec: minimum required number of MSI-X vectors
+ * @maxvec: maximum desired number of MSI-X vectors
+ *
+ * Legacy device driver API to enable MSI-X interrupt mode on device and
+ * configure its MSI-X capability structure as appropriate. The passed
+ * @entries array must have each of its members "entry" field set to a
+ * desired (valid) MSI-X vector number, where the range of valid MSI-X
+ * vector numbers can be queried through pci_msix_vec_count(). If
+ * successful, the driver must invoke pci_disable_msix() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: number of MSI-X vectors allocated (which might be smaller
+ * than @maxvecs), where Linux IRQ numbers for such allocated vectors
+ * are saved back in the @entries array elements' "vector" field. Return
+ * -ENOSPC if less than @minvecs interrupt vectors are available.
+ * Return -EINVAL if one of the passed @entries members "entry" field
+ * was invalid or a duplicate, or if plain MSI interrupts mode was
+ * earlier enabled on device. Return other errnos otherwise.
+ */
+int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
+ int minvec, int maxvec)
+{
+ return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+}
+EXPORT_SYMBOL(pci_enable_msix_range);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 98f07ad9af62..6700ef1c734e 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -844,10 +844,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-static int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
int rc, nvec = maxvec;
@@ -887,28 +887,6 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_enable_msix_range - configure device's MSI-X capability structure
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * @entries: pointer to an array of MSI-X entries
- * @minvec: minimum number of MSI-X IRQs requested
- * @maxvec: maximum number of MSI-X IRQs requested
- *
- * Setup the MSI-X capability structure of device function with a maximum
- * possible number of interrupts in the range between @minvec and @maxvec
- * upon its software driver call to request for MSI-X mode enabled on its
- * hardware device function. It returns a negative errno if an error occurs.
- * If it succeeds, it returns the actual number of interrupts allocated and
- * indicates the successful configuration of MSI-X capability structure
- * with new allocated MSI-X interrupts.
- **/
-int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
- int minvec, int maxvec)
-{
- return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
-}
-EXPORT_SYMBOL(pci_enable_msix_range);
-
-/**
* pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
* @dev: PCI device to operate on
* @min_vecs: minimum number of vectors required (must be >= 1)
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 00bb98d5bb0e..8c4a5289432d 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -88,8 +88,11 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags);
/* Legacy (!IRQDOMAIN) fallbacks */
+
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 21/39] PCI/MSI: Move pci_enable_msix_range() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:20 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:20 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:48PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_enable_msix_range() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 32 ++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 30 ++++--------------------------
> drivers/pci/msi/msi.h | 3 +++
> 3 files changed, 39 insertions(+), 26 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 63d7f8f6a284..d48050555d55 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -58,3 +58,35 @@ void pci_disable_msi(struct pci_dev *dev)
> msi_unlock_descs(&dev->dev);
> }
> EXPORT_SYMBOL(pci_disable_msi);
> +
> +/**
> + * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
> + * @dev: the PCI device to operate on
> + * @entries: input/output parameter, array of MSI-X configuration entries
> + * @minvec: minimum required number of MSI-X vectors
> + * @maxvec: maximum desired number of MSI-X vectors
> + *
> + * Legacy device driver API to enable MSI-X interrupt mode on device and
> + * configure its MSI-X capability structure as appropriate. The passed
> + * @entries array must have each of its members "entry" field set to a
> + * desired (valid) MSI-X vector number, where the range of valid MSI-X
> + * vector numbers can be queried through pci_msix_vec_count(). If
> + * successful, the driver must invoke pci_disable_msix() on cleanup.
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + *
> + * Return: number of MSI-X vectors allocated (which might be smaller
> + * than @maxvecs), where Linux IRQ numbers for such allocated vectors
> + * are saved back in the @entries array elements' "vector" field. Return
> + * -ENOSPC if less than @minvecs interrupt vectors are available.
> + * Return -EINVAL if one of the passed @entries members "entry" field
> + * was invalid or a duplicate, or if plain MSI interrupts mode was
> + * earlier enabled on device. Return other errnos otherwise.
> + */
> +int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> + int minvec, int maxvec)
> +{
> + return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> +}
> +EXPORT_SYMBOL(pci_enable_msix_range);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 98f07ad9af62..6700ef1c734e 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -844,10 +844,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> }
> }
>
> -static int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +int __pci_enable_msix_range(struct pci_dev *dev,
> + struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd,
> + int flags)
> {
> int rc, nvec = maxvec;
>
> @@ -887,28 +887,6 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_enable_msix_range - configure device's MSI-X capability structure
> - * @dev: pointer to the pci_dev data structure of MSI-X device function
> - * @entries: pointer to an array of MSI-X entries
> - * @minvec: minimum number of MSI-X IRQs requested
> - * @maxvec: maximum number of MSI-X IRQs requested
> - *
> - * Setup the MSI-X capability structure of device function with a maximum
> - * possible number of interrupts in the range between @minvec and @maxvec
> - * upon its software driver call to request for MSI-X mode enabled on its
> - * hardware device function. It returns a negative errno if an error occurs.
> - * If it succeeds, it returns the actual number of interrupts allocated and
> - * indicates the successful configuration of MSI-X capability structure
> - * with new allocated MSI-X interrupts.
> - **/
> -int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> - int minvec, int maxvec)
> -{
> - return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> -}
> -EXPORT_SYMBOL(pci_enable_msix_range);
> -
> -/**
> * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
> * @dev: PCI device to operate on
> * @min_vecs: minimum number of vectors required (must be >= 1)
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 00bb98d5bb0e..8c4a5289432d 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -88,8 +88,11 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> +int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd, int flags);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
> +
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 21/39] PCI/MSI: Move pci_enable_msix_range() to api.c
@ 2022-11-16 16:20 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:20 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:48PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_enable_msix_range() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 32 ++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 30 ++++--------------------------
> drivers/pci/msi/msi.h | 3 +++
> 3 files changed, 39 insertions(+), 26 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 63d7f8f6a284..d48050555d55 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -58,3 +58,35 @@ void pci_disable_msi(struct pci_dev *dev)
> msi_unlock_descs(&dev->dev);
> }
> EXPORT_SYMBOL(pci_disable_msi);
> +
> +/**
> + * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
> + * @dev: the PCI device to operate on
> + * @entries: input/output parameter, array of MSI-X configuration entries
> + * @minvec: minimum required number of MSI-X vectors
> + * @maxvec: maximum desired number of MSI-X vectors
> + *
> + * Legacy device driver API to enable MSI-X interrupt mode on device and
> + * configure its MSI-X capability structure as appropriate. The passed
> + * @entries array must have each of its members "entry" field set to a
> + * desired (valid) MSI-X vector number, where the range of valid MSI-X
> + * vector numbers can be queried through pci_msix_vec_count(). If
> + * successful, the driver must invoke pci_disable_msix() on cleanup.
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + *
> + * Return: number of MSI-X vectors allocated (which might be smaller
> + * than @maxvecs), where Linux IRQ numbers for such allocated vectors
> + * are saved back in the @entries array elements' "vector" field. Return
> + * -ENOSPC if less than @minvecs interrupt vectors are available.
> + * Return -EINVAL if one of the passed @entries members "entry" field
> + * was invalid or a duplicate, or if plain MSI interrupts mode was
> + * earlier enabled on device. Return other errnos otherwise.
> + */
> +int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> + int minvec, int maxvec)
> +{
> + return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> +}
> +EXPORT_SYMBOL(pci_enable_msix_range);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 98f07ad9af62..6700ef1c734e 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -844,10 +844,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> }
> }
>
> -static int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +int __pci_enable_msix_range(struct pci_dev *dev,
> + struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd,
> + int flags)
> {
> int rc, nvec = maxvec;
>
> @@ -887,28 +887,6 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_enable_msix_range - configure device's MSI-X capability structure
> - * @dev: pointer to the pci_dev data structure of MSI-X device function
> - * @entries: pointer to an array of MSI-X entries
> - * @minvec: minimum number of MSI-X IRQs requested
> - * @maxvec: maximum number of MSI-X IRQs requested
> - *
> - * Setup the MSI-X capability structure of device function with a maximum
> - * possible number of interrupts in the range between @minvec and @maxvec
> - * upon its software driver call to request for MSI-X mode enabled on its
> - * hardware device function. It returns a negative errno if an error occurs.
> - * If it succeeds, it returns the actual number of interrupts allocated and
> - * indicates the successful configuration of MSI-X capability structure
> - * with new allocated MSI-X interrupts.
> - **/
> -int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> - int minvec, int maxvec)
> -{
> - return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> -}
> -EXPORT_SYMBOL(pci_enable_msix_range);
> -
> -/**
> * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
> * @dev: PCI device to operate on
> * @min_vecs: minimum number of vectors required (must be >= 1)
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 00bb98d5bb0e..8c4a5289432d 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -88,8 +88,11 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> +int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd, int flags);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
> +
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
> int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
> void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_enable_msix_range() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: be7496c1ef47e1ba8c4b389ee23178fcf066cc4e
Gitweb: https://git.kernel.org/tip/be7496c1ef47e1ba8c4b389ee23178fcf066cc4e
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:48 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move pci_enable_msix_range() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_enable_msix_range() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.813792885@linutronix.de
---
drivers/pci/msi/api.c | 32 ++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 30 ++++--------------------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 63d7f8f..d480505 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -58,3 +58,35 @@ void pci_disable_msi(struct pci_dev *dev)
msi_unlock_descs(&dev->dev);
}
EXPORT_SYMBOL(pci_disable_msi);
+
+/**
+ * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ * @entries: input/output parameter, array of MSI-X configuration entries
+ * @minvec: minimum required number of MSI-X vectors
+ * @maxvec: maximum desired number of MSI-X vectors
+ *
+ * Legacy device driver API to enable MSI-X interrupt mode on device and
+ * configure its MSI-X capability structure as appropriate. The passed
+ * @entries array must have each of its members "entry" field set to a
+ * desired (valid) MSI-X vector number, where the range of valid MSI-X
+ * vector numbers can be queried through pci_msix_vec_count(). If
+ * successful, the driver must invoke pci_disable_msix() on cleanup.
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ *
+ * Return: number of MSI-X vectors allocated (which might be smaller
+ * than @maxvecs), where Linux IRQ numbers for such allocated vectors
+ * are saved back in the @entries array elements' "vector" field. Return
+ * -ENOSPC if less than @minvecs interrupt vectors are available.
+ * Return -EINVAL if one of the passed @entries members "entry" field
+ * was invalid or a duplicate, or if plain MSI interrupts mode was
+ * earlier enabled on device. Return other errnos otherwise.
+ */
+int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
+ int minvec, int maxvec)
+{
+ return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
+}
+EXPORT_SYMBOL(pci_enable_msix_range);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 98f07ad..6700ef1 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -844,10 +844,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-static int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
int rc, nvec = maxvec;
@@ -887,28 +887,6 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_enable_msix_range - configure device's MSI-X capability structure
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * @entries: pointer to an array of MSI-X entries
- * @minvec: minimum number of MSI-X IRQs requested
- * @maxvec: maximum number of MSI-X IRQs requested
- *
- * Setup the MSI-X capability structure of device function with a maximum
- * possible number of interrupts in the range between @minvec and @maxvec
- * upon its software driver call to request for MSI-X mode enabled on its
- * hardware device function. It returns a negative errno if an error occurs.
- * If it succeeds, it returns the actual number of interrupts allocated and
- * indicates the successful configuration of MSI-X capability structure
- * with new allocated MSI-X interrupts.
- **/
-int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
- int minvec, int maxvec)
-{
- return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
-}
-EXPORT_SYMBOL(pci_enable_msix_range);
-
-/**
* pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
* @dev: PCI device to operate on
* @min_vecs: minimum number of vectors required (must be >= 1)
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 00bb98d..8c4a528 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -88,8 +88,11 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
void pci_msi_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags);
/* Legacy (!IRQDOMAIN) fallbacks */
+
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Make pci_alloc_irq_vectors() a real function instead of wrapper and add
proper kernel doc to it.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 33 +++++++++++++++++++++++++++++++++
include/linux/pci.h | 17 +++++++++--------
2 files changed, 42 insertions(+), 8 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index d48050555d55..1714905943fb 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -90,3 +90,36 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
}
EXPORT_SYMBOL(pci_enable_msix_range);
+
+/**
+ * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: One or more of:
+ * %PCI_IRQ_MSIX Allow trying MSI-X vector allocations
+ * %PCI_IRQ_MSI Allow trying MSI vector allocations
+ * %PCI_IRQ_LEGACY Allow trying legacy INTx interrupts, if
+ * and only if @min_vecs == 1
+ * %PCI_IRQ_AFFINITY Auto-manage IRQs affinity by spreading
+ * the vectors around available CPUs
+ *
+ * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
+ * vector allocation has a higher precedence over plain MSI, which has a
+ * higher precedence over legacy INTx emulation.
+ *
+ * Upon a successful allocation, the caller should use pci_irq_vector()
+ * to get the Linux IRQ number to be passed to request_threaded_irq().
+ * The driver must call pci_free_irq_vectors() on cleanup.
+ *
+ * Return: number of allocated vectors (which might be smaller than
+ * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
+ * available, other errnos otherwise.
+ */
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2bda4a4e47e8..6a356a39ba94 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1553,6 +1553,8 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
return rc;
return 0;
}
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags);
int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags,
struct irq_affinity *affd);
@@ -1586,6 +1588,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return 1;
return -ENOSPC;
}
+static inline int
+pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
static inline void pci_free_irq_vectors(struct pci_dev *dev)
{
@@ -1900,14 +1909,6 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
}
#endif /* CONFIG_PCI */
-static inline int
-pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
- unsigned int max_vecs, unsigned int flags)
-{
- return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
- NULL);
-}
-
/* Include architecture-dependent settings and functions */
#include <asm/pci.h>
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: , linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang,
Ashok Raj, Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, linuxppc-dev,
Alex Williamson, Bjorn Helgaas, Dan Williams, Reinette Chatre,
Greg Kroah-Hartman, Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Make pci_alloc_irq_vectors() a real function instead of wrapper and add
proper kernel doc to it.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 33 +++++++++++++++++++++++++++++++++
include/linux/pci.h | 17 +++++++++--------
2 files changed, 42 insertions(+), 8 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index d48050555d55..1714905943fb 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -90,3 +90,36 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
}
EXPORT_SYMBOL(pci_enable_msix_range);
+
+/**
+ * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: One or more of:
+ * %PCI_IRQ_MSIX Allow trying MSI-X vector allocations
+ * %PCI_IRQ_MSI Allow trying MSI vector allocations
+ * %PCI_IRQ_LEGACY Allow trying legacy INTx interrupts, if
+ * and only if @min_vecs == 1
+ * %PCI_IRQ_AFFINITY Auto-manage IRQs affinity by spreading
+ * the vectors around available CPUs
+ *
+ * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
+ * vector allocation has a higher precedence over plain MSI, which has a
+ * higher precedence over legacy INTx emulation.
+ *
+ * Upon a successful allocation, the caller should use pci_irq_vector()
+ * to get the Linux IRQ number to be passed to request_threaded_irq().
+ * The driver must call pci_free_irq_vectors() on cleanup.
+ *
+ * Return: number of allocated vectors (which might be smaller than
+ * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
+ * available, other errnos otherwise.
+ */
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2bda4a4e47e8..6a356a39ba94 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1553,6 +1553,8 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
return rc;
return 0;
}
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags);
int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags,
struct irq_affinity *affd);
@@ -1586,6 +1588,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return 1;
return -ENOSPC;
}
+static inline int
+pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
static inline void pci_free_irq_vectors(struct pci_dev *dev)
{
@@ -1900,14 +1909,6 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
}
#endif /* CONFIG_PCI */
-static inline int
-pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
- unsigned int max_vecs, unsigned int flags)
-{
- return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
- NULL);
-}
-
/* Include architecture-dependent settings and functions */
#include <asm/pci.h>
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:22 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:22 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:50PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Make pci_alloc_irq_vectors() a real function instead of wrapper and add
> proper kernel doc to it.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Two nits below.
> ---
> drivers/pci/msi/api.c | 33 +++++++++++++++++++++++++++++++++
> include/linux/pci.h | 17 +++++++++--------
> 2 files changed, 42 insertions(+), 8 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index d48050555d55..1714905943fb 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -90,3 +90,36 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> }
> EXPORT_SYMBOL(pci_enable_msix_range);
> +
> +/**
> + * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
> + * @dev: the PCI device to operate on
> + * @min_vecs: minimum required number of vectors (must be >= 1)
> + * @max_vecs: maximum desired number of vectors
> + * @flags: One or more of:
> + * %PCI_IRQ_MSIX Allow trying MSI-X vector allocations
> + * %PCI_IRQ_MSI Allow trying MSI vector allocations
> + * %PCI_IRQ_LEGACY Allow trying legacy INTx interrupts, if
> + * and only if @min_vecs == 1
> + * %PCI_IRQ_AFFINITY Auto-manage IRQs affinity by spreading
> + * the vectors around available CPUs
> + *
> + * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
s/irq/IRQ/
> + * vector allocation has a higher precedence over plain MSI, which has a
> + * higher precedence over legacy INTx emulation.
> + *
> + * Upon a successful allocation, the caller should use pci_irq_vector()
> + * to get the Linux IRQ number to be passed to request_threaded_irq().
> + * The driver must call pci_free_irq_vectors() on cleanup.
> + *
> + * Return: number of allocated vectors (which might be smaller than
> + * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
s/less/fewer/ (also in some previous patches, IIRC)
> + * available, other errnos otherwise.
> + */
> +int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags)
> +{
> + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
> + flags, NULL);
> +}
> +EXPORT_SYMBOL(pci_alloc_irq_vectors);
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2bda4a4e47e8..6a356a39ba94 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1553,6 +1553,8 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
> return rc;
> return 0;
> }
> +int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags);
> int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> unsigned int max_vecs, unsigned int flags,
> struct irq_affinity *affd);
> @@ -1586,6 +1588,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> return 1;
> return -ENOSPC;
> }
> +static inline int
> +pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags)
> +{
> + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
> + flags, NULL);
> +}
>
> static inline void pci_free_irq_vectors(struct pci_dev *dev)
> {
> @@ -1900,14 +1909,6 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> }
> #endif /* CONFIG_PCI */
>
> -static inline int
> -pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> - unsigned int max_vecs, unsigned int flags)
> -{
> - return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
> - NULL);
> -}
> -
> /* Include architecture-dependent settings and functions */
>
> #include <asm/pci.h>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
@ 2022-11-16 16:22 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:22 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:50PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Make pci_alloc_irq_vectors() a real function instead of wrapper and add
> proper kernel doc to it.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Two nits below.
> ---
> drivers/pci/msi/api.c | 33 +++++++++++++++++++++++++++++++++
> include/linux/pci.h | 17 +++++++++--------
> 2 files changed, 42 insertions(+), 8 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index d48050555d55..1714905943fb 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -90,3 +90,36 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
> }
> EXPORT_SYMBOL(pci_enable_msix_range);
> +
> +/**
> + * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
> + * @dev: the PCI device to operate on
> + * @min_vecs: minimum required number of vectors (must be >= 1)
> + * @max_vecs: maximum desired number of vectors
> + * @flags: One or more of:
> + * %PCI_IRQ_MSIX Allow trying MSI-X vector allocations
> + * %PCI_IRQ_MSI Allow trying MSI vector allocations
> + * %PCI_IRQ_LEGACY Allow trying legacy INTx interrupts, if
> + * and only if @min_vecs == 1
> + * %PCI_IRQ_AFFINITY Auto-manage IRQs affinity by spreading
> + * the vectors around available CPUs
> + *
> + * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
s/irq/IRQ/
> + * vector allocation has a higher precedence over plain MSI, which has a
> + * higher precedence over legacy INTx emulation.
> + *
> + * Upon a successful allocation, the caller should use pci_irq_vector()
> + * to get the Linux IRQ number to be passed to request_threaded_irq().
> + * The driver must call pci_free_irq_vectors() on cleanup.
> + *
> + * Return: number of allocated vectors (which might be smaller than
> + * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
s/less/fewer/ (also in some previous patches, IIRC)
> + * available, other errnos otherwise.
> + */
> +int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags)
> +{
> + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
> + flags, NULL);
> +}
> +EXPORT_SYMBOL(pci_alloc_irq_vectors);
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2bda4a4e47e8..6a356a39ba94 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1553,6 +1553,8 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
> return rc;
> return 0;
> }
> +int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags);
> int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> unsigned int max_vecs, unsigned int flags,
> struct irq_affinity *affd);
> @@ -1586,6 +1588,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> return 1;
> return -ENOSPC;
> }
> +static inline int
> +pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags)
> +{
> + return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
> + flags, NULL);
> +}
>
> static inline void pci_free_irq_vectors(struct pci_dev *dev)
> {
> @@ -1900,14 +1909,6 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> }
> #endif /* CONFIG_PCI */
>
> -static inline int
> -pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> - unsigned int max_vecs, unsigned int flags)
> -{
> - return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
> - NULL);
> -}
> -
> /* Include architecture-dependent settings and functions */
>
> #include <asm/pci.h>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
2022-11-16 16:22 ` Bjorn Helgaas
@ 2022-11-16 17:06 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:06 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Wed, Nov 16 2022 at 10:22, Bjorn Helgaas wrote:
>> + * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
>
> s/irq/IRQ/
>
>> + * vector allocation has a higher precedence over plain MSI, which has a
>> + * higher precedence over legacy INTx emulation.
>> + *
>> + * Upon a successful allocation, the caller should use pci_irq_vector()
>> + * to get the Linux IRQ number to be passed to request_threaded_irq().
>> + * The driver must call pci_free_irq_vectors() on cleanup.
>> + *
>> + * Return: number of allocated vectors (which might be smaller than
>> + * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
>
> s/less/fewer/ (also in some previous patches, IIRC)
Will fix.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 22/39] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
@ 2022-11-16 17:06 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:06 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:22, Bjorn Helgaas wrote:
>> + * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
>
> s/irq/IRQ/
>
>> + * vector allocation has a higher precedence over plain MSI, which has a
>> + * higher precedence over legacy INTx emulation.
>> + *
>> + * Upon a successful allocation, the caller should use pci_irq_vector()
>> + * to get the Linux IRQ number to be passed to request_threaded_irq().
>> + * The driver must call pci_free_irq_vectors() on cleanup.
>> + *
>> + * Return: number of allocated vectors (which might be smaller than
>> + * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
>
> s/less/fewer/ (also in some previous patches, IIRC)
Will fix.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_alloc_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 5c0997dc33ac24b7dc0124c2fc1caa37ae39461a
Gitweb: https://git.kernel.org/tip/5c0997dc33ac24b7dc0124c2fc1caa37ae39461a
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:50 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move pci_alloc_irq_vectors() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Make pci_alloc_irq_vectors() a real function instead of wrapper and add
proper kernel doc to it.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.870888193@linutronix.de
---
drivers/pci/msi/api.c | 33 +++++++++++++++++++++++++++++++++
include/linux/pci.h | 15 +++++++++++----
2 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index d480505..1714905 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -90,3 +90,36 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
}
EXPORT_SYMBOL(pci_enable_msix_range);
+
+/**
+ * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: One or more of:
+ * %PCI_IRQ_MSIX Allow trying MSI-X vector allocations
+ * %PCI_IRQ_MSI Allow trying MSI vector allocations
+ * %PCI_IRQ_LEGACY Allow trying legacy INTx interrupts, if
+ * and only if @min_vecs == 1
+ * %PCI_IRQ_AFFINITY Auto-manage IRQs affinity by spreading
+ * the vectors around available CPUs
+ *
+ * Allocate up to @max_vecs interrupt vectors on device. MSI-X irq
+ * vector allocation has a higher precedence over plain MSI, which has a
+ * higher precedence over legacy INTx emulation.
+ *
+ * Upon a successful allocation, the caller should use pci_irq_vector()
+ * to get the Linux IRQ number to be passed to request_threaded_irq().
+ * The driver must call pci_free_irq_vectors() on cleanup.
+ *
+ * Return: number of allocated vectors (which might be smaller than
+ * @max_vecs), -ENOSPC if less than @min_vecs interrupt vectors are
+ * available, other errnos otherwise.
+ */
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2bda4a4..243e48f 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1553,6 +1553,8 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
return rc;
return 0;
}
+int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags);
int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags,
struct irq_affinity *affd);
@@ -1586,6 +1588,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return 1;
return -ENOSPC;
}
+static inline int
+pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags)
+{
+ return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs,
+ flags, NULL);
+}
static inline void pci_free_irq_vectors(struct pci_dev *dev)
{
@@ -1898,15 +1907,13 @@ pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
{
return -ENOSPC;
}
-#endif /* CONFIG_PCI */
-
static inline int
pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags)
{
- return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
- NULL);
+ return -ENOSPC;
}
+#endif /* CONFIG_PCI */
/* Include architecture-dependent settings and functions */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_alloc_irq_vectors_affinity() and let its kernel-doc reference
pci_alloc_irq_vectors() documentation added in parent commit.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++-
drivers/pci/msi/msi.c | 65 +----------------------------------------------------
2 files changed, 59 insertions(+), 65 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 1714905943fb..8546749afa6e 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -123,3 +123,62 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
flags, NULL);
}
EXPORT_SYMBOL(pci_alloc_irq_vectors);
+
+/**
+ * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
+ * vectors with affinity requirements
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: allocation flags, as in pci_alloc_irq_vectors()
+ * @affd: affinity requirements (can be %NULL).
+ *
+ * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
+ * Check that function docs, and &struct irq_affinity, for more details.
+ */
+int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags,
+ struct irq_affinity *affd)
+{
+ struct irq_affinity msi_default_affd = {0};
+ int nvecs = -ENOSPC;
+
+ if (flags & PCI_IRQ_AFFINITY) {
+ if (!affd)
+ affd = &msi_default_affd;
+ } else {
+ if (WARN_ON(affd))
+ affd = NULL;
+ }
+
+ if (flags & PCI_IRQ_MSIX) {
+ nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
+ affd, flags);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ if (flags & PCI_IRQ_MSI) {
+ nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ /* use legacy IRQ if allowed */
+ if (flags & PCI_IRQ_LEGACY) {
+ if (min_vecs == 1 && dev->irq) {
+ /*
+ * Invoke the affinity spreading logic to ensure that
+ * the device driver can adjust queue configuration
+ * for the single interrupt case.
+ */
+ if (affd)
+ irq_create_affinity_masks(1, affd);
+ pci_intx(dev, 1);
+ return 1;
+ }
+ }
+
+ return nvecs;
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6700ef1c734e..a028774f438d 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,71 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
- * @dev: PCI device to operate on
- * @min_vecs: minimum number of vectors required (must be >= 1)
- * @max_vecs: maximum (desired) number of vectors
- * @flags: flags or quirks for the allocation
- * @affd: optional description of the affinity requirements
- *
- * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
- * vectors if available, and fall back to a single legacy vector
- * if neither is available. Return the number of vectors allocated,
- * (which might be smaller than @max_vecs) if successful, or a negative
- * error code on error. If less than @min_vecs interrupt vectors are
- * available for @dev the function will fail with -ENOSPC.
- *
- * To get the Linux IRQ number used for a vector that can be passed to
- * request_irq() use the pci_irq_vector() helper.
- */
-int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
- unsigned int max_vecs, unsigned int flags,
- struct irq_affinity *affd)
-{
- struct irq_affinity msi_default_affd = {0};
- int nvecs = -ENOSPC;
-
- if (flags & PCI_IRQ_AFFINITY) {
- if (!affd)
- affd = &msi_default_affd;
- } else {
- if (WARN_ON(affd))
- affd = NULL;
- }
-
- if (flags & PCI_IRQ_MSIX) {
- nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
- affd, flags);
- if (nvecs > 0)
- return nvecs;
- }
-
- if (flags & PCI_IRQ_MSI) {
- nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
- if (nvecs > 0)
- return nvecs;
- }
-
- /* use legacy IRQ if allowed */
- if (flags & PCI_IRQ_LEGACY) {
- if (min_vecs == 1 && dev->irq) {
- /*
- * Invoke the affinity spreading logic to ensure that
- * the device driver can adjust queue configuration
- * for the single interrupt case.
- */
- if (affd)
- irq_create_affinity_masks(1, affd);
- pci_intx(dev, 1);
- return 1;
- }
- }
-
- return nvecs;
-}
-EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
-
-/**
* pci_free_irq_vectors - free previously allocated IRQs for a device
* @dev: PCI device to operate on
*
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_alloc_irq_vectors_affinity() and let its kernel-doc reference
pci_alloc_irq_vectors() documentation added in parent commit.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++-
drivers/pci/msi/msi.c | 65 +----------------------------------------------------
2 files changed, 59 insertions(+), 65 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 1714905943fb..8546749afa6e 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -123,3 +123,62 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
flags, NULL);
}
EXPORT_SYMBOL(pci_alloc_irq_vectors);
+
+/**
+ * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
+ * vectors with affinity requirements
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: allocation flags, as in pci_alloc_irq_vectors()
+ * @affd: affinity requirements (can be %NULL).
+ *
+ * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
+ * Check that function docs, and &struct irq_affinity, for more details.
+ */
+int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags,
+ struct irq_affinity *affd)
+{
+ struct irq_affinity msi_default_affd = {0};
+ int nvecs = -ENOSPC;
+
+ if (flags & PCI_IRQ_AFFINITY) {
+ if (!affd)
+ affd = &msi_default_affd;
+ } else {
+ if (WARN_ON(affd))
+ affd = NULL;
+ }
+
+ if (flags & PCI_IRQ_MSIX) {
+ nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
+ affd, flags);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ if (flags & PCI_IRQ_MSI) {
+ nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ /* use legacy IRQ if allowed */
+ if (flags & PCI_IRQ_LEGACY) {
+ if (min_vecs == 1 && dev->irq) {
+ /*
+ * Invoke the affinity spreading logic to ensure that
+ * the device driver can adjust queue configuration
+ * for the single interrupt case.
+ */
+ if (affd)
+ irq_create_affinity_masks(1, affd);
+ pci_intx(dev, 1);
+ return 1;
+ }
+ }
+
+ return nvecs;
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6700ef1c734e..a028774f438d 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,71 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
- * @dev: PCI device to operate on
- * @min_vecs: minimum number of vectors required (must be >= 1)
- * @max_vecs: maximum (desired) number of vectors
- * @flags: flags or quirks for the allocation
- * @affd: optional description of the affinity requirements
- *
- * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
- * vectors if available, and fall back to a single legacy vector
- * if neither is available. Return the number of vectors allocated,
- * (which might be smaller than @max_vecs) if successful, or a negative
- * error code on error. If less than @min_vecs interrupt vectors are
- * available for @dev the function will fail with -ENOSPC.
- *
- * To get the Linux IRQ number used for a vector that can be passed to
- * request_irq() use the pci_irq_vector() helper.
- */
-int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
- unsigned int max_vecs, unsigned int flags,
- struct irq_affinity *affd)
-{
- struct irq_affinity msi_default_affd = {0};
- int nvecs = -ENOSPC;
-
- if (flags & PCI_IRQ_AFFINITY) {
- if (!affd)
- affd = &msi_default_affd;
- } else {
- if (WARN_ON(affd))
- affd = NULL;
- }
-
- if (flags & PCI_IRQ_MSIX) {
- nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
- affd, flags);
- if (nvecs > 0)
- return nvecs;
- }
-
- if (flags & PCI_IRQ_MSI) {
- nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
- if (nvecs > 0)
- return nvecs;
- }
-
- /* use legacy IRQ if allowed */
- if (flags & PCI_IRQ_LEGACY) {
- if (min_vecs == 1 && dev->irq) {
- /*
- * Invoke the affinity spreading logic to ensure that
- * the device driver can adjust queue configuration
- * for the single interrupt case.
- */
- if (affd)
- irq_create_affinity_masks(1, affd);
- pci_intx(dev, 1);
- return 1;
- }
- }
-
- return nvecs;
-}
-EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
-
-/**
* pci_free_irq_vectors - free previously allocated IRQs for a device
* @dev: PCI device to operate on
*
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:23 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:23 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_alloc_irq_vectors_affinity() and let its kernel-doc reference
> pci_alloc_irq_vectors() documentation added in parent commit.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
One question below.
> ---
> drivers/pci/msi/api.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++-
> drivers/pci/msi/msi.c | 65 +----------------------------------------------------
> 2 files changed, 59 insertions(+), 65 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 1714905943fb..8546749afa6e 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -123,3 +123,62 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> flags, NULL);
> }
> EXPORT_SYMBOL(pci_alloc_irq_vectors);
> +
> +/**
> + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> + * vectors with affinity requirements
> + * @dev: the PCI device to operate on
> + * @min_vecs: minimum required number of vectors (must be >= 1)
> + * @max_vecs: maximum desired number of vectors
> + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> + * @affd: affinity requirements (can be %NULL).
> + *
> + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> + * Check that function docs, and &struct irq_affinity, for more details.
Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
superfluous?
> + */
> +int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags,
> + struct irq_affinity *affd)
> +{
> + struct irq_affinity msi_default_affd = {0};
> + int nvecs = -ENOSPC;
> +
> + if (flags & PCI_IRQ_AFFINITY) {
> + if (!affd)
> + affd = &msi_default_affd;
> + } else {
> + if (WARN_ON(affd))
> + affd = NULL;
> + }
> +
> + if (flags & PCI_IRQ_MSIX) {
> + nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
> + affd, flags);
> + if (nvecs > 0)
> + return nvecs;
> + }
> +
> + if (flags & PCI_IRQ_MSI) {
> + nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
> + if (nvecs > 0)
> + return nvecs;
> + }
> +
> + /* use legacy IRQ if allowed */
> + if (flags & PCI_IRQ_LEGACY) {
> + if (min_vecs == 1 && dev->irq) {
> + /*
> + * Invoke the affinity spreading logic to ensure that
> + * the device driver can adjust queue configuration
> + * for the single interrupt case.
> + */
> + if (affd)
> + irq_create_affinity_masks(1, affd);
> + pci_intx(dev, 1);
> + return 1;
> + }
> + }
> +
> + return nvecs;
> +}
> +EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 6700ef1c734e..a028774f438d 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -887,71 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
> - * @dev: PCI device to operate on
> - * @min_vecs: minimum number of vectors required (must be >= 1)
> - * @max_vecs: maximum (desired) number of vectors
> - * @flags: flags or quirks for the allocation
> - * @affd: optional description of the affinity requirements
> - *
> - * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
> - * vectors if available, and fall back to a single legacy vector
> - * if neither is available. Return the number of vectors allocated,
> - * (which might be smaller than @max_vecs) if successful, or a negative
> - * error code on error. If less than @min_vecs interrupt vectors are
> - * available for @dev the function will fail with -ENOSPC.
> - *
> - * To get the Linux IRQ number used for a vector that can be passed to
> - * request_irq() use the pci_irq_vector() helper.
> - */
> -int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> - unsigned int max_vecs, unsigned int flags,
> - struct irq_affinity *affd)
> -{
> - struct irq_affinity msi_default_affd = {0};
> - int nvecs = -ENOSPC;
> -
> - if (flags & PCI_IRQ_AFFINITY) {
> - if (!affd)
> - affd = &msi_default_affd;
> - } else {
> - if (WARN_ON(affd))
> - affd = NULL;
> - }
> -
> - if (flags & PCI_IRQ_MSIX) {
> - nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
> - affd, flags);
> - if (nvecs > 0)
> - return nvecs;
> - }
> -
> - if (flags & PCI_IRQ_MSI) {
> - nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
> - if (nvecs > 0)
> - return nvecs;
> - }
> -
> - /* use legacy IRQ if allowed */
> - if (flags & PCI_IRQ_LEGACY) {
> - if (min_vecs == 1 && dev->irq) {
> - /*
> - * Invoke the affinity spreading logic to ensure that
> - * the device driver can adjust queue configuration
> - * for the single interrupt case.
> - */
> - if (affd)
> - irq_create_affinity_masks(1, affd);
> - pci_intx(dev, 1);
> - return 1;
> - }
> - }
> -
> - return nvecs;
> -}
> -EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> -
> -/**
> * pci_free_irq_vectors - free previously allocated IRQs for a device
> * @dev: PCI device to operate on
> *
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
@ 2022-11-16 16:23 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:23 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_alloc_irq_vectors_affinity() and let its kernel-doc reference
> pci_alloc_irq_vectors() documentation added in parent commit.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
One question below.
> ---
> drivers/pci/msi/api.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++-
> drivers/pci/msi/msi.c | 65 +----------------------------------------------------
> 2 files changed, 59 insertions(+), 65 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 1714905943fb..8546749afa6e 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -123,3 +123,62 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
> flags, NULL);
> }
> EXPORT_SYMBOL(pci_alloc_irq_vectors);
> +
> +/**
> + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> + * vectors with affinity requirements
> + * @dev: the PCI device to operate on
> + * @min_vecs: minimum required number of vectors (must be >= 1)
> + * @max_vecs: maximum desired number of vectors
> + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> + * @affd: affinity requirements (can be %NULL).
> + *
> + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> + * Check that function docs, and &struct irq_affinity, for more details.
Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
superfluous?
> + */
> +int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> + unsigned int max_vecs, unsigned int flags,
> + struct irq_affinity *affd)
> +{
> + struct irq_affinity msi_default_affd = {0};
> + int nvecs = -ENOSPC;
> +
> + if (flags & PCI_IRQ_AFFINITY) {
> + if (!affd)
> + affd = &msi_default_affd;
> + } else {
> + if (WARN_ON(affd))
> + affd = NULL;
> + }
> +
> + if (flags & PCI_IRQ_MSIX) {
> + nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
> + affd, flags);
> + if (nvecs > 0)
> + return nvecs;
> + }
> +
> + if (flags & PCI_IRQ_MSI) {
> + nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
> + if (nvecs > 0)
> + return nvecs;
> + }
> +
> + /* use legacy IRQ if allowed */
> + if (flags & PCI_IRQ_LEGACY) {
> + if (min_vecs == 1 && dev->irq) {
> + /*
> + * Invoke the affinity spreading logic to ensure that
> + * the device driver can adjust queue configuration
> + * for the single interrupt case.
> + */
> + if (affd)
> + irq_create_affinity_masks(1, affd);
> + pci_intx(dev, 1);
> + return 1;
> + }
> + }
> +
> + return nvecs;
> +}
> +EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 6700ef1c734e..a028774f438d 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -887,71 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
> - * @dev: PCI device to operate on
> - * @min_vecs: minimum number of vectors required (must be >= 1)
> - * @max_vecs: maximum (desired) number of vectors
> - * @flags: flags or quirks for the allocation
> - * @affd: optional description of the affinity requirements
> - *
> - * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
> - * vectors if available, and fall back to a single legacy vector
> - * if neither is available. Return the number of vectors allocated,
> - * (which might be smaller than @max_vecs) if successful, or a negative
> - * error code on error. If less than @min_vecs interrupt vectors are
> - * available for @dev the function will fail with -ENOSPC.
> - *
> - * To get the Linux IRQ number used for a vector that can be passed to
> - * request_irq() use the pci_irq_vector() helper.
> - */
> -int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> - unsigned int max_vecs, unsigned int flags,
> - struct irq_affinity *affd)
> -{
> - struct irq_affinity msi_default_affd = {0};
> - int nvecs = -ENOSPC;
> -
> - if (flags & PCI_IRQ_AFFINITY) {
> - if (!affd)
> - affd = &msi_default_affd;
> - } else {
> - if (WARN_ON(affd))
> - affd = NULL;
> - }
> -
> - if (flags & PCI_IRQ_MSIX) {
> - nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
> - affd, flags);
> - if (nvecs > 0)
> - return nvecs;
> - }
> -
> - if (flags & PCI_IRQ_MSI) {
> - nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
> - if (nvecs > 0)
> - return nvecs;
> - }
> -
> - /* use legacy IRQ if allowed */
> - if (flags & PCI_IRQ_LEGACY) {
> - if (min_vecs == 1 && dev->irq) {
> - /*
> - * Invoke the affinity spreading logic to ensure that
> - * the device driver can adjust queue configuration
> - * for the single interrupt case.
> - */
> - if (affd)
> - irq_create_affinity_masks(1, affd);
> - pci_intx(dev, 1);
> - return 1;
> - }
> - }
> -
> - return nvecs;
> -}
> -EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> -
> -/**
> * pci_free_irq_vectors - free previously allocated IRQs for a device
> * @dev: PCI device to operate on
> *
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-16 16:23 ` Bjorn Helgaas
@ 2022-11-16 17:07 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:07 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Wed, Nov 16 2022 at 10:23, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
>> + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
>> + * Check that function docs, and &struct irq_affinity, for more details.
>
> Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> superfluous?
The latter.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
@ 2022-11-16 17:07 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:07 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:23, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
>> + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
>> + * Check that function docs, and &struct irq_affinity, for more details.
>
> Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> superfluous?
The latter.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-16 16:23 ` Bjorn Helgaas
@ 2022-11-18 12:34 ` Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: Ahmed S. Darwish @ 2022-11-18 12:34 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Thomas Gleixner, LKML, x86, Joerg Roedel, Will Deacon, linux-pci,
Bjorn Helgaas, Lorenzo Pieralisi, Marc Zyngier,
Greg Kroah-Hartman, Jason Gunthorpe, Dave Jiang, Alex Williamson,
Kevin Tian, Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason,
Allen Hubbe, Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Wed, Nov 16, 2022 at 10:23:22AM -0600, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
...
> > +
> > +/**
> > + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> > + * vectors with affinity requirements
> > + * @dev: the PCI device to operate on
> > + * @min_vecs: minimum required number of vectors (must be >= 1)
> > + * @max_vecs: maximum desired number of vectors
> > + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> > + * @affd: affinity requirements (can be %NULL).
> > + *
> > + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> > + * Check that function docs, and &struct irq_affinity, for more details.
>
> Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> superfluous?
>
Hmmm, I stole it from Documentation/doc-guide/kernel-doc.rst. htmldoc
parses it and generates a link to the referenced structure's kernel-doc.
But, yeah, this was literally the first usage of such a doc pattern in
the entire kernel's C code :)
Thanks,
--
Ahmed S. Darwish
Linutronix GmbH
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
@ 2022-11-18 12:34 ` Ahmed S. Darwish
0 siblings, 0 replies; 283+ messages in thread
From: Ahmed S. Darwish @ 2022-11-18 12:34 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Dan Williams, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Jason Gunthorpe,
Allen Hubbe, Kevin Tian, Jon Mason, linuxppc-dev,
Alex Williamson, Bjorn Helgaas, Thomas Gleixner, Reinette Chatre,
Greg Kroah-Hartman, LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16, 2022 at 10:23:22AM -0600, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
...
> > +
> > +/**
> > + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> > + * vectors with affinity requirements
> > + * @dev: the PCI device to operate on
> > + * @min_vecs: minimum required number of vectors (must be >= 1)
> > + * @max_vecs: maximum desired number of vectors
> > + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> > + * @affd: affinity requirements (can be %NULL).
> > + *
> > + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> > + * Check that function docs, and &struct irq_affinity, for more details.
>
> Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> superfluous?
>
Hmmm, I stole it from Documentation/doc-guide/kernel-doc.rst. htmldoc
parses it and generates a link to the referenced structure's kernel-doc.
But, yeah, this was literally the first usage of such a doc pattern in
the entire kernel's C code :)
Thanks,
--
Ahmed S. Darwish
Linutronix GmbH
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-18 12:34 ` Ahmed S. Darwish
@ 2022-11-18 12:58 ` Peter Zijlstra
-1 siblings, 0 replies; 283+ messages in thread
From: Peter Zijlstra @ 2022-11-18 12:58 UTC (permalink / raw)
To: Ahmed S. Darwish
Cc: Bjorn Helgaas, Thomas Gleixner, LKML, x86, Joerg Roedel,
Will Deacon, linux-pci, Bjorn Helgaas, Lorenzo Pieralisi,
Marc Zyngier, Greg Kroah-Hartman, Jason Gunthorpe, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Reinette Chatre,
Michael Ellerman, Christophe Leroy, linuxppc-dev, corbet
On Fri, Nov 18, 2022 at 01:34:12PM +0100, Ahmed S. Darwish wrote:
> On Wed, Nov 16, 2022 at 10:23:22AM -0600, Bjorn Helgaas wrote:
> > On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
> ...
> > > +
> > > +/**
> > > + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> > > + * vectors with affinity requirements
> > > + * @dev: the PCI device to operate on
> > > + * @min_vecs: minimum required number of vectors (must be >= 1)
> > > + * @max_vecs: maximum desired number of vectors
> > > + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> > > + * @affd: affinity requirements (can be %NULL).
> > > + *
> > > + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> > > + * Check that function docs, and &struct irq_affinity, for more details.
> >
> > Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> > superfluous?
> >
>
> Hmmm, I stole it from Documentation/doc-guide/kernel-doc.rst. htmldoc
> parses it and generates a link to the referenced structure's kernel-doc.
>
> But, yeah, this was literally the first usage of such a doc pattern in
> the entire kernel's C code :)
Perhaps then not start with it and instead try and convince John to make
his script more clever -- this same script already recognises functions
by their () suffix, might as well also key off the 'struct' keyword, no?
This is a Code comment, to be read in a text editor. That & is a syntax
error.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 23/39] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
@ 2022-11-18 12:58 ` Peter Zijlstra
0 siblings, 0 replies; 283+ messages in thread
From: Peter Zijlstra @ 2022-11-18 12:58 UTC (permalink / raw)
To: Ahmed S. Darwish
Cc: linux-pci, Will Deacon, Dan Williams, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, corbet, Joerg Roedel, x86,
Jason Gunthorpe, Bjorn Helgaas, Allen Hubbe, Kevin Tian,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Thomas Gleixner, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 18, 2022 at 01:34:12PM +0100, Ahmed S. Darwish wrote:
> On Wed, Nov 16, 2022 at 10:23:22AM -0600, Bjorn Helgaas wrote:
> > On Fri, Nov 11, 2022 at 02:54:51PM +0100, Thomas Gleixner wrote:
> ...
> > > +
> > > +/**
> > > + * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
> > > + * vectors with affinity requirements
> > > + * @dev: the PCI device to operate on
> > > + * @min_vecs: minimum required number of vectors (must be >= 1)
> > > + * @max_vecs: maximum desired number of vectors
> > > + * @flags: allocation flags, as in pci_alloc_irq_vectors()
> > > + * @affd: affinity requirements (can be %NULL).
> > > + *
> > > + * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
> > > + * Check that function docs, and &struct irq_affinity, for more details.
> >
> > Is "&struct irq_affinity" some kernel-doc syntax, or is the "&"
> > superfluous?
> >
>
> Hmmm, I stole it from Documentation/doc-guide/kernel-doc.rst. htmldoc
> parses it and generates a link to the referenced structure's kernel-doc.
>
> But, yeah, this was literally the first usage of such a doc pattern in
> the entire kernel's C code :)
Perhaps then not start with it and instead try and convince John to make
his script more clever -- this same script already recognises functions
by their () suffix, might as well also key off the 'struct' keyword, no?
This is a Code comment, to be read in a text editor. That & is a syntax
error.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: beddb5efb43ee5b1c048e49225f75b03f8d36aac
Gitweb: https://git.kernel.org/tip/beddb5efb43ee5b1c048e49225f75b03f8d36aac
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:51 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:20 +01:00
PCI/MSI: Move pci_alloc_irq_vectors_affinity() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_alloc_irq_vectors_affinity() and let its kernel-doc reference
pci_alloc_irq_vectors() documentation added in parent commit.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.927531290@linutronix.de
---
drivers/pci/msi/api.c | 59 ++++++++++++++++++++++++++++++++++++++-
drivers/pci/msi/msi.c | 65 +------------------------------------------
2 files changed, 59 insertions(+), 65 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 1714905..8546749 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -123,3 +123,62 @@ int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
flags, NULL);
}
EXPORT_SYMBOL(pci_alloc_irq_vectors);
+
+/**
+ * pci_alloc_irq_vectors_affinity() - Allocate multiple device interrupt
+ * vectors with affinity requirements
+ * @dev: the PCI device to operate on
+ * @min_vecs: minimum required number of vectors (must be >= 1)
+ * @max_vecs: maximum desired number of vectors
+ * @flags: allocation flags, as in pci_alloc_irq_vectors()
+ * @affd: affinity requirements (can be %NULL).
+ *
+ * Same as pci_alloc_irq_vectors(), but with the extra @affd parameter.
+ * Check that function docs, and &struct irq_affinity, for more details.
+ */
+int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
+ unsigned int max_vecs, unsigned int flags,
+ struct irq_affinity *affd)
+{
+ struct irq_affinity msi_default_affd = {0};
+ int nvecs = -ENOSPC;
+
+ if (flags & PCI_IRQ_AFFINITY) {
+ if (!affd)
+ affd = &msi_default_affd;
+ } else {
+ if (WARN_ON(affd))
+ affd = NULL;
+ }
+
+ if (flags & PCI_IRQ_MSIX) {
+ nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
+ affd, flags);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ if (flags & PCI_IRQ_MSI) {
+ nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
+ if (nvecs > 0)
+ return nvecs;
+ }
+
+ /* use legacy IRQ if allowed */
+ if (flags & PCI_IRQ_LEGACY) {
+ if (min_vecs == 1 && dev->irq) {
+ /*
+ * Invoke the affinity spreading logic to ensure that
+ * the device driver can adjust queue configuration
+ * for the single interrupt case.
+ */
+ if (affd)
+ irq_create_affinity_masks(1, affd);
+ pci_intx(dev, 1);
+ return 1;
+ }
+ }
+
+ return nvecs;
+}
+EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6700ef1..a028774 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,71 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_alloc_irq_vectors_affinity - allocate multiple IRQs for a device
- * @dev: PCI device to operate on
- * @min_vecs: minimum number of vectors required (must be >= 1)
- * @max_vecs: maximum (desired) number of vectors
- * @flags: flags or quirks for the allocation
- * @affd: optional description of the affinity requirements
- *
- * Allocate up to @max_vecs interrupt vectors for @dev, using MSI-X or MSI
- * vectors if available, and fall back to a single legacy vector
- * if neither is available. Return the number of vectors allocated,
- * (which might be smaller than @max_vecs) if successful, or a negative
- * error code on error. If less than @min_vecs interrupt vectors are
- * available for @dev the function will fail with -ENOSPC.
- *
- * To get the Linux IRQ number used for a vector that can be passed to
- * request_irq() use the pci_irq_vector() helper.
- */
-int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
- unsigned int max_vecs, unsigned int flags,
- struct irq_affinity *affd)
-{
- struct irq_affinity msi_default_affd = {0};
- int nvecs = -ENOSPC;
-
- if (flags & PCI_IRQ_AFFINITY) {
- if (!affd)
- affd = &msi_default_affd;
- } else {
- if (WARN_ON(affd))
- affd = NULL;
- }
-
- if (flags & PCI_IRQ_MSIX) {
- nvecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs,
- affd, flags);
- if (nvecs > 0)
- return nvecs;
- }
-
- if (flags & PCI_IRQ_MSI) {
- nvecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd);
- if (nvecs > 0)
- return nvecs;
- }
-
- /* use legacy IRQ if allowed */
- if (flags & PCI_IRQ_LEGACY) {
- if (min_vecs == 1 && dev->irq) {
- /*
- * Invoke the affinity spreading logic to ensure that
- * the device driver can adjust queue configuration
- * for the single interrupt case.
- */
- if (affd)
- irq_create_affinity_masks(1, affd);
- pci_intx(dev, 1);
- return 1;
- }
- }
-
- return nvecs;
-}
-EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
-
-/**
* pci_free_irq_vectors - free previously allocated IRQs for a device
* @dev: PCI device to operate on
*
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 24/39] PCI/MSI: Move pci_irq_vector() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_vector() and let its kernel-doc match the rest of the file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 24 ------------------------
2 files changed, 23 insertions(+), 24 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 8546749afa6e..0f1ec87e3f9f 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -182,3 +182,26 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return nvecs;
}
EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
+
+/**
+ * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: the Linux IRQ number, or -EINVAL if @nr is out of range
+ */
+int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
+{
+ unsigned int irq;
+
+ if (!dev->msi_enabled && !dev->msix_enabled)
+ return !nr ? dev->irq : -EINVAL;
+
+ irq = msi_get_virq(&dev->dev, nr);
+ return irq ? irq : -EINVAL;
+}
+EXPORT_SYMBOL(pci_irq_vector);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index a028774f438d..38ad2fe4b85c 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -900,30 +900,6 @@ void pci_free_irq_vectors(struct pci_dev *dev)
EXPORT_SYMBOL(pci_free_irq_vectors);
/**
- * pci_irq_vector - return Linux IRQ number of a device vector
- * @dev: PCI device to operate on
- * @nr: Interrupt vector index (0-based)
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
- */
-int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
-{
- unsigned int irq;
-
- if (!dev->msi_enabled && !dev->msix_enabled)
- return !nr ? dev->irq : -EINVAL;
-
- irq = msi_get_virq(&dev->dev, nr);
- return irq ? irq : -EINVAL;
-}
-EXPORT_SYMBOL(pci_irq_vector);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 24/39] PCI/MSI: Move pci_irq_vector() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_vector() and let its kernel-doc match the rest of the file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 24 ------------------------
2 files changed, 23 insertions(+), 24 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 8546749afa6e..0f1ec87e3f9f 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -182,3 +182,26 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return nvecs;
}
EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
+
+/**
+ * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: the Linux IRQ number, or -EINVAL if @nr is out of range
+ */
+int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
+{
+ unsigned int irq;
+
+ if (!dev->msi_enabled && !dev->msix_enabled)
+ return !nr ? dev->irq : -EINVAL;
+
+ irq = msi_get_virq(&dev->dev, nr);
+ return irq ? irq : -EINVAL;
+}
+EXPORT_SYMBOL(pci_irq_vector);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index a028774f438d..38ad2fe4b85c 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -900,30 +900,6 @@ void pci_free_irq_vectors(struct pci_dev *dev)
EXPORT_SYMBOL(pci_free_irq_vectors);
/**
- * pci_irq_vector - return Linux IRQ number of a device vector
- * @dev: PCI device to operate on
- * @nr: Interrupt vector index (0-based)
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
- */
-int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
-{
- unsigned int irq;
-
- if (!dev->msi_enabled && !dev->msix_enabled)
- return !nr ? dev->irq : -EINVAL;
-
- irq = msi_get_virq(&dev->dev, nr);
- return irq ? irq : -EINVAL;
-}
-EXPORT_SYMBOL(pci_irq_vector);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 24/39] PCI/MSI: Move pci_irq_vector() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:23 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:23 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:53PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_irq_vector() and let its kernel-doc match the rest of the file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
> drivers/pci/msi/msi.c | 24 ------------------------
> 2 files changed, 23 insertions(+), 24 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 8546749afa6e..0f1ec87e3f9f 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -182,3 +182,26 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> return nvecs;
> }
> EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> +
> +/**
> + * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector
> + * @dev: the PCI device to operate on
> + * @nr: device-relative interrupt vector index (0-based); has different
> + * meanings, depending on interrupt mode
> + * MSI-X the index in the MSI-X vector table
> + * MSI the index of the enabled MSI vectors
> + * INTx must be 0
> + *
> + * Return: the Linux IRQ number, or -EINVAL if @nr is out of range
> + */
> +int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> +{
> + unsigned int irq;
> +
> + if (!dev->msi_enabled && !dev->msix_enabled)
> + return !nr ? dev->irq : -EINVAL;
> +
> + irq = msi_get_virq(&dev->dev, nr);
> + return irq ? irq : -EINVAL;
> +}
> +EXPORT_SYMBOL(pci_irq_vector);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index a028774f438d..38ad2fe4b85c 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -900,30 +900,6 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> /**
> - * pci_irq_vector - return Linux IRQ number of a device vector
> - * @dev: PCI device to operate on
> - * @nr: Interrupt vector index (0-based)
> - *
> - * @nr has the following meanings depending on the interrupt mode:
> - * MSI-X: The index in the MSI-X vector table
> - * MSI: The index of the enabled MSI vectors
> - * INTx: Must be 0
> - *
> - * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
> - */
> -int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> -{
> - unsigned int irq;
> -
> - if (!dev->msi_enabled && !dev->msix_enabled)
> - return !nr ? dev->irq : -EINVAL;
> -
> - irq = msi_get_virq(&dev->dev, nr);
> - return irq ? irq : -EINVAL;
> -}
> -EXPORT_SYMBOL(pci_irq_vector);
> -
> -/**
> * pci_irq_get_affinity - return the affinity of a particular MSI vector
> * @dev: PCI device to operate on
> * @nr: device-relative interrupt vector index (0-based).
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 24/39] PCI/MSI: Move pci_irq_vector() to api.c
@ 2022-11-16 16:23 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:23 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:53PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_irq_vector() and let its kernel-doc match the rest of the file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
> drivers/pci/msi/msi.c | 24 ------------------------
> 2 files changed, 23 insertions(+), 24 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 8546749afa6e..0f1ec87e3f9f 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -182,3 +182,26 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
> return nvecs;
> }
> EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
> +
> +/**
> + * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector
> + * @dev: the PCI device to operate on
> + * @nr: device-relative interrupt vector index (0-based); has different
> + * meanings, depending on interrupt mode
> + * MSI-X the index in the MSI-X vector table
> + * MSI the index of the enabled MSI vectors
> + * INTx must be 0
> + *
> + * Return: the Linux IRQ number, or -EINVAL if @nr is out of range
> + */
> +int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> +{
> + unsigned int irq;
> +
> + if (!dev->msi_enabled && !dev->msix_enabled)
> + return !nr ? dev->irq : -EINVAL;
> +
> + irq = msi_get_virq(&dev->dev, nr);
> + return irq ? irq : -EINVAL;
> +}
> +EXPORT_SYMBOL(pci_irq_vector);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index a028774f438d..38ad2fe4b85c 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -900,30 +900,6 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> /**
> - * pci_irq_vector - return Linux IRQ number of a device vector
> - * @dev: PCI device to operate on
> - * @nr: Interrupt vector index (0-based)
> - *
> - * @nr has the following meanings depending on the interrupt mode:
> - * MSI-X: The index in the MSI-X vector table
> - * MSI: The index of the enabled MSI vectors
> - * INTx: Must be 0
> - *
> - * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
> - */
> -int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> -{
> - unsigned int irq;
> -
> - if (!dev->msi_enabled && !dev->msix_enabled)
> - return !nr ? dev->irq : -EINVAL;
> -
> - irq = msi_get_virq(&dev->dev, nr);
> - return irq ? irq : -EINVAL;
> -}
> -EXPORT_SYMBOL(pci_irq_vector);
> -
> -/**
> * pci_irq_get_affinity - return the affinity of a particular MSI vector
> * @dev: PCI device to operate on
> * @nr: device-relative interrupt vector index (0-based).
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_irq_vector() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 017239c8db209307d2acfc0f9a3b104c39f911b3
Gitweb: https://git.kernel.org/tip/017239c8db209307d2acfc0f9a3b104c39f911b3
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:53 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_irq_vector() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_vector() and let its kernel-doc match the rest of the file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122014.984490384@linutronix.de
---
drivers/pci/msi/api.c | 23 +++++++++++++++++++++++
drivers/pci/msi/msi.c | 24 ------------------------
2 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 8546749..0f1ec87 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -182,3 +182,26 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
return nvecs;
}
EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
+
+/**
+ * pci_irq_vector() - Get Linux IRQ number of a device interrupt vector
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: the Linux IRQ number, or -EINVAL if @nr is out of range
+ */
+int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
+{
+ unsigned int irq;
+
+ if (!dev->msi_enabled && !dev->msix_enabled)
+ return !nr ? dev->irq : -EINVAL;
+
+ irq = msi_get_virq(&dev->dev, nr);
+ return irq ? irq : -EINVAL;
+}
+EXPORT_SYMBOL(pci_irq_vector);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index a028774..38ad2fe 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -900,30 +900,6 @@ void pci_free_irq_vectors(struct pci_dev *dev)
EXPORT_SYMBOL(pci_free_irq_vectors);
/**
- * pci_irq_vector - return Linux IRQ number of a device vector
- * @dev: PCI device to operate on
- * @nr: Interrupt vector index (0-based)
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: The Linux interrupt number or -EINVAl if @nr is out of range.
- */
-int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
-{
- unsigned int irq;
-
- if (!dev->msi_enabled && !dev->msix_enabled)
- return !nr ? dev->irq : -EINVAL;
-
- irq = msi_get_virq(&dev->dev, nr);
- return irq ? irq : -EINVAL;
-}
-EXPORT_SYMBOL(pci_irq_vector);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 25/39] PCI/MSI: Move pci_free_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_free_irq_vectors() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 15 +++++++++++++++
drivers/pci/msi/msi.c | 13 -------------
2 files changed, 15 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 0f1ec87e3f9f..2ff2a9ccfc47 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -205,3 +205,18 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
return irq ? irq : -EINVAL;
}
EXPORT_SYMBOL(pci_irq_vector);
+
+/**
+ * pci_free_irq_vectors() - Free previously allocated IRQs for a device
+ * @dev: the PCI device to operate on
+ *
+ * Undo the interrupt vector allocations and possible device MSI/MSI-X
+ * enablement earlier done through pci_alloc_irq_vectors_affinity() or
+ * pci_alloc_irq_vectors().
+ */
+void pci_free_irq_vectors(struct pci_dev *dev)
+{
+ pci_disable_msix(dev);
+ pci_disable_msi(dev);
+}
+EXPORT_SYMBOL(pci_free_irq_vectors);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 38ad2fe4b85c..ed8caf5ac99f 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,19 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_free_irq_vectors - free previously allocated IRQs for a device
- * @dev: PCI device to operate on
- *
- * Undoes the allocations and enabling in pci_alloc_irq_vectors().
- */
-void pci_free_irq_vectors(struct pci_dev *dev)
-{
- pci_disable_msix(dev);
- pci_disable_msi(dev);
-}
-EXPORT_SYMBOL(pci_free_irq_vectors);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 25/39] PCI/MSI: Move pci_free_irq_vectors() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_free_irq_vectors() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 15 +++++++++++++++
drivers/pci/msi/msi.c | 13 -------------
2 files changed, 15 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 0f1ec87e3f9f..2ff2a9ccfc47 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -205,3 +205,18 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
return irq ? irq : -EINVAL;
}
EXPORT_SYMBOL(pci_irq_vector);
+
+/**
+ * pci_free_irq_vectors() - Free previously allocated IRQs for a device
+ * @dev: the PCI device to operate on
+ *
+ * Undo the interrupt vector allocations and possible device MSI/MSI-X
+ * enablement earlier done through pci_alloc_irq_vectors_affinity() or
+ * pci_alloc_irq_vectors().
+ */
+void pci_free_irq_vectors(struct pci_dev *dev)
+{
+ pci_disable_msix(dev);
+ pci_disable_msi(dev);
+}
+EXPORT_SYMBOL(pci_free_irq_vectors);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 38ad2fe4b85c..ed8caf5ac99f 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,19 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_free_irq_vectors - free previously allocated IRQs for a device
- * @dev: PCI device to operate on
- *
- * Undoes the allocations and enabling in pci_alloc_irq_vectors().
- */
-void pci_free_irq_vectors(struct pci_dev *dev)
-{
- pci_disable_msix(dev);
- pci_disable_msi(dev);
-}
-EXPORT_SYMBOL(pci_free_irq_vectors);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 25/39] PCI/MSI: Move pci_free_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:24 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:24 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:54PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_free_irq_vectors() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 15 +++++++++++++++
> drivers/pci/msi/msi.c | 13 -------------
> 2 files changed, 15 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 0f1ec87e3f9f..2ff2a9ccfc47 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -205,3 +205,18 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> return irq ? irq : -EINVAL;
> }
> EXPORT_SYMBOL(pci_irq_vector);
> +
> +/**
> + * pci_free_irq_vectors() - Free previously allocated IRQs for a device
> + * @dev: the PCI device to operate on
> + *
> + * Undo the interrupt vector allocations and possible device MSI/MSI-X
> + * enablement earlier done through pci_alloc_irq_vectors_affinity() or
> + * pci_alloc_irq_vectors().
> + */
> +void pci_free_irq_vectors(struct pci_dev *dev)
> +{
> + pci_disable_msix(dev);
> + pci_disable_msi(dev);
> +}
> +EXPORT_SYMBOL(pci_free_irq_vectors);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 38ad2fe4b85c..ed8caf5ac99f 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -887,19 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_free_irq_vectors - free previously allocated IRQs for a device
> - * @dev: PCI device to operate on
> - *
> - * Undoes the allocations and enabling in pci_alloc_irq_vectors().
> - */
> -void pci_free_irq_vectors(struct pci_dev *dev)
> -{
> - pci_disable_msix(dev);
> - pci_disable_msi(dev);
> -}
> -EXPORT_SYMBOL(pci_free_irq_vectors);
> -
> -/**
> * pci_irq_get_affinity - return the affinity of a particular MSI vector
> * @dev: PCI device to operate on
> * @nr: device-relative interrupt vector index (0-based).
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 25/39] PCI/MSI: Move pci_free_irq_vectors() to api.c
@ 2022-11-16 16:24 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:24 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:54PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_free_irq_vectors() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 15 +++++++++++++++
> drivers/pci/msi/msi.c | 13 -------------
> 2 files changed, 15 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 0f1ec87e3f9f..2ff2a9ccfc47 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -205,3 +205,18 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> return irq ? irq : -EINVAL;
> }
> EXPORT_SYMBOL(pci_irq_vector);
> +
> +/**
> + * pci_free_irq_vectors() - Free previously allocated IRQs for a device
> + * @dev: the PCI device to operate on
> + *
> + * Undo the interrupt vector allocations and possible device MSI/MSI-X
> + * enablement earlier done through pci_alloc_irq_vectors_affinity() or
> + * pci_alloc_irq_vectors().
> + */
> +void pci_free_irq_vectors(struct pci_dev *dev)
> +{
> + pci_disable_msix(dev);
> + pci_disable_msi(dev);
> +}
> +EXPORT_SYMBOL(pci_free_irq_vectors);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 38ad2fe4b85c..ed8caf5ac99f 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -887,19 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
>
> /**
> - * pci_free_irq_vectors - free previously allocated IRQs for a device
> - * @dev: PCI device to operate on
> - *
> - * Undoes the allocations and enabling in pci_alloc_irq_vectors().
> - */
> -void pci_free_irq_vectors(struct pci_dev *dev)
> -{
> - pci_disable_msix(dev);
> - pci_disable_msi(dev);
> -}
> -EXPORT_SYMBOL(pci_free_irq_vectors);
> -
> -/**
> * pci_irq_get_affinity - return the affinity of a particular MSI vector
> * @dev: PCI device to operate on
> * @nr: device-relative interrupt vector index (0-based).
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_free_irq_vectors() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 059f778d66ba88e1acad89a46cfb35eb8703feef
Gitweb: https://git.kernel.org/tip/059f778d66ba88e1acad89a46cfb35eb8703feef
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:54 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_free_irq_vectors() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_free_irq_vectors() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.042870570@linutronix.de
---
drivers/pci/msi/api.c | 15 +++++++++++++++
drivers/pci/msi/msi.c | 13 -------------
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 0f1ec87..2ff2a9c 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -205,3 +205,18 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
return irq ? irq : -EINVAL;
}
EXPORT_SYMBOL(pci_irq_vector);
+
+/**
+ * pci_free_irq_vectors() - Free previously allocated IRQs for a device
+ * @dev: the PCI device to operate on
+ *
+ * Undo the interrupt vector allocations and possible device MSI/MSI-X
+ * enablement earlier done through pci_alloc_irq_vectors_affinity() or
+ * pci_alloc_irq_vectors().
+ */
+void pci_free_irq_vectors(struct pci_dev *dev)
+{
+ pci_disable_msix(dev);
+ pci_disable_msi(dev);
+}
+EXPORT_SYMBOL(pci_free_irq_vectors);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 38ad2fe..ed8caf5 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -887,19 +887,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
/**
- * pci_free_irq_vectors - free previously allocated IRQs for a device
- * @dev: PCI device to operate on
- *
- * Undoes the allocations and enabling in pci_alloc_irq_vectors().
- */
-void pci_free_irq_vectors(struct pci_dev *dev)
-{
- pci_disable_msix(dev);
- pci_disable_msi(dev);
-}
-EXPORT_SYMBOL(pci_free_irq_vectors);
-
-/**
* pci_irq_get_affinity - return the affinity of a particular MSI vector
* @dev: PCI device to operate on
* @nr: device-relative interrupt vector index (0-based).
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 26/39] PCI/MSI: Move pci_msix_vec_count() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msix_vec_count() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 20 ++++++++++++++++++++
drivers/pci/msi/msi.c | 20 --------------------
2 files changed, 20 insertions(+), 20 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 2ff2a9ccfc47..83ea38ffa116 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -60,6 +60,26 @@ void pci_disable_msi(struct pci_dev *dev)
EXPORT_SYMBOL(pci_disable_msi);
/**
+ * pci_msix_vec_count() - Get number of MSI-X interrupt vectors on device
+ * @dev: the PCI device to operate on
+ *
+ * Return: number of MSI-X interrupt vectors available on this device
+ * (i.e., the device's MSI-X capability structure "table size"), -EINVAL
+ * if the device is not MSI-X capable, other errnos otherwise.
+ */
+int pci_msix_vec_count(struct pci_dev *dev)
+{
+ u16 control;
+
+ if (!dev->msix_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
+ return msix_table_size(control);
+}
+EXPORT_SYMBOL(pci_msix_vec_count);
+
+/**
* pci_enable_msix_range() - Enable MSI-X interrupt mode on device
* @dev: the PCI device to operate on
* @entries: input/output parameter, array of MSI-X configuration entries
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index ed8caf5ac99f..1226d66da992 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -701,26 +701,6 @@ void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-/**
- * pci_msix_vec_count - return the number of device's MSI-X table entries
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * This function returns the number of device's MSI-X table entries and
- * therefore the number of MSI-X vectors device is capable of sending.
- * It returns a negative errno if the device is not capable of sending MSI-X
- * interrupts.
- **/
-int pci_msix_vec_count(struct pci_dev *dev)
-{
- u16 control;
-
- if (!dev->msix_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
- return msix_table_size(control);
-}
-EXPORT_SYMBOL(pci_msix_vec_count);
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 26/39] PCI/MSI: Move pci_msix_vec_count() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msix_vec_count() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 20 ++++++++++++++++++++
drivers/pci/msi/msi.c | 20 --------------------
2 files changed, 20 insertions(+), 20 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 2ff2a9ccfc47..83ea38ffa116 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -60,6 +60,26 @@ void pci_disable_msi(struct pci_dev *dev)
EXPORT_SYMBOL(pci_disable_msi);
/**
+ * pci_msix_vec_count() - Get number of MSI-X interrupt vectors on device
+ * @dev: the PCI device to operate on
+ *
+ * Return: number of MSI-X interrupt vectors available on this device
+ * (i.e., the device's MSI-X capability structure "table size"), -EINVAL
+ * if the device is not MSI-X capable, other errnos otherwise.
+ */
+int pci_msix_vec_count(struct pci_dev *dev)
+{
+ u16 control;
+
+ if (!dev->msix_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
+ return msix_table_size(control);
+}
+EXPORT_SYMBOL(pci_msix_vec_count);
+
+/**
* pci_enable_msix_range() - Enable MSI-X interrupt mode on device
* @dev: the PCI device to operate on
* @entries: input/output parameter, array of MSI-X configuration entries
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index ed8caf5ac99f..1226d66da992 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -701,26 +701,6 @@ void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-/**
- * pci_msix_vec_count - return the number of device's MSI-X table entries
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * This function returns the number of device's MSI-X table entries and
- * therefore the number of MSI-X vectors device is capable of sending.
- * It returns a negative errno if the device is not capable of sending MSI-X
- * interrupts.
- **/
-int pci_msix_vec_count(struct pci_dev *dev)
-{
- u16 control;
-
- if (!dev->msix_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
- return msix_table_size(control);
-}
-EXPORT_SYMBOL(pci_msix_vec_count);
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 26/39] PCI/MSI: Move pci_msix_vec_count() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:24 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:24 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:56PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msix_vec_count() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 20 ++++++++++++++++++++
> drivers/pci/msi/msi.c | 20 --------------------
> 2 files changed, 20 insertions(+), 20 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 2ff2a9ccfc47..83ea38ffa116 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -60,6 +60,26 @@ void pci_disable_msi(struct pci_dev *dev)
> EXPORT_SYMBOL(pci_disable_msi);
>
> /**
> + * pci_msix_vec_count() - Get number of MSI-X interrupt vectors on device
> + * @dev: the PCI device to operate on
> + *
> + * Return: number of MSI-X interrupt vectors available on this device
> + * (i.e., the device's MSI-X capability structure "table size"), -EINVAL
> + * if the device is not MSI-X capable, other errnos otherwise.
> + */
> +int pci_msix_vec_count(struct pci_dev *dev)
> +{
> + u16 control;
> +
> + if (!dev->msix_cap)
> + return -EINVAL;
> +
> + pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
> + return msix_table_size(control);
> +}
> +EXPORT_SYMBOL(pci_msix_vec_count);
> +
> +/**
> * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
> * @dev: the PCI device to operate on
> * @entries: input/output parameter, array of MSI-X configuration entries
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index ed8caf5ac99f..1226d66da992 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -701,26 +701,6 @@ void pci_msi_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -/**
> - * pci_msix_vec_count - return the number of device's MSI-X table entries
> - * @dev: pointer to the pci_dev data structure of MSI-X device function
> - * This function returns the number of device's MSI-X table entries and
> - * therefore the number of MSI-X vectors device is capable of sending.
> - * It returns a negative errno if the device is not capable of sending MSI-X
> - * interrupts.
> - **/
> -int pci_msix_vec_count(struct pci_dev *dev)
> -{
> - u16 control;
> -
> - if (!dev->msix_cap)
> - return -EINVAL;
> -
> - pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
> - return msix_table_size(control);
> -}
> -EXPORT_SYMBOL(pci_msix_vec_count);
> -
> static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> int nvec, struct irq_affinity *affd, int flags)
> {
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 26/39] PCI/MSI: Move pci_msix_vec_count() to api.c
@ 2022-11-16 16:24 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:24 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:56PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msix_vec_count() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 20 ++++++++++++++++++++
> drivers/pci/msi/msi.c | 20 --------------------
> 2 files changed, 20 insertions(+), 20 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 2ff2a9ccfc47..83ea38ffa116 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -60,6 +60,26 @@ void pci_disable_msi(struct pci_dev *dev)
> EXPORT_SYMBOL(pci_disable_msi);
>
> /**
> + * pci_msix_vec_count() - Get number of MSI-X interrupt vectors on device
> + * @dev: the PCI device to operate on
> + *
> + * Return: number of MSI-X interrupt vectors available on this device
> + * (i.e., the device's MSI-X capability structure "table size"), -EINVAL
> + * if the device is not MSI-X capable, other errnos otherwise.
> + */
> +int pci_msix_vec_count(struct pci_dev *dev)
> +{
> + u16 control;
> +
> + if (!dev->msix_cap)
> + return -EINVAL;
> +
> + pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
> + return msix_table_size(control);
> +}
> +EXPORT_SYMBOL(pci_msix_vec_count);
> +
> +/**
> * pci_enable_msix_range() - Enable MSI-X interrupt mode on device
> * @dev: the PCI device to operate on
> * @entries: input/output parameter, array of MSI-X configuration entries
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index ed8caf5ac99f..1226d66da992 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -701,26 +701,6 @@ void pci_msi_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -/**
> - * pci_msix_vec_count - return the number of device's MSI-X table entries
> - * @dev: pointer to the pci_dev data structure of MSI-X device function
> - * This function returns the number of device's MSI-X table entries and
> - * therefore the number of MSI-X vectors device is capable of sending.
> - * It returns a negative errno if the device is not capable of sending MSI-X
> - * interrupts.
> - **/
> -int pci_msix_vec_count(struct pci_dev *dev)
> -{
> - u16 control;
> -
> - if (!dev->msix_cap)
> - return -EINVAL;
> -
> - pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
> - return msix_table_size(control);
> -}
> -EXPORT_SYMBOL(pci_msix_vec_count);
> -
> static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> int nvec, struct irq_affinity *affd, int flags)
> {
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_msix_vec_count() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 7b50f62776672e7b328455eddc90ceb01b64ac3e
Gitweb: https://git.kernel.org/tip/7b50f62776672e7b328455eddc90ceb01b64ac3e
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:56 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_msix_vec_count() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msix_vec_count() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.099461602@linutronix.de
---
drivers/pci/msi/api.c | 20 ++++++++++++++++++++
drivers/pci/msi/msi.c | 20 --------------------
2 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 2ff2a9c..83ea38f 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -60,6 +60,26 @@ void pci_disable_msi(struct pci_dev *dev)
EXPORT_SYMBOL(pci_disable_msi);
/**
+ * pci_msix_vec_count() - Get number of MSI-X interrupt vectors on device
+ * @dev: the PCI device to operate on
+ *
+ * Return: number of MSI-X interrupt vectors available on this device
+ * (i.e., the device's MSI-X capability structure "table size"), -EINVAL
+ * if the device is not MSI-X capable, other errnos otherwise.
+ */
+int pci_msix_vec_count(struct pci_dev *dev)
+{
+ u16 control;
+
+ if (!dev->msix_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
+ return msix_table_size(control);
+}
+EXPORT_SYMBOL(pci_msix_vec_count);
+
+/**
* pci_enable_msix_range() - Enable MSI-X interrupt mode on device
* @dev: the PCI device to operate on
* @entries: input/output parameter, array of MSI-X configuration entries
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index ed8caf5..1226d66 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -701,26 +701,6 @@ void pci_msi_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-/**
- * pci_msix_vec_count - return the number of device's MSI-X table entries
- * @dev: pointer to the pci_dev data structure of MSI-X device function
- * This function returns the number of device's MSI-X table entries and
- * therefore the number of MSI-X vectors device is capable of sending.
- * It returns a negative errno if the device is not capable of sending MSI-X
- * interrupts.
- **/
-int pci_msix_vec_count(struct pci_dev *dev)
-{
- u16 control;
-
- if (!dev->msix_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
- return msix_table_size(control);
-}
-EXPORT_SYMBOL(pci_msix_vec_count);
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_disable_msix() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 24 ++++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 83ea38ffa116..653a61868ae6 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -112,6 +112,30 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
EXPORT_SYMBOL(pci_enable_msix_range);
/**
+ * pci_disable_msix() - Disable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI-X interrupt mode on device,
+ * free earlier-allocated interrupt vectors, and restore INTx emulation.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default pin
+ * assertion IRQ. This is the cleanup pair of pci_enable_msix_range().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msix(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msix_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msix);
+
+/**
* pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
* @dev: the PCI device to operate on
* @min_vecs: minimum required number of vectors (must be >= 1)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 1226d66da992..6fa90d07d2e4 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -736,7 +736,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
return msix_capability_init(dev, entries, nvec, affd);
}
-static void pci_msix_shutdown(struct pci_dev *dev)
+void pci_msix_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -758,18 +758,6 @@ static void pci_msix_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msix(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msix_shutdown(dev);
- pci_free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msix);
-
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
struct irq_affinity *affd)
{
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 8c4a5289432d..77e2587f7e4f 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -86,6 +86,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
+void pci_msix_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_disable_msix() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 24 ++++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 83ea38ffa116..653a61868ae6 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -112,6 +112,30 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
EXPORT_SYMBOL(pci_enable_msix_range);
/**
+ * pci_disable_msix() - Disable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI-X interrupt mode on device,
+ * free earlier-allocated interrupt vectors, and restore INTx emulation.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default pin
+ * assertion IRQ. This is the cleanup pair of pci_enable_msix_range().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msix(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msix_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msix);
+
+/**
* pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
* @dev: the PCI device to operate on
* @min_vecs: minimum required number of vectors (must be >= 1)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 1226d66da992..6fa90d07d2e4 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -736,7 +736,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
return msix_capability_init(dev, entries, nvec, affd);
}
-static void pci_msix_shutdown(struct pci_dev *dev)
+void pci_msix_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -758,18 +758,6 @@ static void pci_msix_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msix(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msix_shutdown(dev);
- pci_free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msix);
-
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
struct irq_affinity *affd)
{
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 8c4a5289432d..77e2587f7e4f 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -86,6 +86,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
+void pci_msix_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:26 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:26 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:58PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_disable_msix() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Trivial question below.
> ---
> drivers/pci/msi/api.c | 24 ++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 14 +-------------
> drivers/pci/msi/msi.h | 1 +
> 3 files changed, 26 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 83ea38ffa116..653a61868ae6 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -112,6 +112,30 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> EXPORT_SYMBOL(pci_enable_msix_range);
>
> /**
> + * pci_disable_msix() - Disable MSI-X interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to disable MSI-X interrupt mode on device,
> + * free earlier-allocated interrupt vectors, and restore INTx emulation.
Isn't INTx *emulation* a PCIe implementation detail? Doesn't seem
relevant to callers that it's emulated.
> + * The PCI device Linux IRQ (@dev->irq) is restored to its default pin
> + * assertion IRQ. This is the cleanup pair of pci_enable_msix_range().
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + */
> +void pci_disable_msix(struct pci_dev *dev)
> +{
> + if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
> + return;
> +
> + msi_lock_descs(&dev->dev);
> + pci_msix_shutdown(dev);
> + pci_free_msi_irqs(dev);
> + msi_unlock_descs(&dev->dev);
> +}
> +EXPORT_SYMBOL(pci_disable_msix);
> +
> +/**
> * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
> * @dev: the PCI device to operate on
> * @min_vecs: minimum required number of vectors (must be >= 1)
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 1226d66da992..6fa90d07d2e4 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -736,7 +736,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> return msix_capability_init(dev, entries, nvec, affd);
> }
>
> -static void pci_msix_shutdown(struct pci_dev *dev)
> +void pci_msix_shutdown(struct pci_dev *dev)
> {
> struct msi_desc *desc;
>
> @@ -758,18 +758,6 @@ static void pci_msix_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -void pci_disable_msix(struct pci_dev *dev)
> -{
> - if (!pci_msi_enable || !dev || !dev->msix_enabled)
> - return;
> -
> - msi_lock_descs(&dev->dev);
> - pci_msix_shutdown(dev);
> - pci_free_msi_irqs(dev);
> - msi_unlock_descs(&dev->dev);
> -}
> -EXPORT_SYMBOL(pci_disable_msix);
> -
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> struct irq_affinity *affd)
> {
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 8c4a5289432d..77e2587f7e4f 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -86,6 +86,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
>
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> +void pci_msix_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
@ 2022-11-16 16:26 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:26 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:58PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_disable_msix() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Trivial question below.
> ---
> drivers/pci/msi/api.c | 24 ++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 14 +-------------
> drivers/pci/msi/msi.h | 1 +
> 3 files changed, 26 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 83ea38ffa116..653a61868ae6 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -112,6 +112,30 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
> EXPORT_SYMBOL(pci_enable_msix_range);
>
> /**
> + * pci_disable_msix() - Disable MSI-X interrupt mode on device
> + * @dev: the PCI device to operate on
> + *
> + * Legacy device driver API to disable MSI-X interrupt mode on device,
> + * free earlier-allocated interrupt vectors, and restore INTx emulation.
Isn't INTx *emulation* a PCIe implementation detail? Doesn't seem
relevant to callers that it's emulated.
> + * The PCI device Linux IRQ (@dev->irq) is restored to its default pin
> + * assertion IRQ. This is the cleanup pair of pci_enable_msix_range().
> + *
> + * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
> + * pair should, in general, be used instead.
> + */
> +void pci_disable_msix(struct pci_dev *dev)
> +{
> + if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
> + return;
> +
> + msi_lock_descs(&dev->dev);
> + pci_msix_shutdown(dev);
> + pci_free_msi_irqs(dev);
> + msi_unlock_descs(&dev->dev);
> +}
> +EXPORT_SYMBOL(pci_disable_msix);
> +
> +/**
> * pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
> * @dev: the PCI device to operate on
> * @min_vecs: minimum required number of vectors (must be >= 1)
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 1226d66da992..6fa90d07d2e4 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -736,7 +736,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> return msix_capability_init(dev, entries, nvec, affd);
> }
>
> -static void pci_msix_shutdown(struct pci_dev *dev)
> +void pci_msix_shutdown(struct pci_dev *dev)
> {
> struct msi_desc *desc;
>
> @@ -758,18 +758,6 @@ static void pci_msix_shutdown(struct pci_dev *dev)
> pcibios_alloc_irq(dev);
> }
>
> -void pci_disable_msix(struct pci_dev *dev)
> -{
> - if (!pci_msi_enable || !dev || !dev->msix_enabled)
> - return;
> -
> - msi_lock_descs(&dev->dev);
> - pci_msix_shutdown(dev);
> - pci_free_msi_irqs(dev);
> - msi_unlock_descs(&dev->dev);
> -}
> -EXPORT_SYMBOL(pci_disable_msix);
> -
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> struct irq_affinity *affd)
> {
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 8c4a5289432d..77e2587f7e4f 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -86,6 +86,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
>
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> +void pci_msix_shutdown(struct pci_dev *dev);
> void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
2022-11-16 16:26 ` Bjorn Helgaas
@ 2022-11-16 17:09 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:09 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Wed, Nov 16 2022 at 10:26, Bjorn Helgaas wrote:
>> /**
>> + * pci_disable_msix() - Disable MSI-X interrupt mode on device
>> + * @dev: the PCI device to operate on
>> + *
>> + * Legacy device driver API to disable MSI-X interrupt mode on device,
>> + * free earlier-allocated interrupt vectors, and restore INTx emulation.
>
> Isn't INTx *emulation* a PCIe implementation detail? Doesn't seem
> relevant to callers that it's emulated.
Don't know how the emulation ended up there. It restores INTx which is
obvioulsy not a wire on PCIe... But yes, it's uninteresting.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 27/39] PCI/MSI: Move pci_disable_msix() to api.c
@ 2022-11-16 17:09 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:09 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:26, Bjorn Helgaas wrote:
>> /**
>> + * pci_disable_msix() - Disable MSI-X interrupt mode on device
>> + * @dev: the PCI device to operate on
>> + *
>> + * Legacy device driver API to disable MSI-X interrupt mode on device,
>> + * free earlier-allocated interrupt vectors, and restore INTx emulation.
>
> Isn't INTx *emulation* a PCIe implementation detail? Doesn't seem
> relevant to callers that it's emulated.
Don't know how the emulation ended up there. It restores INTx which is
obvioulsy not a wire on PCIe... But yes, it's uninteresting.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_disable_msix() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 18e1926b8c8b7c2249c24057d5f836c578e29f08
Gitweb: https://git.kernel.org/tip/18e1926b8c8b7c2249c24057d5f836c578e29f08
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:58 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_disable_msix() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_disable_msix() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.156785224@linutronix.de
---
drivers/pci/msi/api.c | 24 ++++++++++++++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 1 +
3 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 83ea38f..20a580b 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -112,6 +112,30 @@ int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
EXPORT_SYMBOL(pci_enable_msix_range);
/**
+ * pci_disable_msix() - Disable MSI-X interrupt mode on device
+ * @dev: the PCI device to operate on
+ *
+ * Legacy device driver API to disable MSI-X interrupt mode on device,
+ * free earlier-allocated interrupt vectors, and restore INTx.
+ * The PCI device Linux IRQ (@dev->irq) is restored to its default pin
+ * assertion IRQ. This is the cleanup pair of pci_enable_msix_range().
+ *
+ * NOTE: The newer pci_alloc_irq_vectors() / pci_free_irq_vectors() API
+ * pair should, in general, be used instead.
+ */
+void pci_disable_msix(struct pci_dev *dev)
+{
+ if (!pci_msi_enabled() || !dev || !dev->msix_enabled)
+ return;
+
+ msi_lock_descs(&dev->dev);
+ pci_msix_shutdown(dev);
+ pci_free_msi_irqs(dev);
+ msi_unlock_descs(&dev->dev);
+}
+EXPORT_SYMBOL(pci_disable_msix);
+
+/**
* pci_alloc_irq_vectors() - Allocate multiple device interrupt vectors
* @dev: the PCI device to operate on
* @min_vecs: minimum required number of vectors (must be >= 1)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 1226d66..6fa90d0 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -736,7 +736,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
return msix_capability_init(dev, entries, nvec, affd);
}
-static void pci_msix_shutdown(struct pci_dev *dev)
+void pci_msix_shutdown(struct pci_dev *dev)
{
struct msi_desc *desc;
@@ -758,18 +758,6 @@ static void pci_msix_shutdown(struct pci_dev *dev)
pcibios_alloc_irq(dev);
}
-void pci_disable_msix(struct pci_dev *dev)
-{
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- msi_lock_descs(&dev->dev);
- pci_msix_shutdown(dev);
- pci_free_msi_irqs(dev);
- msi_unlock_descs(&dev->dev);
-}
-EXPORT_SYMBOL(pci_disable_msix);
-
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
struct irq_affinity *affd)
{
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 8c4a528..77e2587 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -86,6 +86,7 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
+void pci_msix_shutdown(struct pci_dev *dev);
void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 28/39] PCI/MSI: Move pci_irq_get_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:54 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_get_affinity() and let its kernel-doc match rest of the
file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 43 +++++++++++++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 38 --------------------------------------
2 files changed, 43 insertions(+), 38 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 653a61868ae6..473df7ba0584 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -9,6 +9,7 @@
*/
#include <linux/export.h>
+#include <linux/irq.h>
#include "msi.h"
@@ -251,6 +252,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
EXPORT_SYMBOL(pci_irq_vector);
/**
+ * pci_irq_get_affinity() - Get a device interrupt vector affinity
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
+ * the MSI(-X) vector was allocated without explicit affinity
+ * requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
+ * pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
+ * generic set of CPU ids representing all possible CPUs available
+ * during system boot if the device is in legacy INTx mode.
+ */
+const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
+{
+ int idx, irq = pci_irq_vector(dev, nr);
+ struct msi_desc *desc;
+
+ if (WARN_ON_ONCE(irq <= 0))
+ return NULL;
+
+ desc = irq_get_msi_desc(irq);
+ /* Non-MSI does not have the information handy */
+ if (!desc)
+ return cpu_possible_mask;
+
+ /* MSI[X] interrupts can be allocated without affinity descriptor */
+ if (!desc->affinity)
+ return NULL;
+
+ /*
+ * MSI has a mask array in the descriptor.
+ * MSI-X has a single mask.
+ */
+ idx = dev->msi_enabled ? nr : 0;
+ return &desc->affinity[idx].mask;
+}
+EXPORT_SYMBOL(pci_irq_get_affinity);
+
+/**
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6fa90d07d2e4..d78646d1c116 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
}
-/**
- * pci_irq_get_affinity - return the affinity of a particular MSI vector
- * @dev: PCI device to operate on
- * @nr: device-relative interrupt vector index (0-based).
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: A cpumask pointer or NULL if @nr is out of range
- */
-const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
-{
- int idx, irq = pci_irq_vector(dev, nr);
- struct msi_desc *desc;
-
- if (WARN_ON_ONCE(irq <= 0))
- return NULL;
-
- desc = irq_get_msi_desc(irq);
- /* Non-MSI does not have the information handy */
- if (!desc)
- return cpu_possible_mask;
-
- /* MSI[X] interrupts can be allocated without affinity descriptor */
- if (!desc->affinity)
- return NULL;
-
- /*
- * MSI has a mask array in the descriptor.
- * MSI-X has a single mask.
- */
- idx = dev->msi_enabled ? nr : 0;
- return &desc->affinity[idx].mask;
-}
-EXPORT_SYMBOL(pci_irq_get_affinity);
-
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 28/39] PCI/MSI: Move pci_irq_get_affinity() to api.c
@ 2022-11-11 13:54 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:54 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_get_affinity() and let its kernel-doc match rest of the
file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 43 +++++++++++++++++++++++++++++++++++++++++++
drivers/pci/msi/msi.c | 38 --------------------------------------
2 files changed, 43 insertions(+), 38 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 653a61868ae6..473df7ba0584 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -9,6 +9,7 @@
*/
#include <linux/export.h>
+#include <linux/irq.h>
#include "msi.h"
@@ -251,6 +252,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
EXPORT_SYMBOL(pci_irq_vector);
/**
+ * pci_irq_get_affinity() - Get a device interrupt vector affinity
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
+ * the MSI(-X) vector was allocated without explicit affinity
+ * requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
+ * pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
+ * generic set of CPU ids representing all possible CPUs available
+ * during system boot if the device is in legacy INTx mode.
+ */
+const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
+{
+ int idx, irq = pci_irq_vector(dev, nr);
+ struct msi_desc *desc;
+
+ if (WARN_ON_ONCE(irq <= 0))
+ return NULL;
+
+ desc = irq_get_msi_desc(irq);
+ /* Non-MSI does not have the information handy */
+ if (!desc)
+ return cpu_possible_mask;
+
+ /* MSI[X] interrupts can be allocated without affinity descriptor */
+ if (!desc->affinity)
+ return NULL;
+
+ /*
+ * MSI has a mask array in the descriptor.
+ * MSI-X has a single mask.
+ */
+ idx = dev->msi_enabled ? nr : 0;
+ return &desc->affinity[idx].mask;
+}
+EXPORT_SYMBOL(pci_irq_get_affinity);
+
+/**
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6fa90d07d2e4..d78646d1c116 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
}
-/**
- * pci_irq_get_affinity - return the affinity of a particular MSI vector
- * @dev: PCI device to operate on
- * @nr: device-relative interrupt vector index (0-based).
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: A cpumask pointer or NULL if @nr is out of range
- */
-const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
-{
- int idx, irq = pci_irq_vector(dev, nr);
- struct msi_desc *desc;
-
- if (WARN_ON_ONCE(irq <= 0))
- return NULL;
-
- desc = irq_get_msi_desc(irq);
- /* Non-MSI does not have the information handy */
- if (!desc)
- return cpu_possible_mask;
-
- /* MSI[X] interrupts can be allocated without affinity descriptor */
- if (!desc->affinity)
- return NULL;
-
- /*
- * MSI has a mask array in the descriptor.
- * MSI-X has a single mask.
- */
- idx = dev->msi_enabled ? nr : 0;
- return &desc->affinity[idx].mask;
-}
-EXPORT_SYMBOL(pci_irq_get_affinity);
-
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 28/39] PCI/MSI: Move pci_irq_get_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-16 16:35 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:35 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:54:59PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_irq_get_affinity() and let its kernel-doc match rest of the
> file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
One nit below.
> ---
> drivers/pci/msi/api.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 38 --------------------------------------
> 2 files changed, 43 insertions(+), 38 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 653a61868ae6..473df7ba0584 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -9,6 +9,7 @@
> */
>
> #include <linux/export.h>
> +#include <linux/irq.h>
>
> #include "msi.h"
>
> @@ -251,6 +252,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> EXPORT_SYMBOL(pci_irq_vector);
>
> /**
> + * pci_irq_get_affinity() - Get a device interrupt vector affinity
> + * @dev: the PCI device to operate on
> + * @nr: device-relative interrupt vector index (0-based); has different
> + * meanings, depending on interrupt mode
> + * MSI-X the index in the MSI-X vector table
> + * MSI the index of the enabled MSI vectors
> + * INTx must be 0
> + *
> + * Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
> + * the MSI(-X) vector was allocated without explicit affinity
> + * requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
> + * pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
> + * generic set of CPU ids representing all possible CPUs available
> + * during system boot if the device is in legacy INTx mode.
s/ids/IDs/
> + */
> +const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
> +{
> + int idx, irq = pci_irq_vector(dev, nr);
> + struct msi_desc *desc;
> +
> + if (WARN_ON_ONCE(irq <= 0))
> + return NULL;
> +
> + desc = irq_get_msi_desc(irq);
> + /* Non-MSI does not have the information handy */
> + if (!desc)
> + return cpu_possible_mask;
> +
> + /* MSI[X] interrupts can be allocated without affinity descriptor */
> + if (!desc->affinity)
> + return NULL;
> +
> + /*
> + * MSI has a mask array in the descriptor.
> + * MSI-X has a single mask.
> + */
> + idx = dev->msi_enabled ? nr : 0;
> + return &desc->affinity[idx].mask;
> +}
> +EXPORT_SYMBOL(pci_irq_get_affinity);
> +
> +/**
> * pci_free_irq_vectors() - Free previously allocated IRQs for a device
> * @dev: the PCI device to operate on
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 6fa90d07d2e4..d78646d1c116 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
> }
>
> -/**
> - * pci_irq_get_affinity - return the affinity of a particular MSI vector
> - * @dev: PCI device to operate on
> - * @nr: device-relative interrupt vector index (0-based).
> - *
> - * @nr has the following meanings depending on the interrupt mode:
> - * MSI-X: The index in the MSI-X vector table
> - * MSI: The index of the enabled MSI vectors
> - * INTx: Must be 0
> - *
> - * Return: A cpumask pointer or NULL if @nr is out of range
> - */
> -const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
> -{
> - int idx, irq = pci_irq_vector(dev, nr);
> - struct msi_desc *desc;
> -
> - if (WARN_ON_ONCE(irq <= 0))
> - return NULL;
> -
> - desc = irq_get_msi_desc(irq);
> - /* Non-MSI does not have the information handy */
> - if (!desc)
> - return cpu_possible_mask;
> -
> - /* MSI[X] interrupts can be allocated without affinity descriptor */
> - if (!desc->affinity)
> - return NULL;
> -
> - /*
> - * MSI has a mask array in the descriptor.
> - * MSI-X has a single mask.
> - */
> - idx = dev->msi_enabled ? nr : 0;
> - return &desc->affinity[idx].mask;
> -}
> -EXPORT_SYMBOL(pci_irq_get_affinity);
> -
> struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
> {
> return to_pci_dev(desc->dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 28/39] PCI/MSI: Move pci_irq_get_affinity() to api.c
@ 2022-11-16 16:35 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:35 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:54:59PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_irq_get_affinity() and let its kernel-doc match rest of the
> file.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
One nit below.
> ---
> drivers/pci/msi/api.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> drivers/pci/msi/msi.c | 38 --------------------------------------
> 2 files changed, 43 insertions(+), 38 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 653a61868ae6..473df7ba0584 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -9,6 +9,7 @@
> */
>
> #include <linux/export.h>
> +#include <linux/irq.h>
>
> #include "msi.h"
>
> @@ -251,6 +252,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
> EXPORT_SYMBOL(pci_irq_vector);
>
> /**
> + * pci_irq_get_affinity() - Get a device interrupt vector affinity
> + * @dev: the PCI device to operate on
> + * @nr: device-relative interrupt vector index (0-based); has different
> + * meanings, depending on interrupt mode
> + * MSI-X the index in the MSI-X vector table
> + * MSI the index of the enabled MSI vectors
> + * INTx must be 0
> + *
> + * Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
> + * the MSI(-X) vector was allocated without explicit affinity
> + * requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
> + * pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
> + * generic set of CPU ids representing all possible CPUs available
> + * during system boot if the device is in legacy INTx mode.
s/ids/IDs/
> + */
> +const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
> +{
> + int idx, irq = pci_irq_vector(dev, nr);
> + struct msi_desc *desc;
> +
> + if (WARN_ON_ONCE(irq <= 0))
> + return NULL;
> +
> + desc = irq_get_msi_desc(irq);
> + /* Non-MSI does not have the information handy */
> + if (!desc)
> + return cpu_possible_mask;
> +
> + /* MSI[X] interrupts can be allocated without affinity descriptor */
> + if (!desc->affinity)
> + return NULL;
> +
> + /*
> + * MSI has a mask array in the descriptor.
> + * MSI-X has a single mask.
> + */
> + idx = dev->msi_enabled ? nr : 0;
> + return &desc->affinity[idx].mask;
> +}
> +EXPORT_SYMBOL(pci_irq_get_affinity);
> +
> +/**
> * pci_free_irq_vectors() - Free previously allocated IRQs for a device
> * @dev: the PCI device to operate on
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 6fa90d07d2e4..d78646d1c116 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
> }
> }
>
> -/**
> - * pci_irq_get_affinity - return the affinity of a particular MSI vector
> - * @dev: PCI device to operate on
> - * @nr: device-relative interrupt vector index (0-based).
> - *
> - * @nr has the following meanings depending on the interrupt mode:
> - * MSI-X: The index in the MSI-X vector table
> - * MSI: The index of the enabled MSI vectors
> - * INTx: Must be 0
> - *
> - * Return: A cpumask pointer or NULL if @nr is out of range
> - */
> -const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
> -{
> - int idx, irq = pci_irq_vector(dev, nr);
> - struct msi_desc *desc;
> -
> - if (WARN_ON_ONCE(irq <= 0))
> - return NULL;
> -
> - desc = irq_get_msi_desc(irq);
> - /* Non-MSI does not have the information handy */
> - if (!desc)
> - return cpu_possible_mask;
> -
> - /* MSI[X] interrupts can be allocated without affinity descriptor */
> - if (!desc->affinity)
> - return NULL;
> -
> - /*
> - * MSI has a mask array in the descriptor.
> - * MSI-X has a single mask.
> - */
> - idx = dev->msi_enabled ? nr : 0;
> - return &desc->affinity[idx].mask;
> -}
> -EXPORT_SYMBOL(pci_irq_get_affinity);
> -
> struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
> {
> return to_pci_dev(desc->dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_irq_get_affinity() to api.c
2022-11-11 13:54 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: be37b8428b7b7740bbbc29c17cfa2ee42b9e2d8b
Gitweb: https://git.kernel.org/tip/be37b8428b7b7740bbbc29c17cfa2ee42b9e2d8b
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:54:59 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_irq_get_affinity() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_irq_get_affinity() and let its kernel-doc match rest of the
file.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.214792769@linutronix.de
---
drivers/pci/msi/api.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
drivers/pci/msi/msi.c | 38 +-------------------------------------
2 files changed, 43 insertions(+), 38 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 20a580b..93ddc55 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -9,6 +9,7 @@
*/
#include <linux/export.h>
+#include <linux/irq.h>
#include "msi.h"
@@ -251,6 +252,48 @@ int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
EXPORT_SYMBOL(pci_irq_vector);
/**
+ * pci_irq_get_affinity() - Get a device interrupt vector affinity
+ * @dev: the PCI device to operate on
+ * @nr: device-relative interrupt vector index (0-based); has different
+ * meanings, depending on interrupt mode
+ * MSI-X the index in the MSI-X vector table
+ * MSI the index of the enabled MSI vectors
+ * INTx must be 0
+ *
+ * Return: MSI/MSI-X vector affinity, NULL if @nr is out of range or if
+ * the MSI(-X) vector was allocated without explicit affinity
+ * requirements (e.g., by pci_enable_msi(), pci_enable_msix_range(), or
+ * pci_alloc_irq_vectors() without the %PCI_IRQ_AFFINITY flag). Return a
+ * generic set of CPU IDs representing all possible CPUs available
+ * during system boot if the device is in legacy INTx mode.
+ */
+const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
+{
+ int idx, irq = pci_irq_vector(dev, nr);
+ struct msi_desc *desc;
+
+ if (WARN_ON_ONCE(irq <= 0))
+ return NULL;
+
+ desc = irq_get_msi_desc(irq);
+ /* Non-MSI does not have the information handy */
+ if (!desc)
+ return cpu_possible_mask;
+
+ /* MSI[X] interrupts can be allocated without affinity descriptor */
+ if (!desc->affinity)
+ return NULL;
+
+ /*
+ * MSI has a mask array in the descriptor.
+ * MSI-X has a single mask.
+ */
+ idx = dev->msi_enabled ? nr : 0;
+ return &desc->affinity[idx].mask;
+}
+EXPORT_SYMBOL(pci_irq_get_affinity);
+
+/**
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
* @dev: the PCI device to operate on
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 6fa90d0..d78646d 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -854,44 +854,6 @@ int __pci_enable_msix_range(struct pci_dev *dev,
}
}
-/**
- * pci_irq_get_affinity - return the affinity of a particular MSI vector
- * @dev: PCI device to operate on
- * @nr: device-relative interrupt vector index (0-based).
- *
- * @nr has the following meanings depending on the interrupt mode:
- * MSI-X: The index in the MSI-X vector table
- * MSI: The index of the enabled MSI vectors
- * INTx: Must be 0
- *
- * Return: A cpumask pointer or NULL if @nr is out of range
- */
-const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
-{
- int idx, irq = pci_irq_vector(dev, nr);
- struct msi_desc *desc;
-
- if (WARN_ON_ONCE(irq <= 0))
- return NULL;
-
- desc = irq_get_msi_desc(irq);
- /* Non-MSI does not have the information handy */
- if (!desc)
- return cpu_possible_mask;
-
- /* MSI[X] interrupts can be allocated without affinity descriptor */
- if (!desc->affinity)
- return NULL;
-
- /*
- * MSI has a mask array in the descriptor.
- * MSI-X has a single mask.
- */
- idx = dev->msi_enabled ? nr : 0;
- return &desc->affinity[idx].mask;
-}
-EXPORT_SYMBOL(pci_irq_get_affinity);
-
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 29/39] PCI/MSI: Move pci_msi_enabled() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 12 ++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 16 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 473df7ba0584..ee9ed5ccd94d 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -307,3 +307,15 @@ void pci_free_irq_vectors(struct pci_dev *dev)
pci_disable_msi(dev);
}
EXPORT_SYMBOL(pci_free_irq_vectors);
+
+/**
+ * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
+ *
+ * Return: true if MSI has not been globally disabled through ACPI FADT,
+ * PCI bridge quirks, or the "pci=nomsi" kernel command-line option.
+ */
+int pci_msi_enabled(void)
+{
+ return pci_msi_enable;
+}
+EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index d78646d1c116..59c33bc7fe81 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -13,7 +13,7 @@
#include "../pci.h"
#include "msi.h"
-static int pci_msi_enable = 1;
+int pci_msi_enable = 1;
int pci_msi_ignore_mask;
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
@@ -864,15 +864,3 @@ void pci_no_msi(void)
{
pci_msi_enable = 0;
}
-
-/**
- * pci_msi_enabled - is MSI enabled?
- *
- * Returns true if MSI has not been disabled by the command-line option
- * pci=nomsi.
- **/
-int pci_msi_enabled(void)
-{
- return pci_msi_enable;
-}
-EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 77e2587f7e4f..f3f4ede53171 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,9 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* Subsystem variables */
+extern int pci_msi_enable;
+
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_msix_shutdown(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 29/39] PCI/MSI: Move pci_msi_enabled() to api.c
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/api.c | 12 ++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 16 insertions(+), 13 deletions(-)
---
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 473df7ba0584..ee9ed5ccd94d 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -307,3 +307,15 @@ void pci_free_irq_vectors(struct pci_dev *dev)
pci_disable_msi(dev);
}
EXPORT_SYMBOL(pci_free_irq_vectors);
+
+/**
+ * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
+ *
+ * Return: true if MSI has not been globally disabled through ACPI FADT,
+ * PCI bridge quirks, or the "pci=nomsi" kernel command-line option.
+ */
+int pci_msi_enabled(void)
+{
+ return pci_msi_enable;
+}
+EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index d78646d1c116..59c33bc7fe81 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -13,7 +13,7 @@
#include "../pci.h"
#include "msi.h"
-static int pci_msi_enable = 1;
+int pci_msi_enable = 1;
int pci_msi_ignore_mask;
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
@@ -864,15 +864,3 @@ void pci_no_msi(void)
{
pci_msi_enable = 0;
}
-
-/**
- * pci_msi_enabled - is MSI enabled?
- *
- * Returns true if MSI has not been disabled by the command-line option
- * pci=nomsi.
- **/
-int pci_msi_enabled(void)
-{
- return pci_msi_enable;
-}
-EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 77e2587f7e4f..f3f4ede53171 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,9 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* Subsystem variables */
+extern int pci_msi_enable;
+
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_msix_shutdown(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 29/39] PCI/MSI: Move pci_msi_enabled() to api.c
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:26 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:26 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:01PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 12 ++++++++++++
> drivers/pci/msi/msi.c | 14 +-------------
> drivers/pci/msi/msi.h | 3 +++
> 3 files changed, 16 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 473df7ba0584..ee9ed5ccd94d 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -307,3 +307,15 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> pci_disable_msi(dev);
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
> +
> +/**
> + * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
> + *
> + * Return: true if MSI has not been globally disabled through ACPI FADT,
> + * PCI bridge quirks, or the "pci=nomsi" kernel command-line option.
> + */
> +int pci_msi_enabled(void)
> +{
> + return pci_msi_enable;
> +}
> +EXPORT_SYMBOL(pci_msi_enabled);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index d78646d1c116..59c33bc7fe81 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -13,7 +13,7 @@
> #include "../pci.h"
> #include "msi.h"
>
> -static int pci_msi_enable = 1;
> +int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> @@ -864,15 +864,3 @@ void pci_no_msi(void)
> {
> pci_msi_enable = 0;
> }
> -
> -/**
> - * pci_msi_enabled - is MSI enabled?
> - *
> - * Returns true if MSI has not been disabled by the command-line option
> - * pci=nomsi.
> - **/
> -int pci_msi_enabled(void)
> -{
> - return pci_msi_enable;
> -}
> -EXPORT_SYMBOL(pci_msi_enabled);
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 77e2587f7e4f..f3f4ede53171 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -84,6 +84,9 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
>
> +/* Subsystem variables */
> +extern int pci_msi_enable;
> +
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_msix_shutdown(struct pci_dev *dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 29/39] PCI/MSI: Move pci_msi_enabled() to api.c
@ 2022-11-16 16:26 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:26 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:01PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and make its kernel-doc comprehensive.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/api.c | 12 ++++++++++++
> drivers/pci/msi/msi.c | 14 +-------------
> drivers/pci/msi/msi.h | 3 +++
> 3 files changed, 16 insertions(+), 13 deletions(-)
> ---
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index 473df7ba0584..ee9ed5ccd94d 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -307,3 +307,15 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> pci_disable_msi(dev);
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
> +
> +/**
> + * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
> + *
> + * Return: true if MSI has not been globally disabled through ACPI FADT,
> + * PCI bridge quirks, or the "pci=nomsi" kernel command-line option.
> + */
> +int pci_msi_enabled(void)
> +{
> + return pci_msi_enable;
> +}
> +EXPORT_SYMBOL(pci_msi_enabled);
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index d78646d1c116..59c33bc7fe81 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -13,7 +13,7 @@
> #include "../pci.h"
> #include "msi.h"
>
> -static int pci_msi_enable = 1;
> +int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> @@ -864,15 +864,3 @@ void pci_no_msi(void)
> {
> pci_msi_enable = 0;
> }
> -
> -/**
> - * pci_msi_enabled - is MSI enabled?
> - *
> - * Returns true if MSI has not been disabled by the command-line option
> - * pci=nomsi.
> - **/
> -int pci_msi_enabled(void)
> -{
> - return pci_msi_enable;
> -}
> -EXPORT_SYMBOL(pci_msi_enabled);
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index 77e2587f7e4f..f3f4ede53171 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -84,6 +84,9 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
> return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
> }
>
> +/* Subsystem variables */
> +extern int pci_msi_enable;
> +
> /* MSI internal functions invoked from the public APIs */
> void pci_msi_shutdown(struct pci_dev *dev);
> void pci_msix_shutdown(struct pci_dev *dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_msi_enabled() to api.c
2022-11-11 13:55 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 897a0b6aa8c7ee0015e8d1f781e8e61069aafe16
Gitweb: https://git.kernel.org/tip/897a0b6aa8c7ee0015e8d1f781e8e61069aafe16
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:01 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_msi_enabled() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and make its kernel-doc comprehensive.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.271447896@linutronix.de
---
drivers/pci/msi/api.c | 12 ++++++++++++
drivers/pci/msi/msi.c | 14 +-------------
drivers/pci/msi/msi.h | 3 +++
3 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 93ddc55..49ae3a3 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -307,3 +307,15 @@ void pci_free_irq_vectors(struct pci_dev *dev)
pci_disable_msi(dev);
}
EXPORT_SYMBOL(pci_free_irq_vectors);
+
+/**
+ * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
+ *
+ * Return: true if MSI has not been globally disabled through ACPI FADT,
+ * PCI bridge quirks, or the "pci=nomsi" kernel command-line option.
+ */
+int pci_msi_enabled(void)
+{
+ return pci_msi_enable;
+}
+EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index d78646d..59c33bc 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -13,7 +13,7 @@
#include "../pci.h"
#include "msi.h"
-static int pci_msi_enable = 1;
+int pci_msi_enable = 1;
int pci_msi_ignore_mask;
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
@@ -864,15 +864,3 @@ void pci_no_msi(void)
{
pci_msi_enable = 0;
}
-
-/**
- * pci_msi_enabled - is MSI enabled?
- *
- * Returns true if MSI has not been disabled by the command-line option
- * pci=nomsi.
- **/
-int pci_msi_enabled(void)
-{
- return pci_msi_enable;
-}
-EXPORT_SYMBOL(pci_msi_enabled);
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 77e2587..f3f4ede 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -84,6 +84,9 @@ static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
+/* Subsystem variables */
+extern int pci_msi_enable;
+
/* MSI internal functions invoked from the public APIs */
void pci_msi_shutdown(struct pci_dev *dev);
void pci_msix_shutdown(struct pci_dev *dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and add kernel-doc for the function.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index ee9ed5ccd94d..8d1cf6db9bd7 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_free_irq_vectors);
+/**
+ * pci_restore_msi_state() - Restore cached MSI(-X) state on device
+ * @dev: the PCI device to operate on
+ *
+ * Write the Linux-cached MSI(-X) state back on device. This is
+ * typically useful upon system resume, or after an error-recovery PCI
+ * adapter reset.
+ */
+void pci_restore_msi_state(struct pci_dev *dev)
+{
+ __pci_restore_msi_state(dev);
+ __pci_restore_msix_state(dev);
+}
+EXPORT_SYMBOL_GPL(pci_restore_msi_state);
+
/**
* pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 59c33bc7fe81..a5d168c823ff 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -199,7 +199,7 @@ bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
return true;
}
-static void __pci_restore_msi_state(struct pci_dev *dev)
+void __pci_restore_msi_state(struct pci_dev *dev)
{
struct msi_desc *entry;
u16 control;
@@ -231,7 +231,7 @@ static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
}
-static void __pci_restore_msix_state(struct pci_dev *dev)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
struct msi_desc *entry;
bool write_msg;
@@ -257,13 +257,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
}
-void pci_restore_msi_state(struct pci_dev *dev)
-{
- __pci_restore_msi_state(dev);
- __pci_restore_msix_state(dev);
-}
-EXPORT_SYMBOL_GPL(pci_restore_msi_state);
-
static void pcim_msi_release(void *pcidev)
{
struct pci_dev *dev = pcidev;
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index f3f4ede53171..8170ef2c5ad0 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -94,6 +94,8 @@ void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd, int flags);
+void __pci_restore_msi_state(struct pci_dev *dev);
+void __pci_restore_msix_state(struct pci_dev *dev);
/* Legacy (!IRQDOMAIN) fallbacks */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
To distangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and add kernel-doc for the function.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index ee9ed5ccd94d..8d1cf6db9bd7 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_free_irq_vectors);
+/**
+ * pci_restore_msi_state() - Restore cached MSI(-X) state on device
+ * @dev: the PCI device to operate on
+ *
+ * Write the Linux-cached MSI(-X) state back on device. This is
+ * typically useful upon system resume, or after an error-recovery PCI
+ * adapter reset.
+ */
+void pci_restore_msi_state(struct pci_dev *dev)
+{
+ __pci_restore_msi_state(dev);
+ __pci_restore_msix_state(dev);
+}
+EXPORT_SYMBOL_GPL(pci_restore_msi_state);
+
/**
* pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
*
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 59c33bc7fe81..a5d168c823ff 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -199,7 +199,7 @@ bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
return true;
}
-static void __pci_restore_msi_state(struct pci_dev *dev)
+void __pci_restore_msi_state(struct pci_dev *dev)
{
struct msi_desc *entry;
u16 control;
@@ -231,7 +231,7 @@ static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
}
-static void __pci_restore_msix_state(struct pci_dev *dev)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
struct msi_desc *entry;
bool write_msg;
@@ -257,13 +257,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
}
-void pci_restore_msi_state(struct pci_dev *dev)
-{
- __pci_restore_msi_state(dev);
- __pci_restore_msix_state(dev);
-}
-EXPORT_SYMBOL_GPL(pci_restore_msi_state);
-
static void pcim_msi_release(void *pcidev)
{
struct pci_dev *dev = pcidev;
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index f3f4ede53171..8170ef2c5ad0 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -94,6 +94,8 @@ void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd, int flags);
+void __pci_restore_msi_state(struct pci_dev *dev);
+void __pci_restore_msix_state(struct pci_dev *dev);
/* Legacy (!IRQDOMAIN) fallbacks */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* Re: [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:27 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:27 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:03PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and add kernel-doc for the function.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index ee9ed5ccd94d..8d1cf6db9bd7 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> +/**
> + * pci_restore_msi_state() - Restore cached MSI(-X) state on device
> + * @dev: the PCI device to operate on
> + *
> + * Write the Linux-cached MSI(-X) state back on device. This is
> + * typically useful upon system resume, or after an error-recovery PCI
> + * adapter reset.
> + */
> +void pci_restore_msi_state(struct pci_dev *dev)
> +{
> + __pci_restore_msi_state(dev);
> + __pci_restore_msix_state(dev);
> +}
> +EXPORT_SYMBOL_GPL(pci_restore_msi_state);
> +
> /**
> * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 59c33bc7fe81..a5d168c823ff 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -199,7 +199,7 @@ bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> return true;
> }
>
> -static void __pci_restore_msi_state(struct pci_dev *dev)
> +void __pci_restore_msi_state(struct pci_dev *dev)
> {
> struct msi_desc *entry;
> u16 control;
> @@ -231,7 +231,7 @@ static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> }
>
> -static void __pci_restore_msix_state(struct pci_dev *dev)
> +void __pci_restore_msix_state(struct pci_dev *dev)
> {
> struct msi_desc *entry;
> bool write_msg;
> @@ -257,13 +257,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
> pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> }
>
> -void pci_restore_msi_state(struct pci_dev *dev)
> -{
> - __pci_restore_msi_state(dev);
> - __pci_restore_msix_state(dev);
> -}
> -EXPORT_SYMBOL_GPL(pci_restore_msi_state);
> -
> static void pcim_msi_release(void *pcidev)
> {
> struct pci_dev *dev = pcidev;
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index f3f4ede53171..8170ef2c5ad0 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -94,6 +94,8 @@ void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> int maxvec, struct irq_affinity *affd, int flags);
> +void __pci_restore_msi_state(struct pci_dev *dev);
> +void __pci_restore_msix_state(struct pci_dev *dev);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
@ 2022-11-16 16:27 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:27 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:03PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and add kernel-doc for the function.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index ee9ed5ccd94d..8d1cf6db9bd7 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> +/**
> + * pci_restore_msi_state() - Restore cached MSI(-X) state on device
> + * @dev: the PCI device to operate on
> + *
> + * Write the Linux-cached MSI(-X) state back on device. This is
> + * typically useful upon system resume, or after an error-recovery PCI
> + * adapter reset.
> + */
> +void pci_restore_msi_state(struct pci_dev *dev)
> +{
> + __pci_restore_msi_state(dev);
> + __pci_restore_msix_state(dev);
> +}
> +EXPORT_SYMBOL_GPL(pci_restore_msi_state);
> +
> /**
> * pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
> *
> diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
> index 59c33bc7fe81..a5d168c823ff 100644
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -199,7 +199,7 @@ bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> return true;
> }
>
> -static void __pci_restore_msi_state(struct pci_dev *dev)
> +void __pci_restore_msi_state(struct pci_dev *dev)
> {
> struct msi_desc *entry;
> u16 control;
> @@ -231,7 +231,7 @@ static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> }
>
> -static void __pci_restore_msix_state(struct pci_dev *dev)
> +void __pci_restore_msix_state(struct pci_dev *dev)
> {
> struct msi_desc *entry;
> bool write_msg;
> @@ -257,13 +257,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
> pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> }
>
> -void pci_restore_msi_state(struct pci_dev *dev)
> -{
> - __pci_restore_msi_state(dev);
> - __pci_restore_msix_state(dev);
> -}
> -EXPORT_SYMBOL_GPL(pci_restore_msi_state);
> -
> static void pcim_msi_release(void *pcidev)
> {
> struct pci_dev *dev = pcidev;
> diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
> index f3f4ede53171..8170ef2c5ad0 100644
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -94,6 +94,8 @@ void pci_free_msi_irqs(struct pci_dev *dev);
> int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
> int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> int maxvec, struct irq_affinity *affd, int flags);
> +void __pci_restore_msi_state(struct pci_dev *dev);
> +void __pci_restore_msix_state(struct pci_dev *dev);
>
> /* Legacy (!IRQDOMAIN) fallbacks */
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 17:42 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:42 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:03PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and add kernel-doc for the function.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index ee9ed5ccd94d..8d1cf6db9bd7 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> +/**
> + * pci_restore_msi_state() - Restore cached MSI(-X) state on device
> + * @dev: the PCI device to operate on
> + *
> + * Write the Linux-cached MSI(-X) state back on device. This is
> + * typically useful upon system resume, or after an error-recovery PCI
> + * adapter reset.
> + */
> +void pci_restore_msi_state(struct pci_dev *dev)
> +{
> + __pci_restore_msi_state(dev);
> + __pci_restore_msix_state(dev);
> +}
> +EXPORT_SYMBOL_GPL(pci_restore_msi_state);
This leaves behind two functions that are only called from here.
I think they should be moved into this file as well.
Or perhaps more broadly, it would make sense if the functions
were split up into 'for irq chip implementors' 'for drivers' and
'shared utilities'.
There are several other examples, like
__pci_enable_msix_range()/__pci_enable_msi_range() that are only used
by api.c and could reasonably move as well, plus their tree of
single-use support functions.
And if you think about it that way - things have ended up so that
api.c is really all about vector allocation (as that is the only thing
the drivers actually do) so it would be tempting to call it
allocator.c and consolidate everything in that topic.
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 30/39] PCI/MSI: Move pci_msi_restore_state() to api.c
@ 2022-11-16 17:42 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:42 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:03PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> To distangle the maze in msi.c, all exported device-driver MSI APIs are
> now to be grouped in one file, api.c.
>
> Move pci_msi_enabled() and add kernel-doc for the function.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
> index ee9ed5ccd94d..8d1cf6db9bd7 100644
> --- a/drivers/pci/msi/api.c
> +++ b/drivers/pci/msi/api.c
> @@ -308,6 +308,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_free_irq_vectors);
>
> +/**
> + * pci_restore_msi_state() - Restore cached MSI(-X) state on device
> + * @dev: the PCI device to operate on
> + *
> + * Write the Linux-cached MSI(-X) state back on device. This is
> + * typically useful upon system resume, or after an error-recovery PCI
> + * adapter reset.
> + */
> +void pci_restore_msi_state(struct pci_dev *dev)
> +{
> + __pci_restore_msi_state(dev);
> + __pci_restore_msix_state(dev);
> +}
> +EXPORT_SYMBOL_GPL(pci_restore_msi_state);
This leaves behind two functions that are only called from here.
I think they should be moved into this file as well.
Or perhaps more broadly, it would make sense if the functions
were split up into 'for irq chip implementors' 'for drivers' and
'shared utilities'.
There are several other examples, like
__pci_enable_msix_range()/__pci_enable_msi_range() that are only used
by api.c and could reasonably move as well, plus their tree of
single-use support functions.
And if you think about it that way - things have ended up so that
api.c is really all about vector allocation (as that is the only thing
the drivers actually do) so it would be tempting to call it
allocator.c and consolidate everything in that topic.
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Move pci_msi_restore_state() to api.c
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:08 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:08 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 57127da98bc87688324cc2d29927b340d7754701
Gitweb: https://git.kernel.org/tip/57127da98bc87688324cc2d29927b340d7754701
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:03 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Move pci_msi_restore_state() to api.c
To disentangle the maze in msi.c, all exported device-driver MSI APIs are
now to be grouped in one file, api.c.
Move pci_msi_enabled() and add kernel-doc for the function.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.331584998@linutronix.de
---
drivers/pci/msi/api.c | 15 +++++++++++++++
drivers/pci/msi/msi.c | 11 ++---------
drivers/pci/msi/msi.h | 2 ++
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index 49ae3a3..6c3ad48 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -309,6 +309,21 @@ void pci_free_irq_vectors(struct pci_dev *dev)
EXPORT_SYMBOL(pci_free_irq_vectors);
/**
+ * pci_restore_msi_state() - Restore cached MSI(-X) state on device
+ * @dev: the PCI device to operate on
+ *
+ * Write the Linux-cached MSI(-X) state back on device. This is
+ * typically useful upon system resume, or after an error-recovery PCI
+ * adapter reset.
+ */
+void pci_restore_msi_state(struct pci_dev *dev)
+{
+ __pci_restore_msi_state(dev);
+ __pci_restore_msix_state(dev);
+}
+EXPORT_SYMBOL_GPL(pci_restore_msi_state);
+
+/**
* pci_msi_enabled() - Are MSI(-X) interrupts enabled system-wide?
*
* Return: true if MSI has not been globally disabled through ACPI FADT,
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 59c33bc..a5d168c 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -199,7 +199,7 @@ bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
return true;
}
-static void __pci_restore_msi_state(struct pci_dev *dev)
+void __pci_restore_msi_state(struct pci_dev *dev)
{
struct msi_desc *entry;
u16 control;
@@ -231,7 +231,7 @@ static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
}
-static void __pci_restore_msix_state(struct pci_dev *dev)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
struct msi_desc *entry;
bool write_msg;
@@ -257,13 +257,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
}
-void pci_restore_msi_state(struct pci_dev *dev)
-{
- __pci_restore_msi_state(dev);
- __pci_restore_msix_state(dev);
-}
-EXPORT_SYMBOL_GPL(pci_restore_msi_state);
-
static void pcim_msi_release(void *pcidev)
{
struct pci_dev *dev = pcidev;
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index f3f4ede..8170ef2 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -94,6 +94,8 @@ void pci_free_msi_irqs(struct pci_dev *dev);
int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
int maxvec, struct irq_affinity *affd, int flags);
+void __pci_restore_msi_state(struct pci_dev *dev);
+void __pci_restore_msix_state(struct pci_dev *dev);
/* Legacy (!IRQDOMAIN) fallbacks */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
All exported device-driver MSI APIs are now grouped in one place at
drivers/pci/msi/api.c with comprehensive kernel-docs added.
Reference these kernel-docs in the official PCI/MSI howto.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
Documentation/PCI/msi-howto.rst | 10 ++++++++++
1 file changed, 10 insertions(+)
---
--- a/Documentation/PCI/msi-howto.rst
+++ b/Documentation/PCI/msi-howto.rst
@@ -285,3 +285,13 @@ to bridges between the PCI root and the
It is also worth checking the device driver to see whether it supports MSIs.
For example, it may contain calls to pci_alloc_irq_vectors() with the
PCI_IRQ_MSI or PCI_IRQ_MSIX flags.
+
+
+List of device drivers MSI(-X) APIs
+===================================
+
+The PCI/MSI subystem has a dedicated C file for its exported device driver
+APIs — `drivers/pci/msi/api.c`. The following functions are exported:
+
+.. kernel-doc:: drivers/pci/msi/api.c
+ :export:
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
All exported device-driver MSI APIs are now grouped in one place at
drivers/pci/msi/api.c with comprehensive kernel-docs added.
Reference these kernel-docs in the official PCI/MSI howto.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
Documentation/PCI/msi-howto.rst | 10 ++++++++++
1 file changed, 10 insertions(+)
---
--- a/Documentation/PCI/msi-howto.rst
+++ b/Documentation/PCI/msi-howto.rst
@@ -285,3 +285,13 @@ to bridges between the PCI root and the
It is also worth checking the device driver to see whether it supports MSIs.
For example, it may contain calls to pci_alloc_irq_vectors() with the
PCI_IRQ_MSI or PCI_IRQ_MSIX flags.
+
+
+List of device drivers MSI(-X) APIs
+===================================
+
+The PCI/MSI subystem has a dedicated C file for its exported device driver
+APIs — `drivers/pci/msi/api.c`. The following functions are exported:
+
+.. kernel-doc:: drivers/pci/msi/api.c
+ :export:
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:27 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:27 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:04PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> All exported device-driver MSI APIs are now grouped in one place at
> drivers/pci/msi/api.c with comprehensive kernel-docs added.
>
> Reference these kernel-docs in the official PCI/MSI howto.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/PCI/msi-howto.rst | 10 ++++++++++
> 1 file changed, 10 insertions(+)
> ---
> --- a/Documentation/PCI/msi-howto.rst
> +++ b/Documentation/PCI/msi-howto.rst
> @@ -285,3 +285,13 @@ to bridges between the PCI root and the
> It is also worth checking the device driver to see whether it supports MSIs.
> For example, it may contain calls to pci_alloc_irq_vectors() with the
> PCI_IRQ_MSI or PCI_IRQ_MSIX flags.
> +
> +
> +List of device drivers MSI(-X) APIs
> +===================================
> +
> +The PCI/MSI subystem has a dedicated C file for its exported device driver
> +APIs — `drivers/pci/msi/api.c`. The following functions are exported:
> +
> +.. kernel-doc:: drivers/pci/msi/api.c
> + :export:
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
@ 2022-11-16 16:27 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:27 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:04PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> All exported device-driver MSI APIs are now grouped in one place at
> drivers/pci/msi/api.c with comprehensive kernel-docs added.
>
> Reference these kernel-docs in the official PCI/MSI howto.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/PCI/msi-howto.rst | 10 ++++++++++
> 1 file changed, 10 insertions(+)
> ---
> --- a/Documentation/PCI/msi-howto.rst
> +++ b/Documentation/PCI/msi-howto.rst
> @@ -285,3 +285,13 @@ to bridges between the PCI root and the
> It is also worth checking the device driver to see whether it supports MSIs.
> For example, it may contain calls to pci_alloc_irq_vectors() with the
> PCI_IRQ_MSI or PCI_IRQ_MSIX flags.
> +
> +
> +List of device drivers MSI(-X) APIs
> +===================================
> +
> +The PCI/MSI subystem has a dedicated C file for its exported device driver
> +APIs — `drivers/pci/msi/api.c`. The following functions are exported:
> +
> +.. kernel-doc:: drivers/pci/msi/api.c
> + :export:
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 17:31 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Ahmed S. Darwish,
Reinette Chatre, Michael Ellerman, Christophe Leroy,
linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:04PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> All exported device-driver MSI APIs are now grouped in one place at
> drivers/pci/msi/api.c with comprehensive kernel-docs added.
>
> Reference these kernel-docs in the official PCI/MSI howto.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> ---
> Documentation/PCI/msi-howto.rst | 10 ++++++++++
> 1 file changed, 10 insertions(+)
I was wondering what the payoff was for moving everything to api.c,
this seems pretty good.
Though, in some regards it might be cleaner to teach ":export:" about
how to process symbol namespaces and put all the architecture facing
exports in some PCI_MSI_ARCH/IRQCHIP namespace which could achieve the
same effect for kdoc as moving all the code around and have the bonus
of discouraging people from mis-using the APIs inside inappropriate
drivers.
But, I like the idea, and the outcome is great so
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 31/39] Documentation: PCI: Add reference to PCI/MSI device driver APIs
@ 2022-11-16 17:31 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Marc Zyngier, Lorenzo Pieralisi,
Dave Jiang, Ashok Raj, Joerg Roedel, x86, Allen Hubbe,
Kevin Tian, Ahmed S. Darwish, Jon Mason, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, linuxppc-dev, LKML,
Greg Kroah-Hartman, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:04PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> All exported device-driver MSI APIs are now grouped in one place at
> drivers/pci/msi/api.c with comprehensive kernel-docs added.
>
> Reference these kernel-docs in the official PCI/MSI howto.
>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> ---
> Documentation/PCI/msi-howto.rst | 10 ++++++++++
> 1 file changed, 10 insertions(+)
I was wondering what the payoff was for moving everything to api.c,
this seems pretty good.
Though, in some regards it might be cleaner to teach ":export:" about
how to process symbol namespaces and put all the architecture facing
exports in some PCI_MSI_ARCH/IRQCHIP namespace which could achieve the
same effect for kdoc as moving all the code around and have the bonus
of discouraging people from mis-using the APIs inside inappropriate
drivers.
But, I like the idea, and the outcome is great so
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] Documentation: PCI: Add reference to PCI/MSI device driver APIs
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ahmed S. Darwish, Thomas Gleixner, Jason Gunthorpe,
Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 88614075a952b1af50f5fb10c958e311f6b4f68a
Gitweb: https://git.kernel.org/tip/88614075a952b1af50f5fb10c958e311f6b4f68a
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:04 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
Documentation: PCI: Add reference to PCI/MSI device driver APIs
All exported device-driver MSI APIs are now grouped in one place at
drivers/pci/msi/api.c with comprehensive kernel-docs added.
Reference these kernel-docs in the official PCI/MSI howto.
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.397739421@linutronix.de
---
Documentation/PCI/msi-howto.rst | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Documentation/PCI/msi-howto.rst b/Documentation/PCI/msi-howto.rst
index aa2046a..8ae461e 100644
--- a/Documentation/PCI/msi-howto.rst
+++ b/Documentation/PCI/msi-howto.rst
@@ -285,3 +285,13 @@ to bridges between the PCI root and the device, MSIs are disabled.
It is also worth checking the device driver to see whether it supports MSIs.
For example, it may contain calls to pci_alloc_irq_vectors() with the
PCI_IRQ_MSI or PCI_IRQ_MSIX flags.
+
+
+List of device drivers MSI(-X) APIs
+===================================
+
+The PCI/MSI subystem has a dedicated C file for its exported device driver
+APIs — `drivers/pci/msi/api.c`. The following functions are exported:
+
+.. kernel-doc:: drivers/pci/msi/api.c
+ :export:
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 32/39] PCI/MSI: Reorder functions in msi.c
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
From: Ahmed S. Darwish <darwi@linutronix.de>
There is no way to navigate msi.c without banging the head against the wall
every now and then because MSI and MSI-X specific functions are
intermingled and the code flow is completely non-obvious.
Reorder everthing so common helpers, MSI and MSI-X specific functions are
grouped together.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 577 +++++++++++++++++++++++++-------------------------
1 file changed, 295 insertions(+), 282 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,6 +16,97 @@
int pci_msi_enable = 1;
int pci_msi_ignore_mask;
+/**
+ * pci_msi_supported - check whether MSI may be enabled on a device
+ * @dev: pointer to the pci_dev data structure of MSI device function
+ * @nvec: how many MSIs have been requested?
+ *
+ * Look at global flags, the device itself, and its parent buses
+ * to determine if MSI/-X are supported for the device. If MSI/-X is
+ * supported return 1, else return 0.
+ **/
+static int pci_msi_supported(struct pci_dev *dev, int nvec)
+{
+ struct pci_bus *bus;
+
+ /* MSI must be globally enabled and supported by the device */
+ if (!pci_msi_enable)
+ return 0;
+
+ if (!dev || dev->no_msi)
+ return 0;
+
+ /*
+ * You can't ask to have 0 or less MSIs configured.
+ * a) it's stupid ..
+ * b) the list manipulation code assumes nvec >= 1.
+ */
+ if (nvec < 1)
+ return 0;
+
+ /*
+ * Any bridge which does NOT route MSI transactions from its
+ * secondary bus to its primary bus must set NO_MSI flag on
+ * the secondary pci_bus.
+ *
+ * The NO_MSI flag can either be set directly by:
+ * - arch-specific PCI host bus controller drivers (deprecated)
+ * - quirks for specific PCI bridges
+ *
+ * or indirectly by platform-specific PCI host bridge drivers by
+ * advertising the 'msi_domain' property, which results in
+ * the NO_MSI flag when no MSI domain is found for this bridge
+ * at probe time.
+ */
+ for (bus = dev->bus; bus; bus = bus->parent)
+ if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+ return 0;
+
+ return 1;
+}
+
+static void pcim_msi_release(void *pcidev)
+{
+ struct pci_dev *dev = pcidev;
+
+ dev->is_msi_managed = false;
+ pci_free_irq_vectors(dev);
+}
+
+/*
+ * Needs to be separate from pcim_release to prevent an ordering problem
+ * vs. msi_device_data_release() in the MSI core code.
+ */
+static int pcim_setup_msi_release(struct pci_dev *dev)
+{
+ int ret;
+
+ if (!pci_is_managed(dev) || dev->is_msi_managed)
+ return 0;
+
+ ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
+ if (!ret)
+ dev->is_msi_managed = true;
+ return ret;
+}
+
+/*
+ * Ordering vs. devres: msi device data has to be installed first so that
+ * pcim_msi_release() is invoked before it on device release.
+ */
+static int pci_setup_msi_context(struct pci_dev *dev)
+{
+ int ret = msi_setup_device_data(&dev->dev);
+
+ if (!ret)
+ ret = pcim_setup_msi_release(dev);
+ return ret;
+}
+
+/*
+ * Helper functions for mask/unmask and MSI message handling
+ */
+
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
@@ -163,15 +254,8 @@ void pci_write_msi_msg(unsigned int irq,
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-void pci_free_msi_irqs(struct pci_dev *dev)
-{
- pci_msi_teardown_msi_irqs(dev);
- if (dev->msix_base) {
- iounmap(dev->msix_base);
- dev->msix_base = NULL;
- }
-}
+/* PCI/MSI specific functionality */
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
@@ -190,111 +274,6 @@ static void pci_msi_set_enable(struct pc
pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
}
-/*
- * Architecture override returns true when the PCI MSI message should be
- * written by the generic restore function.
- */
-bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
-{
- return true;
-}
-
-void __pci_restore_msi_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- u16 control;
-
- if (!dev->msi_enabled)
- return;
-
- entry = irq_get_msi_desc(dev->irq);
-
- pci_intx_for_msi(dev, 0);
- pci_msi_set_enable(dev, 0);
- if (arch_restore_msi_irqs(dev))
- __pci_write_msi_msg(entry, &entry->msg);
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
- pci_msi_update_mask(entry, 0, 0);
- control &= ~PCI_MSI_FLAGS_QSIZE;
- control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
- pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
-}
-
-static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
-{
- u16 ctrl;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
- ctrl &= ~clear;
- ctrl |= set;
- pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
-}
-
-void __pci_restore_msix_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- bool write_msg;
-
- if (!dev->msix_enabled)
- return;
-
- /* route the table */
- pci_intx_for_msi(dev, 0);
- pci_msix_clear_and_set_ctrl(dev, 0,
- PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
-
- write_msg = arch_restore_msi_irqs(dev);
-
- msi_lock_descs(&dev->dev);
- msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
- if (write_msg)
- __pci_write_msi_msg(entry, &entry->msg);
- pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
- }
- msi_unlock_descs(&dev->dev);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
-}
-
-static void pcim_msi_release(void *pcidev)
-{
- struct pci_dev *dev = pcidev;
-
- dev->is_msi_managed = false;
- pci_free_irq_vectors(dev);
-}
-
-/*
- * Needs to be separate from pcim_release to prevent an ordering problem
- * vs. msi_device_data_release() in the MSI core code.
- */
-static int pcim_setup_msi_release(struct pci_dev *dev)
-{
- int ret;
-
- if (!pci_is_managed(dev) || dev->is_msi_managed)
- return 0;
-
- ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
- if (!ret)
- dev->is_msi_managed = true;
- return ret;
-}
-
-/*
- * Ordering vs. devres: msi device data has to be installed first so that
- * pcim_msi_release() is invoked before it on device release.
- */
-static int pci_setup_msi_context(struct pci_dev *dev)
-{
- int ret = msi_setup_device_data(&dev->dev);
-
- if (!ret)
- ret = pcim_setup_msi_release(dev);
- return ret;
-}
-
static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
struct irq_affinity_desc *masks)
{
@@ -415,6 +394,149 @@ static int msi_capability_init(struct pc
return ret;
}
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
+{
+ int nvec;
+ int rc;
+
+ if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
+
+ /* Check whether driver already requested MSI-X IRQs */
+ if (dev->msix_enabled) {
+ pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
+ return -EINVAL;
+ }
+
+ if (maxvec < minvec)
+ return -ERANGE;
+
+ if (WARN_ON_ONCE(dev->msi_enabled))
+ return -EINVAL;
+
+ nvec = pci_msi_vec_count(dev);
+ if (nvec < 0)
+ return nvec;
+ if (nvec < minvec)
+ return -ENOSPC;
+
+ if (nvec > maxvec)
+ nvec = maxvec;
+
+ rc = pci_setup_msi_context(dev);
+ if (rc)
+ return rc;
+
+ for (;;) {
+ if (affd) {
+ nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
+ if (nvec < minvec)
+ return -ENOSPC;
+ }
+
+ rc = msi_capability_init(dev, nvec, affd);
+ if (rc == 0)
+ return nvec;
+
+ if (rc < 0)
+ return rc;
+ if (rc < minvec)
+ return -ENOSPC;
+
+ nvec = rc;
+ }
+}
+
+/**
+ * pci_msi_vec_count - Return the number of MSI vectors a device can send
+ * @dev: device to report about
+ *
+ * This function returns the number of MSI vectors a device requested via
+ * Multiple Message Capable register. It returns a negative errno if the
+ * device is not capable sending MSI interrupts. Otherwise, the call succeeds
+ * and returns a power of two, up to a maximum of 2^5 (32), according to the
+ * MSI specification.
+ **/
+int pci_msi_vec_count(struct pci_dev *dev)
+{
+ int ret;
+ u16 msgctl;
+
+ if (!dev->msi_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
+ ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
+
+ return ret;
+}
+EXPORT_SYMBOL(pci_msi_vec_count);
+
+/*
+ * Architecture override returns true when the PCI MSI message should be
+ * written by the generic restore function.
+ */
+bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
+{
+ return true;
+}
+
+void __pci_restore_msi_state(struct pci_dev *dev)
+{
+ struct msi_desc *entry;
+ u16 control;
+
+ if (!dev->msi_enabled)
+ return;
+
+ entry = irq_get_msi_desc(dev->irq);
+
+ pci_intx_for_msi(dev, 0);
+ pci_msi_set_enable(dev, 0);
+ if (arch_restore_msi_irqs(dev))
+ __pci_write_msi_msg(entry, &entry->msg);
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
+ pci_msi_update_mask(entry, 0, 0);
+ control &= ~PCI_MSI_FLAGS_QSIZE;
+ control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
+ pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
+}
+
+void pci_msi_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
+
+ if (!pci_msi_enable || !dev || !dev->msi_enabled)
+ return;
+
+ pci_msi_set_enable(dev, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msi_enabled = 0;
+
+ /* Return the device with MSI unmasked as initial states */
+ desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
+ if (!WARN_ON_ONCE(!desc))
+ pci_msi_unmask(desc, msi_multi_mask(desc));
+
+ /* Restore dev->irq to its default pin-assertion IRQ */
+ dev->irq = desc->pci.msi_attrib.default_irq;
+ pcibios_alloc_irq(dev);
+}
+
+/* PCI/MSI-X specific functionality */
+
+static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
+{
+ u16 ctrl;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
+ ctrl &= ~clear;
+ ctrl |= set;
+ pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
+}
+
static void __iomem *msix_map_region(struct pci_dev *dev,
unsigned int nr_entries)
{
@@ -599,101 +721,6 @@ static int msix_capability_init(struct p
return ret;
}
-/**
- * pci_msi_supported - check whether MSI may be enabled on a device
- * @dev: pointer to the pci_dev data structure of MSI device function
- * @nvec: how many MSIs have been requested?
- *
- * Look at global flags, the device itself, and its parent buses
- * to determine if MSI/-X are supported for the device. If MSI/-X is
- * supported return 1, else return 0.
- **/
-static int pci_msi_supported(struct pci_dev *dev, int nvec)
-{
- struct pci_bus *bus;
-
- /* MSI must be globally enabled and supported by the device */
- if (!pci_msi_enable)
- return 0;
-
- if (!dev || dev->no_msi)
- return 0;
-
- /*
- * You can't ask to have 0 or less MSIs configured.
- * a) it's stupid ..
- * b) the list manipulation code assumes nvec >= 1.
- */
- if (nvec < 1)
- return 0;
-
- /*
- * Any bridge which does NOT route MSI transactions from its
- * secondary bus to its primary bus must set NO_MSI flag on
- * the secondary pci_bus.
- *
- * The NO_MSI flag can either be set directly by:
- * - arch-specific PCI host bus controller drivers (deprecated)
- * - quirks for specific PCI bridges
- *
- * or indirectly by platform-specific PCI host bridge drivers by
- * advertising the 'msi_domain' property, which results in
- * the NO_MSI flag when no MSI domain is found for this bridge
- * at probe time.
- */
- for (bus = dev->bus; bus; bus = bus->parent)
- if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
- return 0;
-
- return 1;
-}
-
-/**
- * pci_msi_vec_count - Return the number of MSI vectors a device can send
- * @dev: device to report about
- *
- * This function returns the number of MSI vectors a device requested via
- * Multiple Message Capable register. It returns a negative errno if the
- * device is not capable sending MSI interrupts. Otherwise, the call succeeds
- * and returns a power of two, up to a maximum of 2^5 (32), according to the
- * MSI specification.
- **/
-int pci_msi_vec_count(struct pci_dev *dev)
-{
- int ret;
- u16 msgctl;
-
- if (!dev->msi_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
- ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
-
- return ret;
-}
-EXPORT_SYMBOL(pci_msi_vec_count);
-
-void pci_msi_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- pci_msi_set_enable(dev, 0);
- pci_intx_for_msi(dev, 1);
- dev->msi_enabled = 0;
-
- /* Return the device with MSI unmasked as initial states */
- desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
- if (!WARN_ON_ONCE(!desc))
- pci_msi_unmask(desc, msi_multi_mask(desc));
-
- /* Restore dev->irq to its default pin-assertion IRQ */
- dev->irq = desc->pci.msi_attrib.default_irq;
- pcibios_alloc_irq(dev);
-}
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
@@ -729,57 +756,23 @@ static int __pci_enable_msix(struct pci_
return msix_capability_init(dev, entries, nvec, affd);
}
-void pci_msix_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- if (pci_dev_is_disconnected(dev)) {
- dev->msix_enabled = 0;
- return;
- }
-
- /* Return the device with MSI-X masked as initial states */
- msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
- pci_msix_mask(desc);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
- pci_intx_for_msi(dev, 1);
- dev->msix_enabled = 0;
- pcibios_alloc_irq(dev);
-}
-
-int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
- int nvec;
- int rc;
-
- if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
- return -EINVAL;
-
- /* Check whether driver already requested MSI-X IRQs */
- if (dev->msix_enabled) {
- pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
- return -EINVAL;
- }
+ int rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
- if (WARN_ON_ONCE(dev->msi_enabled))
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
return -EINVAL;
+ }
- nvec = pci_msi_vec_count(dev);
- if (nvec < 0)
- return nvec;
- if (nvec < minvec)
- return -ENOSPC;
-
- if (nvec > maxvec)
- nvec = maxvec;
+ if (WARN_ON_ONCE(dev->msix_enabled))
+ return -EINVAL;
rc = pci_setup_msi_context(dev);
if (rc)
@@ -792,7 +785,7 @@ int __pci_enable_msi_range(struct pci_de
return -ENOSPC;
}
- rc = msi_capability_init(dev, nvec, affd);
+ rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
if (rc == 0)
return nvec;
@@ -805,48 +798,68 @@ int __pci_enable_msi_range(struct pci_de
}
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
- int rc, nvec = maxvec;
+ struct msi_desc *entry;
+ bool write_msg;
- if (maxvec < minvec)
- return -ERANGE;
+ if (!dev->msix_enabled)
+ return;
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
- return -EINVAL;
+ /* route the table */
+ pci_intx_for_msi(dev, 0);
+ pci_msix_clear_and_set_ctrl(dev, 0,
+ PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
+
+ write_msg = arch_restore_msi_irqs(dev);
+
+ msi_lock_descs(&dev->dev);
+ msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
+ if (write_msg)
+ __pci_write_msi_msg(entry, &entry->msg);
+ pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
}
+ msi_unlock_descs(&dev->dev);
- if (WARN_ON_ONCE(dev->msix_enabled))
- return -EINVAL;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
+}
- rc = pci_setup_msi_context(dev);
- if (rc)
- return rc;
+void pci_msix_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
- for (;;) {
- if (affd) {
- nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
- if (nvec < minvec)
- return -ENOSPC;
- }
+ if (!pci_msi_enable || !dev || !dev->msix_enabled)
+ return;
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
- if (rc == 0)
- return nvec;
+ if (pci_dev_is_disconnected(dev)) {
+ dev->msix_enabled = 0;
+ return;
+ }
- if (rc < 0)
- return rc;
- if (rc < minvec)
- return -ENOSPC;
+ /* Return the device with MSI-X masked as initial states */
+ msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
+ pci_msix_mask(desc);
- nvec = rc;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msix_enabled = 0;
+ pcibios_alloc_irq(dev);
+}
+
+/* Common interfaces */
+
+void pci_free_msi_irqs(struct pci_dev *dev)
+{
+ pci_msi_teardown_msi_irqs(dev);
+
+ if (dev->msix_base) {
+ iounmap(dev->msix_base);
+ dev->msix_base = NULL;
}
}
+/* Misc. infrastructure */
+
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 32/39] PCI/MSI: Reorder functions in msi.c
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
From: Ahmed S. Darwish <darwi@linutronix.de>
There is no way to navigate msi.c without banging the head against the wall
every now and then because MSI and MSI-X specific functions are
intermingled and the code flow is completely non-obvious.
Reorder everthing so common helpers, MSI and MSI-X specific functions are
grouped together.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 577 +++++++++++++++++++++++++-------------------------
1 file changed, 295 insertions(+), 282 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,6 +16,97 @@
int pci_msi_enable = 1;
int pci_msi_ignore_mask;
+/**
+ * pci_msi_supported - check whether MSI may be enabled on a device
+ * @dev: pointer to the pci_dev data structure of MSI device function
+ * @nvec: how many MSIs have been requested?
+ *
+ * Look at global flags, the device itself, and its parent buses
+ * to determine if MSI/-X are supported for the device. If MSI/-X is
+ * supported return 1, else return 0.
+ **/
+static int pci_msi_supported(struct pci_dev *dev, int nvec)
+{
+ struct pci_bus *bus;
+
+ /* MSI must be globally enabled and supported by the device */
+ if (!pci_msi_enable)
+ return 0;
+
+ if (!dev || dev->no_msi)
+ return 0;
+
+ /*
+ * You can't ask to have 0 or less MSIs configured.
+ * a) it's stupid ..
+ * b) the list manipulation code assumes nvec >= 1.
+ */
+ if (nvec < 1)
+ return 0;
+
+ /*
+ * Any bridge which does NOT route MSI transactions from its
+ * secondary bus to its primary bus must set NO_MSI flag on
+ * the secondary pci_bus.
+ *
+ * The NO_MSI flag can either be set directly by:
+ * - arch-specific PCI host bus controller drivers (deprecated)
+ * - quirks for specific PCI bridges
+ *
+ * or indirectly by platform-specific PCI host bridge drivers by
+ * advertising the 'msi_domain' property, which results in
+ * the NO_MSI flag when no MSI domain is found for this bridge
+ * at probe time.
+ */
+ for (bus = dev->bus; bus; bus = bus->parent)
+ if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+ return 0;
+
+ return 1;
+}
+
+static void pcim_msi_release(void *pcidev)
+{
+ struct pci_dev *dev = pcidev;
+
+ dev->is_msi_managed = false;
+ pci_free_irq_vectors(dev);
+}
+
+/*
+ * Needs to be separate from pcim_release to prevent an ordering problem
+ * vs. msi_device_data_release() in the MSI core code.
+ */
+static int pcim_setup_msi_release(struct pci_dev *dev)
+{
+ int ret;
+
+ if (!pci_is_managed(dev) || dev->is_msi_managed)
+ return 0;
+
+ ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
+ if (!ret)
+ dev->is_msi_managed = true;
+ return ret;
+}
+
+/*
+ * Ordering vs. devres: msi device data has to be installed first so that
+ * pcim_msi_release() is invoked before it on device release.
+ */
+static int pci_setup_msi_context(struct pci_dev *dev)
+{
+ int ret = msi_setup_device_data(&dev->dev);
+
+ if (!ret)
+ ret = pcim_setup_msi_release(dev);
+ return ret;
+}
+
+/*
+ * Helper functions for mask/unmask and MSI message handling
+ */
+
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
@@ -163,15 +254,8 @@ void pci_write_msi_msg(unsigned int irq,
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-void pci_free_msi_irqs(struct pci_dev *dev)
-{
- pci_msi_teardown_msi_irqs(dev);
- if (dev->msix_base) {
- iounmap(dev->msix_base);
- dev->msix_base = NULL;
- }
-}
+/* PCI/MSI specific functionality */
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
@@ -190,111 +274,6 @@ static void pci_msi_set_enable(struct pc
pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
}
-/*
- * Architecture override returns true when the PCI MSI message should be
- * written by the generic restore function.
- */
-bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
-{
- return true;
-}
-
-void __pci_restore_msi_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- u16 control;
-
- if (!dev->msi_enabled)
- return;
-
- entry = irq_get_msi_desc(dev->irq);
-
- pci_intx_for_msi(dev, 0);
- pci_msi_set_enable(dev, 0);
- if (arch_restore_msi_irqs(dev))
- __pci_write_msi_msg(entry, &entry->msg);
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
- pci_msi_update_mask(entry, 0, 0);
- control &= ~PCI_MSI_FLAGS_QSIZE;
- control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
- pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
-}
-
-static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
-{
- u16 ctrl;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
- ctrl &= ~clear;
- ctrl |= set;
- pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
-}
-
-void __pci_restore_msix_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- bool write_msg;
-
- if (!dev->msix_enabled)
- return;
-
- /* route the table */
- pci_intx_for_msi(dev, 0);
- pci_msix_clear_and_set_ctrl(dev, 0,
- PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
-
- write_msg = arch_restore_msi_irqs(dev);
-
- msi_lock_descs(&dev->dev);
- msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
- if (write_msg)
- __pci_write_msi_msg(entry, &entry->msg);
- pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
- }
- msi_unlock_descs(&dev->dev);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
-}
-
-static void pcim_msi_release(void *pcidev)
-{
- struct pci_dev *dev = pcidev;
-
- dev->is_msi_managed = false;
- pci_free_irq_vectors(dev);
-}
-
-/*
- * Needs to be separate from pcim_release to prevent an ordering problem
- * vs. msi_device_data_release() in the MSI core code.
- */
-static int pcim_setup_msi_release(struct pci_dev *dev)
-{
- int ret;
-
- if (!pci_is_managed(dev) || dev->is_msi_managed)
- return 0;
-
- ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
- if (!ret)
- dev->is_msi_managed = true;
- return ret;
-}
-
-/*
- * Ordering vs. devres: msi device data has to be installed first so that
- * pcim_msi_release() is invoked before it on device release.
- */
-static int pci_setup_msi_context(struct pci_dev *dev)
-{
- int ret = msi_setup_device_data(&dev->dev);
-
- if (!ret)
- ret = pcim_setup_msi_release(dev);
- return ret;
-}
-
static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
struct irq_affinity_desc *masks)
{
@@ -415,6 +394,149 @@ static int msi_capability_init(struct pc
return ret;
}
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
+{
+ int nvec;
+ int rc;
+
+ if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
+
+ /* Check whether driver already requested MSI-X IRQs */
+ if (dev->msix_enabled) {
+ pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
+ return -EINVAL;
+ }
+
+ if (maxvec < minvec)
+ return -ERANGE;
+
+ if (WARN_ON_ONCE(dev->msi_enabled))
+ return -EINVAL;
+
+ nvec = pci_msi_vec_count(dev);
+ if (nvec < 0)
+ return nvec;
+ if (nvec < minvec)
+ return -ENOSPC;
+
+ if (nvec > maxvec)
+ nvec = maxvec;
+
+ rc = pci_setup_msi_context(dev);
+ if (rc)
+ return rc;
+
+ for (;;) {
+ if (affd) {
+ nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
+ if (nvec < minvec)
+ return -ENOSPC;
+ }
+
+ rc = msi_capability_init(dev, nvec, affd);
+ if (rc == 0)
+ return nvec;
+
+ if (rc < 0)
+ return rc;
+ if (rc < minvec)
+ return -ENOSPC;
+
+ nvec = rc;
+ }
+}
+
+/**
+ * pci_msi_vec_count - Return the number of MSI vectors a device can send
+ * @dev: device to report about
+ *
+ * This function returns the number of MSI vectors a device requested via
+ * Multiple Message Capable register. It returns a negative errno if the
+ * device is not capable sending MSI interrupts. Otherwise, the call succeeds
+ * and returns a power of two, up to a maximum of 2^5 (32), according to the
+ * MSI specification.
+ **/
+int pci_msi_vec_count(struct pci_dev *dev)
+{
+ int ret;
+ u16 msgctl;
+
+ if (!dev->msi_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
+ ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
+
+ return ret;
+}
+EXPORT_SYMBOL(pci_msi_vec_count);
+
+/*
+ * Architecture override returns true when the PCI MSI message should be
+ * written by the generic restore function.
+ */
+bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
+{
+ return true;
+}
+
+void __pci_restore_msi_state(struct pci_dev *dev)
+{
+ struct msi_desc *entry;
+ u16 control;
+
+ if (!dev->msi_enabled)
+ return;
+
+ entry = irq_get_msi_desc(dev->irq);
+
+ pci_intx_for_msi(dev, 0);
+ pci_msi_set_enable(dev, 0);
+ if (arch_restore_msi_irqs(dev))
+ __pci_write_msi_msg(entry, &entry->msg);
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
+ pci_msi_update_mask(entry, 0, 0);
+ control &= ~PCI_MSI_FLAGS_QSIZE;
+ control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
+ pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
+}
+
+void pci_msi_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
+
+ if (!pci_msi_enable || !dev || !dev->msi_enabled)
+ return;
+
+ pci_msi_set_enable(dev, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msi_enabled = 0;
+
+ /* Return the device with MSI unmasked as initial states */
+ desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
+ if (!WARN_ON_ONCE(!desc))
+ pci_msi_unmask(desc, msi_multi_mask(desc));
+
+ /* Restore dev->irq to its default pin-assertion IRQ */
+ dev->irq = desc->pci.msi_attrib.default_irq;
+ pcibios_alloc_irq(dev);
+}
+
+/* PCI/MSI-X specific functionality */
+
+static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
+{
+ u16 ctrl;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
+ ctrl &= ~clear;
+ ctrl |= set;
+ pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
+}
+
static void __iomem *msix_map_region(struct pci_dev *dev,
unsigned int nr_entries)
{
@@ -599,101 +721,6 @@ static int msix_capability_init(struct p
return ret;
}
-/**
- * pci_msi_supported - check whether MSI may be enabled on a device
- * @dev: pointer to the pci_dev data structure of MSI device function
- * @nvec: how many MSIs have been requested?
- *
- * Look at global flags, the device itself, and its parent buses
- * to determine if MSI/-X are supported for the device. If MSI/-X is
- * supported return 1, else return 0.
- **/
-static int pci_msi_supported(struct pci_dev *dev, int nvec)
-{
- struct pci_bus *bus;
-
- /* MSI must be globally enabled and supported by the device */
- if (!pci_msi_enable)
- return 0;
-
- if (!dev || dev->no_msi)
- return 0;
-
- /*
- * You can't ask to have 0 or less MSIs configured.
- * a) it's stupid ..
- * b) the list manipulation code assumes nvec >= 1.
- */
- if (nvec < 1)
- return 0;
-
- /*
- * Any bridge which does NOT route MSI transactions from its
- * secondary bus to its primary bus must set NO_MSI flag on
- * the secondary pci_bus.
- *
- * The NO_MSI flag can either be set directly by:
- * - arch-specific PCI host bus controller drivers (deprecated)
- * - quirks for specific PCI bridges
- *
- * or indirectly by platform-specific PCI host bridge drivers by
- * advertising the 'msi_domain' property, which results in
- * the NO_MSI flag when no MSI domain is found for this bridge
- * at probe time.
- */
- for (bus = dev->bus; bus; bus = bus->parent)
- if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
- return 0;
-
- return 1;
-}
-
-/**
- * pci_msi_vec_count - Return the number of MSI vectors a device can send
- * @dev: device to report about
- *
- * This function returns the number of MSI vectors a device requested via
- * Multiple Message Capable register. It returns a negative errno if the
- * device is not capable sending MSI interrupts. Otherwise, the call succeeds
- * and returns a power of two, up to a maximum of 2^5 (32), according to the
- * MSI specification.
- **/
-int pci_msi_vec_count(struct pci_dev *dev)
-{
- int ret;
- u16 msgctl;
-
- if (!dev->msi_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
- ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
-
- return ret;
-}
-EXPORT_SYMBOL(pci_msi_vec_count);
-
-void pci_msi_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- pci_msi_set_enable(dev, 0);
- pci_intx_for_msi(dev, 1);
- dev->msi_enabled = 0;
-
- /* Return the device with MSI unmasked as initial states */
- desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
- if (!WARN_ON_ONCE(!desc))
- pci_msi_unmask(desc, msi_multi_mask(desc));
-
- /* Restore dev->irq to its default pin-assertion IRQ */
- dev->irq = desc->pci.msi_attrib.default_irq;
- pcibios_alloc_irq(dev);
-}
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
@@ -729,57 +756,23 @@ static int __pci_enable_msix(struct pci_
return msix_capability_init(dev, entries, nvec, affd);
}
-void pci_msix_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- if (pci_dev_is_disconnected(dev)) {
- dev->msix_enabled = 0;
- return;
- }
-
- /* Return the device with MSI-X masked as initial states */
- msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
- pci_msix_mask(desc);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
- pci_intx_for_msi(dev, 1);
- dev->msix_enabled = 0;
- pcibios_alloc_irq(dev);
-}
-
-int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
- int nvec;
- int rc;
-
- if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
- return -EINVAL;
-
- /* Check whether driver already requested MSI-X IRQs */
- if (dev->msix_enabled) {
- pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
- return -EINVAL;
- }
+ int rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
- if (WARN_ON_ONCE(dev->msi_enabled))
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
return -EINVAL;
+ }
- nvec = pci_msi_vec_count(dev);
- if (nvec < 0)
- return nvec;
- if (nvec < minvec)
- return -ENOSPC;
-
- if (nvec > maxvec)
- nvec = maxvec;
+ if (WARN_ON_ONCE(dev->msix_enabled))
+ return -EINVAL;
rc = pci_setup_msi_context(dev);
if (rc)
@@ -792,7 +785,7 @@ int __pci_enable_msi_range(struct pci_de
return -ENOSPC;
}
- rc = msi_capability_init(dev, nvec, affd);
+ rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
if (rc == 0)
return nvec;
@@ -805,48 +798,68 @@ int __pci_enable_msi_range(struct pci_de
}
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
- int rc, nvec = maxvec;
+ struct msi_desc *entry;
+ bool write_msg;
- if (maxvec < minvec)
- return -ERANGE;
+ if (!dev->msix_enabled)
+ return;
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
- return -EINVAL;
+ /* route the table */
+ pci_intx_for_msi(dev, 0);
+ pci_msix_clear_and_set_ctrl(dev, 0,
+ PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
+
+ write_msg = arch_restore_msi_irqs(dev);
+
+ msi_lock_descs(&dev->dev);
+ msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
+ if (write_msg)
+ __pci_write_msi_msg(entry, &entry->msg);
+ pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
}
+ msi_unlock_descs(&dev->dev);
- if (WARN_ON_ONCE(dev->msix_enabled))
- return -EINVAL;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
+}
- rc = pci_setup_msi_context(dev);
- if (rc)
- return rc;
+void pci_msix_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
- for (;;) {
- if (affd) {
- nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
- if (nvec < minvec)
- return -ENOSPC;
- }
+ if (!pci_msi_enable || !dev || !dev->msix_enabled)
+ return;
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
- if (rc == 0)
- return nvec;
+ if (pci_dev_is_disconnected(dev)) {
+ dev->msix_enabled = 0;
+ return;
+ }
- if (rc < 0)
- return rc;
- if (rc < minvec)
- return -ENOSPC;
+ /* Return the device with MSI-X masked as initial states */
+ msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
+ pci_msix_mask(desc);
- nvec = rc;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msix_enabled = 0;
+ pcibios_alloc_irq(dev);
+}
+
+/* Common interfaces */
+
+void pci_free_msi_irqs(struct pci_dev *dev)
+{
+ pci_msi_teardown_msi_irqs(dev);
+
+ if (dev->msix_base) {
+ iounmap(dev->msix_base);
+ dev->msix_base = NULL;
}
}
+/* Misc. infrastructure */
+
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 32/39] PCI/MSI: Reorder functions in msi.c
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:28 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:28 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:06PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> There is no way to navigate msi.c without banging the head against the wall
> every now and then because MSI and MSI-X specific functions are
> intermingled and the code flow is completely non-obvious.
>
> Reorder everthing so common helpers, MSI and MSI-X specific functions are
> grouped together.
s/everthing/everything/
> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
I assume this is pure code movement, so I didn't even look at the
text below.
> ---
> drivers/pci/msi/msi.c | 577 +++++++++++++++++++++++++-------------------------
> 1 file changed, 295 insertions(+), 282 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -16,6 +16,97 @@
> int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> +/**
> + * pci_msi_supported - check whether MSI may be enabled on a device
> + * @dev: pointer to the pci_dev data structure of MSI device function
> + * @nvec: how many MSIs have been requested?
> + *
> + * Look at global flags, the device itself, and its parent buses
> + * to determine if MSI/-X are supported for the device. If MSI/-X is
> + * supported return 1, else return 0.
> + **/
> +static int pci_msi_supported(struct pci_dev *dev, int nvec)
> +{
> + struct pci_bus *bus;
> +
> + /* MSI must be globally enabled and supported by the device */
> + if (!pci_msi_enable)
> + return 0;
> +
> + if (!dev || dev->no_msi)
> + return 0;
> +
> + /*
> + * You can't ask to have 0 or less MSIs configured.
> + * a) it's stupid ..
> + * b) the list manipulation code assumes nvec >= 1.
> + */
> + if (nvec < 1)
> + return 0;
> +
> + /*
> + * Any bridge which does NOT route MSI transactions from its
> + * secondary bus to its primary bus must set NO_MSI flag on
> + * the secondary pci_bus.
> + *
> + * The NO_MSI flag can either be set directly by:
> + * - arch-specific PCI host bus controller drivers (deprecated)
> + * - quirks for specific PCI bridges
> + *
> + * or indirectly by platform-specific PCI host bridge drivers by
> + * advertising the 'msi_domain' property, which results in
> + * the NO_MSI flag when no MSI domain is found for this bridge
> + * at probe time.
> + */
> + for (bus = dev->bus; bus; bus = bus->parent)
> + if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
> + return 0;
> +
> + return 1;
> +}
> +
> +static void pcim_msi_release(void *pcidev)
> +{
> + struct pci_dev *dev = pcidev;
> +
> + dev->is_msi_managed = false;
> + pci_free_irq_vectors(dev);
> +}
> +
> +/*
> + * Needs to be separate from pcim_release to prevent an ordering problem
> + * vs. msi_device_data_release() in the MSI core code.
> + */
> +static int pcim_setup_msi_release(struct pci_dev *dev)
> +{
> + int ret;
> +
> + if (!pci_is_managed(dev) || dev->is_msi_managed)
> + return 0;
> +
> + ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
> + if (!ret)
> + dev->is_msi_managed = true;
> + return ret;
> +}
> +
> +/*
> + * Ordering vs. devres: msi device data has to be installed first so that
> + * pcim_msi_release() is invoked before it on device release.
> + */
> +static int pci_setup_msi_context(struct pci_dev *dev)
> +{
> + int ret = msi_setup_device_data(&dev->dev);
> +
> + if (!ret)
> + ret = pcim_setup_msi_release(dev);
> + return ret;
> +}
> +
> +/*
> + * Helper functions for mask/unmask and MSI message handling
> + */
> +
> void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> {
> raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
> @@ -163,15 +254,8 @@ void pci_write_msi_msg(unsigned int irq,
> }
> EXPORT_SYMBOL_GPL(pci_write_msi_msg);
>
> -void pci_free_msi_irqs(struct pci_dev *dev)
> -{
> - pci_msi_teardown_msi_irqs(dev);
>
> - if (dev->msix_base) {
> - iounmap(dev->msix_base);
> - dev->msix_base = NULL;
> - }
> -}
> +/* PCI/MSI specific functionality */
>
> static void pci_intx_for_msi(struct pci_dev *dev, int enable)
> {
> @@ -190,111 +274,6 @@ static void pci_msi_set_enable(struct pc
> pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> }
>
> -/*
> - * Architecture override returns true when the PCI MSI message should be
> - * written by the generic restore function.
> - */
> -bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> -{
> - return true;
> -}
> -
> -void __pci_restore_msi_state(struct pci_dev *dev)
> -{
> - struct msi_desc *entry;
> - u16 control;
> -
> - if (!dev->msi_enabled)
> - return;
> -
> - entry = irq_get_msi_desc(dev->irq);
> -
> - pci_intx_for_msi(dev, 0);
> - pci_msi_set_enable(dev, 0);
> - if (arch_restore_msi_irqs(dev))
> - __pci_write_msi_msg(entry, &entry->msg);
> -
> - pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> - pci_msi_update_mask(entry, 0, 0);
> - control &= ~PCI_MSI_FLAGS_QSIZE;
> - control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
> - pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> -}
> -
> -static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> -{
> - u16 ctrl;
> -
> - pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
> - ctrl &= ~clear;
> - ctrl |= set;
> - pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> -}
> -
> -void __pci_restore_msix_state(struct pci_dev *dev)
> -{
> - struct msi_desc *entry;
> - bool write_msg;
> -
> - if (!dev->msix_enabled)
> - return;
> -
> - /* route the table */
> - pci_intx_for_msi(dev, 0);
> - pci_msix_clear_and_set_ctrl(dev, 0,
> - PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
> -
> - write_msg = arch_restore_msi_irqs(dev);
> -
> - msi_lock_descs(&dev->dev);
> - msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> - if (write_msg)
> - __pci_write_msi_msg(entry, &entry->msg);
> - pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
> - }
> - msi_unlock_descs(&dev->dev);
> -
> - pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> -}
> -
> -static void pcim_msi_release(void *pcidev)
> -{
> - struct pci_dev *dev = pcidev;
> -
> - dev->is_msi_managed = false;
> - pci_free_irq_vectors(dev);
> -}
> -
> -/*
> - * Needs to be separate from pcim_release to prevent an ordering problem
> - * vs. msi_device_data_release() in the MSI core code.
> - */
> -static int pcim_setup_msi_release(struct pci_dev *dev)
> -{
> - int ret;
> -
> - if (!pci_is_managed(dev) || dev->is_msi_managed)
> - return 0;
> -
> - ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
> - if (!ret)
> - dev->is_msi_managed = true;
> - return ret;
> -}
> -
> -/*
> - * Ordering vs. devres: msi device data has to be installed first so that
> - * pcim_msi_release() is invoked before it on device release.
> - */
> -static int pci_setup_msi_context(struct pci_dev *dev)
> -{
> - int ret = msi_setup_device_data(&dev->dev);
> -
> - if (!ret)
> - ret = pcim_setup_msi_release(dev);
> - return ret;
> -}
> -
> static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
> struct irq_affinity_desc *masks)
> {
> @@ -415,6 +394,149 @@ static int msi_capability_init(struct pc
> return ret;
> }
>
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> + struct irq_affinity *affd)
> +{
> + int nvec;
> + int rc;
> +
> + if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
> + return -EINVAL;
> +
> + /* Check whether driver already requested MSI-X IRQs */
> + if (dev->msix_enabled) {
> + pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
> + return -EINVAL;
> + }
> +
> + if (maxvec < minvec)
> + return -ERANGE;
> +
> + if (WARN_ON_ONCE(dev->msi_enabled))
> + return -EINVAL;
> +
> + nvec = pci_msi_vec_count(dev);
> + if (nvec < 0)
> + return nvec;
> + if (nvec < minvec)
> + return -ENOSPC;
> +
> + if (nvec > maxvec)
> + nvec = maxvec;
> +
> + rc = pci_setup_msi_context(dev);
> + if (rc)
> + return rc;
> +
> + for (;;) {
> + if (affd) {
> + nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
> + if (nvec < minvec)
> + return -ENOSPC;
> + }
> +
> + rc = msi_capability_init(dev, nvec, affd);
> + if (rc == 0)
> + return nvec;
> +
> + if (rc < 0)
> + return rc;
> + if (rc < minvec)
> + return -ENOSPC;
> +
> + nvec = rc;
> + }
> +}
> +
> +/**
> + * pci_msi_vec_count - Return the number of MSI vectors a device can send
> + * @dev: device to report about
> + *
> + * This function returns the number of MSI vectors a device requested via
> + * Multiple Message Capable register. It returns a negative errno if the
> + * device is not capable sending MSI interrupts. Otherwise, the call succeeds
> + * and returns a power of two, up to a maximum of 2^5 (32), according to the
> + * MSI specification.
> + **/
> +int pci_msi_vec_count(struct pci_dev *dev)
> +{
> + int ret;
> + u16 msgctl;
> +
> + if (!dev->msi_cap)
> + return -EINVAL;
> +
> + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
> + ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL(pci_msi_vec_count);
> +
> +/*
> + * Architecture override returns true when the PCI MSI message should be
> + * written by the generic restore function.
> + */
> +bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> +{
> + return true;
> +}
> +
> +void __pci_restore_msi_state(struct pci_dev *dev)
> +{
> + struct msi_desc *entry;
> + u16 control;
> +
> + if (!dev->msi_enabled)
> + return;
> +
> + entry = irq_get_msi_desc(dev->irq);
> +
> + pci_intx_for_msi(dev, 0);
> + pci_msi_set_enable(dev, 0);
> + if (arch_restore_msi_irqs(dev))
> + __pci_write_msi_msg(entry, &entry->msg);
> +
> + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> + pci_msi_update_mask(entry, 0, 0);
> + control &= ~PCI_MSI_FLAGS_QSIZE;
> + control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
> + pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> +}
> +
> +void pci_msi_shutdown(struct pci_dev *dev)
> +{
> + struct msi_desc *desc;
> +
> + if (!pci_msi_enable || !dev || !dev->msi_enabled)
> + return;
> +
> + pci_msi_set_enable(dev, 0);
> + pci_intx_for_msi(dev, 1);
> + dev->msi_enabled = 0;
> +
> + /* Return the device with MSI unmasked as initial states */
> + desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
> + if (!WARN_ON_ONCE(!desc))
> + pci_msi_unmask(desc, msi_multi_mask(desc));
> +
> + /* Restore dev->irq to its default pin-assertion IRQ */
> + dev->irq = desc->pci.msi_attrib.default_irq;
> + pcibios_alloc_irq(dev);
> +}
> +
> +/* PCI/MSI-X specific functionality */
> +
> +static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> +{
> + u16 ctrl;
> +
> + pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
> + ctrl &= ~clear;
> + ctrl |= set;
> + pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> +}
> +
> static void __iomem *msix_map_region(struct pci_dev *dev,
> unsigned int nr_entries)
> {
> @@ -599,101 +721,6 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -/**
> - * pci_msi_supported - check whether MSI may be enabled on a device
> - * @dev: pointer to the pci_dev data structure of MSI device function
> - * @nvec: how many MSIs have been requested?
> - *
> - * Look at global flags, the device itself, and its parent buses
> - * to determine if MSI/-X are supported for the device. If MSI/-X is
> - * supported return 1, else return 0.
> - **/
> -static int pci_msi_supported(struct pci_dev *dev, int nvec)
> -{
> - struct pci_bus *bus;
> -
> - /* MSI must be globally enabled and supported by the device */
> - if (!pci_msi_enable)
> - return 0;
> -
> - if (!dev || dev->no_msi)
> - return 0;
> -
> - /*
> - * You can't ask to have 0 or less MSIs configured.
> - * a) it's stupid ..
> - * b) the list manipulation code assumes nvec >= 1.
> - */
> - if (nvec < 1)
> - return 0;
> -
> - /*
> - * Any bridge which does NOT route MSI transactions from its
> - * secondary bus to its primary bus must set NO_MSI flag on
> - * the secondary pci_bus.
> - *
> - * The NO_MSI flag can either be set directly by:
> - * - arch-specific PCI host bus controller drivers (deprecated)
> - * - quirks for specific PCI bridges
> - *
> - * or indirectly by platform-specific PCI host bridge drivers by
> - * advertising the 'msi_domain' property, which results in
> - * the NO_MSI flag when no MSI domain is found for this bridge
> - * at probe time.
> - */
> - for (bus = dev->bus; bus; bus = bus->parent)
> - if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
> - return 0;
> -
> - return 1;
> -}
> -
> -/**
> - * pci_msi_vec_count - Return the number of MSI vectors a device can send
> - * @dev: device to report about
> - *
> - * This function returns the number of MSI vectors a device requested via
> - * Multiple Message Capable register. It returns a negative errno if the
> - * device is not capable sending MSI interrupts. Otherwise, the call succeeds
> - * and returns a power of two, up to a maximum of 2^5 (32), according to the
> - * MSI specification.
> - **/
> -int pci_msi_vec_count(struct pci_dev *dev)
> -{
> - int ret;
> - u16 msgctl;
> -
> - if (!dev->msi_cap)
> - return -EINVAL;
> -
> - pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
> - ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
> -
> - return ret;
> -}
> -EXPORT_SYMBOL(pci_msi_vec_count);
> -
> -void pci_msi_shutdown(struct pci_dev *dev)
> -{
> - struct msi_desc *desc;
> -
> - if (!pci_msi_enable || !dev || !dev->msi_enabled)
> - return;
> -
> - pci_msi_set_enable(dev, 0);
> - pci_intx_for_msi(dev, 1);
> - dev->msi_enabled = 0;
> -
> - /* Return the device with MSI unmasked as initial states */
> - desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
> - if (!WARN_ON_ONCE(!desc))
> - pci_msi_unmask(desc, msi_multi_mask(desc));
> -
> - /* Restore dev->irq to its default pin-assertion IRQ */
> - dev->irq = desc->pci.msi_attrib.default_irq;
> - pcibios_alloc_irq(dev);
> -}
> -
> static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> int nvec, struct irq_affinity *affd, int flags)
> {
> @@ -729,57 +756,23 @@ static int __pci_enable_msix(struct pci_
> return msix_capability_init(dev, entries, nvec, affd);
> }
>
> -void pci_msix_shutdown(struct pci_dev *dev)
> -{
> - struct msi_desc *desc;
> -
> - if (!pci_msi_enable || !dev || !dev->msix_enabled)
> - return;
> -
> - if (pci_dev_is_disconnected(dev)) {
> - dev->msix_enabled = 0;
> - return;
> - }
> -
> - /* Return the device with MSI-X masked as initial states */
> - msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
> - pci_msix_mask(desc);
> -
> - pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
> - pci_intx_for_msi(dev, 1);
> - dev->msix_enabled = 0;
> - pcibios_alloc_irq(dev);
> -}
> -
> -int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> - struct irq_affinity *affd)
> +int __pci_enable_msix_range(struct pci_dev *dev,
> + struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd,
> + int flags)
> {
> - int nvec;
> - int rc;
> -
> - if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
> - return -EINVAL;
> -
> - /* Check whether driver already requested MSI-X IRQs */
> - if (dev->msix_enabled) {
> - pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
> - return -EINVAL;
> - }
> + int rc, nvec = maxvec;
>
> if (maxvec < minvec)
> return -ERANGE;
>
> - if (WARN_ON_ONCE(dev->msi_enabled))
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> return -EINVAL;
> + }
>
> - nvec = pci_msi_vec_count(dev);
> - if (nvec < 0)
> - return nvec;
> - if (nvec < minvec)
> - return -ENOSPC;
> -
> - if (nvec > maxvec)
> - nvec = maxvec;
> + if (WARN_ON_ONCE(dev->msix_enabled))
> + return -EINVAL;
>
> rc = pci_setup_msi_context(dev);
> if (rc)
> @@ -792,7 +785,7 @@ int __pci_enable_msi_range(struct pci_de
> return -ENOSPC;
> }
>
> - rc = msi_capability_init(dev, nvec, affd);
> + rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> if (rc == 0)
> return nvec;
>
> @@ -805,48 +798,68 @@ int __pci_enable_msi_range(struct pci_de
> }
> }
>
> -int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +void __pci_restore_msix_state(struct pci_dev *dev)
> {
> - int rc, nvec = maxvec;
> + struct msi_desc *entry;
> + bool write_msg;
>
> - if (maxvec < minvec)
> - return -ERANGE;
> + if (!dev->msix_enabled)
> + return;
>
> - if (dev->msi_enabled) {
> - pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> - return -EINVAL;
> + /* route the table */
> + pci_intx_for_msi(dev, 0);
> + pci_msix_clear_and_set_ctrl(dev, 0,
> + PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
> +
> + write_msg = arch_restore_msi_irqs(dev);
> +
> + msi_lock_descs(&dev->dev);
> + msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> + if (write_msg)
> + __pci_write_msi_msg(entry, &entry->msg);
> + pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
> }
> + msi_unlock_descs(&dev->dev);
>
> - if (WARN_ON_ONCE(dev->msix_enabled))
> - return -EINVAL;
> + pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> +}
>
> - rc = pci_setup_msi_context(dev);
> - if (rc)
> - return rc;
> +void pci_msix_shutdown(struct pci_dev *dev)
> +{
> + struct msi_desc *desc;
>
> - for (;;) {
> - if (affd) {
> - nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
> - if (nvec < minvec)
> - return -ENOSPC;
> - }
> + if (!pci_msi_enable || !dev || !dev->msix_enabled)
> + return;
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> - if (rc == 0)
> - return nvec;
> + if (pci_dev_is_disconnected(dev)) {
> + dev->msix_enabled = 0;
> + return;
> + }
>
> - if (rc < 0)
> - return rc;
> - if (rc < minvec)
> - return -ENOSPC;
> + /* Return the device with MSI-X masked as initial states */
> + msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
> + pci_msix_mask(desc);
>
> - nvec = rc;
> + pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
> + pci_intx_for_msi(dev, 1);
> + dev->msix_enabled = 0;
> + pcibios_alloc_irq(dev);
> +}
> +
> +/* Common interfaces */
> +
> +void pci_free_msi_irqs(struct pci_dev *dev)
> +{
> + pci_msi_teardown_msi_irqs(dev);
> +
> + if (dev->msix_base) {
> + iounmap(dev->msix_base);
> + dev->msix_base = NULL;
> }
> }
>
> +/* Misc. infrastructure */
> +
> struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
> {
> return to_pci_dev(desc->dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 32/39] PCI/MSI: Reorder functions in msi.c
@ 2022-11-16 16:28 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:28 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Fri, Nov 11, 2022 at 02:55:06PM +0100, Thomas Gleixner wrote:
> From: Ahmed S. Darwish <darwi@linutronix.de>
>
> There is no way to navigate msi.c without banging the head against the wall
> every now and then because MSI and MSI-X specific functions are
> intermingled and the code flow is completely non-obvious.
>
> Reorder everthing so common helpers, MSI and MSI-X specific functions are
> grouped together.
s/everthing/everything/
> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
I assume this is pure code movement, so I didn't even look at the
text below.
> ---
> drivers/pci/msi/msi.c | 577 +++++++++++++++++++++++++-------------------------
> 1 file changed, 295 insertions(+), 282 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -16,6 +16,97 @@
> int pci_msi_enable = 1;
> int pci_msi_ignore_mask;
>
> +/**
> + * pci_msi_supported - check whether MSI may be enabled on a device
> + * @dev: pointer to the pci_dev data structure of MSI device function
> + * @nvec: how many MSIs have been requested?
> + *
> + * Look at global flags, the device itself, and its parent buses
> + * to determine if MSI/-X are supported for the device. If MSI/-X is
> + * supported return 1, else return 0.
> + **/
> +static int pci_msi_supported(struct pci_dev *dev, int nvec)
> +{
> + struct pci_bus *bus;
> +
> + /* MSI must be globally enabled and supported by the device */
> + if (!pci_msi_enable)
> + return 0;
> +
> + if (!dev || dev->no_msi)
> + return 0;
> +
> + /*
> + * You can't ask to have 0 or less MSIs configured.
> + * a) it's stupid ..
> + * b) the list manipulation code assumes nvec >= 1.
> + */
> + if (nvec < 1)
> + return 0;
> +
> + /*
> + * Any bridge which does NOT route MSI transactions from its
> + * secondary bus to its primary bus must set NO_MSI flag on
> + * the secondary pci_bus.
> + *
> + * The NO_MSI flag can either be set directly by:
> + * - arch-specific PCI host bus controller drivers (deprecated)
> + * - quirks for specific PCI bridges
> + *
> + * or indirectly by platform-specific PCI host bridge drivers by
> + * advertising the 'msi_domain' property, which results in
> + * the NO_MSI flag when no MSI domain is found for this bridge
> + * at probe time.
> + */
> + for (bus = dev->bus; bus; bus = bus->parent)
> + if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
> + return 0;
> +
> + return 1;
> +}
> +
> +static void pcim_msi_release(void *pcidev)
> +{
> + struct pci_dev *dev = pcidev;
> +
> + dev->is_msi_managed = false;
> + pci_free_irq_vectors(dev);
> +}
> +
> +/*
> + * Needs to be separate from pcim_release to prevent an ordering problem
> + * vs. msi_device_data_release() in the MSI core code.
> + */
> +static int pcim_setup_msi_release(struct pci_dev *dev)
> +{
> + int ret;
> +
> + if (!pci_is_managed(dev) || dev->is_msi_managed)
> + return 0;
> +
> + ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
> + if (!ret)
> + dev->is_msi_managed = true;
> + return ret;
> +}
> +
> +/*
> + * Ordering vs. devres: msi device data has to be installed first so that
> + * pcim_msi_release() is invoked before it on device release.
> + */
> +static int pci_setup_msi_context(struct pci_dev *dev)
> +{
> + int ret = msi_setup_device_data(&dev->dev);
> +
> + if (!ret)
> + ret = pcim_setup_msi_release(dev);
> + return ret;
> +}
> +
> +/*
> + * Helper functions for mask/unmask and MSI message handling
> + */
> +
> void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
> {
> raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
> @@ -163,15 +254,8 @@ void pci_write_msi_msg(unsigned int irq,
> }
> EXPORT_SYMBOL_GPL(pci_write_msi_msg);
>
> -void pci_free_msi_irqs(struct pci_dev *dev)
> -{
> - pci_msi_teardown_msi_irqs(dev);
>
> - if (dev->msix_base) {
> - iounmap(dev->msix_base);
> - dev->msix_base = NULL;
> - }
> -}
> +/* PCI/MSI specific functionality */
>
> static void pci_intx_for_msi(struct pci_dev *dev, int enable)
> {
> @@ -190,111 +274,6 @@ static void pci_msi_set_enable(struct pc
> pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> }
>
> -/*
> - * Architecture override returns true when the PCI MSI message should be
> - * written by the generic restore function.
> - */
> -bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> -{
> - return true;
> -}
> -
> -void __pci_restore_msi_state(struct pci_dev *dev)
> -{
> - struct msi_desc *entry;
> - u16 control;
> -
> - if (!dev->msi_enabled)
> - return;
> -
> - entry = irq_get_msi_desc(dev->irq);
> -
> - pci_intx_for_msi(dev, 0);
> - pci_msi_set_enable(dev, 0);
> - if (arch_restore_msi_irqs(dev))
> - __pci_write_msi_msg(entry, &entry->msg);
> -
> - pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> - pci_msi_update_mask(entry, 0, 0);
> - control &= ~PCI_MSI_FLAGS_QSIZE;
> - control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
> - pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> -}
> -
> -static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> -{
> - u16 ctrl;
> -
> - pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
> - ctrl &= ~clear;
> - ctrl |= set;
> - pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> -}
> -
> -void __pci_restore_msix_state(struct pci_dev *dev)
> -{
> - struct msi_desc *entry;
> - bool write_msg;
> -
> - if (!dev->msix_enabled)
> - return;
> -
> - /* route the table */
> - pci_intx_for_msi(dev, 0);
> - pci_msix_clear_and_set_ctrl(dev, 0,
> - PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
> -
> - write_msg = arch_restore_msi_irqs(dev);
> -
> - msi_lock_descs(&dev->dev);
> - msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> - if (write_msg)
> - __pci_write_msi_msg(entry, &entry->msg);
> - pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
> - }
> - msi_unlock_descs(&dev->dev);
> -
> - pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> -}
> -
> -static void pcim_msi_release(void *pcidev)
> -{
> - struct pci_dev *dev = pcidev;
> -
> - dev->is_msi_managed = false;
> - pci_free_irq_vectors(dev);
> -}
> -
> -/*
> - * Needs to be separate from pcim_release to prevent an ordering problem
> - * vs. msi_device_data_release() in the MSI core code.
> - */
> -static int pcim_setup_msi_release(struct pci_dev *dev)
> -{
> - int ret;
> -
> - if (!pci_is_managed(dev) || dev->is_msi_managed)
> - return 0;
> -
> - ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
> - if (!ret)
> - dev->is_msi_managed = true;
> - return ret;
> -}
> -
> -/*
> - * Ordering vs. devres: msi device data has to be installed first so that
> - * pcim_msi_release() is invoked before it on device release.
> - */
> -static int pci_setup_msi_context(struct pci_dev *dev)
> -{
> - int ret = msi_setup_device_data(&dev->dev);
> -
> - if (!ret)
> - ret = pcim_setup_msi_release(dev);
> - return ret;
> -}
> -
> static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
> struct irq_affinity_desc *masks)
> {
> @@ -415,6 +394,149 @@ static int msi_capability_init(struct pc
> return ret;
> }
>
> +int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> + struct irq_affinity *affd)
> +{
> + int nvec;
> + int rc;
> +
> + if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
> + return -EINVAL;
> +
> + /* Check whether driver already requested MSI-X IRQs */
> + if (dev->msix_enabled) {
> + pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
> + return -EINVAL;
> + }
> +
> + if (maxvec < minvec)
> + return -ERANGE;
> +
> + if (WARN_ON_ONCE(dev->msi_enabled))
> + return -EINVAL;
> +
> + nvec = pci_msi_vec_count(dev);
> + if (nvec < 0)
> + return nvec;
> + if (nvec < minvec)
> + return -ENOSPC;
> +
> + if (nvec > maxvec)
> + nvec = maxvec;
> +
> + rc = pci_setup_msi_context(dev);
> + if (rc)
> + return rc;
> +
> + for (;;) {
> + if (affd) {
> + nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
> + if (nvec < minvec)
> + return -ENOSPC;
> + }
> +
> + rc = msi_capability_init(dev, nvec, affd);
> + if (rc == 0)
> + return nvec;
> +
> + if (rc < 0)
> + return rc;
> + if (rc < minvec)
> + return -ENOSPC;
> +
> + nvec = rc;
> + }
> +}
> +
> +/**
> + * pci_msi_vec_count - Return the number of MSI vectors a device can send
> + * @dev: device to report about
> + *
> + * This function returns the number of MSI vectors a device requested via
> + * Multiple Message Capable register. It returns a negative errno if the
> + * device is not capable sending MSI interrupts. Otherwise, the call succeeds
> + * and returns a power of two, up to a maximum of 2^5 (32), according to the
> + * MSI specification.
> + **/
> +int pci_msi_vec_count(struct pci_dev *dev)
> +{
> + int ret;
> + u16 msgctl;
> +
> + if (!dev->msi_cap)
> + return -EINVAL;
> +
> + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
> + ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL(pci_msi_vec_count);
> +
> +/*
> + * Architecture override returns true when the PCI MSI message should be
> + * written by the generic restore function.
> + */
> +bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
> +{
> + return true;
> +}
> +
> +void __pci_restore_msi_state(struct pci_dev *dev)
> +{
> + struct msi_desc *entry;
> + u16 control;
> +
> + if (!dev->msi_enabled)
> + return;
> +
> + entry = irq_get_msi_desc(dev->irq);
> +
> + pci_intx_for_msi(dev, 0);
> + pci_msi_set_enable(dev, 0);
> + if (arch_restore_msi_irqs(dev))
> + __pci_write_msi_msg(entry, &entry->msg);
> +
> + pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
> + pci_msi_update_mask(entry, 0, 0);
> + control &= ~PCI_MSI_FLAGS_QSIZE;
> + control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
> + pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
> +}
> +
> +void pci_msi_shutdown(struct pci_dev *dev)
> +{
> + struct msi_desc *desc;
> +
> + if (!pci_msi_enable || !dev || !dev->msi_enabled)
> + return;
> +
> + pci_msi_set_enable(dev, 0);
> + pci_intx_for_msi(dev, 1);
> + dev->msi_enabled = 0;
> +
> + /* Return the device with MSI unmasked as initial states */
> + desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
> + if (!WARN_ON_ONCE(!desc))
> + pci_msi_unmask(desc, msi_multi_mask(desc));
> +
> + /* Restore dev->irq to its default pin-assertion IRQ */
> + dev->irq = desc->pci.msi_attrib.default_irq;
> + pcibios_alloc_irq(dev);
> +}
> +
> +/* PCI/MSI-X specific functionality */
> +
> +static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
> +{
> + u16 ctrl;
> +
> + pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
> + ctrl &= ~clear;
> + ctrl |= set;
> + pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
> +}
> +
> static void __iomem *msix_map_region(struct pci_dev *dev,
> unsigned int nr_entries)
> {
> @@ -599,101 +721,6 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -/**
> - * pci_msi_supported - check whether MSI may be enabled on a device
> - * @dev: pointer to the pci_dev data structure of MSI device function
> - * @nvec: how many MSIs have been requested?
> - *
> - * Look at global flags, the device itself, and its parent buses
> - * to determine if MSI/-X are supported for the device. If MSI/-X is
> - * supported return 1, else return 0.
> - **/
> -static int pci_msi_supported(struct pci_dev *dev, int nvec)
> -{
> - struct pci_bus *bus;
> -
> - /* MSI must be globally enabled and supported by the device */
> - if (!pci_msi_enable)
> - return 0;
> -
> - if (!dev || dev->no_msi)
> - return 0;
> -
> - /*
> - * You can't ask to have 0 or less MSIs configured.
> - * a) it's stupid ..
> - * b) the list manipulation code assumes nvec >= 1.
> - */
> - if (nvec < 1)
> - return 0;
> -
> - /*
> - * Any bridge which does NOT route MSI transactions from its
> - * secondary bus to its primary bus must set NO_MSI flag on
> - * the secondary pci_bus.
> - *
> - * The NO_MSI flag can either be set directly by:
> - * - arch-specific PCI host bus controller drivers (deprecated)
> - * - quirks for specific PCI bridges
> - *
> - * or indirectly by platform-specific PCI host bridge drivers by
> - * advertising the 'msi_domain' property, which results in
> - * the NO_MSI flag when no MSI domain is found for this bridge
> - * at probe time.
> - */
> - for (bus = dev->bus; bus; bus = bus->parent)
> - if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
> - return 0;
> -
> - return 1;
> -}
> -
> -/**
> - * pci_msi_vec_count - Return the number of MSI vectors a device can send
> - * @dev: device to report about
> - *
> - * This function returns the number of MSI vectors a device requested via
> - * Multiple Message Capable register. It returns a negative errno if the
> - * device is not capable sending MSI interrupts. Otherwise, the call succeeds
> - * and returns a power of two, up to a maximum of 2^5 (32), according to the
> - * MSI specification.
> - **/
> -int pci_msi_vec_count(struct pci_dev *dev)
> -{
> - int ret;
> - u16 msgctl;
> -
> - if (!dev->msi_cap)
> - return -EINVAL;
> -
> - pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
> - ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
> -
> - return ret;
> -}
> -EXPORT_SYMBOL(pci_msi_vec_count);
> -
> -void pci_msi_shutdown(struct pci_dev *dev)
> -{
> - struct msi_desc *desc;
> -
> - if (!pci_msi_enable || !dev || !dev->msi_enabled)
> - return;
> -
> - pci_msi_set_enable(dev, 0);
> - pci_intx_for_msi(dev, 1);
> - dev->msi_enabled = 0;
> -
> - /* Return the device with MSI unmasked as initial states */
> - desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
> - if (!WARN_ON_ONCE(!desc))
> - pci_msi_unmask(desc, msi_multi_mask(desc));
> -
> - /* Restore dev->irq to its default pin-assertion IRQ */
> - dev->irq = desc->pci.msi_attrib.default_irq;
> - pcibios_alloc_irq(dev);
> -}
> -
> static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> int nvec, struct irq_affinity *affd, int flags)
> {
> @@ -729,57 +756,23 @@ static int __pci_enable_msix(struct pci_
> return msix_capability_init(dev, entries, nvec, affd);
> }
>
> -void pci_msix_shutdown(struct pci_dev *dev)
> -{
> - struct msi_desc *desc;
> -
> - if (!pci_msi_enable || !dev || !dev->msix_enabled)
> - return;
> -
> - if (pci_dev_is_disconnected(dev)) {
> - dev->msix_enabled = 0;
> - return;
> - }
> -
> - /* Return the device with MSI-X masked as initial states */
> - msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
> - pci_msix_mask(desc);
> -
> - pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
> - pci_intx_for_msi(dev, 1);
> - dev->msix_enabled = 0;
> - pcibios_alloc_irq(dev);
> -}
> -
> -int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
> - struct irq_affinity *affd)
> +int __pci_enable_msix_range(struct pci_dev *dev,
> + struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd,
> + int flags)
> {
> - int nvec;
> - int rc;
> -
> - if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
> - return -EINVAL;
> -
> - /* Check whether driver already requested MSI-X IRQs */
> - if (dev->msix_enabled) {
> - pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
> - return -EINVAL;
> - }
> + int rc, nvec = maxvec;
>
> if (maxvec < minvec)
> return -ERANGE;
>
> - if (WARN_ON_ONCE(dev->msi_enabled))
> + if (dev->msi_enabled) {
> + pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> return -EINVAL;
> + }
>
> - nvec = pci_msi_vec_count(dev);
> - if (nvec < 0)
> - return nvec;
> - if (nvec < minvec)
> - return -ENOSPC;
> -
> - if (nvec > maxvec)
> - nvec = maxvec;
> + if (WARN_ON_ONCE(dev->msix_enabled))
> + return -EINVAL;
>
> rc = pci_setup_msi_context(dev);
> if (rc)
> @@ -792,7 +785,7 @@ int __pci_enable_msi_range(struct pci_de
> return -ENOSPC;
> }
>
> - rc = msi_capability_init(dev, nvec, affd);
> + rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> if (rc == 0)
> return nvec;
>
> @@ -805,48 +798,68 @@ int __pci_enable_msi_range(struct pci_de
> }
> }
>
> -int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +void __pci_restore_msix_state(struct pci_dev *dev)
> {
> - int rc, nvec = maxvec;
> + struct msi_desc *entry;
> + bool write_msg;
>
> - if (maxvec < minvec)
> - return -ERANGE;
> + if (!dev->msix_enabled)
> + return;
>
> - if (dev->msi_enabled) {
> - pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
> - return -EINVAL;
> + /* route the table */
> + pci_intx_for_msi(dev, 0);
> + pci_msix_clear_and_set_ctrl(dev, 0,
> + PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
> +
> + write_msg = arch_restore_msi_irqs(dev);
> +
> + msi_lock_descs(&dev->dev);
> + msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
> + if (write_msg)
> + __pci_write_msi_msg(entry, &entry->msg);
> + pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
> }
> + msi_unlock_descs(&dev->dev);
>
> - if (WARN_ON_ONCE(dev->msix_enabled))
> - return -EINVAL;
> + pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
> +}
>
> - rc = pci_setup_msi_context(dev);
> - if (rc)
> - return rc;
> +void pci_msix_shutdown(struct pci_dev *dev)
> +{
> + struct msi_desc *desc;
>
> - for (;;) {
> - if (affd) {
> - nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
> - if (nvec < minvec)
> - return -ENOSPC;
> - }
> + if (!pci_msi_enable || !dev || !dev->msix_enabled)
> + return;
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> - if (rc == 0)
> - return nvec;
> + if (pci_dev_is_disconnected(dev)) {
> + dev->msix_enabled = 0;
> + return;
> + }
>
> - if (rc < 0)
> - return rc;
> - if (rc < minvec)
> - return -ENOSPC;
> + /* Return the device with MSI-X masked as initial states */
> + msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
> + pci_msix_mask(desc);
>
> - nvec = rc;
> + pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
> + pci_intx_for_msi(dev, 1);
> + dev->msix_enabled = 0;
> + pcibios_alloc_irq(dev);
> +}
> +
> +/* Common interfaces */
> +
> +void pci_free_msi_irqs(struct pci_dev *dev)
> +{
> + pci_msi_teardown_msi_irqs(dev);
> +
> + if (dev->msix_base) {
> + iounmap(dev->msix_base);
> + dev->msix_base = NULL;
> }
> }
>
> +/* Misc. infrastructure */
> +
> struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
> {
> return to_pci_dev(desc->dev);
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 32/39] PCI/MSI: Reorder functions in msi.c
2022-11-16 16:28 ` Bjorn Helgaas
@ 2022-11-16 17:10 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:10 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Ahmed S. Darwish, Reinette Chatre, Michael Ellerman,
Christophe Leroy, linuxppc-dev
On Wed, Nov 16 2022 at 10:28, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:55:06PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> There is no way to navigate msi.c without banging the head against the wall
>> every now and then because MSI and MSI-X specific functions are
>> intermingled and the code flow is completely non-obvious.
>>
>> Reorder everthing so common helpers, MSI and MSI-X specific functions are
>> grouped together.
>
> s/everthing/everything/
>
>> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
>> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> I assume this is pure code movement, so I didn't even look at the
> text below.
It is.
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 32/39] PCI/MSI: Reorder functions in msi.c
@ 2022-11-16 17:10 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-16 17:10 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:28, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:55:06PM +0100, Thomas Gleixner wrote:
>> From: Ahmed S. Darwish <darwi@linutronix.de>
>>
>> There is no way to navigate msi.c without banging the head against the wall
>> every now and then because MSI and MSI-X specific functions are
>> intermingled and the code flow is completely non-obvious.
>>
>> Reorder everthing so common helpers, MSI and MSI-X specific functions are
>> grouped together.
>
> s/everthing/everything/
>
>> Suggested-by: Thomas Gleixner <tglx@linutronix.de>
>> Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
>> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>
> I assume this is pure code movement, so I didn't even look at the
> text below.
It is.
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Reorder functions in msi.c
2022-11-11 13:55 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Ahmed S. Darwish
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Ahmed S. Darwish @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Ahmed S. Darwish, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 12910ffd189e23d8996e0d19b723518accf57b76
Gitweb: https://git.kernel.org/tip/12910ffd189e23d8996e0d19b723518accf57b76
Author: Ahmed S. Darwish <darwi@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:06 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:21 +01:00
PCI/MSI: Reorder functions in msi.c
There is no way to navigate msi.c without banging the head against the wall
every now and then because MSI and MSI-X specific functions are
intermingled and the code flow is completely non-obvious.
Reorder everthing so common helpers, MSI and MSI-X specific functions are
grouped together.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ahmed S. Darwish <darwi@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.459089736@linutronix.de
---
drivers/pci/msi/msi.c | 639 ++++++++++++++++++++---------------------
1 file changed, 326 insertions(+), 313 deletions(-)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index a5d168c..380e651 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -16,6 +16,97 @@
int pci_msi_enable = 1;
int pci_msi_ignore_mask;
+/**
+ * pci_msi_supported - check whether MSI may be enabled on a device
+ * @dev: pointer to the pci_dev data structure of MSI device function
+ * @nvec: how many MSIs have been requested?
+ *
+ * Look at global flags, the device itself, and its parent buses
+ * to determine if MSI/-X are supported for the device. If MSI/-X is
+ * supported return 1, else return 0.
+ **/
+static int pci_msi_supported(struct pci_dev *dev, int nvec)
+{
+ struct pci_bus *bus;
+
+ /* MSI must be globally enabled and supported by the device */
+ if (!pci_msi_enable)
+ return 0;
+
+ if (!dev || dev->no_msi)
+ return 0;
+
+ /*
+ * You can't ask to have 0 or less MSIs configured.
+ * a) it's stupid ..
+ * b) the list manipulation code assumes nvec >= 1.
+ */
+ if (nvec < 1)
+ return 0;
+
+ /*
+ * Any bridge which does NOT route MSI transactions from its
+ * secondary bus to its primary bus must set NO_MSI flag on
+ * the secondary pci_bus.
+ *
+ * The NO_MSI flag can either be set directly by:
+ * - arch-specific PCI host bus controller drivers (deprecated)
+ * - quirks for specific PCI bridges
+ *
+ * or indirectly by platform-specific PCI host bridge drivers by
+ * advertising the 'msi_domain' property, which results in
+ * the NO_MSI flag when no MSI domain is found for this bridge
+ * at probe time.
+ */
+ for (bus = dev->bus; bus; bus = bus->parent)
+ if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+ return 0;
+
+ return 1;
+}
+
+static void pcim_msi_release(void *pcidev)
+{
+ struct pci_dev *dev = pcidev;
+
+ dev->is_msi_managed = false;
+ pci_free_irq_vectors(dev);
+}
+
+/*
+ * Needs to be separate from pcim_release to prevent an ordering problem
+ * vs. msi_device_data_release() in the MSI core code.
+ */
+static int pcim_setup_msi_release(struct pci_dev *dev)
+{
+ int ret;
+
+ if (!pci_is_managed(dev) || dev->is_msi_managed)
+ return 0;
+
+ ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
+ if (!ret)
+ dev->is_msi_managed = true;
+ return ret;
+}
+
+/*
+ * Ordering vs. devres: msi device data has to be installed first so that
+ * pcim_msi_release() is invoked before it on device release.
+ */
+static int pci_setup_msi_context(struct pci_dev *dev)
+{
+ int ret = msi_setup_device_data(&dev->dev);
+
+ if (!ret)
+ ret = pcim_setup_msi_release(dev);
+ return ret;
+}
+
+/*
+ * Helper functions for mask/unmask and MSI message handling
+ */
+
void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set)
{
raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock;
@@ -163,15 +254,8 @@ void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
}
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
-void pci_free_msi_irqs(struct pci_dev *dev)
-{
- pci_msi_teardown_msi_irqs(dev);
- if (dev->msix_base) {
- iounmap(dev->msix_base);
- dev->msix_base = NULL;
- }
-}
+/* PCI/MSI specific functionality */
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
@@ -190,111 +274,6 @@ static void pci_msi_set_enable(struct pci_dev *dev, int enable)
pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
}
-/*
- * Architecture override returns true when the PCI MSI message should be
- * written by the generic restore function.
- */
-bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
-{
- return true;
-}
-
-void __pci_restore_msi_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- u16 control;
-
- if (!dev->msi_enabled)
- return;
-
- entry = irq_get_msi_desc(dev->irq);
-
- pci_intx_for_msi(dev, 0);
- pci_msi_set_enable(dev, 0);
- if (arch_restore_msi_irqs(dev))
- __pci_write_msi_msg(entry, &entry->msg);
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
- pci_msi_update_mask(entry, 0, 0);
- control &= ~PCI_MSI_FLAGS_QSIZE;
- control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
- pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
-}
-
-static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
-{
- u16 ctrl;
-
- pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
- ctrl &= ~clear;
- ctrl |= set;
- pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
-}
-
-void __pci_restore_msix_state(struct pci_dev *dev)
-{
- struct msi_desc *entry;
- bool write_msg;
-
- if (!dev->msix_enabled)
- return;
-
- /* route the table */
- pci_intx_for_msi(dev, 0);
- pci_msix_clear_and_set_ctrl(dev, 0,
- PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
-
- write_msg = arch_restore_msi_irqs(dev);
-
- msi_lock_descs(&dev->dev);
- msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
- if (write_msg)
- __pci_write_msi_msg(entry, &entry->msg);
- pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
- }
- msi_unlock_descs(&dev->dev);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
-}
-
-static void pcim_msi_release(void *pcidev)
-{
- struct pci_dev *dev = pcidev;
-
- dev->is_msi_managed = false;
- pci_free_irq_vectors(dev);
-}
-
-/*
- * Needs to be separate from pcim_release to prevent an ordering problem
- * vs. msi_device_data_release() in the MSI core code.
- */
-static int pcim_setup_msi_release(struct pci_dev *dev)
-{
- int ret;
-
- if (!pci_is_managed(dev) || dev->is_msi_managed)
- return 0;
-
- ret = devm_add_action(&dev->dev, pcim_msi_release, dev);
- if (!ret)
- dev->is_msi_managed = true;
- return ret;
-}
-
-/*
- * Ordering vs. devres: msi device data has to be installed first so that
- * pcim_msi_release() is invoked before it on device release.
- */
-static int pci_setup_msi_context(struct pci_dev *dev)
-{
- int ret = msi_setup_device_data(&dev->dev);
-
- if (!ret)
- ret = pcim_setup_msi_release(dev);
- return ret;
-}
-
static int msi_setup_msi_desc(struct pci_dev *dev, int nvec,
struct irq_affinity_desc *masks)
{
@@ -415,45 +394,188 @@ unlock:
return ret;
}
-static void __iomem *msix_map_region(struct pci_dev *dev,
- unsigned int nr_entries)
+int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
+ struct irq_affinity *affd)
{
- resource_size_t phys_addr;
- u32 table_offset;
- unsigned long flags;
- u8 bir;
+ int nvec;
+ int rc;
- pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE,
- &table_offset);
- bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
- flags = pci_resource_flags(dev, bir);
- if (!flags || (flags & IORESOURCE_UNSET))
- return NULL;
+ if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
- table_offset &= PCI_MSIX_TABLE_OFFSET;
- phys_addr = pci_resource_start(dev, bir) + table_offset;
+ /* Check whether driver already requested MSI-X IRQs */
+ if (dev->msix_enabled) {
+ pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
+ return -EINVAL;
+ }
- return ioremap(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
-}
+ if (maxvec < minvec)
+ return -ERANGE;
-static int msix_setup_msi_descs(struct pci_dev *dev, void __iomem *base,
- struct msix_entry *entries, int nvec,
- struct irq_affinity_desc *masks)
-{
- int ret = 0, i, vec_count = pci_msix_vec_count(dev);
- struct irq_affinity_desc *curmsk;
- struct msi_desc desc;
- void __iomem *addr;
+ if (WARN_ON_ONCE(dev->msi_enabled))
+ return -EINVAL;
- memset(&desc, 0, sizeof(desc));
+ nvec = pci_msi_vec_count(dev);
+ if (nvec < 0)
+ return nvec;
+ if (nvec < minvec)
+ return -ENOSPC;
- desc.nvec_used = 1;
- desc.pci.msi_attrib.is_msix = 1;
- desc.pci.msi_attrib.is_64 = 1;
- desc.pci.msi_attrib.default_irq = dev->irq;
- desc.pci.mask_base = base;
+ if (nvec > maxvec)
+ nvec = maxvec;
- for (i = 0, curmsk = masks; i < nvec; i++, curmsk++) {
+ rc = pci_setup_msi_context(dev);
+ if (rc)
+ return rc;
+
+ for (;;) {
+ if (affd) {
+ nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
+ if (nvec < minvec)
+ return -ENOSPC;
+ }
+
+ rc = msi_capability_init(dev, nvec, affd);
+ if (rc == 0)
+ return nvec;
+
+ if (rc < 0)
+ return rc;
+ if (rc < minvec)
+ return -ENOSPC;
+
+ nvec = rc;
+ }
+}
+
+/**
+ * pci_msi_vec_count - Return the number of MSI vectors a device can send
+ * @dev: device to report about
+ *
+ * This function returns the number of MSI vectors a device requested via
+ * Multiple Message Capable register. It returns a negative errno if the
+ * device is not capable sending MSI interrupts. Otherwise, the call succeeds
+ * and returns a power of two, up to a maximum of 2^5 (32), according to the
+ * MSI specification.
+ **/
+int pci_msi_vec_count(struct pci_dev *dev)
+{
+ int ret;
+ u16 msgctl;
+
+ if (!dev->msi_cap)
+ return -EINVAL;
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
+ ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
+
+ return ret;
+}
+EXPORT_SYMBOL(pci_msi_vec_count);
+
+/*
+ * Architecture override returns true when the PCI MSI message should be
+ * written by the generic restore function.
+ */
+bool __weak arch_restore_msi_irqs(struct pci_dev *dev)
+{
+ return true;
+}
+
+void __pci_restore_msi_state(struct pci_dev *dev)
+{
+ struct msi_desc *entry;
+ u16 control;
+
+ if (!dev->msi_enabled)
+ return;
+
+ entry = irq_get_msi_desc(dev->irq);
+
+ pci_intx_for_msi(dev, 0);
+ pci_msi_set_enable(dev, 0);
+ if (arch_restore_msi_irqs(dev))
+ __pci_write_msi_msg(entry, &entry->msg);
+
+ pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
+ pci_msi_update_mask(entry, 0, 0);
+ control &= ~PCI_MSI_FLAGS_QSIZE;
+ control |= (entry->pci.msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
+ pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
+}
+
+void pci_msi_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
+
+ if (!pci_msi_enable || !dev || !dev->msi_enabled)
+ return;
+
+ pci_msi_set_enable(dev, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msi_enabled = 0;
+
+ /* Return the device with MSI unmasked as initial states */
+ desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
+ if (!WARN_ON_ONCE(!desc))
+ pci_msi_unmask(desc, msi_multi_mask(desc));
+
+ /* Restore dev->irq to its default pin-assertion IRQ */
+ dev->irq = desc->pci.msi_attrib.default_irq;
+ pcibios_alloc_irq(dev);
+}
+
+/* PCI/MSI-X specific functionality */
+
+static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
+{
+ u16 ctrl;
+
+ pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
+ ctrl &= ~clear;
+ ctrl |= set;
+ pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
+}
+
+static void __iomem *msix_map_region(struct pci_dev *dev,
+ unsigned int nr_entries)
+{
+ resource_size_t phys_addr;
+ u32 table_offset;
+ unsigned long flags;
+ u8 bir;
+
+ pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE,
+ &table_offset);
+ bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
+ flags = pci_resource_flags(dev, bir);
+ if (!flags || (flags & IORESOURCE_UNSET))
+ return NULL;
+
+ table_offset &= PCI_MSIX_TABLE_OFFSET;
+ phys_addr = pci_resource_start(dev, bir) + table_offset;
+
+ return ioremap(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
+}
+
+static int msix_setup_msi_descs(struct pci_dev *dev, void __iomem *base,
+ struct msix_entry *entries, int nvec,
+ struct irq_affinity_desc *masks)
+{
+ int ret = 0, i, vec_count = pci_msix_vec_count(dev);
+ struct irq_affinity_desc *curmsk;
+ struct msi_desc desc;
+ void __iomem *addr;
+
+ memset(&desc, 0, sizeof(desc));
+
+ desc.nvec_used = 1;
+ desc.pci.msi_attrib.is_msix = 1;
+ desc.pci.msi_attrib.is_64 = 1;
+ desc.pci.msi_attrib.default_irq = dev->irq;
+ desc.pci.mask_base = base;
+
+ for (i = 0, curmsk = masks; i < nvec; i++, curmsk++) {
desc.msi_index = entries ? entries[i].entry : i;
desc.affinity = masks ? curmsk : NULL;
desc.pci.msi_attrib.is_virtual = desc.msi_index >= vec_count;
@@ -599,101 +721,6 @@ out_disable:
return ret;
}
-/**
- * pci_msi_supported - check whether MSI may be enabled on a device
- * @dev: pointer to the pci_dev data structure of MSI device function
- * @nvec: how many MSIs have been requested?
- *
- * Look at global flags, the device itself, and its parent buses
- * to determine if MSI/-X are supported for the device. If MSI/-X is
- * supported return 1, else return 0.
- **/
-static int pci_msi_supported(struct pci_dev *dev, int nvec)
-{
- struct pci_bus *bus;
-
- /* MSI must be globally enabled and supported by the device */
- if (!pci_msi_enable)
- return 0;
-
- if (!dev || dev->no_msi)
- return 0;
-
- /*
- * You can't ask to have 0 or less MSIs configured.
- * a) it's stupid ..
- * b) the list manipulation code assumes nvec >= 1.
- */
- if (nvec < 1)
- return 0;
-
- /*
- * Any bridge which does NOT route MSI transactions from its
- * secondary bus to its primary bus must set NO_MSI flag on
- * the secondary pci_bus.
- *
- * The NO_MSI flag can either be set directly by:
- * - arch-specific PCI host bus controller drivers (deprecated)
- * - quirks for specific PCI bridges
- *
- * or indirectly by platform-specific PCI host bridge drivers by
- * advertising the 'msi_domain' property, which results in
- * the NO_MSI flag when no MSI domain is found for this bridge
- * at probe time.
- */
- for (bus = dev->bus; bus; bus = bus->parent)
- if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
- return 0;
-
- return 1;
-}
-
-/**
- * pci_msi_vec_count - Return the number of MSI vectors a device can send
- * @dev: device to report about
- *
- * This function returns the number of MSI vectors a device requested via
- * Multiple Message Capable register. It returns a negative errno if the
- * device is not capable sending MSI interrupts. Otherwise, the call succeeds
- * and returns a power of two, up to a maximum of 2^5 (32), according to the
- * MSI specification.
- **/
-int pci_msi_vec_count(struct pci_dev *dev)
-{
- int ret;
- u16 msgctl;
-
- if (!dev->msi_cap)
- return -EINVAL;
-
- pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
- ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
-
- return ret;
-}
-EXPORT_SYMBOL(pci_msi_vec_count);
-
-void pci_msi_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msi_enabled)
- return;
-
- pci_msi_set_enable(dev, 0);
- pci_intx_for_msi(dev, 1);
- dev->msi_enabled = 0;
-
- /* Return the device with MSI unmasked as initial states */
- desc = msi_first_desc(&dev->dev, MSI_DESC_ALL);
- if (!WARN_ON_ONCE(!desc))
- pci_msi_unmask(desc, msi_multi_mask(desc));
-
- /* Restore dev->irq to its default pin-assertion IRQ */
- dev->irq = desc->pci.msi_attrib.default_irq;
- pcibios_alloc_irq(dev);
-}
-
static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
int nvec, struct irq_affinity *affd, int flags)
{
@@ -729,57 +756,23 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
return msix_capability_init(dev, entries, nvec, affd);
}
-void pci_msix_shutdown(struct pci_dev *dev)
-{
- struct msi_desc *desc;
-
- if (!pci_msi_enable || !dev || !dev->msix_enabled)
- return;
-
- if (pci_dev_is_disconnected(dev)) {
- dev->msix_enabled = 0;
- return;
- }
-
- /* Return the device with MSI-X masked as initial states */
- msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
- pci_msix_mask(desc);
-
- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
- pci_intx_for_msi(dev, 1);
- dev->msix_enabled = 0;
- pcibios_alloc_irq(dev);
-}
-
-int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
- struct irq_affinity *affd)
+int __pci_enable_msix_range(struct pci_dev *dev,
+ struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd,
+ int flags)
{
- int nvec;
- int rc;
-
- if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0)
- return -EINVAL;
-
- /* Check whether driver already requested MSI-X IRQs */
- if (dev->msix_enabled) {
- pci_info(dev, "can't enable MSI (MSI-X already enabled)\n");
- return -EINVAL;
- }
+ int rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
- if (WARN_ON_ONCE(dev->msi_enabled))
+ if (dev->msi_enabled) {
+ pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
return -EINVAL;
+ }
- nvec = pci_msi_vec_count(dev);
- if (nvec < 0)
- return nvec;
- if (nvec < minvec)
- return -ENOSPC;
-
- if (nvec > maxvec)
- nvec = maxvec;
+ if (WARN_ON_ONCE(dev->msix_enabled))
+ return -EINVAL;
rc = pci_setup_msi_context(dev);
if (rc)
@@ -792,7 +785,7 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
return -ENOSPC;
}
- rc = msi_capability_init(dev, nvec, affd);
+ rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
if (rc == 0)
return nvec;
@@ -805,48 +798,68 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
}
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+void __pci_restore_msix_state(struct pci_dev *dev)
{
- int rc, nvec = maxvec;
+ struct msi_desc *entry;
+ bool write_msg;
- if (maxvec < minvec)
- return -ERANGE;
+ if (!dev->msix_enabled)
+ return;
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI already enabled)\n");
- return -EINVAL;
+ /* route the table */
+ pci_intx_for_msi(dev, 0);
+ pci_msix_clear_and_set_ctrl(dev, 0,
+ PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
+
+ write_msg = arch_restore_msi_irqs(dev);
+
+ msi_lock_descs(&dev->dev);
+ msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) {
+ if (write_msg)
+ __pci_write_msi_msg(entry, &entry->msg);
+ pci_msix_write_vector_ctrl(entry, entry->pci.msix_ctrl);
}
+ msi_unlock_descs(&dev->dev);
- if (WARN_ON_ONCE(dev->msix_enabled))
- return -EINVAL;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
+}
- rc = pci_setup_msi_context(dev);
- if (rc)
- return rc;
+void pci_msix_shutdown(struct pci_dev *dev)
+{
+ struct msi_desc *desc;
- for (;;) {
- if (affd) {
- nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
- if (nvec < minvec)
- return -ENOSPC;
- }
+ if (!pci_msi_enable || !dev || !dev->msix_enabled)
+ return;
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
- if (rc == 0)
- return nvec;
+ if (pci_dev_is_disconnected(dev)) {
+ dev->msix_enabled = 0;
+ return;
+ }
- if (rc < 0)
- return rc;
- if (rc < minvec)
- return -ENOSPC;
+ /* Return the device with MSI-X masked as initial states */
+ msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL)
+ pci_msix_mask(desc);
- nvec = rc;
+ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
+ pci_intx_for_msi(dev, 1);
+ dev->msix_enabled = 0;
+ pcibios_alloc_irq(dev);
+}
+
+/* Common interfaces */
+
+void pci_free_msi_irqs(struct pci_dev *dev)
+{
+ pci_msi_teardown_msi_irqs(dev);
+
+ if (dev->msix_base) {
+ iounmap(dev->msix_base);
+ dev->msix_base = NULL;
}
}
+/* Misc. infrastructure */
+
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
return to_pci_dev(desc->dev);
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 33/39] PCI/MSI: Sanitize MSI-X checks
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
There is no point in doing the same sanity checks over and over in a loop
during MSI-X enablement. Put them in front of the loop and return early
when they fail.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
1 file changed, 34 insertions(+), 33 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -721,47 +721,31 @@ static int msix_capability_init(struct p
return ret;
}
-static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
- int nvec, struct irq_affinity *affd, int flags)
+static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
{
- int nr_entries;
int i, j;
- if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
- return -EINVAL;
+ if (!entries)
+ return true;
- nr_entries = pci_msix_vec_count(dev);
- if (nr_entries < 0)
- return nr_entries;
- if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
- return nr_entries;
-
- if (entries) {
- /* Check for any invalid entries */
- for (i = 0; i < nvec; i++) {
- if (entries[i].entry >= nr_entries)
- return -EINVAL; /* invalid entry */
- for (j = i + 1; j < nvec; j++) {
- if (entries[i].entry == entries[j].entry)
- return -EINVAL; /* duplicate entry */
- }
+ for (i = 0; i < nvec; i++) {
+ /* Entry within hardware limit? */
+ if (entries[i].entry >= hwsize)
+ return false;
+
+ /* Check for duplicate entries */
+ for (j = i + 1; j < nvec; j++) {
+ if (entries[i].entry == entries[j].entry)
+ return false;
}
}
-
- /* Check whether driver already requested for MSI IRQ */
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
- return -EINVAL;
- }
- return msix_capability_init(dev, entries, nvec, affd);
+ return true;
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags)
{
- int rc, nvec = maxvec;
+ int hwsize, rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
@@ -774,6 +758,23 @@ int __pci_enable_msix_range(struct pci_d
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
+
+ hwsize = pci_msix_vec_count(dev);
+ if (hwsize < 0)
+ return hwsize;
+
+ if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ return -EINVAL;
+
+ /* PCI_IRQ_VIRTUAL is a horrible hack! */
+ if (nvec > hwsize && !(flags & PCI_IRQ_VIRTUAL))
+ nvec = hwsize;
+
+ if (nvec < minvec)
+ return -ENOSPC;
+
rc = pci_setup_msi_context(dev);
if (rc)
return rc;
@@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
return -ENOSPC;
}
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
+ rc = msix_capability_init(dev, entries, nvec, affd);
if (rc == 0)
return nvec;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 33/39] PCI/MSI: Sanitize MSI-X checks
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
There is no point in doing the same sanity checks over and over in a loop
during MSI-X enablement. Put them in front of the loop and return early
when they fail.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
1 file changed, 34 insertions(+), 33 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -721,47 +721,31 @@ static int msix_capability_init(struct p
return ret;
}
-static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
- int nvec, struct irq_affinity *affd, int flags)
+static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
{
- int nr_entries;
int i, j;
- if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
- return -EINVAL;
+ if (!entries)
+ return true;
- nr_entries = pci_msix_vec_count(dev);
- if (nr_entries < 0)
- return nr_entries;
- if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
- return nr_entries;
-
- if (entries) {
- /* Check for any invalid entries */
- for (i = 0; i < nvec; i++) {
- if (entries[i].entry >= nr_entries)
- return -EINVAL; /* invalid entry */
- for (j = i + 1; j < nvec; j++) {
- if (entries[i].entry == entries[j].entry)
- return -EINVAL; /* duplicate entry */
- }
+ for (i = 0; i < nvec; i++) {
+ /* Entry within hardware limit? */
+ if (entries[i].entry >= hwsize)
+ return false;
+
+ /* Check for duplicate entries */
+ for (j = i + 1; j < nvec; j++) {
+ if (entries[i].entry == entries[j].entry)
+ return false;
}
}
-
- /* Check whether driver already requested for MSI IRQ */
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
- return -EINVAL;
- }
- return msix_capability_init(dev, entries, nvec, affd);
+ return true;
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags)
{
- int rc, nvec = maxvec;
+ int hwsize, rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
@@ -774,6 +758,23 @@ int __pci_enable_msix_range(struct pci_d
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
+
+ hwsize = pci_msix_vec_count(dev);
+ if (hwsize < 0)
+ return hwsize;
+
+ if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ return -EINVAL;
+
+ /* PCI_IRQ_VIRTUAL is a horrible hack! */
+ if (nvec > hwsize && !(flags & PCI_IRQ_VIRTUAL))
+ nvec = hwsize;
+
+ if (nvec < minvec)
+ return -ENOSPC;
+
rc = pci_setup_msi_context(dev);
if (rc)
return rc;
@@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
return -ENOSPC;
}
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
+ rc = msix_capability_init(dev, entries, nvec, affd);
if (rc == 0)
return nvec;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:29 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:29 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:07PM +0100, Thomas Gleixner wrote:
> There is no point in doing the same sanity checks over and over in a loop
> during MSI-X enablement. Put them in front of the loop and return early
> when they fail.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 33 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -721,47 +721,31 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> - int nvec, struct irq_affinity *affd, int flags)
> +static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
> {
> - int nr_entries;
> int i, j;
>
> - if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> - return -EINVAL;
> + if (!entries)
> + return true;
>
> - nr_entries = pci_msix_vec_count(dev);
> - if (nr_entries < 0)
> - return nr_entries;
> - if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
> - return nr_entries;
> -
> - if (entries) {
> - /* Check for any invalid entries */
> - for (i = 0; i < nvec; i++) {
> - if (entries[i].entry >= nr_entries)
> - return -EINVAL; /* invalid entry */
> - for (j = i + 1; j < nvec; j++) {
> - if (entries[i].entry == entries[j].entry)
> - return -EINVAL; /* duplicate entry */
> - }
> + for (i = 0; i < nvec; i++) {
> + /* Entry within hardware limit? */
> + if (entries[i].entry >= hwsize)
> + return false;
> +
> + /* Check for duplicate entries */
> + for (j = i + 1; j < nvec; j++) {
> + if (entries[i].entry == entries[j].entry)
> + return false;
> }
> }
> -
> - /* Check whether driver already requested for MSI IRQ */
> - if (dev->msi_enabled) {
> - pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
> - return -EINVAL;
> - }
> - return msix_capability_init(dev, entries, nvec, affd);
> + return true;
> }
>
> -int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd, int flags)
> {
> - int rc, nvec = maxvec;
> + int hwsize, rc, nvec = maxvec;
>
> if (maxvec < minvec)
> return -ERANGE;
> @@ -774,6 +758,23 @@ int __pci_enable_msix_range(struct pci_d
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
> + if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> + return -EINVAL;
> +
> + hwsize = pci_msix_vec_count(dev);
> + if (hwsize < 0)
> + return hwsize;
> +
> + if (!pci_msix_validate_entries(entries, nvec, hwsize))
> + return -EINVAL;
> +
> + /* PCI_IRQ_VIRTUAL is a horrible hack! */
> + if (nvec > hwsize && !(flags & PCI_IRQ_VIRTUAL))
> + nvec = hwsize;
> +
> + if (nvec < minvec)
> + return -ENOSPC;
> +
> rc = pci_setup_msi_context(dev);
> if (rc)
> return rc;
> @@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
> return -ENOSPC;
> }
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> + rc = msix_capability_init(dev, entries, nvec, affd);
> if (rc == 0)
> return nvec;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
@ 2022-11-16 16:29 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:29 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:07PM +0100, Thomas Gleixner wrote:
> There is no point in doing the same sanity checks over and over in a loop
> during MSI-X enablement. Put them in front of the loop and return early
> when they fail.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 33 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -721,47 +721,31 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
> - int nvec, struct irq_affinity *affd, int flags)
> +static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
> {
> - int nr_entries;
> int i, j;
>
> - if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> - return -EINVAL;
> + if (!entries)
> + return true;
>
> - nr_entries = pci_msix_vec_count(dev);
> - if (nr_entries < 0)
> - return nr_entries;
> - if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
> - return nr_entries;
> -
> - if (entries) {
> - /* Check for any invalid entries */
> - for (i = 0; i < nvec; i++) {
> - if (entries[i].entry >= nr_entries)
> - return -EINVAL; /* invalid entry */
> - for (j = i + 1; j < nvec; j++) {
> - if (entries[i].entry == entries[j].entry)
> - return -EINVAL; /* duplicate entry */
> - }
> + for (i = 0; i < nvec; i++) {
> + /* Entry within hardware limit? */
> + if (entries[i].entry >= hwsize)
> + return false;
> +
> + /* Check for duplicate entries */
> + for (j = i + 1; j < nvec; j++) {
> + if (entries[i].entry == entries[j].entry)
> + return false;
> }
> }
> -
> - /* Check whether driver already requested for MSI IRQ */
> - if (dev->msi_enabled) {
> - pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
> - return -EINVAL;
> - }
> - return msix_capability_init(dev, entries, nvec, affd);
> + return true;
> }
>
> -int __pci_enable_msix_range(struct pci_dev *dev,
> - struct msix_entry *entries, int minvec,
> - int maxvec, struct irq_affinity *affd,
> - int flags)
> +int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
> + int maxvec, struct irq_affinity *affd, int flags)
> {
> - int rc, nvec = maxvec;
> + int hwsize, rc, nvec = maxvec;
>
> if (maxvec < minvec)
> return -ERANGE;
> @@ -774,6 +758,23 @@ int __pci_enable_msix_range(struct pci_d
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
> + if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> + return -EINVAL;
> +
> + hwsize = pci_msix_vec_count(dev);
> + if (hwsize < 0)
> + return hwsize;
> +
> + if (!pci_msix_validate_entries(entries, nvec, hwsize))
> + return -EINVAL;
> +
> + /* PCI_IRQ_VIRTUAL is a horrible hack! */
> + if (nvec > hwsize && !(flags & PCI_IRQ_VIRTUAL))
> + nvec = hwsize;
> +
> + if (nvec < minvec)
> + return -ENOSPC;
> +
> rc = pci_setup_msi_context(dev);
> if (rc)
> return rc;
> @@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
> return -ENOSPC;
> }
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> + rc = msix_capability_init(dev, entries, nvec, affd);
> if (rc == 0)
> return nvec;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 17:57 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:57 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:07PM +0100, Thomas Gleixner wrote:
> There is no point in doing the same sanity checks over and over in a loop
> during MSI-X enablement. Put them in front of the loop and return early
> when they fail.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 33 deletions(-)
> + /* PCI_IRQ_VIRTUAL is a horrible hack! */
New comment too :)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
@ 2022-11-16 17:57 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:57 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:07PM +0100, Thomas Gleixner wrote:
> There is no point in doing the same sanity checks over and over in a loop
> during MSI-X enablement. Put them in front of the loop and return early
> when they fail.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 67 +++++++++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 33 deletions(-)
> + /* PCI_IRQ_VIRTUAL is a horrible hack! */
New comment too :)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Sanitize MSI-X checks
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: bab65e48cb064d67b488efb6888c06fd977a8245
Gitweb: https://git.kernel.org/tip/bab65e48cb064d67b488efb6888c06fd977a8245
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:07 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
PCI/MSI: Sanitize MSI-X checks
There is no point in doing the same sanity checks over and over in a loop
during MSI-X enablement. Put them in front of the loop and return early
when they fail.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.516946468@linutronix.de
---
drivers/pci/msi/msi.c | 65 +++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 32 deletions(-)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 380e651..794ec97 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -721,47 +721,31 @@ out_disable:
return ret;
}
-static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
- int nvec, struct irq_affinity *affd, int flags)
+static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
{
- int nr_entries;
int i, j;
- if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
- return -EINVAL;
+ if (!entries)
+ return true;
- nr_entries = pci_msix_vec_count(dev);
- if (nr_entries < 0)
- return nr_entries;
- if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
- return nr_entries;
+ for (i = 0; i < nvec; i++) {
+ /* Entry within hardware limit? */
+ if (entries[i].entry >= hwsize)
+ return false;
- if (entries) {
- /* Check for any invalid entries */
- for (i = 0; i < nvec; i++) {
- if (entries[i].entry >= nr_entries)
- return -EINVAL; /* invalid entry */
- for (j = i + 1; j < nvec; j++) {
- if (entries[i].entry == entries[j].entry)
- return -EINVAL; /* duplicate entry */
- }
+ /* Check for duplicate entries */
+ for (j = i + 1; j < nvec; j++) {
+ if (entries[i].entry == entries[j].entry)
+ return false;
}
}
-
- /* Check whether driver already requested for MSI IRQ */
- if (dev->msi_enabled) {
- pci_info(dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
- return -EINVAL;
- }
- return msix_capability_init(dev, entries, nvec, affd);
+ return true;
}
-int __pci_enable_msix_range(struct pci_dev *dev,
- struct msix_entry *entries, int minvec,
- int maxvec, struct irq_affinity *affd,
- int flags)
+int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
+ int maxvec, struct irq_affinity *affd, int flags)
{
- int rc, nvec = maxvec;
+ int hwsize, rc, nvec = maxvec;
if (maxvec < minvec)
return -ERANGE;
@@ -774,6 +758,23 @@ int __pci_enable_msix_range(struct pci_dev *dev,
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
+ return -EINVAL;
+
+ hwsize = pci_msix_vec_count(dev);
+ if (hwsize < 0)
+ return hwsize;
+
+ if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ return -EINVAL;
+
+ /* PCI_IRQ_VIRTUAL is a horrible hack! */
+ if (nvec > hwsize && !(flags & PCI_IRQ_VIRTUAL))
+ nvec = hwsize;
+
+ if (nvec < minvec)
+ return -ENOSPC;
+
rc = pci_setup_msi_context(dev);
if (rc)
return rc;
@@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_dev *dev,
return -ENOSPC;
}
- rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
+ rc = msix_capability_init(dev, entries, nvec, affd);
if (rc == 0)
return nvec;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* RE: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-18 7:38 ` Tian, Kevin
-1 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:38 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Jiang, Dave, Alex Williamson, Williams, Dan J,
Logan Gunthorpe, Raj, Ashok, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Chatre, Reinette
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:55 PM
>
> @@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
> return -ENOSPC;
> }
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> + rc = msix_capability_init(dev, entries, nvec, affd);
> if (rc == 0)
> return nvec;
>
The check in following lines doesn't make sense now:
if (rc < minvec)
return -ENOSPC;
^ permalink raw reply [flat|nested] 283+ messages in thread
* RE: [patch 33/39] PCI/MSI: Sanitize MSI-X checks
@ 2022-11-18 7:38 ` Tian, Kevin
0 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:38 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: Logan Gunthorpe, Allen Hubbe, Lorenzo Pieralisi, Jiang, Dave,
Raj, Ashok, Greg Kroah-Hartman, linux-pci, Joerg Roedel, x86,
linuxppc-dev, Chatre, Reinette, Alex Williamson, Jason Gunthorpe,
Marc Zyngier, Bjorn Helgaas, Williams, Dan J, Jon Mason,
Will Deacon, Ahmed S. Darwish
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:55 PM
>
> @@ -785,7 +786,7 @@ int __pci_enable_msix_range(struct pci_d
> return -ENOSPC;
> }
>
> - rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
> + rc = msix_capability_init(dev, entries, nvec, affd);
> if (rc == 0)
> return nvec;
>
The check in following lines doesn't make sense now:
if (rc < minvec)
return -ENOSPC;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 34/39] PCI/MSI: Reject multi-MSI early
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
When hierarchical MSI interrupt domains are enabled then there is no point
to do tons of work and detect the missing support for multi-MSI late in the
allocation path.
Just query the domain feature flags right away. The query function is going
to be used for other purposes later and has a mode argument which influences
the result:
ALLOW_LEGACY returns true when:
- there is no irq domain attached (legacy support)
- there is a irq domain attached which has the feature flag set
DENY_LEGACY returns only true when:
- there is a irq domain attached which has the feature flag set
This allows to use the function universally without ifdeffery in the
calling code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
drivers/pci/msi/msi.c | 4 ++++
drivers/pci/msi/msi.h | 9 +++++++++
3 files changed, 35 insertions(+)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_do
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
+/**
+ * pci_msi_domain_supports - Check for support of a particular feature flag
+ * @pdev: The PCI device to operate on
+ * @feature_mask: The feature mask to check for (full match)
+ * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
+ * associated to the device. If DENY_LEGACY the lack of an irq domain
+ * makes the feature unsupported
+ */
+bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
+ enum support_mode mode)
+{
+ struct msi_domain_info *info;
+ struct irq_domain *domain;
+
+ domain = dev_get_msi_domain(&pdev->dev);
+
+ if (!domain || !irq_domain_is_hierarchy(domain))
+ return mode == ALLOW_LEGACY;
+ info = domain->host_data;
+ return (info->flags & feature_mask) == feature_mask;
+}
+
/*
* Users of the generic MSI infrastructure expect a device to have a single ID,
* so with DMA aliases we have to pick the least-worst compromise. Devices with
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -347,6 +347,10 @@ static int msi_capability_init(struct pc
struct msi_desc *entry;
int ret;
+ /* Reject multi-MSI early on irq domain enabled architectures */
+ if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
+ return 1;
+
/*
* Disable MSI during setup in the hardware, but mark it enabled
* so that setup code can evaluate it.
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_d
void __pci_restore_msi_state(struct pci_dev *dev);
void __pci_restore_msix_state(struct pci_dev *dev);
+/* irq_domain related functionality */
+
+enum support_mode {
+ ALLOW_LEGACY,
+ DENY_LEGACY,
+};
+
+bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 34/39] PCI/MSI: Reject multi-MSI early
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
When hierarchical MSI interrupt domains are enabled then there is no point
to do tons of work and detect the missing support for multi-MSI late in the
allocation path.
Just query the domain feature flags right away. The query function is going
to be used for other purposes later and has a mode argument which influences
the result:
ALLOW_LEGACY returns true when:
- there is no irq domain attached (legacy support)
- there is a irq domain attached which has the feature flag set
DENY_LEGACY returns only true when:
- there is a irq domain attached which has the feature flag set
This allows to use the function universally without ifdeffery in the
calling code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
drivers/pci/msi/msi.c | 4 ++++
drivers/pci/msi/msi.h | 9 +++++++++
3 files changed, 35 insertions(+)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_do
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
+/**
+ * pci_msi_domain_supports - Check for support of a particular feature flag
+ * @pdev: The PCI device to operate on
+ * @feature_mask: The feature mask to check for (full match)
+ * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
+ * associated to the device. If DENY_LEGACY the lack of an irq domain
+ * makes the feature unsupported
+ */
+bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
+ enum support_mode mode)
+{
+ struct msi_domain_info *info;
+ struct irq_domain *domain;
+
+ domain = dev_get_msi_domain(&pdev->dev);
+
+ if (!domain || !irq_domain_is_hierarchy(domain))
+ return mode == ALLOW_LEGACY;
+ info = domain->host_data;
+ return (info->flags & feature_mask) == feature_mask;
+}
+
/*
* Users of the generic MSI infrastructure expect a device to have a single ID,
* so with DMA aliases we have to pick the least-worst compromise. Devices with
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -347,6 +347,10 @@ static int msi_capability_init(struct pc
struct msi_desc *entry;
int ret;
+ /* Reject multi-MSI early on irq domain enabled architectures */
+ if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
+ return 1;
+
/*
* Disable MSI during setup in the hardware, but mark it enabled
* so that setup code can evaluate it.
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_d
void __pci_restore_msi_state(struct pci_dev *dev);
void __pci_restore_msix_state(struct pci_dev *dev);
+/* irq_domain related functionality */
+
+enum support_mode {
+ ALLOW_LEGACY,
+ DENY_LEGACY,
+};
+
+bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:31 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
> When hierarchical MSI interrupt domains are enabled then there is no point
> to do tons of work and detect the missing support for multi-MSI late in the
> allocation path.
>
> Just query the domain feature flags right away. The query function is going
> to be used for other purposes later and has a mode argument which influences
> the result:
>
> ALLOW_LEGACY returns true when:
> - there is no irq domain attached (legacy support)
> - there is a irq domain attached which has the feature flag set
>
> DENY_LEGACY returns only true when:
> - there is a irq domain attached which has the feature flag set
>
> This allows to use the function universally without ifdeffery in the
> calling code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
> drivers/pci/msi/msi.c | 4 ++++
> drivers/pci/msi/msi.h | 9 +++++++++
> 3 files changed, 35 insertions(+)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_do
> }
> EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
>
> +/**
> + * pci_msi_domain_supports - Check for support of a particular feature flag
> + * @pdev: The PCI device to operate on
> + * @feature_mask: The feature mask to check for (full match)
> + * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
> + * associated to the device. If DENY_LEGACY the lack of an irq domain
> + * makes the feature unsupported
Looks like some of these might be wider than 80 columns, which I think
was the typical width of this file.
> + */
> +bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
> + enum support_mode mode)
> +{
> + struct msi_domain_info *info;
> + struct irq_domain *domain;
> +
> + domain = dev_get_msi_domain(&pdev->dev);
> +
> + if (!domain || !irq_domain_is_hierarchy(domain))
> + return mode == ALLOW_LEGACY;
> + info = domain->host_data;
> + return (info->flags & feature_mask) == feature_mask;
> +}
> +
> /*
> * Users of the generic MSI infrastructure expect a device to have a single ID,
> * so with DMA aliases we have to pick the least-worst compromise. Devices with
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -347,6 +347,10 @@ static int msi_capability_init(struct pc
> struct msi_desc *entry;
> int ret;
>
> + /* Reject multi-MSI early on irq domain enabled architectures */
> + if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
> + return 1;
> +
> /*
> * Disable MSI during setup in the hardware, but mark it enabled
> * so that setup code can evaluate it.
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_d
> void __pci_restore_msi_state(struct pci_dev *dev);
> void __pci_restore_msix_state(struct pci_dev *dev);
>
> +/* irq_domain related functionality */
> +
> +enum support_mode {
> + ALLOW_LEGACY,
> + DENY_LEGACY,
> +};
> +
> +bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
> +
> /* Legacy (!IRQDOMAIN) fallbacks */
>
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
@ 2022-11-16 16:31 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
> When hierarchical MSI interrupt domains are enabled then there is no point
> to do tons of work and detect the missing support for multi-MSI late in the
> allocation path.
>
> Just query the domain feature flags right away. The query function is going
> to be used for other purposes later and has a mode argument which influences
> the result:
>
> ALLOW_LEGACY returns true when:
> - there is no irq domain attached (legacy support)
> - there is a irq domain attached which has the feature flag set
>
> DENY_LEGACY returns only true when:
> - there is a irq domain attached which has the feature flag set
>
> This allows to use the function universally without ifdeffery in the
> calling code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
> drivers/pci/msi/msi.c | 4 ++++
> drivers/pci/msi/msi.h | 9 +++++++++
> 3 files changed, 35 insertions(+)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_do
> }
> EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
>
> +/**
> + * pci_msi_domain_supports - Check for support of a particular feature flag
> + * @pdev: The PCI device to operate on
> + * @feature_mask: The feature mask to check for (full match)
> + * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
> + * associated to the device. If DENY_LEGACY the lack of an irq domain
> + * makes the feature unsupported
Looks like some of these might be wider than 80 columns, which I think
was the typical width of this file.
> + */
> +bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
> + enum support_mode mode)
> +{
> + struct msi_domain_info *info;
> + struct irq_domain *domain;
> +
> + domain = dev_get_msi_domain(&pdev->dev);
> +
> + if (!domain || !irq_domain_is_hierarchy(domain))
> + return mode == ALLOW_LEGACY;
> + info = domain->host_data;
> + return (info->flags & feature_mask) == feature_mask;
> +}
> +
> /*
> * Users of the generic MSI infrastructure expect a device to have a single ID,
> * so with DMA aliases we have to pick the least-worst compromise. Devices with
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -347,6 +347,10 @@ static int msi_capability_init(struct pc
> struct msi_desc *entry;
> int ret;
>
> + /* Reject multi-MSI early on irq domain enabled architectures */
> + if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
> + return 1;
> +
> /*
> * Disable MSI during setup in the hardware, but mark it enabled
> * so that setup code can evaluate it.
> --- a/drivers/pci/msi/msi.h
> +++ b/drivers/pci/msi/msi.h
> @@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_d
> void __pci_restore_msi_state(struct pci_dev *dev);
> void __pci_restore_msix_state(struct pci_dev *dev);
>
> +/* irq_domain related functionality */
> +
> +enum support_mode {
> + ALLOW_LEGACY,
> + DENY_LEGACY,
> +};
> +
> +bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
> +
> /* Legacy (!IRQDOMAIN) fallbacks */
>
> #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
2022-11-16 16:31 ` Bjorn Helgaas
@ 2022-11-17 8:22 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 8:22 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Wed, Nov 16 2022 at 10:31, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
>>
>> +/**
>> + * pci_msi_domain_supports - Check for support of a particular feature flag
>> + * @pdev: The PCI device to operate on
>> + * @feature_mask: The feature mask to check for (full match)
>> + * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
>> + * associated to the device. If DENY_LEGACY the lack of an irq domain
>> + * makes the feature unsupported
>
> Looks like some of these might be wider than 80 columns, which I think
> was the typical width of this file.
I accommodated to the general sentiment that 80 columns is yesterday. My
new cutoff is 100.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
@ 2022-11-17 8:22 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 8:22 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Wed, Nov 16 2022 at 10:31, Bjorn Helgaas wrote:
> On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
>>
>> +/**
>> + * pci_msi_domain_supports - Check for support of a particular feature flag
>> + * @pdev: The PCI device to operate on
>> + * @feature_mask: The feature mask to check for (full match)
>> + * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
>> + * associated to the device. If DENY_LEGACY the lack of an irq domain
>> + * makes the feature unsupported
>
> Looks like some of these might be wider than 80 columns, which I think
> was the typical width of this file.
I accommodated to the general sentiment that 80 columns is yesterday. My
new cutoff is 100.
Thanks,
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 17:59 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:59 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
> When hierarchical MSI interrupt domains are enabled then there is no point
> to do tons of work and detect the missing support for multi-MSI late in the
> allocation path.
>
> Just query the domain feature flags right away. The query function is going
> to be used for other purposes later and has a mode argument which influences
> the result:
>
> ALLOW_LEGACY returns true when:
> - there is no irq domain attached (legacy support)
> - there is a irq domain attached which has the feature flag set
>
> DENY_LEGACY returns only true when:
> - there is a irq domain attached which has the feature flag set
>
> This allows to use the function universally without ifdeffery in the
> calling code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
> drivers/pci/msi/msi.c | 4 ++++
> drivers/pci/msi/msi.h | 9 +++++++++
> 3 files changed, 35 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 34/39] PCI/MSI: Reject multi-MSI early
@ 2022-11-16 17:59 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 17:59 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote:
> When hierarchical MSI interrupt domains are enabled then there is no point
> to do tons of work and detect the missing support for multi-MSI late in the
> allocation path.
>
> Just query the domain feature flags right away. The query function is going
> to be used for other purposes later and has a mode argument which influences
> the result:
>
> ALLOW_LEGACY returns true when:
> - there is no irq domain attached (legacy support)
> - there is a irq domain attached which has the feature flag set
>
> DENY_LEGACY returns only true when:
> - there is a irq domain attached which has the feature flag set
>
> This allows to use the function universally without ifdeffery in the
> calling code.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
> drivers/pci/msi/msi.c | 4 ++++
> drivers/pci/msi/msi.h | 9 +++++++++
> 3 files changed, 35 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Reject multi-MSI early
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: d2a463b297415ca6dd4d60bb1c867dd7c931587b
Gitweb: https://git.kernel.org/tip/d2a463b297415ca6dd4d60bb1c867dd7c931587b
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:09 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
PCI/MSI: Reject multi-MSI early
When hierarchical MSI interrupt domains are enabled then there is no point
to do tons of work and detect the missing support for multi-MSI late in the
allocation path.
Just query the domain feature flags right away. The query function is going
to be used for other purposes later and has a mode argument which influences
the result:
ALLOW_LEGACY returns true when:
- there is no irq domain attached (legacy support)
- there is a irq domain attached which has the feature flag set
DENY_LEGACY returns only true when:
- there is a irq domain attached which has the feature flag set
This allows to use the function universally without ifdeffery in the
calling code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.574339988@linutronix.de
---
drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++
drivers/pci/msi/msi.c | 4 ++++
drivers/pci/msi/msi.h | 9 +++++++++
3 files changed, 35 insertions(+)
diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c
index edd0cc2..666ed21 100644
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
}
EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
+/**
+ * pci_msi_domain_supports - Check for support of a particular feature flag
+ * @pdev: The PCI device to operate on
+ * @feature_mask: The feature mask to check for (full match)
+ * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain
+ * associated to the device. If DENY_LEGACY the lack of an irq domain
+ * makes the feature unsupported
+ */
+bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
+ enum support_mode mode)
+{
+ struct msi_domain_info *info;
+ struct irq_domain *domain;
+
+ domain = dev_get_msi_domain(&pdev->dev);
+
+ if (!domain || !irq_domain_is_hierarchy(domain))
+ return mode == ALLOW_LEGACY;
+ info = domain->host_data;
+ return (info->flags & feature_mask) == feature_mask;
+}
+
/*
* Users of the generic MSI infrastructure expect a device to have a single ID,
* so with DMA aliases we have to pick the least-worst compromise. Devices with
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 794ec97..bc84647 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -347,6 +347,10 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
struct msi_desc *entry;
int ret;
+ /* Reject multi-MSI early on irq domain enabled architectures */
+ if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY))
+ return 1;
+
/*
* Disable MSI during setup in the hardware, but mark it enabled
* so that setup code can evaluate it.
diff --git a/drivers/pci/msi/msi.h b/drivers/pci/msi/msi.h
index 8170ef2..9d75b6f 100644
--- a/drivers/pci/msi/msi.h
+++ b/drivers/pci/msi/msi.h
@@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int
void __pci_restore_msi_state(struct pci_dev *dev);
void __pci_restore_msix_state(struct pci_dev *dev);
+/* irq_domain related functionality */
+
+enum support_mode {
+ ALLOW_LEGACY,
+ DENY_LEGACY,
+};
+
+bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
+
/* Legacy (!IRQDOMAIN) fallbacks */
#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 35/39] PCI/MSI: Reject MSI-X early
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
attached to the device which does not support MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 4 ++++
1 file changed, 4 insertions(+)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -760,6 +760,10 @@ int __pci_enable_msix_range(struct pci_d
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ /* Check MSI-X early on irq domain enabled architectures */
+ if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY))
+ return -ENOTSUPP;
+
if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 35/39] PCI/MSI: Reject MSI-X early
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
attached to the device which does not support MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 4 ++++
1 file changed, 4 insertions(+)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -760,6 +760,10 @@ int __pci_enable_msix_range(struct pci_d
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ /* Check MSI-X early on irq domain enabled architectures */
+ if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY))
+ return -ENOTSUPP;
+
if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
return -EINVAL;
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 35/39] PCI/MSI: Reject MSI-X early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:31 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:11PM +0100, Thomas Gleixner wrote:
> Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
> attached to the device which does not support MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -760,6 +760,10 @@ int __pci_enable_msix_range(struct pci_d
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
> + /* Check MSI-X early on irq domain enabled architectures */
> + if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY))
> + return -ENOTSUPP;
> +
> if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> return -EINVAL;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 35/39] PCI/MSI: Reject MSI-X early
@ 2022-11-16 16:31 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:31 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:11PM +0100, Thomas Gleixner wrote:
> Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
> attached to the device which does not support MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/msi.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -760,6 +760,10 @@ int __pci_enable_msix_range(struct pci_d
> if (WARN_ON_ONCE(dev->msix_enabled))
> return -EINVAL;
>
> + /* Check MSI-X early on irq domain enabled architectures */
> + if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY))
> + return -ENOTSUPP;
> +
> if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
> return -EINVAL;
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 35/39] PCI/MSI: Reject MSI-X early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 18:00 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:11PM +0100, Thomas Gleixner wrote:
> Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
> attached to the device which does not support MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 4 ++++
> 1 file changed, 4 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 35/39] PCI/MSI: Reject MSI-X early
@ 2022-11-16 18:00 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:11PM +0100, Thomas Gleixner wrote:
> Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
> attached to the device which does not support MSI-X.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 4 ++++
> 1 file changed, 4 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Reject MSI-X early
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 99f3d279765725920aa5924fa445537a20129a6f
Gitweb: https://git.kernel.org/tip/99f3d279765725920aa5924fa445537a20129a6f
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:11 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
PCI/MSI: Reject MSI-X early
Similar to PCI multi-MSI reject MSI-X enablement when a irq domain is
attached to the device which does not support MSI-X.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.631728309@linutronix.de
---
drivers/pci/msi/msi.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index bc84647..0740acd 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -762,6 +762,10 @@ int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int
if (WARN_ON_ONCE(dev->msix_enabled))
return -EINVAL;
+ /* Check MSI-X early on irq domain enabled architectures */
+ if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY))
+ return -ENOTSUPP;
+
if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0)
return -EINVAL;
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [PATCH] x86/xen: Set MSI_FLAG_PCI_MSIX support in Xen MSI domain
2022-11-11 13:55 ` Thomas Gleixner
@ 2023-01-15 22:14 ` David Woodhouse
-1 siblings, 0 replies; 283+ messages in thread
From: David Woodhouse @ 2023-01-15 22:14 UTC (permalink / raw)
To: Thomas Gleixner, LKML, xen-devel, Juergen Gross
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
[-- Attachment #1: Type: text/plain, Size: 1642 bytes --]
The Xen MSI → PIRQ magic does support MSI-X, so advertise it.
(In fact it's better off with MSI-X than MSI, because it's actually
broken by design for 32-bit MSI, since it puts the high bits of the
PIRQ# into the high 32 bits of the MSI message address, instead of the
Extended Destination ID field which is in bits 4-11.
Strictly speaking, this really fixes a much older commit 2e4386eba0c0
("x86/xen: Wrap XEN MSI management into irqdomain") which failed to set
the flag. But that never really mattered until __pci_enable_msix_range()
started to check and bail out early. So in 6.2-rc we see failures e.g.
to bring up networking on an Amazon EC2 m4.16xlarge instance:
[ 41.498694] ena 0000:00:03.0 (unnamed net_device) (uninitialized): Failed to enable MSI-X. irq_cnt -524
[ 41.498705] ena 0000:00:03.0: Can not reserve msix vectors
[ 41.498712] ena 0000:00:03.0: Failed to enable and set the admin interrupts
Side note: This is the first bug found, and first patch tested, by running
Xen guests under QEMU/KVM instead of running under actual Xen.
Fixes: 99f3d2797657 ("PCI/MSI: Reject MSI-X early")
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
arch/x86/pci/xen.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index b94f727251b6..790550479831 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -433,6 +433,7 @@ static struct msi_domain_ops xen_pci_msi_domain_ops = {
};
static struct msi_domain_info xen_pci_msi_domain_info = {
+ .flags = MSI_FLAG_PCI_MSIX,
.ops = &xen_pci_msi_domain_ops,
};
--
2.34.1
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [PATCH] x86/xen: Set MSI_FLAG_PCI_MSIX support in Xen MSI domain
@ 2023-01-15 22:14 ` David Woodhouse
0 siblings, 0 replies; 283+ messages in thread
From: David Woodhouse @ 2023-01-15 22:14 UTC (permalink / raw)
To: Thomas Gleixner, LKML, xen-devel, Juergen Gross
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
[-- Attachment #1: Type: text/plain, Size: 1642 bytes --]
The Xen MSI → PIRQ magic does support MSI-X, so advertise it.
(In fact it's better off with MSI-X than MSI, because it's actually
broken by design for 32-bit MSI, since it puts the high bits of the
PIRQ# into the high 32 bits of the MSI message address, instead of the
Extended Destination ID field which is in bits 4-11.
Strictly speaking, this really fixes a much older commit 2e4386eba0c0
("x86/xen: Wrap XEN MSI management into irqdomain") which failed to set
the flag. But that never really mattered until __pci_enable_msix_range()
started to check and bail out early. So in 6.2-rc we see failures e.g.
to bring up networking on an Amazon EC2 m4.16xlarge instance:
[ 41.498694] ena 0000:00:03.0 (unnamed net_device) (uninitialized): Failed to enable MSI-X. irq_cnt -524
[ 41.498705] ena 0000:00:03.0: Can not reserve msix vectors
[ 41.498712] ena 0000:00:03.0: Failed to enable and set the admin interrupts
Side note: This is the first bug found, and first patch tested, by running
Xen guests under QEMU/KVM instead of running under actual Xen.
Fixes: 99f3d2797657 ("PCI/MSI: Reject MSI-X early")
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
arch/x86/pci/xen.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index b94f727251b6..790550479831 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -433,6 +433,7 @@ static struct msi_domain_ops xen_pci_msi_domain_ops = {
};
static struct msi_domain_info xen_pci_msi_domain_info = {
+ .flags = MSI_FLAG_PCI_MSIX,
.ops = &xen_pci_msi_domain_ops,
};
--
2.34.1
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [tip: x86/urgent] x86/pci/xen: Set MSI_FLAG_PCI_MSIX support in Xen MSI domain
2023-01-15 22:14 ` David Woodhouse
(?)
@ 2023-01-16 19:43 ` tip-bot2 for David Woodhouse
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for David Woodhouse @ 2023-01-16 19:43 UTC (permalink / raw)
To: linux-tip-commits; +Cc: David Woodhouse, Thomas Gleixner, x86, linux-kernel
The following commit has been merged into the x86/urgent branch of tip:
Commit-ID: 0a3a58de319552525507a3497da86df039a5e4e0
Gitweb: https://git.kernel.org/tip/0a3a58de319552525507a3497da86df039a5e4e0
Author: David Woodhouse <dwmw2@infradead.org>
AuthorDate: Sun, 15 Jan 2023 22:14:19
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Mon, 16 Jan 2023 20:40:44 +01:00
x86/pci/xen: Set MSI_FLAG_PCI_MSIX support in Xen MSI domain
The Xen MSI → PIRQ magic does support MSI-X, so advertise it.
(In fact it's better off with MSI-X than MSI, because it's actually
broken by design for 32-bit MSI, since it puts the high bits of the
PIRQ# into the high 32 bits of the MSI message address, instead of the
Extended Destination ID field which is in bits 4-11.
Strictly speaking, this really fixes a much older commit 2e4386eba0c0
("x86/xen: Wrap XEN MSI management into irqdomain") which failed to set
the flag. But that never really mattered until __pci_enable_msix_range()
started to check and bail out early. So in 6.2-rc we see failures e.g.
to bring up networking on an Amazon EC2 m4.16xlarge instance:
[ 41.498694] ena 0000:00:03.0 (unnamed net_device) (uninitialized): Failed to enable MSI-X. irq_cnt -524
[ 41.498705] ena 0000:00:03.0: Can not reserve msix vectors
[ 41.498712] ena 0000:00:03.0: Failed to enable and set the admin interrupts
Side note: This is the first bug found, and first patch tested, by running
Xen guests under QEMU/KVM instead of running under actual Xen.
Fixes: 99f3d2797657 ("PCI/MSI: Reject MSI-X early")
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/4bffa69a949bfdc92c4a18e5a1c3cbb3b94a0d32.camel@infradead.org
---
arch/x86/pci/xen.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index b94f727..7905504 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -433,6 +433,7 @@ static struct msi_domain_ops xen_pci_msi_domain_ops = {
};
static struct msi_domain_info xen_pci_msi_domain_info = {
+ .flags = MSI_FLAG_PCI_MSIX,
.ops = &xen_pci_msi_domain_ops,
};
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
With interrupt domains the sanity check for MSI-X vector validation can be
done _before_ any allocation happens. The sanity check only applies to the
allocation functions which have an 'entries' array argument. The entries
array is filled by the caller with the requested MSI-X indicies. Some drivers
have gaps in the index space which is not supported on all architectures.
The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
during the allocation phase.
Just do it right away before doing any other work along with the other
sanity checks on that array.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -725,13 +725,17 @@ static int msix_capability_init(struct p
return ret;
}
-static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
+static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries,
+ int nvec, int hwsize)
{
+ bool nogap;
int i, j;
if (!entries)
return true;
+ nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY);
+
for (i = 0; i < nvec; i++) {
/* Entry within hardware limit? */
if (entries[i].entry >= hwsize)
@@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(st
if (entries[i].entry == entries[j].entry)
return false;
}
+ /* Check for unsupported gaps */
+ if (nogap && entries[i].entry != i)
+ return false;
}
return true;
}
@@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_d
if (hwsize < 0)
return hwsize;
- if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
return -EINVAL;
/* PCI_IRQ_VIRTUAL is a horrible hack! */
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
With interrupt domains the sanity check for MSI-X vector validation can be
done _before_ any allocation happens. The sanity check only applies to the
allocation functions which have an 'entries' array argument. The entries
array is filled by the caller with the requested MSI-X indicies. Some drivers
have gaps in the index space which is not supported on all architectures.
The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
during the allocation phase.
Just do it right away before doing any other work along with the other
sanity checks on that array.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/msi.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -725,13 +725,17 @@ static int msix_capability_init(struct p
return ret;
}
-static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
+static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries,
+ int nvec, int hwsize)
{
+ bool nogap;
int i, j;
if (!entries)
return true;
+ nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY);
+
for (i = 0; i < nvec; i++) {
/* Entry within hardware limit? */
if (entries[i].entry >= hwsize)
@@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(st
if (entries[i].entry == entries[j].entry)
return false;
}
+ /* Check for unsupported gaps */
+ if (nogap && entries[i].entry != i)
+ return false;
}
return true;
}
@@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_d
if (hwsize < 0)
return hwsize;
- if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
return -EINVAL;
/* PCI_IRQ_VIRTUAL is a horrible hack! */
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:33 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:33 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:12PM +0100, Thomas Gleixner wrote:
> With interrupt domains the sanity check for MSI-X vector validation can be
> done _before_ any allocation happens. The sanity check only applies to the
> allocation functions which have an 'entries' array argument. The entries
> array is filled by the caller with the requested MSI-X indicies. Some drivers
> have gaps in the index space which is not supported on all architectures.
>
> The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
> during the allocation phase.
>
> Just do it right away before doing any other work along with the other
> sanity checks on that array.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
s/indicies/indices/ (commit log)
s/irqdomain/irq domain/? IIRC previous logs used "irq domain"
s/MSIX/MSI-X/ (subject line)
> ---
> drivers/pci/msi/msi.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -725,13 +725,17 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
> +static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries,
> + int nvec, int hwsize)
> {
> + bool nogap;
> int i, j;
>
> if (!entries)
> return true;
>
> + nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY);
> +
> for (i = 0; i < nvec; i++) {
> /* Entry within hardware limit? */
> if (entries[i].entry >= hwsize)
> @@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(st
> if (entries[i].entry == entries[j].entry)
> return false;
> }
> + /* Check for unsupported gaps */
> + if (nogap && entries[i].entry != i)
> + return false;
> }
> return true;
> }
> @@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_d
> if (hwsize < 0)
> return hwsize;
>
> - if (!pci_msix_validate_entries(entries, nvec, hwsize))
> + if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
> return -EINVAL;
>
> /* PCI_IRQ_VIRTUAL is a horrible hack! */
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
@ 2022-11-16 16:33 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:33 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:12PM +0100, Thomas Gleixner wrote:
> With interrupt domains the sanity check for MSI-X vector validation can be
> done _before_ any allocation happens. The sanity check only applies to the
> allocation functions which have an 'entries' array argument. The entries
> array is filled by the caller with the requested MSI-X indicies. Some drivers
> have gaps in the index space which is not supported on all architectures.
>
> The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
> during the allocation phase.
>
> Just do it right away before doing any other work along with the other
> sanity checks on that array.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
s/indicies/indices/ (commit log)
s/irqdomain/irq domain/? IIRC previous logs used "irq domain"
s/MSIX/MSI-X/ (subject line)
> ---
> drivers/pci/msi/msi.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> --- a/drivers/pci/msi/msi.c
> +++ b/drivers/pci/msi/msi.c
> @@ -725,13 +725,17 @@ static int msix_capability_init(struct p
> return ret;
> }
>
> -static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
> +static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries,
> + int nvec, int hwsize)
> {
> + bool nogap;
> int i, j;
>
> if (!entries)
> return true;
>
> + nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY);
> +
> for (i = 0; i < nvec; i++) {
> /* Entry within hardware limit? */
> if (entries[i].entry >= hwsize)
> @@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(st
> if (entries[i].entry == entries[j].entry)
> return false;
> }
> + /* Check for unsupported gaps */
> + if (nogap && entries[i].entry != i)
> + return false;
> }
> return true;
> }
> @@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_d
> if (hwsize < 0)
> return hwsize;
>
> - if (!pci_msix_validate_entries(entries, nvec, hwsize))
> + if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
> return -EINVAL;
>
> /* PCI_IRQ_VIRTUAL is a horrible hack! */
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 18:00 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:12PM +0100, Thomas Gleixner wrote:
> With interrupt domains the sanity check for MSI-X vector validation can be
> done _before_ any allocation happens. The sanity check only applies to the
> allocation functions which have an 'entries' array argument. The entries
> array is filled by the caller with the requested MSI-X indicies. Some drivers
> have gaps in the index space which is not supported on all architectures.
>
> The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
> during the allocation phase.
>
> Just do it right away before doing any other work along with the other
> sanity checks on that array.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 36/39] PCI/MSI: Validate MSIX contiguous restriction early
@ 2022-11-16 18:00 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:00 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:12PM +0100, Thomas Gleixner wrote:
> With interrupt domains the sanity check for MSI-X vector validation can be
> done _before_ any allocation happens. The sanity check only applies to the
> allocation functions which have an 'entries' array argument. The entries
> array is filled by the caller with the requested MSI-X indicies. Some drivers
> have gaps in the index space which is not supported on all architectures.
>
> The PCI/MSI irqdomain has a 'feature' bit to enforce this validation late
> during the allocation phase.
>
> Just do it right away before doing any other work along with the other
> sanity checks on that array.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/msi.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Validate MSI-X contiguous restriction early
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 4644d22eb673f173252610a93aaaba4c2bff7b41
Gitweb: https://git.kernel.org/tip/4644d22eb673f173252610a93aaaba4c2bff7b41
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:12 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
PCI/MSI: Validate MSI-X contiguous restriction early
With interrupt domains the sanity check for MSI-X vector validation can be
done _before_ any allocation happens. The sanity check only applies to the
allocation functions which have an 'entries' array argument. The entries
array is filled by the caller with the requested MSI-X indices. Some drivers
have gaps in the index space which is not supported on all architectures.
The PCI/MSI irq domain has a 'feature' bit to enforce this validation late
during the allocation phase.
Just do it right away before doing any other work along with the other
sanity checks on that array.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.691357406@linutronix.de
---
drivers/pci/msi/msi.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 0740acd..b94f6da 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -725,13 +725,17 @@ out_disable:
return ret;
}
-static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int hwsize)
+static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries,
+ int nvec, int hwsize)
{
+ bool nogap;
int i, j;
if (!entries)
return true;
+ nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY);
+
for (i = 0; i < nvec; i++) {
/* Entry within hardware limit? */
if (entries[i].entry >= hwsize)
@@ -742,6 +746,9 @@ static bool pci_msix_validate_entries(struct msix_entry *entries, int nvec, int
if (entries[i].entry == entries[j].entry)
return false;
}
+ /* Check for unsupported gaps */
+ if (nogap && entries[i].entry != i)
+ return false;
}
return true;
}
@@ -773,7 +780,7 @@ int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int
if (hwsize < 0)
return hwsize;
- if (!pci_msix_validate_entries(entries, nvec, hwsize))
+ if (!pci_msix_validate_entries(dev, entries, nvec, hwsize))
return -EINVAL;
/* PCI_IRQ_VIRTUAL is a horrible hack! */
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
All these sanity checks are now done _before_ any allocation work
happens. No point in doing it twice.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
1 file changed, 48 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -64,51 +64,6 @@ static irq_hw_number_t pci_msi_domain_ca
(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
}
-static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
-{
- return !desc->pci.msi_attrib.is_msix && desc->nvec_used > 1;
-}
-
-/**
- * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
- * for @dev
- * @domain: The interrupt domain to check
- * @info: The domain info for verification
- * @dev: The device to check
- *
- * Returns:
- * 0 if the functionality is supported
- * 1 if Multi MSI is requested, but the domain does not support it
- * -ENOTSUPP otherwise
- */
-static int pci_msi_domain_check_cap(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- struct msi_desc *desc = msi_first_desc(dev, MSI_DESC_ALL);
-
- /* Special handling to support __pci_enable_msi_range() */
- if (pci_msi_desc_is_multi_msi(desc) &&
- !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
- return 1;
-
- if (desc->pci.msi_attrib.is_msix) {
- if (!(info->flags & MSI_FLAG_PCI_MSIX))
- return -ENOTSUPP;
-
- if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
- unsigned int idx = 0;
-
- /* Check for gaps in the entry indices */
- msi_for_each_desc(desc, dev, MSI_DESC_ALL) {
- if (desc->msi_index != idx++)
- return -ENOTSUPP;
- }
- }
- }
- return 0;
-}
-
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
struct msi_desc *desc)
{
@@ -118,7 +73,6 @@ static void pci_msi_domain_set_desc(msi_
static struct msi_domain_ops pci_msi_domain_ops_default = {
.set_desc = pci_msi_domain_set_desc,
- .msi_check = pci_msi_domain_check_cap,
};
static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
@@ -130,8 +84,6 @@ static void pci_msi_domain_update_dom_op
} else {
if (ops->set_desc == NULL)
ops->set_desc = pci_msi_domain_set_desc;
- if (ops->msi_check == NULL)
- ops->msi_check = pci_msi_domain_check_cap;
}
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
All these sanity checks are now done _before_ any allocation work
happens. No point in doing it twice.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
1 file changed, 48 deletions(-)
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -64,51 +64,6 @@ static irq_hw_number_t pci_msi_domain_ca
(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
}
-static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
-{
- return !desc->pci.msi_attrib.is_msix && desc->nvec_used > 1;
-}
-
-/**
- * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
- * for @dev
- * @domain: The interrupt domain to check
- * @info: The domain info for verification
- * @dev: The device to check
- *
- * Returns:
- * 0 if the functionality is supported
- * 1 if Multi MSI is requested, but the domain does not support it
- * -ENOTSUPP otherwise
- */
-static int pci_msi_domain_check_cap(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- struct msi_desc *desc = msi_first_desc(dev, MSI_DESC_ALL);
-
- /* Special handling to support __pci_enable_msi_range() */
- if (pci_msi_desc_is_multi_msi(desc) &&
- !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
- return 1;
-
- if (desc->pci.msi_attrib.is_msix) {
- if (!(info->flags & MSI_FLAG_PCI_MSIX))
- return -ENOTSUPP;
-
- if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
- unsigned int idx = 0;
-
- /* Check for gaps in the entry indices */
- msi_for_each_desc(desc, dev, MSI_DESC_ALL) {
- if (desc->msi_index != idx++)
- return -ENOTSUPP;
- }
- }
- }
- return 0;
-}
-
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
struct msi_desc *desc)
{
@@ -118,7 +73,6 @@ static void pci_msi_domain_set_desc(msi_
static struct msi_domain_ops pci_msi_domain_ops_default = {
.set_desc = pci_msi_domain_set_desc,
- .msi_check = pci_msi_domain_check_cap,
};
static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
@@ -130,8 +84,6 @@ static void pci_msi_domain_update_dom_op
} else {
if (ops->set_desc == NULL)
ops->set_desc = pci_msi_domain_set_desc;
- if (ops->msi_check == NULL)
- ops->msi_check = pci_msi_domain_check_cap;
}
}
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 16:34 ` Bjorn Helgaas
-1 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:34 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
LKML, Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:14PM +0100, Thomas Gleixner wrote:
> All these sanity checks are now done _before_ any allocation work
> happens. No point in doing it twice.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
> 1 file changed, 48 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -64,51 +64,6 @@ static irq_hw_number_t pci_msi_domain_ca
> (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
> }
>
> -static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
> -{
> - return !desc->pci.msi_attrib.is_msix && desc->nvec_used > 1;
> -}
> -
> -/**
> - * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
> - * for @dev
> - * @domain: The interrupt domain to check
> - * @info: The domain info for verification
> - * @dev: The device to check
> - *
> - * Returns:
> - * 0 if the functionality is supported
> - * 1 if Multi MSI is requested, but the domain does not support it
> - * -ENOTSUPP otherwise
> - */
> -static int pci_msi_domain_check_cap(struct irq_domain *domain,
> - struct msi_domain_info *info,
> - struct device *dev)
> -{
> - struct msi_desc *desc = msi_first_desc(dev, MSI_DESC_ALL);
> -
> - /* Special handling to support __pci_enable_msi_range() */
> - if (pci_msi_desc_is_multi_msi(desc) &&
> - !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
> - return 1;
> -
> - if (desc->pci.msi_attrib.is_msix) {
> - if (!(info->flags & MSI_FLAG_PCI_MSIX))
> - return -ENOTSUPP;
> -
> - if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
> - unsigned int idx = 0;
> -
> - /* Check for gaps in the entry indices */
> - msi_for_each_desc(desc, dev, MSI_DESC_ALL) {
> - if (desc->msi_index != idx++)
> - return -ENOTSUPP;
> - }
> - }
> - }
> - return 0;
> -}
> -
> static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
> struct msi_desc *desc)
> {
> @@ -118,7 +73,6 @@ static void pci_msi_domain_set_desc(msi_
>
> static struct msi_domain_ops pci_msi_domain_ops_default = {
> .set_desc = pci_msi_domain_set_desc,
> - .msi_check = pci_msi_domain_check_cap,
> };
>
> static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
> @@ -130,8 +84,6 @@ static void pci_msi_domain_update_dom_op
> } else {
> if (ops->set_desc == NULL)
> ops->set_desc = pci_msi_domain_set_desc;
> - if (ops->msi_check == NULL)
> - ops->msi_check = pci_msi_domain_check_cap;
> }
> }
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
@ 2022-11-16 16:34 ` Bjorn Helgaas
0 siblings, 0 replies; 283+ messages in thread
From: Bjorn Helgaas @ 2022-11-16 16:34 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:14PM +0100, Thomas Gleixner wrote:
> All these sanity checks are now done _before_ any allocation work
> happens. No point in doing it twice.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
> 1 file changed, 48 deletions(-)
>
> --- a/drivers/pci/msi/irqdomain.c
> +++ b/drivers/pci/msi/irqdomain.c
> @@ -64,51 +64,6 @@ static irq_hw_number_t pci_msi_domain_ca
> (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
> }
>
> -static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
> -{
> - return !desc->pci.msi_attrib.is_msix && desc->nvec_used > 1;
> -}
> -
> -/**
> - * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
> - * for @dev
> - * @domain: The interrupt domain to check
> - * @info: The domain info for verification
> - * @dev: The device to check
> - *
> - * Returns:
> - * 0 if the functionality is supported
> - * 1 if Multi MSI is requested, but the domain does not support it
> - * -ENOTSUPP otherwise
> - */
> -static int pci_msi_domain_check_cap(struct irq_domain *domain,
> - struct msi_domain_info *info,
> - struct device *dev)
> -{
> - struct msi_desc *desc = msi_first_desc(dev, MSI_DESC_ALL);
> -
> - /* Special handling to support __pci_enable_msi_range() */
> - if (pci_msi_desc_is_multi_msi(desc) &&
> - !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
> - return 1;
> -
> - if (desc->pci.msi_attrib.is_msix) {
> - if (!(info->flags & MSI_FLAG_PCI_MSIX))
> - return -ENOTSUPP;
> -
> - if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
> - unsigned int idx = 0;
> -
> - /* Check for gaps in the entry indices */
> - msi_for_each_desc(desc, dev, MSI_DESC_ALL) {
> - if (desc->msi_index != idx++)
> - return -ENOTSUPP;
> - }
> - }
> - }
> - return 0;
> -}
> -
> static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
> struct msi_desc *desc)
> {
> @@ -118,7 +73,6 @@ static void pci_msi_domain_set_desc(msi_
>
> static struct msi_domain_ops pci_msi_domain_ops_default = {
> .set_desc = pci_msi_domain_set_desc,
> - .msi_check = pci_msi_domain_check_cap,
> };
>
> static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
> @@ -130,8 +84,6 @@ static void pci_msi_domain_update_dom_op
> } else {
> if (ops->set_desc == NULL)
> ops->set_desc = pci_msi_domain_set_desc;
> - if (ops->msi_check == NULL)
> - ops->msi_check = pci_msi_domain_check_cap;
> }
> }
>
>
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 18:01 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:01 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:14PM +0100, Thomas Gleixner wrote:
> All these sanity checks are now done _before_ any allocation work
> happens. No point in doing it twice.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
> 1 file changed, 48 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Much clearer this way
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 37/39] PCI/MSI: Remove redundant msi_check() callback
@ 2022-11-16 18:01 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:01 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:14PM +0100, Thomas Gleixner wrote:
> All these sanity checks are now done _before_ any allocation work
> happens. No point in doing it twice.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/pci/msi/irqdomain.c | 48 --------------------------------------------
> 1 file changed, 48 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Much clearer this way
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] PCI/MSI: Remove redundant msi_check() callback
2022-11-11 13:55 ` Thomas Gleixner
` (2 preceding siblings ...)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, Bjorn Helgaas, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 9c03b2589da2b2b259a960f2a325731f6b38d115
Gitweb: https://git.kernel.org/tip/9c03b2589da2b2b259a960f2a325731f6b38d115
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:14 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
PCI/MSI: Remove redundant msi_check() callback
All these sanity checks are now done _before_ any allocation work
happens. No point in doing it twice.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20221111122015.749446904@linutronix.de
---
drivers/pci/msi/irqdomain.c | 48 +------------------------------------
1 file changed, 48 deletions(-)
diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c
index 666ed21..dea2e8c 100644
--- a/drivers/pci/msi/irqdomain.c
+++ b/drivers/pci/msi/irqdomain.c
@@ -64,51 +64,6 @@ static irq_hw_number_t pci_msi_domain_calc_hwirq(struct msi_desc *desc)
(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
}
-static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
-{
- return !desc->pci.msi_attrib.is_msix && desc->nvec_used > 1;
-}
-
-/**
- * pci_msi_domain_check_cap - Verify that @domain supports the capabilities
- * for @dev
- * @domain: The interrupt domain to check
- * @info: The domain info for verification
- * @dev: The device to check
- *
- * Returns:
- * 0 if the functionality is supported
- * 1 if Multi MSI is requested, but the domain does not support it
- * -ENOTSUPP otherwise
- */
-static int pci_msi_domain_check_cap(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- struct msi_desc *desc = msi_first_desc(dev, MSI_DESC_ALL);
-
- /* Special handling to support __pci_enable_msi_range() */
- if (pci_msi_desc_is_multi_msi(desc) &&
- !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
- return 1;
-
- if (desc->pci.msi_attrib.is_msix) {
- if (!(info->flags & MSI_FLAG_PCI_MSIX))
- return -ENOTSUPP;
-
- if (info->flags & MSI_FLAG_MSIX_CONTIGUOUS) {
- unsigned int idx = 0;
-
- /* Check for gaps in the entry indices */
- msi_for_each_desc(desc, dev, MSI_DESC_ALL) {
- if (desc->msi_index != idx++)
- return -ENOTSUPP;
- }
- }
- }
- return 0;
-}
-
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
struct msi_desc *desc)
{
@@ -118,7 +73,6 @@ static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
static struct msi_domain_ops pci_msi_domain_ops_default = {
.set_desc = pci_msi_domain_set_desc,
- .msi_check = pci_msi_domain_check_cap,
};
static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
@@ -130,8 +84,6 @@ static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
} else {
if (ops->set_desc == NULL)
ops->set_desc = pci_msi_domain_set_desc;
- if (ops->msi_check == NULL)
- ops->msi_check = pci_msi_domain_check_cap;
}
}
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 38/39] genirq/msi: Remove msi_domain_ops::msi_check()
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
No more users.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 17 +----------------
2 files changed, 1 insertion(+), 20 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -288,7 +288,6 @@ struct msi_domain_info;
* @get_hwirq: Retrieve the resulting hw irq number
* @msi_init: Domain specific init function for MSI interrupts
* @msi_free: Domain specific function to free a MSI interrupts
- * @msi_check: Callback for verification of the domain/info/dev data
* @msi_prepare: Prepare the allocation of the interrupts in the domain
* @set_desc: Set the msi descriptor for an interrupt
* @domain_alloc_irqs: Optional function to override the default allocation
@@ -326,9 +325,6 @@ struct msi_domain_ops {
void (*msi_free)(struct irq_domain *domain,
struct msi_domain_info *info,
unsigned int virq);
- int (*msi_check)(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev);
int (*msi_prepare)(struct irq_domain *domain,
struct device *dev, int nvec,
msi_alloc_info_t *arg);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -617,17 +617,9 @@ static int msi_domain_ops_init(struct ir
return 0;
}
-static int msi_domain_ops_check(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- return 0;
-}
-
static struct msi_domain_ops msi_domain_ops_default = {
.get_hwirq = msi_domain_ops_get_hwirq,
.msi_init = msi_domain_ops_init,
- .msi_check = msi_domain_ops_check,
.msi_prepare = msi_domain_ops_prepare,
.set_desc = msi_domain_ops_set_desc,
.domain_alloc_irqs = __msi_domain_alloc_irqs,
@@ -655,8 +647,6 @@ static void msi_domain_update_dom_ops(st
ops->get_hwirq = msi_domain_ops_default.get_hwirq;
if (ops->msi_init == NULL)
ops->msi_init = msi_domain_ops_default.msi_init;
- if (ops->msi_check == NULL)
- ops->msi_check = msi_domain_ops_default.msi_check;
if (ops->msi_prepare == NULL)
ops->msi_prepare = msi_domain_ops_default.msi_prepare;
if (ops->set_desc == NULL)
@@ -707,13 +697,8 @@ int msi_domain_prepare_irqs(struct irq_d
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
- int ret;
-
- ret = ops->msi_check(domain, info, dev);
- if (ret == 0)
- ret = ops->msi_prepare(domain, dev, nvec, arg);
- return ret;
+ return ops->msi_prepare(domain, dev, nvec, arg);
}
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 38/39] genirq/msi: Remove msi_domain_ops::msi_check()
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
No more users.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 17 +----------------
2 files changed, 1 insertion(+), 20 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -288,7 +288,6 @@ struct msi_domain_info;
* @get_hwirq: Retrieve the resulting hw irq number
* @msi_init: Domain specific init function for MSI interrupts
* @msi_free: Domain specific function to free a MSI interrupts
- * @msi_check: Callback for verification of the domain/info/dev data
* @msi_prepare: Prepare the allocation of the interrupts in the domain
* @set_desc: Set the msi descriptor for an interrupt
* @domain_alloc_irqs: Optional function to override the default allocation
@@ -326,9 +325,6 @@ struct msi_domain_ops {
void (*msi_free)(struct irq_domain *domain,
struct msi_domain_info *info,
unsigned int virq);
- int (*msi_check)(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev);
int (*msi_prepare)(struct irq_domain *domain,
struct device *dev, int nvec,
msi_alloc_info_t *arg);
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -617,17 +617,9 @@ static int msi_domain_ops_init(struct ir
return 0;
}
-static int msi_domain_ops_check(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- return 0;
-}
-
static struct msi_domain_ops msi_domain_ops_default = {
.get_hwirq = msi_domain_ops_get_hwirq,
.msi_init = msi_domain_ops_init,
- .msi_check = msi_domain_ops_check,
.msi_prepare = msi_domain_ops_prepare,
.set_desc = msi_domain_ops_set_desc,
.domain_alloc_irqs = __msi_domain_alloc_irqs,
@@ -655,8 +647,6 @@ static void msi_domain_update_dom_ops(st
ops->get_hwirq = msi_domain_ops_default.get_hwirq;
if (ops->msi_init == NULL)
ops->msi_init = msi_domain_ops_default.msi_init;
- if (ops->msi_check == NULL)
- ops->msi_check = msi_domain_ops_default.msi_check;
if (ops->msi_prepare == NULL)
ops->msi_prepare = msi_domain_ops_default.msi_prepare;
if (ops->set_desc == NULL)
@@ -707,13 +697,8 @@ int msi_domain_prepare_irqs(struct irq_d
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
- int ret;
-
- ret = ops->msi_check(domain, info, dev);
- if (ret == 0)
- ret = ops->msi_prepare(domain, dev, nvec, arg);
- return ret;
+ return ops->msi_prepare(domain, dev, nvec, arg);
}
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 38/39] genirq/msi: Remove msi_domain_ops::msi_check()
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 18:01 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:01 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:15PM +0100, Thomas Gleixner wrote:
> No more users.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 4 ----
> kernel/irq/msi.c | 17 +----------------
> 2 files changed, 1 insertion(+), 20 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 38/39] genirq/msi: Remove msi_domain_ops::msi_check()
@ 2022-11-16 18:01 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:01 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:15PM +0100, Thomas Gleixner wrote:
> No more users.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 4 ----
> kernel/irq/msi.c | 17 +----------------
> 2 files changed, 1 insertion(+), 20 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] genirq/msi: Remove msi_domain_ops:: Msi_check()
2022-11-11 13:55 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: 2569f62ca473584a8ba389f455fc00805389f7da
Gitweb: https://git.kernel.org/tip/2569f62ca473584a8ba389f455fc00805389f7da
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:15 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
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
---
include/linux/msi.h | 4 ----
kernel/irq/msi.c | 17 +----------------
2 files changed, 1 insertion(+), 20 deletions(-)
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 8b28714..1ce9d5e 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -292,7 +292,6 @@ struct msi_domain_info;
* @get_hwirq: Retrieve the resulting hw irq number
* @msi_init: Domain specific init function for MSI interrupts
* @msi_free: Domain specific function to free a MSI interrupts
- * @msi_check: Callback for verification of the domain/info/dev data
* @msi_prepare: Prepare the allocation of the interrupts in the domain
* @set_desc: Set the msi descriptor for an interrupt
* @domain_alloc_irqs: Optional function to override the default allocation
@@ -330,9 +329,6 @@ struct msi_domain_ops {
void (*msi_free)(struct irq_domain *domain,
struct msi_domain_info *info,
unsigned int virq);
- int (*msi_check)(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev);
int (*msi_prepare)(struct irq_domain *domain,
struct device *dev, int nvec,
msi_alloc_info_t *arg);
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 4fde917..4b99f37 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -617,17 +617,9 @@ static int msi_domain_ops_init(struct irq_domain *domain,
return 0;
}
-static int msi_domain_ops_check(struct irq_domain *domain,
- struct msi_domain_info *info,
- struct device *dev)
-{
- return 0;
-}
-
static struct msi_domain_ops msi_domain_ops_default = {
.get_hwirq = msi_domain_ops_get_hwirq,
.msi_init = msi_domain_ops_init,
- .msi_check = msi_domain_ops_check,
.msi_prepare = msi_domain_ops_prepare,
.set_desc = msi_domain_ops_set_desc,
.domain_alloc_irqs = __msi_domain_alloc_irqs,
@@ -655,8 +647,6 @@ static void msi_domain_update_dom_ops(struct msi_domain_info *info)
ops->get_hwirq = msi_domain_ops_default.get_hwirq;
if (ops->msi_init == NULL)
ops->msi_init = msi_domain_ops_default.msi_init;
- if (ops->msi_check == NULL)
- ops->msi_check = msi_domain_ops_default.msi_check;
if (ops->msi_prepare == NULL)
ops->msi_prepare = msi_domain_ops_default.msi_prepare;
if (ops->set_desc == NULL)
@@ -707,13 +697,8 @@ int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
{
struct msi_domain_info *info = domain->host_data;
struct msi_domain_ops *ops = info->ops;
- int ret;
-
- ret = ops->msi_check(domain, info, dev);
- if (ret == 0)
- ret = ops->msi_prepare(domain, dev, nvec, arg);
- return ret;
+ return ops->msi_prepare(domain, dev, nvec, arg);
}
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
^ permalink raw reply related [flat|nested] 283+ messages in thread
* [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-11 13:55 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Jason Gunthorpe, Allen Hubbe, Kevin Tian,
Ahmed S. Darwish, Jon Mason, linuxppc-dev, Alex Williamson,
Bjorn Helgaas, Dan Williams, Reinette Chatre, Greg Kroah-Hartman,
Marc Zyngier, Logan Gunthorpe
Now that the PCI/MSI core code does early checking for multi-MSI support
X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/include/asm/irqdomain.h | 4 +---
arch/x86/kernel/apic/msi.c | 6 ++----
arch/x86/kernel/apic/vector.c | 4 ----
drivers/iommu/amd/iommu.c | 7 -------
drivers/iommu/intel/irq_remapping.c | 7 -------
drivers/pci/controller/pci-hyperv.c | 15 +--------------
6 files changed, 4 insertions(+), 39 deletions(-)
--- a/arch/x86/include/asm/irqdomain.h
+++ b/arch/x86/include/asm/irqdomain.h
@@ -7,9 +7,7 @@
#ifdef CONFIG_X86_LOCAL_APIC
enum {
- /* Allocate contiguous CPU vectors */
- X86_IRQ_ALLOC_CONTIGUOUS_VECTORS = 0x1,
- X86_IRQ_ALLOC_LEGACY = 0x2,
+ X86_IRQ_ALLOC_LEGACY = 0x1,
};
extern int x86_fwspec_is_ioapic(struct irq_fwspec *fwspec);
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -161,12 +161,10 @@ int pci_msi_prepare(struct irq_domain *d
msi_alloc_info_t *arg)
{
init_irq_alloc_info(arg, NULL);
- if (to_pci_dev(dev)->msix_enabled) {
+ if (to_pci_dev(dev)->msix_enabled)
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
- } else {
+ else
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
- arg->flags |= X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
- }
return 0;
}
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -539,10 +539,6 @@ static int x86_vector_alloc_irqs(struct
if (disable_apic)
return -ENXIO;
- /* Currently vector allocator can't guarantee contiguous allocations */
- if ((info->flags & X86_IRQ_ALLOC_CONTIGUOUS_VECTORS) && nr_irqs > 1)
- return -ENOSYS;
-
/*
* Catch any attempt to touch the cascade interrupt on a PIC
* equipped system.
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3297,13 +3297,6 @@ static int irq_remapping_alloc(struct ir
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
sbdf = get_devid(info);
if (sbdf < 0)
return -EINVAL;
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1337,13 +1337,6 @@ static int intel_irq_remapping_alloc(str
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
if (ret < 0)
return ret;
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -611,20 +611,7 @@ static unsigned int hv_msi_get_int_vecto
return cfg->vector;
}
-static int hv_msi_prepare(struct irq_domain *domain, struct device *dev,
- int nvec, msi_alloc_info_t *info)
-{
- int ret = pci_msi_prepare(domain, dev, nvec, info);
-
- /*
- * By using the interrupt remapper in the hypervisor IOMMU, contiguous
- * CPU vectors is not needed for multi-MSI
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
- return ret;
-}
+#define hv_msi_prepare pci_msi_prepare
/**
* hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current
^ permalink raw reply [flat|nested] 283+ messages in thread
* [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
@ 2022-11-11 13:55 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-11 13:55 UTC (permalink / raw)
To: LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Dave Jiang, Alex Williamson, Kevin Tian,
Dan Williams, Logan Gunthorpe, Ashok Raj, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Reinette Chatre
Now that the PCI/MSI core code does early checking for multi-MSI support
X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/include/asm/irqdomain.h | 4 +---
arch/x86/kernel/apic/msi.c | 6 ++----
arch/x86/kernel/apic/vector.c | 4 ----
drivers/iommu/amd/iommu.c | 7 -------
drivers/iommu/intel/irq_remapping.c | 7 -------
drivers/pci/controller/pci-hyperv.c | 15 +--------------
6 files changed, 4 insertions(+), 39 deletions(-)
--- a/arch/x86/include/asm/irqdomain.h
+++ b/arch/x86/include/asm/irqdomain.h
@@ -7,9 +7,7 @@
#ifdef CONFIG_X86_LOCAL_APIC
enum {
- /* Allocate contiguous CPU vectors */
- X86_IRQ_ALLOC_CONTIGUOUS_VECTORS = 0x1,
- X86_IRQ_ALLOC_LEGACY = 0x2,
+ X86_IRQ_ALLOC_LEGACY = 0x1,
};
extern int x86_fwspec_is_ioapic(struct irq_fwspec *fwspec);
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -161,12 +161,10 @@ int pci_msi_prepare(struct irq_domain *d
msi_alloc_info_t *arg)
{
init_irq_alloc_info(arg, NULL);
- if (to_pci_dev(dev)->msix_enabled) {
+ if (to_pci_dev(dev)->msix_enabled)
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
- } else {
+ else
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
- arg->flags |= X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
- }
return 0;
}
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -539,10 +539,6 @@ static int x86_vector_alloc_irqs(struct
if (disable_apic)
return -ENXIO;
- /* Currently vector allocator can't guarantee contiguous allocations */
- if ((info->flags & X86_IRQ_ALLOC_CONTIGUOUS_VECTORS) && nr_irqs > 1)
- return -ENOSYS;
-
/*
* Catch any attempt to touch the cascade interrupt on a PIC
* equipped system.
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3297,13 +3297,6 @@ static int irq_remapping_alloc(struct ir
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
sbdf = get_devid(info);
if (sbdf < 0)
return -EINVAL;
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1337,13 +1337,6 @@ static int intel_irq_remapping_alloc(str
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
if (ret < 0)
return ret;
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -611,20 +611,7 @@ static unsigned int hv_msi_get_int_vecto
return cfg->vector;
}
-static int hv_msi_prepare(struct irq_domain *domain, struct device *dev,
- int nvec, msi_alloc_info_t *info)
-{
- int ret = pci_msi_prepare(domain, dev, nvec, info);
-
- /*
- * By using the interrupt remapper in the hypervisor IOMMU, contiguous
- * CPU vectors is not needed for multi-MSI
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
- return ret;
-}
+#define hv_msi_prepare pci_msi_prepare
/**
* hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
2022-11-11 13:55 ` Thomas Gleixner
@ 2022-11-16 18:05 ` Jason Gunthorpe
-1 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:05 UTC (permalink / raw)
To: Thomas Gleixner
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
On Fri, Nov 11, 2022 at 02:55:17PM +0100, Thomas Gleixner wrote:
> Now that the PCI/MSI core code does early checking for multi-MSI support
> X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
> Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
@ 2022-11-16 18:05 ` Jason Gunthorpe
0 siblings, 0 replies; 283+ messages in thread
From: Jason Gunthorpe @ 2022-11-16 18:05 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
On Fri, Nov 11, 2022 at 02:55:17PM +0100, Thomas Gleixner wrote:
> Now that the PCI/MSI core code does early checking for multi-MSI support
> X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
> Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
2022-11-16 18:05 ` Jason Gunthorpe
@ 2022-11-17 15:00 ` Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 15:00 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: LKML, x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman, Dave Jiang,
Alex Williamson, Kevin Tian, Dan Williams, Logan Gunthorpe,
Ashok Raj, Jon Mason, Allen Hubbe, Michael Ellerman,
Christophe Leroy, linuxppc-dev, Ahmed S. Darwish,
Reinette Chatre
Jason, Bjorn, Ashok!
On Wed, Nov 16 2022 at 14:05, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:55:17PM +0100, Thomas Gleixner wrote:
>> Now that the PCI/MSI core code does early checking for multi-MSI support
>> X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
>
>> Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Thanks for taking the time to go through this pile!
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* Re: [patch 39/39] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
@ 2022-11-17 15:00 ` Thomas Gleixner
0 siblings, 0 replies; 283+ messages in thread
From: Thomas Gleixner @ 2022-11-17 15:00 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: linux-pci, Will Deacon, Lorenzo Pieralisi, Dave Jiang, Ashok Raj,
Joerg Roedel, x86, Allen Hubbe, Kevin Tian, Ahmed S. Darwish,
Jon Mason, linuxppc-dev, Alex Williamson, Bjorn Helgaas,
Dan Williams, Reinette Chatre, Greg Kroah-Hartman, LKML,
Marc Zyngier, Logan Gunthorpe
Jason, Bjorn, Ashok!
On Wed, Nov 16 2022 at 14:05, Jason Gunthorpe wrote:
> On Fri, Nov 11, 2022 at 02:55:17PM +0100, Thomas Gleixner wrote:
>> Now that the PCI/MSI core code does early checking for multi-MSI support
>> X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
>
>> Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Thanks for taking the time to go through this pile!
tglx
^ permalink raw reply [flat|nested] 283+ messages in thread
* [tip: irq/core] x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
2022-11-11 13:55 ` Thomas Gleixner
(?)
(?)
@ 2022-11-17 15:07 ` tip-bot2 for Thomas Gleixner
-1 siblings, 0 replies; 283+ messages in thread
From: tip-bot2 for Thomas Gleixner @ 2022-11-17 15:07 UTC (permalink / raw)
To: linux-tip-commits
Cc: Thomas Gleixner, Jason Gunthorpe, x86, linux-kernel, maz
The following commit has been merged into the irq/core branch of tip:
Commit-ID: d474d92d70250d43e7ce0c7cb8623f31ee7c40f6
Gitweb: https://git.kernel.org/tip/d474d92d70250d43e7ce0c7cb8623f31ee7c40f6
Author: Thomas Gleixner <tglx@linutronix.de>
AuthorDate: Fri, 11 Nov 2022 14:55:17 +01:00
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Thu, 17 Nov 2022 15:15:22 +01:00
x86/apic: Remove X86_IRQ_ALLOC_CONTIGUOUS_VECTORS
Now that the PCI/MSI core code does early checking for multi-MSI support
X86_IRQ_ALLOC_CONTIGUOUS_VECTORS is not required anymore.
Remove the flag and rely on MSI_FLAG_MULTI_PCI_MSI.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20221111122015.865042356@linutronix.de
---
arch/x86/include/asm/irqdomain.h | 4 +---
arch/x86/kernel/apic/msi.c | 6 ++----
arch/x86/kernel/apic/vector.c | 4 ----
drivers/iommu/amd/iommu.c | 7 -------
drivers/iommu/intel/irq_remapping.c | 7 -------
drivers/pci/controller/pci-hyperv.c | 15 +--------------
6 files changed, 4 insertions(+), 39 deletions(-)
diff --git a/arch/x86/include/asm/irqdomain.h b/arch/x86/include/asm/irqdomain.h
index 125c23b..30c325c 100644
--- a/arch/x86/include/asm/irqdomain.h
+++ b/arch/x86/include/asm/irqdomain.h
@@ -7,9 +7,7 @@
#ifdef CONFIG_X86_LOCAL_APIC
enum {
- /* Allocate contiguous CPU vectors */
- X86_IRQ_ALLOC_CONTIGUOUS_VECTORS = 0x1,
- X86_IRQ_ALLOC_LEGACY = 0x2,
+ X86_IRQ_ALLOC_LEGACY = 0x1,
};
extern int x86_fwspec_is_ioapic(struct irq_fwspec *fwspec);
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 7517eb0..248a6a5 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -161,12 +161,10 @@ int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
msi_alloc_info_t *arg)
{
init_irq_alloc_info(arg, NULL);
- if (to_pci_dev(dev)->msix_enabled) {
+ if (to_pci_dev(dev)->msix_enabled)
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
- } else {
+ else
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
- arg->flags |= X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
- }
return 0;
}
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 3e6f6b4..c1efebd 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -539,10 +539,6 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq,
if (disable_apic)
return -ENXIO;
- /* Currently vector allocator can't guarantee contiguous allocations */
- if ((info->flags & X86_IRQ_ALLOC_CONTIGUOUS_VECTORS) && nr_irqs > 1)
- return -ENOSYS;
-
/*
* Catch any attempt to touch the cascade interrupt on a PIC
* equipped system.
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 8ece864..72dfe57 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -3297,13 +3297,6 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq,
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
sbdf = get_devid(info);
if (sbdf < 0)
return -EINVAL;
diff --git a/drivers/iommu/intel/irq_remapping.c b/drivers/iommu/intel/irq_remapping.c
index 0b80a27..a914eba 100644
--- a/drivers/iommu/intel/irq_remapping.c
+++ b/drivers/iommu/intel/irq_remapping.c
@@ -1337,13 +1337,6 @@ static int intel_irq_remapping_alloc(struct irq_domain *domain,
if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_PCI_MSI)
return -EINVAL;
- /*
- * With IRQ remapping enabled, don't need contiguous CPU vectors
- * to support multiple MSI interrupts.
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
if (ret < 0)
return ret;
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index ba64284..1dee55d 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -611,20 +611,7 @@ static unsigned int hv_msi_get_int_vector(struct irq_data *data)
return cfg->vector;
}
-static int hv_msi_prepare(struct irq_domain *domain, struct device *dev,
- int nvec, msi_alloc_info_t *info)
-{
- int ret = pci_msi_prepare(domain, dev, nvec, info);
-
- /*
- * By using the interrupt remapper in the hypervisor IOMMU, contiguous
- * CPU vectors is not needed for multi-MSI
- */
- if (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI)
- info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
-
- return ret;
-}
+#define hv_msi_prepare pci_msi_prepare
/**
* hv_arch_irq_unmask() - "Unmask" the IRQ by setting its current
^ permalink raw reply related [flat|nested] 283+ messages in thread
* RE: [patch 00/39] genirq, PCI/MSI: Support for per device MSI and PCI/IMS - Part 1 cleanups
2022-11-11 13:54 ` Thomas Gleixner
@ 2022-11-18 7:40 ` Tian, Kevin
-1 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:40 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: x86, Joerg Roedel, Will Deacon, linux-pci, Bjorn Helgaas,
Lorenzo Pieralisi, Marc Zyngier, Greg Kroah-Hartman,
Jason Gunthorpe, Jiang, Dave, Alex Williamson, Williams, Dan J,
Logan Gunthorpe, Raj, Ashok, Jon Mason, Allen Hubbe,
Michael Ellerman, Christophe Leroy, linuxppc-dev,
Ahmed S. Darwish, Chatre, Reinette
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:54 PM
>
> Enough of history and theory. Here comes part 1:
>
> This is just a cleanup and a reorganisation of the PCI/MSI code which
> became quite an unreadable mess over time. There is no intentional
> functional change in this series.
>
> It's just a separate step to make the subsequent changes in the
> infrastructure easier both to implement and to review.
>
> Thanks,
>
> tglx
The entire series looks good to me except a couple nits replied in
individual patches:
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread
* RE: [patch 00/39] genirq, PCI/MSI: Support for per device MSI and PCI/IMS - Part 1 cleanups
@ 2022-11-18 7:40 ` Tian, Kevin
0 siblings, 0 replies; 283+ messages in thread
From: Tian, Kevin @ 2022-11-18 7:40 UTC (permalink / raw)
To: Thomas Gleixner, LKML
Cc: Logan Gunthorpe, Allen Hubbe, Lorenzo Pieralisi, Jiang, Dave,
Raj, Ashok, Greg Kroah-Hartman, linux-pci, Joerg Roedel, x86,
linuxppc-dev, Chatre, Reinette, Alex Williamson, Jason Gunthorpe,
Marc Zyngier, Bjorn Helgaas, Williams, Dan J, Jon Mason,
Will Deacon, Ahmed S. Darwish
> From: Thomas Gleixner <tglx@linutronix.de>
> Sent: Friday, November 11, 2022 9:54 PM
>
> Enough of history and theory. Here comes part 1:
>
> This is just a cleanup and a reorganisation of the PCI/MSI code which
> became quite an unreadable mess over time. There is no intentional
> functional change in this series.
>
> It's just a separate step to make the subsequent changes in the
> infrastructure easier both to implement and to review.
>
> Thanks,
>
> tglx
The entire series looks good to me except a couple nits replied in
individual patches:
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
^ permalink raw reply [flat|nested] 283+ messages in thread