On Tue, Jun 08, 2021 at 08:44:49AM +0100, Jon Hunter wrote: > On 08/06/2021 00:50, Bjorn Helgaas wrote: > > ... > > > My understanding is that we want pcie-tegra194.c to be: > > > > - Built into the kernel when CONFIG_PCIE_TEGRA194=m or =y and > > CONFIG_ACPI=y and CONFIG_PCI_QUIRKS=y. If we're using the ACPI > > pci_root.c driver, we must have the MCFG quirk built-in, and this > > case worked as I expected (this is on x86): > > > > $ grep -E "CONFIG_(ACPI\>|PCI_QUIRKS|PCIE_TEGRA194)" .config > > CONFIG_ACPI=y > > CONFIG_PCI_QUIRKS=y > > CONFIG_PCIE_TEGRA194=y > > CONFIG_PCIE_TEGRA194_HOST=m > > CONFIG_PCIE_TEGRA194_EP=y > > > > $ rm drivers/pci/controller/dwc/pcie-tegra194.*o > > $ make drivers/pci/controller/dwc/ > > ... > > CC drivers/pci/controller/dwc/pcie-tegra194.o > > AR drivers/pci/controller/dwc/built-in.a > > > > - Built as a module when CONFIG_PCIE_TEGRA194=m and CONFIG_ACPI is > > not set. In this case, we're not using the ACPI pci_root.c > > driver, and we don't need the MCFG quirk built-in, so it should be > > OK to build a module, and IIUC this patch is supposed to *allow* > > that. But in my testing, it did *not* build a module. Am I > > missing something? > > > > $ grep -E "CONFIG_(ACPI\>|PCI_QUIRKS|PCIE_TEGRA194)" .config > > # CONFIG_ACPI is not set > > # CONFIG_PCI_QUIRKS is not set > > CONFIG_PCIE_TEGRA194=y > > CONFIG_PCIE_TEGRA194_HOST=m > > CONFIG_PCIE_TEGRA194_EP=y > > The problem appears to be that you still have CONFIG_PCIE_TEGRA194=y and > CONFIG_PCIE_TEGRA194_EP=y above. If I have ... Huh. I can't set CONFIG_PCIE_TEGRA194 directly; it's only selectable by PCIE_TEGRA194_HOST and PCIE_TEGRA194_EP. PCIE_TEGRA194 is tristate, but apparently kconfig sets it to the most restrictive, which I guess makes sense. So I would expect the shared infrastructure to be built-in if either driver is built-in, but it's somewhat confusing that CONFIG_PCIE_TEGRA194_HOST=m results in a builtin driver. If I can set CONFIG_PCIE_TEGRA194_HOST and CONFIG_PCIE_TEGRA194_EP independently, it seems like they should *be* independent. What is the purpose of PCIE_TEGRA194_EP (added by c57247f940e8 ("PCI: tegra: Add support for PCIe endpoint mode in Tegra194") [1])? I don't see any reference to it in a makefile or a source file. It looks like one can build a single driver that works in either host or endpoint mode, depending on whether a DT node matches "nvidia,tegra194-pcie" or "nvidia,tegra194-pcie-ep". So I think PCIE_TEGRA194_EP is superfluous and should be removed and you should have a single tristate Kconfig option. Tangentially related, this cast in tegra_pcie_dw_probe() looks unnecessary: pcie->mode = (enum dw_pcie_device_mode)data->mode; Looks like it was copied from similar code in dra7xx_pcie_probe(), artpec6_pcie_probe(), and dw_plat_pcie_probe(), which are all littered with similar unnecessary casts. But that should be solved separately from the Kconfig question. [1] https://git.kernel.org/linus/c57247f940e8 > $ grep -E "CONFIG_(ACPI\>|PCI_QUIRKS|PCIE_TEGRA194)" .config > # CONFIG_ACPI is not set > CONFIG_PCI_QUIRKS=y > CONFIG_PCIE_TEGRA194=m > CONFIG_PCIE_TEGRA194_HOST=m > # CONFIG_PCIE_TEGRA194_EP is not set > > > > > > $ rm drivers/pci/controller/dwc/pcie-tegra194.*o > > $ make drivers/pci/controller/dwc/ > > ... > > CC drivers/pci/controller/dwc/pcie-tegra194.o > > AR drivers/pci/controller/dwc/built-in.a > > Then I see ... > > $ rm drivers/pci/controller/dwc/pcie-tegra194.*o > $ make drivers/pci/controller/dwc/ > ... > CC [M] drivers/pci/controller/dwc/pcie-tegra194.o > > Cheers > Jon > > -- > nvpublic