Patch "powerpc/pci: Add ppc_md.discover_phbs()" has been added to the 4.19-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    powerpc/pci: Add ppc_md.discover_phbs()

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     powerpc-pci-add-ppc_md.discover_phbs.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ea1a4d02a77e67b3e1bffe56125f3485ed93e2a0
Author: Oliver O'Halloran <oohall@xxxxxxxxx>
Date:   Tue Nov 3 15:35:06 2020 +1100

    powerpc/pci: Add ppc_md.discover_phbs()
    
    [ Upstream commit 5537fcb319d016ce387f818dd774179bc03217f5 ]
    
    On many powerpc platforms the discovery and initalisation of
    pci_controllers (PHBs) happens inside of setup_arch(). This is very early
    in boot (pre-initcalls) and means that we're initialising the PHB long
    before many basic kernel services (slab allocator, debugfs, a real ioremap)
    are available.
    
    On PowerNV this causes an additional problem since we map the PHB registers
    with ioremap(). As of commit d538aadc2718 ("powerpc/ioremap: warn on early
    use of ioremap()") a warning is printed because we're using the "incorrect"
    API to setup and MMIO mapping in searly boot. The kernel does provide
    early_ioremap(), but that is not intended to create long-lived MMIO
    mappings and a seperate warning is printed by generic code if
    early_ioremap() mappings are "leaked."
    
    This is all fixable with dumb hacks like using early_ioremap() to setup
    the initial mapping then replacing it with a real ioremap later on in
    boot, but it does raise the question: Why the hell are we setting up the
    PHB's this early in boot?
    
    The old and wise claim it's due to "hysterical rasins." Aside from amused
    grapes there doesn't appear to be any real reason to maintain the current
    behaviour. Already most of the newer embedded platforms perform PHB
    discovery in an arch_initcall and between the end of setup_arch() and the
    start of initcalls none of the generic kernel code does anything PCI
    related. On powerpc scanning PHBs occurs in a subsys_initcall so it should
    be possible to move the PHB discovery to a core, postcore or arch initcall.
    
    This patch adds the ppc_md.discover_phbs hook and a core_initcall stub that
    calls it. The core_initcalls are the earliest to be called so this will
    any possibly issues with dependency between initcalls. This isn't just an
    academic issue either since on pseries and PowerNV EEH init occurs in an
    arch_initcall and depends on the pci_controllers being available, similarly
    the creation of pci_dns occurs at core_initcall_sync (i.e. between core and
    postcore initcalls). These problems need to be addressed seperately.
    
    Reported-by: kernel test robot <lkp@xxxxxxxxx>
    Signed-off-by: Oliver O'Halloran <oohall@xxxxxxxxx>
    [mpe: Make discover_phbs() static]
    Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20201103043523.916109-1-oohall@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index a47de82fb8e2..bda87cbf106d 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -71,6 +71,9 @@ struct machdep_calls {
 	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge
 				*bridge);
 
+	/* finds all the pci_controllers present at boot */
+	void 		(*discover_phbs)(void);
+
 	/* To setup PHBs when using automatic OF platform driver for PCI */
 	int		(*pci_setup_phb)(struct pci_controller *host);
 
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 88e4f69a09e5..74628aca2bf1 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1671,3 +1671,13 @@ static void fixup_hide_host_resource_fsl(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl);
+
+
+static int __init discover_phbs(void)
+{
+	if (ppc_md.discover_phbs)
+		ppc_md.discover_phbs();
+
+	return 0;
+}
+core_initcall(discover_phbs);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux