public inbox for linux-pci@vger.kernel.org
 help / color / mirror / Atom feed
* [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