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.

How are you forcing the re-scan?  We can see if we can add a re-check of the 
link state in that flow somewhere.

Can you do a dump_stack() or something to get a call chain?

- k
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to