需要确认的问题

一。 通道一次能处理多少数据。

应该是由xfercap_log 这个变量来确定的。

 * @xfercap_log; log2 of channel max transfer length (for fast division)

可是 max transfer length是由谁来确定的捏?是哪个人悄悄的设置了这个变量?????

找到根据啦!哈哈

代码:

是在 ioat2_enumerate_channels 阶段来做的。原来初始化真有趣, 一定要把所有的事情都准备好, 后面的事情才可以做。


 xfercap_log = readb(device->reg_base + IOAT_XFERCAP_OFFSET);
 xfercap_log &= 0x1f; /* bits [4:0] valid */
 if (xfercap_log == 0)
  return 0;

 

上述代码片段告诉我说:

这个xfercap_log 是从 通道寄存器里获得的。该通道寄存器的地址是, 来查下手册吧!

Transfer capacity:

所有通道的最大传输值之间的最小值, 理解起来好麻烦啊。

意思应该就是 : 假如有N个通道, 拿出每个通道的可以处理的数据的最大值, 然后再在这N个数据之间取最小值。

bit[0:4] 有效, 最大传输数据长度是 1M。

 

二。 desc的个数由谁来确定?

       num_descs = ioat2_xferlen_to_descs(ioat, len);  这个函数确定了desc的个数。

函数体为:

static inline u16 ioat2_xferlen_to_descs(struct ioat2_dma_chan *ioat, size_t len)
{

//desc由数据长度 len 除以 2的 ioat->xfercap_log 来确定。 2的ioat->xfercap_log的意思应该是 每次通道可以处理的数据长度。
 u16 num_descs = len >> ioat->xfercap_log;
//如果 len & ((1 << ioat->xfercap_log) - 1) 不为空的话, desc的个数要再加1。如果为空的话, 则不加一
 num_descs += !!(len & ((1 << ioat->xfercap_log) - 1));
 return num_descs;
}

//

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值