RE: [EXTERNAL] pcib msix allocation in arm64

From: Souradeep Chakrabarti <schakrabarti_at_microsoft.com>
Date: Fri, 02 Dec 2022 10:44:14 UTC


> -----Original Message-----
> From: Souradeep Chakrabarti
> Sent: Friday, December 2, 2022 2:50 AM
> To: Andrew Turner <andrew@fubar.geek.nz>; Andrew Turner
> <andrew@freebsd.org>
> Cc: Warner Losh <imp@bsdimp.com>; Wei Hu <weh@microsoft.com>; freebsd-
> hackers@FreeBSD.org
> Subject: RE: [EXTERNAL] pcib msix allocation in arm64
> 
> 
> Adding Andrew.
> 
> > -----Original Message-----
> > From: Souradeep Chakrabarti
> > Sent: Thursday, December 1, 2022 5:24 PM
> > To: Andrew Turner <andrew@fubar.geek.nz>
> > Cc: Warner Losh <imp@bsdimp.com>; Wei Hu <weh@microsoft.com>;
> freebsd-
> > hackers@FreeBSD.org
> > Subject: RE: [EXTERNAL] pcib msix allocation in arm64
> >
> >
> >
> >
> > > -----Original Message-----
> > > From: Andrew Turner <andrew@fubar.geek.nz>
> > > Sent: Thursday, November 3, 2022 6:21 PM
> > > To: Souradeep Chakrabarti <schakrabarti@microsoft.com>
> > > Cc: Warner Losh <imp@bsdimp.com>; Wei Hu <weh@microsoft.com>;
> > freebsd-
> > > hackers@FreeBSD.org
> > > Subject: Re: [EXTERNAL] pcib msix allocation in arm64
> > >
> > > Hi Souradeep,
> > >
> > > For the vmbus_pcib driver you’ll need to implement the
> > > pcib_alloc_msi, pcib_release_msi, and the msix versions, and pcib_map_msi.
> > >
> > > For alloc and release you can just call into the same intr_*
> > > function as pci_host_generic_acpi.c. You’ll need to pass in the xref
> > > for the interrupt
> > controller.
> > > It needs to be the xref the MSI controller registered. For the
> > > GICv2m it’s ACPI_MSI_XREF.
> > [Souradeep]
> > I am currently specifying gic_mbi_start and gic_mbi_end with SPI start
> > and end number, in gic_v3_acpi_attach() and I can see my
> > intr_alloc_msi() and
> > intr_map_msi() are working. But then mlx driver is getting stuck at CREATE_EQ .
> >
> > mlx5_core0: WARN: wait_func:967:(pid 0): CREATE_EQ(0x301) timeout.
> > Will cause a leak of a command resource
> > mlx5_core0: WARN: mlx5_start_eqs:588:(pid 0): failed to create async
> > EQ -60
> > mlx5_core0: ERR: mlx5_load_one:1157:(pid 0): Failed to start pages and
> > async EQs
> > mlx5_core0: WARN: wait_func:967:(pid 0): MANAGE_PAGES(0x108) timeout.
> > Will cause a leak of a command resource
> > mlx5_core0: ERR: reclaim_pages:444:(pid 0): failed reclaiming pages
> > mlx5_core0: WARN: mlx5_reclaim_startup_pages:574:(pid 0): failed
> > reclaiming pages (-60)
> > mlx5_core0: ERR: init_one:1644:(pid 0): mlx5_load_one failed -60
> >
> >
> > gic_v3_acpi_attach( )
> > --
> > --
> > 323     sc->gic_mbi_start = 64;
> > 324     sc->gic_mbi_end = 920;
> > 325
> > 326     err = gic_v3_attach(dev);
> > 327     if (err != 0)
> > 328         goto error;
> > 329
> > 330     sc->gic_pic = intr_pic_register(dev, ACPI_INTR_XREF);
> > 331     if (sc->gic_pic == NULL) {
> > 332         device_printf(dev, "could not register PIC\n");
> > 333         err = ENXIO;
> > 334         goto error;
> > 335     }
> > 336     err = intr_msi_register(dev, ACPI_MSI_XREF);
> > 337     if (err) {
> > 338         device_printf(dev, "could not register MSI\n");
> > 339     }
> > 340     if (intr_pic_claim_root(dev, ACPI_INTR_XREF, arm_gic_v3_intr, sc,
> > 341         GIC_LAST_SGI - GIC_FIRST_SGI + 1) != 0) {
> > 342         err = ENXIO;
> > 343         goto error;
> > 344     }
> > We don't have SPI range mentioned in ACPI DSDT, so I need to specify
> > it manually in the code.
> > It looks like MSI interrupt is not coming to the mlx.
> > Is there any interrupt remapping blocked by FreeBSD kernel here?
> >
> > >
> > > For pcib_map_msi I am unsure if the current code is valid on arm64.
> > > If not you’ll need to call intr_map_msi.
> > >
> > > Andrew
> > >
> > > > On 2 Nov 2022, at 22:27, Souradeep Chakrabarti
> > > > <schakrabarti@microsoft.com>
> > > wrote:
> > > >
> > > > Hi Andrew,
> > > > Thanks for the reply. Regarding generic_pcie_acpi_alloc_msix( ),
> > > > it can be called if the PCI device is child of the generic pcib (
> > > DRIVER_MODULE(pcib, acpi, generic_pcie_acpi_driver, 0, 0) .
> > > > But if the PCI device is communicating with a different pcib
> > > > driver (like vmbus_pcib), in that case do we need to implement all
> > > > these functions of
> > > pci_host_generic_acpi.c ?
> > > >
> > > > Or there are some ways to reuse them?
> > > >
> > > >> -----Original Message-----
> > > >> From: Andrew Turner <andrew@fubar.geek.nz>
> > > >> Sent: Wednesday, November 2, 2022 6:54 PM
> > > >> To: Souradeep Chakrabarti <schakrabarti@microsoft.com>
> > > >> Cc: Warner Losh <imp@bsdimp.com>; Wei Hu <weh@microsoft.com>;
> > > >> freebsd- hackers@FreeBSD.org
> > > >> Subject: [EXTERNAL] Re: pcib msix allocation in arm64
> > > >>
> > > >>
> > > >>> On 2 Nov 2022, at 12:56, Souradeep Chakrabarti
> > > >>> <schakrabarti@microsoft.com>
> > > >> wrote:
> > > >>>
> > > >>> Hi,
> > > >>> I can see in x86 nexus.c has implemented pcib_alloc_msix using
> > > >> nexus_alloc_msix().
> > > >>> Which calls msix_alloc() for msix allocation.
> > > >>>
> > > >>> But in case of arm64 I don't find similar pcib_alloc_msix
> > > >>> implementation in
> > > >> nexus.c .
> > > >>> So, on arm64 what is correct way to get allocate msix ?
> > > >>
> > > >> For an arm64 system with ACPI it is most likely handled in
> > > >> generic_pcie_acpi_release_msix. For FDT it can depend on which
> > > >> PCI driver is used.
> > > >>
> > > >> In either case it will call into intr_release_msix that then
> > > >> calls into the MSI controller to allocate the vectors. For a
> > > >> GICv3 driver it will either be gicv3_its_alloc_msix if you have
> > > >> an ITS device, or gic_v3_alloc_msix if using MBI ranges.
> > > >>
> > > >> On ACPI we don’t currently support MBI ranges, although it looks
> > > >> like this could be handled by the existing gicv2m driver. This
> > > >> driver should already work as a child of the GICv3, however it
> > > >> appears to be FDT only, so will need some work to add ACPI support.
> > > >>
> > > >> Andrew
> > > >
[Souradeep] 
One more question here, when enabling IOMMU option in arm64, I am getting multiple 
compilation errors. Has FreeBSD been compiled with IOMMU for arm64?
In file included from iommu_if.c:31:
./iommu_if.h:173:33: error: unknown type name 'pcell_t'
                                pcell_t *cells, int ncells);
                                ^
./iommu_if.h:176:39: error: unknown type name 'pcell_t'
                                      pcell_t *cells, int ncells)
                                      ^
2 errors generated.
/datadrive/sandbox3/src/sys/arm64/iommu/smmu_fdt.c:208:11: error: too many arguments provided to function-like macro invocation                                                                                      0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);                                                                                                                                                                     ^                                                                                                                                                                                                      /datadrive/sandbox3/src/sys/sys/bus.h:826:9: note: macro 'EARLY_DRIVER_MODULE' defined here                                                                                                                      #define EARLY_DRIVER_MODULE(name, busname, driver, evh, arg, pass)      \                                                                                                                                                ^                                                                                                                                                                                                        /datadrive/sandbox3/src/sys/arm64/iommu/smmu_fdt.c:207:1: error: type specifier missing, defaults to 'int' [-Werror,-Wimplicit-int]                                                                              EARLY_DRIVER_MODULE(smmu, simplebus, smmu_fdt_driver, smmu_fdt_devclass,                                                                                                                                         ^