Re: Re-activate task to add MSI-X to pcie-designware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 26/12/2017 12:57, Kishon Vijay Abraham I wrote:
> Hi,
> 
> On Saturday 23 December 2017 03:46 PM, Kishon Vijay Abraham I wrote:
>> Hi Gustavo,
>>
>> On Thursday 21 December 2017 07:38 PM, Gustavo Pimentel wrote:
>>> On 20/12/2017 13:03, Kishon Vijay Abraham I wrote:This is our most recent
>>> version of the patches that are running on our equipment, please check with yours
>>>> Hi,
>>>>
>>>> On Monday 18 December 2017 09:31 PM, Gustavo Pimentel wrote:
>>>>> Hi Kishon,
>>>>>
>>>>> I would like to collaborate with you on this subject, I have on my side João's
>>>>> patches updated to the Bjorn's latest kernel version.
>>>>
>>>> cool, do you have a branch so that I can check what breaks in keystone and debug?
>>>>
>>> Unfortunately not, however I'll mailed you the patches immediately.
>>> Once again, thanks.
>>
>> Thanks.
>>
>> I tried raising MSI with pci_endpoint_test EP device (16 MSI interrupts). Here
>> are some of my observations after applying your patch series.
>>
>> root@k2g-evm:~# cat /proc/interrupts
>>            CPU0
>>  17:          0     GICv2  29 Level     arch_timer
>>  18:       1816     GICv2  30 Level     arch_timer
>>  21:          0     GICv2  36 Edge      arm-pmu
>>  22:        792     GICv2 196 Edge      ttyS0
>>  23:          5     GICv2 120 Edge      2530000.i2c
>>  24:          0     GICv2  33 Edge      soc:keystone_irq@26202a0
>>  25:        901     GICv2 356 Level     2a00000.msgmgr rx_005_002
>>  41:          0     GICv2 232 Edge      2700000.edma_ccint
>>  43:          0     GICv2 249 Edge      2700000.edma_ccerrint
>>  44:       2497     GICv2 240 Edge      2728000.edma_ccint
>>  46:          0     GICv2 252 Edge      2728000.edma_ccerrint
>>  47:       7551     GICv2 128 Edge      mmc0
>>  48:          0     GICv2 160 Edge      2680000.keystone-dwc3, xhci-hcd:usb1
>>  49:          0     GICv2 176 Edge      2580000.keystone-dwc3, xhci-hcd:usb3
>>  50:          0     GICv2  96 Edge      21805400.spi
>>  52:          0     GICv2 100 Edge      21805c00.spi
>>  53:          0     GICv2 102 Edge      21806000.spi
>>  54:          0     GICv2  92 Edge      pcie-error-irq
>> 211:          0      GPIO  12 Edge    -davinci_gpio  23000000.mmc cd
>> 280:          0   PCI-MSI   0 Edge      PCIe PME, aerdrv
>> 281:          0   PCI-MSI 524288 Edge      pci-endpoint-test
>> 282:          0   PCI-MSI 524289 Edge      pci-endpoint-test
>> 283:          0   PCI-MSI 524290 Edge      pci-endpoint-test
>> 284:          0   PCI-MSI 524291 Edge      pci-endpoint-test
>> 285:          0   PCI-MSI 524292 Edge      pci-endpoint-test
>> 286:          0   PCI-MSI 524293 Edge      pci-endpoint-test
>> 287:          0   PCI-MSI 524294 Edge      pci-endpoint-test
>> 288:          0   PCI-MSI 524295 Edge      pci-endpoint-test
>> 289:          0   PCI-MSI 524296 Edge      pci-endpoint-test
>> 290:          0   PCI-MSI 524297 Edge      pci-endpoint-test
>> 291:          0   PCI-MSI 524298 Edge      pci-endpoint-test
>> 292:          0   PCI-MSI 524299 Edge      pci-endpoint-test
>> 293:          0   PCI-MSI 524300 Edge      pci-endpoint-test
>> 294:          0   PCI-MSI 524301 Edge      pci-endpoint-test
>> 295:          0   PCI-MSI 524302 Edge      pci-endpoint-test
>> 296:          0   PCI-MSI 524303 Edge      pci-endpoint-test
>> IPI0:          0  CPU wakeup interrupts
>> IPI1:          0  Timer broadcast interrupts
>> IPI2:          0  Rescheduling interrupts
>> IPI3:          0  Function call interrupts
>> IPI4:          0  CPU stop interrupts
>> IPI5:          0  IRQ work interrupts
>> IPI6:          0  completion interrupts
>> Err:          0
>>
>> root@k2g-evm:~# pcitest -m 1
>> [   45.966437] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 271
>> [   45.973544] keystone-pcie 21801000.pcie: irq: bit 0, vector 0, virq 280
>> MSI1:           NOT OKAY
>>
>> Here there is an off by one error. "pcitest -m 1" should ideally have raised an
>> interrupt in 281 but from the above debug print it looks like it's raising an
>> interrupt in 280.
> 
> The above error was due to an pci_endpoint bug. I'll send a patch to fix this
> separately.

Ok great!

>>
>> So I tried disabling the pcieportbus driver. These are my observations once I
>> disable pcieportbus driver
>>
>> root@k2g-evm:~# cat /proc/interrupts
>>            CPU0
>>  17:          0     GICv2  29 Level     arch_timer
>>  18:       2222     GICv2  30 Level     arch_timer
>>  21:          0     GICv2  36 Edge      arm-pmu
>>  22:        821     GICv2 196 Edge      ttyS0
>>  23:          5     GICv2 120 Edge      2530000.i2c
>>  24:          0     GICv2  33 Edge      soc:keystone_irq@26202a0
>>  25:        909     GICv2 356 Level     2a00000.msgmgr rx_005_002
>>  41:          0     GICv2 232 Edge      2700000.edma_ccint
>>  43:          0     GICv2 249 Edge      2700000.edma_ccerrint
>>  44:       2442     GICv2 240 Edge      2728000.edma_ccint
>>  46:          0     GICv2 252 Edge      2728000.edma_ccerrint
>>  47:       7297     GICv2 128 Edge      mmc0
>>  48:          0     GICv2 160 Edge      2680000.keystone-dwc3, xhci-hcd:usb1
>>  49:          0     GICv2 176 Edge      2580000.keystone-dwc3, xhci-hcd:usb3
>>  50:          0     GICv2  96 Edge      21805400.spi
>>  52:          0     GICv2 100 Edge      21805c00.spi
>>  53:          0     GICv2 102 Edge      21806000.spi
>>  54:          0     GICv2  92 Edge      pcie-error-irq
>> 211:          0      GPIO  12 Edge    -davinci_gpio  23000000.mmc cd
>> 280:          0   PCI-MSI 524288 Edge      pci-endpoint-test
>> 281:          0   PCI-MSI 524289 Edge      pci-endpoint-test
>> 282:          0   PCI-MSI 524290 Edge      pci-endpoint-test
>> 283:          0   PCI-MSI 524291 Edge      pci-endpoint-test
>> 284:          0   PCI-MSI 524292 Edge      pci-endpoint-test
>> 285:          0   PCI-MSI 524293 Edge      pci-endpoint-test
>> 286:          0   PCI-MSI 524294 Edge      pci-endpoint-test
>> 287:          0   PCI-MSI 524295 Edge      pci-endpoint-test
>> 288:          0   PCI-MSI 524296 Edge      pci-endpoint-test
>> 289:          0   PCI-MSI 524297 Edge      pci-endpoint-test
>> 290:          0   PCI-MSI 524298 Edge      pci-endpoint-test
>> 291:          0   PCI-MSI 524299 Edge      pci-endpoint-test
>> 292:          0   PCI-MSI 524300 Edge      pci-endpoint-test
>> 293:          0   PCI-MSI 524301 Edge      pci-endpoint-test
>> 294:          0   PCI-MSI 524302 Edge      pci-endpoint-test
>> 295:          0   PCI-MSI 524303 Edge      pci-endpoint-test
>> IPI0:          0  CPU wakeup interrupts
>> IPI1:          0  Timer broadcast interrupts
>> IPI2:          0  Rescheduling interrupts
>> IPI3:          0  Function call interrupts
>> IPI4:          0  CPU stop interrupts
>> IPI5:          0  IRQ work interrupts
>> IPI6:          0  completion interrupts
>> Err:          0
>>
>> root@k2g-evm:~# pcitest -m 1
>> [   57.791535] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 271
>> [   57.798643] keystone-pcie 21801000.pcie: irq: bit 0, vector 0, virq 280
>> MSI1:           OKAY
>> root@k2g-evm:~# pcitest -m 2
>> [   59.791509] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 272
>> [   59.798614] keystone-pcie 21801000.pcie: irq: bit 0, vector 1, virq 281
>> MSI2:           OKAY
>> root@k2g-evm:~# pcitest -m 3
>> [   61.271509] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 273
>> [   61.278616] keystone-pcie 21801000.pcie: irq: bit 0, vector 2, virq 282
>> MSI3:           OKAY
>> root@k2g-evm:~# pcitest -m 4
>> [   62.791514] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 274
>> [   62.798619] keystone-pcie 21801000.pcie: irq: bit 0, vector 3, virq 283
>> MSI4:           OKAY
>> root@k2g-evm:~# pcitest -m 5
>> [   64.311513] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 275
>> [   64.318620] keystone-pcie 21801000.pcie: irq: bit 0, vector 4, virq 284
>> MSI5:           OKAY
>> root@k2g-evm:~# pcitest -m 6
>> [   66.351518] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 276
>> [   66.358624] keystone-pcie 21801000.pcie: irq: bit 0, vector 5, virq 285
>> MSI6:           OKAY
>> root@k2g-evm:~# pcitest -m 7
>> [   67.811516] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 277
>> [   67.818623] keystone-pcie 21801000.pcie: irq: bit 0, vector 6, virq 286
>> MSI7:           OKAY
>> root@k2g-evm:~# pcitest -m 8
>> [   69.291518] keystone-pcie 21801000.pcie: ks_pcie_msi_irq_handler, irq 278
>> [   69.298625] keystone-pcie 21801000.pcie: irq: bit 0, vector 7, virq 287
>> MSI8:           OKAY
>> root@k2g-evm:~# pcitest -m 9
>> MSI9:           NOT OKAY
>> root@k2g-evm:~# pcitest -m 10
>> MSI10:          NOT OKAY
>>
>> So once I disable pcieportbus, I could get the first 8 interrupts correctly.
>> But after that there are no interrupts at all.
> 
> This issues is due to the previous interrupt not acknowledged and below fixes
> the issue.

Besides this issue that you fixed with this patch, is everything working well in
your setup?

> 
> diff --git a/drivers/pci/dwc/pcie-designware-host.c
> b/drivers/pci/dwc/pcie-designware-host.c
> index 2816bd98f66c..b25e788e9828 100644
> --- a/drivers/pci/dwc/pcie-designware-host.c
> +++ b/drivers/pci/dwc/pcie-designware-host.c
> @@ -58,8 +58,20 @@ static void dw_msi_unmask_irq(struct irq_data *d)
>         irq_chip_unmask_parent(d);
>  }
> 
> +static void dw_pci_ack_irq(struct irq_data *d)
> +{
> +       struct msi_desc *msi = irq_data_get_msi_desc(d);
> +       struct pcie_port *pp;
> +
> +       pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
> +
> +       if (pp->ops->msi_irq_ack)
> +               pp->ops->msi_irq_ack(d->irq, pp);
> +}
> +
>  static struct irq_chip dw_pcie_msi_irq_chip = {
>         .name = "PCI-MSI",
> +       .irq_ack = dw_pci_ack_irq,
>         .irq_mask = dw_msi_mask_irq,
>         .irq_unmask = dw_msi_unmask_irq,
>  };
> @@ -193,20 +205,8 @@ static void dw_pci_bottom_unmask(struct irq_data *data)
>         spin_unlock_irqrestore(&pp->lock, flags);
>  }
> 
> -static void dw_pci_bottom_ack(struct irq_data *d)
> -{
> -       struct msi_desc *msi = irq_data_get_msi_desc(d);
> -       struct pcie_port *pp;
> -
> -       pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
> -
> -       if (pp->ops->msi_irq_ack)
> -               pp->ops->msi_irq_ack(d->irq, pp);
> -}
> -
>  static struct irq_chip dw_pci_msi_bottom_irq_chip = {
>         .name = "DWPCI-MSI",
> -       .irq_ack                = dw_pci_bottom_ack,
>         .irq_compose_msi_msg = dw_pci_setup_msi_msg,
>         .irq_set_affinity = dw_pci_msi_set_affinity,
>         .irq_mask = dw_pci_bottom_mask,
> @@ -240,7 +240,7 @@ static int dw_pcie_irq_domain_alloc(struct irq_domain *domain,
>         for (i = 0; i < nr_irqs; i++)
>                 irq_domain_set_info(domain, virq + i, bit + i,
>                                     &dw_pci_msi_bottom_irq_chip,
> -                                   domain->host_data, handle_simple_irq,
> +                                   domain->host_data, handle_level_irq,
>                                     NULL, NULL);
> 
>         return 0;
> 
> Thanks
> Kishon
> 





[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux