关于PCIe有个几个问题,
1,为什么ep侧单独复位rc侧就不能访问epconfig space和mem space了。
此行为为异常操作,ep复位导致原来rc枚举时为ep分配config space信息丢失(复位后变成默认值),如bar的基址映射在主机的地址。
2,ep侧单独复位,会与 主机重新建立link么?
不会,因为此时主机并不知道ep侧产生复位的行为主机并不知道。
3,主机重新与ep建立link的方法
1)主机进行hotreset操作同时rc会发送present信号给ep,此时PCIe总线两端均恢复为初始状态走ltssm建立link
2)主机设置linkdisable寄存器置位,导致rc发送linkdown信号给ep设备,ep收到linkdown信号,产生复位行为进入初始状态,当主机侧设置linkenable置位时,PCIe总线两端开始建立link, linkenable不置位则不建立link。
4,rc与ep重新建立link后,rc能访问ep的存储空间么?
只能访问config space,不能访问mem space,因为ep侧的复位行为导致,config space的信息(如mem space, io space,需要使能才能访问) 全部恢复为默认值(其值不一定为使能),因此必须在rc与ep重新建立link之前,将config space信息在rc侧进行保存,待link建立成功后(以能否读取vendor id为标准,link complete寄存器置位,不一定代表config space就能访问)再将保存的4k数据,load进ep侧(此行为类似重新进行枚举),至此ep侧的所有区域便像第一次枚举时一样被主机访问。
2,为什么rc侧对ep枚举只进行一次?
因为PCIe总线使用的的bdf机制进行路由访问ep的配置空间。总线拓扑结构涉及整个系统,因此不能轻易进行改变,只在开始确定总线的拓扑结构。这也是只进行一次枚举的原因
注:以上均为个人观点,有不足或错误地方欢迎指正。