//问题:

①pcie控制器有自己的寄存器,为什么在设备树中还指定了控制器寄存器的reg范围?

②Region 0配置空间的作用,仅用于访问外部pcie的配置空间??

//EP的inbound和outbound,DMA和MSI中断 测试?

阿wei:
要学习PCI驱动,需要具备3方面的知识:
一.PCI协议:
不需要太深入,知道PCI配置空间的一些概念即可。
比如,一个PCI设备要接入系统,并且能让驱动访问它,那么:
1. 你需要知道它的地址空间。
2. 这个地址空间是内核PCI核心驱动给它分配的
3. 分配多大的空间?这就是PCI设备配置空间的由来,PCI设备里有一些值,这些值会标明“它要求多大的地址空间”
4. 地址空间这概念有点抽象,简单说,就是假设你的PCI设备上有100个寄存器,那么地址空间至少是100*4
二.PCI核心驱动会去读取PCI设备的配置空间,
它说:哦,你要求我们提供100*4的空间。好的,我先在内核里分配好,然后把基地址发给你。
以后,内核去读写这段空间时,就会直接访问到你的PCI设备
三.PCI设备驱动:
PCI核心驱动已经给你的设备分配了地址,你以后通过这些地址就可以访问设备了。
至于去读、写什么数据,就取决于你的设备了,这要看它的芯片手册。

//速率

 

 //其它成功解决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 00xF8000000~0xF9FFFFFF , 32MB,用于访问外接的PCIe设备的配置空间
* Region 10xFA000000~0xFA0FFFFF,1MB,用于地址转换
* Region 20xFA100000~0xFA1FFFFF,1MB,用于地址转换
* ……
* Region 320xFBF00000~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)

 //通过hexdump 查看pci设备的配置空间
hexdump /sys/devices/pci0000\:00/0000\:00\:05.0/config
//setpci --dumpregs 命令可显示包含所有 PCI 寄 存
 
器和功能的列表
setpci –s 24:00.0 04.w=6

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涉及的相关问题