* [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify()
@ 2024-12-20 7:23 Niklas Cassel
2024-12-31 15:51 ` Manivannan Sadhasivam
0 siblings, 1 reply; 5+ messages in thread
From: Niklas Cassel @ 2024-12-20 7:23 UTC (permalink / raw)
To: Jingoo Han, Manivannan Sadhasivam, Lorenzo Pieralisi,
Krzysztof Wilczyński, Rob Herring, Bjorn Helgaas
Cc: Damien Le Moal, Niklas Cassel, linux-pci
Platforms that do not have (one or more) dedicated IRQs for the eDMA
need to set nr_irqs to a non-zero value in their DWC glue driver.
Platforms that do have (one or more) dedicated IRQs do not need to
initialize nr_irqs. DWC common code will automatically set nr_irqs.
Since a glue driver can initialize nr_irqs, dw_pcie_edma_irq_verify()
should verify that nr_irqs, if non-zero, is a valid value. Thus, add a
check in dw_pcie_edma_irq_verify() to reject a negative nr_irqs value.
This fixes the following build warning when compiling with W=1:
drivers/pci/controller/dwc/pcie-designware.c: In function ‘dw_pcie_edma_detect’:
drivers/pci/controller/dwc/pcie-designware.c:989:50: warning: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 3 [-Wformat-truncation=]
989 | snprintf(name, sizeof(name), "dma%d", pci->edma.nr_irqs);
| ^~
Signed-off-by: Niklas Cassel <cassel@kernel.org>
---
drivers/pci/controller/dwc/pcie-designware.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c
index 3c683b6119c3..d7f695d5dbc4 100644
--- a/drivers/pci/controller/dwc/pcie-designware.c
+++ b/drivers/pci/controller/dwc/pcie-designware.c
@@ -978,6 +978,8 @@ static int dw_pcie_edma_irq_verify(struct dw_pcie *pci)
return 0;
else if (pci->edma.nr_irqs > 1)
return pci->edma.nr_irqs != ch_cnt ? -EINVAL : 0;
+ else if (pci->edma.nr_irqs < 0)
+ return -EINVAL;
ret = platform_get_irq_byname_optional(pdev, "dma");
if (ret > 0) {
--
2.47.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify()
2024-12-20 7:23 [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify() Niklas Cassel
@ 2024-12-31 15:51 ` Manivannan Sadhasivam
2024-12-31 18:13 ` Niklas Cassel
0 siblings, 1 reply; 5+ messages in thread
From: Manivannan Sadhasivam @ 2024-12-31 15:51 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Lorenzo Pieralisi, Krzysztof Wilczyński,
Rob Herring, Bjorn Helgaas, Damien Le Moal, linux-pci
On Fri, Dec 20, 2024 at 08:23:29AM +0100, Niklas Cassel wrote:
> Platforms that do not have (one or more) dedicated IRQs for the eDMA
> need to set nr_irqs to a non-zero value in their DWC glue driver.
>
> Platforms that do have (one or more) dedicated IRQs do not need to
> initialize nr_irqs. DWC common code will automatically set nr_irqs.
>
> Since a glue driver can initialize nr_irqs, dw_pcie_edma_irq_verify()
> should verify that nr_irqs, if non-zero, is a valid value. Thus, add a
> check in dw_pcie_edma_irq_verify() to reject a negative nr_irqs value.
>
Why can't we make dw_edma_chip::nr_irqs unsigned?
- Mani
> This fixes the following build warning when compiling with W=1:
>
> drivers/pci/controller/dwc/pcie-designware.c: In function ‘dw_pcie_edma_detect’:
> drivers/pci/controller/dwc/pcie-designware.c:989:50: warning: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 3 [-Wformat-truncation=]
> 989 | snprintf(name, sizeof(name), "dma%d", pci->edma.nr_irqs);
> | ^~
>
> Signed-off-by: Niklas Cassel <cassel@kernel.org>
> ---
> drivers/pci/controller/dwc/pcie-designware.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c
> index 3c683b6119c3..d7f695d5dbc4 100644
> --- a/drivers/pci/controller/dwc/pcie-designware.c
> +++ b/drivers/pci/controller/dwc/pcie-designware.c
> @@ -978,6 +978,8 @@ static int dw_pcie_edma_irq_verify(struct dw_pcie *pci)
> return 0;
> else if (pci->edma.nr_irqs > 1)
> return pci->edma.nr_irqs != ch_cnt ? -EINVAL : 0;
> + else if (pci->edma.nr_irqs < 0)
> + return -EINVAL;
>
> ret = platform_get_irq_byname_optional(pdev, "dma");
> if (ret > 0) {
> --
> 2.47.1
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify()
2024-12-31 15:51 ` Manivannan Sadhasivam
@ 2024-12-31 18:13 ` Niklas Cassel
2024-12-31 18:49 ` Manivannan Sadhasivam
0 siblings, 1 reply; 5+ messages in thread
From: Niklas Cassel @ 2024-12-31 18:13 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Jingoo Han, Lorenzo Pieralisi, Krzysztof Wilczyński,
Rob Herring, Bjorn Helgaas, Damien Le Moal, linux-pci
On Tue, Dec 31, 2024 at 09:21:58PM +0530, Manivannan Sadhasivam wrote:
> On Fri, Dec 20, 2024 at 08:23:29AM +0100, Niklas Cassel wrote:
> > Platforms that do not have (one or more) dedicated IRQs for the eDMA
> > need to set nr_irqs to a non-zero value in their DWC glue driver.
> >
> > Platforms that do have (one or more) dedicated IRQs do not need to
> > initialize nr_irqs. DWC common code will automatically set nr_irqs.
> >
> > Since a glue driver can initialize nr_irqs, dw_pcie_edma_irq_verify()
> > should verify that nr_irqs, if non-zero, is a valid value. Thus, add a
> > check in dw_pcie_edma_irq_verify() to reject a negative nr_irqs value.
> >
>
> Why can't we make dw_edma_chip::nr_irqs unsigned?
dw_edma is defined in drivers/dma/dw-edma/dw-edma-core.h
in struct dw_edma.
struct dw_pcie (defined in drivers/pci/controller/dwc/pcie-designware.h)
simply has a struct dw_edma as a struct member.
If you bounce on nr_irqs in:
drivers/dma/dw-edma/dw-edma-core.c
and in
drivers/dma/dw-edma/dw-edma-pcie.c
you can see that this driver uses signed int for this everywhere.
I didn't feel like refactoring a whole DMA driver.
dw_pcie_edma_irq_verify() is supposed to verify that nr_irqs is either
initialized to a valid value by a DWC PCIe glue driver, or that common
code initializes it.
If nr_irqs is initialized by a glue driver && "pci->edma.nr_irqs != ch_cnt",
dw_pcie_edma_irq_verify() returns error and avoids calling dw_edma_probe(),
thus it made sense for dw_pcie_edma_irq_verify() to also return error on
negative nr_irqs.
Kind regards,
Niklas
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify()
2024-12-31 18:13 ` Niklas Cassel
@ 2024-12-31 18:49 ` Manivannan Sadhasivam
2025-01-02 10:57 ` Niklas Cassel
0 siblings, 1 reply; 5+ messages in thread
From: Manivannan Sadhasivam @ 2024-12-31 18:49 UTC (permalink / raw)
To: Niklas Cassel
Cc: Jingoo Han, Lorenzo Pieralisi, Krzysztof Wilczyński,
Rob Herring, Bjorn Helgaas, Damien Le Moal, linux-pci
On Tue, Dec 31, 2024 at 07:13:33PM +0100, Niklas Cassel wrote:
> On Tue, Dec 31, 2024 at 09:21:58PM +0530, Manivannan Sadhasivam wrote:
> > On Fri, Dec 20, 2024 at 08:23:29AM +0100, Niklas Cassel wrote:
> > > Platforms that do not have (one or more) dedicated IRQs for the eDMA
> > > need to set nr_irqs to a non-zero value in their DWC glue driver.
> > >
> > > Platforms that do have (one or more) dedicated IRQs do not need to
> > > initialize nr_irqs. DWC common code will automatically set nr_irqs.
> > >
> > > Since a glue driver can initialize nr_irqs, dw_pcie_edma_irq_verify()
> > > should verify that nr_irqs, if non-zero, is a valid value. Thus, add a
> > > check in dw_pcie_edma_irq_verify() to reject a negative nr_irqs value.
> > >
> >
> > Why can't we make dw_edma_chip::nr_irqs unsigned?
>
> dw_edma is defined in drivers/dma/dw-edma/dw-edma-core.h
> in struct dw_edma.
>
> struct dw_pcie (defined in drivers/pci/controller/dwc/pcie-designware.h)
> simply has a struct dw_edma as a struct member.
>
> If you bounce on nr_irqs in:
> drivers/dma/dw-edma/dw-edma-core.c
> and in
> drivers/dma/dw-edma/dw-edma-pcie.c
> you can see that this driver uses signed int for this everywhere.
>
> I didn't feel like refactoring a whole DMA driver.
>
There is no need to refactor. Both 'dma' and 'dwc' drivers do not assume that
'nr_irqs' is signed. So simply changing the type to 'unsigned int' is enough.
I don't see a valid reason to keep it signed and check for negative value.
>
> dw_pcie_edma_irq_verify() is supposed to verify that nr_irqs is either
> initialized to a valid value by a DWC PCIe glue driver, or that common
> code initializes it.
>
Yes, but the glue drivers do not set negative value explicitly.
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify()
2024-12-31 18:49 ` Manivannan Sadhasivam
@ 2025-01-02 10:57 ` Niklas Cassel
0 siblings, 0 replies; 5+ messages in thread
From: Niklas Cassel @ 2025-01-02 10:57 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Jingoo Han, Lorenzo Pieralisi, Krzysztof Wilczyński,
Rob Herring, Bjorn Helgaas, Damien Le Moal, linux-pci
On Wed, Jan 01, 2025 at 12:19:13AM +0530, Manivannan Sadhasivam wrote:
> On Tue, Dec 31, 2024 at 07:13:33PM +0100, Niklas Cassel wrote:
> > On Tue, Dec 31, 2024 at 09:21:58PM +0530, Manivannan Sadhasivam wrote:
> > > On Fri, Dec 20, 2024 at 08:23:29AM +0100, Niklas Cassel wrote:
> > > > Platforms that do not have (one or more) dedicated IRQs for the eDMA
> > > > need to set nr_irqs to a non-zero value in their DWC glue driver.
> > > >
> > > > Platforms that do have (one or more) dedicated IRQs do not need to
> > > > initialize nr_irqs. DWC common code will automatically set nr_irqs.
> > > >
> > > > Since a glue driver can initialize nr_irqs, dw_pcie_edma_irq_verify()
> > > > should verify that nr_irqs, if non-zero, is a valid value. Thus, add a
> > > > check in dw_pcie_edma_irq_verify() to reject a negative nr_irqs value.
> > > >
> > >
> > > Why can't we make dw_edma_chip::nr_irqs unsigned?
> >
> > dw_edma is defined in drivers/dma/dw-edma/dw-edma-core.h
> > in struct dw_edma.
> >
> > struct dw_pcie (defined in drivers/pci/controller/dwc/pcie-designware.h)
> > simply has a struct dw_edma as a struct member.
> >
> > If you bounce on nr_irqs in:
> > drivers/dma/dw-edma/dw-edma-core.c
> > and in
> > drivers/dma/dw-edma/dw-edma-pcie.c
> > you can see that this driver uses signed int for this everywhere.
> >
> > I didn't feel like refactoring a whole DMA driver.
> >
>
> There is no need to refactor. Both 'dma' and 'dwc' drivers do not assume that
> 'nr_irqs' is signed. So simply changing the type to 'unsigned int' is enough.
> I don't see a valid reason to keep it signed and check for negative value.
If you bounce on nr_irqs in
drivers/dma/dw-edma/dw-edma-core.c
and in
drivers/dma/dw-edma/dw-edma-pcie.c
you will see that there are a lot of local variables
that are nr_irqs which are signed, in addition to the
struct member.
I don't want to change the whole driver simply to fix
a warning when building the DWC PCIe driver with W=1.
I have a different solution and will send a V2 soon.
Kind regards,
Niklas
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-01-02 10:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-20 7:23 [PATCH] PCI: dwc: Reject a negative nr_irqs value in dw_pcie_edma_irq_verify() Niklas Cassel
2024-12-31 15:51 ` Manivannan Sadhasivam
2024-12-31 18:13 ` Niklas Cassel
2024-12-31 18:49 ` Manivannan Sadhasivam
2025-01-02 10:57 ` Niklas Cassel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox