Flow Control分类
flow control将TLPs分为下面3类,它们的credit分别处理。
Posted Requests(P) | MEM_WR、Messages |
Non-Posted Requests(NP) | MEM_RD、IO_RD、CFG_RD、IO_WR、CFG_WR |
Completions(CPL) | CPL、CPLD |
对于每类TLP,Header和Data部分的Credit单独处理;
对于Data而言,Credit单位为4DW;
对于Header而言,Creadit单位为最长的Header长度+TLP digest的长度;
每类TLP所消耗的Credits如下图所示,其中n=RoundUp(Length/4DW);
发送端处理FC规则
CREDITS_CONSUMED
在链路初始化时设置为0;
每次接收到TLP后,CREDITS_CONSUMED做下式更新,其中Increment表示当前TLP所需要消耗Credits:
CREDIT_CONSUMED≔(CREDIT_CONSUMED+Increment)mod 2^[Files Size]
CREDITS_LIMIT
在链路初始化过程中不设置;
在FC初始化时设置初值;
每次接收到Update FC时,如果如果DLLP值与当前值不一致则刷新CREDITS_LIMIT,否则保持;
TLP发送条件
除了CREDIT_LIMIT被设置为无限Credits的情况下,TLP发送必须满足下面公式:
CUMULATIVE_CREDITS_REQUIRED≔(CREDIT_CONSUMED+<Credits_Needed_for_pending_TLP>)mod 2^[Files Size]
(CREDITS_ LIMIT-CUMULATIVE_CREDITS_REQUIRED)≤2^[Files Size]/2
当发送“nullified” TLP时不更新CREDITS_CONSUMED。
接收端FC处理规则
CREDITS_ALLOCATED
链路初始化时,根据buffer大小和分配策略设置初始值;
当接收到TLP后,其做如下更新,其中Increment为处理完TLP后释放出来的空间:
CREDITS_ALLOCATED:=(CREDITS_ALLOCATED+Increment)mod2^[Files Size]
CREDITS_RECEIVED(可选)
链路初始化时设置为0;
当接收到TLP后,其做如下更新,其中Increment为接收到TLP所需要空间:
CREDITS_RECEIVED:=(CREDITS_RECEIVED+Increment)mod2^[Files Size]
满检查(可选)
当满足下面公式,表示接收端缓存溢出:
CREDITS_ALLOCATED-CREDITS_RECEIVED≥2^[Files Size]/2