From: Marc Zyngier <marc.zyngier@arm.com>
To: Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
Cc: robh@kernel.org, arnd@arndb.de, linux-pci@vger.kernel.org,
michal.simek@xilinx.com, linux-kernel@vger.kernel.org,
Bharat Kumar Gogada <bharatku@xilinx.com>,
paul.gortmaker@windriver.com, rgummal@xilinx.com,
bhelgaas@google.com, colin.king@canonical.com,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v3] PCI: Xilinx NWL: Modifying irq chip for legacy interrupts
Date: Tue, 31 Jan 2017 09:19:20 +0000 [thread overview]
Message-ID: <868tpr8u3r.fsf@arm.com> (raw)
In-Reply-To: <1485853152-31819-1-git-send-email-bharatku@xilinx.com> (Bharat Kumar Gogada's message of "Tue, 31 Jan 2017 14:29:12 +0530")
On Tue, Jan 31 2017 at 08:59:12 AM, Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com> wrote:
> - Adding mutex lock for protecting legacy mask register
> - Few wifi end points which only support legacy interrupts,
> performs hardware reset functionalities after disabling interrupts
> by invoking disable_irq and then re-enable using enable_irq, they
> enable hardware interrupts first and then virtual irq line later.
> - The legacy irq line goes low only after DEASSERT_INTx is
> received.As the legacy irq line is high immediately after hardware
> interrupts are enabled but virq of EP is still in disabled state
> and EP handler is never executed resulting no DEASSERT_INTx.If dummy
> irq chip is used, interrutps are not masked and system is
> hanging with CPU stall.
> - Adding irq chip functions instead of dummy irq chip for legacy
> interrupts.
> - Legacy interrupts are level sensitive, so using handle_level_irq
> is more appropriate as it is masks interrupts until End point handles
> interrupts and unmasks interrutps after End point handler is executed.
> - Legacy interrupts are level triggered, virtual irq line of End
> Point shows as edge in /proc/interrupts.
> - Setting irq flags of virtual irq line of EP to level triggered
> at the time of mapping.
>
> Signed-off-by: Bharat Kumar Gogada <bharatku@xilinx.com>
> ---
> drivers/pci/host/pcie-xilinx-nwl.c | 43 +++++++++++++++++++++++++++++++++++-
> 1 files changed, 42 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/pci/host/pcie-xilinx-nwl.c b/drivers/pci/host/pcie-xilinx-nwl.c
> index 43eaa4a..76dd094 100644
> --- a/drivers/pci/host/pcie-xilinx-nwl.c
> +++ b/drivers/pci/host/pcie-xilinx-nwl.c
> @@ -184,6 +184,7 @@ struct nwl_pcie {
> u8 root_busno;
> struct nwl_msi msi;
> struct irq_domain *legacy_irq_domain;
> + struct mutex leg_mask_lock;
> };
>
> static inline u32 nwl_bridge_readl(struct nwl_pcie *pcie, u32 off)
> @@ -395,11 +396,50 @@ static void nwl_pcie_msi_handler_low(struct irq_desc *desc)
> chained_irq_exit(chip, desc);
> }
>
> +static void nwl_mask_leg_irq(struct irq_data *data)
> +{
> + struct irq_desc *desc = irq_to_desc(data->irq);
> + struct nwl_pcie *pcie;
> + u32 mask;
> + u32 val;
> +
> + pcie = irq_desc_get_chip_data(desc);
> + mask = 1 << (data->hwirq - 1);
> + mutex_lock(&pcie->leg_mask_lock);
> + val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
> + nwl_bridge_writel(pcie, (val & (~mask)), MSGF_LEG_MASK);
> + mutex_unlock(&pcie->leg_mask_lock);
Have you looked at which context this is called in? In a number of
cases, the mask/unmask methods are called whilst you're in an interrupt
context. If you sleep there (which is what happens with a contended
mutex), you die horribly.
Given these constraints, you should use raw_spin_lock_irqsave and co,
since this can be called from both interrupt and non-interrupt contexts.
Thanks,
M.
--
Jazz is not dead. It just smells funny.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3] PCI: Xilinx NWL: Modifying irq chip for legacy interrupts
Date: Tue, 31 Jan 2017 09:19:20 +0000 [thread overview]
Message-ID: <868tpr8u3r.fsf@arm.com> (raw)
In-Reply-To: <1485853152-31819-1-git-send-email-bharatku@xilinx.com> (Bharat Kumar Gogada's message of "Tue, 31 Jan 2017 14:29:12 +0530")
On Tue, Jan 31 2017 at 08:59:12 AM, Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com> wrote:
> - Adding mutex lock for protecting legacy mask register
> - Few wifi end points which only support legacy interrupts,
> performs hardware reset functionalities after disabling interrupts
> by invoking disable_irq and then re-enable using enable_irq, they
> enable hardware interrupts first and then virtual irq line later.
> - The legacy irq line goes low only after DEASSERT_INTx is
> received.As the legacy irq line is high immediately after hardware
> interrupts are enabled but virq of EP is still in disabled state
> and EP handler is never executed resulting no DEASSERT_INTx.If dummy
> irq chip is used, interrutps are not masked and system is
> hanging with CPU stall.
> - Adding irq chip functions instead of dummy irq chip for legacy
> interrupts.
> - Legacy interrupts are level sensitive, so using handle_level_irq
> is more appropriate as it is masks interrupts until End point handles
> interrupts and unmasks interrutps after End point handler is executed.
> - Legacy interrupts are level triggered, virtual irq line of End
> Point shows as edge in /proc/interrupts.
> - Setting irq flags of virtual irq line of EP to level triggered
> at the time of mapping.
>
> Signed-off-by: Bharat Kumar Gogada <bharatku@xilinx.com>
> ---
> drivers/pci/host/pcie-xilinx-nwl.c | 43 +++++++++++++++++++++++++++++++++++-
> 1 files changed, 42 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/pci/host/pcie-xilinx-nwl.c b/drivers/pci/host/pcie-xilinx-nwl.c
> index 43eaa4a..76dd094 100644
> --- a/drivers/pci/host/pcie-xilinx-nwl.c
> +++ b/drivers/pci/host/pcie-xilinx-nwl.c
> @@ -184,6 +184,7 @@ struct nwl_pcie {
> u8 root_busno;
> struct nwl_msi msi;
> struct irq_domain *legacy_irq_domain;
> + struct mutex leg_mask_lock;
> };
>
> static inline u32 nwl_bridge_readl(struct nwl_pcie *pcie, u32 off)
> @@ -395,11 +396,50 @@ static void nwl_pcie_msi_handler_low(struct irq_desc *desc)
> chained_irq_exit(chip, desc);
> }
>
> +static void nwl_mask_leg_irq(struct irq_data *data)
> +{
> + struct irq_desc *desc = irq_to_desc(data->irq);
> + struct nwl_pcie *pcie;
> + u32 mask;
> + u32 val;
> +
> + pcie = irq_desc_get_chip_data(desc);
> + mask = 1 << (data->hwirq - 1);
> + mutex_lock(&pcie->leg_mask_lock);
> + val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
> + nwl_bridge_writel(pcie, (val & (~mask)), MSGF_LEG_MASK);
> + mutex_unlock(&pcie->leg_mask_lock);
Have you looked at which context this is called in? In a number of
cases, the mask/unmask methods are called whilst you're in an interrupt
context. If you sleep there (which is what happens with a contended
mutex), you die horribly.
Given these constraints, you should use raw_spin_lock_irqsave and co,
since this can be called from both interrupt and non-interrupt contexts.
Thanks,
M.
--
Jazz is not dead. It just smells funny.
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <marc.zyngier@arm.com>
To: Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
Cc: <bhelgaas@google.com>, <paul.gortmaker@windriver.com>,
<robh@kernel.org>, <colin.king@canonical.com>,
<linux-pci@vger.kernel.org>, <michal.simek@xilinx.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <rgummal@xilinx.com>,
<arnd@arndb.de>, "Bharat Kumar Gogada" <bharatku@xilinx.com>
Subject: Re: [PATCH v3] PCI: Xilinx NWL: Modifying irq chip for legacy interrupts
Date: Tue, 31 Jan 2017 09:19:20 +0000 [thread overview]
Message-ID: <868tpr8u3r.fsf@arm.com> (raw)
In-Reply-To: <1485853152-31819-1-git-send-email-bharatku@xilinx.com> (Bharat Kumar Gogada's message of "Tue, 31 Jan 2017 14:29:12 +0530")
On Tue, Jan 31 2017 at 08:59:12 AM, Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com> wrote:
> - Adding mutex lock for protecting legacy mask register
> - Few wifi end points which only support legacy interrupts,
> performs hardware reset functionalities after disabling interrupts
> by invoking disable_irq and then re-enable using enable_irq, they
> enable hardware interrupts first and then virtual irq line later.
> - The legacy irq line goes low only after DEASSERT_INTx is
> received.As the legacy irq line is high immediately after hardware
> interrupts are enabled but virq of EP is still in disabled state
> and EP handler is never executed resulting no DEASSERT_INTx.If dummy
> irq chip is used, interrutps are not masked and system is
> hanging with CPU stall.
> - Adding irq chip functions instead of dummy irq chip for legacy
> interrupts.
> - Legacy interrupts are level sensitive, so using handle_level_irq
> is more appropriate as it is masks interrupts until End point handles
> interrupts and unmasks interrutps after End point handler is executed.
> - Legacy interrupts are level triggered, virtual irq line of End
> Point shows as edge in /proc/interrupts.
> - Setting irq flags of virtual irq line of EP to level triggered
> at the time of mapping.
>
> Signed-off-by: Bharat Kumar Gogada <bharatku@xilinx.com>
> ---
> drivers/pci/host/pcie-xilinx-nwl.c | 43 +++++++++++++++++++++++++++++++++++-
> 1 files changed, 42 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/pci/host/pcie-xilinx-nwl.c b/drivers/pci/host/pcie-xilinx-nwl.c
> index 43eaa4a..76dd094 100644
> --- a/drivers/pci/host/pcie-xilinx-nwl.c
> +++ b/drivers/pci/host/pcie-xilinx-nwl.c
> @@ -184,6 +184,7 @@ struct nwl_pcie {
> u8 root_busno;
> struct nwl_msi msi;
> struct irq_domain *legacy_irq_domain;
> + struct mutex leg_mask_lock;
> };
>
> static inline u32 nwl_bridge_readl(struct nwl_pcie *pcie, u32 off)
> @@ -395,11 +396,50 @@ static void nwl_pcie_msi_handler_low(struct irq_desc *desc)
> chained_irq_exit(chip, desc);
> }
>
> +static void nwl_mask_leg_irq(struct irq_data *data)
> +{
> + struct irq_desc *desc = irq_to_desc(data->irq);
> + struct nwl_pcie *pcie;
> + u32 mask;
> + u32 val;
> +
> + pcie = irq_desc_get_chip_data(desc);
> + mask = 1 << (data->hwirq - 1);
> + mutex_lock(&pcie->leg_mask_lock);
> + val = nwl_bridge_readl(pcie, MSGF_LEG_MASK);
> + nwl_bridge_writel(pcie, (val & (~mask)), MSGF_LEG_MASK);
> + mutex_unlock(&pcie->leg_mask_lock);
Have you looked at which context this is called in? In a number of
cases, the mask/unmask methods are called whilst you're in an interrupt
context. If you sleep there (which is what happens with a contended
mutex), you die horribly.
Given these constraints, you should use raw_spin_lock_irqsave and co,
since this can be called from both interrupt and non-interrupt contexts.
Thanks,
M.
--
Jazz is not dead. It just smells funny.
next prev parent reply other threads:[~2017-01-31 9:19 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-31 8:59 [PATCH v3] PCI: Xilinx NWL: Modifying irq chip for legacy interrupts Bharat Kumar Gogada
2017-01-31 8:59 ` Bharat Kumar Gogada
2017-01-31 8:59 ` Bharat Kumar Gogada
2017-01-31 9:19 ` Marc Zyngier [this message]
2017-01-31 9:19 ` Marc Zyngier
2017-01-31 9:19 ` Marc Zyngier
2017-01-31 9:34 ` Bharat Kumar Gogada
2017-01-31 9:34 ` Bharat Kumar Gogada
2017-01-31 9:34 ` Bharat Kumar Gogada
2017-01-31 10:23 ` Marc Zyngier
2017-01-31 10:23 ` Marc Zyngier
2017-01-31 10:23 ` Marc Zyngier
2017-01-31 12:03 ` Bharat Kumar Gogada
2017-01-31 12:03 ` Bharat Kumar Gogada
2017-01-31 12:03 ` Bharat Kumar Gogada
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=868tpr8u3r.fsf@arm.com \
--to=marc.zyngier@arm.com \
--cc=arnd@arndb.de \
--cc=bharat.kumar.gogada@xilinx.com \
--cc=bharatku@xilinx.com \
--cc=bhelgaas@google.com \
--cc=colin.king@canonical.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=michal.simek@xilinx.com \
--cc=paul.gortmaker@windriver.com \
--cc=rgummal@xilinx.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.