Has anyone attempted to re-establish a PCIe link to an endpoint after the link dropped? In my case I have a Gen2 PCIe link established to a single endpoint when Linux comes up. I take the endpoint down either by resetting it or performing a PCIe "hot reset". In all cases the PCIe link comes back as a Gen1 link. However, as soon as any traffic is sent over the link (reading the Vendor ID via a config-read, for example) the i.MX6Q hangs.
The LTSSM on the i.MX6Q seems to get to the final "L0" state. I've looked at the link re-establishment using a PCIe protocol analyzer. I don't think the i.MX6Q ever initiates a "speed change" to Gen2 the way it does on the initial bring-up.
Anyone else see this?
-Charlie
Solved! Go to Solution.
Re-establish a PCIe link is apparently hindered by a published i.MX6 erratum - ERR005184: "PCIe: Clock pointers can lose sync during clock rate changes". This probably may have been exacerbated in my case since I'm using an external reference for PCIe (see my previous post). The erratum write up says the workaround is implemented in version ER3 of Freescale's BSP. However, I think that implementation is incomplete. The steps that I took to get the link up after it dropped are below.
Re-establish a PCIe link is apparently hindered by a published i.MX6 erratum - ERR005184: "PCIe: Clock pointers can lose sync during clock rate changes". This probably may have been exacerbated in my case since I'm using an external reference for PCIe (see my previous post). The erratum write up says the workaround is implemented in version ER3 of Freescale's BSP. However, I think that implementation is incomplete. The steps that I took to get the link up after it dropped are below.