PCIe枚举学习笔记

概念

  1. 扫描PCIe网络,发现它的拓扑结构的过程被称作枚举过程。
  2. 在枚举之前,软件只确定一件事,存在一个HOST/PCIe brigde且该bridge的secondary side(即下游边)连接着bus 0。在这里插入图片描述

Discovering the Presence or Absence of a Function

  1. 软件发现一个function的存在是通过读取它的vendor id寄存器(16bit)。
  2. PCI-SIG为每个vendor分配id,vendor id is hardwired into the vendor register of each function designed by that vendor。
  3. 通过以bus、device、fucntion number的所有组合对vendor id寄存器进行读取(不明白可以了解一下PCIe的ECAM访问机制),软件就可以搜索整个拓扑发现哪些设备是存在的。
  4. 枚举的过程相当简单,但仍有两个问题需要被处理:
    1. 目标设备不存在,即通过bus、device、function number的某一确定组合读取vendor id寄存器,结果为0xFFFF。
    2. 目标设备存在,但没做好准备响应(通常指对Configuration read Request的响应)。(疑问:为什么会发生这种情况?

Device not Present

  1. 对于PCIe,对不存在的设备发起Configuration Read Request,会导致该设备的上游的bridge返回a Completion without data that has a status of UR (Unsupported Request)。
  2. 为了向后兼容传统的枚举模型,Root Complex在枚举过程中看到此类Completion,会向处理器返回0xFFFF作为数据,以表示设备不存在。
  3. 当检测系统中的function存在性时,对于返回an Unsupported Request的Configuration Read Requset,枚举软件通过接收到的全1数值来确定。
  4. 为了避免在上述过程中意外报告error,设备通常不被允许singal error直到枚举完成。
  5. 因为如果将UR视作error,会导致枚举过程被停止转而调用error handler。而此时的error handler功能有限并不能解决此问题,最终枚举软件执行失败。
  6. 为了避免上述风险,枚举过程通常不能报告error。

Device not Ready

  1. 由于devices需要一些时间为root的第一次访问做好准备,因此需要考虑root配置device的时序问题。

    1. 如果是5.0GT/s,或者更慢,需要在reset后和发起Configuration Request前等待100ms。
    2. 如果是快于5.0GT/s,必须在链路训练完成后,等待100ms,因为PCIe Gen3链路训练中的均衡过程会花费大约50ms量级的时间。
  2. 如PCI 2.3 spec所定义的,初始化时间(Time from Reset High to First Access )开始于RST# deassert 并在 2^25个PCI 时钟后结束。

    1. 这相当于整整1秒,function可以用这段时间来构建其configuration register,例如通过loading eeprom中的内容。
    2. load可能会花费一段时间,直到load完成,funciton才能被访问。
  3. 如果root在function未准备好的状态访问function,PCIe function 将响应a Completion with the Configuratioin Request Retry Status.这个状态只有在响应configuration request时是合法的。

  4. 这个响应只在reset后的1秒有效,因为function被认为会稍后响应,如果没有,怎认为funciton broken。

  5. Root处理CRS的响应是各家特定实现的,除了在system reset后的那一秒钟。在这1秒内,根据CRS Software Visibility bit in its Root Control Register 有如下两个操作可选:在这里插入图片描述

    1. 如果CRS Software Visibility Enable置1,且是访问vendor ID register的configuration read request,root看到CRS的响应,会给软件返回0001hex的值且其他byte field补全1,用来标识访问此device存在潜在的延时,软件知晓后,可以处理其他任务,稍后再次返回访问此deivce,这样便更好的利用了时间。如果软件要这样做,那么必须确保reset后的第一此访问是对Vendor ID两字节的Configuration Read。
    2. 对于configuration writes 或者其他的configuration reads,root必须重新自动发起一个新的Configuration Request。

Determining if a Function is an Endpoint or Bridge

在这里插入图片描述

  1. 低7bit标识类型:
    1. 0 = not a bridge (Endpoint in PCIe)
    2. 1 = PCI‐to PCI bridge (abbreviated as P2P) connecting two buses
    3. 2 = CardBus bridge (legacy interface not often used today)
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值