I have 2 identical pcds. The boards are identical except one has a IMX6Q and the other a IMX6Q+ processor. Using the same SD card to boot both machines (therefore the code is identical) one processor load PCIe and it works and will print out the pci -v information. The other board does not completely boot and hangs when it tries to find the physical link.
The code in question is as follows:
/* wait for the physical link to start */
static int pcie_wait_link_up(imx6x_dev_t *pdev, int wait_ms)
{
uint32_t val;
int count;
// Fix for POR 0000270 : PCI driver hangs when re-started after being slayed
// We need to allow time for the link to settle before reading the DB_R1 register
// otherwise the system will hang.
delay(100);
count = wait_ms;
#ifdef PCI_DEBUG
printf( "pcie_wait_link_up %d addr=0x%X\n", count, pdev->pci_dbi_base + DB_R1 );
#endif
do
{
val = in32(pdev->pci_dbi_base + DB_R1) & (0x1 << (36 - 32)); // link is debug bit 36 debug 1 start in bit 32
delay(1);
count--;
} while ( !val && ((count > 0) || (wait_ms == 0)) );
if (!val)
return -1;
return 0;
}
It never returns from the in32 as I have put a debug statement following it that never happens. This kills every other process on the unit also.
Please let me know what you would like to help resolve this issue. We need to get this solved as soon as possible. Thanks so much.
Hi Steve
please look at solutions provided on
IMX6Q: Linux boot halts at PCIe config space read
pcie works fine on latest nxp official releases described on
Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------