一。 通道一次能处理多少数据。
应该是由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;
}
//