diff mbox series

[RESEND,v2] PCI: dwc: Round up num_ctrls if num_vectors is less than MAX_MSI_IRQS_PER_CTRL

Message ID 1669080013-225314-1-git-send-email-shawn.lin@rock-chips.com (mailing list archive)
State New, archived
Delegated to: Lorenzo Pieralisi
Headers show
Series [RESEND,v2] PCI: dwc: Round up num_ctrls if num_vectors is less than MAX_MSI_IRQS_PER_CTRL | expand

Commit Message

Shawn Lin Nov. 22, 2022, 1:20 a.m. UTC
Some SoCs may only support 1 RC with a few MSIs support that the total number of MSIs is
less than MAX_MSI_IRQS_PER_CTRL. In this case, num_ctrls will be zero which fails setting
up MSI support. Fix it by rounding up num_ctrls to at least one.

Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
---

Changes in v2:
- set num_ctrls to 1 if it's less than one

 drivers/pci/controller/dwc/pcie-designware-host.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Han Jingoo Nov. 22, 2022, 10:04 p.m. UTC | #1
On Mon, Nov 21, 2022 Shawn Lin <shawn.lin@rock-chips.com> wrote:
>
> Some SoCs may only support 1 RC with a few MSIs support that the total number of MSIs is
> less than MAX_MSI_IRQS_PER_CTRL. In this case, num_ctrls will be zero which fails setting
> up MSI support. Fix it by rounding up num_ctrls to at least one.
>
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

Acked-by: Jingoo Han <jingoohan1@gmail.com>

Best regards,
Jingoo Han

> ---
>
> Changes in v2:
> - set num_ctrls to 1 if it's less than one
>
>  drivers/pci/controller/dwc/pcie-designware-host.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index 39f3b37..cfce1e0 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -62,6 +62,8 @@ irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
>         struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
>
>         num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
> +       if (num_ctrls < 1)
> +               num_ctrls = 1;
>
>         for (i = 0; i < num_ctrls; i++) {
>                 status = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS +
> @@ -343,6 +345,8 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
>         if (!pp->num_vectors)
>                 pp->num_vectors = MSI_DEF_NUM_VECTORS;
>         num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
> +       if (num_ctrls < 1)
> +               num_ctrls = 1;
>
>         if (!pp->msi_irq[0]) {
>                 pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi");
> @@ -707,6 +711,8 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
>
>         if (pp->has_msi_ctrl) {
>                 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
> +               if (num_ctrls < 1)
> +                       num_ctrls = 1;
>
>                 /* Initialize IRQ Status array */
>                 for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
> --
> 2.7.4
>
Shawn Lin Feb. 3, 2023, 8:23 a.m. UTC | #2
On 2022/11/23 6:04, Han Jingoo wrote:
> On Mon, Nov 21, 2022 Shawn Lin <shawn.lin@rock-chips.com> wrote:
>>
>> Some SoCs may only support 1 RC with a few MSIs support that the total number of MSIs is
>> less than MAX_MSI_IRQS_PER_CTRL. In this case, num_ctrls will be zero which fails setting
>> up MSI support. Fix it by rounding up num_ctrls to at least one.
>>
>> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> 
> Acked-by: Jingoo Han <jingoohan1@gmail.com>

Thanks, Jingoo!

Hi Lorenzo,

Is there any chance this patch be applied? :)

> 
> Best regards,
> Jingoo Han
> 
>> ---
>>
>> Changes in v2:
>> - set num_ctrls to 1 if it's less than one
>>
>>   drivers/pci/controller/dwc/pcie-designware-host.c | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
>> index 39f3b37..cfce1e0 100644
>> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
>> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
>> @@ -62,6 +62,8 @@ irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
>>          struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
>>
>>          num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
>> +       if (num_ctrls < 1)
>> +               num_ctrls = 1;
>>
>>          for (i = 0; i < num_ctrls; i++) {
>>                  status = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS +
>> @@ -343,6 +345,8 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
>>          if (!pp->num_vectors)
>>                  pp->num_vectors = MSI_DEF_NUM_VECTORS;
>>          num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
>> +       if (num_ctrls < 1)
>> +               num_ctrls = 1;
>>
>>          if (!pp->msi_irq[0]) {
>>                  pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi");
>> @@ -707,6 +711,8 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
>>
>>          if (pp->has_msi_ctrl) {
>>                  num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
>> +               if (num_ctrls < 1)
>> +                       num_ctrls = 1;
>>
>>                  /* Initialize IRQ Status array */
>>                  for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
>> --
>> 2.7.4
>>
Bjorn Helgaas Feb. 3, 2023, 6:08 p.m. UTC | #3
On Tue, Nov 22, 2022 at 09:20:13AM +0800, Shawn Lin wrote:
> Some SoCs may only support 1 RC with a few MSIs support that the total number of MSIs is
> less than MAX_MSI_IRQS_PER_CTRL. 

I'm not quite sure what this sentence says.  Maybe it should be split
into two sentences?

> In this case, num_ctrls will be zero which fails setting
> up MSI support. Fix it by rounding up num_ctrls to at least one.

If you have occasion to repost, please rewrap the commit log to fit in
75 columns.

Krzysztof or Lorenzo will likely fix this when applying otherwise.

Bjorn
Lorenzo Pieralisi April 5, 2023, 2:55 p.m. UTC | #4
On Fri, Feb 03, 2023 at 04:23:53PM +0800, Shawn Lin wrote:
> On 2022/11/23 6:04, Han Jingoo wrote:
> > On Mon, Nov 21, 2022 Shawn Lin <shawn.lin@rock-chips.com> wrote:
> > > 
> > > Some SoCs may only support 1 RC with a few MSIs support that the total number of MSIs is
> > > less than MAX_MSI_IRQS_PER_CTRL. In this case, num_ctrls will be zero which fails setting
> > > up MSI support. Fix it by rounding up num_ctrls to at least one.
> > > 
> > > Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> > 
> > Acked-by: Jingoo Han <jingoohan1@gmail.com>
> 
> Thanks, Jingoo!
> 
> Hi Lorenzo,
> 
> Is there any chance this patch be applied? :)
> 
> > 
> > Best regards,
> > Jingoo Han
> > 
> > > ---
> > > 
> > > Changes in v2:
> > > - set num_ctrls to 1 if it's less than one
> > > 
> > >   drivers/pci/controller/dwc/pcie-designware-host.c | 6 ++++++
> > >   1 file changed, 6 insertions(+)
> > > 
> > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > index 39f3b37..cfce1e0 100644
> > > --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> > > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> > > @@ -62,6 +62,8 @@ irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
> > >          struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> > > 
> > >          num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;

I assume that if pp->num_vectors > MAX_MSI_IRQS_PER_CTRL but not
an exact multiple we would have the same problem right ?

Best to fix it for both cases.

Lorenzo

> > > +       if (num_ctrls < 1)
> > > +               num_ctrls = 1;
> > > 
> > >          for (i = 0; i < num_ctrls; i++) {
> > >                  status = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS +
> > > @@ -343,6 +345,8 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
> > >          if (!pp->num_vectors)
> > >                  pp->num_vectors = MSI_DEF_NUM_VECTORS;
> > >          num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
> > > +       if (num_ctrls < 1)
> > > +               num_ctrls = 1;
> > > 
> > >          if (!pp->msi_irq[0]) {
> > >                  pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi");
> > > @@ -707,6 +711,8 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
> > > 
> > >          if (pp->has_msi_ctrl) {
> > >                  num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
> > > +               if (num_ctrls < 1)
> > > +                       num_ctrls = 1;
> > > 
> > >                  /* Initialize IRQ Status array */
> > >                  for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
> > > --
> > > 2.7.4
> > > 
> 
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
diff mbox series

Patch

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index 39f3b37..cfce1e0 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -62,6 +62,8 @@  irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
 	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
 
 	num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+	if (num_ctrls < 1)
+		num_ctrls = 1;
 
 	for (i = 0; i < num_ctrls; i++) {
 		status = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS +
@@ -343,6 +345,8 @@  static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
 	if (!pp->num_vectors)
 		pp->num_vectors = MSI_DEF_NUM_VECTORS;
 	num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+	if (num_ctrls < 1)
+		num_ctrls = 1;
 
 	if (!pp->msi_irq[0]) {
 		pp->msi_irq[0] = platform_get_irq_byname_optional(pdev, "msi");
@@ -707,6 +711,8 @@  int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
 
 	if (pp->has_msi_ctrl) {
 		num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+		if (num_ctrls < 1)
+			num_ctrls = 1;
 
 		/* Initialize IRQ Status array */
 		for (ctrl = 0; ctrl < num_ctrls; ctrl++) {