All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Peter Geis <pgwipeout@gmail.com>
Cc: "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Heiko Stuebner" <heiko@sntech.de>,
	"open list:ARM/Rockchip SoC..."
	<linux-rockchip@lists.infradead.org>,
	PCI <linux-pci@vger.kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	arm-mail-list <linux-arm-kernel@lists.infradead.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v7 2/4] PCI: dwc: rockchip: add legacy interrupt support
Date: Sun, 17 Apr 2022 10:53:35 +0100	[thread overview]
Message-ID: <87zgkk9gtc.wl-maz@kernel.org> (raw)
In-Reply-To: <CAMdYzYo+YeAgT92baMOoWpra230wro_WynRcajL-__9RNkeE9Q@mail.gmail.com>

On Sat, 16 Apr 2022 14:24:26 +0100,
Peter Geis <pgwipeout@gmail.com> wrote:
> 
> On Sat, Apr 16, 2022 at 8:54 AM Marc Zyngier <maz@kernel.org> wrote:
> >
> > Peter,
> >
> > May I suggest that you slow down on the number of versions you send?
> > This is the 7th in 5 days, the 3rd today.
> >
> > At this stage, this is entirely counterproductive.
> 
> Apologies, I'll be sure to be at least one cup of coffee in before
> doing early morning code.

Even with a steady intake of coffee, there is a pretty clear policy
around the frequency of patch submission, see [1].

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst#n337

There is no hard enforcement of this process, but that should give you
an idea of how to deal with it. In any case, 7 series in less than a
week is a clear sign that this series should be *ignored*, as the
author is likely to post yet another one in the next few hours.

> 
> >
> > On 2022-04-16 12:05, Peter Geis wrote:
> > > The legacy interrupts on the rk356x pcie controller are handled by a
> > > single muxed interrupt. Add irq domain support to the pcie-dw-rockchip
> > > driver to support the virtual domain.
> > >
> > > Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> > > ---
> > >  drivers/pci/controller/dwc/pcie-dw-rockchip.c | 112 +++++++++++++++++-
> > >  1 file changed, 110 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > index c9b341e55cbb..863374604fb1 100644
> > > --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > @@ -10,9 +10,12 @@
> > >
> > >  #include <linux/clk.h>
> > >  #include <linux/gpio/consumer.h>
> > > +#include <linux/irqchip/chained_irq.h>
> > > +#include <linux/irqdomain.h>
> > >  #include <linux/mfd/syscon.h>
> > >  #include <linux/module.h>
> > >  #include <linux/of_device.h>
> > > +#include <linux/of_irq.h>
> > >  #include <linux/phy/phy.h>
> > >  #include <linux/platform_device.h>
> > >  #include <linux/regmap.h>
> > > @@ -36,10 +39,13 @@
> > >  #define PCIE_LINKUP                  (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP)
> > >  #define PCIE_L0S_ENTRY                       0x11
> > >  #define PCIE_CLIENT_GENERAL_CONTROL  0x0
> > > +#define PCIE_CLIENT_INTR_STATUS_LEGACY       0x8
> > > +#define PCIE_CLIENT_INTR_MASK_LEGACY 0x1c
> > >  #define PCIE_CLIENT_GENERAL_DEBUG    0x104
> > > -#define PCIE_CLIENT_HOT_RESET_CTRL      0x180
> > > +#define PCIE_CLIENT_HOT_RESET_CTRL   0x180
> > >  #define PCIE_CLIENT_LTSSM_STATUS     0x300
> > > -#define PCIE_LTSSM_ENABLE_ENHANCE       BIT(4)
> > > +#define PCIE_LEGACY_INT_ENABLE               GENMASK(3, 0)
> > > +#define PCIE_LTSSM_ENABLE_ENHANCE    BIT(4)
> > >  #define PCIE_LTSSM_STATUS_MASK               GENMASK(5, 0)
> > >
> > >  struct rockchip_pcie {
> > > @@ -51,6 +57,8 @@ struct rockchip_pcie {
> > >       struct reset_control            *rst;
> > >       struct gpio_desc                *rst_gpio;
> > >       struct regulator                *vpcie3v3;
> > > +     struct irq_domain               *irq_domain;
> > > +     raw_spinlock_t                  irq_lock;
> > >  };
> > >
> > >  static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip,
> > > @@ -65,6 +73,94 @@ static void rockchip_pcie_writel_apb(struct
> > > rockchip_pcie *rockchip,
> > >       writel_relaxed(val, rockchip->apb_base + reg);
> > >  }
> > >
> > > +static void rockchip_pcie_legacy_int_handler(struct irq_desc *desc)
> > > +{
> > > +     struct irq_chip *chip = irq_desc_get_chip(desc);
> > > +     struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc);
> > > +     unsigned long reg, hwirq;
> > > +
> > > +     chained_irq_enter(chip, desc);
> > > +
> > > +     reg = rockchip_pcie_readl_apb(rockchip,
> > > PCIE_CLIENT_INTR_STATUS_LEGACY);
> > > +
> > > +     for_each_set_bit(hwirq, &reg, 8)
> >
> > 8? And yet:
> >
> > #define PCI_NUM_INTX        4
> >
> > So whatever bits are set above bit 3, you are feeding garbage
> > to the irqdomain code.
> 
> There are 8 bits in total, the top four are for the TX interrupts, for
> which EP mode is not yet supported by the driver.

So why aren't they excluded from the set of bits that you look at?

> I can constrain this further and let it be expanded when that support
> is added, if that works for you?

Well, you can't have INTx interrupts in EP mode (that's a TLP going
out of the device, and not something that is signalled *to* the
CPU). So the two should be mutually exclusive.

> 
> >
> > > +             generic_handle_domain_irq(rockchip->irq_domain, hwirq);
> > > +
> > > +     chained_irq_exit(chip, desc);
> > > +}
> > > +
> > > +static void rockchip_intx_mask(struct irq_data *data)
> > > +{
> > > +     struct rockchip_pcie *rockchip = irq_data_get_irq_chip_data(data);
> > > +     unsigned long flags;
> > > +     u32 val;
> > > +
> > > +     /* disable legacy interrupts */
> > > +     raw_spin_lock_irqsave(&rockchip->irq_lock, flags);
> > > +     val = HIWORD_UPDATE_BIT(PCIE_LEGACY_INT_ENABLE);
> > > +     val |= PCIE_LEGACY_INT_ENABLE;
> > > +     rockchip_pcie_writel_apb(rockchip, val,
> > > PCIE_CLIENT_INTR_MASK_LEGACY);
> > > +     raw_spin_unlock_irqrestore(&rockchip->irq_lock, flags);
> >
> > This is completely busted. INTx lines must be controlled individually.
> > If I disable one device's INTx output, I don't want to see the
> > interrupt firing because another one has had its own enabled.
> 
> Okay, that makes sense. I'm hitting the entire block when it should be
> the individual IRQ.
> I also notice some drivers protect this with a spinlock while others
> do not, how should this be handled?

It obviously depends on how the HW. works. If this is a shared
register using a RMW sequence, then you need some form of mutual
exclusion in order to preserve the atomicity of the update.

If the HW supports updating the masks using a set of hot bits (with
separate clear/set registers), than there is no need for locking.  In
your case PCIE_CLIENT_INTR_MASK_LEGACY seems to support this odd
"write-enable" feature which can probably be used to implement a
lockless access, something like:

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16) | BIT(d->hwirq);
		writel_relaxed(val, ...);
	}

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16);
		writel_relaxed(val, ...);
	}

Another thing is that it is completely unclear to me what initialises
these interrupts the first place (INTR_MASK_LEGACY, INTR_EN_LEGACY).
Are you relying on the firmware to do that for you?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Peter Geis <pgwipeout@gmail.com>
Cc: "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Heiko Stuebner" <heiko@sntech.de>,
	"open list:ARM/Rockchip SoC..."
	<linux-rockchip@lists.infradead.org>,
	PCI <linux-pci@vger.kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	arm-mail-list <linux-arm-kernel@lists.infradead.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v7 2/4] PCI: dwc: rockchip: add legacy interrupt support
Date: Sun, 17 Apr 2022 10:53:35 +0100	[thread overview]
Message-ID: <87zgkk9gtc.wl-maz@kernel.org> (raw)
In-Reply-To: <CAMdYzYo+YeAgT92baMOoWpra230wro_WynRcajL-__9RNkeE9Q@mail.gmail.com>

On Sat, 16 Apr 2022 14:24:26 +0100,
Peter Geis <pgwipeout@gmail.com> wrote:
> 
> On Sat, Apr 16, 2022 at 8:54 AM Marc Zyngier <maz@kernel.org> wrote:
> >
> > Peter,
> >
> > May I suggest that you slow down on the number of versions you send?
> > This is the 7th in 5 days, the 3rd today.
> >
> > At this stage, this is entirely counterproductive.
> 
> Apologies, I'll be sure to be at least one cup of coffee in before
> doing early morning code.

Even with a steady intake of coffee, there is a pretty clear policy
around the frequency of patch submission, see [1].

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst#n337

There is no hard enforcement of this process, but that should give you
an idea of how to deal with it. In any case, 7 series in less than a
week is a clear sign that this series should be *ignored*, as the
author is likely to post yet another one in the next few hours.

> 
> >
> > On 2022-04-16 12:05, Peter Geis wrote:
> > > The legacy interrupts on the rk356x pcie controller are handled by a
> > > single muxed interrupt. Add irq domain support to the pcie-dw-rockchip
> > > driver to support the virtual domain.
> > >
> > > Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> > > ---
> > >  drivers/pci/controller/dwc/pcie-dw-rockchip.c | 112 +++++++++++++++++-
> > >  1 file changed, 110 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > index c9b341e55cbb..863374604fb1 100644
> > > --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > @@ -10,9 +10,12 @@
> > >
> > >  #include <linux/clk.h>
> > >  #include <linux/gpio/consumer.h>
> > > +#include <linux/irqchip/chained_irq.h>
> > > +#include <linux/irqdomain.h>
> > >  #include <linux/mfd/syscon.h>
> > >  #include <linux/module.h>
> > >  #include <linux/of_device.h>
> > > +#include <linux/of_irq.h>
> > >  #include <linux/phy/phy.h>
> > >  #include <linux/platform_device.h>
> > >  #include <linux/regmap.h>
> > > @@ -36,10 +39,13 @@
> > >  #define PCIE_LINKUP                  (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP)
> > >  #define PCIE_L0S_ENTRY                       0x11
> > >  #define PCIE_CLIENT_GENERAL_CONTROL  0x0
> > > +#define PCIE_CLIENT_INTR_STATUS_LEGACY       0x8
> > > +#define PCIE_CLIENT_INTR_MASK_LEGACY 0x1c
> > >  #define PCIE_CLIENT_GENERAL_DEBUG    0x104
> > > -#define PCIE_CLIENT_HOT_RESET_CTRL      0x180
> > > +#define PCIE_CLIENT_HOT_RESET_CTRL   0x180
> > >  #define PCIE_CLIENT_LTSSM_STATUS     0x300
> > > -#define PCIE_LTSSM_ENABLE_ENHANCE       BIT(4)
> > > +#define PCIE_LEGACY_INT_ENABLE               GENMASK(3, 0)
> > > +#define PCIE_LTSSM_ENABLE_ENHANCE    BIT(4)
> > >  #define PCIE_LTSSM_STATUS_MASK               GENMASK(5, 0)
> > >
> > >  struct rockchip_pcie {
> > > @@ -51,6 +57,8 @@ struct rockchip_pcie {
> > >       struct reset_control            *rst;
> > >       struct gpio_desc                *rst_gpio;
> > >       struct regulator                *vpcie3v3;
> > > +     struct irq_domain               *irq_domain;
> > > +     raw_spinlock_t                  irq_lock;
> > >  };
> > >
> > >  static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip,
> > > @@ -65,6 +73,94 @@ static void rockchip_pcie_writel_apb(struct
> > > rockchip_pcie *rockchip,
> > >       writel_relaxed(val, rockchip->apb_base + reg);
> > >  }
> > >
> > > +static void rockchip_pcie_legacy_int_handler(struct irq_desc *desc)
> > > +{
> > > +     struct irq_chip *chip = irq_desc_get_chip(desc);
> > > +     struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc);
> > > +     unsigned long reg, hwirq;
> > > +
> > > +     chained_irq_enter(chip, desc);
> > > +
> > > +     reg = rockchip_pcie_readl_apb(rockchip,
> > > PCIE_CLIENT_INTR_STATUS_LEGACY);
> > > +
> > > +     for_each_set_bit(hwirq, &reg, 8)
> >
> > 8? And yet:
> >
> > #define PCI_NUM_INTX        4
> >
> > So whatever bits are set above bit 3, you are feeding garbage
> > to the irqdomain code.
> 
> There are 8 bits in total, the top four are for the TX interrupts, for
> which EP mode is not yet supported by the driver.

So why aren't they excluded from the set of bits that you look at?

> I can constrain this further and let it be expanded when that support
> is added, if that works for you?

Well, you can't have INTx interrupts in EP mode (that's a TLP going
out of the device, and not something that is signalled *to* the
CPU). So the two should be mutually exclusive.

> 
> >
> > > +             generic_handle_domain_irq(rockchip->irq_domain, hwirq);
> > > +
> > > +     chained_irq_exit(chip, desc);
> > > +}
> > > +
> > > +static void rockchip_intx_mask(struct irq_data *data)
> > > +{
> > > +     struct rockchip_pcie *rockchip = irq_data_get_irq_chip_data(data);
> > > +     unsigned long flags;
> > > +     u32 val;
> > > +
> > > +     /* disable legacy interrupts */
> > > +     raw_spin_lock_irqsave(&rockchip->irq_lock, flags);
> > > +     val = HIWORD_UPDATE_BIT(PCIE_LEGACY_INT_ENABLE);
> > > +     val |= PCIE_LEGACY_INT_ENABLE;
> > > +     rockchip_pcie_writel_apb(rockchip, val,
> > > PCIE_CLIENT_INTR_MASK_LEGACY);
> > > +     raw_spin_unlock_irqrestore(&rockchip->irq_lock, flags);
> >
> > This is completely busted. INTx lines must be controlled individually.
> > If I disable one device's INTx output, I don't want to see the
> > interrupt firing because another one has had its own enabled.
> 
> Okay, that makes sense. I'm hitting the entire block when it should be
> the individual IRQ.
> I also notice some drivers protect this with a spinlock while others
> do not, how should this be handled?

It obviously depends on how the HW. works. If this is a shared
register using a RMW sequence, then you need some form of mutual
exclusion in order to preserve the atomicity of the update.

If the HW supports updating the masks using a set of hot bits (with
separate clear/set registers), than there is no need for locking.  In
your case PCIE_CLIENT_INTR_MASK_LEGACY seems to support this odd
"write-enable" feature which can probably be used to implement a
lockless access, something like:

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16) | BIT(d->hwirq);
		writel_relaxed(val, ...);
	}

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16);
		writel_relaxed(val, ...);
	}

Another thing is that it is completely unclear to me what initialises
these interrupts the first place (INTR_MASK_LEGACY, INTR_EN_LEGACY).
Are you relying on the firmware to do that for you?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Peter Geis <pgwipeout@gmail.com>
Cc: "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Heiko Stuebner" <heiko@sntech.de>,
	"open list:ARM/Rockchip SoC..."
	<linux-rockchip@lists.infradead.org>,
	PCI <linux-pci@vger.kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	arm-mail-list <linux-arm-kernel@lists.infradead.org>,
	"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v7 2/4] PCI: dwc: rockchip: add legacy interrupt support
Date: Sun, 17 Apr 2022 10:53:35 +0100	[thread overview]
Message-ID: <87zgkk9gtc.wl-maz@kernel.org> (raw)
In-Reply-To: <CAMdYzYo+YeAgT92baMOoWpra230wro_WynRcajL-__9RNkeE9Q@mail.gmail.com>

On Sat, 16 Apr 2022 14:24:26 +0100,
Peter Geis <pgwipeout@gmail.com> wrote:
> 
> On Sat, Apr 16, 2022 at 8:54 AM Marc Zyngier <maz@kernel.org> wrote:
> >
> > Peter,
> >
> > May I suggest that you slow down on the number of versions you send?
> > This is the 7th in 5 days, the 3rd today.
> >
> > At this stage, this is entirely counterproductive.
> 
> Apologies, I'll be sure to be at least one cup of coffee in before
> doing early morning code.

Even with a steady intake of coffee, there is a pretty clear policy
around the frequency of patch submission, see [1].

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst#n337

There is no hard enforcement of this process, but that should give you
an idea of how to deal with it. In any case, 7 series in less than a
week is a clear sign that this series should be *ignored*, as the
author is likely to post yet another one in the next few hours.

> 
> >
> > On 2022-04-16 12:05, Peter Geis wrote:
> > > The legacy interrupts on the rk356x pcie controller are handled by a
> > > single muxed interrupt. Add irq domain support to the pcie-dw-rockchip
> > > driver to support the virtual domain.
> > >
> > > Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> > > ---
> > >  drivers/pci/controller/dwc/pcie-dw-rockchip.c | 112 +++++++++++++++++-
> > >  1 file changed, 110 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > index c9b341e55cbb..863374604fb1 100644
> > > --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
> > > @@ -10,9 +10,12 @@
> > >
> > >  #include <linux/clk.h>
> > >  #include <linux/gpio/consumer.h>
> > > +#include <linux/irqchip/chained_irq.h>
> > > +#include <linux/irqdomain.h>
> > >  #include <linux/mfd/syscon.h>
> > >  #include <linux/module.h>
> > >  #include <linux/of_device.h>
> > > +#include <linux/of_irq.h>
> > >  #include <linux/phy/phy.h>
> > >  #include <linux/platform_device.h>
> > >  #include <linux/regmap.h>
> > > @@ -36,10 +39,13 @@
> > >  #define PCIE_LINKUP                  (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP)
> > >  #define PCIE_L0S_ENTRY                       0x11
> > >  #define PCIE_CLIENT_GENERAL_CONTROL  0x0
> > > +#define PCIE_CLIENT_INTR_STATUS_LEGACY       0x8
> > > +#define PCIE_CLIENT_INTR_MASK_LEGACY 0x1c
> > >  #define PCIE_CLIENT_GENERAL_DEBUG    0x104
> > > -#define PCIE_CLIENT_HOT_RESET_CTRL      0x180
> > > +#define PCIE_CLIENT_HOT_RESET_CTRL   0x180
> > >  #define PCIE_CLIENT_LTSSM_STATUS     0x300
> > > -#define PCIE_LTSSM_ENABLE_ENHANCE       BIT(4)
> > > +#define PCIE_LEGACY_INT_ENABLE               GENMASK(3, 0)
> > > +#define PCIE_LTSSM_ENABLE_ENHANCE    BIT(4)
> > >  #define PCIE_LTSSM_STATUS_MASK               GENMASK(5, 0)
> > >
> > >  struct rockchip_pcie {
> > > @@ -51,6 +57,8 @@ struct rockchip_pcie {
> > >       struct reset_control            *rst;
> > >       struct gpio_desc                *rst_gpio;
> > >       struct regulator                *vpcie3v3;
> > > +     struct irq_domain               *irq_domain;
> > > +     raw_spinlock_t                  irq_lock;
> > >  };
> > >
> > >  static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip,
> > > @@ -65,6 +73,94 @@ static void rockchip_pcie_writel_apb(struct
> > > rockchip_pcie *rockchip,
> > >       writel_relaxed(val, rockchip->apb_base + reg);
> > >  }
> > >
> > > +static void rockchip_pcie_legacy_int_handler(struct irq_desc *desc)
> > > +{
> > > +     struct irq_chip *chip = irq_desc_get_chip(desc);
> > > +     struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc);
> > > +     unsigned long reg, hwirq;
> > > +
> > > +     chained_irq_enter(chip, desc);
> > > +
> > > +     reg = rockchip_pcie_readl_apb(rockchip,
> > > PCIE_CLIENT_INTR_STATUS_LEGACY);
> > > +
> > > +     for_each_set_bit(hwirq, &reg, 8)
> >
> > 8? And yet:
> >
> > #define PCI_NUM_INTX        4
> >
> > So whatever bits are set above bit 3, you are feeding garbage
> > to the irqdomain code.
> 
> There are 8 bits in total, the top four are for the TX interrupts, for
> which EP mode is not yet supported by the driver.

So why aren't they excluded from the set of bits that you look at?

> I can constrain this further and let it be expanded when that support
> is added, if that works for you?

Well, you can't have INTx interrupts in EP mode (that's a TLP going
out of the device, and not something that is signalled *to* the
CPU). So the two should be mutually exclusive.

> 
> >
> > > +             generic_handle_domain_irq(rockchip->irq_domain, hwirq);
> > > +
> > > +     chained_irq_exit(chip, desc);
> > > +}
> > > +
> > > +static void rockchip_intx_mask(struct irq_data *data)
> > > +{
> > > +     struct rockchip_pcie *rockchip = irq_data_get_irq_chip_data(data);
> > > +     unsigned long flags;
> > > +     u32 val;
> > > +
> > > +     /* disable legacy interrupts */
> > > +     raw_spin_lock_irqsave(&rockchip->irq_lock, flags);
> > > +     val = HIWORD_UPDATE_BIT(PCIE_LEGACY_INT_ENABLE);
> > > +     val |= PCIE_LEGACY_INT_ENABLE;
> > > +     rockchip_pcie_writel_apb(rockchip, val,
> > > PCIE_CLIENT_INTR_MASK_LEGACY);
> > > +     raw_spin_unlock_irqrestore(&rockchip->irq_lock, flags);
> >
> > This is completely busted. INTx lines must be controlled individually.
> > If I disable one device's INTx output, I don't want to see the
> > interrupt firing because another one has had its own enabled.
> 
> Okay, that makes sense. I'm hitting the entire block when it should be
> the individual IRQ.
> I also notice some drivers protect this with a spinlock while others
> do not, how should this be handled?

It obviously depends on how the HW. works. If this is a shared
register using a RMW sequence, then you need some form of mutual
exclusion in order to preserve the atomicity of the update.

If the HW supports updating the masks using a set of hot bits (with
separate clear/set registers), than there is no need for locking.  In
your case PCIE_CLIENT_INTR_MASK_LEGACY seems to support this odd
"write-enable" feature which can probably be used to implement a
lockless access, something like:

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16) | BIT(d->hwirq);
		writel_relaxed(val, ...);
	}

	void mask(struct irq_data *d)
	{
		u32 val = BIT(d->hwirq + 16);
		writel_relaxed(val, ...);
	}

Another thing is that it is completely unclear to me what initialises
these interrupts the first place (INTR_MASK_LEGACY, INTR_EN_LEGACY).
Are you relying on the firmware to do that for you?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-04-17  9:53 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-16 11:05 [PATCH v7 0/4] Enable rk356x PCIe controller Peter Geis
2022-04-16 11:05 ` Peter Geis
2022-04-16 11:05 ` Peter Geis
2022-04-16 11:05 ` [PATCH v7 1/4] dt-bindings: pci: remove fallback from Rockchip DesignWare binding Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-20 16:27   ` Rob Herring
2022-04-20 16:27     ` Rob Herring
2022-04-20 16:27     ` Rob Herring
2022-04-16 11:05 ` [PATCH v7 2/4] PCI: dwc: rockchip: add legacy interrupt support Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 12:54   ` Marc Zyngier
2022-04-16 12:54     ` Marc Zyngier
2022-04-16 12:54     ` Marc Zyngier
2022-04-16 13:24     ` Peter Geis
2022-04-16 13:24       ` Peter Geis
2022-04-16 13:24       ` Peter Geis
2022-04-17  9:53       ` Marc Zyngier [this message]
2022-04-17  9:53         ` Marc Zyngier
2022-04-17  9:53         ` Marc Zyngier
2022-04-18 11:37         ` Peter Geis
2022-04-18 11:37           ` Peter Geis
2022-04-18 11:37           ` Peter Geis
2022-04-18 12:34           ` Marc Zyngier
2022-04-18 12:34             ` Marc Zyngier
2022-04-18 12:34             ` Marc Zyngier
2022-04-18 15:13             ` Peter Geis
2022-04-18 15:13               ` Peter Geis
2022-04-18 15:13               ` Peter Geis
2022-04-18 22:53               ` Marc Zyngier
2022-04-18 22:53                 ` Marc Zyngier
2022-04-18 22:53                 ` Marc Zyngier
2022-04-19  0:23                 ` Peter Geis
2022-04-19  0:23                   ` Peter Geis
2022-04-19  0:23                   ` Peter Geis
2022-04-19  8:05                   ` Marc Zyngier
2022-04-19  8:05                     ` Marc Zyngier
2022-04-19  8:05                     ` Marc Zyngier
2022-04-19 20:37                     ` Peter Geis
2022-04-19 20:37                       ` Peter Geis
2022-04-19 20:37                       ` Peter Geis
2022-04-16 11:05 ` [PATCH v7 3/4] arm64: dts: rockchip: add rk3568 pcie2x1 controller Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 11:05 ` [PATCH v7 4/4] arm64: dts: rockchip: enable pcie controller on quartz64-a Peter Geis
2022-04-16 11:05   ` Peter Geis
2022-04-16 11:05   ` Peter Geis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zgkk9gtc.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=heiko@sntech.de \
    --cc=kw@linux.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=pgwipeout@gmail.com \
    --cc=robh@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.