Kumar Gala <ga...@kernel.crashing.org> wrote on 2012/07/20 20:53:10:
> From: Kumar Gala <ga...@kernel.crashing.org> > To: Joakim Tjernlund <joakim.tjernl...@transmode.se>, > Cc: scottw...@freescale.com, linuxppc-...@ozlabs.org > Date: 2012/07/20 20:53 > Subject: Re: mpc8xxx PCIe hotplug needs fixing, some clues .. > > > On Jul 20, 2012, at 2:17 AM, Joakim Tjernlund wrote: > > > > > Hi Guys > > > > I see that you have been hacking Freescale PCI before so I send this to > > you(and the list) > > > > We are using PCIe(as RC) on P2010(basically a mpc85xx) and have PCI device > > that > > started from user space (needs advance clock conf) so when linux boots > > there is > > no device at all. > > Trying to "hotplug" the device after it is enabled fails, no amount of > > recan/remove using > > either fake or real hotplug makes a difference. > > > > I found the cause eventually but I can't fix it properly as I known almost > > nothing about PCI. > > Cause: > > indirect_pci.c:indirect_read_config() tests for if (hose->indirect_type & > > PPC_INDIRECT_TYPE_NO_PCIE_LINK) > > and returns PCIBIOS_DEVICE_NOT_FOUND > > > > PPC_INDIRECT_TYPE_NO_PCIE_LINK get set by fsl_pci.c (look for > > fsl_pcie_check_link) but is never cleared. > > Clearing it as appropriate makes a small difference. If you > > remove the RC and do a few of rescan's then the device appears. > > > > Hacking some more, like so: > > > > int fsl_pcie_check_link(struct pci_controller *hose) > > { > > u32 val; > > > > early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val); > > hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK; > > if (val < PCIE_LTSSM_L0) > > return 1; > > hose->indirect_type &= ~PPC_INDIRECT_TYPE_NO_PCIE_LINK; > > return 0; > > } > > and then using it carefully(it is easy to make linux hang) in > > indirect_read_config(): > > indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset, > > int len, u32 *val) > > { > > struct pci_controller *hose = pci_bus_to_host(bus); > > volatile void __iomem *cfg_data; > > u8 cfg_type = 0; > > u32 bus_no, reg; > > > > if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) { > > if (bus->number != hose->first_busno || > > devfn != 0) { > > fsl_pcie_check_link(hose); > > return PCIBIOS_DEVICE_NOT_FOUND; > > } > > } > > > > Now it works, just one rescan and the device appears! > > This is a hack, I don't known what other trouble it can cause, I hope you > > can > > sort this out. > Related, should not all those fsl quirks be __devinit instead of __init? See this for motivation http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=85a053fa5f2d67ae5b2968305b16e8d2fe4cdf4d Could quirk_fsl_pcie_header be moved to early fixup time? I recall some code, maybe is was hotplug, complaining about not recognising the header because it executed before the header fixup. Jocke _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev