//问题:
①pcie控制器有自己的寄存器,为什么在设备树中还指定了控制器寄存器的reg范围?
②Region 0配置空间的作用,仅用于访问外部pcie的配置空间??
//EP的inbound和outbound,DMA和MSI中断 测试?
//其它成功解决pcie问题的案例:
①因pcie控制器和pcie设备时钟不同源引起的link不稳定问题:现象为读写设备的内存空间不稳定、读写设备的配置空间正常。通过pci display.b 0.0.0 404查看LTSSM状态出现不稳定的状态(https://www.cnblogs.com/chengqi521/p/8651641.html)
//参考文献
[持续演进]资料整理:可以学习 1W 小时的 PCIe (zhihu.com)
//控制器器驱动框架
//设备枚举
//中断机制: 可能都支持INTx、MSI、MSI-X,这3中方式只能选择一种,根据硬件需求,目前通常使用的是MSI中断机制,capability字段控制
//空间都不是很大,如何实现pcie高速设备的特性的?
/配置空间涉及Bus、Dev、Func的传输(通常在cpu地址上体现);以及访问peci_ep的内存空间涉及cpu_addr--> pcie_addr的地址转换;(了解通过寄存器操作的方式或自己编写API去读写pcie_ep的配置空间以及内存空间????)
RK3399访问PCIe控制器时,CPU地址空间可以分为: * Client Register Set:地址范围 0xFD000000~0xFD7FFFFF,比如选择PCIe协议的版本(Gen1/Gen2)、电源控制等 * Core Register Set :地址范围 0xFD800000~0xFDFFFFFF,所谓核心寄存器就是用来进行设置地址映射的寄存器等 * Region 0:0xF8000000~0xF9FFFFFF , 32MB,用于访问外接的PCIe设备的配置空间 * Region 1:0xFA000000~0xFA0FFFFF,1MB,用于地址转换 * Region 2:0xFA100000~0xFA1FFFFF,1MB,用于地址转换 * …… * Region 32:0xFBF00000~0xFBFFFFFF,1MB,用于地址转换 其中Region 0大小为32MB,Region1~31大小分别为1MB。 CPU访问Region 0的地址时,将会导致PCIe控制器发出读写配置空间的TLP。 CPU访问Region 1~32的地址时,将会导致PCIe控制器发出读写内存、IO空间的TLP。
//内核驱动的proc与sys接口运用??
//PCI设备用DMA访问存储器时,会存在cache一致性问题,是如何解决的?0
//将设备绑定到vfio-pci驱动
echo 10ec 8168 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
// -x显示设备内存空间(开始的128位)-xxx显示全部的配置空间
lspci -s 00:05.0 -vx
//查看pci设备的属性及一些详细信息
lspci -s 00:05.0 -vvv
使用 lspci 和 setpci 调试 PCIe 问题 (xilinx.com)
Step1:如图中(1)所示,未初始化的BAR的低比特(11~4)都是0,高比特(31~12)都是不确定的值。所谓初始化,就是系统(软件)向整个BAR都写1,来确定BAR的可操作的最低位是哪一位。当前可操作的最低位为12,因此当前BAR可申请的(最小)地址空间大小为4KB(2^12)。
如果可操作的最低位为20,则该BAR可申请的(最小)地址空间大小为1MB(2^20)。
Step2:完成初始化(写1操作)之后,软件便开始读取BAR的值,来确定每一个BAR对应的地址空间大小和类型。其中操作的类型一般由最低四位所决定,具体如上图右侧部分所示。
Step3:最后一步是,软件向BAR的高比特写入地址空间的起始地址(Start Address)。如图中所示,为0xF9000000。
//pcie译文了解
6 Flow Control
P215-p243
/流量控制是用来确保在接收者无法接收 TLP 时,发送方不会再继续发送 TLP。这避免了接收 Buffer 溢出,也消除了原本 PCI 工作方式中的一些低效行为,比如断开、重试和等待态
/在发送任何事务之前,都需要进行流控初始化(flow control initialization)。事实上,在流控初始化成功完成之前,TLP 是不能在链路上进行发送的。流控初始化会发生于系统中的每一个链路,其过程主要为链路两端设备之间的一次握手。这一过程会在物理层的链路训练(link training)完成后就开始进行。链路层观察 LinkUp 信号是否有效,获知物理层何时处于 Ready 状态
12 物理层逻辑(Gen3)
P407-p446 https://zhuanlan.zhihu.com/p/570155557
主要的变化包括相对于 Gen2 ,Gen3 在没有倍增频率(链路速度只是从 5 GT/s 提高到 8 GT/s)的情况下,将带宽提高两倍
//小结:
在PCIe总线的扩展配置空间中,存放PCIe所独有的一些Capability结构,而PCI设备不能使用这段空间;
14 链路训练与状态控制状态机
原文(p564 -p644)--> 译文https://zhuanlan.zhihu.com/p/571308775
【毅力挑战】PCIe 每日一问一答(目录篇)_pcie基础知识相关问题提问_MangoPapa的博客-CSDN博客
//其它:
//PCIe物理层链路训练:https://blog.csdn.net/weixin_48180416/category_11008351.html
//恩智浦社区解答:725
1.pcie x4配置,不能分开连接4 个x1的设备
Solved: LS20xxA - PCIe related question - NXP Community
2.uboot下的测试命令pci 6
!!! Solved: T1023 PCIe issues - NXP Community
3.物理层一致性(Compliance)测试,涉及到了速率的寄存器配置 https://community.nxp.com/t5/Layerscape/LS1046A-PCIe-compliance-mode-set-speed-to-5Gbit-s/m-p/809940
4.配置空间资源分配失败,打印 : [ 1.307700] pci 0000:01:00.0: BAR 0: can't assign mem pref (size 0x4000000)
Solved: I.MX6Q PCI-E Can't assign mem pref - NXP Community
5. re-establishing通过寄存器操作
Solved: i.MX6Q: Re-establishing a PCIe link - NXP Community
6.uboot下的pcie调试命令 pci display.b 02.00.00 70
Solved: [lx2160ardb_rev2] PCIe card can't be detected - NXP Community
7.pcie使能配置imx6ull
Solved: imx8mm PCI enabling issues. - NXP Community
8.速率改变测试
Solved: LS1046A - PCIe compliance mode - set speed to 5Gbi... - NXP Community
Solved: i.MX7D PCIe behavior of "Directed_Speed_Change" in... - NXP Community
Solved: i.mx6 PCIE bandwidth issue - NXP Community
Solved: How to force i.MX8 MQuad PCIe into Gen1 mode - NXP Community
9.通过insmod的方式实现在低功耗模式下,pcie的热插拔?
Solved: Suspend/Wakeup issue with PCIe card plugged - NXP Community
10.pcie detect
Solved: i.MX6 - PCIe not detecting some devices in Linux 3... - NXP Community
11. dma在ep端配置,host无pcie_dma? 那2160与21dr的256k内存空间够用?
Solved: imx6 pci dma operation - NXP Community
Solved: P2020 DMA over PCIE to FPGA - NXP Community
12.配置空间相关
Solved: pci problem - 2 BARs given same address - NXP Community
Solved: LS1046A QDMA Operation Issue - NXP Community
Solved: How to change PCI memory size - NXP Community
Solved: T1042D4RDB PCIe BAR and ATMU Outbound Relation - NXP Community
13.clock时钟相关问题
Solved: IMX6 PCIe link up problem - NXP Community
Solved: iMX8M PCIe error - NXP Community
14.wakeup_pin configuration
Solved: [i.MX6Q]configuration for PCIE_WAKE pin - NXP Community
15.LTSSM
Solved: Read LTSSM value in 8569 board - NXP Community
16.MSI中断使能配置
Solved: i.MX6q PCIe error at request_irq in pcie_pme_probe - NXP Community
Solved: Can't get MSI interrupts on ls1046a rdb - NXP Community
////LTSSM
1.why the pcie of MPC8315 can not detect the devices... - NXP Community
PCIe link doesn't come up with XIO2001 PCI bridge ... - NXP Community
//配置空间读写
PCIe Configuration Space基础知识学习_Amelie_yalili的博客-CSDN博客
//
1.imx眼图相关微调寄存器:LN0_TX_DRV_LVL_CTRL_G1
2.在compliance模式下,更改速率测试:读-->改-->写 (devmem 0x34000a0 h;改的时候分两步执行a. Set the Target link speed bit field (T_LS) to the desired speed (0x2). b. Set the Enter Compliance (EC) bit <devmem 0x34c07fc h 查看状态机是否进入compliance状态>;)
3.正常模式下更改速率:修改Link Control 2 Register的低4位,设置速率;Link Control Register第5位置1,重新训练速率。
如果要重新强制PCIE速率为2.5GT/s,可以输入以下命令:setpci -s 00:1c.0 CAP_EXP+0x30.b=0x0 setpci -s 00:1c.0 CAP_EXP+0x10.b=0x20
PCIE配置空间设置_缥缈孤鸿_jason的博客-CSDN博客
4.官方的配置控制bit表 http://arbor.mindshare.com/arbor/refview?pane=index
5.
12
//瑞芯微pcie异常排查手册
1.温度
2.长期工作下出现的异常,通过debugfs老化测试 /sys/kernel/debug/fe160000.pcie
3.!!! Unknown header type 7f 可能概率性导致其虽然可以被系统枚举,但是实际工作不正常: 复位时间不够长
4.可以Link up但是却没有枚举出设备:可能出现link up之后还未完全运行好其内部程序,导致RC去枚举时候读取到0的非法ID,修改为msleep(1000)
5.PCIe控制器外接实时性需求比较高的外设时,可通过控制器的Qos相关的寄存器,例如提高pcie2x1接口为第一优先级: io -4 0xfe190008 0x80000303
6.设备分配到legacy中断号为0,设备驱动到Linux平台上,没有适配好pci bus driver模型,导致pci_assign_irq函数未被调用,导致legacy中断未分配
7.目前有发现个别Wi-Fi模块休眠唤醒的时候,协议栈无法将其设置从D3 hot切换为D0状态,导致休眠唤醒流程失败
8.PCIe 3.0接口休眠唤醒时系统异常:原因是休眠时候关闭3.3v电源时导致了时钟晶振的电源异常,将3.3v电源和晶振的供电飞线改为外部供电,排除异常
9.外设枚举过程报FW异常:如设备在枚举过程分配BAR空间报如下两类错误,一般问题是设备的BAR空间与协议不兼容,需要特殊处理。需要修改drivers/pci/quirks.c中,增加对应quirk处理。具体信息应该咨询设备厂商。目前已知JMB585芯片给出的解决办法是需要重复读取BAR空间,才可以解决他们Fireware的异常,那么可以使用echo 1 > /sys/bus/pci/rescan重新对链路进行扫描,可以修复。
10.MSI/MSI-X无法使用: Enable-表示未使能,此情况一般是设备驱动还未加载或者加载时申请MSI或者MSI-X失败导致,可结合其他成熟的PCIe外设驱动使用pci_alloc_irq_vectors等函数进行申请;其次查看计数,修改中断的亲和性echo 2 > /proc/irq/229/smp_affinity_list测试;最后还是不行则测量相关信号
11.可以通过写寄存器触发MSI-X中断
12.何进入Compliance信号测试模式,硬件握手进入对应的测试模式,软件上需要在源码中关闭低功耗模式
How to debug dysfunctional SERDES (PCIe, SATA, SGM... - NXP Community:
其它:
ep设备相关的问题
pcie转usb涉及的相关问题