PCIe 驱动流程(LTSSM)

        本次的工做是完成刚流片的FPGA中PCIe IP核的bring up,也就是芯片的中PCIe的第一个使用者,将PCIe IP核正常使用起来,并配合公司的EDA团队,完成PCIe IP核到用户的呈现。html

        通过两个月的调试和文档阅读,对PCIe也有了初步的认识,对于PCIe的学习主要来自3个方面:app

       一、 王齐老师的《PCI Express 体系结构导读》和王齐老师的博客http://blog.sina.com.cn/s/blog_6472c4cc0100qbvp.html。很是感谢王齐老师的书,对于学习PCIe协议无疑是最佳的学习资料。oop

      二、《PCI Express Base Specification 3.0》PCIe的标准协议。学习

      三、 Synopsys公司提供 PCIe ip相关的data sheet。测试

如下是对PCIe创建连接过程的记录,主要针对Sysnosys 的PCIe的IP,可是同时应该也有广泛的适用性:debug

1.1   端口身份的识别

该部分是PCIe 底层Core识别PCIe端口的过程,PCIe总线中的有3中角色:RC(root complex)、EP(end point)、switch。他们在PCIe总线中拓扑结构以下图所示:设计


PCIe的IP Core在上电后首要的任务就是经过外部的IO或者寄存器,识别自身在PCIe的系统中扮演的角色,不一样的角色也决定其在后续的过程当中不一样的启动和配置流程。调试

做为用户,在例化这个IP核时,须要作的第一个事情就是经过接口配置PCIe的device_type。htm

1.2   关注时钟与复位

在使用PCIe的IP时,再须要关注的是该内核的时钟和复位过程。可能做为用户,该过程硬件已经帮你作完了,可是也最最好熟悉一下结构和流程,并确保core的内部时钟已经启动,复位已经成功。blog

在实际的应用过程当中,测试的第一步就是将PCIe core的时钟拉到芯片外部进行测试。

1.3   Disable PCIe的LTSSM的状态机

LTSSM(Link Training and Status State Machine )是PCIe最为核心的一个状态机,PCIe总线在进行链路训练时,将使用LTSSM状态机。而在启动LTSSM以前,用户通常须要进行参数的配置,因此在Core启动后,先会将LTSSM状态机disable。

1.4   经过DBI配置参数

该部分是配置PCIe参数的部分,DBI(data bus interface)是synopsys定义的访问PCIe寄存器的接口,PCIe协议规定了两种配置空间:PCI Configuration Space和 PCIe Extend configuration Space。而每每IP的生成商,会加入一个属于本身的配置空间,synopsys添加的配置空间为:Port logic Synosys Register

其中PCI Configuration Space中主要由:PCI configuration header、PCI Power Management Capability、PCI Express Capability 、MSI Capability、MSI-X Capability VPD Capability组成。

PCI configuration header提供了关于Vendor ID和Device ID等信息,其中比较重要的是Base Address Register(BAR),该寄存器设计到PCIe设备的地址空间的分配。

PCI Power Management Capability:该部分是系统电源管理的寄存器,这些Capability通常都会包含一个Status寄存器、一个Control寄存器、一个Capability寄存器。其中control寄存器一般是须要用户配置的,而Capability主要是供用户访问,以知道当前部分的参数设置的状况,而status寄存器是提供用户访问,以得到当前部分(好比电源)的具体的状态。

PCI Express Capability:该结构存放了一些和PCIe总线相关的信,包括PCIe链路和插槽的信息。

MSI、MSI-X:为中断控制的capability,与Power Management capability寄存器的结构是相似的。

PCIe Extend configuration Space是PCIe设备独有的,PCI设备并不支持该结构,实际上绝大多数的PCIe设备也不支持该结构。

Port logic SynosysRegister:是synopsys公司针对自身的IP,定义的与接口相关的寄存器,该部分寄存器多与物理层相关。

在此时的测试过程当中,以进行Loopback测试为例,主要须要设置的参数包括PCI configurationheader和Port logicSynosys Register。

一、  Set the PIPE Loopback Enable bit

二、  Set the Loopback Enable bit

三、  设置BAR地址分配寄存器。

1.5   启动LTSSM

app_ltssm_enable=1;LTSSM状态机的跳转以下图所示,而当状态机进入Loopback状态机后,表示PCIe工做正常。


1.6   检测LTSSM状态机

检测LTSSM状态的方式有两种:

一、  经过Port logic Synosys Register中寄存器Debug Register 0中的最低6bit查询

二、  经过cxpl_debug_info IO直接查询。

在确认LTSSM状态机进入Loopback以后,用户须要查询数据链路层的状态,经过PCI ExpressCapability register中的 Link status Register 的Data Link Layer Active位,能够确认PCIe数据链路层正常工做,用户能够进行TLP包的发送与接收。