Xilinx两块开发版PCIe link up时间相差很大,Virtex-6开发版PCIe link up时间超过60ms,而Virtex-7 PCIe link up时间只有~25ms.
 
分析过程:
1. 对比Virtex-6和Virtex-7两块开发板上电过程的LTSSM状态机。
首先看一下,Virtex-6开发版的LTSSM状态机,发现在多了一次Polling->Dectect的转换过程。
 
再来看Virtex-7开发版的LTSSM状态机,不同状态之间的转换符合PCIe Spec标准。
 
发现LTSSM状态机的异常点之后,然后结合详细的PCIe trace找到root cause.
 
2. 从Trace中看到,Upstream(Virtex-6)在Detect状态检查到RX存在之后,进入了Polling.Active状态,但是,之后由于一直未收到从Downstream下发的TS1序列,于是,就进入了Polling.Compliance状态. 此时,Upstream Lanes处于Electrical Idle。
 
3. 经过一段时间之后,Upstream Lanes看到EIOS之后,开始退出Polling.Compliance状态, 进入Polling.Active状态.
 
4. 接着,Downstream lanes进入Polling.Active状态,然后开始发送TS1序列。
 
5. 经过一段时间后,Upstream也进入了Polling.Active状态,然后开始发送TS1序列。
 
6. Upstream在Polling.Active状态实现了Bit Lock和Symbol Lock, 就转换进入到Polling.Configuration状态,并开始发送TS2序列。
 
7. 但是,问题来了,Downstream在Polling.Active状态未能成功实现了Bit Lock和Symbol Lock,在24ms
 timeout之后回到了Detect状态。
 
8. 此时,Upstream处于Polling.Configuration状态,在等待Downstream的TS2序列。由于Downstream已经回到Dectect状态了,Upstream在48ms内没有收到Downstream下发的TS2序列,也跟着返回Detect状态。
 
9. Downstream回到Dectect状态之后,就开始重新进行链路训练,在重新链路训练中,这次在Polling.Active状态成功实现了Bit Lock和Symbol Lock, 然后进入Polling.Configuration状态。最终成功实现PCIe链路训练。
 
从上面的分析过程中,我们看到,第7/8步中有两个timeout时间,分别是24ms和48ms,正是因为这两个timeout的存在,造成了Virtex-6开发版link up时间超过60ms。
 
Root Cause:
最后发现root cause是由于英特尔处理器中的一个bug造成的。如Intel Errata中的描述,由于Rx端过载保护电路的存在,可能会导致某些Device异常进入Polling.Compliance, 最后导致Downstream和Upstream之间状态出现偏差,引起Bit Lock/Symbol Lock错误。

PCIe link up bug 分析的更多相关文章

  1. Bug预防体系(上千bug分析后总结的最佳实践)

    Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了!  web常见产品问题及预防 ...

  2. 关于bug分析与异常处理的一些思考

    前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作.软件开发中,难免不产生bug:产品交付客户 ...

  3. 文《左右c++与java中国的垃圾问题的分析与解决》一bug分析

    文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客<关于c++与jav ...

  4. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  5. 【转】ProGuard的作用、使用及bug分析

    原文地址:http://blog.csdn.net/forlong401/article/details/23539123. http://www.trinea.cn/android/proguard ...

  6. 协议解析Bug分析

    协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描写叙述 腾讯收购的Foxmailclient能够作为outlookclient ...

  7. Oracle字符乱码、数据越界訪问典型Bug分析

    Oracle字符乱码.数据越界訪问典型Bug分析 前言:           作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...

  8. ProGuard的作用、使用及bug分析(转载)

    ProGuard的作用.使用及bug分析 本文主要ProGuard的作用.使用及bug分析.1.ProGuard作用ProGuard通过删除无用代码,将代码中类名.方法名.属性名用晦涩难懂的名称重命名 ...

  9. 软件测试之BUG分析定位概述(QA如何分析定位BUG)

    你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...

随机推荐

  1. springboot连mysql报一个奇怪的错误

    错误提示:Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection ...

  2. springboot学习五:IDEA外部tomcat发布

    pom.xml配置 屏蔽自带tomcat <dependency> <groupId>org.springframework.boot</groupId> < ...

  3. web socket server code, 调用 shell exec child_process

    var child_process = require('child_process'); var ws = require("nodejs-websocket"); consol ...

  4. Bootstrap table方法,Bootstrap table事件,配置

    调用 BootStrap Table 方法的语法: $('#table').bootstrapTable('method', parameter); 例如: $('#my_table').bootst ...

  5. 二、Python-运算符、控制及循环语句

    一.运算符 算数运算符 +:加 -:减 *:乘 /:除 ~:取反 %:求余数(只返回余数) //:取整数(只返回整数部分) **:幂,返回x的y次方 赋值运算符:= 比较运算符:<小于.< ...

  6. Oracle的SQL优化思路

    个人总结SQL脚本优化,大体如下: (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表dir ...

  7. Mysql 5 忘记root密码,设置免密登陆

    1.修改my.cnf配置文件 vi /etc/my.cnf #允许免密认证登陆 skip-grant-tables = true 2.重启Mysql数据库并登陆数据库修改root用户密码 system ...

  8. Django自定义模板标签和过滤器

    1.创建模板库 在某个APP所在目录下新建包templatetags,然后在其中创建存储标签或者过滤器的的模块,名称随意,例如myfilters.py. 在这个模块中编写相关代码. 注意:templa ...

  9. (转)Mysql字符串字段判断是否包含某个字符串的3种方法

    方法一: SELECT * FROM users WHERE emails like “%b@email.com%”; 方法二: 利用mysql 字符串函数 find_in_set(); SELECT ...

  10. 触摸事件,手势识别(UITouch,UIGestureRecognizer)

    触摸发生时,UIWindow会有一个队列来存放所有的触摸事件,然后再把这些事件发送给对应的hit-test view,hit-test view会通过touch的四个函数来接收这些事件. 四个函数分别 ...