tlp有三种方式路由,Address方式,ID方式和implicit(隐式) address和id是常用路由方式,implicit仅用作message request的type tlp包的路由,这里描述一下address和id。
address 路由用作memory和io类型,如果是64位地址则header是4dword,32位地址则是3dword,如下
对于地址路由时,header的1dword的at字段在memory read/write和atomicOp请求时有效,其他tlp类型时,at字段保留。如下
也就是:00b=未转换的地址,01b=地址转换请求,10b=已转换的地址,11b=预留
如果存在转换的地址,则地址映射关系,体现在header域的byte8-byte15上,如下图所示
值得注意的是,对于4g以下的地址,请求必须以32位的格式。
id路由通常作为配置请求,ID Routed Message和Completions。对于header中,需要定义Vendor_Defined Messages作为ID。
id路由通过BDF(Bus,Device,Function Numbers)来明确TLP的目的地址
对于ari和非ari设备,id路由的header域值如下
如果是4dword的tlp header,id路由的header布局如下.(不同字节的header由tlp的类型决定)
如果是3dword的tlp header,id路由的header布局如下
这里可以从byte8和byte9来确定BDF值作为id路由的依据
对于header的byte7,有两个字段,last dw/1st dw。它与byte2和byte3的length[9:0]有一定关系: