概念
- 扫描PCIe网络,发现它的拓扑结构的过程被称作枚举过程。
- 在枚举之前,软件只确定一件事,存在一个HOST/PCIe brigde且该bridge的secondary side(即下游边)连接着bus 0。
Discovering the Presence or Absence of a Function
- 软件发现一个function的存在是通过读取它的vendor id寄存器(16bit)。
- PCI-SIG为每个vendor分配id,vendor id is hardwired into the vendor register of each function designed by that vendor。
- 通过以bus、device、fucntion number的所有组合对vendor id寄存器进行读取(不明白可以了解一下PCIe的ECAM访问机制),软件就可以搜索整个拓扑发现哪些设备是存在的。
- 枚举的过程相当简单,但仍有两个问题需要被处理:
- 目标设备不存在,即通过bus、device、function number的某一确定组合读取vendor id寄存器,结果为0xFFFF。
- 目标设备存在,但没做好准备响应(通常指对Configuration read Request的响应)。(疑问:为什么会发生这种情况?)
Device not Present
- 对于PCIe,对不存在的设备发起Configuration Read Request,会导致该设备的上游的bridge返回a Completion without data that has a status of UR (Unsupported Request)。
- 为了向后兼容传统的枚举模型,Root Complex在枚举过程中看到此类Completion,会向处理器返回0xFFFF作为数据,以表示设备不存在。
- 当检测系统中的function存在性时,对于返回an Unsupported Request的Configuration Read Requset,枚举软件通过接收到的全1数值来确定。
- 为了避免在上述过程中意外报告error,设备通常不被允许singal error直到枚举完成。
- 因为如果将UR视作error,会导致枚举过程被停止转而调用error handler。而此时的error handler功能有限并不能解决此问题,最终枚举软件执行失败。
- 为了避免上述风险,枚举过程通常不能报告error。
Device not Ready
-
由于devices需要一些时间为root的第一次访问做好准备,因此需要考虑root配置device的时序问题。
- 如果是5.0GT/s,或者更慢,需要在reset后和发起Configuration Request前等待100ms。
- 如果是快于5.0GT/s,必须在链路训练完成后,等待100ms,因为PCIe Gen3链路训练中的均衡过程会花费大约50ms量级的时间。
-
如PCI 2.3 spec所定义的,初始化时间(Time from Reset High to First Access )开始于RST# deassert 并在 2^25个PCI 时钟后结束。
- 这相当于整整1秒,function可以用这段时间来构建其configuration register,例如通过loading eeprom中的内容。
- load可能会花费一段时间,直到load完成,funciton才能被访问。
-
如果root在function未准备好的状态访问function,PCIe function 将响应a Completion with the Configuratioin Request Retry Status.这个状态只有在响应configuration request时是合法的。
-
这个响应只在reset后的1秒有效,因为function被认为会稍后响应,如果没有,怎认为funciton broken。
-
Root处理CRS的响应是各家特定实现的,除了在system reset后的那一秒钟。在这1秒内,根据CRS Software Visibility bit in its Root Control Register 有如下两个操作可选:
- 如果CRS Software Visibility Enable置1,且是访问vendor ID register的configuration read request,root看到CRS的响应,会给软件返回0001hex的值且其他byte field补全1,用来标识访问此device存在潜在的延时,软件知晓后,可以处理其他任务,稍后再次返回访问此deivce,这样便更好的利用了时间。如果软件要这样做,那么必须确保reset后的第一此访问是对Vendor ID两字节的Configuration Read。
- 对于configuration writes 或者其他的configuration reads,root必须重新自动发起一个新的Configuration Request。
Determining if a Function is an Endpoint or Bridge
- 低7bit标识类型:
- 0 = not a bridge (Endpoint in PCIe)
- 1 = PCI‐to PCI bridge (abbreviated as P2P) connecting two buses
- 2 = CardBus bridge (legacy interface not often used today)