我正在开发基于
imx8mm-evk 的定制板。我们使用 linux 主线,
内核 6.0.9,以便让一些事情正常工作。此时切换到 nxp 内核不是可取的。
我无法让 pcie 总线上的外部芯片工作。我已经激活了以下配置:
- PCI_IMX6
- PHY_FSL_IMX8M_PCIE
但是当运行
“lspci”时什么也没有显示。
消息 | grep "pci"给我:
[1.273280]ehci-pci:EHCI PCI平台驱动程序
[1.289328]ohci-pci:OHCI PCI平台驱动程序
[1.465961]imx6q-pcie 33800000.pcie:主机桥/soc@0/pcie@33800000范围:
[1.479355]imx6q-pcie 33800000.pcie:IO 0x001ff80000..0x001ff8ffff-> 0x0000000000
[1.490248] IMX6Q-PCIE 33800000.pcie:MEM 0x00180000000000000000001FEFFFF-> 0x0018000000000000000000000000000000000000000000000000000000000000000000000000个
phyphy.1.503957
] 1.536879] phy phy-32f00000.pcie-phy.0: phy init failed --> -110
[ 1.543736] imx6q-pcie 33800000.pcie: 等待 PHY 就绪超时!
[ 1.557555] imx6q-pcie: 33800000.pcie 的探测失败,错误为 -110
有趣的是,我可以让它与 nxp 内核
imx_5.4.70_2.3.0一起工作,所以我认为硬件或定制板没有任何问题。当然,DTS 在这个内核上有点不同。
比较这两个内核时,特别是与上述错误“phy init failed”相关的部分,存在重大差异。具体代码在phy-driver中,文件
phy-fsl-imx8m-pcie.c,函数“
imx8_pcie_phy_init() ”。如果下面的 return 语句返回一个 < 0 的值,我们将得到错误
“phy init failed”。
在
imx_5.4.70_2.3.0内核中:
/* wait for pipe0_clk locked by checking status from PCS. */
for (retries = 0; retries < PHY_PLL_LOCK_WAIT_MAX_RETRIES;
retries++) {
value = readl(imx8_phy->base + 0x8188);
if (value == BIT(1))
break;
udelay(10);
}
if (retries >= PHY_PLL_LOCK_WAIT_MAX_RETRIES) {
pr_info("pcie phy pipe clk is not ready\n");
return -E
tiMEDOUT;
}在
主线 6.0.9内核中:
/* Polling to check the phy is ready or not. */
ret = readl_poll_timeout(imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG75,
val, val == PCIE_PHY_CMN_REG75_PLL_DONE, 10, 20000);
return ret;在运行此代码之前,我们读取以查看 phy init 是否成功的寄存器 (
imx8_phy->base + ) 已设置。但是设置这个寄存器的代码在两个不同版本的驱动程序中也有很大不同。
有没有人设法让 PCIe 与主线内核驱动程序一起工作?我觉得它应该经过测试,并且应该有效。移植驱动程序似乎很麻烦,因为整个 phy 接口已经改变了很多。