1.13. pl08x_pre_boundary

/*
 * Return number of bytes to fill to boundary, or len
 */
static int pl08x_pre_boundary(int addr, int len)
{
	int boundary;

	if (len <= 0)
		dev_err(&pd.dmac->dev, "%s - zero length\n", __func__);
	boundary = ((addr >> PL08X_BOUNDARY_SHIFT1) + 1) << PL08X_BOUNDARY_SHIFT;

	if (boundary < addr + len)
		return boundary - addr;
	else
		return len;
}
        

1

Pl08x.h中定义的:

#define PL08X_BOUNDARY_SHIFT	(10)	/* 1KB 0x400 */
#define PL08X_BOUNDARY_SIZE		(1 << PL08X_BOUNDARY_SHIFT)

此函数,目的是为了限制每次DMA传输的字节数,要保证在PL08X_BOUNDARY_SIZE即1KB范围内。

之所以做此限制,是因为datasheet中写了:Bursts do not cross the 1KB address boundary

突发传输,不能跨界超过1KB 的范围。

所以,如果你上层程序调用此pl08x驱动,希望每次传输2KB,那么此驱动会自动帮你限制为每次最多1KB,然后自动帮你拆分出对应的多个LLI。